// Ajax Javascript Functions
// 05/03/2006 AD


//Global Variables
var http = createRequestObject();
var http2 = createRequestObject();
var objectId = '';
var raxObjectId = '';
var rowId = '';
var processingMsg = 'processing...';
var dbRefreshMode = false;
var divName = new Array();
var divIdentifier = 'div';
var rowIdentifier = 'row';
var caughtError = '';
var rawResponseFunction = '';
var raxResponseFunction = '';
var formFieldSeparator = '**^**';
var formDataSeparator = '|*|';
var formDataKeys = new Array();
var formDataValues = new Array();
var myDiv='';
var ajaxGridPrintHeader = '';
var ajaxGridPrintSubHeader = new Array();
var autoopens_running = 0;
var suppressLCFM = false;
var adgErrorMessage = '';
var gridAjaxCounter = 0;

function createRequestObject() {
    var obj;
    var browser = navigator.appName;

    if ( browser == "Microsoft Internet Explorer" ) {
        obj = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else{
        obj = new XMLHttpRequest();
    }
    return obj;    
}

var reloadDivRequested = 0;

function remoteSendReq( tagId ) {
	if (reloadDivRequested == 0) return;
	tagId = reloadDivRequested;
	reloadDivRequested = 0;
	objectId = divIdentifier + '_' + tagId;
	divName[objectId] = 'reload';
	serverFileName = document.getElementById('fn_' + tagId).innerHTML;
	variableKeys   = document.getElementById('ak_' + tagId).innerHTML;
	variableValues = document.getElementById('av_' + tagId).innerHTML;

	sendReq( tagId, serverFileName, variableKeys, variableValues );
}
rlq = setInterval("remoteSendReq()",1000);
//[sendReq] - communicates with server file via HTTP
function sendReqWrapper(tagId,obj) {
	sendReq(tagId,'','','');
	swapImages(obj);
	document.getElementById('row_' + tagId).className='';
}
function sendReq( tagId, serverFileName, variableKeys, variableValues ) {
	if (tagId > 0) {	
		serverFileName = document.getElementById('fn_' + tagId).innerHTML;
		variableKeys   = document.getElementById('ak_' + tagId).innerHTML;
		variableValues = document.getElementById('av_' + tagId).innerHTML;
	}
	var paramString = '';
    var xContent;
    var innerText;
	if ( document.getElementById('ajax_db_refresh').value != '' )
        dbRefreshMode = true; //set to refetch data from DB all the time
    objectId = divIdentifier + '_' + tagId; //server response will display here
	
	rowId    = rowIdentifier + '_' + tagId; //row containing server response
	if (document.getElementById(rowId)) {
		document.getElementById(rowId).style.display = ''; //display it
		document.getElementById(rowId).className = 'continue'; //display it
	}
    if ( dbRefreshMode ) {
        //
        xContent  = document.getElementById(objectId).innerHTML;
        innerText = getInnerText(xContent);
        //if there is content, minimize
        if ( innerText != '' ) {
            document.getElementById(objectId).style.display = 'none';
            document.getElementById(rowId).style.display = 'none';
            document.getElementById(objectId).innerHTML = '';
            return;
        }
    }
    //Global Array(divName) - controls which tags have being clicked open
    else {
        xContent  = document.getElementById(objectId).innerHTML;
        innerText = getInnerText(xContent);
        if ( innerText != ''  &&  divName[objectId] == undefined) {
			divName[objectId] = true; //flags that a tag was AUTO-OPEN by parent function
		}
        
        if ( divName[objectId] == undefined || divName[objectId] == 'reload') {
            divName[objectId] = true; //first time, do DB call
			
        }
		else if ( divName[objectId]) {
            document.getElementById(objectId).style.display = 'none';
            document.getElementById(rowId).style.display = 'none';
            divName[objectId] = false; //just hide display
            return;
        }
        else if ( ! divName[objectId] ) {
			document.getElementById(objectId).style.display = '';
            divName[objectId] = true; //just enable display
            return;
        }
    }
    document.getElementById(objectId).innerHTML = '<b><i>' + processingMsg + '</i></b>';
    //get & set Ajax Counter parameter
    ajaxCounter = document.getElementById('ajax_counter').value;
    variableKeys   = variableKeys + ',' + 'ajax_counter';
    variableValues = variableValues + ',' + ajaxCounter.toString();

    //get & set SESSION parameter
    ajaxSession = document.getElementById('ajax_session').value;
    variableKeys   = variableKeys + ',' + 'ajax_session';
    variableValues = variableValues + ',' + ajaxSession.toString();
    //convert it to an Array
    variableKeys   = variableKeys.split(',');
    variableValues = variableValues.split(',');


    for( i=0; i<variableKeys.length; i++ ) {
	paramString += variableKeys[i]+'='+variableValues[i]+'&';
    }
    //paramString = paramString.substring(0, (paramString.length-1));
	paramString += "sid="+Math.random();

	http.abort();
	try
	{
		if (paramString.length == 0) {
			http.open('get', serverFileName);
		}
		else {
			http.open('get', serverFileName+'?'+paramString);
		}
	}
	catch (err)
	{ 
		document.getElementById(objectId).innerHTML = 'AJAX engine has stopped responding - reload page (error' + err + ')';
		return;
	}
	try
	{
		http.onreadystatechange = handleResponse;
		http.send(null);
	}
	catch (err)
	{
		document.getElementById(objectId).innerHTML = 'Server busy - retry request';
	}	

}

//[handleResponse] - if server returns output, it displays it @ objectId specified
function handleResponse() {
    //did it Complete
	if (http.readyState == 4) {
		responseArray = http.responseText;
        serverResponse = responseArray.split(',');
        okHandshake  = serverResponse[0];
		ac = '';
		responseText = '';
        if ( okHandshake == 'OK' ) {
			ac = serverResponse[1].split('|');
			ajaxCounter  = ac.shift();
			responseText = serverResponse[2];
            document.getElementById(objectId).style.display = '';
            setAjaxCounter(ajaxCounter); //
			document.getElementById(objectId).innerHTML = decodeBase64(responseText);
		} else if ( okHandshake == 'ALERT') {
			responseText = serverResponse[1];
		    alertText = decodeBase64(responseText);
			alert(alertText);
		}
		
        //else if (caughtError != '')
		//    document.getElementById(objectId).innerHTML = caughtError;
        else {
			if (document.getElementById(objectId)){
				document.getElementById(objectId).innerHTML = "<big><b>Ajax Server Program Error</b></big>\n" + serverResponse;
				if (document.getElementById(objectId).style.display = 'none')
					document.getElementById(objectId).style.display = '';
			} else
				alert('SR=' + serverResponse);
		}
		obj = document.getElementById('ajax_request_running');
		if (obj) obj.value = 0;
		obj = document.getElementById('ajax_query_button');
		if (obj) obj.disabled = false;
		//Bit below does not work quite right yet
		/*
		if (currentY > (screen.height / 2)) {
			sb = (screen.height + currentY);
			self.scrollBy(0,sb);
		}
		*/
		while (ac.length > 0) {
			s = ac.shift();
			if (s == '') continue;
			o = {counter:  s};
			autoopens.push(o);
		}
		suppressLCFM = false;
	}
}

/*
cell = the div that will receive the response
serverFileName = the php program that will be run
responseHandler = the javascript function that will be run once data is returned
variableKeys = the names of the get parameters
variableValues = the values of the get parameters

once the function is run, control is passed off to the rawHandleResponseFunction, 
which completes the process
*/
function raxSendReq(cell, serverFileName, responseHandler, variableKeys, variableValues ) {
	
    if (http2.readystate > 0 && http2.readystate < 4) {
		alert ('rax call while running');
		return;
	}
	var paramString = '';
	raxObjectId = cell;
	raxResponseFunction = responseHandler;
	variableKeys   = variableKeys.split(',');
    variableValues = variableValues.split(',');
    for( i=0; i<variableKeys.length; i++ ) {
	paramString += variableKeys[i]+'='+variableValues[i]+'&';
	}
	paramString += "sid="+Math.random();

	//paramString = paramString.substring(0, (paramString.length-1));
	try
	{
		if (paramString.length == 0) {
			http2.open('get', serverFileName);
		}
		else {
			http2.open('get', serverFileName+'?'+paramString);
		}
	}
	catch (err)
	{ 
		return 'AJAX engine has stopped responding - reload page (error' + err + ')';
	}
	try
	{
		http2.onreadystatechange = raxHandleResponse;
		http2.send(null);
	}
	catch (err)
	{
		return 'Server busy - retry request';
	}	
	return 'requesting....';
}


function raxHandleResponse() {

    //did it Complete
    if (http2.readyState == 4) {
		responseArray = http2.responseText;
        serverResponse = responseArray.split(',');
        okHandshake  = serverResponse[0];
        responseText = serverResponse[1];
		if ( okHandshake == 'OK' ) {
			document.getElementById(raxObjectId).innerHTML = decodeBase64(responseText);
			if (serverResponse.length == 4) {
				responseVar = serverResponse[2];
				responseVal = serverResponse[3];
				document.getElementById(responseVar).value = responseVal;
				
			}
			if (raxResponseFunction != '')
				eval(raxResponseFunction);
		
		} else if ( okHandshake == 'ALERT') {
			responseText = serverResponse[1];
			alertText = decodeBase64(responseText);
			alert(alertText);
		} else if (responseArray != '') {
			document.getElementById('ajax_error').innerHTML = 'Error<br>' + responseArray;
        } 
			
		obj = document.getElementById('ajax_request_running');
		//if (obj) obj.value = 0;
	} 
	
}



function rawSendReq(cell, serverFileName, responseHandler, variableKeys, variableValues ) {
	
    if (http.readystate > 0 && http.readystate < 4) {
		if (window.writeDebugStatus)
			writeDebugStatus('http object is at status ' + http.readystate);
		return;
	}

	if (window.writeDebugStatus)
		writeDebugStatus('http object is ready');
	var paramString = '';
	objectId = cell;
	rawResponseFunction = responseHandler;

	variableKeys   = variableKeys.split(',');
    variableValues = variableValues.split(',');
    for( i=0; i<variableKeys.length; i++ ) {
	paramString += variableKeys[i]+'='+variableValues[i]+'&';
	}
	paramString += "sid="+Math.random();
	//paramString = paramString.substring(0, (paramString.length-1));
	try
	{
		if (paramString.length == 0) {
			http.open('get', serverFileName);
		}
		else {
			http.open('get', serverFileName+'?'+paramString);
		}
	}
	catch (err)
	{ 
		return 'AJAX engine has stopped responding - reload page (error' + err + ')';
	}
	try
	{
		http.onreadystatechange = rawHandleResponse;
		http.send(null);
	}
	catch (err)
	{
		return 'Server busy - retry request';
	}	
	return 'requesting....';
}
function rawHandleResponse() {

	//did it Complete
	if (window.writeDebugStatus)
		writeDebugStatus('http object is at response state ' + http.readyState);

    if (http.readyState == 4) {
		responseArray = http.responseText;
		//if (document.getElementById('debug_response'))
		//	document.getElementById('debug_response').innerHTML = responseArray;

        serverResponse = responseArray.split(',');
        okHandshake  = serverResponse[0];
        responseText = serverResponse[1];
		if ( okHandshake == 'OK'){
			if (objectId != '') {
				if (document.getElementById(objectId)){
					document.getElementById(objectId).innerHTML = decodeBase64(responseText);
				}
				else
					alert('Programmer Error: ' + objectId + ' not defined in parent program');
			
			}
			if (serverResponse.length == 4) {
				responseVar = serverResponse[2];
				responseVal = serverResponse[3];
				//alert(responseVar);
				document.getElementById(responseVar).value = responseVal;
				//if (document.getElementById('debug_response'))
				//	document.getElementById('debug_response').innerHTML = decodeBase64(responseVal);

			}
			if (rawResponseFunction != '')
				eval(rawResponseFunction);
		} else if ( okHandshake == 'ALERT' || okHandshake == 'WARNING') {
	        responseText = serverResponse[1];
			alertText = decodeBase64(responseText);
			alert(alertText);
			if (okHandshake == 'WARNING') {
	 			if (rawResponseFunction != '')
					eval(rawResponseFunction);
			}
			 
		}
		else if (responseArray != '') {
			document.getElementById('ajax_error').innerHTML = 'Error<br>' + responseArray;
        }
		obj = document.getElementById('ajax_request_running');
		//if (obj) obj.value = 0;
		return true;
	} 
	return false;
	
}
// SUPPORTING FUNCTIONS  ------------------------------------------------------

//[getInnerText] - a regular expression version of innerText (original only works in IE)
function getInnerText( xStr ) {
    var regExp = /<\/?[^>]+>/gi;
    
    xStr = xStr.replace(regExp,"");
    return xStr;
}

//[swapImages]
function swapImages( obj ) {
    if ( obj.className == 'iicon' )
        obj.className = 'iicon_open';
    else
        obj.className='iicon';
	return;
	if ( obj.src.search(/closed/) == -1 )
        obj.src='/adg/supporting/images/clickme_closed.gif';
    else
        obj.src='/adg/supporting/images/clickme_open.gif';
        
}

function setAjaxCounter( counter ) {

    document.getElementById('ajax_counter').value = counter;
}
function setProcessingMsg(msg) {
	processingMsg = msg;
}

// This receives data into a previously declared hidden variable
// This is the callback function from a standard ajax function to receive form data
function formRecordReceiver(hiddenFieldName) {
	
	//Unpack the received Data into field list
	
	var datacount = 0;
	
	var rd;
	var rawdata = decodeBase64(document.getElementById(hiddenFieldName).value);
	var rdsplit = rawdata.split(formFieldSeparator);
	for (rd in rdsplit) {
		if(!rdsplit[rd].split)
			continue;
		var fv = rdsplit[rd].split(formDataSeparator);
		formDataKeys[datacount] = fv[0];
		formDataValues[datacount] = fv[1];
		datacount++;
		
		el = document.getElementById(fv[0]);
		if (!el) {
			// See if its a radio button,
			el = document.getElementById(fv[0] + '_' + fv[1]);
			if (el) {
				el.checked = true;
			}
			continue;
		}
		// Is the element a select box, and I have new values for it
		//alert(fv[1]);
		if (el.type == 'select-one' && fv[1].substring(0,2) == '~~') {
			seldata = fv[1].substring(2);
			//Empty the existing values
			el.options.length = 0;
			//Populate with new values
			selvals = seldata.split(',');
			for (sv in selvals) {
				var svsplit = selvals[sv].split('|');
				k = svsplit[0];
				v = svsplit[1];
				el.options[el.length] = new Option(v, k);
			}
			continue;
				
		}
		el.value = fv[1];
		// See if the field corresponds to a check box
		if (el.type == 'hidden') {
			elc = document.getElementById(el.id + 'CHK');
			if (elc){
				if (fv[1] == 0)
					elc.checked = false;
				else
					elc.checked = true;
				continue;
			}
			// See if it is a read-only check box
			elc =  document.getElementById(fv[0] + 'CHK_RO');
			if (elc) {
				if (fv[1] == 0)
					elc.src = '/adg/supporting/images/ro_check_off.gif';
				else
					elc.src = '/adg/supporting/images/ro_check_on.gif';
				continue;
			}

		}
		if (el.type == 'hidden') {
			elc = document.getElementById(el.id + 'CHK');
			if (elc){
				if (fv[1] == 0)
					elc.checked = false;
				else
					elc.checked = true;
			}
		}
			
		if (el.type == 'radio')
			el.checked = true;
		if (el.type == undefined){
			el.innerHTML = fv[1];
		}
	}
}

function getFormDataValue(key) {
	for (i=0;i<formDataKeys.length;i++) {
		if (formDataKeys[i] == key)
			return formDataValues[i];
	}
	return false;
}

function ajaxFilterRequest(fieldNameList, fieldTypeList, ct, totRecs, offset, numOfRecs, ajaxFileName, prevParams, prevValues, tagId, session,id)
{
	var fieldNameAr = fieldNameList.split(','); 
	var fieldTypeAr = fieldTypeList.split(','); 
	var fieldValueAr = new Array(ct); 
	var fieldValueList='';
	ajaxCounter = document.getElementById('ajax_counter').value;
	if (id=='go' || id=='first')
	{
		offset=0;
	}

	if (id=='next')
	{
		if ((offset + numOfRecs)>totRecs)
		{
			id = 'last';
		} 
	}

	if (id=='prev')
	{
		offset = offset - (numOfRecs * 2);
		if (offset<0) 
		{
			offset=0;
		}
	}

	if (id=='last')
	{
		offset = (totRecs-numOfRecs);
	}

	for (i=0; i<ct; i++)
	{
		switch (fieldTypeAr[i]){
			case 'D': //DATE
				v = getAVar(fieldNameAr[i],gridAjaxCounter,false);
				fieldValueAr[i]=v;
				fieldValueList = fieldValueList + v + ',';
			break;
			case 'C': //Character
				v = getCVar(fieldNameAr[i],gridAjaxCounter,'',false);
				fieldValueAr[i]=v;
				fieldValueList = fieldValueList + v + ',';
			break;
			case 'I':  //Integer
				v = getIVar(fieldNameAr[i],gridAjaxCounter,false,0,99999999999);
				fieldValueAr[i]=v;
				fieldValueList = fieldValueList + v + ',';

				break;
			case 'N': //Number
				v = getDVar(fieldNameAr[i],gridAjaxCounter,false,0,99999999999);
				fieldValueAr[i]=v;
				fieldValueList = fieldValueList + v + ',';
			break;
			case 'L': //Logical
				v = getLVar(fieldNameAr[i],gridAjaxCounter);
				fieldValueAr[i]=v;
				fieldValueList = fieldValueList + v + ',';
				break;

			
		}
	}

	fieldNameList  = fieldNameList + ',offset,ajax_counter,parent_ajax_counter,ajax_session,' + prevParams;
	fieldValueList = fieldValueList + offset + ',' + ajaxCounter + ',' + tagId + ',' + session + ',' + prevValues;

	myDiv = 'div_' + tagId;
	objectId = 'div_1';
	if (errorMessages())
		return false;
		
	showProcessingDiv('');
	rawSendReq('div_x', ajaxFileName, "ajaxFilterResponse()", 'field,' + fieldNameList, 'filterField,' + fieldValueList );
}

function ajaxFilterResponse()
{
	ajaxFilterDisplay(filterField.value);
	hideProcessingDiv();
}

function ajaxFilterDisplay(text)
{
	var tempText = text;

	if (tempText.indexOf('#*#')>0)
	{
		tempArray = tempText.split('#*#');
		ajaxCounter  = tempArray[0];
		setAjaxCounter(ajaxCounter);
		document.getElementById(myDiv).innerHTML=decodeBase64(tempArray[1]);
	}
	else document.getElementById(myDiv).innerHTML=decodeBase64(text);
	

	//this unsets the value so it will not be posted again when the submit button is pressed
	filterField.value='';
}
/* A series of functions that mirror the PHP type functions in html.inc */
function getCVar(field,gridAjaxCounter,mandatory,case_control) {
	fld = field + '__DUMMY_' + gridAjaxCounter;
	if (!document.getElementById(fld))
		fld = field + '__DUMMY_';

	testvalue = document.getElementById(fld).value.trim();
	if (!mandatory && testvalue == '')
		return '';
	if (mandatory && testvalue == '') {
		label = getLabel(fld);
		generalError(label + ' Must Not Be Blank');
		return '';
	}
	if (case_control == '')
		return testvalue;
	if (case_control == 'U')
		return testvalue.toUpperCase();
	if (case_control == 'L')
		return testvalue.toLowerCase();
}
function getIVar(field,gridAjaxCounter,mandatory,minimum,maximum) {
	
	fld = field + '__DUMMY_' + gridAjaxCounter;
	
	if (!document.getElementById(fld)) {
		fld = field + '__DUMMY_';
	}
	testvalue = document.getElementById(fld).value.trim();
	if (!mandatory && testvalue == '')
		return '';
	label = getLabel(fld);
	intonly = /^([0-9]+)$/;
	if (!intonly.test(testvalue)){
		generalError(label + ' Must Be A Whole Number');
	}
	return testvalue;
	
}
function getDVar(field,gridAjaxCounter,mandatory,minimum,maximum) {
	fld = field + '__DUMMY_' + gridAjaxCounter;
	if (!document.getElementById(fld))
		fld = field + '__DUMMY_';

	testvalue = document.getElementById(fld).value.trim();
	if (!mandatory && testvalue == '')
		return '';
	label = getLabel(fld);
	deconly = /^[-+]?\d*\.?\d*$/;
	if (!deconly.test(testvalue)){
		generalError(label + ' Must Be A Decimal');
	}
	return testvalue;
}

function getLVar(field,gridAjaxCounter) {
	fld = field + '__DUMMY_' + gridAjaxCounter;
	if (!document.getElementById(fld))
		fld = field + '__DUMMY_';

	fld = fld + 'CHK';
	obj = document.getElementById(fld);
	if (obj.checked) {
		//document.write('CHECKED');
		return 1;
	}
	//document.write(obj.id + ' / UNCHECKED!');
	return 0;
}	

function getAVar(field,gridAjaxCounter,mandatory) {
	
	fld = field + '__DUMMY_' + gridAjaxCounter;
	if (!document.getElementById(fld))
		fld = field + '__DUMMY_';

	label = getLabel(fld);
	year=document.getElementById('year_' + fld).value;
	month=document.getElementById('month_' + fld).value;
	day=document.getElementById('day_' + fld).value;
	
	invalid_date = false;
	if (!mandatory && year=='' && month=='' && day=='')
		return '';
	
	v = aVar_month(day);
	if (!v)
		$invalid_date = true;
	else
		day = v;
	v = aVar_day(day);
	if (!v)
		$invalid_date = true;
	else
		day = v;
	v = aVar_year(year);
	if (!v)
		$invalid_date = true;
	else
		year = v;
			
	if (invalid_date) {
		generalError(label + ' Is An Invalid Date');
		return false;
	}
	
	returndate = year + '-' + month + '-' + day
	return returndate;
}
function aVar_day(v) {
	if (v == '')
		v = Date('d');
	if (v.length == 1)
		v = '0' + v;
	
	intonly = /^([0-9]+)$/;
	if (!intonly.test(v))
		return false;
		
	if (v < 1 || v > 31)
		return false;
	return v;
}

function aVar_month(v) {
	if (v == '')
		v = Date('m');
	if (v.length == 1)
		v = '0' + v;
	
	intonly = /^([0-9]+)$/;
	if (!intonly.test(v))
		return false;
		
	if (v < 1 || v > 12)
		return false;
	return v;

}
function aVar_year(v) {
	var d = new Date();
	if (v == '')
		v = d.getFullYear();
	if (v.length==1)
		v = '200' + v;
	if (v.length==2) {
		sv = String(d.getFullYear());
		sv = sv.substr(2);
		if ((v + 100 - sv ) > 20) 
			v  = '19' + v;
		else
			v = '20' + v;
		alert(v);
	}
	intonly = /^([0-9]+)$/;
	if (!intonly.test(v))
		return false;
	return v;
	
}

function getLabel(fld) {
	o = document.getElementById('label_' + fld).innerHTML;
	l = o.split(':');
	label = l[0];
	return label;
}


function generalError(text) {
	adgErrorMessage = adgErrorMessage + '\n + ' + text;
}
function errorMessages() {
	if (adgErrorMessage == '')
		return false;
	text = 'The Operation Could Not Be Completed' + adgErrorMessage;
	alert(text);
	adgErrorMessage = '';
	return true;
}
function printGrid(tag) {

	//document.getElementById('print_' + tag).submit();
	//return false;
	
	var tr = document.getElementById('ajtr_' + tag).value;
	var afn = document.getElementById('ajafn_' + tag).value;
	var pp = document.getElementById('ajpp_' + tag).value;
	var pd = document.getElementById('ajpd_' + tag).value;
	var pv = document.getElementById('ajpv_' + tag).value;
	var fn = document.getElementById('ajfn_' + tag).value;
	var ft = document.getElementById('ajft_' + tag).value;
	var fv = document.getElementById('ajfv_' + tag).value;

	var URL = '&run=' + window.opener.ADG_ROOT_DIR + '/adg/ajax/print_grid.php&tr=' + tr + '&afn=' + afn + '&pp=' + pp  + '&pv=' + pv + '&fn=' + fn + '&ft=' + ft + '&fv=' + fv + '&pd=' + pd;
	openPopup('pgpop','main.php',0,URL, 'printgrid');
}
function exportGrid(tag) {

	//document.getElementById('print_' + tag).submit();
	//return false;
	
	var tr = document.getElementById('ajtr_' + tag).value;
	var afn = document.getElementById('ajafn_' + tag).value;
	var pp = document.getElementById('ajpp_' + tag).value;
	var pd = document.getElementById('ajpd_' + tag).value;
	var pv = document.getElementById('ajpv_' + tag).value;
	var fn = document.getElementById('ajfn_' + tag).value;
	var ft = document.getElementById('ajft_' + tag).value;
	var fv = document.getElementById('ajfv_' + tag).value;

	var URL = '&run=' + window.opener.ADG_ROOT_DIR + '/adg/ajax/export_grid.php&tr=' + tr + '&afn=' + afn + '&pp=' + pp  + '&pv=' + pv + '&fn=' + fn + '&ft=' + ft + '&fv=' + fv + '&pd=' + pd;
	openPopup('pgpop','main.php',0,URL, 'printgrid');
}

// Gets information about text box input
var gtbi_receiver = '';
var gtbi_request_running = false;
function getTextBoxInfo(field,text) {
	if (gtbi_request_running)
		return;
	gtbi_request_running = true;
	gtbi_receiver = field;
	gtbi_field = field + '_gtbihidden';
	boxwidth = document.getElementById(field + '_bwhidden').value;
	maxlines = document.getElementById(field + '_mlhidden').value;

	text = encodeBase64(text);
	rawSendReq(	gtbi_field,
				'/adg/adg/ajax/textbox_info.php',
				'gtbiDataReceiver()',
				'text,boxwidth,maxlines,receiver,ajax_session', 
				text + ',' + boxwidth + ',' + maxlines + ',' + gtbi_field + ',' + SESSION);
}
function gtbiDataReceiver() {
	gtbi_field = gtbi_receiver + '_gtbihidden';
	gtbi_tb    = gtbi_receiver + '_textboxinfo';
	document.getElementById(gtbi_tb).innerHTML = decodeBase64(document.getElementById(gtbi_field).value);
	gtbi_request_running = false;
	
}
	
//Pops up record maintenance information from an inquiry
var grid_fm_anchor_id = '';
var grid_fm_anchor_base = '';
var suppressLCFM = false;
function loadClickFileMaintenance(anchor,table,recid,ajaxCounter) {
	//If LCFM is suppressed, set flag and return
	if (suppressLCFM) {
		suppressLCFM = false;
		return;
	}
	r = 'iicon_' + ajaxCounter;
	//Can only look at file maintenance information if the element is closed up
	if (document.getElementById(r)) {
		d = document.getElementById(r);
		if (d.className == 'iicon_open')
			return true;
	}
	
	grid_fm_anchor_id = anchor;
 	rawSendReq(	'div_fm_data',
				'/adg/adg/ajax/inquiry_getmaintenance.php',
				'fmDataReceiver()',
				'anchor,table,recid,ajax_session', 
				anchor + ',' + table + ',' + recid + ',' + SESSION);
}
function loadFileMaintenance(anchor,table,recid) {
	grid_fm_anchor_id = anchor;
	rawSendReq(	'div_fm_data',
				'/adg/adg/ajax/inquiry_getmaintenance.php',
				'fmDataReceiver()',
				'anchor,table,recid,ajax_session', 
				anchor + ',' + table + ',' + recid + ',' + SESSION);
}

function fmDataReceiver() {
	text = decodeBase64(document.getElementById('div_fm_data').value);
	xtext = decodeBase64(document.getElementById('fm_data').value);
	//alert(text);
	text = '<div>' + text + '</div>'; 
	return overlib(text, CSSCLASS,BGCLASS,'gridpopb',FGCLASS,'gridpopf',ANCHOR,grid_fm_anchor_id,ANCHORX,0,ANCHORY,18,WIDTH,225,DELAY,500,TIMEOUT,4000);
}
function autoOpenChooser(anchor_id,element,auto_open,script) {
	text = 'Changes made here will take effect when inquiry is reloaded.<p>';
	movetext = '<input type=radio name=aocradio onClick=moveAOC(this.value,' + element + ',\'' + script + '\')';

	text = text + '<input type=checkbox name=aoc';
	if (auto_open == 1)
		text = text + ' checked';
	
	text = text + ' onClick=saveAOC(this.checked,' + element + ',\'' + script + '\')> Auto-Open This Set<P>';
	text = text + movetext + ' value=T> Move Set to top<br>';
	text = text + movetext + ' value=U> Move Set up one<br>';
	text = text + movetext + ' value=D> Move Set down one<br>';
	text = text + movetext + ' value=B> Move Set to Bottom<br>';

	text = '<div style=\'height:200px;width:200px;\'>' + text + '</div>'; 
	return overlib(text, CSSCLASS,BGCLASS,'gridpopb',FGCLASS,'gridpopf',CLOSECLICK, CLOSETEXT,'X',CAPTIONFONTCLASS,'gridpoptcap',CLOSEFONTCLASS,'gridpopt',CAPTION,'Data Set Options', STICKY, ANCHOR,anchor_id,ANCHORX,-200,ANCHORY,10,TIMEOUT,10000,HEIGHT,98,WIDTH,200);
}
function saveAOC(value,element,script) {
	rawSendReq(	'div_fm_data',
				'/adg/adg/ajax/inquiry_setaodata.php',
				'fmDataReceiver()',
				'value,element,script,ajax_session', 
				value + ',' + element + ',' + script + ',' + SESSION);
	return false;

}
function moveAOC(value,element,script) {
	rawSendReq(	'div_fm_data',
				'/adg/adg/ajax/inquiry_moveaodata.php',
				'fmDataReceiver()',
				'value,element,script,ajax_session', 
				value + ',' + element + ',' + script + ',' + SESSION);
	return false;

}
function showAjaxAdvancedGroup(anchor_id,data_id) {
	text = document.getElementById(data_id).innerHTML;
	text = '<div style=\'width:400px;\'>' + text + '</div>'; 
	return overlib(text, CSSCLASS,BGCLASS,'gridpopb',FGCLASS,'nav_bar',CLOSECLICK, CLOSETEXT,'X',CAPTIONFONTCLASS,'gridpoptcap',CLOSEFONTCLASS,'gridpopt', STICKY, CENTERPOPUP, CAPTION,'Advanced Options', HEIGHT,98,WIDTH,400);
}
////////////////////////////////////////////////////////////////////
// Functions for a simple popover ajax search form
//////////////////////////////////////////////////////////////////////
function ajaxSearchForm (myname) {
	this.loader_program = '/adg/adg/ajax/load_search.php';
	this.matcher_program = ''; // must be set manually set, no default
	this.table = ''; // must be set manually set, no default
	this.tableInd = ''; // must be set manually set, no default
	this.return_fields = ''; // must be set manually set, no default
	this.parent_fields = new Array(); //must be manually set, no default
	this.title = 'Search Function';
	this.height = 400;
	this.width = 630;
	this.internal_width = this.width - 2;
	this.internal_height = this.height - 22;
	this.field_type = 'C';
	this.show_match_all = 0;
	this.show_match_exact = 0;
	this.show_search_text = 1;
	this.prev_microtime = 0;

	this.myname = myname;
	this.lStartT = false;
	this.match_timer = false;
	this.first_focus = true;
	this.prev_st_value = '#$#';
	date = new Date();
	this.search_fields = 'match_text';
	this.debug = 'debug_' + myname;
	this.search_result = 'search_result_' + myname;
	this.match_all_field = 'match_all';
	this.match_exact_field = 'match_exact';
	this.wrapper_div = 'wrapper_div_' + myname;
	this.data_receiver = myname + '.dataReceiver()';
	this.get_search_matches = myname + '.getSearchMatches()';
	this.start_searcher = myname + '.startSearcher()';
	this.result_receiver = myname + '.resultReceiver()';
	this.data_return = myname + '.dataReturn'; //no parentheses
	this.load_response_div = myname + '_ajax_load_response_data';
	document.write('<div style="display:none;" id=' + this.load_response_div + '></div>');
	this.search_response_div = myname + '_ajax_search_response_data';
	document.write('<div style="display:none;" id=' + this.search_response_div + '></div>');

	//document.write('<textarea style="text-align:right;height:200px;width:200px;" id=' + this.debug + '>DEBUG WINDOW</textarea>');
	
	
	this.loadSearchForm = function(obj) {
		var e = document.getElementById(obj).src.split('/');
		var f = e[e.length - 1];
		if (f=='empty.gif') return;
		
		this.internal_width = this.width - 2;
		this.internal_height = this.height - 22;
		this.first_focus = true;
		if (this.match_timer)
			this.stopSearcher();
		this.lStartT = false;
		this.prev_st_value = '#$#';
		
		match_fields = ',search_text';
		match_values = ',';


		if (this.matcher_program == '') {
			alert('mandatory variable matcher_program not set');
			return;
		}
		if (this.table == '') {
			alert('mandatory variable table not set');
			return;
		}
		if (this.return_fields == '') {
			alert('mandatory array return_fields not set');
			return;
		}
		if (this.width < 350) {
			alert('this.width must not be less than 350');
			return;
		}
		search_fields = this.search_fields.replace(/,/g,'|');
		this.write_debug(this.search_fields);
		
		data = this.getSearchCriteria('lsf');
		match_fields = data[0];
		match_values = data[1];
		curr_st_value = data[2];
		
		data = this.getExtraCriteria();
		extra_fields = data[0];
		extra_values = data[1];

		document.body.style.cursor='wait';
		this.write_debug('START EF[' + extra_fields + '],MF[' + match_fields + ']');
		this.write_debug('STARTEV[' + extra_values + '],MV[' + match_values + ']');

		rawSendReq(this.load_response_div,this.loader_program,this.data_receiver,'search_fields,search_result,search_height, search_width, show_match_all, show_match_exact, show_search_text, match_all_field, match_exact_field, load_response_div, search_description, ajax_session,' + extra_fields + ',' + match_fields, search_fields + ',' + this.search_result + ',' + this.internal_height + ',' + this.internal_width + ',' + this.show_match_all + ',' + this.show_match_exact + ',' + this.show_search_text + ',' + this.match_all_field + ',' + this.match_exact_field + ',' + this.load_response_div + ',' + this.search_description + ',' + SESSION + ',' + extra_values + ',' + match_values);

	}
	this.dataReceiver = function () {
		text = decodeBase64(document.getElementById(this.load_response_div).value);
		text = '<div class=asearch_wrapper id=' + this.wrapper_div + ' style="width:' + this.internal_width + 'px;height:' + this.height + 'px;">' + text + '</div>'; 
		overlib(text, CSSCLASS,BGCLASS,'asearch_bg',FGCLASS,'asearch_fg', CAPTIONFONTCLASS,'asearch_caption', CLOSEFONTCLASS,'asearch_close', HEIGHT,this.internal_height,WIDTH,this.width,CENTERPOPUP,CAPTION,this.title,STICKY,CLOSECLICK,CLOSETEXT, 'X');
		document.body.style.cursor='pointer';

		this.startSearcher();
	}
	// Starts timer looking for changes in search text which is in the overlib popup
	this.startSearcher = function() { 
		if (this.lStartT) return;
		//this.prev_microtime = this.microtime(true);
		this.match_timer = setInterval(this.get_search_matches,300);
		this.lStartT = true;
	}
	// Stops timer
	this.stopSearcher = function() { 
		this.lStartT = false;
		clearInterval(this.match_timer);
	}
	// Extracts typed in search criteria
	this.getSearchCriteria = function(src) {
		
		objlist = new Array();
		i = 0;
		st_value = '';
		if (this.search_fields.search(',') > -1) {

			o = this.search_fields.split(',');
			for (i=0;i<o.length;i++){
				var obj = document.getElementById(o[i]);
				if (!obj)
					continue;
				objlist[i] = o[i];
				
			}
			

		} else {	
			var obj = document.getElementById(this.search_fields); 
			objlist[0] = this.search_fields;
		}
		if (src == 'lsf') {
			var data = new Array();
			data[0] = '';
			data[1] = '';
			data[2] = '';
			return data;
		}
		//this.write_debug(this.search_fields);
		for (i=0;i<objlist.length;i++) {
			var obj = document.getElementById(objlist[i]);
			if (obj){
				val = obj.value.toUpperCase().trim();
				if (val == '' && this.first_focus) {
					this.first_focus = false;
					obj.focus();
				}
				if (obj.type == 'checkbox'){
					if (obj.checked)
						val = 1;
					else
						val = 0;
				}
				if (i < objlist.length - 1)
					var st_value = st_value + val + '|';
				else
					var st_value = st_value + val;

			} else if (i < objlist.length - 1) 
				var st_value = st_value.trim() + '|';

		}
		match_fields = this.search_fields;
		match_values = st_value.replace(/\|/g,',');
		tmatch_all = 1;
		tmatch_exact = 1;
		if (this.show_match_all && document.getElementById(this.match_all_field))
			tmatch_all = document.getElementById(this.match_all_field).checked?1:0;
		if (this.show_match_exact && document.getElementById(this.match_exact_field))
			tmatch_exact = document.getElementById(this.match_exact_field).checked?1:0;
		
	    curr_st_value = st_value + '|' + tmatch_all + '|' + tmatch_exact;
		
		var data = new Array();
		data[0] = match_fields;
		data[1] = match_values;
		data[2] = curr_st_value;
		return data;
	}
	this.getExtraCriteria = function() {
		extra_fields = '';
		extra_values = '';
		
		for (i=0;i<this.parent_fields.length;i++) {
			f = this.parent_fields[i] + '_' + this.table +'_';
	
			if (!document.getElementById(f))
			{
				if (!document.getElementById(this.parent_fields[i])) continue;
				else f = this.parent_fields[i];
			}
	
			//if (i == 0) {
			//	extra_fields = this.parent_fields[i];
			//	extra_values = escape(document.getElementById(f).value);
			//} else {
			extra_fields = extra_fields + ',' + this.parent_fields[i];
			extra_values = extra_values + ',' + escape(document.getElementById(f).value);
			//}
		}
		//extra_values = escape(extra_values);
		this.write_debug(extra_fields + '|' + extra_values);
		data = new Array();
		data[0] = extra_fields;
		data[1] = extra_values;
		return data;
	}
	// Fires ajax routine which looks for matching records
	this.getSearchMatches = function() {
		// o3_showingsticky is defined in overlib.js and is set when cClick hides the window
		if (o3_showingsticky == 0) {
			
			this.stopSearcher();
			return;
		}
		
		data = this.getSearchCriteria('');
		match_fields = data[0];
		match_values = data[1];
		curr_st_value = data[2];
		
		if (curr_st_value == this.prev_st_value) return;
		/* has the value changed, but we are less than 200ms apart, assume 
		   that someone is  typing and delay the search to prevent multiple
		   inquiries
		 */
		 curr_microtime = this.microtime(true);
		 if (curr_microtime - this.prev_microtime < 1) {
 			document.getElementById('searching_icon').src = '/adg/supporting/images/empty.gif';
			return;
		}
		this.prev_microtime = curr_microtime;
		this.prev_st_value = curr_st_value;
		
		data = this.getExtraCriteria();
		extra_fields = data[0];
		extra_values = data[1];
		
		document.body.style.cursor='wait';
		if (document.getElementById('searching_icon')) {
			document.getElementById('searching_icon').src = '/adg/supporting/images/search_activity.gif';
		}
		this.write_debug('EF[' + extra_fields + '],[' + match_fields + ']');
		this.write_debug('EV[' + extra_values + '],[' + match_values + ']');
		rawSendReq(this.search_response_div,this.matcher_program,this.result_receiver,' match_all, match_exact, inner_width, data_return, search_response_div, ajax_session,' + extra_fields + ',' + match_fields,  tmatch_all + ',' + tmatch_exact + ',' + this.internal_width + ',' + this.data_return + ',' + this.search_response_div + ',' + SESSION + ',' + extra_values + ',' + match_values);
	}
	// Receives response from matching records	
	this.resultReceiver = function() {
		text = decodeBase64(document.getElementById(this.search_response_div).value);
		document.getElementById(this.search_result).innerHTML = text;
		document.body.style.cursor='pointer';
		if (document.getElementById('searching_icon')) {
			document.getElementById('searching_icon').src = '/adg/supporting/images/empty.gif';
		}


	}
	// Write data back to the necessary fields
	this.dataReturn = function(val) {
		val = decodeBase64(val);
		vals = val.split('|');
		for (i=0;i<vals.length;i++) {
			f = this.return_fields[i] + '_' + this.table + '_' + this.tableInd;
			
			if (!document.getElementById(f)) {
				//alert('programmer error, trying to return data to non-existent field ' + f);
				continue;
			}
			
			document.getElementById(f).value = vals[i];
			if (i==0) document.getElementById(f).focus(); 
		}
	}
	this.microtime = function(get_as_float) {
		// Returns either a string or a float containing the current time in seconds and microseconds  
		// 
		// version: 1008.1718
		// discuss at: http://phpjs.org/functions/microtime    // +   original by: Paulo Freitas
		// *     example 1: timeStamp = microtime(true);
		// *     results 1: timeStamp > 1000000000 && timeStamp < 2000000000
		var now = new Date().getTime() / 1000;
		var s = parseInt(now, 10); 
		return (get_as_float) ? now : (Math.round((now - s) * 1000) / 1000) + ' ' + s;
	}
	this.write_debug = function(text) {
		if (document.getElementById(this.debug))
		  document.getElementById(this.debug).value = text + '\n' + document.getElementById(this.debug).value;
	}
}

//FMS Search Function

function getGLDescription(obj)
{
    obj.value = obj.value.toUpperCase();
	rawSendReq('','/adg/fms/gl/ajax/gb810_match_text.php','glDescriptionRecordReceiver()','id,value,ajax_session', obj.id + ',' + obj.value + ',' + SESSION);   
}

function glDescriptionRecordReceiver()
{ 
	formRecordReceiver('gl_ajax_response_data');
}

function getStockDesc(obj)
{
    obj.value = obj.value.toUpperCase();
	rawSendReq('','/adg/fms/ic/ajax/ic810_match_text.php','stockDescRecordReceiver()','id,value,ajax_session', obj.id + ',' + obj.value + ',' + SESSION);   
}

function stockDescRecordReceiver()
{ 
	formRecordReceiver('stock_gmts_data');
}

function getJobDesc(obj)
{
    obj.value = obj.value.toUpperCase();
	rawSendReq('','/adg/fms/jb/ajax/jb810_match_text.php','jobDescRecordReceiver()','id,value,ajax_session', obj.id + ',' + obj.value + ',' + SESSION);   
}

function jobDescRecordReceiver()
{ 
	formRecordReceiver('job_gmts_data');
}

function getVendName(obj)
{
    obj.value = obj.value.toUpperCase();
	rawSendReq('','/adg/fms/ap/ajax/ap810_match_text.php','vendNameRecordReceiver()','id,value,ajax_session', obj.id + ',' + obj.value + ',' + SESSION);   
}

function vendNameRecordReceiver()
{ 
	formRecordReceiver('vend_gmts_data');
}

function getCustName(obj)
{
    obj.value = obj.value.toUpperCase();
	rawSendReq('','/adg/fms/ar/ajax/ar810_match_text.php','custNameRecordReceiver()','id,value,ajax_session', obj.id + ',' + obj.value + ',' + SESSION);   
}

function custNameRecordReceiver()
{ 
	formRecordReceiver('cust_gmts_data');
}

function getUserName(obj)
{
    obj.value = obj.value.toUpperCase();
	rawSendReq('','/adg/fms/gl/ajax/gb805_match_text.php','userNameRecordReceiver()','id,value,ajax_session', obj.id + ',' + obj.value + ',' + SESSION);   
}

function userNameRecordReceiver()
{ 
	formRecordReceiver('user_gmts_data');
}

function getPOName(obj)
{ 
    obj.value = obj.value.toUpperCase();
	rawSendReq('','/adg/fms/po/ajax/po810_match_text.php','poNameRecordReceiver()','id,value,ajax_session', obj.id + ',' + obj.value + ',' + SESSION);   
}

function poNameRecordReceiver()
{ 
	formRecordReceiver('po_gmts_data');
}

if (!document.getElementById('ajax_error')) 
	document.write('<div id=ajax_error></div>');

if (!document.getElementById('gl_ajax_response_data')) 
	document.write('<input id=gl_ajax_response_data type=hidden>');

if (!document.getElementById('employee_ajax_response_data')) 
	document.write('<input id=employee_ajax_response_data type=hidden>');

if (!document.getElementById('typecode_ajax_response_data')) 
	document.write('<input id=typecode_ajax_response_data type=hidden>');

if (!document.getElementById('bucket_ajax_response_data')) 
	document.write('<input id=bucket_ajax_response_data type=hidden>');

if (!document.getElementById('cust_gmts_data')) 
	document.write('<input id=cust_gmts_data type=hidden>');

if (!document.getElementById('vend_gmts_data')) 
	document.write('<input id=vend_gmts_data type=hidden>');

if (!document.getElementById('job_gmts_data')) 
	document.write('<input id=job_gmts_data type=hidden>');

if (!document.getElementById('stock_gmts_data')) 
	document.write('<input id=stock_gmts_data type=hidden>');

if (!document.getElementById('user_gmts_data')) 
	document.write('<input id=user_gmts_data type=hidden>');

if (!document.getElementById('po_gmts_data')) 
	document.write('<input id=po_gmts_data type=hidden>');
