//Original code taken from here: http://dsgdev.wordpress.com/2006/10/28/building-a-javascript-http-request-queue/
//Modifed to add StatusChange and only allow 1 last request to run.  All other callbacks and requests are ignored.

// TURN ON DEBUG WINDOW FEEDBACK
// I WILL WANT TO DISABLE THIS IN THE LIVE VERSION…
var httpTesting = false;
// SET MY REQUEST OBJECT
var http = createRequestObject();
// VARIABLE TO TRACK IF WE ARE CURRENTLY IN A CALL
var inCall = false;
// QUEUE FOR CALLS
var callToArray = new Array();
var failureArray = new Array();
var returnToArray = new Array();
var IsPostArray = new Array();
var PostDataArray = new Array();
var retryArray = new Array();

var returnToCallBackFunction = null;

var _ReturnUrlOverRide = null;
var _url = null;
var _callback = null;
var _callbackFailure = null;
var _bIsPost = null;
var _PostData = null;
var _bDoRetry = null;
var _bRetryRequest = false;
var _NumOfRetrys = 0;
var bSecondaryQuestionOpen = false;
//var queueWatcher = setInterval(callQueue, 100);

function StatusChange()
{
	try
	{	 	  
		if(http.readyState == 4)
		{
		    var status = 0;
		    try
		    {
		        status = http.status;
		    }
		    catch (err)
		    {
		        status = -1;
		    }
		    
			if(status == 200)
			{
				inCall = false;
				_bRetryRequest = false;
				
				eval(returnToCallBackFunction + "();");
				/*if(returnToArray.length == 0)
				{						
					eval(returnToCallBackFunction + "();");
				}*/					
			}
			else if (status == 499)
			{
			    inCall = false;
			    _bRetryRequest = false;
			
			    var params = 'cburl=' + _callback + '||' + _callbackFailure + '||' + _bIsPost + '||' + _PostData + '||' + _bDoRetry + '||' + unescape(_url);
			    window.open ('/members/boards/ajaxredirect.htm?' + params   ,"VIN Login");			 
				
			    return; 
			    	
			}
			else if(status == 500)
			{
				_bRetryRequest = false;
				inCall = false;
				alert('Status: 500 - Your request has timed out. Please contact the system admin.');
			}
			else if(status == 401)
			{
				_bRetryRequest = false;
				inCall = false;
				return;
			}			
			else
			{
				inCall = false;
								
				
				if(_bRetryRequest == false && _bDoRetry)
				{
					_bRetryRequest = true;						
					sendCall(_url, _callback, _callbackFailure, _bIsPost, _PostData, _bDoRetry);					
				}
				else
				{
					_bRetryRequest = false;					
					alert('Error: the server is not responding.');
				}				
			}
		}
		
		callQueue();
		
	}
	catch(e)
	{
		if(_NumOfRetrys <= 5 && _bDoRetry) {
			//FireFox bug, gives NS_ERROR_NOT_AVAILABLE... so retry until success.
			inCall = false;
			_bRetryRequest = false;
			http = createRequestObject();
			if(_bIsPost == 'undefined') _bIsPost = false;
			if(_PostData == 'undefined') _PostData = '';
			_NumOfRetrys++;
			
			setTimeout("doCall('"+_url+"', '" + _callback + "', '" + _callbackFailure + "', '" + _bIsPost + "', '" + _PostData + "')", 0); 
		} else {
			inCall = false;
			_bRetryRequest = false;			
			_NumOfRetrys = 0;
			
			if(_callbackFailure != null)
				eval(_callbackFailure + "();");
		    
		    callQueue();
		}
	}  	
}	

function createRequestObject() {
  var _ReqObj;

	if (window.XMLHttpRequest) 
	{
		_ReqObj = new XMLHttpRequest();
	} 
	else if (window.ActiveXObject) 
	{		
		try 
		{
			_ReqObj = new ActiveXObject("MSXML2.XMLHTTP.6.0");
		}
	    catch (e) 
	    {
			try 
			{
				_ReqObj = new ActiveXObject("Microsoft.XMLHTTP");
			} 
			catch (e2) {}
		}
	}

	// _ReqObj.onreadystatechange = function() { StatusChange(_ReqObj); };
       
	if (!_ReqObj) alert('Unable to create request.');
    
    return _ReqObj;
}

function sendCall(whereTo, returnTo, callbackFailure, bDoPost, PostData, bDoRetry){
    // GET THE NEXT ARRAY ITEM AND REMOVE FROM THE ARRAY
    var bAddFunction = true;
    if (bDoRetry == null)
        bDoRetry = true;
    for (var i = 0; i < callToArray.length; i++)
        if (returnToArray[i] == returnTo) {
            callToArray[i] = whereTo;
            failureArray[i] = callbackFailure;
            IsPostArray[i] = bDoPost;
            PostDataArray[i] = PostData;
            retryArray[i] = bDoRetry;
            bAddFunction = false
        }
    
    if (bAddFunction) {
        callToArray.push(whereTo);
        returnToArray.push(returnTo);
        failureArray.push(callbackFailure);
        IsPostArray.push(bDoPost);
        PostDataArray.push(PostData);
        retryArray.push(bDoRetry);
    }
    callQueue();
}

function callQueue(){
    // CHECK THE QUEUE AND SEND THE NEXT CALL IN LINE
    if(!inCall && callToArray.length > 0)
    {
        // DO WE HAVE ANYTHING IN THE QUEUE?
        //pop the items off until we process the last item in the queue... this way it will only process the last request.     
        whereTo = callToArray.shift();
        returnTo = returnToArray.shift();
        cbFailure = failureArray.shift();
        IsPost = IsPostArray.shift();
        PostData = PostDataArray.shift();
        DoRetry = retryArray.shift();
        // SEND THAT CALL      
        doCall(whereTo, returnTo, cbFailure, IsPost, PostData, DoRetry);
    }
}

function doCall(whereTo, returnTo, cbFailure, bIsPost, PostData, bDoRetry )
{
  inCall = true;
  _url = whereTo;
  _callback = returnTo;
  _callbackFailure = cbFailure;
  _bIsPost = bIsPost;
  _PostData = PostData;
  _bDoRetry = bDoRetry;
  
  if(bIsPost)
  {
	http.open('POST', whereTo, true);  
  }
  else
  {
	http.open('GET', whereTo, true);
  }

  http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); 
  http.onreadystatechange = StatusChange;


  // DO WE HAVE A FUNCTION TO CALL ONCE CALL IS COMPLETED?
//  if(returnTo.length > 0)
 // {  
	returnToCallBackFunction = returnTo; 
//  }
  
  if(bIsPost)
   http.send(PostData);
  else
   http.send(null);   
}

function GetHTTPResponseText() 
{
	if(http.responseText.indexOf('AuthDB.dll') >= 0 || http.responseText.indexOf('login.aspx') >= 0 || http.responseText.indexOf('sqp.aspx') >= 0)
	{
		if(!bSecondaryQuestionOpen){
			bSecondaryQuestionOpen = true;
			win = window.open("SecurityRedirect.aspx");					
			return "AuthDB.dll";
		}
	}		
	else
	{	
        return http.responseText;
	}
}