//AJAX

function SubmitAjax(mod,div,form,isDebug){
	var params="?";
	var f;
	var errMSG="";
	if(form){ if(typeof form == "string"){ f=document.getElementById(form); } else { f=form; } }
	  // цикл ниже перебирает все элементы в объекте f, 
	  // переданном в качестве параметра
	  // функции, в данном случае - наша форма.            
	  for (var i = 0; i<f.elements.length; i++){
	   //текущий элемент  проверяем, заполнен ли он в форме
		//~ if (null!=f.elements[i].getAttribute("email")){ 
			//~ if (!isEMailAddr(f.elements[i])){ // пустой
				//~ errMSG += " Некорректно : " + f.elements[i].title + "\n"; // формируем сообщение
			//~ }
		//~ } else {
			if (isNotEmpty(f.elements[i])){ // НЕ пустой
				params+="&"+f.elements[i].name+"="+f.elements[i].value;
			} else { // пустой
				//~ // если текущий элемент имеет атрибут required
				//~ // т.е. обязательный для заполнения
				//~ if (null!=f.elements[i].getAttribute("required")){ 
					//~ errMSG += "  "
						//~ + (f.elements[i].title=='') ? f.elements[i].name : f.elements[i].title + "\n"; // формируем сообщение об ошибке, перечисляя незаполненные поля
				//~ }
			}
		//~ }
		}
		// если сообщение об ошибке не пусто,
		// выводим его, и возвращаем false     
		if ("" != errMSG) {
			alert("Не заполнены обязательные поля:\n" + errMSG);
			return false;
		} else {
			(isDebug)?alert(params):0;
			ShowAjax(mod,div,params);
			//~ f.submit();
		}
//~ alert(" --- ");			
	//~ alert(getChildNodes(form));
}

function getChildNodes(form){
	var out="";
	var f;
	if(form){ if(typeof form == "string"){ f=document.getElementById(form); } else { f=form; } }
	var group=f.childNodes;
	for(i=0; i<group.length; i++){
		if(group[i].nodeType==1){
			out+="<"+group[i].tagName.toLowerCase();
			out+=(group[i].id) ? " ID="+group[i].id : "";
			out+=(group[i].name) ? " Name="+group[i].name : "";
			out+=(group[i].value) ? " value="+group[i].value : "";
			out+=">\n";
		} 
		if(group[i].childNodes.length>0){
			out+=getChildNodes(group[i]);
			//~ alert(group[i].childNodes.length);
		}
	}
	return out;
}

function ShowAjax(mod,div,params) {
	if(div=="" || div==undefined){div=mod;}
	var open_str = '/ajax/'+mod+'.cgi'+params;
	var http_request = false;
	if (window.XMLHttpRequest) { // Mozilla, Safari, ...
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType) {
			http_request.overrideMimeType('text/xml');
			// See note below about this line
		}
	} else if (window.ActiveXObject) { // IE
		try {
			http_request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) { }

		}
	}
	
	if (!http_request) {
		alert('Giving up :( Ошибка загрузки (Cannot create an XMLHTTP instance)');
		return false;
	}
	http_request.onreadystatechange = function() { 
		//~ alert(open_str+" - http_request.onreadystatechange");
		if (http_request.readyState == 4) {
			//~ alert(open_str+" - http_request.readyState == " + http_request.readyState);
			//~ alert(open_str+" - status == " + http_request.status);
			if (http_request.status == 200) {
				//~ alert(open_str+" - div == " + div);
				if(div=="no_template"){
				} else {
					if(div=="debug_out"){  
						alert("-- " . http_request.responseText);
					} else {
						//~ alert(open_str+" -- innerHTML-"+gEId(div).innerHTML+" - http_request.responseText=" + http_request.responseText);
						//~ document.getElementById(div).classText=(http_request.responseText!='')?('active'):('');
						document.getElementById(div).innerHTML=http_request.responseText;
					}
				}
			} else {
				alert('There was a problem with the request.');
			}
		} else {
			//~ alert(open_str+' - http_request.readyState != 4 ('+http_request.readyState+')');
		}
	};
	//~ alert(params);
	http_request.open('GET', open_str, true);
	http_request.send(null);
	params="?";
}


