/********************************************************************************************
	FwkHttpTransfer
	===============
	Este módulo implementa la funcionalidad para realizar consultas a un servidor web
	desde el navegador de internet sin abandonar la página. Las consultas pueden 
	realizarse de manera sincrónica o asincrónica para el envío y recuperación de datos.
	Todos los servicios son provistos por un único objeto de tipo ClsHttpTransfer, 
	accesible mediante top.fwkHttpTransfer

	Autor:		
	Fecha:		01/01/2003
	Version:	1.3

	VERSIONES 
	=========
	
	VERSION 1.3 (23/04/2003)
	
		Esta version incluye un nuevo objeto de alto nivel que simplica el proceso de post
		y get
		
		- Nuevo Metodo: top.fwkHttpTransfer.CreateHttpData()
			Retorna una nueva instancia de ClsHttpData, a ser utilizada para almacenar los
			datos a enviar al servidor, tanto en un post como en un get. Los datos se
			cargan utilizando su único método AddFields, que toma una cantidad par 
			arbitraria de argumentos con el formato campo, valor [, campo, valor ]*

				// Ejemplo para hacer un GET enviando un querystring
				var data = top.fwkHttpTransfer.CreateHttpData();
				data.AddFields("CompName", "Barnes&Noble", "Status", "Pending?");
				var result = top.fwkHttpTransfer.Request("GET", "somepage.aspx", data);
				
				En este caso, fwkHttpTransfer genera un GET request encodeando los 
				datos según sea necesario:
					somepage.aspx?CompName=Barnes%26Noble&Status=Pending%3F

				En somepage.aspx.cs se pueden recuperar los valores así
					string comp = Request.QueryString["CompName"];
					string status = Request.QueryString["Status"];


				// Ejemplo para hacer un POST
				var data = top.fwkHttpTransfer.CreateHttpData();
				data.AddFields("CompName", "Barnes&Noble", "Status", "Pending?");
				var result = top.fwkHttpTransfer.Request("POST", "somepage.aspx", data);
				// Notar que no se le especifica el header de form-encoding
				
				fwkHttpTransfer genera un POST request al recurso somepage.aspx
				enviando los datos posteados. En el Page_Load desomepage.aspx.cs 
				podemos recuperar los datos así
					string comp = Request.Form["CompName"];
					string status = Request.Form["Status"];
					
				Al no especificar headers, fwkHttpTransfer envia el header de form-encoding
				por tratarse de un POST y también encodea los valores adecuadamente.
		
		- Nuevo Objeto: ClsHttpData
			Ya fue descripto arriba.
			
		- Metodo modificado: fwkHttpTransfer.Request
		- Metodo modificado: fwkHttpTransfer.AsycRequest
			El argumento "data" de estos metodos ahora aceptan una referencia a una
			instancia de ClsHttpData en cuyo caso fwkHttpTransfer se comporta como
			se ha decrito en los ejemplos de arriba.
			Si "data" es un string o un XMLDocument fwkHttpTransfer sigue comportándose
			como antes.
		
		- Nuevo Metodo: fwkHttpTransfer.EncodeQueryStringValue
			Usar este metodo para encodear cualquier dats a enviar en el querystring
			de la url, cuando no se utilice el objeto ClsHttpData.
			
			//Ejemplo
			url = "somepage.aspx?field1=" + fwkHttpTransfer.EncodeQueryStringValue(value1) +
				"&field2=" + fwkHttpTransfer.EncodeQueryStringValue(value2)
				
			top.fwkHttpTransfer.Request("GET", url)
		
		- Nuevo Metodo: fwkHttpTransfer.EncodeFormValue
			Similar al enterior, pero se utiliza para encodear los datos a enviar
			en un POST, cuando no se usa el objeto ClsHttpData
	
	VERSION 1.0

		ClsHttpTransfer
		===============
		top.fwkHttpTransfer es una instancia de esta clase y es el objeto raíz para
		utilizar esta librería.
		
		class ClsHttpTransfer
		{
			ClsHttpResult Request(strMethod, strUrl, data, 
					strHeaders, strUser, strPassword)
			
			ClsHttpResult AsycRequest(strMethod, strUrl, data, callback,
					strHeaders, strUser, strPassword);
			
			//Form handling services

			//header a enviar para que el request se interprete como un Form
			//retorna la constante "Content-Type=application/x-www-form-urlencoded"
			string formPostHeader(); 
			
			//Esta funcion encodea ciertos caracters "unsafe" para enviar en un request
			string EscapeValue(string);
				
			//Patrón a seguir para declarar las funciones callback
			function callback(ClsHttpResult httpResult);
		}
		
		<"get"|"post"|"put"> strMethod
			método a utilizar para hacer el request, puede valer GET, POST o PUT
		
		<string> strUrl
			url a la que se hará el request, absoluta o relativa
		
		[string|IXMLDOMDocument] data
			datos a enviar en el request.

		[Function] callback
			funcion a llamar al terminar el request asincrónico.
		
		[string] strHeaders
			cadena con los headers a enviar en el request. El formato debe ser
				headerkey1=headervalue1&headerkey2=headervalue2....
			Por ejemplo para simular un POST de un form el debería ser
				Content-Type=application/x-www-form-urlencoded
			y data podría ser
				input1=hola&input2=mundo&idCliente=1002
				
		[string] strUser
		[string] strPassword
			información de autenticación.
			
		ClsHttpResult
		=============
		Request retorna un objeto del tipo ClsHttpResult, y además la función 
		callback ejecutada al finalizar un AsyncRequest recibe un parámetro de 
		este tipo.
		
		class ClsHttpResult
		{
			ClsHttpRequest request;
			IXMLDOMDocument responseXML;
			string	responseText;
			Array responseBody;
			stream responseStream;
			long status;
			string statusText;
		}
		request: encapsula los argumentos utilizados al hacer el request. Esta propiedad
			cobra utilidad al ejecutar request asincrónico, ya que le permite al handler
			recuperar los datos del request que dio origen al response.
		responseXML: representa el body parseado por MSXML.XMLDOMDocument. 
		responseText: representa el body obtenido como un string.
		Array responseBody: representa el body obtenido como un arreglo 
			de unsigned bytes.
		IStream responseStream: representa el body obtenido como un IStream
		long status: el HTTP status code retornado por el request.
		string statusText: el HTTP status text retornado por el request.

		ClsHttpRequest
		==============
		Esta clase encapsula los argumentos utilizados en la llamadas a los métodos
		Request y AsyncRequest de ClsHttpTransfer.

		class ClsHttpRequest
		{

			string method;
			string url;
			string user;
			string password;
			string headers;
			object data;
			boolean async;
		}

	Ejemplos
	========
	Hacer un request comun:
		result = top.fwkHttpTransfer.Request("get", "myPage.aspx?name=Isaac&lastname=Newton")
		if (result.status != 200) alert('Se produjo un error:' + result.statusText)
		else xml = result.responseXML

	Hacer un request asincronico:
		top.fwkHttpTransfer.AsyncRequest("get", "myPage.aspx?name=Isaac&lastname=Newton", 
			myCB)

		function myCB(result) 
		{
		if (result.status != 200) alert('Se produjo un error:' + result.statusText)
		else xml = result.responseXML
		}

	Hacer un request y olvidarse:
		top.fwkHttpTransfer.AsyncRequest("get", "myPage.aspx?name=Isaac&lastname=Newton")

	Simular un POST de un form:
		result = top.fwkHttpTransfer.Request("post", "myForm.aspx", 
			"name=Isaac&lastname=Newton", top.fwkHttpTransfer.formPostHeader)
			
		//o, si los datos contienen algun caracter "unsafe" 
		var postData = "name=" + top.fwkHttpTransfer.escapeValue(name) +
			"&lastname="  + top.fwkHttpTransfer.escapeValue(lastname) +
		result = top.fwkHttpTransfer.Request("post", "myForm.aspx", 
			postData, top.fwkHttpTransfer.formPostHeader)
		
   
		
********************************************************************************************/

