﻿function AjaxRequest()
{}

AjaxRequest.m_MaxPool = 50;
AjaxRequest.m_Pools = [];

AjaxRequest.___GetPooledXmlHttp = function()
{
    var xmlhttp = null;
    var pools = this.m_Pools;
    for( var ii=0; ii<pools.length; ++ii )
    {
        var pool = pools[ii];
        if( pool.readyState == 4 || pool.readyState == 0 )
        {
            xmlhttp = pool;
            break;
        }
    }
    
    if( xmlhttp ) return xmlhttp;
    
    return this.___CreateXmlHttp();
};

AjaxRequest.___CreateXmlHttp = function()
{
    if( this.m_Pools.length < this.m_MaxPool )
    {
        var xmlhttp = null;
        try 
        { 
            xmlhttp = new ActiveXObject('Microsoft.XMLHTTP'); 
        } 
        catch(e) 
        { 
            try 
            { 
                xmlhttp = new ActiveXObject('MSXML2.XMLHTTP'); 
            } 
            catch(ee) {} 
        } 
       
        if( !xmlhttp )
        {
            if( typeof(XMLHttpRequest) != 'undefined' )
            {
                try
                {
                    xmlhttp = new XMLHttpRequest();               
                }   
                catch(e) {} 
            }  
           
            if( !xmlhttp &&  window.createRequest )
            {
                try
                {  
                    xmlhttp = window.createRequest();  
                }
                catch(e) {};  
            }   
        }
        
        if ( xmlhttp ) 
        { 
            this.m_Pools.push(xmlhttp); 
        } 
        return xmlhttp; 
    }
};

AjaxRequest.___GetXmlDom = function()
{
    var xmlDoc = null;
    try
    {
        xmlDoc = new ActiveXObject("msxml2.xmldom" );
    }
    catch(e)
    {   
        try
        {
            xmlDoc = new ActiveXObject("Microsoft.xmldom");
        }
        catch(e)
        {
            try
            {
                xmlDoc = new ActiveXObject("MSXML.xmldom" );
            }
            catch(e)
            {
               try
               {
                    xmlDoc = new ActiveXObject("MSXML3.xmldom" );
               }
               catch(e)
               {
                    
               }
            }  
        }  
    }
    
    return xmlDoc;
};

AjaxRequest.___RequestDataToCallback = function( url, callback, method, data )
{
    var xmlhttp = this.___GetPooledXmlHttp();
    if( !xmlhttp ) return null;
    
    xmlhttp.open(method, url, true);
    
    if ( method == 'POST' )
    {
        xmlhttp.setRequestHeader("content-length",data.length); 
        xmlhttp.setRequestHeader("content-type","application/x-www-form-urlencoded");
    }
    
    xmlhttp.onreadystatechange = function()
    {
        if( xmlhttp.readyState == 4 || xmlhttp.readyState == 'complete' )
        {
            callback(xmlhttp.responseText);
        }
    };
    
    xmlhttp.send(data);
};

AjaxRequest.___RequestDataOnly = function( url, method, data )
{
	var xmlhttp = this.___GetPooledXmlHttp();
    if ( !xmlhttp ) return null;

    xmlhttp.open(method, url, false);

    if ( method == 'POST' )
    {
        xmlhttp.setRequestHeader("content-length",data.length); 
        xmlhttp.setRequestHeader("content-type","application/x-www-form-urlencoded")
    }
    
    try
    {
        xmlhttp.send(data);
    }
    catch(e)
    {}

    if ( xmlhttp.status == 200 )
    {
        return xmlhttp.responseText;
    }
    
    return '';
};

AjaxRequest.CallbackByGet = function( url, callback )
{
    return this.___RequestDataToCallback(url, callback, 'GET', null);
};

AjaxRequest.CallbackByPost = function( url, callback, data )
{
    return this.___RequestDataToCallback(url, callback, 'POST', data);
};

AjaxRequest.RequestDataByGet = function( url )
{
    return this.___RequestDataOnly(url, 'GET', null);
};

AjaxRequest.RequestDataByPost = function( url, data )
{
    return this.___RequestDataOnly(url, 'POST', data);
};

AjaxRequest.AbortAll = function()
{
    var tmpCreateMethod = this.___CreateXmlHttp;
    this.___CreateXmlHttp = function()
    { return null; };
    
    for( var i=0; i<this.m_Pools.length; ++i )
    {
        this.m_Pools[i].abort();
    }
    
    this.___CreateXmlHttp = tmpCreateMethod;
};