// EMMC Javascript


// 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();

// 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('&');
}


// Submits form via AJAX
function formToAJAX(TopLevelObj, EvalAfterGood) {
	
	// Obj
	FormObj = TopLevelObj.document.forms[0];
	
	// Retrive GET vars from form action
	GETVarsArray = FormObj.action.split('?');	
	SubmitURL    = GETVarsArray[0] + '?' + convertFormDataToGETStr(FormObj);
	TopLevelObj2 = TopLevelObj;
	
	generateWaitDiv('Processing');
	
	AJAX_sendRequest(false,
	
	SubmitURL,
	
	"deleteWaitDiv(); if (response.substr(0,7) == 'ERRORS:') { setErrors(response, TopLevelObj2); } " +
	"else if (response == 'GOOD') { " + EvalAfterGood + " } else { alert(response); } ", null, GETVarsArray[1]);
}


// Sets errors next to form fields
function setErrors(ErrorOutput, TopLevelObj) {
	ErrorsArray = ErrorOutput.substr(7).split('|');
	
	// Clear all error containers
	Divs = TopLevelObj.document.forms[0].getElementsByTagName('div');
	for (i in Divs) {
		try {
			if (Divs[i].id.substr(0,6) == 'ERROR_') {
				Divs[i].innerHTML = '';
				Divs[i].style.display = 'none';
			}
		}
		
		catch (e) {
			// do nothing
		}
	}
	
	for (i in ErrorsArray) {
		Error = ErrorsArray[i].split(':');
		
		try {
			with (TopLevelObj.document.getElementById('ERROR_' + Error[0])) {
				style.display = 'block';
				innerHTML = Error[1];
			}
		}
		catch (e) {
			// do nothing
		}
	}
	
	TopLevelObj.document.getElementById('ErrorMsg').style.display = 'block';
	TopLevelObj.document.location.href = TopLevelObj.document.location.href + '#Errors';
}


// 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, 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];
			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;
				response           = VarForResponseText;
				
				if (EvalCodeFromResponse)
					eval(EvalCodeFromResponse);
				else
					return VarForResponseText;
	
				return;
			}	
		}
	}
}


// GENERATES A DIV CONTAINING A "PLEASE WAIT..." MESSAGE
function generateWaitDiv(OverrideText, OverrideBGColor, DoNotGenerateDisableDiv) {

	if (navigator.appVersion.indexOf('MSIE') == -1) {
	
		var NewDiv        = document.createElement('div');
		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';
		}
			
		if (navigator.appName != 'Microsoft Internet Explorer') {
			NewDiv.style.left = (window.innerWidth/2)-((180+20)/2) + 'px';
			NewDiv.style.top  = String(parseInt(document.body.scrollTop) + parseInt((window.innerWidth/2)-50)) + 'px';
		}
			
		NewDiv.setAttribute('id', 'WaitDiv');
		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;
		}
		
		NewDisableDiv.setAttribute('id', 'DisableDiv');
		
		document.body.appendChild(NewDiv);
		document.body.appendChild(NewDisableDiv);
	}
}


// DELETES WAIT DIV
function deleteWaitDiv() {
	if (navigator.appVersion.indexOf('MSIE') == -1) {
		document.body.removeChild(document.getElementById('WaitDiv'));
		document.body.removeChild(document.getElementById('DisableDiv'));
	}
}

// GETS THE NAME OF SCRIPT/PAGE FROM A URL
function getScriptName(OverrideURL, IncludeQueryStr) {
	UseURL         = (OverrideURL)?OverrideURL:document.location.href;
	UseURL         = UseURL.replace(/#.*/, '');
	PosOfSlash     = UseURL.lastIndexOf('/')+1;
	QueryStrExists = UseURL.indexOf('?') != -1;
		
	if (!QueryStrExists || IncludeQueryStr)
		return UseURL.substr(PosOfSlash);	
	
	else if (QueryStrExists)
		return UseURL.substr(PosOfSlash, UseURL.indexOf('?')-PosOfSlash);
}


// PROCESSES AND OUTPUT FORM ERRORS
function outputFormErrors(formObj, formErrStrFromAJAX, ErrorOutputContainer) {
	ErrorOutput        = '';
	formErrStrFromAJAX = formErrStrFromAJAX.substring(11, formErrStrFromAJAX.lastIndexOf('|'));
	formErrArray       = formErrStrFromAJAX.split('|');
	
	
	
	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].substring(SplitCharAt+1);
		
		if (ErrorOutput_tmp != '')
			ErrorOutput += '<li>' + ErrorOutput_tmp + '</li>';

		for (var j in ErrorFieldsArray) {
			obj = document.getElementById(ErrorFieldsArray[j]);
			if (objectExists(obj))
				obj.style.color = '#FF3333';
		}
		
		ErrorFieldsArray_array.push(ErrorFieldsArray);
	}
	
	ErrorOutputContainer.innerHTML = '<b>The form could not be processed for the following reasons...</b><ul>' + ErrorOutput + '</ul>';
}


