﻿function batchAjxRequest( callback, method )
{
	var m_ajx_call     = new Array( );
	var m_timerid      = 0;
	var m_elapsed      = 0;
	var m_fncompletion = ( callback )?callback:null;
	
	var m_method       = (method == undefined)?"GET":method;
	var m_this         = this;
	var m_locked       = false;// start flag: true - on runRequest; false - after last ajx/completion call
	var m_arerr        = null;
	
	this.completionRoutine = function( endcallback ) { m_fncompletion = ( endcallback != undefined )?endcallback:null; }
	this.setMethod  = function( method ) { m_method = ( method == "POST")?"POST":"GET"; }
	this.completed  = function( )
	{   for ( var  i =0; i < m_ajx_call.length; i++ )
	    {   if ( !m_ajx_call[i].getComplete()) return false;
	    }
		m_locked = false;
	    return true;
	}
	this.resetAll   = function( )
	{   
		killTimer(m_timerid);
	    m_ajx_call   = new Array( );
        m_timerid = 0;
		m_locked  = false;
	}
    this.addAjax    = function( ajx  )
    {   m_ajx_call.push( ajx );
    }
// properties = { url      : [domain address], querystr:[query sring], 
//   callback : [particular completion routine],placeholder:[html element],cache:true,
//   arguments: [completion routine arguments], retAsXml:[returnXML: or returnText]}	
    this.addRequest = function( properties )
    {   var ajx = new clsAjxRequest( );
        ajx.setRequestParam( properties );
        m_ajx_call.push( ajx );
    }
    this.registerOnTop = function( ajx )
    {   m_ajx_call.reverse( );
        m_ajx_call.push   ( ajx );
        m_ajx_call.reverse( );
    }
    this.runRequest = function ( )
    {   if ( !m_locked )
        {   m_timerid = setTimerCallback( tmAjxRet );
		    m_arerr   = new Array( );
            setTimer( m_timerid );
			m_locked  = true;
        }
    }

	function tmAjxRet( timerState )
	{   switch( timerState )
		{	case TM_STATE_START: 
		        m_elapsed = 0;
            break;
			case TM_STATE_RUN:
			    if ( m_elapsed == 0 )
			    {   
				    if ( m_method == "GET" )
			             m_ajx_call[0].getAjaxRequest ( );
			        else m_ajx_call[0].postAjaxRequest( );
			    }
				m_elapsed += TIMER_DELAY;
window.status = 'tmAjxRet: '+m_elapsed+"; " + m_ajx_call[0].getComplete();
				
				if ( m_elapsed >= 5000 || m_ajx_call[0].getComplete() == true )
				{   if ( m_ajx_call[0].state().statusText )
				    {    m_arerr.push(m_ajx_call[0].state().statusText);
					}
				    m_ajx_call.splice( 0,1);
					if (m_ajx_call.length == 0 )
					{
				         stopTimer( m_timerid );
					}
				    m_elapsed = 0;
				}
				break;
			case TM_STATE_STOP:
			if ( m_fncompletion ) m_fncompletion(m_arerr);
			m_elapsed      = 0;
			m_locked       = false;
			break;
		}
	}
}

