// template.js for ShipRX

/********************
 *
 *	JAVASCRIPT_STD_AJAX.JS
 *	Standard/generic javascript AJAX libraries for ITC
 * 
********************/


// Is IE flag
IsMSIE = navigator.appVersion.indexOf('MSIE') != -1;

// 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);
}


// GETS THE NAME OF SCRIPT/PAGE FROM A URL
function getScriptName(OverrideURL, IncludeQueryStr) {
	UseURL         = (OverrideURL)?OverrideURL:document.location.href;
	UseURL         = UseURL.replace(/#.*/, '');
	QueryStrExists = UseURL.indexOf('?') != -1;
	
	QueryStr = '';

	if (QueryStrExists) {
		QueryStr = UseURL.substr(UseURL.indexOf('?'));
		UseURL   = UseURL.substr(0, UseURL.indexOf('?'));
	}
		
	if (!QueryStrExists || IncludeQueryStr)
		return UseURL.substr(UseURL.lastIndexOf('/')+1) + QueryStr;	
	
	else if (QueryStrExists)
		return UseURL.substr(UseURL.lastIndexOf('/')+1);
}


// CONVERTS FORM DATA TO GET STRING
function convertFormDataToGETStr(formObj, AlternateParentElmntForFields) { 
		
	POSTDataArray = new Array();
	
	// Loop through form fields
	AltCounter = 0;
	ElmntsList = '';
	
	if (AlternateParentElmntForFields)
		LoopInObjectsArray = new Array(formObj.elements,
					       AlternateParentElmntForFields.getElementsByTagName('input'),
					       AlternateParentElmntForFields.getElementsByTagName('textarea'),
					       AlternateParentElmntForFields.getElementsByTagName('select')
					      );

	else
		LoopInObjectsArray = new Array(formObj.elements);
	
 	for (var i in LoopInObjectsArray) {
	
		for (var j = 0; j < LoopInObjectsArray[i].length; j++) {
			
			Elmnt = LoopInObjectsArray[i][j];
	
			Name  = '';
			Value = '';
			
			if (!Elmnt.disabled) {
			
				// Submit different information for various types of fields...
				switch (Elmnt.type) {
					
					// "Normal" field
					default:
						Name  = Elmnt.name;
						Value = Elmnt.value;
					break;
					
					// Radio
					case 'radio':
						if (Elmnt.checked) {
							Name  = Elmnt.name;
							Value = Elmnt.value;
						}
					break;
					
					// Checkbox
					case 'checkbox':
						Name  = Elmnt.name;
						Value = (Elmnt.checked)?Elmnt.value:'';
					break;
				}
				
				if (Name != '' && Name != 'undefined' && Name != undefined && Name != 'null' && Name != null) {
					POSTDataArray[AltCounter] = encodeURIComponent(Name) + '=' + encodeURIComponent(Value);
					AltCounter++;
				}
			}
		}
	}
	
	return POSTDataArray.join('&');
}

// RESETS ERROR OUTPUT LABEL FIELDS TO ORIGINAL CLASSNAMES
function resetErrorOutputClassNames(InvalidClassName, ValidClassName, MasterTagName) {
	TagObjs = document.getElementsByTagName(MasterTagName);
	for (i in TagObjs) {
		if (TagObjs[i].className == InvalidClassName)
			TagObjs[i].className = ValidClassName;
	}
}

// GENERATES A DIV CONTAINING A "PLEASE WAIT..." MESSAGE
function generateWaitDiv(OverrideText, GenerateOnlyDisableDiv, DoNotGenerateDisableDiv, CustomCSSArray, OverrideInnerHTML, DoNotAnimate) {

	if (!GenerateOnlyDisableDiv) {
		var NewDiv = document.createElement('div');
	
		if (!OverrideInnerHTML)
			var ContainedText = document.createTextNode(((OverrideText)?OverrideText:'Please Wait') + '...');
		
		with (NewDiv.style) {
			width         = '180px';
			position      = 'absolute';
			border        = '1px solid #BCBCFF';
			background    = '#EFEFFF';
			fontWeight    = 'bold';
			textAlign     = 'center';
			verticalAlign = 'middle';
			paddingTop    = '20px';
			paddingBottom = '20px';
			zIndex        = '1';
			
			// Override CSS...
			if (typeof CustomCSSArray == 'object') {
				for (CSSDirective in CustomCSSArray)
					eval(CSSDirective + ' = \'' + CustomCSSArray[CSSDirective] + '\'');
			}		
			
			ScrollTop = (IsMSIE)?document.body.scrollTop:document.documentElement.scrollTop;
			
			left = (getWindowDimension('x')/2) - ((parseInt(width)+20)/2) + 'px';
			top  = String(ScrollTop + parseInt((getWindowDimension('y')/2) -
			       (parseInt(paddingTop) + parseInt(paddingBottom)+10))) + 'px';
		}
		
		NewDiv.setAttribute('id', 'WaitDiv');
		
		if (!OverrideInnerHTML)
			NewDiv.appendChild(ContainedText);
	}	
	
	if (!DoNotGenerateDisableDiv) {
		var NewDisableDiv = document.createElement('div');
		
		with (NewDisableDiv.style) {
			top      = '0px';
			left     = '0px';
			width    = '100%';
			position = 'absolute';
		}
		
		NewDisableDiv.style.height = document.body.scrollHeight + 'px';
	}
	
	NewDisableDiv.setAttribute('id', 'DisableDiv');
	
	if (!GenerateOnlyDisableDiv) {
		if (OverrideInnerHTML)
			NewDiv.innerHTML = OverrideInnerHTML;

		document.body.appendChild(NewDiv);
	}
	
	document.body.appendChild(NewDisableDiv);
}


// DELETES WAIT DIV
function deleteWaitDiv(GenerateOnlyDisableDiv) {
	if (!GenerateOnlyDisableDiv)
		document.body.removeChild(document.getElementById('WaitDiv'));
	
	document.body.removeChild(document.getElementById('DisableDiv'));
}


// GETS WINDOW DIMENSIONS
function getWindowDimension(Dim) {
	if (Dim == 'x')
		return (IsMSIE)?document.body.offsetWidth:window.innerWidth;
	else
		return (IsMSIE)?document.body.offsetHeight:window.innerHeight;
}

// PROCESSES AND OUTPUT FORM ERRORS
function outputFormErrors(formObj, formErrStrFromAJAX, ErrorOutputContainer) {
	
	// Error string is valid
	if (formErrStrFromAJAX.substr(0, 11) == 'FormErrors:') {
	
		ErrorOutput        = '';
		PipeExists         = formErrStrFromAJAX.match(/\|/);
		formErrStrFromAJAX = formErrStrFromAJAX.substring(11, formErrStrFromAJAX.length);
		formErrArray       = (PipeExists)?formErrStrFromAJAX.split('|'):Array(formErrStrFromAJAX);
		
		ErrorFieldsArray_array = new Array();
		
		for (var i in formErrArray) {
			SplitCharAt      = formErrArray[i].indexOf('=');
			ErrorFields      = formErrArray[i].substr(0, SplitCharAt);
			ErrorFieldsArray = (ErrorFields.indexOf(',') != -1)?ErrorFields.split(','):new Array(ErrorFields);
			ErrorOutput_tmp  = formErrArray[i].substr(SplitCharAt+1);
			
			if (ErrorOutput_tmp != '')
				ErrorOutput += '<li>' + ErrorOutput_tmp + '</li>';
	
			for (var j in ErrorFieldsArray) {
				try {
					document.getElementById(ErrorFieldsArray[j]).className = 'FieldLabel_Invalid';
				}
				catch (error) {
					//alert('Error with field: ' + ErrorFieldsArray[j] + '\n\n' + error.description);
				}
			}
			
			ErrorFieldsArray_array.push(ErrorFieldsArray);
		}
		
		ErrorOutputContainer.innerHTML = '<b>The form could not be processed for the following reasons...</b><ul>' + ErrorOutput + '</ul>';
		
		//document.location.href = '#';
	}
	else
		alert(formErrStrFromAJAX);
}


// RESETS ERROR OUTPUT LABEL FIELDS TO ORIGINAL CLASSNAMES
function resetErrorOutputClassNames(InvalidClassName, ValidClassName, MasterTagName) {
	TagObjs = document.getElementsByTagName(MasterTagName);
	for (i in TagObjs) {
		if (TagObjs[i].className == InvalidClassName)
			TagObjs[i].className = ValidClassName;
	}
}