// TESTS IF OBJECT EXISTS
function objectExists(Obj) {
	return !(
	Obj == null || Obj == 'null' || Obj == 'undefined' || Obj == undefined ||
	typeof Obj == null || typeof Obj == 'null' || typeof Obj == 'undefined' || typeof Obj == undefined
	)
}


/*
// Opens a form window
function openForm(formName, w, h, scrolling, windowName) {
	return false;
	var winWidth   = (w)?w:700;
	var winHeight  = (h)?h:450;
	var scrolling  = (scrolling)?"yes":"no";

	if (windowName) {
		winName = windowName;
	}
	else {
		tmpName = Math.random();
		winName = String(tmpName).replace(/\./, "");
	}

	FormWin = window.open(formName, winName, "width=" + winWidth + ",height=" + winHeight + ",resizable, scrollbars=" + scrolling);
}
*/

// Opens PDF in a framed HTML document to allow for a document.title
function openPDF(PDFUrl, DocumentTitle, w, h) {
	tmpName = Math.random();
	winName = String(tmpName).replace(/\./, "");

	PDFWindow = window.open("", winName, "width=" + w + ",height=" + h + ",resizable");

	with (PDFWindow.document) {
		open();
		write("<html><html><title>" + DocumentTitle + "</title></head>\n");
		write("<frameset cols=\"100%\">\n");
		write("<frame src=\"" + PDFUrl + "\">\n");
		write("</frameset>\n");
		write("</body></html>");
		close();
	}
}

// Opens JS popup window
function openGenWindow(file, opt) {
	tmpName = Math.random();
	winName = String(tmpName).replace(/\./, "");
	window.open(file, winName, opt);
}

// Opens JS popup window with image, allows for document.title
function openImageWindow(ImgFile, WindowOptions, WindowTitle) {
	tmpName = Math.random();
	winName = String(tmpName).replace(/\./, "");
	imgWin = window.open("", winName, WindowOptions);

	with (imgWin.document) {
		open();
		write("<html><head><title>" + WindowTitle + "</title></head><body><img src=\"" + ImgFile + "\"></body></html>");
		close();
	}
}

// adds leading zero to a number
function JSAddLeadingZero(number) {
	var NewNumber;

	if (number.length == 1)
		NewNumber = ("0" + number);
	else
		NewNumber = number;

	return NewNumber;
}

// REMOVES LEADING ZERO(S) FROM NUMBER
function JS_removeLeadingZeros(number) {
	if (String(number).substr(0, 1) == "0" && String(number).substr(1) != "0")
		return String(number).substr(1);
	else
		return number;
}

// submits a form with a new action
function submitFormWithNewAction(SubmitForm, NewAction) {
	document[SubmitForm].action = NewAction;
	document[SubmitForm].submit();
}

// regenerates number of days in a month according to month and year selections
function adjustDaysInMonth(formObj, YearElmntName, MonthElmntName, DayElmntName, DayOptions, NULLSelections) {
	var Days31        = "01,03,05,07,08,10,12,";
	var Days30        = "04,06,09,11,";

	StrToMatch = formObj[MonthElmntName].value + ",";
	StrToMatch.toString();

	if (Days31.match(StrToMatch)) {
		days = 31;
	}
	else if (Days30.match(StrToMatch)) {
		days = 30;
	}
	else {
		year = formObj[YearElmntName].value;
		if (year % 4 == 0 && year % 100 != 0)
			days = 29;
		else
			days = 28;
	}

	DayElmntObj = formObj[DayElmntName];

	if (NULLSelections) {
		DayElmntObj.length = days+1;
		AltCounter         = 1;
	}
	else {
		DayElmntObj.length = days;
		AltCounter         = 0;
	}

	for (i=1;i<=days;i++) {
		if (DayElmntObj[AltCounter].value != JSAddLeadingZero(i))
			DayElmntObj[AltCounter].value = JSAddLeadingZero(i);

		if (DayOptions && DayElmntObj[AltCounter].text != DayOptions[i])
			DayElmntObj[AltCounter].text = (DayOptions)?DayOptions[i]:i;

		AltCounter++;
	}
}

// Generates email address "safe" from harvesters
function generateAntiSpiderEmail(Username, DomainName, TLD, Output) {
	EmailAddress = Username + "&#64;" + DomainName + "." + TLD;
	document.write("<a href=\"ma" + "il" + "to:" + EmailAddress + "\">" + ((Output)?Output:EmailAddress) + "</a>");
}

