﻿
//var RequestEvents = {Uninitialized:0, Loading:1, Loaded:2, Interactive:3, Complete:4};
//var RequestStatue = {success :"Success", failure:"Failure"};
//var RequestWebType = {webPage_aspx :"aspx", webService_asmx:"asmx"};
//var RequestHttpMethodType = {http_Get:"GET", http_Post:"POST"};

Function.emptyFunction = Function.emptyMethod = function Function$emptyMethod() {};
Function.createDelegate = function Function$createDelegate(instance, method) 
{
   return function() { return method.apply(instance, arguments);};
}
String.prototype.startsWith = function String$startsWith(prefix)
{    
    return (this.substr(0, prefix.length) === prefix);
}
String.prototype.trim = function String$trim() 
{   
    return this.replace(/^\s+|\s+$/g, '');
}

String.prototype.trimEnd = function String$trimEnd() 
{
    return this.replace(/\s+$/, '');
}

String.prototype.trimStart = function String$trimStart() 
{
   return this.replace(/^\s+/, '');
}
this._this = null;
this.HttpDataRequest = function (url,ReturnMethod,requestId)
{
   try{
    //debugger;   
   //if(!_this)
   _this = new initThis();
   //l_CountAddRequest++;        
    //url = url + "|AddQLgth->"+(_this.requestQueueLength()+1) +"|CountAddRequest->"+l_CountAddRequest;
     
     var request = new _this.createRequestObject(url,ReturnMethod,requestId); 
     _this.getRequestData(request);
     //document.getElementById("lbl_QueueLength").innerHTML  = _this.requestQueueLength();
  }
   catch(Ex)
   {
     alert("HttpDataRequest=="+Ex.message);
   }
}

function XMLHttpRequest$getRequestData(request)
{
   this.addRequest(request);   
   if(this.isExecuting){return;}
   else { if(!this.getRequest()) return; else {this.executeRequest();}; };
}
function initThis()
{  
  this.XMLHttpRequest =null;
  this.getXMLHttpRequest = XMLHttpRequest$getXMLHttpRequest;
  this.getRequestData = XMLHttpRequest$getRequestData;
  this.enumReadyStateEvents = new XMLHttpRequest$getObjectReadyStateEvents();
  this.enumRequestWebType = new XMLHttpRequest$getObjectRequestWebType();
  this.enumRequestStatus = new XMLHttpRequest$getObjectRequestStatus();
  this.requestQueue = new Array();
  this.currentRequest =null;
  this.requestQueueLength = function(){ return this.requestQueue.length;};
  this.addRequest=XMLHttpRequest$addRequest; 
  this.resetCurrentRequest=XMLHttpRequest$resetCurrentRequest;
  this.createRequestObject = XMLHttpRequest$createRequestObject;
  this.getRequest=XMLHttpRequest$getRequest;
  //this.onChange = XMLHttpRequest$onChange;
  this.onChange = Function.createDelegate(this,XMLHttpRequest$onChange);
  this.executeRequest=XMLHttpRequest$executeRequest;   
  this.isExecuting = false;
  this.setRequestTimeOut = XMLHttpRequest$setRequestTimeOut;
  this.clearRequestTimeOut = XMLHttpRequest$clearRequestTimeOut;
  this.onRequestTimeOut = XMLHttpRequest$onRequestTimeOut;
  this.requestTimeOutId= null;
  this.requestTimeOutInterval = 300*1000;
  this.isTimeOut = false;
  this.responseAvailable = false;
  this.getResponseHeader = XMLHttpRequest$getResponseHeader;
  this.getResponseTextData = XMLHttpRequest$getResponseTextData;
   this.getResponseXMLData = XMLHttpRequest$getResponseXMLData;  
  this.get_statusCode =  XMLHttpRequest$get_statusCode;  
  
}

function XMLHttpRequest$createRequestObject(url,ReturnMethod,requestId)
 {
   this.url=url;
   this.method="GET"; 
   this.responseMethod = ReturnMethod;
   this.returnValue = null;
   this.requestId = requestId;
   this.requestWebType=null;
   this.this_document =null;
   this.body =null;
   this.headers =null;
   this.setReturnValue = function(returnValue){this.returnValue = returnValue;};
   this.get_body  = XMLHttpRequest$get_body; 
   this.get_httpVerb =  XMLHttpRequest$get_httpVerb;
   this.set_httpVerb =  XMLHttpRequest$set_httpVerb;
   this.get_headers =  XMLHttpRequest$get_headers;
 }
 
