// xh.js
// version 0.0.5
// author:      Michel Carroll
// modified:    2005-11-16


var trkURL=""
var _err = 0,_errMax = 100
var loginStr="<!--login-->"

var soap12Env=["<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\"><soap12:Body>",,"</soap12:Body></soap12:Envelope>"]

var _XhReq = [] // array to keep all XhReq (XmlHttp) requests
var _XR = []// array to keep all XmlRender objects
var _XhrDep=[]// array to keep all XhrDepend objects

_XR.setReady = function(aArgs){
	ref=aArgs[0]
	doc=aArgs[1]
	if(doc!=null){
	    _XR[ref][doc]=true
	    _XR[ref][doc+"Doc"]=_XhReq[ref+"_"+doc.substring(1,2)].xml
	}
	if(_XR[ref].xml&&_XR[ref].xsl){
		if(_XR[ref].htmlTargetNode!=null){
			//transAndAppend(_XR[ref].htmlTargetNode,_XR[ref].replace,_XR[ref].xslParams,_XhReq[ref+"_m"].xml,_XhReq[ref+"_s"].xml)
			regCall("open","_R."+frameRef+"."+ref)
			transAndAppend(_XR[ref].htmlTargetNode,_XR[ref].replace,_XR[ref].xslParams,_XR[ref].xmlDoc,_XR[ref].xslDoc,_XR[ref].debug)
			regCall("close","_R."+frameRef+"."+ref)
		}
	    acts=_XR[ref].actions
	    for(var i=0;i<acts.length;i++){
	        acts[i].run()
	    }
	}
}

var reBadXh = /^<(!--login-->|html|!doctype html)/i

function XhReq(name,url,payload,asynch,whendone,args){
	_XhReq[name]=this
	this.error=false
	try{
	    this.XmlHttp = new XMLHttpRequest();
		this.XmlHttp.overrideMimeType("text/xml");
	}catch(e){
		try{
		    this.XmlHttp = new ActiveXObject("Msxml2.XMLHTTP");//("Msxml2.XMLHTTP.3.0")
		    var _IE =true
	    }catch(e){
			    this.error=true;
	    }
	}
    
    this.timeout = 600000
	this.onready = whendone
	this.readyargs = (args==""?[]:typeof(args)=="string"?[args]:args)
	this.asynch = asynch
	this.xml = null
	this.xmlText = null
	this.url = url

	this.text = ""
	this.ready=false
	var _x = this
	this.payload=(payload==""?null:payload)
	this.soap=(this.payload==null?false:this.payload.substring(0,1)=="<"?true:false)
	setHeaders(this)
	if(asynch){
	    this.XmlHttp.onreadystatechange = function(){
	                if (_x.XmlHttp.readyState == 4) {
	                    regCall("close",frameRef+"."+name)
    	                if (_x.XmlHttp.status == 200) {
				            try{
				                //filter out erroneous content
				                if(reBadXh.test(_x.XmlHttp.responseText)){
                                    if(_x.XmlHttp.responseText.substring(0,12)==loginStr){
                                        top.location.replace(_appRoot)
                                        return false
                                    }
                                    reportError(_x.XmlHttp.status,_x.XmlHttp.statusText,_x.XmlHttp.responseText,_x.url,_x.payload,_x.name)
				                }
				                if(_x.soap){
				                    if(_IE){
                                        xDoc = new ActiveXObject("MSXML2.DOMDocument")//("MSXML2.DOMDocument.3.0")
                                        xDoc.loadXML(_x.XmlHttp.responseText)
                                        _x.xml = new XmlDoc(xDoc.lastChild.lastChild.lastChild.lastChild.lastChild)
                                    }else{
				                        _x.xml = new XmlDoc(_x.XmlHttp.responseXML.lastChild.lastChild.lastChild.lastChild.lastChild)
                                    }
				                }else{
				                    _x.xml = _x.XmlHttp.responseXML
				                }
				                _x.text = _x.XmlHttp.responseText
                                if(document.implementation && document.implementation.createDocument){
                                    var serializer = new XMLSerializer()
                                    // this line throws an exception sometimes
                                    //Error: [Exception... "Component returned failure code: 0x80004003 (NS_ERROR_INVALID_POINTER) [nsIDOMSerializer.serializeToString]"  nsresult: "0x80004003 (NS_ERROR_INVALID_POINTER)"  location: "JS frame :: [url] :: anonymous :: line 80"  data: no]
                                    // trying out a declaration ("var") and disposal (setting to null)
                                    _x.xmlText = serializer.serializeToString(_x.xml)
                                    serializer = null
                                }else{
                                    _x.xmlText = _x.xml.xml
                                }
                                _x.ready=true
    				            
				                if(_x.onready.indexOf("=")!=-1){
				            	    eval(_x.onready)
				                }else{
				            	    eval(_x.onready+"("+_x.readyargs.toSource()+",_x)")
				                }
				            }catch(e){
				            }
                        } else {
                            _x.error=true 
                        }
                    }

	            }
		regCall("open",frameRef+"."+name)
		this.XmlHttp.send(_x.payload);
	}else{
  		regCall("open",frameRef+"."+name)
        this.XmlHttp.send(this.payload);
  		regCall("close",frameRef+"."+name)
        
        this.xml = this.XmlHttp.responseXML
        this.text = this.XmlHttp.responseText
	}
}

