/*
-----------------------------------------------
                                               
      EMK Javascript Data File                    
		                               
      Author: 	Craig Pearce                     
      Date: 	03/07/2009                         
                                               
      Functions required to execute database
      queries using JavaScript
      
      # AJAX development #
      
      Version 1.00          
		                               
-----------------------------------------------
*/

var processThreads 		= new Array();
var thisBrowser			= '?';

var READY_STATE_COMPLETE 	= 4;

// =========== Main Functions =================

// getData() run a query in the background and then return the result to the specified container

function getData(url,container,frmName){
	if(frmName != null){
		sendRequest(url,makePOST(frmName),'returnToContainer',container);
	}else{
		sendRequest(url,null,'returnToContainer',container);
	}
}

// runData() run a query but don't return anything, use for background database updates

function runData(url,frmName){
	if(frmName != null){
		sendRequest(url,makePOST(frmName));
	}else{
		sendRequest(url,null);
	}
}

// =========== Core Functions =================

function getAJAXObject(thisID){
	var xRequest = null;
	if(window.XMLHttpRequest){
		xRequest 	= new XMLHttpRequest()					// Mozzilla/Safari
		thisBrowser 	= 'Moz';
	}else if (typeof ActiveXObject != 'undefined'){
		xRequest 	= new ActiveXObject('Microsoft.XMLHTTP');		// Internet Explorer
		thisBrowser	= 'IE';
	}
	createThread(thisID,xRequest);
}

function sendRequest(url,params,thisFunction,thisVar,returned){
	var threadID = assignID()
	getAJAXObject(threadID);
									// Figure out the best object to use
	if (processThreads[threadID]){
		processThreads[threadID].open('POST',url,true);				// Set up request
		if(params != null){
			processThreads[threadID].setRequestHeader('Content-Type','application/x-www-form-urlencoded');
			processThreads[threadID].setRequestHeader("Content-length", params.length);
		}
		processThreads[threadID].send(params);					// Send request to specified script
		processThreads[threadID].onreadystatechange = function(){
			if(processThreads[threadID].readyState == READY_STATE_COMPLETE){
				if(thisFunction != null){
					eval(thisFunction + '()');
				}
				cleanThread(threadID);
			}
		}
	}
	
	function returnToContainer(){
		if(typeof ActiveXObject == 'undefined'){
			document.getElementById(thisVar).innerHTML = '';
		   	document.getElementById(thisVar).appendChild(processThreads[threadID].responseText);	
		}else{
			document.getElementById(thisVar).innerHTML = processThreads[threadID].responseText;
		}
	}
	
}

function createThread(thisID,thisObject){
	processThreads[thisID] = thisObject;
}

function cleanThread(thisID){
	processThreads[thisID] = null;
}

function assignID(){
	var newID = Math.floor(new Date().getTime()/1000);
	var theseChars = 'ABCEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#';
	for(var i = 0;i < 20;i++){
		newID = newID + theseChars.substr(Math.floor(Math.random()*(theseChars.length)),1);
	}
	return newID
}

function makePOST(frmName){
	var frm = '';
	var output = '';
	eval('frm = document.' + frmName);
	for(i=0; i<frm.elements.length; i++){
		output = output + frm.elements[i].name + "=" + frm.elements[i].value + "&";
	}
	output = output.substr(0,(output.length - 1));
	return output;
}

