	/****************************************************/
	// PETICIONES AJAX 								  	//
	/****************************************************/

   	function Error(){
       	this.code = null;
       	this.text = null;
       	this.valid = false;
	}
	Error.prototype.getCode = function(){return this.code;}
	Error.prototype.getText = function(){return this.text;}
	Error.prototype.isValid = function(){return this.valid;}
	Error.prototype.getError = function(xmlDoc){
		this.code = getNodeValue(xmlDoc, "error/code");
		this.text = getNodeValue(xmlDoc, "error/text");
		this.valid = (this.code != null && this.code != "");
	}

	function throwRequest(win, reqXMLDoc, params, action){
		var url = win.getServletUrl();
		throwRequestURL(url, reqXMLDoc, params, action, null, null, (win.isPopup() && !win.isModal()));
	}

	function throwRequestLov(field, params){
		throwRequestURL(getMngWindow().getWindow("COM_LOV").getServletUrl(), null, params, null, null, field, null);
	}

	function throwRequestURL(url, reqXMLDoc, params, action, handler, field, isPopup){

		isPopup = (isPopup != null) ? isPopup : false;
		if (!isPopup) showProcessing();

		var req = null;
		if (window.XMLHttpRequest){
			 req = new XMLHttpRequest();
		} else if (window.ActiveXObject){
			try {
				req = new ActiveXObject("Msxml2.XMLHTTP");
			} catch(e) {
				req = new ActiveXObject("Microsoft.XMLHTTP");
			}
		}

		req.onreadystatechange = function(){

			if (req.readyState == 4) {
				if (req.status == 200) {

					var xmlDoc = req.responseXML;
					if(!isIE && xmlDoc != null) xmlDoc.normalize();
					var error = new Error();
					error.getError(xmlDoc);
					if (error.isValid() && error.getCode() == "nosession") {	// Si ha caducado la session
						getTop().noSession();
					}

					if (error.isValid() && error.getCode() == "-1") {			// Si hay error de sistema
						if (!isPopup) hideProcessing(true);
						alert(error.getText());
						return;
					} else {
						if (field == null) {
							if(handler == null) handleAction(action, xmlDoc, (error.isValid()) ? error : null);
							else handler(action, xmlDoc, (error.isValid()) ? error : null);
						} else {
							if(error.isValid()) alert(error.getText());
							else field.onResponse(xmlDoc);
						}
					}

					if (!isPopup) hideProcessing();
				}
			}
		}

		url += (params != null) ? params.toString() : "";

		req.open("POST", url, true);
		req.setRequestHeader("content-type", "text/xml;charset=utf-8");
		req.send((reqXMLDoc != null) ? reqXMLDoc.getXMLDoc() : null);
	}

	
	/****************************************************/
	// 	XML										  	    //
	/****************************************************/

	function newDocXml(){
		var xmlDoc = null;
		if (window.ActiveXObject){
			xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
			var pi = xmlDoc.createProcessingInstruction("xml", " version=\"1.0\" encoding=\"utf-8\"");
			xmlDoc.appendChild(pi);
			xmlDoc.appendChild(xmlDoc.createElement("request"));
		} else if (document.implementation && document.implementation.createDocument){
			xmlDoc = new DOMParser().parseFromString("<?xml version='1.0' encoding='utf-8'?><request></request>","text/xml");
		}
		return xmlDoc;
	}

	function ReqXmlDoc(){
		this.xmlDoc = newDocXml();
		this.root = this.xmlDoc.getElementsByTagName("request")[0];
	}
	ReqXmlDoc.prototype.getRootElement = function(){return this.root;}
	ReqXmlDoc.prototype.getXMLDoc = function(){return this.xmlDoc;}
	ReqXmlDoc.prototype.isEmpty = function(){
		if (this.xmlDoc != null){
			var rootElement = this.xmlDoc.getElementsByTagName("response")[0];
			if (rootElement != null && rootElement.childNodes.length > 0) return false;
		}

		return true;
	}

	function selectNodes(xmlDoc, xPath, rootElement){
		try {
			if (xPath == null) return new Array();
			if (rootElement == null) rootElement = xmlDoc.getElementsByTagName("response")[0];
			// Para IE
			if (window.ActiveXObject){
				var aNode = xmlDoc.documentElement.selectNodes(xPath);
				return aNode;
			// Para Mozilla
			} else if(document.implementation && document.implementation.createDocument){
				var result = new Array();
				var iNodes = xmlDoc.evaluate(xPath, rootElement, null, XPathResult.ANY_TYPE, null);
				var node = iNodes.iterateNext();
				while (node) {
					result.push(node);
	  				node = iNodes.iterateNext();
				}
				return result;
			}
			
		} catch (ex){
			alert("Error al evaluar el Xpath " + xPath);
		}
	}

	function getNodeValue(xmlDoc, xPath, separator){
		var result = "";
		if (separator == null) separator = " ";
		var aNodes = selectNodes(xmlDoc, xPath);
		for(var i = 0; i < aNodes.length; i++){
			if(i != 0) result += separator;
			result += getElementValue(aNodes[i]);
		}
		return result;
	}

	function getNodesValues(xmlDoc, xPath){
		var result = new Array();
		var aNodes = selectNodes(xmlDoc, xPath);
		for(var i = 0; i < aNodes.length; i++){
			result.push(getElementValue(aNodes[i]));
		}
		
		return result;
	}

	function getElementValue(element){
		try {
			if (element != null && element.hasChildNodes()) 
				return element.firstChild.nodeValue;
		} catch(ex){ }
		
		return "";		
	}

	function getElementChildValue(element, child){
		if (element == null) return null;
		var el = element.getElementsByTagName(child);
		if (el != null && el.length > 0) return getElementValue(el[0]);
		else return "";
	}

	function setFieldsFromXML(xmlDoc, aFields){
		for(var i in aFields){
			if(aFields[i].setValueXML != null)	aFields[i].setValueXML(xmlDoc);
		}
	}

	function getXMLFromFields(aFields){
		var reqXMLDoc = new ReqXmlDoc();
		addFieldsToXML(reqXMLDoc, aFields);
		return reqXMLDoc;
	}

	function addFieldsToXML(reqXMLDoc, aFields){
		for(var i in aFields){
			if(aFields[i].addToXML != null) aFields[i].addToXML(reqXMLDoc);
		}
	}

	function addFieldXML(parentNode, field, xmlDoc, tagName) {
		var node = null;
		if (field.getType() == "FMULSEL") {
			var aValues = field.getValue();
			for (var i = 0; i < aValues.length; i++) {
				node = xmlDoc.createElement(tagName);
				node.appendChild(xmlDoc.createTextNode(aValues[i]));
				parentNode.appendChild(node);
			}
		} else {
			node = xmlDoc.createElement(tagName);
			node.appendChild(xmlDoc.createTextNode(field.getValue()));
			parentNode.appendChild(node);
		}
	}

	function addToXML(field, reqXMLDoc) {
		if (field.getReqXpath != null && field.getReqXpath() != null)
			addElementToXML(reqXMLDoc, field.getReqXpath(), field.getValue());
	}

	function addFieldXML(parentNode, value, xmlDoc, tagName) {

		var node = null;
		if (value != null && value instanceof Array) {
			for (var i = 0; i < value.length; i++) {
				node = xmlDoc.createElement(tagName);
				node.appendChild(xmlDoc.createTextNode(value[i]));
				parentNode.appendChild(node);
			}
		} else {
			node = xmlDoc.createElement(tagName);
			if (value != null && value != "null") node.appendChild(xmlDoc.createTextNode(value));
			parentNode.appendChild(node);
		}
	}

	function addElementToXML(reqXMLDoc, reqXPath, value) {

		var xmlDoc = reqXMLDoc.getXMLDoc();
		var curNode = reqXMLDoc.getRootElement();
		var prevNode = null;
		var aNodes = null;

		if (reqXPath != null) {
			var	aTags = reqXPath.split("/");

			for (var j = 0; j < aTags.length; j++) {

				if (j == (aTags.length - 1)) {
					addFieldXML(curNode, value, xmlDoc, aTags[j]);
					return;
				} else {
					aNodes = curNode.getElementsByTagName(aTags[j]);
					if (aNodes.length == 0) {
						var auxNode = xmlDoc.createElement(aTags[j]);
						curNode.appendChild(auxNode);
						prevNode = curNode;
						curNode = auxNode;
					} else {
						prevNode = curNode;
						curNode = aNodes[aNodes.length - 1];
					}
				}
			}
		}
	}

