﻿function trim(str){
   return str.replace(/^\s+|\s+$/g,"");
}
var Params = function(){
    this.parameters = new Array();        
    return this;
}
Params.prototype = {
    Add: function(name,value){
        var itmindex = this.GetparamId(name);
        if(itmindex!=-1){
            this.parameters[itmindex] = {name: name, value: value};
        }else{
            this.parameters[this.Count()] = {name: name, value: value};
        }        
    },
    Delete: function(name){
        var itmindex = this.GetparamId(name);
        if(itmindex!=-1){
            this.parameters.splice(itmindex,1);
        }
    },
    GetContentLength: function(){
        return this.GetParameters().length;
    },
    GetParameters: function(){
        var arr = new Array();
        for(j=0;j<this.Count();j++){
            var currparam = this.parameters[j];
            arr[arr.length] = currparam.name + "=" + currparam.value;
        }
        return arr.join("&");
    },
    Count: function(){
        return this.parameters.length;
    },    
    GetparamId: function(name){
        name = trim(name.toUpperCase());
        for(i=0;i<this.Count();i++){
            var currname = trim(this.parameters[i].name.toUpperCase());
            if(name==currname){
                return i;
            }
        }
        return -1;
    }
}

var AJAXClass = function(){    
    this.haveError = false;
    this.lastError = "";    
    return this;
}
AJAXClass.prototype = {
    url: new String(""),    
    method: new String("post"),
    expireEachRequest: new Boolean(true),
    request: new Object(null),
    parameters: new Params(),
    onProgress: function(){},
    onError: function(){},
    onBeginRequest: function(){},
    onComplete: function(){},
    onStatusOK: function(){},
    setRequest: function(sync){        
        if(this.haveError==false){
            if(!sync){
                sync = false;
            }
            if(trim(this.url)==""){
                this.lastError = "URL for request must be declared before calling setRequest().";
                window.defaultStatus = this.lastError;
                if(this.onError!=null){
                    this.onError(this.lastError);
                }
                return false;
            }
            if(this.expireEachRequest==true){
                var RanNum = Math.random();
                var UrlSplit = new Array();
                UrlSplit = this.url.split("?");
                if(UrlSplit.length>1){this.url = this.url + "&Rnum=" + RanNum;}else{this.url = this.url + "?Rnum=" + RanNum;}
            }
            this.request = this.XmlRequest();
            if(this.request){                
                var parreq = new Object();
                parreq.progress = this.onProgress;
                parreq.request = this.request;
                parreq.endRequest = this.onComplete;
                parreq.onErr = this.onError;
                parreq.fnOK = this.onStatusOK;
                this.request.onreadystatechange = function(){
                    var par = parreq;
                    par.progress(par.request);
                    if(par.request.readyState==4){
                        if(par.endRequest!=null){
                            par.endRequest(par.request);
                        }
                        if(par.request.status!=200){                            
                            if(par.onErr!=null){
                                par.onErr(par.request.statusText);
                            }
                        }else{
                            if(par.fnOK!=null){
                                par.fnOK(par.request);                                
                            }
                        }
                    }               
                }
                if(this.onBeginRequest!=null){
                    this.onBeginRequest();
                }
                this.request.open(this.method,this.url,!sync);
                this.request.setRequestHeader('Content-Length',this.parameters.GetContentLength());
                this.request.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
                this.request.send(this.parameters.GetParameters());
            }else{
                this.lastError = "ERROR: AJAX is not supported in this system.";
                window.defaultStatus = this.lastError;
                if(this.onError!=null){
                    this.onError(this.lastError);
                }                
                return false;
            }
        }
    },
    cancelRequest: function(){
        this.request.abort();
        this.request = null;
    },
    XmlRequest: function(){
        var objXmlReq;
	    try{objXmlReq = new ActiveXObject("Msxml2.XMLHTTP");}catch(e){try{objXmlReq = new ActiveXObject("Microsoft.XMLHTTP");}catch(oc){objXmlReq = null;}}
	    if(!objXmlReq && typeof XMLHttpRequest != "undefined"){objXmlReq = new XMLHttpRequest();}	    
	    return objXmlReq;
    }
}

var DataSet = function(ResponseXML){    
    this.tables = new Array();
    for(tbl=0;tbl<ResponseXML.childNodes[ResponseXML.childNodes.length-1].childNodes.length;tbl++){
        var dtable =  new DataTable(ResponseXML.childNodes[ResponseXML.childNodes.length-1].childNodes[tbl]);
        this.tables[this.tables.length] = dtable;
    }
    return this;
}

var DataTable = function(ParentNode){
    this.name = ParentNode.nodeName;
    this.rows = new Array();
    for(row=0;row<ParentNode.childNodes.length;row++){
        this.rows[this.rows.length] = new Row(ParentNode.childNodes[row]);
    }
    return this;
}

var Row = function(ParentNode){
    this.columns = new Array();
    for(col=0;col<ParentNode.childNodes.length;col++){
        this.columns[this.columns.length] = new Column(ParentNode.childNodes[col]);
    }
    return this;
}

var Column = function(ParentNode){
    this.name = ParentNode.nodeName;
    if(ParentNode.childNodes.length>0){
        this.value = ParentNode.childNodes[0].nodeValue;
    }else{
        this.value = "";
    }
    return this;
}