function XMLHttpRequest$addRequest(requestObject)
{
    requestObject.set_httpVerb("");
   this.requestQueue.push(requestObject);

}
function XMLHttpRequest$get_body()
{
    if(!this.this_document) return "";
    else if (!this.this_document.body)return "";
    else if (!this.this_document.body == "{}")return "";
    else return this.this_document.body;     
}
 function XMLHttpRequest$get_httpVerb()
  {  
   if (this.method == null) 
   {
        if (this.this_document == null) 
        {
            return "GET";
        }
        return "POST";
    }
    return this.method;
}
function XMLHttpRequest$set_httpVerb(method)
{  
  if(!method)
  {
    this.method = "GET"
  }
  else
  {  
    this.method = method;
  }
}
 function XMLHttpRequest$get_headers()
{
    
}
function XMLHttpRequest$getObjectReadyStateEvents()
{
     this.Uninitialized=0;this.Loading=1;this.Loaded=2;this.Interactive=3;this.Complete=4;
}
function XMLHttpRequest$getObjectRequestWebType()
{
    this.webPage_aspx ="aspx"; this.webService_asmx="asmx";
}
function XMLHttpRequest$getObjectRequestStatus()
{
  this.success ="1";this.failure="0";
}
function XMLHttpRequest$executeRequest()
{       
        var body = this.currentRequest.get_body();
        var headers = this.currentRequest.get_headers();
        this.XMLHttpRequest = this.getXMLHttpRequest();      
        this.XMLHttpRequest.onreadystatechange = this.onChange;
        var verb = this.currentRequest.get_httpVerb();
        this.XMLHttpRequest.open(verb, this.currentRequest.url,true);     // - Request type may be get or Post of WebPage and Get for WebService         
        
         if (headers) 
         {
            for (var header in headers) {
                var val = headers[header];
                if (typeof(val) !== "function")
                    this.XMLHttpRequest.setRequestHeader(header, val);
            }
        }
        if (verb.toLowerCase() == "post") 
        {
            if ((headers == null) || !headers['Content-Type']) 
            {
               this.XMLHttpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            }
            if (!body) 
            {  
                body = ""; 
            }
        }
        else
        {
           body = null;
        }        
        this.XMLHttpRequest.send(body);
        this.isExecuting = true;
        this.setRequestTimeOut();        
}
function XMLHttpRequest$setRequestTimeOut()
{
    if(this.requestTimeOutId) window.clearTimeout(this.requestTimeOutId);
    //this.requestTimeOutId = window.setTimeout(this.onRequestTimeOut, this.requestTimeOutInterval);
    this.requestTimeOutId = window.setTimeout(Function.createDelegate(this, this.onRequestTimeOut), this.requestTimeOutInterval);
}
function XMLHttpRequest$clearRequestTimeOut()
{ 
    if(this.requestTimeOutId) window.clearTimeout(this.requestTimeOutId);
    this.requestTimeOutId = null;
}
function XMLHttpRequest$onRequestTimeOut()
{   
 //debugger;
 //l_CountTimeOutRequest++;
  //document.getElementById("lbl_QueueLength").innerHTML  = this.requestQueueLength();
  //document.getElementById("ReturnedValues").innerHTML  +=" timeOut= " + l_CountTimeOutRequest +" <br>";
  try
  {
      this.clearRequestTimeOut();
      this.isTimeOut = true;
      if(this.XMLHttpRequest)
        {
            this.XMLHttpRequest.onreadystatechange = Function.emptyMethod;
            this.XMLHttpRequest.abort();
            this.XMLHttpRequest = null;
          //document.getElementById("ReturnedValues").innerHTML  += this.currentRequest.url +" timeOut <br>";

        }
      this.resetCurrentRequest();
      if(!this.getRequest()) return;
      else {this.executeRequest();};
  }
  catch(Ex){}
  alert("WebRequest:Request Time Out.");
  }

