// Javascript for CanTrustRX Upload DB tool

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;
			}	
		}
	}
}


// GENERATES A DIV CONTAINING A "PLEASE WAIT..." MESSAGE
function generateWaitDiv(OverrideText, DoNotGenerateDisableDiv, CustomCSSArray, OverrideInnerHTML, DoNotAnimate) {

	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] + '\'');
		}		
		
		left = (getWindowDimension('x')/2)-((parseInt(width)+20)/2) + 'px';
		top  = String(parseInt(document.body.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';
			
			if (IsMSIE) {
				background = "url('/images/space.gif')";
				toggleSelectMenuVisibility(true, 'hidden');
			}
		}
		
		NewDisableDiv.style.height = String(document.body.scrollHeight) + 'px';
	}
	
	NewDisableDiv.setAttribute('id', 'DisableDiv');
	
	if (OverrideInnerHTML)
		NewDiv.innerHTML = OverrideInnerHTML;
	
	document.body.appendChild(NewDiv);
	document.body.appendChild(NewDisableDiv);
	
// 	if (!DoNotAnimate)
// 		WaitAnimateInterval = setInterval(animateProgressThingy, 333);
}


// DELETES WAIT DIV
function deleteWaitDiv() {
	document.body.removeChild(document.getElementById('WaitDiv'));
	document.body.removeChild(document.getElementById('DisableDiv'));
	toggleSelectMenuVisibility(true, 'visible');
	
// 	if (typeof WaitAnimateInterval != 'undefined')
// 		clearInterval(WaitAnimateInterval);
}

// GETS WINDOW DIMENSIONS
function getWindowDimension(Dim) {
	if (Dim == 'x')
		return (IsMSIE)?document.body.offsetWidth:window.innerWidth;
	else
		return (IsMSIE)?document.body.offsetHeight:window.innerHeight;
}

// 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 AJAX functionality to set override
function setOverride(Override) {
	generateWaitDiv('Setting Override');
	
	AJAX_sendRequest(true,
	
	'/dbtools/index.php?setOverride=' + Override,
	
	'if (VarForResponseText) { alert(VarForResponseText); } deleteWaitDiv()');
}

// SUBMITS A PVR FORM VIA AJAX
// (OBJ form object, STRING id of error container
function submitFormViaAJAX(FormObj, FormErrorContainerObjID, EvalElseCode, Debug) {

	generateWaitDiv();
	resetErrorOutputClassNames();
	
	ScriptNameArray =
	((typeof FormObj.action != null && typeof FormObj.action != '' && FormObj.action != '' && typeof FormObj.action != null)
	?FormObj.action: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);
}

// 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;
	}
}

// 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('&');
}

// 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 = '#FormErrorsA';
	}
	else
		alert(formErrStrFromAJAX);
}

// GETS A SPECIFIED GET VARIABLE FROM A GIVEN OR CURRENT URL
function fetchGETVar(GETVar, OverrideURL) {
	
	// Figure out what URL to use and then parse out the unnecessary parts
	UseURL = (OverrideURL)?OverrideURL:document.location.href;
	if (UseURL.indexOf('?') != -1 && UseURL.indexOf(GETVar) != -1) {
		URLArray      = UseURL.split('?');
		QueryStrArray = URLArray[1].split('&');
		
		// Set array of get vars
		GETVarArray = new Array(QueryStrArray.length);
		
		// Set the array values
		for (i in QueryStrArray) {
			CurrentVarSplit = QueryStrArray[i].split('=');
			CurrentVarName  = CurrentVarSplit[0];
			CurrentVarValue = CurrentVarSplit[1];
			eval('GETVarArray[\'' + CurrentVarName + '\'] = CurrentVarValue;');
		}
		
		if (GETVar)
			return GETVarArray[GETVar];
	}
	else
		return null;
}
