var __lock_clicks = false;
function jsAjax(file_name) {
	this.AjaxFailedAlert = jsLang.ajax.ajax_support[PPC_LANG];
	this.filePath = file_name;
	this.fileRedirect = null;
	this.form = null;
	this.method = 'GET';
	this.urlString = '';
	this.runScript = false;
	this.element = null;
	this.maxWaitingTime = 15000;
	this.lockClicks = false;
	this.loadingText = null;
	this.loadingClass = 'AJAXLoading';
	this.loadingIconPath = null;

	this.onLoading = function() { };
	this.onCompletion = function() { };
	this.onError = function(errnum, value) { };
	this.SetTimeOut = function() { }

	this.createAJAX = function() {
		var xmlhttp=false;
		try {
			xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e2) {
				try {
				  xmlhttp = new XMLHttpRequest();
				} catch (e3) {
				  xmlhttp = false;
				}
			}
		}
		
		if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
			xmlhttp = new XMLHttpRequest();
		}
		
		return xmlhttp;
	};
	
	this.setVar = function(name, value) {
		if (jsCore.isArray(name) && jsCore.isArray(value)) {
			for(var i=0; i<name.length,i<value.length; i++) {
				this.urlString += '&' + name[i] + '=' + value[i];
			}
		} else if (jsCore.isObject(name)) {
			for(n in name) {
				this.urlString += '&' + n + '=' + name[n];
			}
		} else {
			if (this.urlString.length < 3) {
				this.urlString = name + "=" + value;
			} else {
				this.urlString += "&" + name + "=" + value;
			}
		}
	}
	
	this.runResponse = function() {
		eval(this.response);
	}
	
	this.setError = function(msg,num) {
		document.body.style.cursor = 'default';
		this.onError(num, msg);
	}
	
	this.formElements = function() {
		var query = '';
		if (this.form.elements.length && this.form.nodeName.toLowerCase() == 'form') {
			var _obj_type, __obj;
			var _last_obj = '';
			for (var i=0; i < this.form.elements.length; i++) {
				__obj = this.form.elements[i];
				_obj_type = __obj.nodeName.toLowerCase();
				
				if (_obj_type == "input" || _obj_type == "select" || _obj_type == "option" || _obj_type == "textarea") {
					if (__obj.type != "button" && __obj.type != "submit" && __obj.type != "reset" && __obj.type != "image") {
						_obj_array = document.getElementsByName(__obj.name);
						if (_obj_array.length > 1) {
							if (_last_obj != __obj.name) {
								_last_obj = __obj.name;
								for(var j=0; j<_obj_array.length; j++) {
									var _elem_type = __obj.type.toLowerCase();
									if (_elem_type == "radio" || _elem_type == "checkbox") {
										if (_obj_array[j].checked == true) {
											query += _obj_array[j].name + "=" + _obj_array[j].value + "&";
											break;
										}
									}
								}
							}
						} else {
							_val = '';
							switch (__obj.type.toLowerCase()) {
								case "radio", "checkbox":
									if (__obj.checked) _val = __obj.value;
									break;
								default:
									_val = __obj.value;
									break;
							}
							query += __obj.name + "=" + _val + "&";
						}
					}
				}
			}
			
			query = query.substring(0, query.length-1);
			if (this.urlString != '') query = '&' + query;
		}
		
		return query;
	}
	
	this.createLoader = function() {
		if (!this.loadingIconPath) {
			this.setError('"loadingIconPath" is required.', 0);
			return false;
		}
		
		var row,cell;
		var table = $(document.createElement('table'));
		table.cellSpacing = 0;
		table.cellPadding = 0;
		table.border = 0;
		table.setStyle('height','100%');
		row = table.insertRow(-1);
			cell = row.insertCell(-1);
			var img = document.createElement('img');
			img.src = this.loadingIconPath + 'loading.gif';
			cell.appendChild(img);
			delete img;
			
			cell = $(row.insertCell(-1));
			cell.className = this.loadingClass;
			cell.innerHTML = this.loadingText;
		
		return table;
	}
	
	this.init = function(urlstring) {
		var AJAX = this.createAJAX();
		
		if (AJAX && this.AjaxFailedAlert) {
			var _errNumber = -1;
			var self = this;
			this.responseStatus = new Array(2);
			
			if (urlstring) {
				if (this.urlString.length) {
					this.urlString = this.urlString + "&" + urlstring;
				} else {
					this.urlString = urlstring;
				}
			}
			
			if (this.form) {
				this.urlString += this.formElements();
			}
			
			if (this.element) {
				if (!jsCore.isObject(this.element)) this.element = $(this.element);
			}
			
			if (!this.lockClicks) __lock_clicks = false;
			
			if (!__lock_clicks) {
				this.method = this.method.toUpperCase();
				
				if (this.method == "GET") {
					if (this.urlString != '') this.urlString = '?' + this.urlString;
					this.urlString = this.urlString.replace('?&','?');
					var totalurlstring = this.filePath + this.urlString;
					AJAX.open(this.method, totalurlstring, true);
				} else {
					AJAX.open(this.method, this.filePath, true);
				}
				
				if (this.maxWaitingTime > 0) {
					var requestTimer = setTimeout(function() {
						var msg = jsLang.ajax.loading_timeout[PPC_LANG];
						
						AJAX.abort();
						self.setError(msg, 0);
						self.SetTimeOut();
					}, this.maxWaitingTime);
				}
				
				var abort = false;
				AJAX.onreadystatechange = function() {
					if (AJAX.readyState == 1 || AJAX.readyState == 2 || AJAX.readyState == 3) {
						__lock_clicks = true;
						document.body.style.cursor = 'wait';
						if (self.loadingText) {
							self.element.appendChild(self.createLoader());
						}
						if (!abort) self.onLoading();
						abort = true;
					} else if (AJAX.readyState == 4) {
						__lock_clicks = false;
						document.body.style.cursor = 'default';
						if (self.maxWaitingTime > 0) clearTimeout(requestTimer);
						self.response = AJAX.responseText;
						//alert(self.response);
						self.responseXML = AJAX.responseXML;
						self.responseStatus[0] = AJAX.status;
						self.responseStatus[1] = AJAX.statusText;
						
						if (self.responseStatus[0] == 200) {
							if (self.responseXML) {
								var _err=self.responseXML.getElementsByTagName('error');
								if(_err.length){
									_err=_err.item(0);
									_errNumber = _err.getElementsByTagName('number').item(0).firstChild.nodeValue;
									_resultado = _err.getElementsByTagName('text').item(0).firstChild.nodeValue;
									self.setError(_resultado, _errNumber);
									return false;
								}
							}
							
							if (self.runScript) self.runResponse();
							if (self.FileRedirect) document.location.href = self.FileRedirect;
							if (self.element) {
								var elemNodeName = self.element.nodeName.toLowerCase();
								if (elemNodeName == "input" || elemNodeName == "select" || elemNodeName == "option" || elemNodeName == "textarea") {
									self.element.value = self.response;
								} else {
									self.element.innerHTML = self.response;
								}
							}
							self.onCompletion();
						} else if (self.responseStatus[0] == 404) {
							self.setError("The file \"" + self.filePath + "\" dose not exists.", self.responseStatus[0]);
						} else {
							self.setError(self.responseStatus[1], self.responseStatus[0]);
						}
						self.URLString = '';
					}
				}
				
				if (this.method == "POST") {
					try {
						AJAX.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
					} catch (e) {}
				} else {
					this.urlString = null;
				}
				
				AJAX.send(this.urlString);
			}
		} else {
			this.setError(this.AjaxFailedAlert, 0);
		}
	}
}
