// JavaScript Document
// class batchAjxRequest and AjxRequest
// code by Azer Manafov (azerman[at]hotmail[dot]com)

function batchAjxRequest( callback, method )
{
	var m_ajx_call     = new Array( );
	var m_index        = 0;
	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
	
	this.completionRoutine = function( endcallback ) { m_fncompletion = ( endcallback != undefined )?endcallback:null; }
	this.setMethod  = function( method ) { m_method = ( method == "POST")?"POST":"GET"; }
	this.completed  = function( )
	{   if ( m_locked ) return false;
		for ( var  i =0; i < m_ajx_call.length; i++ )
	    {   if ( !m_ajx_call[i].getComplete()) return false;
	    }
		m_locked = 0;
	    return true;
	}
	this.resetAll   = function( )
	{   if ( isTimer(m_timerid)) killTimer(m_timerid);
	    m_ajx_call   = new Array( );
	    m_this.completionRoutine( );
	}
    this.addAjax    = function( ajx  )
    {   m_ajx_call.push( ajx );
    }
    this.addRequest = function( url, parameters, target, cache  )
    {   var ajx = new clsAjxRequest( );
        ajx.setRequestParam( url, parameters, target, cache  );
        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 );
            setTimer( m_timerid );
        }
        m_locked = true;
    }

	function tmAjxRet( timerState )
	{   switch( timerState )
		{	case TM_STATE_START: m_elapsed = 0; m_index = 0; break;
			case TM_STATE_RUN:
			    if ( m_elapsed == 0 )
			    {   if ( m_method == "GET" )
			             m_ajx_call[m_index].getAjaxRequest ( );
			        else m_ajx_call[m_index].postAjaxRequest( );
			    }
				m_elapsed += TIMER_DELAY;
				if ( m_elapsed >= 10000 || m_ajx_call[m_index].getComplete() == true )
				{   
					m_ajx_call.splice( m_index,1);
					if ( m_index == m_ajx_call.length )
				    {    
						
				    	stopTimer( m_timerid );
				    }
				    m_elapsed = 0;
				}
				break;
			case TM_STATE_STOP:
			if ( m_fncompletion ) m_fncompletion( );
			m_fncompletion = null;
			m_elapsed      = m_timerid = m_index = 0;
			m_locked       = false;
			break;
		}
	}
}