function XMLHttpRequest$resetCurrentRequest()
{
   this.isExecuting = false;
   this.currentRequest =null;
   this.isTimeOut =false;
   this.clearRequestTimeOut();
    if(this.XMLHttpRequest)
    {
        this.XMLHttpRequest.onreadystatechange = Function.emptyMethod;
        this.XMLHttpRequest = null;
    }
}
function XMLHttpRequest$getResponseHeader(header)
{
    var result;
    try { result = this.XMLHttpRequest.getresponseHeader(header);} catch (e) {}
    if (!result) result = "";
    return result; 
}
function XMLHttpRequest$getResponseTextData()
{
    var result;
    try { result = this.XMLHttpRequest.responseText;} catch (e) {}
    if (!result) result = "";
    return result; 
}
function XMLHttpRequest$getResponseXMLData()
{   
    var result;
    try { result = this.XMLHttpRequest.responseXML;} catch (e) {}     
    //debugger;
    if (!result || !result.documentElement) 
    {  
         result = this.XMLHttpRequest.responseText;
    }
    else
    {
       if(result.childNodes.length >=2 && result.childNodes[0].nodeName == 'xml')
       {
          result = result.childNodes[1];
       }
       else
       {
          result = result.childNodes[0];
       }       
       if(result.nodeName.toLowerCase() == 'string')
       {
           result = result.text;
       }
    }
    return result;
}
function XMLHttpRequest$getRequest()
{    
    this.resetCurrentRequest();
    if(this.requestQueueLength() >0)
    {
      this.currentRequest = this.requestQueue.shift(); 
      return true;
    }
    else
    { 
      return false;
    }       
}
function XMLHttpRequest$get_statusCode() 
{   
    return this.XMLHttpRequest.status;
}
function XMLHttpRequest$getXMLHttpRequest()
{ 
    var xmlhttp = null;
    if (window.XMLHttpRequest)// code for Mozilla, etc.
    {
        xmlhttp=new XMLHttpRequest();
    }
    else if (window.ActiveXObject)// code for IE
    {
        var progIDs = ["Msxml2.XMLHTTP.7.0", "Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
        for (var i = 0; i < progIDs.length ; i++) {
        try {
	            xmlhttp = new ActiveXObject(progIDs[i]);
	            if (xmlhttp){break;}
	       } catch (Ex){}
        }
   }
   return xmlhttp;
}   
function XMLHttpRequest$onChange()
{  
  var result ="";
 
    
    //if(!this.XMLHttpRequest) return;   
    // move forward only if the transaction has completed
   if(this.isTimeOut == true && !this.XMLHttpRequest)
   {
      return;
   }
   else
   {
     if(this.enumReadyStateEvents.Complete == this.XMLHttpRequest.readyState)
     {
      try
      {
       this.clearRequestTimeOut();
       this.responseAvailable = true;
       var statusCode =  this.get_statusCode();   
       // status of 200 indicates the transaction completed successfully
      //debugger;
        if(statusCode == 200)
        { 
            var contentType =  this.getResponseHeader("Content-Type");                   
            if (contentType.startsWith("text/xml")) 
            {
                  result = this.getResponseXMLData();
            }
            else //text/html
            {
                result = this.getResponseTextData();
            }
         }
         else
         {
           //alert(this.XMLHttpRequest.statusText);
         }
       // result = get_xml(this.XMLHttpRequest.responseText,this.XMLHttpRequest.responseXML);
        //alert(result);
        //l_CountResponseRequest = l_CountResponseRequest+1;
      //result = result + "|ResponseCount->" +l_CountResponseRequest + "|QLength->" +(this.requestQueueLength()+1);
     var currentRequest =  this.currentRequest; 
       currentRequest.setReturnValue(result);
       this.resetCurrentRequest();   
     try{currentRequest.responseMethod(currentRequest.returnValue,currentRequest.requestId);}catch(Ex){}
   }
   catch(Ex)
   {
     //alert("Exception:"+Ex.message);
     alert("WebRequest:Exception "+Ex.message);         
   }
   if(!this.getRequest()) return;
   else {this.executeRequest();};
  }
  }//end else        
}
