/* 
------------------------------------------------------------------------------
Filename: ajax.js

Purpose:
    Supports Ajax functionality.

    History:
    Ver			Inits	Date		Comments
    1.00.00		YB	    10-10-06	Created

	usage ajax(reqType, url, async, customFunc, divLoad) or ajaxFormSubmit(formId, reqType, url, async, customFunc, divLoad)
-------------------------------------------------------------------------------
*/

var ajaxDiv = null;
var request;
var gObjInfo = new Object();
var useJSON = false;
var cacheAjax = false;
var customAjaxError = "";
var customCallBack;

// 

// initReq:
//
// Initialize a request object that is already constructed.
//		Parameters:
//			reqType:	The HTTP request type, such as GET or POST.
//			url:		The URL of the server program.
//			isAsynch:	Whether to send the request asynchronously or not.
//

function initReq(reqType, url, isAsync){
	// Specify the function that will handle the HTTP response.
	request.onreadystatechange = handleResponse;
	if(cacheAjax == false){ //check if ajax should be cached
		var cacheAjaxStamp = "&tsv="+new Date().getTime();
		var findUrlIndex = url.indexOf("?");
		if(findUrlIndex != -1){ //check if there is a "?" in the url string
			var newURL = url+cacheAjaxStamp;
		}else{
			var newURL = url+"?"+cacheAjaxStamp; //if not put one in
		}
		request.open(reqType, newURL, isAsync);
	}else{
		request.open(reqType, url, isAsync);
	}
	request.setRequestHeader("HTTP_REFERER", "ASTC");
	// Set the Content-Type header for a POST request we only do this if we're posting a form.
	if(reqType == "POST"){
		request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
		request.send(parameters); //Posts the form params.
	}else{
		request.send(null); // Not posting anything to the page.
	}	
	
} // initReq


// httpRequest:
//
// This creates the XMLHttpRequest object.
//
//	Wrapper function for constructing a request object.
//		Parameters:
//			reqType:	The HTTP request type, such as GET or POST.
//			url:		The URL of the server program.
//			asynch:		Whether to  send the request asynchronously or not.
// 

function ajax(reqType, url, async, customFunc, divLoad){
	customCallBack = customFunc;
	//var args = ajax.arguments;
	ajaxDiv = null;
	if(divLoad != undefined){
		ajaxDiv = divLoad;
	}	
	httpRequest(reqType, url, async);
}

function httpRequest(reqType, url, async){
	// Mozilla-based browsers
	if(window.XMLHttpRequest){
		// alert("Creating non-ActiveX request object");
		request = new XMLHttpRequest();
	}
	else if(window.ActiveXObject){
		// alert("Creating ActiveX request object");
		request = new ActiveXObject("Msxml2.XMLHTTP");
		if(!request){
			request = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	
	// The request could still be null if neither ActiveXObject Initialization succeeded
	if(request)	{
		initReq(reqType, url, async);
	}else{
		alert("Your browser does not permit the use of all of this application's features!");
	}
	
} // httpRequest

var parameters = "";
function ajaxFormSubmit(formId, reqType, url, async, customFunc, divLoad){
	parameters = ""; // needs reset to submit form again since it is a global var.
	var formVar = document.getElementById(formId);
	customCallBack = customFunc;
	ajaxDiv = null;
	var fieldNames = new Array();
	var fieldValues = new Array();
	//var args = ajaxFormSubmit.arguments;
	if(divLoad != undefined){
		ajaxDiv = divLoad;
	}	
	for(i=0; i<formVar.length; i++){
		//alert(formVar.elements[i].type);
		fieldNames[i] = formVar.elements[i].name;
		fieldValues[i] = formVar.elements[i].value;
		if (formVar.elements[i].type == "radio") { //find all radio inputs
	 		if (formVar.elements[i].checked) {
		  		parameters += formVar.elements[i].name + "=" + formVar.elements[i].value + "&";
	   		}
		}
		if (formVar.elements[i].type == "checkbox") {//find all checkbox inputs
	  		if (formVar.elements[i].checked) {
		  		parameters += formVar.elements[i].name + "=" + formVar.elements[i].value + "&";
	   		} else {
		  		parameters += formVar.elements[i].name + "=&";
	   		}
		}
		if (formVar.elements[i].tagName.toLowerCase() == "select") { //find all select inputs
			var sel = formVar.elements[i];
			var selCount = getMultipleSelect(sel);
			if(selCount){
				if(selCount > 1){
					parameters += sel.name + "=" + encodeURIComponent(sel.options[1].value) + "&";
				}else{
					parameters += sel.name + "=" + encodeURIComponent(sel.options[sel.selectedIndex].value) + "&";
				}
			}
 		}
		// added password field type
		if (formVar.elements[i].type == "text" || formVar.elements[i].type == "textarea" || formVar.elements[i].type=="hidden" || formVar.elements[i].type=="password") { //find all text inputs
				parameters += formVar.elements[i].name + "=" + encodeURIComponent(formVar.elements[i].value) + "&";
		}
	}
	httpRequest(reqType,url,async,parameters);
	
	
}//end ajaxForm

function handleResponse() {
	if (request.readyState == 1){
		if(ajaxDiv != null){
			loader("Retrieving Data...");
		}
	}
	// only if req shows "complete" (the request went through with out errors)
	if (request.readyState == 4) {
		if (request.status == 200) {
			// The responseText is a javaScript object in JSON text format.
			if(useJSON){
				gObjInfo = eval('(' + request.responseText + ')');
			}else{
				gObjInfo = request.responseText;
			}
			if (ajaxDiv != null){
				document.getElementById(ajaxDiv).innerHTML = gObjInfo;	
			}
			if(customCallBack != ""){
				customCallBack();
			}
		}else{
			gObjInfo.success = false;
			gObjInfo.message ="There was a problem retrieving the data because of " + request.statusText;
			if(customAjaxError != ""){
				customAjaxError();
			}else{
				alert(gObjInfo.message);
			}
		}
	}
}

function getMultipleSelect(selectBox){ //javascript only reads the first selected element so this is a workaround
	var mSelect = selectBox;
	var chosen = "";
	var numSelected = 0;
	for (var i = 0; i < mSelect.options.length; i++) {
		if (mSelect.options[i].selected) {
			chosen = chosen + mSelect.options[i].value + ",";
			numSelected++; 
		}
	}
	if(numSelected > 1){
		mSelect.options[1].value = chosen;
	}
	return numSelected;
}

var imgToLoad = "/jsLib/ajax-loader.gif";
function loader(loadText){ //loads an animated gif to show loading...
	var loaderIMG = '<img src="'+imgToLoad+'" alt="'+loadText+'" title="'+loadText+'" class="loadingIMG" \/>'
	document.getElementById(ajaxDiv).innerHTML = loaderIMG;
}