/********************
 *
 *	JAVASCRIPT_STD_AJAX.JS
 *	Standard/generic javascript AJAX libraries for ITC
 * 
********************/


// CREATES AJAX CONNECTION
// VOID()
function AJAX_initConn() {
	
	// Open IE connection
	if (navigator.appName == 'Microsoft Internet Explorer')
		AJAXHTTPObj = new ActiveXObject("Microsoft.XMLHttp");
	
	// Open connection for any other browser
	else
		AJAXHTTPObj = new XMLHttpRequest;
	
	// Return object
	return AJAXHTTPObj;
}

AJAX_initConn();


// SENDS A GET REQUEST
// (STRING url, BOOL use GET/POST [0 = POST, 1 = GET], OBJ ajax http object [leave blank to use default])
function AJAX_sendRequest(UseGET, url, EvalCodeFromResponse, EvalCodeAfterOpen, GETVarStrForPostSubmit, Alt_AJAXHTTPObj) {
	
	// Which HTTP obj to use?
	UseAJAXHTTPObj = (Alt_AJAXHTTPObj)?Alt_AJAXHTTPObj:AJAXHTTPObj;

	// Generate URL
	if (url.indexOf('?') == 0)
		url = getScriptName() + url;
	
	// Make sure AJAX conn. obj is set
	if (typeof UseAJAXHTTPObj != "undefined") {
		
		// Sending POST request - split the URL
		if (!UseGET) {
			url_array = url.split('?');
			url       = url_array[0] + ((GETVarStrForPostSubmit)?'?' + GETVarStrForPostSubmit:'');
			QueryStr  = url_array[1];
		}
		else
			QueryStr = null;
		
		// Open GET connection and send NULL to start server-side processing...
		UseAJAXHTTPObj.open((UseGET)?'GET':'POST', url, true);
		
		if (EvalCodeAfterOpen)
			eval(EvalCodeAfterOpen);
		
		if (!UseGET)
			AJAXHTTPObj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		
		UseAJAXHTTPObj.send(QueryStr);
		
		// On state change, check for ready state and return response text (if any)
		UseAJAXHTTPObj.onreadystatechange = function() {
			if (UseAJAXHTTPObj.readyState == 4) {
				VarForResponseText = UseAJAXHTTPObj.responseText;
				if (EvalCodeFromResponse != null)
					eval(EvalCodeFromResponse);
				else
					return VarForResponseText;
	
				return;
			}	
		}
	}
}


// SUBMITS A PVR FORM VIA AJAX
// (OBJ form object, STRING id of error container
function submitFormViaAJAX(FormObj, FormErrorContainerObjID, EvalElseCode, Debug) {

	generateWaitDiv();
	resetErrorOutputClassNames();
	
	ScriptNameArray = String(getScriptName(null, true)).split('?');
	ScriptName      = ScriptNameArray[0];
	GETStr          = ScriptNameArray[1];
	

	EvalElseCodeOrig = EvalElseCode;
	EvalElseCode  = "if (VarForResponseText != '' && VarForResponseText.substr(0,7) != 'OUTPUT:') { alert(VarForResponseText); }"; 
	
	if (!EvalElseCodeOrig && window.opener != null) {
		if (window.opener.OpenerRefreshURL != undefined)
			EvalElseCode +=
			"else { generateMainOutput('window.opener', window.opener.OpenerRefreshURL, " +
			"'setTimeout(\\'window.close()\\', 0);', true); }";
		
		else if (fetchGETVar('CancelOpenerRefresh'))
			EvalElseCode += "else { setTimeout('window.close()', 0); }";
		
		else
			EvalElseCode += "else { window.opener.history.go(0); setTimeout('window.close()', 0); }";
	}
	
	else {
		EvalElseCode += ' else { ' + EvalElseCodeOrig + ' }';
	}
	
	AJAX_sendRequest(false,
	
	ScriptName + '?formSubmitted=true&' + convertFormDataToGETStr(FormObj),
	
	'deleteWaitDiv(); ' + ((Debug)?'alert(VarForResponseText); ':"if (VarForResponseText.substr(0,11) == 'FormErrors:') {" +
	"outputFormErrors(document.FormObj, VarForResponseText, document.getElementById('" + FormErrorContainerObjID + "'));" +
	"} else { " + EvalElseCode + " }"),
	
	'',
	
	GETStr);
}