function clsAjxRequest( )
{
	var m_basedomain      = "http://"+window.location.hostname;
	var m_rqParam         = null;
	var m_rqComplete      = true;
	
	this.getAjaxRequest   = getAjaxRequest;
	this.postAjaxRequest  = postAjaxRequest;
	this.getSyncAjaxRq    = getSyncAjaxRq;
	this.postSyncAjaxRq   = postSyncAjaxRq;
	this.cache            = function( enable )
	{   if ( !m_rqParam ) return;
	    m_rqParam.cache = (enable==true)?true:false; 
	}
	this.createAjaxObj    = createAjaxObj;
	this.setRequestParam  = setRequestParam;
	this.getRequestParam  = getRequestParam;
	this.getComplete      = function( ) { return m_rqComplete; }

	var m_ajaxobj         = createAjaxObj();
	this.ajx              = function() { return m_ajaxobj; }
	function getRequestParam( ) { return m_rqParam; }
	function setRequestParam( url, parameters, target, cache  )
	{   
	    var cache              = ( cache == 'undefined' )?true:false;
        m_rqParam              = new Object( );		
		m_rqParam.url          = url;
		m_rqParam.parameters   = parameters;
		m_rqParam.target       = ( typeof target == 'string')?insertCompletionRoutine:target;
		m_rqParam.elementId    = ( typeof target == 'string')?target:null;
		m_rqParam.filetype     = "txt";
		m_rqParam.cache        = cache;
		m_rqParam.status       = 'none';
		m_rqParam.nosync       = true;
		
		return m_rqParam;
	}
	
	function getAjaxRequest( )
	{   
        if ( !m_rqParam ) return;
        if (  m_rqParam.status != 'none' ) return;
        	
	    m_ajaxobj = createAjaxObj(); //recreate ajax object to defeat cache problem in IE
	    var parameters = 
	    ( m_rqParam.cache == true )
	      ?(m_rqParam.parameters+"&ajaxcachebust="+new Date().getTime())
	      :m_rqParam.parameters;
	      
	    var url        = m_rqParam.url;
	      
	    if ( m_ajaxobj )
	    {   var thisObj = this;
	        m_ajaxobj.onreadystatechange = function( )
	        {   if ( m_ajaxobj.readyState == 4)
	            {   if ( m_ajaxobj.status == 200 || window.location.href.indexOf("http") == -1 )
	                {    m_rqParam.target( thisObj, m_ajaxobj.responseText );
	                     m_rqParam.status = 'ok';
	                }
	                else
	                {    m_rqParam.target( thisObj, "Error: Status "+m_ajaxobj.status);
	                     m_rqParam.status = "Error: "+m_ajaxobj.status;
	                }
	                m_rqComplete = true;
	            }
	            else
	            {    m_rqParam.status = 'process: '+m_ajaxobj.readyState;
	            }
	        }
	        m_rqComplete     = false;
	        m_rqParam.status = 'start';
	        try { m_ajaxobj.open('GET', url+"?"+parameters, true); }
			catch(err)
			{   alert( "getAjaxRequest: " + err);	        
	            m_rqComplete     = true;
	            m_rqParam.status = 'none';
			    return;
			}
	        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;
	    var parameters = m_rqParam.parameters;
	    m_ajaxobj      = createAjaxObj(); //recreate ajax object to defeat cache problem in IE
	    var url        = m_rqParam.url;
	    if ( m_ajaxobj )
	    {   var thisObj = this;
	        m_rqComplete     = false;
	        m_rqParam.status = 'start';
	        
			try
			{   m_ajaxobj.open('POST', url, true);
			}
			catch( err )
			{   alert( "postAjaxRequest: " + err);	        
	            m_rqComplete     = true;
	            m_rqParam.status = 'none';
			    return;
			}
	        m_ajaxobj.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
//	        m_ajaxobj.setRequestHeader("Content-length", parameters.length*2);
	        m_ajaxobj.setRequestHeader("Connection", "close");
	        m_ajaxobj.onreadystatechange = function( )
	        {   if ( m_ajaxobj.readyState == 4)
	            {   if ( m_ajaxobj.status == 200 || window.location.href.indexOf("http") == -1 )
	                {    m_rqParam.target( thisObj, m_ajaxobj.responseText );
	                     m_rqParam.status = 'ok';
	                }
	                else
	                {    m_rqParam.target( thisObj, "Error: Status "+m_ajaxobj.status);
	                     m_rqParam.status = "Error: "+m_ajaxobj.status;
	                }
	                m_rqComplete = true;
	            }
	            else
	            {    m_rqParam.status = 'process: '+m_ajaxobj.readyState;
	            }
	        }
	        m_ajaxobj.send( parameters );
	    }
	}
	
	function postSyncAjaxRq( url, parameters )
	{   
        ajaxobj = createAjaxObj();	
	    if ( ajaxobj )
	    {   m_rqComplete = false;
	        try  { ajaxobj.open('POST', url, false ); }
			catch( err )
			{   alert( "postSyncAjaxRq: " + err);	        
	            m_rqComplete     = true;
			    return;
			}
	        ajaxobj.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
	        ajaxobj.send( parameters );
	        var r = ajaxobj.responseXML;
	        m_rqComplete = true; 
	        return r;
	    }
	}
	function getSyncAjaxRq( url, parameters )
	{   
        ajaxobj = createAjaxObj();	
	    if ( ajaxobj )
	    {   m_rqComplete = false;
	        try  { ajaxobj.open('GET', url, false ); }
			catch( err )
			{   alert( "getSyncAjaxRq: " + err);	        
	            m_rqComplete     = true;
			    return;
			}
	        ajaxobj.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
	        ajaxobj.send( parameters );
	        var r = ajaxobj.responseXML;
	        m_rqComplete = true; 
	        return r;
	    }
	}
	
    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'
        );
        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")
        {  
/*
            try { 
			netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); 
			netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
			} 
			catch ( e ) { alert("Permission UniversalBrowserRead denied."+e); }
*/
		    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.elementId )
	    {   var elm = getElement( rqparam.elementId );
		    try {
	        if ( elm ) elm.innerHTML = response;
			}
			catch(err){}
	    }
	}
    function getElement( id )
	{	if ( document.getElementById )
	         return document.getElementById( id );
		if ( document.all!=null )
      		 return document.all   [id];
    	else return document.layers[id];
	}
    
}


