//***********************************************************************//
//*********************** AJAX ENGINE ***********************************//
//***********************************************************************//
//setup script to get info
function DoCallback(data,url,what) {
	
    // branch for native XMLHttpRequest object
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
        req.onreadystatechange = processReqChange;
        req.open('POST', url, true);
        req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        req.send(data);
    // branch for IE/Windows ActiveX version
    } else if (window.ActiveXObject) {
        req = new ActiveXObject('Microsoft.XMLHTTP')
        if (req) {
            req.onreadystatechange = processReqChange;
            req.open('POST', url, true);
            req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            req.send(data);
        }
    }
	return what;

	//setup script to process and handle info
	function processReqChange() {
		// only if req shows 'loaded'
		if (req.readyState == 4) {
			// only if 'OK'
			if (req.status == 200) {
				eval(what);
			} else {
				<!-- alert('There was a problem retrieving the XML data: ' + req.responseText); -->
			}
		}
	}
}











//***********************************************************************//	
//*********************** RUN QUERY *************************************//
//***********************************************************************//
function runQuery(query,pathToAjax) {
	var url = pathToAjax + "script-ajax.php";
	var what = "runQueryResults(req.responseText)";
	var doAction = "runQuery";
	//clean up query for transport
	var query = escape(query);
	//submit the ajax script
	DoCallback("query="+query+"&do_action="+doAction,url,what);
}
function runQueryResults(results) {
	window.runQueryResultsValue = results; //setup global var
}













//***********************************************************************//	
//*********************** RUN FUNCTION **********************************//
//***********************************************************************//
function runFunction(functionName,functionInputs,functionReqs,pathToAjax) {
	//we will call a php function that will include all the require_once scripts that we ask for, 
	//and then executes the function with the inputs that we provide
	var url = pathToAjax + "script-ajax.php";
	var what = "runFunctionResults(req.responseText)";
	var doAction = "runFunction";
	//break apart the functionInputs and clean them up, and put into a post-able array
	var inputArray = "";
	for (i=0; i<functionInputs.length; i++) {
		inputArray += "&functionInput[]=" + escape(functionInputs[i]);
	}
	//break apart functionReqs
	var reqArray = "";
	for (i=0; i<functionReqs.length; i++) {
		reqArray += "&functionReq[]=" + functionReqs[i];
	}
	//submit the ajax script
	DoCallback("functionName="+functionName+inputArray+reqArray+"&do_action="+doAction,url,what);
}
function runFunctionResults(results) {
	window.runFunctionResultsValue = results; //setup global var
}











//====================================================================
//    SUBMIT FORM VIA AJAX
//====================================================================
function ajaxSubmitForm(formID,submitTo) {
	var url = submitTo;
	var what = "ajaxSubmitFormResults(req.responseText)";

	var str = "";
	var elem = document.getElementById(formID).elements;
	for (var i=0; i<elem.length; i++) {
		var elemType = elem[i].type;
		var elemName = elem[i].name;
		var elemVal = elem[i].value;
		
		//handle checkboxes 
		if (elemType=="checkbox" || elemType=="radio") {
			if (elem[i].checked) {
				str += elemName + "=" + escape(elemVal) + "&";		
			}
			
		//proceed with other types
		} else {
			str += elemName + "=" + escape(elemVal) + "&";
		}
	}
	//submit this form
	DoCallback(str,url,what);
}
function ajaxSubmitFormResults(results) {
	//create global variable of results that other javascripts can find
	ajaxFormSubmissionResults = results;
}













//====================================================================
//    CONVERT FORM FIELDS INTO FLAT TEXT (DIV TAGS)
//    create a div tag beside each form field with name="flat_<<field_name>>"
// 	  the form fields will still exist -- they'll just be hidden, so
//    keep that in mind for form submission purposes
//====================================================================
function toggleFormFieldsFlat(formID) {
	var form = document.getElementById(formID);
	var divs = form.getElementsByTagName('div');
	var elem = form.elements;
	for (var i=0; i<elem.length; i++) {
		var elemObject = elem[i];
		var elemType = elem[i].type;
		var elemName = elem[i].name;
		var elemVal = elem[i].value;
		//handle checkboxes & radio buttons to only show an "X" for their value, if checked
		if (elemType=="checkbox" || elemType=="radio") {
			if (elem[i].checked) {
				elemVal = "X";
			} else {
				elemVal = "";
			}
		}
		//handle select boxes: show text instead of value
		if (elemType=="select-one") {
			elemVal = elem[i].options[elem[i].options.selectedIndex].text;
		}		
		//now update the div tags, where present
		var flatDiv = "flat_" + elemName;
		var flatDiv = getElementsByName_iefix('div',flatDiv);
		if (flatDiv.length>0) {
			//how many divs have this name?  if more than one, let's figure out which one corresponds with this 
			if (flatDiv.length>1) {
				//we'll loop through all the elements on the page with the corresponding name, and then we'll pair it with the correct div tag
				var allMatchingElems = document.getElementsByName(elemName);
				for (var x=0; x<allMatchingElems.length; x++) {
					if (allMatchingElems[x]===elemObject) {
						flatDiv = flatDiv[x];
					}
				}
			} else {
				flatDiv = flatDiv[0];
			}
			//add the element value to the flat div tag
			flatDiv.innerHTML = elemVal;
			//toggle the display of the fields

			if (elem[i].style.display=="none") {
				elem[i].style.display = "inline";
				flatDiv.style.display = "none";
			} else {
				elem[i].style.display = "none";
				flatDiv.style.display = "inline";
			}			
		}
	}
}
