/*--------------------------------------------------|
| AjaxForm 1.0 beta   |   InvariantBrowser package  |
|---------------------------------------------------|
| Author        Alexey Rymonin (x-phoen1x@mail.ru)  |
| Copyright (c) 2005-2007 SastaSoft                 |
|                                                   |
| This script process form by ajax request          |
| for some module.                                  |
|                                                   |
| Updated: 17.03.2007                               |
|--------------------------------------------------*/

function AjaxFormHandler() {	
	var sbmBtn = null;

	var sbmBtnBusyText = "Обрабатывается...";
	var sbmBtnIdleText = "";
	
	getSbmBtn = function(form) {
		if(sbmBtn == null)
			for(var i=0; i < form.elements.length; i++)
				if(form.elements[i].type == "submit") {
					sbmBtn = form.elements[i];
					sbmBtnIdleText = sbmBtn.value;
					break;
				}
		if(sbmBtn == null)
			throw "Submit button not exist in form body.";				
		return sbmBtn;
	}
	
	this.onBusyState = function(form) {
		var sb = getSbmBtn(form);
		sb.disabled = true;		
		sb.value = sbmBtnBusyText;
	}
	
	this.onSendSuccessState = function(form) {
		alert("Ваш запрос успешно отправлен.");
	}
	
	this.onIdleState = function(form) {
		var sb = getSbmBtn(form);
		sb.value = sbmBtnIdleText;
		sb.disabled = false;
	}	
				
	this.errorEmptyForm = function(form) {
		alert("Вы не заполнили ни одного поля.");
	}		
	
	this.errorCallback = function(form,errorCode) {
		alert("Произошла ошибка обращения к модулю обработки.\r\nКод возврата " + errorCode + ".");
	}			
		
	this.errorForm = function(form,responseXml){
		var incorects = responseXml.getElementsByTagName("incorrect");	
		if(incorects != null && incorects.length > 0) {
			var items = incorects[0].childNodes;
			var text = "Вы допустили следующие ошибки:";
			for(var i=0; i < items.length; i++) {
				text += "\r\nПоле '" + items[i].getAttribute("name") + "' " +  
				(items[i].getAttribute("errorcode") == "1" ? "обязательно для заполения" : "заполненно неправильно");
			}
			alert(text);
		}
	}
		
	this.errorSend = function(form){
		alert("Во время отправки произошла ошибка.");
	}
	
	this.errorScript = function(form){
		alert("Произошла ошибка.");
	} 
		
	this.processCallback = function(form,responseXml) {
		var retCode = responseXml.getElementsByTagName("returncode")[0].childNodes[0].nodeValue;
		if(retCode == 0) {
			this.onSendSuccessState(form);
		}
		else{			
		 	if(retCode == 1) {
			this.errorEmptyForm(form);
			}
			else if(retCode == 2) {
				this.errorForm(form, responseXml);
			}
			else if(retCode == 3) {
				this.errorSend(form);
			}
			else if(retCode == 5) {
				this.errorScript(form);
			}			
		}	
	}
}


function AjaxForm(form, handler) {
	
	var form = form;
	var handler = (typeof(handler) == "undefined" ? new AjaxFormHandler() : handler);
	
	var request = null;
	
	getXMLHttpRequest = function(){
		if(request != null)
			return request;
		
		if(typeof(XMLHttpRequest)!='undefined') {
			request = new XMLHttpRequest();
		}
		else {
			var axO = ['Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.4.0',
				'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP'], i;
			for(var i=0; i < axO.length; i++)
				try {
					request = new ActiveXObject(axO[i]);
					break;
				} catch(e){}
		}	
		
		return request;
	}

	
	parseForm = function() {
		var queryString = "";
		var flag = false;
		for(var i=0; i < form.elements.length; i++) {
			var item = form.elements[i];
			if(!item.disabled && item.name != "" 
			&& (item.type == "checkbox" ? item.checked : true)) {
				queryString += queryString == "" ? "" : "&";
				queryString += item.name + "=" + item.value.replace("+","%2B7");
				if(!flag && (item.type == "text" || item.type == "textarea"))
					flag = true;
			}
		}
		return flag ? queryString : "";
	}

	sendRequest = function(queryString) {
		var req = getXMLHttpRequest();

		var method = form.method;
		var url = form.action;
		
		var content = null;
	
		if(method == "get")
			url += "?" + queryString;
		else
			content = queryString;
	
		req.open(method, url, true);
	
		req.onreadystatechange = function() {
			if (req.readyState == 4) {
				if (req.status == 200)
					handler.processCallback(form,req.responseXML);
				else
					handler.errorCallback(form,req.status);		
				handler.onIdleState(form);							
		    }
		};

		if(method == "post")
			req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
	
		req.send(content);
			
	}

	this.process = function() {
		handler.onBusyState(form);
		
		var queryString = parseForm();
		if(queryString == "") {
			handler.errorEmptyForm(form);
			handler.onIdleState(form);
			return false;
		}
		sendRequest(queryString);
		
		return false;
	}
}
