//Author: FAV
var valid=true;          //Флаг общей проверки
var bgcolor='#FFB0B0';   //Цвет поля по умолчанию
var colors=new Array(6); //Массив цветов
var matches='';          //Захват шаблона
var value_matches='';    //Захват шаблона

var xmlHttp = createXmlHttpRequestObject(); //xmlHttp-объект

//------------------------------------------------------------------------------------------------
//----------------------------------Главная функция проверки--------------------------------------
//------------------------------------------------------------------------------------------------
function init_validate(FormObj)
{
	//До первой ошибки
	valid=true;

	//Список цветов
	colors[0]='#FFB0B0';
	colors[2]='#D7B0FF';
	colors[3]='#B2FFB0';
	colors[1]='#FFB0D8';
	colors[4]='#6495ED';
	colors[5]='#CC9AE4';

	//Случайный выбор цвета из списка
	ind=Math.round(Math.random()*5.4);
	bgcolor=colors[ind];

	//Собственно, проверка формы
	form_validate(FormObj);

    //При проверке captcha запускать процесс

    //Проверяем, есть ли на странице капча, если есть то проверяем
	var is_captcha = document.getElementById('captcha');

    if(is_captcha)
	{
	   captcha_validate();
	}

	//Возвращение значения после проверки
	if(valid)
	{
	   return true;
	}
	else
	{
	   return false;
	}
}
//------------------------------------------------------------------------------------------------
//---------------------------------/Главная функция проверки--------------------------------------
//------------------------------------------------------------------------------------------------


//------------------------------------------------------------------------------------------------
//-----------------------------------Создание xmlHttp-объекта-------------------------------------
//------------------------------------------------------------------------------------------------
function createXmlHttpRequestObject()
{

var xmlHttp;

if(window.ActiveXObject)
{ // Если IE
     try
        {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e)
        {
            try
             {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
             }
            catch (e) {}
        }

}

else{ // Все остальные браузеры

	try{
		xmlHttp = new XMLHttpRequest();
	}

	catch (e){
		xmlHttp = false;
	}
}

 if(!xmlHttp)
 { // Не удалось создать
	Alert('Не удалось создать объект XmlHttpRequest');
 }
 else return xmlHttp;
}
//------------------------------------------------------------------------------------------------
//----------------------------------/Создание xmlHttp-объекта-------------------------------------
//------------------------------------------------------------------------------------------------


//------------------------------------------------------------------------------------------------
//----------------------------------XmlHttpRequest - проверка captcha-----------------------------
//------------------------------------------------------------------------------------------------
function captcha_validate()
{
	if ((xmlHttp.readyState == 4) || (xmlHttp.readyState == 0))
	{
		//document.getElementById('cap_id').innerHTML='';
		cValue = document.getElementById('captcha').value;

		xmlHttp.open("GET","/_get_captcha.php?captcha="+cValue,false);
        //xmlHttp.onreadystatechange = handleServerResponse;

		xmlHttp.send(null);

		var xmlResponse = xmlHttp.responseXML;

		//При ошибке разбора XML функция просто умирает без лишних вопросов, поэтому имеет смысл смотреть responseText
		//alert(xmlHttp.responseText);

		xmlRoot = xmlResponse.documentElement;
		id = xmlRoot.getElementsByTagName('result');

     	id_text  = id.item(0).firstChild.data;

        //Проверка XML-ответа
		if(id_text=='1')
		{
		      //valid = true; - нельзя ставить, иначе форма отправляется без валидации полей
		}

		if(id_text=='0')
		{
              valid = false;
              document.getElementById('cap_id').innerHTML='<b style="color:red;">Код введен неправильно</b>';
              change_captha();
        }	
										
	}	
	 
	return;	
}

function change_captha(){
      var src = document.getElementById('captcha_img').src;
      src = src.replace(/&hash=[\d\.]+/, '');
      src += '&hash='+Math.random();
      document.getElementById('captcha_img').src = src;	
}
//------------------------------------------------------------------------------------------------
//----------------------------------XmlHttpRequest - проверка captcha-----------------------------
//------------------------------------------------------------------------------------------------