// TOGGLES VISIBILITY OF ALL SELECT MENUS
function toggleSelectMenuVisibility(OnlyForIE, OverrideVisibility) {
	if (navigator.appName == "Microsoft Internet Explorer" || !OnlyForIE) {
		for (i = 0; i < document.forms.length; i++) {
			for (j = 0; j < document.forms[i].elements.length; j++) {
				Obj       = document.forms[i].elements[j];
				ElmntType = Obj.type;
	
				if (ElmntType == "select-one" || ElmntType == "select-multiple") {					
					if (OverrideVisibility)
						Obj.style.visibility = OverrideVisibility;
					else {
						NoVisibility = (document.forms[i].elements[j].style.visibility == "")?true:false;
						Obj.style.visibility = (NoVisibility)?'hidden':'visible';
					}
				}
			}
		}
	}
}


// CALLS AN INSTANCE OF A SCRIPT THAT GENERATES OUTPUT (assumes a present AJAX connection)
function generateMainOutput(OverrideTargetBaseStr, OverrideScriptName, ExecExtraCode, DoNotLoadWaitingDiv) {
	
	if (!DoNotLoadWaitingDiv)
		generateWaitDiv('Loading');

	UseScript    = (OverrideScriptName)?OverrideScriptName:JS_appendQueryStr(document.location.href, 'GenerateMainOutput=true');
	OpenerRefreshURL = UseScript;

	AJAX_sendRequest(true,
 	
	UseScript,
	
	((OverrideTargetBaseStr)?OverrideTargetBaseStr + '.':'') + 'document.getElementById(\'MainOutputContainer\').innerHTML = ' +
	((OverrideTargetBaseStr)?OverrideTargetBaseStr + '.':'') + 'convertSpecialCharsForAJAX(VarForResponseText); ' +
	((DoNotLoadWaitingDiv)?'':'deleteWaitDiv();') + ((typeof ExecExtraCode != 'undefined')?ExecExtraCode:''),
	
	"AJAXHTTPObj.setRequestHeader('Content-Type', 'text/html; charset=UFT-8')");
}


// EXECUTES AN ACTION ON A DB
function execAction(ConfirmText, ScriptURI, EvalExtraCode, OverrideMainOutputURL) {
	execAction_Confirm = (ConfirmText)?confirm(ConfirmText):true;
	
	if (execAction_Confirm) {
		generateWaitDiv();
		
		AJAX_sendRequest(true, ScriptURI,
		
		'if (VarForResponseText != \'\') { alert(VarForResponseText); } deleteWaitDiv(); generateMainOutput(\'\', \'' +
		OverrideMainOutputURL + '\'); ' + ((typeof EvalExtraCode != 'undefined')?EvalExtraCode:''));
	}
}


// GETS THE NUMBER OF DAYS IN THE MONTH FOR SPECIFIED FIELDS
function getDaysInMonth(ExecExtraCodeOnSuccess) {
	generateWaitDiv('Populating Dates');
	
	MonthsArray = new Array();
	YearsArray  = new Array();
	
	for (var i in DateInitObjsArray) {
		var MonthObj = document.getElementById(DateInitObjsArray[i] + '_month_ID');
		var YearObj  = document.getElementById(DateInitObjsArray[i] + '_year_ID');
		
		MonthsArray.push(MonthObj[MonthObj.selectedIndex].value);
		YearsArray.push(YearObj[YearObj.selectedIndex].value);
	}
	
	AJAX_sendRequest(true,
	JS_HTTPROOT + '/other_includes/ajax_get_days_in_month.php?MonthsList=' + MonthsArray.join('|') + '&YearsList=' + YearsArray.join('|'),
	"if (VarForResponseText.substr(0,7) == 'OUTPUT:') { setDaysInMonth(VarForResponseText.substr(7)); " + ExecExtraCodeOnSuccess + "} " +
	"else { alert(VarForResponseText); } deleteWaitDiv()");
}

// SUB-FUNCTION TO ACTUALLY SET THE DAYS
function setDaysInMonth(DaysForFields) {
	DaysForFieldsArray = DaysForFields.split('|');
	
	for (var i in DateInitObjsArray) {
		var DayObj = document.getElementById(DateInitObjsArray[i] + '_day_ID');
		SetLength  = (DayObj.length)?1 + parseInt(DaysForFieldsArray[i]):DaysForFieldsArray[i];
		j          = (DayObj.length)?1:0;
		
		DayObj.length = SetLength;
		
		ValueCounter = 1;
		while (j < SetLength) {
			DayObj[j].value = JS_addLeadingZero(ValueCounter);			
			DayObj[j].text  = JS_addLeadingZero(ValueCounter);
			
			j++;
			ValueCounter++;
		}
		
		if (DateValuesArray[i] != '') {
			ThisDay = DateValuesArray[i].substr(6, 2);
	 		DayObj.selectedIndex = ((ThisDay.substr(0, 1) == '0')?ThisDay.substr(1):ThisDay);
	 	}
	}
}
