/*
	Title: Queued AJAX GET & POST functions
	Author: Matthew Hart
	URL: http://www.bazosoft.com
*/

var BAJAX_BUSY = 0;
var BAJAX_MAX_STACK = 10;
var BAJAX_QSTACK = [ BAJAX_MAX_STACK ];
var BAJAX_QSTACK_FORM = [ BAJAX_MAX_STACK ];
var BAJAX_QINDEX = 0;

function DEBUG( msg ) {
	//var status = document.getElementById('AJAX_Status').innerHTML;
	//document.getElementById('AJAX_Status').innerHTML = msg + "<br>" + status;
}

function BAJAX_QPUSH ( url, form_id ) {
	if ( BAJAX_QINDEX == BAJAX_MAX_STACK ) {
		
		DEBUG("<span style='color: #f00;'>Stack limit reached</span>");
	} else {
		BAJAX_QSTACK[BAJAX_QINDEX] = url;
		BAJAX_QSTACK_FORM[BAJAX_QINDEX] = form_id;
		DEBUG( url + " pushed to stack index " + BAJAX_QINDEX );
		BAJAX_QINDEX += 1;
	}
	return null;
}

function BAJAX_QPOP () {
	if ( BAJAX_QINDEX > 0 ) {
		BAJAX_QINDEX -= 1;
		var url = BAJAX_QSTACK[BAJAX_QINDEX];
		BAJAX_QSTACK[BAJAX_QINDEX] = null;
		BAJAX_QSTACK_FORM[BAJAX_QINDEX] = null;
		DEBUG( url + " popped from stack index " + BAJAX_QINDEX );
		return url;
	}
	DEBUG( "Tried to pop from empty stack." );
	return null;
}

function GetXmlHttpObject() {
	
	if ( BAJAX_BUSY == 1 ) {
		
		return null;
		
	} else {
	
		BAJAX_BUSY = 1;
	
		var xmlHttp=null;
		try {
			// Firefox, Opera 8.0+, Safari
			xmlHttp=new XMLHttpRequest();
		} catch (e) {
			// Internet Explorer
			try {
				xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
			}
	  }
	  return xmlHttp;
	}
}

function stateChanged() {
	if (xmlHttp.readyState==4) {
	
		if ( xmlHttp.status==200) {
			var result = xmlHttp.responseText;
			var pos1 = result.indexOf('-->');
			var id = result.substring( 4, pos1 );
			var data = result.substring( pos1 + 3, result.length );
			var old_data = document.getElementById( id ).innerHTML;
			
			DEBUG( "BAJAX Request complete for " + id );
			
			// IE hack to prevent flickering
			document.getElementById( 'debug' ).innerHTML = data;
			var tdata = document.getElementById( 'debug' ).innerHTML;
			
			if ( old_data != tdata ) {
				DEBUG( id + " UPDATED!" );
				document.getElementById( id ).innerHTML = data;
			}
			
			document.getElementById( 'debug' ).innerHTML = "";

		} else {
			if ( xmlHttp.status==4000 ) {
				// Nothing has changed
				DEBUG("<span style='color: #ff0;'>304 Received</span>" );
			}
		}
			
		BAJAX_BUSY = 0;
		if ( BAJAX_QINDEX > 0 ) {
			var form_id = BAJAX_QSTACK_FORM[BAJAX_QINDEX-1];
			var url = BAJAX_QPOP();
			if ( form_id != null ) {
				BAJAX_POST( url, form_id );
			} else {
				BAJAX_GET( url );
			}		
		}

	}
}

function BAJAX_GET( url ) {
	
	// Get id_tag
	var pos1 = url.indexOf('id_tag=');
	var pos2 = url.indexOf('&', pos1 + 7 );
	if ( pos2 == -1 ) pos2 = url.length;
	
	var id = url.substring( pos1 + 7, pos2 );
	
	if ( BAJAX_BUSY == 1 ) {
		// Queue this command
		BAJAX_QPUSH( url, null );
	} else {
	
		xmlHttp=GetXmlHttpObject();
	
		if (xmlHttp==null) {

		} else {
			xmlHttp.onreadystatechange=stateChanged;
			xmlHttp.open("GET",url,true);
			xmlHttp.send(null);
			DEBUG( "BAJAX_GET sent for " + url );
			//document.getElementById( id ).innerHTML = "loading...";
			if( document.getElementById( id ) == null ) {
				alert( "Element "+id+" is null" );
			}
		}
	}

}

function BAJAX_POST( url, form_id ) {

	// Get id_tag
	var pos1 = url.indexOf('id_tag=');
	var pos2 = url.indexOf('&', pos1 + 7 );
	if ( pos2 == -1 ) pos2 = url.length;
	
	var id = url.substring( pos1 + 7, pos2 );
	
	if ( BAJAX_BUSY == 1 ) {
		// Queue this command!
		BAJAX_QPUSH( url, form_id );
	} else {
	
		xmlHttp=GetXmlHttpObject();
		
		if (xmlHttp==null) {
		
		} else {
		
			// Get the params of the form!
			var form = document.getElementById( form_id );
			var params = form.elements[0].name + "=" + form.elements[0].value;
			
			for ( var i = 1; i < form.length; i++ ) {
				params = params + "&" + form.elements[i].name + "=" + form.elements[i].value; 
			}
		
			xmlHttp.open("POST",url,true);
		
			xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			xmlHttp.setRequestHeader("Content-length", params.length);
			xmlHttp.setRequestHeader("Connection", "close");	
		
			xmlHttp.onreadystatechange=stateChanged;
			
			xmlHttp.send( params );
			DEBUG( "BAJAX_POST sent for " + url );
			//document.getElementById( id ).innerHTML = "loading...";
			if( document.getElementById( id ) == null ) {
				alert( "Element "+id+" is null" );
			}					
		}
	}
	
}