var _crossDomainRequests = Array();
var AjaxObj = function() 
{
};


AjaxObj.prototype.LoadUrl = function(url, methodOnComplete, stateChangeCallback)
{
    var reqObj = this.InitializeObj();
    
    if (stateChangeCallback!=null)
        this.stateChangeCallback = stateChangeCallback;
    
    var _this=this;
         
    if(reqObj) 
    {
			reqObj.onreadystatechange = function ()
			{
	            _handleStateChange(reqObj, methodOnComplete);
	            
	            if (_this.stateChangeCallback!=null)
	                _this.stateChangeCallback(reqObj);
	        }
	        _this.startTime = new Date().getTime();
			reqObj.open("GET", url, true);
			reqObj.send("");
		}
}

function _handleStateChange(reqObj, methodOnComplete)
{    
    // only if req shows "loaded"
		if (reqObj.readyState == 4) 
		{ 
			// only if "OK"
			if (reqObj.status == 200) 
			{	
			    if (methodOnComplete)
			    {
			        /*if (reqObj.responseText.trim().indexOf("REDIR")==0)
            	    {
            	        var url = reqObj.responseText.substring(6,reqObj.responseText.length);
            	        location = url;
            	    }
            	    else*/
            	    {
				        methodOnComplete(reqObj);
				    }
				}
			} 
			else 
			{
				alert("There was a problem retrieving the XML data:\n" +
					reqObj.statusText);
			}
		}
}

AjaxObj.prototype.InitializeObj = function()
{
        req = false;
		// branch for native XMLHttpRequest object
		if(window.XMLHttpRequest) {
    		try {
				req = new XMLHttpRequest();
			} catch(e) {
				req = false;
			}
		// branch for IE/Windows ActiveX version
		} else if(window.ActiveXObject) {
       		try {
        		req = new ActiveXObject("Msxml2.XMLHTTP");
      		} catch(e) {
        		try {
          			req = new ActiveXObject("Microsoft.XMLHTTP");
        		} catch(e) {
          			req = false;
        		}
			}
		}
		
		return req;
}

var CrossDomainRequestClass = function(AjaxObject, Object, Method, Params, OnCompleteMethod)
{
    this.Object = Object;
    this.Method = Method;
    this.Params = Params;
    this.AjaxObj = AjaxObject;
    this.OnCompleteMethod = OnCompleteMethod;
}

AjaxObj.prototype.CrossDomainRequest = function(Object, Method, Params, OnCompleteMethod)
{
    if (this.CrossDomainRequestProxy==null)
        throw "You must set the CrossDomainRequestProxy property before calling this method";
    
    var cdrClass = new CrossDomainRequestClass(this, Object, Method, Params, OnCompleteMethod);
    var idx = _crossDomainRequests.length;
    _crossDomainRequests[_crossDomainRequests.length] = cdrClass;
    var paramsStr = "";
    if (Params!=null && Params.length>0)
    {
        for(i=0;i<Params.length;i++)
        {
            paramsStr+="p0="+Params[i]+"&";
        }
    }    
    
    var head = document.getElementsByTagName("head").item(0);
    var oScript = document.getElementById("oScript");
    if (oScript)
        head.removeChild(oScript);
    oScript = document.createElement("script");
    //document.write(this.CrossDomainRequestProxy+"?object="+Object+"&method="+Method+"&"+paramsStr+"&requestId="+idx);
    oScript.setAttribute("src",this.CrossDomainRequestProxy+"?object="+Object+"&method="+Method+"&"+paramsStr+"&requestId="+idx);
    oScript.setAttribute("id","oScript");   
    head.appendChild(oScript);        
}

function __crossDomainCallbackHandler(responseObject)
{
    obj = _crossDomainRequests[responseObject.requestId];
    
    responseObject.responseXML = __getXMLDocument(responseObject.responseText);  
    if (responseObject.responseText.indexOf("JSODException")>=0)
    {                
        responseObject.exception = __ParseToObject(responseObject.responseXML);;
         
    }
    else
    {
        responseObject.object = __ParseToObject(responseObject.responseXML);    
    }
    obj.OnCompleteMethod(responseObject, obj);
}

function __getXMLDocument(xmlString)
{
    
    if (window.ActiveXObject)
    {
        var doc=new ActiveXObject("Microsoft.XMLDOM");
        doc.async="false";
        doc.loadXML(xmlString);
    }
    // code for Mozilla, Firefox, Opera, etc.
    else
    {
        var parser=new DOMParser();
        var doc=parser.parseFromString(xmlString,"text/xml");
    }
    //reflect(doc);
    return doc;
}


function reflect(obj)
{
    var str = "";
    for(i in obj)
    {
        str += i+" "+obj[i]+"<br/>";
    }
    document.write(str);
}

function JSODException(Message, InnerMessage, StackTrace)
{
    this.message= Message;
    this.innerMessage = InnerMessage;
    this.stackTrace = StackTrace;
}


function __ParseToObject(XmlDocument)
{
    var Node = XmlDocument.firstChild;
    if (null==Node)
        return;
        
    if (XmlDocument.firstChild.nodeName=="xml")
        Node = XmlDocument.childNodes[1];
       
    if (null==Node)
        return;
       
    var str = ""+__GetScriptForNodeRecursive(Node)+ "";
    
   // document.write(str);
    var r = eval("("+str+");");
    return r;
    
}

function __GetScriptForNodeRecursive(Node, openAlready)
{
    if (null==Node)
        throw "Node cannot be null";
    if (Node.nodeName=="xml")
        return;
    if (Node.nodeName=="#text")
        return;
    var ret = "";  
    if (!openAlready) ret +="{";
    ret+=" \""+Node.nodeName+"\" : ";
    
    var attrWritten = false;
    var cnWritten = false;
    var bodyWritten = false;
    if (Node.firstChild && Node.firstChild.nodeName=="#text")
    {
        ret+=" { \"value\" : \""+Node.firstChild.nodeValue.replace(/\r\n|\r|\n/g, ' ')+"\"";
        attrWritten = true;
        bodyWritten = true;
    }
    if (Node.attributes && Node.attributes.length>0)
    {
        if (!attrWritten)
            ret+=" { ";
        else 
            ret+=", ";
        attrWritten = true;
        
        var i = 0;
        for(i=0;i<Node.attributes.length;i++)
        {
            ret+=" \""+Node.attributes[i].nodeName+"\" : \""+Node.attributes[i].nodeValue.replace(/\r\n|\r|\n/g, ' ')+"\"";
            if (i+1<Node.attributes.length)
            {
                ret+=", ";
            }
        }
    }
    if (__NodeHasValidChildren(Node))
    {
        cnWritten = true;
        if (!attrWritten)
            ret+=" { ";
        else
        {
            ret+=", ";
        }
        var x = 0;
        for(x=0;x<Node.childNodes.length;x++)
        {
            cstr = __GetScriptForNodeRecursive(Node.childNodes[x], true);
            if (cstr!=null)
            {
                ret+=cstr;
                if (x+1<Node.childNodes.length)
                {
                    ret+=", ";
                }
            }
            
        }
    }
    if (cnWritten || attrWritten)
        ret+=" } ";
    else if (!bodyWritten)    
    {
        ret+="''";
    }
    if (!openAlready) ret+="}";
    
    return ret;
}

function __NodeHasValidChildren(Node)
{
    var x = 0;
    if (Node.childNodes==null)
        return false;
    for(x=0;x<Node.childNodes.length;x++)
    {
        if (Node.childNodes[x].nodeName!="xml" && Node.childNodes[x].nodeName!="#text")
            return true;
    }
    return false;
    
}