function clsAjxRequest( )
{//Request .readyState codes
    var UNSENT  = 0;
    var OPENED  = 1;
    var HEADERS_RECEIVED = 2;
    var LOADING = 3;
    var DONE    = 4;
// Internal status
    var RQFREE  = 'free';
    var RQHOLD  = 'hold';
    var RQDONE  = 'done';
    var RQERR   = 'error';
	
	var m_basedomain = "http://"+window.location.hostname;
	
    var m_rqParam    = 
	{   url         : '',
		querystr    : '',
		callback    : insertCompletionRoutine,
		arguments   : new Object(),
		retAsXml    : 1,
		placeholder : null,
		cache       : false,
		async       : false
	};
	var m_rqState =
	{   status      : RQFREE,
		statusText  : '',
		ready       : true
	};
	
	this.getAjaxRequest   = getAjaxRequest;
	this.postAjaxRequest  = postAjaxRequest;
	this.postSyncAjaxRq   = postSyncAjaxRq;
	this.getSyncAjaxRq    = getSyncAjaxRq;
	this.createAjaxObj    = createAjaxObj;
	this.setRequestParam  = setRequestParam;
	this.getRequestParam  = getRequestParam;
	this.getComplete      = function( ) { return m_rqState.ready; }

	var m_ajaxobj         = createAjaxObj();
	this.ajx              = function() { return m_ajaxobj; }
	this.state            = function() { return m_rqState; }
	function defaultParam   ( )
	{   m_rqParam  = { url: '',	querystr: '',callback: insertCompletionRoutine, arguments: new Object(), retAsXml:1, placeholder: null,cache: true, async: false };
	};
	function clearState     ( ) { m_rqState  = { status: RQFREE, statusText: '', ready: true }; }

	
	function getRequestParam( ) { return m_rqParam; }
	function setRequestParam( properties  )
	{   defaultParam( );
	    for ( var key in properties )
		{   if ( !(m_rqParam[key] === undefined) )
			     m_rqParam[key] = properties[key];
		}
		return m_rqParam;
	}
	
	function getAjaxRequest( )
	{   
        if ( !m_rqParam ) return;
        if (  m_rqState.status != RQFREE ) return;
        	
	    var querystr = 
	    ( m_rqParam.cache == true )
	      ?(m_rqParam.querystr+"&ajaxcachebust="+new Date().getTime())
	      :m_rqParam.querystr;
	    var url        = (querystr)?m_rqParam.url+"?"+querystr:m_rqParam.url;//;
	      
	    m_ajaxobj    = createAjaxObj(); //recreate ajax object to defeat cache problem in IE
	    if ( m_ajaxobj )
	    {   var thisObj = this;
	        m_rqState.ready  = false;
	        m_rqState.status = RQHOLD;
			
	        try { m_ajaxobj.open('GET', url, true); }
			catch(err)
			{   alert( "getAjaxRequest: " + err);	        
	            m_rqState.ready  = true;
	            m_rqState.status = RQFREE;
			    return;
			}
			
	        m_ajaxobj.onreadystatechange = function( )
	        {  
			    if ( m_ajaxobj.readyState == DONE)
	            {    m_rqState.ready = true;
				    if ( m_ajaxobj.status == 200 || window.location.href.indexOf("http") == -1 )
	                {   if ( m_rqParam.retAsXml)
					         m_rqParam.callback( m_ajaxobj.responseXML, m_rqParam.arguments);
					    else m_rqParam.callback( m_ajaxobj.responseText,m_rqParam.arguments);
	                    m_rqState.status = RQDONE;
	                }
	                else
	                {    m_rqState.status     = RQERR;
	                     m_rqState.statusText = "Error: "+ m_ajaxobj.status;
					     m_rqParam.callback( m_rqState.statusText, m_rqParam.arguments);
	                }
	            }
//	            else { m_rqState.status = 'process: '+m_ajaxobj.readyState; }
               
	        }
	        m_ajaxobj.setRequestHeader("Cache-Control", "no-cache, must-revalidate"); 
	        m_ajaxobj.setRequestHeader("Pragma", "no-cache"); 
	        m_ajaxobj.send( null );
	    }
	}
	
	function postAjaxRequest( )
	{   
        if ( !m_rqParam ) return;
        if (  m_rqState.status != RQFREE ) return;
		
	    var querystr   = m_rqParam.querystr;
	    var url        = m_rqParam.url;

	    m_ajaxobj      = createAjaxObj(); //recreate ajax object to defeat cache problem in IE
	    if ( m_ajaxobj )
	    {   var thisObj     = this;
	        m_rqState.ready  = false;
	        m_rqState.status = RQHOLD;

			try {   m_ajaxobj.open('POST', url, true); }
			catch( err )
			{   alert( "postAjaxRequest: " + err);	        
	            m_rqState.ready  = true;
	            m_rqState.status = RQFREE;
			    return;
			}

            m_ajaxobj.onreadystatechange = function( )
	        {  
			    if ( m_ajaxobj.readyState == DONE)
	            {   m_rqState.ready = true;
				    if ( m_ajaxobj.status == 200 || window.location.href.indexOf("http") == -1 )
	                {   if (  m_rqParam.retAsXml)
					          m_rqParam.callback( m_ajaxobj.responseXML, m_rqParam.arguments);
					     else m_rqParam.callback( m_ajaxobj.responseText,m_rqParam.arguments);
	                     m_rqState.status = RQDONE;
	                }
	                else
	                {    m_rqState.status     = RQERR;
	                     m_rqState.statusText = "Error: "+ m_ajaxobj.status + "; " + m_ajaxobj.statusText;
                         m_rqParam.callback( m_rqState.statusText, m_rqParam.arguments);
	                }
				   
	            }
//	            else { m_rqState.status = 'process: '+m_ajaxobj.readyState; }
				
	        }

	        m_ajaxobj.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
//	        m_ajaxobj.setRequestHeader("Content-length", querystr.length*2);
	        m_ajaxobj.setRequestHeader("Connection", "close");
	        m_ajaxobj.send( querystr );
	    }
	}
	
	function postSyncAjaxRq( url, querystr )
	{   
        ajaxobj = createAjaxObj();	
	    if ( ajaxobj )
	    {   m_rqState.ready = false;
	        try  { ajaxobj.open('POST', url, false ); }
			catch( err )
			{   alert( "postSyncAjaxRq: " + err);	        
	            m_rqState.ready = true;
			    return;
			}
	        ajaxobj.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
	        ajaxobj.send( querystr );
	        m_rqState.ready = true; 
	        return (m_rqParam.retAsXml)?ajaxobj.responseXML:ajaxobj.responseText;
	    }
	}
	function getSyncAjaxRq( url, querystr )
	{   url     = (querystr)?(url+"?"+querystr):url;
        ajaxobj = createAjaxObj();	
	    if ( ajaxobj )
	    {   m_rqState.ready = false;
	        try  { ajaxobj.open('GET', url, false ); }
			catch( err )
			{   alert( "Err: getSyncAjaxRq: " + err);	        
	            m_rqState.ready = true;
			    return;
			}
	        ajaxobj.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
	        ajaxobj.send( null );
	        m_rqState.ready = true; 
	        return (m_rqParam.retAsXml)?ajaxobj.responseXML:ajaxobj.responseText;
	    }
	}
	
    function createAjaxObj( )//as Sajax
    {   var httprequest;
        var msxmlhttp = new Array
        (   'Msxml2.XMLHTTP.5.0',
            'Msxml2.XMLHTTP.4.0',
            'Msxml2.XMLHTTP.3.0',
            'Msxml2.XMLHTTP',
            'Microsoft.XMLHTTP'
        );
        clearState( );			  
        for ( var i = 0; i < msxmlhttp.length; i++) 
        {   try 
            {   httprequest = new ActiveXObject(msxmlhttp[i]); 
                if ( httprequest ) break;
            }
            catch (e)
            {   httprequest = null;
            }
        }
        if ( !httprequest && typeof XMLHttpRequest != "undefined")
        {   httprequest = new XMLHttpRequest();
            if ( httprequest )
            {   if ( httprequest.overrideMimeType )
                     httprequest.overrideMimeType('text/xml');
            }
        }
        if ( !httprequest )
              alert("Could not create connection object.");
        return httprequest;
    }
    function insertCompletionRoutine( ajx, response )
	{   var rqparam = ajx.getRequestParam( );
	    if ( rqparam && rqparam.placeholder )
	    {   var elm = getElement( rqparam.placeholder );
		    try {
	        if ( elm ) elm.innerHTML = response;
			}
			catch(err){}
	    }
	}
	function getElement     ( id )
	{	if ( typeof id != 'string') return id;
	    if ( document.getElementById )
	         return document.getElementById( id );
		if ( document.all!=null )
      		 return document.all   [id];
    	else return document.layers[id];
	}
	
};