//if (top == self)
//{

	////////////////////////////////////////////////////////////////////////////////
	// Result object to be returned after a XMLHTTP Request
	////////////////////////////////////////////////////////////////////////////////
	function ClsHttpResult(xmlHttpObject, refRequest) 
	{
		if ( !(this instanceof ClsHttpResult)) return new ClsHttpResult(xmlHttpObject);
		
		this.request = refRequest;
		this.responseXML = xmlHttpObject.responseXML;
		this.responseText = xmlHttpObject.responseText;
		this.responseBody = xmlHttpObject.responseBody;
		this.responseStream = xmlHttpObject.responseStream;
		this.status = xmlHttpObject.status;
		this.statusText = xmlHttpObject.statusText;
	}

	////////////////////////////////////////////////////////////////////////////////
	// Request information encapsulation. This is the refRequest
	// passed to ClsHttpResult
	////////////////////////////////////////////////////////////////////////////////
	function ClsHttpRequest(strMethod, strUrl, strUser, strPassword, strHeaders, data, boolAsync)
	{
		if ( !(this instanceof ClsHttpRequest)) return new ClsHttpResult(strMethod, strUrl, strUser, strPassword, strHeaders, data, boolAsync);
		this.method = strMethod;
		this.url = strUrl;
		this.user = strUser;
		this.password = strPassword;
		this.headers = strHeaders;
		this.data = data;
		this.async = boolAsync;
	}

	////////////////////////////////////////////////////////////////////////////////
	// Helper class to wrap the actual XMLHTTP provider                          
	////////////////////////////////////////////////////////////////////////////////
	function ClsHttpWrapper(index, controller) 
	{
		if (!(this instanceof ClsHttpWrapper)) return new ClsHttpWrapper(index, controller);
		
		this.callback = null;
		   // Mozilla/Safari 
		   if (window.XMLHttpRequest) 
		           this.xmlHttp = new XMLHttpRequest(); 
		   // IE 
		   else if (window.ActiveXObject) 
		           this.xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 

		//this.xmlHttp = new ActiveXObject("MSXML2.XMLHTTP");
		this.index = index;
		this.controller = controller;
	}

	ClsHttpWrapper.prototype.request = 
	function(strMethod, strUrl, strUser, strPassword, strHeaders, data, callback, boolAsync) 
	{

		//wndLog.document.writeln("Requesting " + strUrl + " Async:" + boolAsync + "<br>");


		this.callback = null;

		this.xmlHttp.open(strMethod, strUrl, boolAsync, strUser, strPassword);
		if (strHeaders!=null && strHeaders!='') {
			var vHeaders = strHeaders.split('&');
			for(var i=0;i<vHeaders.length; i++) {
				vHeader = vHeaders[i].split('=');
				this.xmlHttp.setRequestHeader(vHeader[0], vHeader[1]);
			}
		}

		var request	= new ClsHttpRequest(strMethod, strUrl, strUser, strPassword, strHeaders, data, boolAsync);
		if (boolAsync) {
			var self = this;
			this.callback = callback;
			//this.xmlHttp.onreadystatechange = new Function('top.fwkHttpTransfer.getWrapper(' + this.index + ').onreadystatechange()');
			this.xmlHttp.onreadystatechange = function() {
				if (self.xmlHttp.readyState == 4) {
					//wndLog.document.writeln("Response received for " + strUrl + " status:" + self.xmlHttp.status +  "<br>");
					if (self.callback != null)
						self.callback(new ClsHttpResult(self.xmlHttp, request));
					self.controller.pushFree(self);
				}
				
			}
			this.xmlHttp.send(data);
			
		}
		else {
			this.xmlHttp.send(data);
			//wndLog.document.writeln("Response received for " + strUrl + " status:" + this.xmlHttp.status  + "<br>");
			this.controller.pushFree(this);
			return new ClsHttpResult(this.xmlHttp, request);
		}
	}

	ClsHttpWrapper.prototype.onreadystatechange = 
	function() 
	{
		if (this.xmlHttp.readyState == 4) {
			//wndLog.document.writeln("Response received for ? status:" + this.xmlHttp.status +  "<br>");
			if (this.callback != null)
				this.callback(new ClsHttpResult(this.xmlHttp));
			this.controller.pushFree(this);
		}
	}


	////////////////////////////////////////////////////////////////////////////////
	// ClsHttpData
	// This is a helper class to be used with ClsHttpTransfer to
	// alleviate the work needed to send data to the server
	////////////////////////////////////////////////////////////////////////////////

	function ClsHttpData()
	{
		if (!(this instanceof ClsHttpData)) return new ClsHttpData;
		
		this.values = new Array();
		
		if (arguments.length>0)
			this.AddFields.apply(this, arguments);
	}

	ClsHttpData.prototype.AddFields = function()
	{
		if (arguments.length%2!=0) {
			alert('ClsHttpData.AddFields: wrong number of arguments');
			return null;
		}
		for(var i=0;i<arguments.length;i=i+2)
		{
			this.values[this.values.length] = { field: arguments[i], value: arguments[i+1] };
		}
	}

	////////////////////////////////////////////////////////////////////////////////
	// Helper object (ideally there will be just one instance of this runnig)
	// to provide the XMLHTTP requests
	// This instance should be accessed via the top.fwkHttpTransfer property
	////////////////////////////////////////////////////////////////////////////////
	function ClsHttpTransfer() 
	{
		if (self.fwkHttpTransfer!=null) return self.fwkHttpTransfer;
		if (!(this instanceof ClsHttpTransfer)) return new ClsHttpTransfer;
		
		this.Request;
		this.AsyncRequest;
		this.EscapeValue;

		this.XmlHttps = new Array();
		this.XmlHttpsFree = new Array();
	}

	ClsHttpTransfer.prototype.EscapeValue = function(strValue)
	{
		/*
		Lista de "unsafe characters" sacada de 
		http://www.faqs.org/rfcs/rfc2396.html section 2

		reserved    = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
		mark        = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
		control     = <US-ASCII coded characters 00-1F and 7F hexadecimal> (0-31 y 127 decimal)
		space       = <US-ASCII coded character 20 hexadecimal>	(32 decimal)
		delims      = "<" | ">" | "#" | "%" | <">
		unwise      = "{" | "}" | "|" | "\" | "^" | "[" | "]" | "`"
		*/


		//Este vector contine todos los pares <expresion regular>, <caracter encodeado>
		//de todos los "unsafe chars" listados arriba
		var replacer = [[/\x25/g,'%25'],[/\x3B/g,'%3B'],[/\x2F/g,'%2F'],[/\x3F/g,'%3F'],[/\x3A/g,'%3A'],[/\x40/g,'%40'],[/\x26/g,'%26'],[/\x3D/g,'%3D'],[/\x2B/g,'%2B'],[/\x24/g,'%24'],[/\x2C/g,'%2C'],[/\x2D/g,'%2D'],[/\x5F/g,'%5F'],[/\x2E/g,'%2E'],[/\x21/g,'%21'],[/\x7E/g,'%7E'],[/\x2A/g,'%2A'],[/\x27/g,'%27'],[/\x28/g,'%28'],[/\x29/g,'%29'],[/\x20/g,'%20'],[/\x3C/g,'%3C'],[/\x3E/g,'%3E'],[/\x23/g,'%23'],[/\x22/g,'%22'],[/\x7B/g,'%7B'],[/\x7D/g,'%7D'],[/\x7C/g,'%7C'],[/\x5C/g,'%5C'],[/\x5E/g,'%5E'],[/\x5B/g,'%5B'],[/\x5D/g,'%5D'],[/\x60/g,'%60'],[/\x0/g,'%0'],[/\x1/g,'%1'],[/\x2/g,'%2'],[/\x3/g,'%3'],[/\x4/g,'%4'],[/\x5/g,'%5'],[/\x6/g,'%6'],[/\x7/g,'%7'],[/\x8/g,'%8'],[/\x9/g,'%9'],[/\xA/g,'%A'],[/\xB/g,'%B'],[/\xC/g,'%C'],[/\xD/g,'%D'],[/\xE/g,'%E'],[/\xF/g,'%F'],[/\x10/g,'%10'],[/\x11/g,'%11'],[/\x12/g,'%12'],[/\x13/g,'%13'],[/\x14/g,'%14'],[/\x15/g,'%15'],[/\x16/g,'%16'],[/\x17/g,'%17'],[/\x18/g,'%18'],[/\x19/g,'%19'],[/\x1A/g,'%1A'],[/\x1B/g,'%1B'],[/\x1C/g,'%1C'],[/\x1D/g,'%1D'],[/\x1E/g,'%1E'],[/\x7F/g,'%7F']];

		var result = strValue;
		for(var i=0;i<replacer.length;i++)
			result = result.replace(replacer[i][0], replacer[i][1])
			
		return result
	}

	ClsHttpTransfer.prototype.EncodeQueryStringValue = ClsHttpTransfer.prototype.EscapeValue;

	//Backward compatibility
	ClsHttpTransfer.prototype.escapeValue = ClsHttpTransfer.prototype.EscapeValue;

	ClsHttpTransfer.prototype.EncodeFormValue = function(value)
	{
		return value.replace(/&/g, '%26');
	}

	ClsHttpTransfer.prototype.getWrapper = 
	function(index) 
	{
		return this.XmlHttps[index];
	}

	ClsHttpTransfer.prototype.pushFree = 
	function(wrapper) 
	{
		this.XmlHttpsFree.push(wrapper.index);
	}

	ClsHttpTransfer.prototype.getFreeXmlHttps = 
	function() 
	{
	//	wndLog.document.write("Https: " + this.XmlHttps.length + "<br>");
	//	wndLog.document.write("HttpsFree: " + this.XmlHttpsFree.length + "<br>");

		var free, xmlHttp;
		if (this.XmlHttpsFree.length==0) {
			this.XmlHttps[this.XmlHttps.length] = new ClsHttpWrapper(this.XmlHttps.length, this);
			free = this.XmlHttps.length - 1;
		}
		else 
			free = this.XmlHttpsFree.pop();
			
		return this.XmlHttps[free];
	}

	/********************************************** DBG OAC - INI **********************************************/
	ClsHttpTransfer.prototype.Request = function(strMethod, strUrl, data, strHeaders, strUser, strPassword)
	{
		result = this._request(strMethod, strUrl, strUser, strPassword, this.GetHeader(strHeaders), data, null, false)
		
		var oErr = this.CheckSessionError(result);
		
		if(oErr!=null)
		{
			this.TrowExeption(oErr);
			result.status = oErr.Id;
			result.statusText = oErr.Message;
		}
		return result;
	}
	ClsHttpTransfer.prototype.RequestDummy = function()
	{
		strMethod = "post";
		strUrl = "/Amb_Administracion/Dummy.axd";
		strUser = "";
		strPassword = "";
		strHeaders = null;
		data = "";
		result = this._request(strMethod, strUrl, strUser, strPassword, this.GetHeader(strHeaders), data, null, false)

		var oErr = this.CheckSessionError(result);
		
		if(oErr!=null)
		{
			this.TrowExeption(oErr);
			result.status = oErr.Id;
			result.statusText = oErr.Message;
		}
		return result;
	}

	ClsHttpTransfer.prototype.AsyncRequest = function(strMethod, strUrl, data, callback, strHeaders, strUser, strPassword)
	{
		var wrapper = this.getFreeXmlHttps();
		return this._request(strMethod, strUrl, strUser, strPassword, this.GetHeader(strHeaders), data, 
						function(result)
						{
							var oErr = fwkHttpTransfer.CheckSessionError(result);
		
							if(oErr!=null)
							{
								fwkHttpTransfer.TrowExeption(oErr);
								result.status = oErr.Id;
								result.statusText = oErr.Message;
								return result;
							}
							else
							{
								callback(result);
							}
						}, true)
	}
	/********************************************** DBG OAC - FIN **********************************************/

	ClsHttpTransfer.prototype._request = 
	function(strMethod, strUrl, strUser, strPassword, strHeaders, data, callback, async)
	{
		
		var strData ='';
		if (data instanceof ClsHttpData)
		{
			var fnEncoding = function(value) { return value };
			
			if (strMethod == 'get')
				fnEncoding = this.EncodeQueryStringValue;
			if (strMethod == 'post')
			{
				fnEncoding = this.EncodeFormValue;
				if (typeof(strHeaders) == 'undefined')
					strHeaders = this.formPostHeader();
			}
			
			for(var i=0;i+1<data.values.length;i++)
				strData += data.values[i].field + '=' + fnEncoding(data.values[i].value) + '&';
			strData += data.values[i].field + '=' + fnEncoding(data.values[i].value);

			if (strMethod == 'get')
			{
				if (strUrl.indexOf('?')>0)
					strUrl += strData;
				else
					strUrl += '?' + strData;
				strData = '';
			}
		}
		else
			strData = data;
		var wrapper = this.getFreeXmlHttps();
		return wrapper.request(strMethod, strUrl, strUser, strPassword, strHeaders, strData, callback, async)
	}

	ClsHttpTransfer.formPostHeader = "Content-Type=application/x-www-form-urlencoded";
	ClsHttpTransfer.prototype.formPostHeader = 
	function()
	{
		return ClsHttpTransfer.formPostHeader;
	}

	ClsHttpTransfer.prototype.CreateHttpData = function()
	{
		return new ClsHttpData();
	}


	if (self.fwkHttpTransfer == null) self.fwkHttpTransfer = new ClsHttpTransfer();


	/********************************************** DBG OAC - INI **********************************************/

	//Method who Check for Session Error
	ClsHttpTransfer.prototype.CheckSessionError = function(result)
	{
		var oErr = null;
		if (result.status == 200)
		{
			var oSessErrXml = result.responseXML;
			if(oSessErrXml != null)
			{
 				var oSessErrNodo = oSessErrXml.selectSingleNode("//SessionError");
				if(oSessErrNodo != null)
				{
					oErr = new ErrorObject(oSessErrNodo.getAttribute("Id"),oSessErrNodo.getAttribute("Msg"),oSessErrNodo.getAttribute("Msg"),oSessErrNodo.getAttribute("Msg"),oSessErrNodo.getAttribute("Url"));
				}
			}
		}
		return oErr;
	}

	// Method to parse Error XML and return Path of Error Page
	ClsHttpTransfer.prototype.GetErrorUrl = function(result)
	{
		if (result.status == 200)
		{
			var oSessErrXml = result.responseXML;
			
			if(oSessErrXml != null)
			{
 				var oSessErrNodo = oSessErrXml.selectSingleNode("//SessionError");
				if(oSessErrNodo != null)
				{
					return oSessErrNodo.getAttribute("Url");
				}
			}
		}
	}

	// Method to parse Error XML and return Error code
	ClsHttpTransfer.prototype.GetErrorCode = function(result)
	{
		if (result.status == 200)
		{
			var oSessErrXml = result.responseXML;
			
			if(oSessErrXml != null)
			{
 				var oSessErrNodo = oSessErrXml.selectSingleNode("//SessionError");
				if(oSessErrNodo != null)
				{
					return oSessErrNodo.getAttribute("Id");
				}
			}
		}
	}

	// Add Header of HttpTrasfer
	ClsHttpTransfer.prototype.GetHeader = function(strHeader)
	{
		if((typeof(strHeader)!='undefined'))
		{
			return "SENTBYTRANSFER=true&" + strHeader;
		}
		else
		{
			return "SENTBYTRANSFER=true";
		}
	}

	ClsHttpTransfer.prototype.TrowExeption = function(oErr)
	{
		// Try to set flagConfirmUnload
		try
		{
			self.document.all['flagConfirmUnload'].value="off";
		}
		catch(ex)
		{
		}
		// Redirect to Page Errors
		fwkHttpTransfer.PageRedirect(oErr);
	}

	//Redirect To Page Error
	ClsHttpTransfer.prototype.PageRedirect = function(oEr)
	{
		var oErr = oEr;
		//Get Path of Error Page
		var strUrl = oErr.ErrorPage;
		
		if (window.dialogArguments == undefined)
		{
			if(window.opener == undefined)
			{
				//Return for a Simple Page
				window.location.replace(strUrl);
			}
			else
			{
				//Return for Windows.Open
				window.opener.location.replace(strUrl);
				window.close();	
			}
		}
		else 
		{
			//Return for ModalDialog
			window.returnValue = oErr.ToString();
			window.close();	
		}
	}
	
	/********************************************** DBG OAC - FIN **********************************************/

	/********************************************** DBG OAC - INI **********************************************/
	/* This Method is part of Error Handling Object.
	*/
	ClsHttpTransfer.prototype.CheckXmlSessionError = function(sXmlError)
	{
		var oErr = null;
		try
		{
			var oXmlError = new ActiveXObject("Msxml2.DOMDocument");
			oXmlError.loadXML(sXmlError);
			if(oXmlError != null)
			{
 				var oSessErrNodo = oXmlError.selectSingleNode("//SessionError");
				if(oSessErrNodo != null)
				{
					//returnValue = true;
					oErr = new ErrorObject(oSessErrNodo.getAttribute("Id"),oSessErrNodo.getAttribute("Msg"),oSessErrNodo.getAttribute("Msg"),oSessErrNodo.getAttribute("Msg"),oSessErrNodo.getAttribute("Url"));
				}
			}
		}
		catch(ex){}
		return oErr;
	}
	
	function ErrorObject (sId,sName,sMessage,sType,sErrorPage)
	{
		this.Id = sId;
		this.Name = sName;
		this.Message = sMessage;
		this.Type = sType;
		this.ErrorPage = sErrorPage;
	}
	ErrorObject.prototype.ToXml = function()
	{
		// Xml Object
		var oXml = new ActiveXObject("Msxml2.DOMDocument");

		// Root Element
		var rootNode = oXml.createElement("Errors");
		
		//Creo el nodo XML
		newNode = oXml.createElement("SessionError");

		//Le pongo los atributos
		newNode.setAttribute("Id",this.Id);
		newNode.setAttribute("Msg",this.Message);
		newNode.setAttribute("Url",this.ErrorPage);
		
		//Add Root
		oXml.appendChild(rootNode);
		//Add Error Node
		oXml.lastChild.appendChild(newNode);
		
		return oXml
	}
	
	ErrorObject.prototype.ToString = function()
	{
		var oXml = this.ToXml();
		return "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>" + oXml.xml;
	}
	/********************************************** DBG OAC - FIN **********************************************/
//}