//------------------------------------------------------------------------------------------------
//----------------------------------Функция DOM-проверки формы------------------------------------
//------------------------------------------------------------------------------------------------
function form_validate(FormObj)
{
	var children=FormObj.childNodes;
	var regExpObj=/(.+)@(.+)\.(.+)/;

	//Пробежимся по всем потомкам формы
	for (var i=0; i<children.length; i++)
		{
			if(children.item(i).tagName=='INPUT' || children.item(i).tagName=='TEXTAREA')
				{
					if(children.item(i).getAttribute('validate'))
					{
						//При каждом проходе очищаем подсветку поля
						children.item(i).style.backgroundColor='';

						//Сама проверка валидности
						switch (children.item(i).getAttribute('validate'))
						{
							//Проверка на пустое значение
							case 'not_empty': if(children.item(i).value=='')
							{
								children.item(i).style.backgroundColor=bgcolor;
								alert("Поле не должно быть пустым");
								valid=false;
							}
							break;

							//Проверка на числовое значение
							case 'number':
								if(parseFloat(children.item(i).value)!=children.item(i).value)
								{
									children.item(i).style.backgroundColor=bgcolor;
									alert("Введено не числовое значение");
                                          valid=false;
								}
							break;

							//Проверка обязательного e-mail
							case 'email':
								if(!regExpObj.test(children.item(i).value))
								{
									children.item(i).style.backgroundColor=bgcolor;
									alert("Введен некорректный адрес email");
                                          valid=false;
								}
							break;

							//Проверка необязательного e-mail: или пусто, или e-mail
							case 'email_or_empty':
								if(children.item(i).value!='')
								{
									if(!regExpObj.test(children.item(i).value))
									{
										children.item(i).style.backgroundColor=bgcolor;
										alert("Введен некорректный адрес email");
                                        valid=false;
								    }
								}
							break;
						}//switch


						//------------------Диапазон вида: range_or_empty(1000,50000)------------------------------------
						if( children.item(i).getAttribute('validate').substring(0,5)=='range' && children.item(i).value!='')
						{
						   matches=children.item(i).getAttribute('validate').match('range.*?([0-9]+),.*?([0-9]+).*');
						   if(children.item(i).value.match('^[0-9]+$'))
						   {
						      if( (children.item(i).value*1) > matches[1] && (children.item(i).value*1) < matches[2])
							  {
							           //Если условия проверки удовлетворяются - ничего не делаем
							  }
							  else
							  {
							     		children.item(i).style.backgroundColor=bgcolor;
										alert("Число не находится в диапазоне от "+matches[1]+" до "+matches[2]);
                                        valid=false;
							  }
						   } //Если не одно число, возможно 2 числа диапазона
						   else if(children.item(i).value.match('^[0-9]+-[0-9]+$'))
						   {

							  value_matches=children.item(i).value.match('^([0-9]+)-([0-9]+)$');

							  //Проверка вхождения каждой границы в диапазон
							  if(value_matches[1]*1 > matches[1] && value_matches[1]*1 < matches[2] && value_matches[2]*1 > matches[1] && value_matches[2]*1 < matches[2])
							  {
							          //Левая и правая границы введенного диапазона вошли в разрешенный
							  }
							  else    //Границы введенного не вошли в границы разрешенного
							  {
							     		children.item(i).style.backgroundColor=bgcolor;
										alert("Введенный Вами диапазон не находится внутри разрешенного: от "+matches[1]+" до "+matches[2]);
                                        valid=false;
							  }

						   } //Если и не одно число, и не диапазон 2 чисел
						   else
						   {
							     		children.item(i).style.backgroundColor=bgcolor;
										alert("Не число или диапазон вида 100-1000");
                                        valid=false;
						   }
						}
						//------------------------------/Диапазон вида: range(1000,50000)---------------------------------------------
					}
				}
			//Побежали вниз по дереву
			if(children.item(i).hasChildNodes){form_validate(children.item(i));}
		}

    if(valid) return true;
	else return false;
}
//------------------------------------------------------------------------------------------------
//---------------------------------/Функция DOM-проверки формы------------------------------------
//------------------------------------------------------------------------------------------------


function menu_activate(link){
	var parent = link;
	while(parent.tagName.toUpperCase()!='DIV'){
		parent = parent.parentNode;
	}
	
	var div = parent.getElementsByTagName('div');
	if(div.length > 0){
		div = div[0];
		div.style.display = 'block';
		link.className = 'active';
	}
}

function menu_inactivate(parent){
	var link = parent.getElementsByTagName('a')[0];

	var div = parent.getElementsByTagName('div');
	if(div.length > 0){
		div = div[0];
		if(div.getAttribute('active')!=1){
			div.style.display = 'none';
			link.className = 'inactive';
		}else{
			setTimeout(function (){menu_inactivate(parent)}, 500);
		}
	}
}

function pre_menu_inactivate(link){
	var parent = link;
	while(parent.tagName.toUpperCase()!='DIV'){
		parent = parent.parentNode;
	}
	
	setTimeout(function (){menu_inactivate(parent)}, 500);
}

//К string добавляется метод printAddr(что-нибудь,префикс,постфикс,картинка)
//Использование:  <noscript>info</noscript><script>"braincode".printAddr('rfj304g', 'info', '.ru');</script><noscript><span>&#64;</span>braincode.ru</noscript>
String.prototype.printAddr = 
function (_hamper,_prefix,_postfix,_face)
{
  _hamper=
  _prefix+
  "@"+
  this+
  (_postfix || '')
  document.write((_face||_hamper).link("mailto:"+_hamper));
}

function show(id)
        {    
      	  if(document.getElementById(id).style.display=='none')
      	  {
      	    document.getElementById(id).style.display='block';
      		if(document.getElementById(id+'_img'))
      		{
      		   document.getElementById(id+'_img').src="/image/minus.gif";
      		}
      	  }
      	  else
      	  {	  
      	     document.getElementById(id).style.display='none';
      		if(document.getElementById(id+'_img'))
      		{
      		   document.getElementById(id+'_img').src="/image/plus.gif";
      		}			 
      	  }	  
        }		
		
		


