var g_objLoader  = (Loader) ? new Loader() : null;
Logger.info("Loader", (g_objLoader) ? "loaded." : "failed to load.");
/**
 * Class for getting different documents from the net. 
 * Handles getting documents as strings and also the loading
 * of XML into DOMs.
 *
 * Does little more than wrap the MSXML component so that 
 * we can perform some lovely logging.
 *
 * @author Paul Reed - NetCall Telecom
 */
function Loader()
{
	//methods
	this.loadURLToDOM = _LXXML;
	this.loadXMLToDOM = _LX;
	this.loadPageToString = _DG;
	this.callWebService = _WS;
	this.testResult = _TR;

	function _WS(wC,aP,aS)
	{
		if(aS==null) aS='';
		if(aP==null) // check the wC for params
		{
			var ss = wC.split('?',2)
			wC = ss.shift();
			aP = ss.shift();   // will be null if it doesn't exist
		}

		if(typeof(aP)=='string') aP=_s2a(aP);
		// Create the call object 
		cO = WebServices.createCallOptions();
		cO.async = (aS!='');
		cO.params = aP;
		cO.funcName = wC;
		
		wC =(wC+'                    ').substring(0,20);
		// cO.SOAPHeader = new Array(new Object());
		Logger.info(':'+wC+':',">>");
		if(aS)
			r = WebServices.DataPortal.callService(aS, cO);
		else
			r = WebServices.DataPortal.callService(cO);

		if(aS) return;
		
		return _TR(r,wC);
		
	}
	
	function _TR(r,wC)
	{
		Logger.info(wC,"<<", (r.value && r.value.xml && r.value.xml.length) ?  r.value.xml.length + " bytes." : "");
		if(r.error)
			return('Failed Web Service Call : ['+r.errorDetail.code+'] '+r.errorDetail.string);

		try
		{
			if(typeof(r.value)=='object') 
			{
				if(g_objLogin) g_objLogin.resetTimer();
				if(r.value.hasChildNodes()) // assume it is XML
				{
					x = MSXML.DOMDocument(false);
					x.loadXML(r.value.childNodes[0].xml);
					return x;
				}
			}
			return(r.value);
		}
		catch(badr){ return(null); }
	}

	function _s2a(vP,iS,vS)
	{
		if(!iS)  iS ='&';
		if(!vS) vS='=';
		var aP = new Array();
		var aD = vP.split(iS);
		var ss;
		for(var i=0;i<aD.length;i++)
		{
			ss = aD[i].split(vS,2);
			aP[ss.shift()]=ss.shift();
		}
		return aP;
	}
	//loads a dom from a url and returns it in
	//a DOMDocument	
	function _LXXML(sU)
	{
		var xx = top.MSXML.XMLHTTP(false);
		xx.open("GET",sU,false);
		xx.send("");
		return xx.responseXml;
	}
	
	function _LX(xD, sU, aP)
	{
		if(sU.indexOf("/")<0) xD = _WS(sU); else xD = _LXXML(sU);

		if((xD==null)||(typeof(xD)=='string')||(xD.documentElement == null))
			{ _RE(xD); return null; }
		return xD;
	}
	
	//loads an arbitrary page from a URL and returns
	//it in a string using the GET method
	function _DG(sU)
	{
		var oP;
		oP= top.MSXML.XMLHTTP(false);
		oP.open("GET",sU,false);
		oP.send("");
		return oP.responseText;
	}
	
	function _DGXML(sU)
	{
		var oP;
		var sD="";
		oP = top.MSXML.XMLHTTP(false);
		var ss  = sU.split('?',2)
		sU  = ss.shift();
		sD = ss.shift();
		oP.open("POST",sU,false);
		oP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		oP.send(sD);
		return oP.responseXml;
	}
	
	function _RE(xD)
	{
		switch(true)
		{
			case (xD==null):
				Logger.severe("Unknown object loading problem.");
				break;
			case (typeof(xD)=="string"):
				Logger.severe("Invalid return value:\n"+xD);
				break;
			case (xD.parseError.errorCode != 0):
			   Logger.severe((xD.parseError).reason);
			   break;
		} 
	}
}