function getLikeElements(tagName,attrName,attrValue){
	var startSet;
	var endSet = new Array ();
	if(tagName){
		startSet=gETn(tagName);
	} else {
		startSet=(document.all) ? document.all : gETn("*");
	}
	if(attrName){
		for(var i=0; i<startSet.length; i++){
			if(attrName){
				if(startSet[i].getAttribute(attrName)==attrValue){
					endSet[endSet.length]=startSet[i];
				}
			} else {
					endSet[endSet.length]=startSet[i];
			}
		}
	} else {
		endSet=startSet;
	}
	return endSet;
}

function gETn(tagName){
	return document.getElementByTagName(tagName);
}

// Проверяем, что в текстовое поле введен хотя бы один символ
function isNotEmpty(elem) {
	var str = elem.value;
    var re = /.+/;
    if(!str.match(re)) {
        //~ alert("Пожалуйста, заполните требуемые поля.");
        setTimeout("focusElement('" + elem.form.name + "', '" + elem.name + "')", 0);
        return false;
    } else {
        return true;
    }
}
//проверка того, что введено положительное или отрицательное число
function isNumber(elem) {
	var str = elem.value;
 	    var re = /^[-]?\d*\.?\d*$/;
    str = str.toString();
    if (!str.match(re)) {
        alert("В это поле можно вводить только числа.");
        setTimeout("focusElement('" + elem.form.name + "', '" + elem.name + "')", 0);
        return false;
    }
    return true;
}
// проверка того, что в поле введена строка длиной точно 16 символов
function isLen16(elem) {
	var str = elem.value;
    var re = /\b.{16}\b/;
    if (!str.match(re)) {
        alert("Введенное значение не содержит точно 16 символов.");
        setTimeout("focusElement('" + elem.form.name + "', '" + elem.name + "')", 0);
        return false;
    } else {
        return true;
    }
}
// проверка того, что введен корректный адрес e-mail
function isEMailAddr(elem) {
	var str = elem.value;
    var re = /^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/;
    if (!str.match(re)) {
        alert("Неправильно введен адрес электронной почты.");
        setTimeout("focusElement('" + elem.form.name + "', '" + elem.name + "')", 0);
        return false;
    } else {
        return true;
    }
}
	
// проверка того, что выбрано одно из положений переключателя
function isValidRadio(radio) {
    var valid = false;
    for (var i = 0; i < radio.length; i++) {
        if (radio[i].checked) {
            return true;
        }
    }
    alert("Выберите одно из положений переключателя.");
    return false;
}

function focusElement(formName, elemName) {
    var elem = document.forms[formName].elements[elemName];
    elem.focus();
    elem.select();
}

// процедура пакетной проверки - пример использования
function Example_validateForm(form) {
    if (isNotEmpty(form.name1)) {
        if (isNotEmpty(form.name2)) {
            if (isNotEmpty(form.eMail)) {
                if (isEMailAddr(form.eMail)) {
                    if (isChosen(form.continent)) {
                        if (isValidRadio(form.accept)) {
                            return true;
                        }
                    }
                }
            }
        }
    }
    return false;
}
/*
<form method="GET" action="cgi-bin/register.pl" 
    name="sampleForm" onsubmit="return validateForm(this)">
Имя: <input type="text" size="30" name="name1" id="name1" 
    onchange="isNotEmpty(this)" /><br>
Фамилия: <input type="text" size="30" name="name2" id="name2" 
    onchange="isNotEmpty(this)" /><br>
Адрес E-mail: <input type="text" size="30" name="eMail" id="eMail" 
    onchange="if (isNotEmpty(this)) {isEMailAddr(this)}" /><br>
Регион: <select name="continent" id="continent">
    <option value="" selected>Выберите страну:</option>
    <option value="Africa">Африка</option>
    <option value="Asia">Азия</option>
    <option value="Australia">Австралия</option>
    <option value="Europe">Европа</option>
    <option value="North America">Северная Америка</option>
    <option value="South America">Южная Америка</option>
</select><br>
Лицензионное соглашение: 
    <input type="radio" name="accept" id="accept1" value="agree" />Принимаю
    <input type="radio" name="accept" id="accept2" value="refuse" />Не принимаю
<br>
<input type="reset" /> <input type="submit" />
</form>
*/