// HTTP Request Library

function makeHttpReq() {
   var http_request = false;
   /*@cc_on @*/
   /*@if (@_jscript_version >= 5)
   // JScript gives us Conditional compilation, we can cope with old IE versions.
   // and security blocked creation of the objects.
   try {
      http_request = new ActiveXObject("Msxml2.XMLHTTP");
   } catch (e) {
      try {
         http_request = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (E) {
         http_request = false;
      }
   }
   @end @*/

   if (!http_request && typeof XMLHttpRequest!='undefined') {
      http_request = new XMLHttpRequest();
   }

   return http_request;
}

function BsiHttpRequest(xml_string, connectingTo, method) {
	this.xml_string = xml_string;
	if(connectingTo == null || connectingTo == ''){
		connectingTo = "ProcessHttpReq?";
	}
    this.connectingTo = connectingTo;
}

//callbacks
BsiHttpRequest.prototype.onTimeout = function() {};
BsiHttpRequest.prototype.onResponse = function( xmlResponse, rawResponse ) {};
BsiHttpRequest.prototype.onError = function( xmlResponse, rawResponse, errorCode ) {};

function HttpRequestQueue() {
	this.queue_watcher_thread = false;
	this.xml_http_request_timeout_thread = false;
	this.active_request = false;
	this.request_queue = new Array();
	this.xml_http_request = makeHttpReq();
	this.timesResent = 0;
	this.allowResendOnEmpty = false;
	this.timesAllowed = 10;
	this.interval = 10;
	this.timeout = 20000;
}

HttpRequestQueue.prototype._watcher = function () {
	if( this.active_request ) {
		return;
	}
	if( this.request_queue.length ) {
		var me = this;
		this.active_request = this.request_queue.shift();
		this.xml_http_request_timeout_thread = setTimeout( function() { me._xml_http_request_ontimeout(); }, this.timeout );
        try{
            this.xml_http_request.open('POST', this.active_request.connectingTo, true );
        }catch(err){
            return;	//alert("BSI HTTP Request exception: "+err);
        }
		this.xml_http_request.onreadystatechange = function() { me._xml_http_request_onreadystatechange(); };
		this.xml_http_request.setRequestHeader( "Content-type", "application/x-www-form-urlencoded" );
		this.xml_http_request.setRequestHeader( "Content-length", this.active_request.xml_string.length );
		this.xml_http_request.setRequestHeader( "Cache-Control", "no-cache" );
		this.xml_http_request.send( this.active_request.xml_string );
		return;
	}
	this._stopWatcher();
};

HttpRequestQueue.prototype._xml_http_request_onreadystatechange = function () {
	if( this.xml_http_request.readyState != 4 ) {
		return;
	}

	clearTimeout( this.xml_http_request_timeout_thread );
	this.xml_http_request_timeout_thread = false;
	var xmlResponseDoc = this.xml_http_request.responseXML;
	var rawResponse = this.xml_http_request.responseText;
	var statusCode = this.xml_http_request.status;
	var request = this.active_request;

	this.active_request = false;
	if( statusCode != 200 ) {
		this.timesResent = 0;
		request.onError( xmlResponseDoc, rawResponse, statusCode );
		return;
	}
	if( !(rawResponse == '' || !xmlResponseDoc || !xmlResponseDoc.firstChild) || !this.allowResendOnEmpty || this.timesResent > this.timesAllowed ){
		this.timesResent = 0;
		request.onResponse( xmlResponseDoc, rawResponse );
	} else {
		this.timesResent = this.timesResent + 1;
		this.request_queue.unshift( request );
		this._startWatcher();
	}
};

HttpRequestQueue.prototype._xml_http_request_ontimeout = function () {
	var request = this.active_request;
	this.xml_http_request.onreadystatechange = function() {};
	this.xml_http_request_timeout_thread = false;
	this.active_request = false;
    if(request) {
	   request.onTimeout();
    }
};

HttpRequestQueue.prototype._startWatcher = function () {
	if( !this.queue_watcher_thread ) {
		var me = this;
        this.queue_watcher_thread = setInterval( function(){ me._watcher(); }, this.interval );
	}
};

HttpRequestQueue.prototype._stopWatcher = function () {
	clearInterval( this.queue_watcher_thread );
	this.queue_watcher_thread = false;
};

HttpRequestQueue.prototype.setResend = function (allowResendOnEmpty) {
	this.allowResendOnEmpty = allowResendOnEmpty;
};

HttpRequestQueue.prototype.addToQueue = function( bsi_http_request ) {
	this.request_queue.push( bsi_http_request );
	this._startWatcher();
};

var http_request_queue = new HttpRequestQueue();

