/*------------------------------------------------------------------------------------------------------------\
	Date Created: 10-27-05
	Modified Date: 10-27-05
	Function Name: MyAjax()
	Porpouse: Función para crear el objeto AJAX
/-------------------------------------------------------------------------------------------------------------*/
function MyAjax() {
	var xmlhttp=false;
	try {
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
		try {
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (E) {
			xmlhttp = false;
		}
	}
	
	if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
		xmlhttp = new XMLHttpRequest();
	}
	
	return xmlhttp;
}


/*------------------------------------------------------------------------------------------------------------\
	Date Created: 10-22-05
	Modified Date: 11-17-05
	Function Name: SetAjax()
	Porpouse: Clase para trabajar con AJAX
/-------------------------------------------------------------------------------------------------------------*/
function SetAjax(file_name) {
	this.Form = null;
	this.Method = "GET";
	this.Objects = new Array();
	this.AllFormElements = false;
	this.FilePath = file_name;
	this.FileRedirect = null;
	this.FileRedirectResult = false;
	this.setVar = null;
	this.RunScript = false;
	this.returnType = "TEXT";
	this.returnMode = 0;
	this.SplitChar = "|";
	this.Element = null;
	this.ElementAttribute = "innerHTML";
	this.ElementPlainText = true;
	this.manageError = function(errnum, value) { };
	this.showErrorAlert = true;
	
	
	this.onLoading = function() { };
	this.onLoaded = function() { };
	this.onInteractive = function() { };
	this.onCompletion = function() { };
	
	
	this.Execute = function () {
		var _query = this.MakeQuery();
		var _URL = this.FilePath;
		var _RedirectResult = "";
		var _errNumber = -1;
		
		var AJAX = new MyAjax();
		
		if (AJAX) {
			var self = this;
			if (self.Method.toUpperCase() == "GET") _URL += _query;
			
			AJAX.open(self.Method, _URL, true);
			AJAX.onreadystatechange = function() {
				switch (AJAX.readyState) {
					case 1:
						self.onLoading();
						break;
					case 2:
						self.onLoaded();
						break;
					case 3:
						self.onInteractive();
						break;
					case 4:
						if (AJAX.status == 200) {
							var _resultado = (self.returnType.toUpperCase() == "TEXT") ? AJAX.responseText : AJAX.responseXML;
							//alert(_resultado);
							
							self.response = AJAX.responseText;
							
							var _resultado_split = _resultado.split("[/ERROR]");
							if (_resultado_split.length == 2) {
								_errNumber = _resultado_split[0];
								_errNumber = _errNumber.replace("[ERROR]", "");
								_errNumber = _errNumber.replace("[/ERROR]", "");
								
								_resultado = _resultado_split[1];
							}
							
							if (_resultado.indexOf("Notice") > 0 || _resultado.indexOf("Warning") > 0 
							|| _resultado.indexOf("parse error") > 0) {
								document.body.style.cursor = "default";
								alert(_resultado);
								return false;
							}

							if (_errNumber != -1) {
								document.body.style.cursor = "default";
								if (self.showErrorAlert) parent.AlertWinMsg(_resultado, _errNumber, 0, null, "error");
								self.manageError(_errNumber, _resultado);
								return false;
							} else {
								if (self.RunScript) self.runResponse(_resultado);
								self.returnElement(_resultado, self.ElementAttribute);
								if (self.returnMode == 1) self.ReturnQuery(_resultado);
								
								self.onCompletion();
								
								if (self.FileRedirectResult && self.returnType.toUpperCase() == "TEXT") _RedirectResult = _resultado;
								if (self.FileRedirect) document.location.href = self.FileRedirect + _RedirectResult;
							}
						} else if (AJAX.status == 404) {
							document.body.style.cursor = "default";
							alert("El Archivo \"" + self.FilePath + "\" no se encuentra.");
						} else {
							document.body.style.cursor = "default";
							var _ext = self.FilePath.substring(self.FilePath.indexOf(".")+1, self.FilePath.length);
							alert("Error Number: " + AJAX.status + "\nDescription: " + AJAX.statusText + "\nDocument Type: " 
							+ _ext.toUpperCase());
						}
						break;
				}
			}
			
			if (self.Method.toUpperCase() == "POST") AJAX.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			var _SendV = (self.Method.toUpperCase() == "GET") ? null : _query;
			
			AJAX.send(_SendV);
		}
	}
	
	
	this.returnElement = function(_result, _attribute) {
		var elementObj = null;
		elementObj = (!jsGetObject(this.Element)) ? this.Element : jsGetObject(this.Element);
		
		if (elementObj) {
			var elemNodeName = elementObj.nodeName;
			elemNodeName = elemNodeName.toLowerCase();
			if (this.ElementPlainText == true) {
				_result = ReplaceEnters(jsClearHTML(_result), "");
			}
			
			if (elemNodeName == "input" || elemNodeName == "select" || elemNodeName == "option" || elemNodeName == "textarea") {
				elementObj.value = _result;
			} else {
				if (_jslib_isIE) {
					jsSetAttribute(elementObj, _attribute, _result);
				} else {
					elementObj.innerHTML = _result;
				}
			}
		}
	}
	
	
	this.runResponse = function(_result) {
		eval(_result);
	}
	
	
	this.setVarFunction = function(_vars) {
		var query = "";
		var _Group, _Item;
  		for (var _Group in _vars) {
			if (_vars[_Group].length == 2) {
				var _Name = _vars[_Group][0];
				var _Value = _vars[_Group][1];
				query += "&" + _Name + "=" + _Value;
			} else {
				alert("Error: Solo puede establecer dos valores: [nombre, valor].\nGrupo: " + _Group);
				break;
			}
		}
		
		return query;
	}
	
	this.ReturnQuery = function(_result) {
		var _obj_type = "";
		var _res;
		
		if (this.returnType.toUpperCase() == "TEXT") {
			var _RS = _result.split(this.SplitChar);
			
			for (i=0; i < _RS.length; i++) {
				if (jsGetObject(this.Objects[i])) {
					_obj_type = jsGetObject(this.Objects[i]).nodeName.toLowerCase();
					_res = jsClearHTML(_RS[i]);
					
					if (_res != "") {
						if (_obj_type == "input" || _obj_type == "select" || _obj_type == "option" || _obj_type == "textarea") {
							jsGetObject(this.Objects[i]).value = _res;
						} else {
							jsGetObject(this.Objects[i]).innerHTML = _res;
						}
					}
				}
			}
		} else {
			//var _ip = _result.getElementsByTagName('usuario').item(0).firstChild.data;
		}
	}
	
	this.MakeQuery = function() {
		var query = "";
		var union = "";
		var _obj_type = "";
		
		if (this.AllFormElements && this.Form) {
			if (this.Form.elements.length) {
				for (i=0; i < this.Form.elements.length; i++) {
					_obj_type = this.Form.elements[i].nodeName.toLowerCase();
					
					if (_obj_type == "input" || _obj_type == "select" || _obj_type == "option" || _obj_type == "textarea") {
						if (this.Form.elements[i].type != "button" && this.Form.elements[i].type != "submit" && 
						this.Form.elements[i].type != "reset" && this.Form.elements[i].type != "image") {
							query += this.Form.elements[i].name + "=" + this.Form.elements[i].value + "&";
						}
					}
				}
				
				query = query.substring(0, query.length-1);
			}
		} else {
			var total = this.Objects.length;
			if (total) {
				for(i=0; i < total; i++) {
					union = (i < (total-1)) ? "&" : "";
					query += this.Objects[i] + "=" + jsGetObject(this.Objects[i]).value + union;
				}
				
				if (this.Method.toUpperCase() == "GET") query = "?" + query;
			} else {
				query = "?";
			}
			
			query += this.setVarFunction(this.setVar);
		}
		
		return query;
	}
}