function setHeaders(xhReq){
	var _method=(xhReq.payload==null?"GET":"POST")
    if(xhReq.soap){
	    xhReq.payload=xhReq.payload.replace(/ xmlns=\"\"/ig,"")
	    xhReq.payload=xhReq.payload.replace(/(\>[ ]*\<[^/> ]+)([ /\>])/i,"$1 xmlns=\"\"$2")
	    var aUrl = xhReq.url.split("/")
        strPath= "/" + window.location.host + "/" + aUrl[0]
	    var webMethod = aUrl.pop()
	    xhReq.url = aUrl.join("/")
        path=xhReq.url
        xhReq.XmlHttp.open(_method, xhReq.url, xhReq.asynch);
	    xhReq.payload=soapPayload(webMethod,xhReq.payload)
	    xhReq.XmlHttp.setRequestHeader("Man", "POST " + path + " HTTP/1.1")
        xhReq.XmlHttp.setRequestHeader("Host", location.hostname.split(":")[0])
        xhReq.XmlHttp.setRequestHeader("Content-Type", "application/soap+xml; charset=utf-8")
        xhReq.XmlHttp.setRequestHeader("Content-Length",xhReq.payload.length)
    }else if(xhReq.payload!=null){
	    xhReq.XmlHttp.open(_method, xhReq.url, xhReq.asynch);
	    xhReq.XmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	}else{
	    xhReq.XmlHttp.open(_method, xhReq.url, xhReq.asynch);
	}
}

function regCall(dir,ref){
		if(App!=null){
		    App.regCall(dir,ref)
		}
    
}

function XmlRender(name){
	_XR[name]=this
	var _x=this
    this.name=name
 	this.xmlUrl=null
	this.xmlPayload=null
	this.xslUrl=null
	this.xslParams=[]
	this.htmlTargetNode=null
	this.replace=true
	// private
	this.xml=false
	this.xsl=false
	this.xmlReq=null
	this.xslReq=null
	this.xmlDoc=null
	this.xslDoc=null
	this.assignDoc=function(type,doc){
	    _x[type+"Doc"]=doc
	    _x[type+"Url"]=""
	    _x[type]=true
	}
	
	this.actions=[]
	this.actions.add=function(fn,args){
	    _x.actions[_x.actions.length]=new Action(fn,args)
	}
	this.debug=false
	this.run = function(){
        var _x=_XR[name]
	    //ensure all parameters have been supplied
	    if(_x.xmlUrl==null||_x.xslUrl==null)return false
	    if(_x.xmlDoc==null)_x.xmlReq = new XhReq(_x.name+"_m",_x.xmlUrl,_x.xmlPayload,true,"_XR.setReady",[name,"xml"])
	    if(_x.xslDoc==null)_x.xslReq = new XhReq(_x.name+"_s",_x.xslUrl,"",true,"_XR.setReady",[name,"xsl"])
	}
	this.render=function(){
	    _XR.setReady([_x.name])
	}
}

function XhrDepend(name){
    _x=this
    _XhrDep[name]=this
    this.name=name
    this.length=0
    this.calls=[]
    this.calls.add=function(name,url,payload){
        idx=_x.calls.length
        _x.calls[name]= new _XhrDepCall(name)
        _x.calls[name].payload=payload
        _x.calls[name].url=url
    }
    this.actions=[]
    this.actions.add=function(fn,args){
        _x.actions[_x.actions.length]=new Action(fn,args)
    }
    this.ready=function(name){                  
        name=name[0]
        //rdy=false                            
        rdy=_x.calls[name].ready=true                
        for(o in _x.calls){
            if(o!="toSource" && o!="add")
                rdy = rdy && _x.calls[o].ready      
        }                                   
        if(rdy){                            
            for(o in _x.calls){
                if(o!="toSource" && o!="add"){
                    _x.calls[o].ready=false
                    _x.calls[o].status=_XhReq[_x.name+"_"+o].XmlHttp.status
                    _x.calls[o].xml=_XhReq[_x.name+"_"+o].xml
                    delete(_XhReq[_x.name+"_"+o])
                }                               
            }
            _x.requests=null
            _x.close()                      
        }                     
    }
    this.run=function(){
        for(o in _x.calls){
            if(o!="toSource" && o!="add")
            _x.requests[o]= new XhReq(_x.name+"_"+o,_x.calls[o].url,_x.calls[o].payload,true,"_XhrDep['"+_x.name+"'].ready",[o])
        }
    }
    this.close=function(){
        for(var i=0;i<_x.actions.length;i++){
            _x.actions[i].run()
        }
    }
    this.requests=[]
}

function _XhrDepCall(name){
    this.name=name
    this.url=""
    this.payload=""
    this.ready=false
    this.xml=null
    this.status=0
}
    
function soapPayload(method,payload){
    //prfx=(arguments.length>2?arguments[2]:"z")
    //pyld=[soap12Env[0],"<"+prfx+":"+method+" xmlns"+":"+prfx+"=\""+wsNs+"\">"+payload+"</"+prfx+":"+method+">",soap12Env[2]]
    pyld=[soap12Env[0],"<"+method+" xmlns=\""+wsNs+"\">"+payload+"</"+method+">",soap12Env[2]]
    return pyld.join("")
}

function reportError(stNo,stTxt,errTxt,url,payload,xhName){
    var _payload=""
    if(++_err >=_errMax){return false}
    stNo=(stNo==null||stNo==""?0:stNo)
    _payload+="stNo="+stNo
    _payload+="&stTxt="+stTxt
    _payload+="&errTxt="+escape(errTxt)
    _payload+="&url="+escape(url)
    _payload+="&payload="+escape(payload)
    _payload+="&pageUrl="+escape(pageUrl)
    _payload+="&pageErrors="+ _err
    e = new XhReq("err"+_err,trkURL,_payload,true,"","")
}