// SETS THE "display" CSS PROPERTY OF AN OBJECT TO "none" OR "block"
function toggleCSSDisplay(objID, displayOverride, toggleFormFieldObj, toggleObjInnerHTML, innerHTMLNone, innerHTMLBlock) {
	if (displayOverride) {
		document.getElementById(objID).style.display = displayOverride;
		toggleFormFieldObj                           = (displayOverride == "block")?"true":"false";
	}
	else {
		if (document.getElementById(objID).style.display == "block") {
			document.getElementById(objID).style.display = "none";

			if (toggleFormFieldObj)
				toggleFormFieldObj.value = "";
			
			if (toggleObjInnerHTML)
				toggleObjInnerHTML.innerHTML = innerHTMLBlock;
		}
		else {
			document.getElementById(objID).style.display = "block";

			if (toggleFormFieldObj)
				toggleFormFieldObj.value = "1";
			
			if (toggleObjInnerHTML)
				toggleObjInnerHTML.innerHTML = innerHTMLNone;
		}
	}
}

// ADDS LEADING ZERO TO A NUMBER
function JS_addLeadingZero(number) {
	var NewNumber;

	if (String(number).length == 1)
		NewNumber = ("0" + number);
	else
		NewNumber = number;

	return NewNumber;
}

// GENERATES DATE FIELDS
function generateDateAndTimeFields(InitName, WriteDateToObj, WriteTimeToObj, CurrentTimestamp, OrderYearsDESC, StartYear, EndYear, HideFieldsArray) {
	CurrentTimestamp = CurrentTimestamp.toString();
	
	CurrentYear  = CurrentTimestamp.substr(0, 4);
	CurrentMonth = CurrentTimestamp.substr(4, 2);
	CurrentDay   = CurrentTimestamp.substr(6, 2);
	
	CurrentHour24 = CurrentTimestamp.substr(8, 2);
	CurrentHour12 = (CurrentHour24 > 12)?CurrentHour24-12:CurrentHour24;
	CurrentAMPM   = (CurrentHour24 > 12)?'pm':'am';
	CurrentMinute = CurrentTimestamp.substr(10, 2);
	CurrentSecond = CurrentTimestamp.substr(12, 2);
		
	
	// Months array: array(array(Month Name, Days in Non-Leap Year, Days in Leap Year [leave blank same as elmnt 1])
	MonthsArray = new Array(
			new Array('January', 31),
			new Array('February', 28, 29),
			new Array('March', 31),
			new Array('April', 30),
			new Array('May', 31),
			new Array('June', 30),
			new Array('July', 31),
			new Array('August', 31),
			new Array('September', 30),
			new Array('October', 31),
			new Array('November', 30),
			new Array('December', 31)
		     );
		
	if (!HideFieldsArray)
		HideFieldsArray = new Array();
	
	if (!in_array('year', HideFieldsArray)) {
	
		// YEAR
		YearOutput = '<select name="' + InitName + '_year" id="' + InitName + '_year_ID" onChange="modifyDaysInMonth(\'' + InitName + '\')">';
		
		for (var i=StartYear;i<=EndYear;i++)
			YearOutput += '<option value="' + i + '"' + ((CurrentYear == i)? ' selected':'') + '>' + i + '</option>';
		
		YearOutput += '</select>';
		
		if (WriteDateToObj.innerHTML == '')
			WriteDateToObj.innerHTML = YearOutput;
		else
			WriteDateToObj.innerHTML += YearOutput;
		
		SelectedYear = document.getElementById(InitName + '_year_ID')[document.getElementById(InitName + '_year_ID').selectedIndex].value;
	}
	else
		SelectedYear = CurrentYear;
	
	
	if (!in_array('month', HideFieldsArray)) {
	
		// MONTH
		MonthOutput = '<select name="' + InitName + '_month" id="' + InitName + '_month_ID" onChange="modifyDaysInMonth(\'' + InitName + '\')" style="width: 100px">';
		
		for (var i in MonthsArray) {
			Current_i = JS_addLeadingZero(parseInt(i)+1);
			MonthOutput += '<option value="' + Current_i + '"' + ((CurrentMonth == Current_i)? ' selected':'') + '>' + MonthsArray[i][0] + '</option>';
		}
		
		MonthOutput += '</select>';
		WriteDateToObj.innerHTML += MonthOutput;
		SelectedMonth = document.getElementById(InitName + '_month_ID')[document.getElementById(InitName + '_month_ID').selectedIndex].value;
	}
	
	
	if (!in_array('day', HideFieldsArray)) {
	
		// DAY
		IsLeapYear = (SelectedYear % 4 == 0 && (SelectedYear % 100 != 0 || SelectedYear % 400 == 0));
		UseIndex1  = document.getElementById(InitName + '_month_ID').selectedIndex
		UseIndex2  = (MonthsArray[UseIndex1][2] == 'undefined' || !IsLeapYear)?1:2;
		
		DayOutput = '<select name="' + InitName + '_day" id="' + InitName + '_day_ID" style=\"width: 55px\">';
		
		for (var i=1;i<=MonthsArray[UseIndex1][UseIndex2];i++) {
			CurrentDayOutput = JS_addLeadingZero(i);	
			DayOutput += '<option value="' + CurrentDayOutput + '"' + ((CurrentDay == CurrentDayOutput)? ' selected':'') + '>' + CurrentDayOutput + '</option>';
		}
		
		DayOutput += '</select>';
		
		WriteDateToObj.innerHTML += DayOutput;
	}
	
	
	// HOUR
	HourOutput = '<select name="' + InitName + '_hour" id="' + InitName + '_hour_ID" style="width: 50px">';
	for (var i=1;i<=12;i++) {
		CurrentHourOutput = JS_addLeadingZero(i);
		HourOutput += '<option value="' + CurrentHourOutput + '"' + ((CurrentHour12 == CurrentHourOutput)? ' selected':'') + '>' + i + '</option>';
	}
	
	HourOutput += '</select>';
	
	
	// MINUTE
	MinuteOutput = '<select name="' + InitName + '_minute" id="' + InitName + '_minute_ID" style="width: 50px">';
	for (var i=0;i<60;i++) {
		CurrentMinuteOutput = JS_addLeadingZero(i);
		MinuteOutput += '<option value="' + CurrentMinuteOutput + '"' + ((CurrentMinute == CurrentMinuteOutput)? ' selected':'') + '>' + CurrentMinuteOutput + '</option>';
	}
	
	MinuteOutput += '</select>';
	
	
	// AMPM
	AMPMOutput = '<select name="' + InitName + '_ampm" id="' + InitName + '_ampm_ID" style="width: 55px">'
		   + '<option value=\"am\"' + ((CurrentAMPM == 'am')? ' selected':'') + '>am</option>'
		   + '<option value=\"pm\"' + ((CurrentAMPM == 'pm')? ' selected':'') + '>pm</option>'
		   + '</select>';

	WriteTimeToObj.innerHTML = HourOutput + MinuteOutput + AMPMOutput;
}
	
	
// Function to modify days in a month
function modifyDaysInMonth(InitName) {

	DayElmntObj  = document.getElementById(InitName + '_day_ID');
	DayObjExists = (DayElmntObj != null && DayElmntObj != 'null');
	
	if (DayObjExists) {
		
		IsLeapYear = (SelectedYear % 4 == 0 && (SelectedYear % 100 != 0 || SelectedYear % 400 == 0));
		UseIndex1  = JS_removeLeadingZeros(document.getElementById(InitName + '_month_ID').selectedIndex);
		UseIndex2  = (MonthsArray[UseIndex1][2] == 'undefined' || !IsLeapYear)?1:2;
		Length     = MonthsArray[UseIndex1][UseIndex2];
		
		DayElmntObj.length = Length;
		
		for (var i=0;i<Length;i++) {
			Current_i = JS_addLeadingZero(parseInt(i)+1);
			DayElmntObj.options[i].text  = Current_i;
			DayElmntObj.options[i].value = Current_i;
		}
	}
}

// CHECKS IF A VALUE EXISTS IN AN ARRAY AND OPTIONALLY RETURNS THE INDEX
function in_array(valueToMatch, arrayToCheck, ReturnIndex) {
	for (var i=0;i<arrayToCheck.length;i++) {
		if (valueToMatch == arrayToCheck[i])
			return (ReturnIndex)?i:true;
	}
	
	return false;
}

// ADDS TRAILING ZEROS TO A DECIMAL
function roundWithTrailingZeros(NumberToRound, RoundFactor) {

	ZeroStr = "";
	for (i=0;i<RoundFactor;i++)
		ZeroStr += "0";

	ten           = "1" + ZeroStr;
	NumberToRound = Math.round(ten * NumberToRound) / ten;
	NumberToRound = NumberToRound.toString();

	DecimalAt = NumberToRound.lastIndexOf(".");
	if (DecimalAt == -1) {
		DecimalAt      = NumberToRound.length;
		NumberToRound += ".";
	}


	AfterDecimal = NumberToRound.substr(DecimalAt + 1);

	AfterDecimalStr = "";
	for (i=0;i<RoundFactor - AfterDecimal.length;i++)
		AfterDecimalStr += "0";

	NumberToRound += AfterDecimalStr;

	return NumberToRound;
}