﻿
if (typeof Xercel == "undefined" || ! Xercel) {
	Xercel = {};
}

	
function isSjax() {
	var ua = YAHOO.env.ua;
	return (ua.gecko && ua.gecko >= 1.8) || ua.webkit;
}


Xercel.Ajax = function(method, url, asynch, successHandler, failureHandler) {

	Xercel.Ajax._request = null;
	Xercel.Ajax._successHandler  = successHandler;
	Xercel.Ajax._failureHandler  = failureHandler;
	Xercel.Ajax._form = null;

	this._method = method;
	this._url = url;
	this._asynch = asynch;
	this._notSupported = false;
	this.sjax = ! this._asynch && isSjax();
	
	Xercel.Ajax.parseResponse = function() {
		var mark = Xercel.Ajax._request.responseText.substring(0, 9);
		if ("{fields:[" == mark) {
			var JSONtext = Xercel.Ajax._request.responseText;
			var jsonObject = eval('(' + JSONtext + ')');
			Xercel.Ajax._jsonResponseHandler(jsonObject);
		} else {
			var pairs = Xercel.Ajax._request.responseText.split('&');
			var hashtable = new Array();
			for (var i = 0; i < pairs.length; i = i + 1) {
				var indxKey = pairs[i].indexOf('=');
				if (indxKey > 0) {
					var key = unescape(pairs[i].substring(0, indxKey));
					var value = pairs[i].substring(indxKey + 1);
					hashtable[key] = Xercel.unescape(value);
				}
			}
			Xercel.Ajax._successHandler(hashtable);
		}
	};
	
	Xercel.Ajax.responseHandler = function() {
		if (Xercel.Ajax._request && Xercel.Ajax._request.readyState == 4) {
			if (Xercel.Ajax._request.status == 200) {
				if (Xercel.Ajax._successHandler) {
					Xercel.Ajax.parseResponse();
				}

			} else {
				this._notSupported = true;
				if (Xercel.Ajax._failureHandler) {
					Xercel.Ajax._failureHandler("Поизошла ошибка при получении ответа с сервера, используя технологию AJAX." +
						" Код ошибки: " + Xercel.Ajax._request.status);
				}
			}
		}
	};
	
	
	this._openConnection = function() {
	   	if ( ! this._notSupported && ! Xercel.Ajax._request) {
			try {
				Xercel.Ajax._request = new XMLHttpRequest();
			} catch (e) {}
			if ( ! Xercel.Ajax._request) {
				try {
					Xercel.Ajax._request = new ActiveXObject('Msxml2.XMLHTTP');
				} catch (e) {}
			}
			if ( ! Xercel.Ajax._request) {
				try {
					Xercel.Ajax._request = new ActiveXObject("Msxml2.XMLHTTP.3.0");
				} catch (e) {}
			}
			if ( ! Xercel.Ajax._request) {
				try {
					Xercel.Ajax._request = new ActiveXObject('Microsoft.XMLHTTP');
				} catch (e) {}
   	    	}
	   	}
	 };
	
	
	this.send = function(data) {
	   	
	   	this._openConnection();
	    
	    if (Xercel.Ajax._request && isCookieEnabled()) {
		    Xercel.Ajax._request.open(this._method, this._url, this._asynch);
		    Xercel.Ajax._request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
		    if ( ! this.sjax) {
		    	Xercel.Ajax._request.onreadystatechange = Xercel.Ajax.responseHandler;
		    }
		    Xercel.Ajax._request.send(data);
		    if (this.sjax) {
		    	Xercel.Ajax.parseResponse();
		    }
	    } else {
	    	this._notSupported = true;
	    	if (Xercel.Ajax._failureHandler) {
	    		Xercel.Ajax._failureHandler("Не получилось создать запрос, возможно Ваш браузер не поддержиавет технологию AJAX");
	    	}
	    }
	};
	
	
	this.submit = function(form, successHandler) {
		if (this._notSupported) {
			return false;
		}
		
		Xercel.Ajax._userSuccessHandler = successHandler;
		Xercel.Ajax._form = form;
		
		this._method = "POST";
		this._url = Xercel.Ajax._form.action;

		var sjax = isSjax();
		var data = "ajax=true";
		var messageBox = Xercel.MessageBox;
		
		for (var i = 0; i < Xercel.Ajax._form.elements.length; i = i + 1) {
		  	var node =  Xercel.Ajax._form.elements[i];
		  	if ( ! node.disabled && node.name) {
		  		if (node.fieldType == "MultiSelectListField") {
		  			if (node.value) {
			  			for (var j = 0; j < node.options.length; j = j + 1) {
			  				if (node.options[j].selected) {
			  					data = data + '&' + node.name + '=' + Xercel.escape(node.options[j].value);
			  				}
			  			}
			  		} else {
			  			data = data + '&' + node.name + '=';
			  		}
		  		} else {
			  		data = data + '&' + node.name + '=' + Xercel.escape(node.value);
			  	}
		  	}
		}
				
		Xercel.Ajax._successHandler = function(data) {
			var redirect = data["redirect"];
			if (redirect) {
				window.open(redirect, "_self");
				return;
			}
			
			var error = data["error"];
			if (error) {
				if (messageBox) {
					messageBox.warning(error);
				} else {
					window.alert(error);
				}
			} else if (Xercel.Ajax._userSuccessHandler) {
		  		Xercel.Ajax._userSuccessHandler(data);
		  	} else {
				for (var i = 0; i < Xercel.Ajax._form.elements.length; i = i + 1) {
		  			var node =  Xercel.Ajax._form.elements[i];
		  			if (node.name) {
		  				var value = data[node.name];
		  				if (typeof value != "undefined") {
		  					if (node.fieldType && node.fieldType == "AntispamField") {
		  						var imgNodeId = "img" + data[node.name];
		  						var imgNode = document.getElementById(imgNodeId);
		  						imgNode.src = data[imgNodeId];
		  						node.value = value;
		  					} else {
		  						Xercel.Util.setFieldValue(node, value);
		  					}
		  				}
		  			}
		  		}
			}
		};
		
		this._openConnection();
		
		if (Xercel.Ajax._request) {
		    Xercel.Ajax._request.open(this._method, this._url, false);
		    Xercel.Ajax._request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
		    if ( ! sjax) {
		    	Xercel.Ajax._request.onreadystatechange = Xercel.Ajax.responseHandler;
		    } 
		    Xercel.Ajax._request.send(data);
		    if (sjax) {
		    	Xercel.Ajax.parseResponse();
		    }
		    return true;
	    } else {
	    	this._notSupported = true;
	    	return false;
	    }
        	
	};
	
	Xercel.Ajax._jsonResponseHandler = function(json) {
		for (var i = 0; i < json.fields.length; i = i + 1) {
			var field = json.fields[i];
			var node = Xercel.Ajax._form[field.name]; 
			if ( ! node) {
			 continue;
			}
			
			if (field.scope) {
				if (node.fieldType == "AntispamField") {
					var imageNode = document.getElementById(field.scope.id);
					imageNode.src = field.scope.src;
				} else if (node.fieldType == "RadioButtonField") {
					var radioNodes =  Xercel.Ajax._form["radio" + field.name];
					if (typeof radioNodes[0] != "undefined" && radioNodes[0]) {
						var parentNode = radioNodes[0].parentNode;
						
						for (var j = radioNodes.length - 1; j > field.scope.length - 1; j = j - 1) {
							parentNode.removeChild(radioNodes[j]);
							var descriptionNode = document.getElementById("radio" + field.name + j + "_desc");
							if (descriptionNode) {
								parentNode.removeChild(descriptionNode);
							}
						}

						for (var k = radioNodes.length; k < field.scope.length; k = k + 1) {
							var clone = radioNodes[0].cloneNode(false);
							clone.value = "";
							clone.checked = false;
							var descNode = document.createElement("SPAN");
							descNode.setAttribute("id", "radio" + field.name + k + "_desc");
							var rqNode = document.getElementById(field.name + "_rq");
							if (rqNode) {
								parentNode.insertBefore(clone, rqNode);
								parentNode.insertBefore(descNode, rqNode);
							} else {
								parentNode.appendChild(clone);
								parentNode.appendChild(descNode);
							}
						}
						
						for (var l = 0; l < radioNodes.length; l = l + 1) {
							radioNodes[l].checked = false;
							radioNodes[l].setAttribute("id", "radio" + field.name + l);
							radioNodes[l].value = field.scope[l].code;
							var dNode = document.getElementById("radio" + field.name + l + "_desc");
							dNode.innerHTML = field.scope[l].description;
						}
					}
				} else if (node.fieldType == "ListField" || node.fieldType == "MultiSelectListField") {
					for (var n = node.length - 1; n > field.scope.length - 1; n = n - 1) {
						node.remove(n);
					}
					
					for (var g = node.length; g < field.scope.length; g = g + 1) {
						node.appendChild(document.createElement("OPTION"));
					}
					
					for (var m = 0; m < node.length; m = m + 1) {
						node.options[m].selected = false;
						node.options[m].value = field.scope[m].code;
						node.options[m].text = field.scope[m].description;
					}
				}
			}

			Xercel.Util.setLabel(node, field.label);
			Xercel.Util.setProtected(node, field.isProtected);
			Xercel.Util.setRequired(node, field.isRequired);
			Xercel.Util.setFieldValue(node, Xercel.unescape(field.value));
		}
	};
};

