/*******************
JAVASCRIPT.JS

Standard javascript functions library
*******************/

IsMSIE = navigator.appVersion.indexOf('MSIE') != -1;


// PLACES AN IMAGE OFF-CENTER
function placeObj(ObjID, l, t) {

	use_left = placeObjFromCenter(l);
	use_top  = t;

	document.getElementById(ObjID).style.left = use_left;
	document.getElementById(ObjID).style.top  = use_top;
}


// RETURNS LEFT-OF-CENTER VALUES
function placeObjFromCenter(LeftValueWhenEvenBrowserWidth) {

	BrowserWidth = document.body.clientWidth;

	if (String(BrowserWidth/2).match(/\.[0-9]{1,}/))
		return Math.floor(BrowserWidth/2) + LeftValueWhenEvenBrowserWidth;
	else
		return BrowserWidth/2 + (LeftValueWhenEvenBrowserWidth);
}


// VALIDATES AN EMAIL ADDRESS
function JS_checkBadEmail(Email) {
	var Email_regex = /^[a-z0-9_.-]{1,}@[a-z0-9.-]{3,}\.[a-z]{2,4}$/;
	if (!String(Email).match(Email_regex))
		return true;
	
	return false;
}


// CONVERTS 12 to 24 HOUR TIME
function convertTime12to24(HourValue, AMPMValue, AM_value, PM_value) {
	
	HourValue = JS_addLeadingZero(parseFloat(HourValue));
	
	if (!AM_value)
		AM_value = 'am';
	
	if (!PM_value)
		PM_value = 'pm';

	if (AMPMValue == PM_value && HourValue != 12)
		HourValue += 12;

	else if (AMPMValue == AM_value && HourValue == 12)
		HourValue = '00';

	return HourValue;
}


// 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;
		}
	}
}


// OUTPUTS LIST OF SUGGESTIONS FOR A FORM FIELD... (AUTO-COMPLETE STYLE)
function suggestForField(FormFieldObj, AppendToObj, SelectableTextArray, HideSelectMenusForIE) {
	
	// This only works for text-based fields (input type="text" and textarea)
	FieldType = FormFieldObj.type;
	if (FieldType == 'textarea' || FieldType == 'text' || (FieldType == 'select-one' && IsMSIE)) {
		
		New_SelectableTextArray = new Array();
		for (var i in SelectableTextArray) {
			if (SelectableTextArray[i] != '')
				New_SelectableTextArray.push(SelectableTextArray[i]);
		}

		SelectableTextArray = New_SelectableTextArray;
		
		SuggestFunc_FieldID       = FormFieldObj.id;
		SuggestFunc_AppendToObjID = AppendToObj.id;
		
		IDStr = SuggestFunc_FieldID + '_in_' + SuggestFunc_AppendToObjID + '_DropDown';
		
		TestForObj = document.getElementById(IDStr);
		killSuggestionDivs();
	
		// Create new div...
		var NewDiv = document.createElement('div');
		DivID      = IDStr;
		
		// Get current value from field
		CurrentVal = document.getElementById(SuggestFunc_FieldID).value;
		
		// Create divs from array...
		NewSubDivs = new Array();
		NewSubText = new Array();
		
		Cmd_onClick = new Array();
		
		var AltCounter = 0;
		for (var i in SelectableTextArray) {
			
			if (CurrentVal == SelectableTextArray[i].substr(0, CurrentVal.length)) {
			
				NewSubDivs.push(document.createElement('div'));
				NewSubText.push(document.createTextNode(SelectableTextArray[i]));
			
				with (NewSubDivs[AltCounter]) {
					style.color      = '#000000';
					style.background = '#FFFFFF';						
					style.textAlign  = 'left';
					style.height     = '17px';
					style.overflowX  = 'hidden';
					style.overflowY  = 'hidden';
					style.position   = 'relative';
					
					appendChild(NewSubText[AltCounter]);
					
					RandStr  = Math.random().toString().replace('.', '');
					SubIDStr = 'SubDiv_' + RandStr + '_' + AltCounter;
					setAttribute('id', SubIDStr);
					
					SetValueCmd = "document.getElementById('" + SuggestFunc_FieldID + "')" + ".value = '" + SelectableTextArray[i] + "'; ";
					
					Cmd_onClick     = SetValueCmd + "killSuggestionDivs(); toggleSelectMenuVisibility(true, 'visible');";
					Cmd_onMouseOver = "Obj = document.getElementById('" + SubIDStr + "'); Obj.style.background = '#000088'; Obj.style.color = '#FFFFFF';";
					Cmd_onMouseOut  = "Obj = document.getElementById('" + SubIDStr + "'); Obj.style.background = '#FFFFFF'; Obj.style.color = '#000000';";
					
					if (IsMSIE) {
						attachEvent('onclick',     function() { document.getElementById(SuggestFunc_FieldID).value = event.srcElement.innerHTML; toggleSelectMenuVisibility(true, 'visible'); });
						attachEvent('onmouseover', function() { event.srcElement.style.background = '#000088'; event.srcElement.style.color = '#FFFFFF'; });
						attachEvent('onmouseout',  function() { event.srcElement.style.background = '#FFFFFF'; event.srcElement.style.color = '#000000'; });
					}
					else {
						setAttribute('onClick', Cmd_onClick);
						setAttribute('onMouseOver', Cmd_onMouseOver);
						setAttribute('onMouseOut', Cmd_onMouseOut);
					}
				}
				
				NewDiv.appendChild(NewSubDivs[AltCounter]);
				AltCounter++;
			}
		}

		if (AltCounter == 0 || FormFieldObj.value == '')
			killSuggestionDivs();
		
		else {
		
			if (HideSelectMenusForIE)
				toggleSelectMenuVisibility(true, 'hidden');
		
			// Format new div
			with (NewDiv) {
				style.width      = FormFieldObj.style.width;
				style.position   = 'absolute';
				style.cursor     = 'pointer'
				style.fontFamily = 'Arial';
				style.fontSize   = '12';
				style.border     = '1px solid #000000';
				style.overflowX  = 'hidden';
				style.overflowY  = 'auto';
				
				setAttribute('id', IDStr);
			}
			
			AppendToObj.appendChild(NewDiv);
		}
	}
}


// KILLS THE SUGGESTION DIV
function killSuggestionDivs() {

	if (typeof SuggestFunc_AppendToObjID != 'undefined' && typeof IDStr != 'undefined') {
	
		ParentObj = document.getElementById(SuggestFunc_AppendToObjID);
		ChildObj  = document.getElementById(IDStr);
		
		if (objectExists(ParentObj) && objectExists(ChildObj))
			ParentObj.removeChild(ChildObj);
	}
}


// TRIMS LEADING AND TRAILING SPACES FROM STRING
function trim(str) {
	return str.replace(/^\s*|\s*$/g, '');
}


// ASSIGNS AN EVENT TO AN OBJECT AND COMPENSATES FOR IE'S ROYAL CRAPINESS
function assignEvent(Obj, Event, EventTarget, Delete) {
	if (navigator.appVersion.indexOf('MSIE') != -1) {
		
		if (typeof EventTarget == 'function')
			NewFunction = EventTarget;
		else
			NewFunction = function() { eval(EventTarget) };
				
		if (EventTarget != '')
			Obj.attachEvent(Event.toLowerCase(), NewFunction);
		else
			Obj.detachEvent(Event.toLowerCase(), NewFunction);
	}
	else
		Obj.setAttribute(Event, (Delete)?'':EventTarget);
}


// 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
	);
}

			
// 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)
				document.getElementById(ErrorFieldsArray[j]).className = 'InvalidFont';
			
			ErrorFieldsArray_array.push(ErrorFieldsArray);
		}
		
		ErrorOutputContainer.className = 'InvalidFont';
		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() {
	Spans = document.getElementsByTagName('span');
	for (i in Spans) {
		if (Spans[i].className == 'InvalidFont')
			Spans[i].className = '';
	}
}

// CONVERTS FORM DATA TO GET STRING
function convertFormDataToGETStr(formObj) { 
		
	POSTDataArray = new Array();
	
	// Loop through form fields
	AltCounter = 0;
	ElmntsList = '';
	for (var i=0;i<formObj.elements.length;i++) {
		Elmnt = formObj.elements[i];
		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('&');
}


// 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);
}


// GETS WINDOW DIMENSIONS
function getWindowDimension(Dim) {
	if (Dim == 'x')
		return (IsMSIE)?document.body.offsetWidth:window.innerWidth;
	else
		return (IsMSIE)?document.body.offsetHeight:window.innerHeight;
}


// GENERATES A DIV CONTAINING A "PLEASE WAIT..." MESSAGE
function generateWaitDiv(OverrideText, DoNotGenerateDisableDiv, CustomCSSArray, OverrideInnerHTML) {
	
	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('" + JS_http_path_to_provisioner + "/admin/images/space.gif')";
				toggleSelectMenuVisibility(true, 'hidden');
			}
		}
		
		NewDisableDiv.style.height = document.body.scrollHeight;
	}
	
	NewDisableDiv.setAttribute('id', 'DisableDiv');
	
	if (OverrideInnerHTML)
		NewDiv.innerHTML = OverrideInnerHTML;
	
	document.body.appendChild(NewDiv);
	document.body.appendChild(NewDisableDiv);
}


// DELETES WAIT DIV
function deleteWaitDiv() {
	document.body.removeChild(document.getElementById('WaitDiv'));
	document.body.removeChild(document.getElementById('DisableDiv'));
	toggleSelectMenuVisibility(true, 'visible');
}


// 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) {
		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];
	}
}


// REMOVES A <TR> OR <TBODY> ELEMENT
function removeTableElement(ElementID) {
	
	ElementObj = document.getElementById('ElementID');
	
	if (navigator.appName == "Microsoft Internet Explorer")
		ElementObj.style.display = 'none';
	else
		ElementObj.innerHTML = '';
}




// 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';
					}
				}
			}
		}
	}
}




// MAKES MULTIPLE LEVELS OF DEPENDENT SELECT MENUS
// (OBJ select menu object, ARRAY 1st level array of values, ...)

// **** CHANGE THIS FUNCTION SO THAT IT IS RECURSIVE AND CAN CREATE *MULTIPLE* DEPENDENCES --OR--
// **** CHANGE IT SO THAT IT OFFICIALLY ONLY MANAGES ONE LEVEL

function dependentSelectMenu(BlankTextsArray, ForceSelectedIndex, SelectingFrom) {
	
	InsertBlankFirstValues = BlankTextsArray.length > 0;
	AddToOptionIndex       = (InsertBlankFirstValues)?1:0;
	
	for (var i = 3; i < arguments.length; i++) {
		
		// Even number or 0 - select menu
		if (String((i-3) / 3).indexOf(".") == -1) {
			
			// First iteration: populate first select menu
			if (i == 3) {
				
				if (SelectingFrom < 1) {
				
					// Set select length
					arguments[i].length = arguments[i+1].length;
					
					// Set default blank option
					if (BlankTextsArray) {
						arguments[i].length++;
						arguments[i].options[0].value = BlankTextsArray[0];
						arguments[i].options[0].text  = BlankTextsArray[0];
					}
					
					// Populate menu from array
					for (var j = 0; j < arguments[i+1].length; j++) {
						arguments[i].options[j+AddToOptionIndex].value = arguments[i+1][j];
						arguments[i].options[j+AddToOptionIndex].text  = arguments[i+1][j];
					}
					
					if (ForceSelectedIndex) {
						tmp_options_array = new Array();
						for (var k = 0; k < arguments[i].options.length; k++)
							tmp_options_array[k] = arguments[i].options[k].value;
						
						arguments[i].selectedIndex = in_array(arguments[i+2], tmp_options_array, true);
					}
				}
				
				else if (SelectingFrom == 1) {
					for (var j = 6; j < arguments.length; j++) {
						if (String((j-3) / 3).indexOf(".") == -1)
							arguments[j].selectedIndex = 0;
					}
				}
			}
			
			// Subsequent iteration: populate next menu based on previous menu if previous menu is selected...
			else {

				if (SelectingFrom < (arguments.length-3)/3) {
				
					// Previous menu has selected option
					ArrayIndex = arguments[i-3].selectedIndex;
					
					if (InsertBlankFirstValues)
						ArrayIndex--;
					
					if (ArrayIndex > -1) {
						arguments[i].length   = arguments[i+1][ArrayIndex].length;
						arguments[i].disabled = false;
						
						if (InsertBlankFirstValues) {
							arguments[i].length++;
							
							DefaultValueAndText           = BlankTextsArray[(arguments.length-3)/3-1];
							arguments[i].options[0].value = DefaultValueAndText;
							arguments[i].options[0].text  = DefaultValueAndText;
						}
										
						for (var j = 0; j < arguments[i].length-AddToOptionIndex; j++) {
							arguments[i].options[j+AddToOptionIndex].value = arguments[i+1][ArrayIndex][j];
							arguments[i].options[j+AddToOptionIndex].text  = arguments[i+1][ArrayIndex][j];
						}
						
						if (ForceSelectedIndex) {
							tmp_options_array = new Array();
							for (var k = 0; k < arguments[i].options.length; k++)
								tmp_options_array[k] = arguments[i].options[k].value;
							
							arguments[i].selectedIndex = in_array(arguments[i+2], tmp_options_array, true);
						}
					}
					
					// Previous menu is not selected and the first value is populated with blank default for the previous select menu
					else {
						arguments[i].length = 1;
						DefaultValueAndText = BlankTextsArray[((arguments.length-3)/3)-2];
						arguments[i].options[0].value = DefaultValueAndText;
						arguments[i].options[0].text  = DefaultValueAndText + " first";
						arguments[i].disabled         = true;
					}
				}	
			}
		}
	}
}



// GENERATES EMAIL ADDRESS "SAFE" FROM HARVESTERS
function generateAntiSpiderEmail(Username, DomainName, TLD, OutputText, NoLink) {
	EmailAddress = Username + "&#64;" + DomainName + "&#46;" + TLD;
	OutputText   = ((OutputText)?OutputText:EmailAddress);
	
	/*
	if (OutputText == Username + '@' + DomainName + '.' TLD)
		OutputText = EmailAddress;
	*/
	
	document.write((NoLink)?OutputText:"<a href=\"ma" + "il" + "to:" + EmailAddress + "\">" + OutputText + "</a>");
}


// MULTI-WAY CHECKBOX (COLOR CODED)
function multiWayCheckbox(CheckObj) {
	CurrentValueFound = false;
	var i = 1;
	while (i <= arguments.length) {
		if (CurrentValueFound) {
			CheckObj.checked          = (arguments[i] == "")?true:false;
			CheckObj.value            = arguments[i];
			CheckObj.style.background = arguments[i+1];
			break;
		}
		
		if (CheckObj.value == arguments[i])
			CurrentValueFound = true;
		
		i += 2;
	}
}


// Disable right click script III- By Renigade (renigade@mediaone.net)
// For full source code, visit http://www.dynamicdrive.com

// Disable right click in IE
var message = "";
function disableRightClick_IE() {
	if (document.all) {
		(message);
		return false;
	}
}

// Disable right click in NS
function disableRightClick_NS(e) {
	if (document.layers || (document.getElementById && !document.all)) {
		if (e.which == 2 || e.which == 3) {
			(message);
			return false;
		}
	}
}

// Disable right click in IE
function disableRightClick_init() {

	if (document.layers) {
		document.captureEvents(Event.MOUSEDOWN);
		document.onMouseDown = disableRightClick_NS;
	}
	
	else {
		document.onMouseUp     = disableRightClick_NS;
		document.oncontextmenu = disableRightClick_IE;
	}
	
	document.oncontextmenu = new Function("return false");
}

// Disable text highlighting
function disableTextHighlight_init() {
	
	var omitformtags = ["input", "textarea", "select"]
	omitformtags     = omitformtags.join("|")
	
	function disableselect(e) {
		if (omitformtags.indexOf(e.target.tagName.toLowerCase()) == -1)
			return false;
	}
	
	if (typeof document.onselectstart != "undefined")
		document.onselectstart = new Function ("return false");
	
	else {
		document.onmousedown = disableselect;
		document.onmouseup   = reEnable;
	}
}

function disableLinkFocusing() {
	for (i=0;i<document.body.elements.length;i++) {
		document.body.elements[i].onFocus = "this.blur()";
	}
}

// OPENS A DYNAMIC WINDOW
function openDynamicWindow(output, WinName, WinParams) {
	DynWin = window.open("", WinName, WinParams);
	
	with (DynWin.document) {
		open();
		write(output);
		close();
	}
}


// REDIRECTS OPENER OR OPENS NEW WINDOW DEPENDING IF !OPENER
function redirOpenerOrNewWin(RedirToURL, FocusOpener) {
	if (typeof(window.opener) == "undefined")
		openGenWindow(RedirToURL, "BadWindow", "width=800,height=600");
	
	else {
		window.opener.location.href = RedirToURL;
		
		if (FocusOpener)
			window.opener.focus();
	}
}


// STANDARD FUNCTION FOR FOCUSING ON WINDOW.OPENER
function stdFocusOpener(ReloadOpener) {
	runCommandAfterCloseWindow(((ReloadOpener)?'if (navigator.appName == "Microsoft Internet Explorer") { window.opener.history.go(0); } else { window.opener.location.reload(); }':'') + ' window.opener.focus()');
}

// DISABLES OR ENABLES ALL OF THE ELEMENTS IN A GIVEN FORM
function toggleFormEnable(formObj, DisableBOOL) {
	for (i=0;i<formObj.elements.length;i++)
		formObj.elements[i].disabled = DisableBOOL;
}


// STRIPS TAGS FROM STRING
function JS_strip_tags(str) {
	return String(str).replace("<", " ").replace(">", " ");
}

// REPLACES TAG SYMBOLS ("<" and ">") WITH THEIR OUTPUT-FRIENDLY COUNTERPARTS
function JS_convert_tags(str) {
	return String(str).replace("<", "&lt;").replace(">", "&gt;");
}

// ^ OPPOSITE OF THAT ^ ;)
function JS_deconvert_tags(str) {
	return String(str).replace("&lt;", "<").replace("&gt;", ">");
}


// CUTS A STRING TO A SPECIFIED LENGTH AND ADDS LEADING PERIODS (DOES NOT CONSIDER TAGS OR SPACES)
function JS_addLeadingPeriods(TextStr, Cut) {
	return (TextStr.length > Cut)?TextStr.substring(0, Cut) + "...":TextStr;
}


// PARSES & RETURNS CHARS FROM A STRING BASED ON PASSED REGEX VAR
function parseChars(StrToParse, RegexpStr) {
	RegexpRgx = new RegExp(RegexpStr);
	return StrToParse.replace(RegexpRgx, "");
}


// LIMITS A NUMBER BETWEEN LOW & HIGH
function limitNumberRange(NumberStr, Low, High, Inclusive) {
	NumberStr = parseChars(NumberStr, '[^0-9\.]+');
	NumberInt = parseFloat(NumberStr);
	
	if (NumberInt < Low)
		NumberInt = (Inclusive)?Low:Low+1;
	if (NumberInt > High)
		NumberInt = (Inclusive)?High:High-1;
		
	return (isNaN(NumberInt))?String(""):String(NumberInt);
}


// TOGGLES AN IMAGE AND THE VALUE OF A GIVEN FORM FIELD OBJECT
function toggleImgAndValue(ImgObj, ImgSrcTrue, ImgSrcFalse, ToggleFieldObj, ToggleAltIfTrue, ToggleAltIfFalse) {
	
	// Value is true - switch to false
	if (ToggleFieldObj.value == "1") {
		ImgObj.src           = ImgSrcFalse;
		ToggleFieldObj.value = "0";
		
		if (ToggleAltIfFalse)
			ImgObj.alt = ToggleAltIfFalse;
	}
	else {
		ImgObj.src           = ImgSrcTrue;
		ToggleFieldObj.value = "1";
		
		if (ToggleAltIfTrue)
			ImgObj.alt = ToggleAltIfTrue;
	}
}


// GETS THE SCREEN RESOLUTION
function resizeForScreenResolution(ReturnDim, CompareToNumber, SubtractNumberFromRes) {
	res = (ReturnDim)?screen.height:screen.width;
	return (res <= CompareToNumber)?(res-SubtractNumberFromRes):CompareToNumber;
}


// 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();
	}
}


// HIGHLIGHTS ALL TEXT IN A TEXT-TYPE FORM OBJECT
function highlightText(Obj, IfValue) {
	HighlightObj = (IfValue)?((IfValue == Obj.value)?true:false):true;

	if (HighlightObj) {
		Obj.focus();
		Obj.select();
	}
}


// GETS CERTAIN VARS FROM A LIST (seperated by commas with no comma at the end -- useful for grabbing vars from window.open options)
function getVarsFromList(VarList, GetVar) {

	IndexOfVar    = VarList.indexOf(GetVar + '=') + (GetVar.length + 1);
	CommaAfterVar = VarList.substr(IndexOfVar).indexOf(",");
	return (CommaAfterVar > 0)?VarList.substr(IndexOfVar, CommaAfterVar):VarList.substr(IndexOfVar);
}


// GET HORIZONTAL CENTER OF WINDOW
function getWindowCenterX(w) {
	w = (w)?w:document.body.clientWidth;
	return ((screen.width-w)/2);
}


// GET VERTICAL CENTER OF WINDOW
function getWindowCenterY(h) {
	h = (h || navigator.appName != "Microsoft Internet Explorer")?h:document.body.clientHeight;
	return ((screen.height-h)/2);
}


// GET CENTER FOR WINDOW
function getCenterForPopupWindow(WindowOptions) {
	return ",left=" + getWindowCenterX(getVarsFromList(WindowOptions, "width")) + ",top=" + getWindowCenterY(getVarsFromList(WindowOptions, "height"));
}


// ZEROS/BLANKS VALUES OF SPECIFIC FORM ELEMENTS
function blankFormElmnts(formObj) {
	for (i=1;i<arguments.length;i++) {
		eval("Obj = formObj." + arguments[i] + ";");
		ElmntType = Obj.type;

		switch (ElmntType) {
			case "checkbox":
				Obj.checked = false;
			break;

			case "radio":
			break;

			case "select-one":
				Obj.selectedIndex = 0;
			break;

			case "select-multiple":
				Obj.selectedIndex = 0;
			break;

			default:
				Obj.value = "";
			break;
		}
	}
}


// MODIFIES INNER HTML OF AN HTML ELEMENTS
function changeInnerHTML(ElmntID, NewText) {
	document.getElementById(ElmntID).innerHTML = NewText;

	for (i=2;i<arguments.length;i++)
		eval(arguments[i]);
}


// DISABLES A FORM ELEMENT AND GREYS OUT TEXT IN A SPAN OR SPANS
function disableElmntAndGreyText(FormElmntObj, TextInElmentID, TextNormalColor, TextDisableColor, FieldNormalColor, FieldDisableColor, DisableBool) {
	DisableBool = (typeof(DisableBool) != "undefined")?DisableBool:!FormElmntObj.disabled;

	FormElmntObj.disabled                               = DisableBool;
	FormElmntObj.style.background                       = (DisableBool)?FieldDisableColor:FieldNormalColor;
	document.getElementById(TextInElmentID).style.color = (DisableBool)?TextDisableColor:TextNormalColor;
}


// MODIFIES VALUES OF FORM FIELDS AND SUBMITS THE FORM
// (only works with <select> menus on MSIE, and string-based input fields
function submitFormWithNewFieldValues(formObj) {
	ArgCounter = 1;
	while (ArgCounter < arguments.length) {
		i = ArgCounter;

		symbol = (arguments[i+2] == true)?"+":"";
		eval("formObj." + arguments[i] + ".value " + symbol + "= \"" + arguments[i+1] + "\";");

		ArgCounter += 3;
	}

	formObj.submit();
}


// 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;
}


// TOGGLES AN IMAGE
function toggleImg(ImgID, Src1, Src2) {
	CurrentImg = document.getElementById(ImgID);

	if (CurrentImg.src == Src1)
		CurrentImg.src = Src2;
	else
		CurrentImg.src = Src1;
}


// CONVERTS A URL (ADDS HTTP:// IF NO PROTOCOL)
function convertURL(URLStr) {
	URL_RegExp = new RegExp("^[a-zA-Z]{1,6}\://");
	return (!String(URLStr).match(URL_RegExp))?"http://" + URLStr:URLStr;
}


// MOVES AN ITEM IN THE SELECT MENU
function moveItemInSelectMenu(SelectObjID, DirectionUpBOOL) {
	SelectObj     = document.getElementById(SelectObjID);
	opt           = SelectObj.selectedIndex;
	SwapWithIndex = (DirectionUpBOOL == 1)?opt+1:opt-1;

	if ((DirectionUpBOOL == 1 && opt < SelectObj.length - 1) || (!DirectionUpBOOL && opt > 0)) {
		TmpValue = SelectObj[opt].value;
		TmpText  = SelectObj[opt].text;

		SelectObj[opt].value = SelectObj[SwapWithIndex].value;
		SelectObj[opt].text  = SelectObj[SwapWithIndex].text;

		SelectObj[SwapWithIndex].value = TmpValue;
		SelectObj[SwapWithIndex].text  = TmpText;

		SelectObj[SwapWithIndex].selected = true;
	}
}


// REMOVE DEFAULT VALUE FOR FORM FIELD
function removeDefaultFormFieldValue(obj, DefaultValue) {

	if (!obj.value && event.type == "blur")
		obj.value = DefaultValue;

	if (obj.value == DefaultValue && (event.type == "click" || event.type == "focus"))
		obj.value = "";
}


// DISABLES "ENTER" KEY IN FORMS
function disableEnterKeyInForms() {
     return !(window.event && window.event.keyCode == 13);
}


// TOGGLES DISABLED STATUS FOR FORM ELMNT AND TOGGLES TEXT COLOR
// 4th and 5th arguments and optionally be text colors for disabled and enabled, respectively
function toggleDisable(BaseObj, TargetObj, TargetTextID) {
	if (!BaseObj.checked) {
		FontColor = (arguments[3])?arguments[3]:"#898989";
		toggle    = true;
	}
	else {
		FontColor = (arguments[4])?arguments[4]:"#000000";
		toggle    = false;
	}

	TargetObj.disabled = toggle;
	document.getElementById(TargetTextID).style.color = FontColor;
}


// LIMITS THE MAXIMUM LENGTH OF TEXT OBJECTS WITH NO SUCH HTML PROPERTY (ie.: TEXTAREA)
function limitFormFieldLength(obj, maxlength) {
	if (obj.value.length >= maxlength) {
		obj.value.length = maxlength;
		obj.value        = String(obj.value).substr(0, maxlength);
	}
}


// DATE AND/OR TIME
function clearDateTimeSelectMenus(formObj, SelectStartNames) {
	eval("if (typeof(formObj." + SelectStartNames + "_year) != \"undefined\")   formObj." + SelectStartNames + "_year.selectedIndex = 0");
	eval("if (typeof(formObj." + SelectStartNames + "_month) != \"undefined\")  formObj." + SelectStartNames + "_month.selectedIndex = 0");
	eval("if (typeof(formObj." + SelectStartNames + "_day) != \"undefined\")    formObj." + SelectStartNames + "_day.selectedIndex = 0");
	eval("if (typeof(formObj." + SelectStartNames + "_hour) != \"undefined\")   formObj." + SelectStartNames + "_hour.selectedIndex = 0");
	eval("if (typeof(formObj." + SelectStartNames + "_minute) != \"undefined\") formObj." + SelectStartNames + "_minute.selectedIndex = 0");
	eval("if (typeof(formObj." + SelectStartNames + "_ampm) != \"undefined\")   formObj." + SelectStartNames + "_ampm.selectedIndex = 0");
}


// RETURNS VALUE OR TEXT (WHATEVER IS SPECIFIED) FROM A SELECTED OPTION IN A SELECTED ELEMENT
function sel(obj, vORt) {
	eval("ReturnData = obj[obj.selectedIndex]." + vORt);
	return ReturnData;
}


// GETS THE TEXT FROM A SELECT MENU BASED ON A SPECIFIED VALUE
function getTextFromValue(selectObj, ValueToFind) {
	for (var i=0;i<selectObj.length;i++) {
		if (selectObj[i].value == ValueToFind)
			return selectObj[i].text;
	}
}


// FINDS THE NUMBER OF DAYS IN A GIVEN MONTH
function JS_NumDaysInMonth(month, year) {
	var Days31 = "01,03,05,07,08,10,12,";
	var Days30 = "04,06,09,11,";

	StrToMatch = month + ",";
	StrToMatch.toString();

	if (Days31.match(StrToMatch)) {
		return 31;
	}
	else if (Days30.match(StrToMatch)) {
		return 30;
	}
	else {
		if (JS_CheckIfLeapYear(year))
			return 29;
		else
			return 28;
	}
}


// CHECKS WHETHER OR NOT A GIVEN YEAR IS A LEAP-YEAR
function JS_CheckIfLeapYear(year) {
	return year % 4 == 0 && year % 100 != 0;
}


// ADDS NUMBER OF SECONDS AT A GIVEN INTERVAL TO A TIMESTAMP
function JS_findEndTimestamp(timestamp, seconds, SecondsIntervals) {

	timestamp = String(timestamp);

	second = timestamp.substr(12, 2);
	minute = timestamp.substr(10, 2);
	hour   = timestamp.substr(8, 2);
	day    = timestamp.substr(6, 2);
	month  = timestamp.substr(4, 2);
	year   = timestamp.substr(0, 4);

	SecondsCounter = 0;
	ActualCounter  = 1;
	while (SecondsCounter < seconds) {

		second++;

		if (second == 60 || SecondsIntervals >= 60) {
			minute++
			second = 0;

			if (minute == 60 || SecondsIntervals >= 3600) {
				hour++;
				minute = 0;

				if (hour == 24 || SecondsIntervals >= 86400) {
					day++;
					hour = 0;

					NumDaysInCurrentIterMonth = JS_NumDaysInMonth(month, year);
					if (day >= (NumDaysInCurrentIterMonth+1) || SecondsIntervals >= (NumDaysInCurrentIterMonth * 86400)) {
						day = 1;
						month++;

						NumDaysInCurrentIterYear = (JS_CheckIfLeapYear(year))?366:365;
						if (month == 13 || NumDaysInCurrentIterYear > (365 * 86400)) {
							year++;
							month = 1;
						}
					}
				}
			}
		}

		DateToReturn   = year + JS_addLeadingZero(month) + JS_addLeadingZero(day) + JS_addLeadingZero(hour) + JS_addLeadingZero(minute) + JS_addLeadingZero(second);
		SecondsCounter = ActualCounter * SecondsIntervals;

		ActualCounter++;
	}

	return DateToReturn;
}


// CONVERTS 24-TO-12 HOUR TIME
function JS_convertTime24to12(HourValue, HourVarIdent, AMPMVarItent) {

	if (HourValue > 12) {
		eval(HourVarIdent + " = " + (HourValue - 12) + "; " + AMPMVarItent + " = 'pm'; ");
	}
	else {
		if (HourValue == 0) {
			eval(HourVarIdent + " = 12; " + AMPMVarItent + " = 'am'; ");
		}
		else {
			eval(HourVarIdent + " = " + HourValue + "; " + AMPMVarItent + " = 'am'; ");
		}
	}
}


// CONVERTS 12-TO-24 HOUR TIME
function JS_convertTime12to24(HourValue, AMPMValue) {

	if (AMPMValue == "pm" && HourValue < 12)
		HourValue = parseInt(JS_removeLeadingZeros(HourValue)) + 12;

	if (AMPMValue == "am" && HourValue == 12)
		HourValue = JS_addLeadingZero(0);

	return HourValue;
}


// JAVASCRIPT BUBBLE SORT (ASSUMES NUMERICAL KEY ARRAY)
function JS_BubbleSort(ArrayToSort) {

	for (var i=0;i<ArrayToSort.length;i++) {
		for (var j=0;j<i;j++) {

			if (ArrayToSort[j] > ArrayToSort[i]) {
				tmp            = ArrayToSort[j];
				ArrayToSort[j] = ArrayToSort[i];
				ArrayToSort[i] = tmp;
			}
		}
	}

	return ArrayToSort;
}


// BLANKS OUT A FORM INSTEAD OF RESETTING IT
function completelyResetForm(formObj, DisableFields, SetValues, SkipElmntTypes) {

	DisableFields_array  = (DisableFields)?DisableFields.split(","):new Array();
	SetValues_array      = (SetValues)?SetValues.split(","):new Array();
	SkipElmntTypes_array = (SkipElmntTypes)?SkipElmntTypes.split(","):new Array();

	for (i in SetValues_array) {
		VarArray = SetValues_array[i].split("=");
		eval("value_" + VarArray[0] + " = '" + ((typeof VarArray[1] == "undefined")?"":VarArray[1]) + "'");
	}

	for (i=0;i<formObj.elements.length;i++) {

		CurrentType = formObj.elements[i].type;		
		if (!in_array(CurrentType, SkipElmntTypes_array)) {
			
			CurrentName = formObj.elements[i].name;
			eval("if (typeof(value_" + CurrentName + ") != 'undefined') { CurrentValue = value_" + CurrentName + "; } else { CurrentValue = false; } ");

			switch (CurrentType) {
	
				// Text box - set value to ""
				case "text":
					formObj.elements[i].value = (CurrentValue)?CurrentValue:"";
				break;
	
				// Select-one - set selectedIndex = 0
				case "select-one":
					formObj.elements[i].selectedIndex = (CurrentValue)?CurrentValue:0;
				break;
	
				// Select-multiple - set SelectedIndex = "";
				case "select-multple":
					formObj.elements[i].selectedIndex = (CurrentValue)?CurrentValue:"";
				break;
	
				// Select-multiple - set SelectedIndex = "";
				case "checkbox":
					formObj.elements[i].checked = (CurrentValue == formObj.elements[i].value)?true:false;
				break;
	
				// Select-multiple - set SelectedIndex = "";
				case "radio":
					formObj.elements[i].checked = (CurrentValue == formObj.elements[i].value)?true:false;
				break;
			}

			if (in_array(formObj.elements[i].name, DisableFields_array) && formObj.elements[i].name != "")
				formObj.elements[i].disabled = true;
		}
	}
}

// OPENS A WINDOW TO DISPLAY AN IMAGE, BUT ALSO HAS A DOCUMENT.TITLE
function openImageWindow(ImgFile, WindowOptions, WindowTitle) {
	tmpName = Math.random();
	winName = String(tmpName).replace(/\./, "");

	imgWin = window.open("", winName, WindowOptions + ",left=" + getWindowCenterX(getVarsFromList(WindowOptions, "width")) + ",top=" + getWindowCenterY(getVarsFromList(WindowOptions, "height")));

	with (imgWin.document) {
		open();
		write("<html><head><title>" + WindowTitle + "</title></head><body onLoad=\"window.focus()\"><img src=\"" + ImgFile + "\"></body></html>");
		close();
	}
}


// JUMPS TO A URL BASED ON VALUE OF SELECT MENU, BUT ONLY IF VALUE VALUE != ""
function jumpToURLFromSelectOne(obj) {
	if (obj[obj.selectedIndex].value)
		document.location.href = obj[obj.selectedIndex].value
}


// CHECKS FOR A BAD URL
function JS_checkBadURL(url, word) {

	if (!word)
		word = "URL";

	if (!url.match(/^(((http(s*))|(ftp(s*)))\:\/\/)*[a-z0-9.-]{2,}.[a-z]{2,4}/)) {
		alert("Please enter a valid " + word);
		return true;
	}
	else {
		return false;
	}
}


// DISABLES EVERY FIELD EXCEPT FOR THE SPECIFIED FIELD(S) IN A FORM
function disableAllFormFields(formObj, IgnoreFieldNameArray, AdditionalCommands) {
	for (i=0;i<formObj.length;i++) {
		if (!in_array(formObj.elements[i].name, IgnoreFieldNameArray)) {
			formObj.elements[i].disabled = true;

			if (AdditionalCommands)
				eval(AdditionalCommands);
		}
	}
}


// 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 != JS_addLeadingZero(i))
			DayElmntObj[AltCounter].value = JS_addLeadingZero(i);

		if (DayOptions && DayElmntObj[AltCounter].text != DayOptions[i])
			DayElmntObj[AltCounter].text = (DayOptions)?DayOptions[i]:i;

		AltCounter++;
	}
}


// MOVES AN ITEM IN THE STORAGE FIELD FOR A SELECT MENU
function moveItemInStorageFieldForSelectMenu(StorageObj, SelectObj_ID, DirectionUpBOOL) {
	StorageObjValue_array = StorageObj.value.split("*");
	SelectObj             = document.getElementById(SelectObj_ID);
	SelectedOptValue      = SelectObj[SelectObj.selectedIndex].value;

	// Loop through array to swap values where necessary
	for (i=0;i<StorageObjValue_array.length;i++) {
		if (SelectedOptValue == StorageObjValue_array[i]) {
			tmp                                  = StorageObjValue_array[i];
			SwapWithIndex                        = (DirectionUpBOOL)?i+1:i-1;
			StorageObjValue_array[i]             = StorageObjValue_array[SwapWithIndex];
			StorageObjValue_array[SwapWithIndex] = tmp;

			break;
		}
	}

	// Loop through array to re-create string
	NewStorageObjValue = "";
	for (i=0;i<StorageObjValue_array.length;i++) {
		if (i > 0)
			NewStorageObjValue += "*";

		NewStorageObjValue += StorageObjValue_array[i];
	}

	StorageObj.value = NewStorageObjValue;

	// Move the item in the select menu
	moveItemInSelectMenu(SelectObj_ID, DirectionUpBOOL);
}


// INSERTS <OPTION> INTO A <SELECT> ELEMENT BASED ON THE VALUE OF ANOTHER FORM FIELD
function insertIntoSelectMenuFromOtherElmnt(SourceElmntObj, TargetElmntID, ErrMsg_Blank, ErrMsg_Duplicate, StorageObj, ClearSourceElmntObj, OverrideText) {
	TargetObj          = document.getElementById(TargetElmntID);
	len                = TargetObj.length;
	SourceIsSelectMenu = (SourceElmntObj.type == "select-one" || SourceElmntObj.type == "select-multiple");

	if (len == 1 && TargetObj.disabled)
		len = 1;
	else
		len = len + 1;

	AddItem = true;
	for (i=0;i<TargetObj.length;i++) {
		CurrentValue = (SourceIsSelectMenu)?SourceElmntObj[SourceElmntObj.selectedIndex].value:SourceElmntObj.value;
		if (CurrentValue == "") {
			alert(ErrMsg_Blank);
			AddItem = false;
			break;
		}
		else {
			if (TargetObj[i].value == CurrentValue || TargetObj[i].text == CurrentValue) {
				if (ErrMsg_Duplicate)
					alert(ErrMsg_Duplicate);
				else
					DuplicateExists = true;

				AddItem = false;
				break;
			}
		}
	}

	if (AddItem) {

		TargetObj.disabled = false;
		TargetObj.length   = len;
		CurrentOption      = len - 1;

		if (SourceIsSelectMenu) {
			TargetObj[CurrentOption].value = SourceElmntObj[SourceElmntObj.selectedIndex].value;
			TargetObj[CurrentOption].text  = SourceElmntObj[SourceElmntObj.selectedIndex].text;
       		}
		else {

			CurrentValue = escape(SourceElmntObj.value);
			NewValue     = "";

			for (i=0;i<CurrentValue.length;i++) {
				if (CurrentValue.charAt(i) == "*")
					NewValue += "*";
				else
					NewValue += CurrentValue.charAt(i);
			}

			TargetObj[CurrentOption].value = NewValue;
			TargetObj[CurrentOption].text  = (OverrideText)?OverrideText:SourceElmntObj.value;
		}
	}

	StorageObj.value = "";
	for (i=0;i<TargetObj.length;i++) {
		StorageObj.value += TargetObj[i].value;
		if (i != (TargetObj.length - 1)) StorageObj.value += "*";
	}

	if (ClearSourceElmntObj)
		SourceElmntObj.value = "";
}


// REMOVES AN ITEM FROM A SELECT MENU
function removeItemFromSelectMenu(SelectMenuID, NoneSelectedText, StorageObj) {
	SelectMenuObj          = document.getElementById(SelectMenuID);
	RebuildSelectMenuValue = new Array();
	RebuildSelectMenuText  = new Array();

	AltCounter = 0;
	var tmp = "";
	for (i=0;i<SelectMenuObj.length;i++) {
		if (SelectMenuObj.selectedIndex != i) {
			RebuildSelectMenuText[AltCounter]  = SelectMenuObj[i].text;
			RebuildSelectMenuValue[AltCounter] = SelectMenuObj[i].value;
			AltCounter++;
		}
	}

	SelectMenuObj.length = RebuildSelectMenuText.length;

	if (SelectMenuObj.length == 0) {
		SelectMenuObj.length   = 1;
		SelectMenuObj[0].text  = "(" + NoneSelectedText + ")";
		SelectMenuObj[0].value = "";
		SelectMenuObj.disabled = true;
		StorageObj.value       = "";

		SelectMenuObj.blur();
	}
	else {
		StorageObj.value = "";

		for (i=0;i<RebuildSelectMenuText.length;i++) {
			SelectMenuObj[i].text  = RebuildSelectMenuText[i];
			SelectMenuObj[i].value = RebuildSelectMenuValue[i];

			StorageObj.value += RebuildSelectMenuValue[i];
			if (i < (RebuildSelectMenuText.length - 1))
				StorageObj.value += "*";
		}
	}
}

// RUNS COMMAND AFTER CLOSING A WINDOW
function runCommandAfterCloseWindow(command) {
	if (self.screenTop > 10000 || window.closed)
		eval(command);
}

// POP-UP CUSTOM ALT BOX
function popupCustomAltBox(objID, HTML) {
	var x = event.clientX + document.body.scrollLeft;
	var y = event.clientY + document.body.scrollTop;
	document.getElementById(objID).innerHTML        = "<table border=0 cellpadding=0 cellspacing=1 bgcolor=\"000000\"><tr><td bgcolor=\"#FFFFE0\"><font style=\"font-family:'MS Sans Serif';font-size:10\">" + HTML + "</font></td></tr></table>";
	document.getElementById(objID).style.left       = x;
	document.getElementById(objID).style.top        = y;
	document.getElementById(objID).style.visibility = "visible";
}

function hideCustomAltBox(objID, currentObj) {
	document.getElementById(objID).style.visibility = "hidden";
}


// DISABLES PRICE-CAD BOOLEAN FOR REAL ESTATE SEARCH
function disablePriceCADBoolean() {
	document.RealEstateMgr_SearchForm.BooleanMethod_PriceCAD.disabled = !document.RealEstateMgr_SearchForm.PriceCAD_Lowest.value && !document.RealEstateMgr_SearchForm.PriceCAD_Highest.value;
}

// DISABLES ANOTHER FORM FIELD BASED ON THIS (CURRENT FIELD) VALUE
function disableFieldBasedOnCurrentValue(formObj, CurrentField, FieldToDisable) {
	for (i=3;i<arguments.length;i++) {

		DisableField = false;
		FieldObj     = formObj[CurrentField];
		FieldObjType = FieldObj.type;

		if (FieldObjType == "select-one" || FieldObjType == "select-multiple" || FieldObjType == "text")
			DisableField = formObj[CurrentField].value == arguments[i];

		else if (FieldObjType == "radio" || FieldObjType == "checkbox")
			DisableField = formObj[CurrentField].checked == arguments[i];

		else if (FieldObjType == "undefined") {
			found   = false;
			counter = 0;
			while (found == false) {
				if (typeof(FieldObj[0]) != undefined)
					DisableField = FieldObj[0].value = arguments[i] && FieldObj[0].checked;
			}
		}

		if (DisableField) {
			formObj[FieldToDisable].disabled = true;
			break;
		}
		else {
			formObj[FieldToDisable].disabled = false;
		}
	}
}


// OPEN BOOKINGS WINDOW AND EXPLAIN TO USER
function confirmOverrideBookingsWindow(FormName, StartTime, EndTime) {
	if (confirm("A new window will be opened displaying the conflicting bookings.  Once you close that window, this form will be resubmitted.\n\nOpen New Window?"))
		popPrintWindow("reports_bookings.php?FormName=" + FormName + "&anyDate=true&viewPrintable=true&status=implicit_approved&DisplayFromStartTime=" + StartTime + "&DisplayToEndTime=" + EndTime);
}


// OPENS A MODAL DIALOG WITH A PHP SCRIPT TO SHOW A FEW OPTIONS
function showModalDialog_Options(dialogURL, w, h, ExecCommand) {
	UserChoice = window.showModalDialog(dialogURL, window, 'dialogWidth:' + w + 'px; dialogHeight:' + h + 'px; resizable: no; help: no; status: yes; scroll: no;');

	if (typeof(UserChoice) != "undefined" && UserChoice != false)
		eval(ExecCommand);
}


// CREATES AN ARRAY FOR THE HTMLAREA INSERT IMAGE POPUP
function createIDArrayFromCheckboxes(formObj, InitFieldName) {
	DirsToRead_Array        = false;
	DirsToRead_Array        = new Array();
	DirsToRead_Array.length = 0;
	array_counter           = 0;
	
	tmp = "";
	for (var i=0;i<formObj.elements.length;i++) {
		
		if (formObj.elements[i].type == "checkbox") {
		
			//CurrentID = String(formObj.elements[i].name).replace(InitFieldName + "_", "").replace(/_[0-9]{1,}$/, "");
			NixInitFieldName = String(String(formObj.elements[i].name).substr(String(InitFieldName).length+1));
			CurrentID        = parseInt(NixInitFieldName.substring(NixInitFieldName, NixInitFieldName.indexOf("_")));
			
			if (CurrentID != '' && !isNaN(CurrentID)) {
			
				// formObj.elements[i].name.match(/ + InitFieldName + "_[0-9]{1,}_[0-9]{1,}$/) && 
				
				if (!in_array(CurrentID, DirsToRead_Array) && formObj.elements[i].checked) {
					DirsToRead_Array[array_counter] = CurrentID;
					array_counter++;
				}
			}
		}
	}
}


// CHECKS OFF DUPLICATE IDs for a Hierarchy links table setup
function toggleDuplicateIDs(formObj, ID, CurrentCounter, InitFieldName, ToggleAttribute, InitToggleImgID, ImgSrcOn, ImgSrcOff) {
	counter         = 0;
	LoopCheckVar    = true;
	ToggleAttribute = (ToggleAttribute)?ToggleAttribute:"checked";
	
	while (LoopCheckVar == true) {
		CurrentElmntName = InitFieldName + "_" + ID + "_" + counter;
		if (eval(formObj[CurrentElmntName])) {
			eval("formObj." + InitFieldName + "_" + ID + "_" + counter + "." + ToggleAttribute + " = formObj." + InitFieldName + "_" + ID + "_" + CurrentCounter + "." + ToggleAttribute);
			
			if (InitToggleImgID && ImgSrcOn && ImgSrcOff)
				eval("document.getElementById('" + InitToggleImgID + "_" + ID + "_" + counter + "').src = (formObj." + InitFieldName + "_" + ID + "_" + CurrentCounter + "." + ToggleAttribute + " == 1)?ImgSrcOn:ImgSrcOff");
		}
		else
			break;

		counter++;
	}
}


// 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;
}


// VALIDATES A SINGLE FILE FIELD
function validateSingleFileField(formFieldObj, ValidFileTypesStr, FieldNameOutput) {
	CurrentFieldValue      = formFieldObj.value;
	UserExtension          = CurrentFieldValue.substr((CurrentFieldValue.lastIndexOf(".")+1), CurrentFieldValue.length);

	if (validateFileType(ValidFileTypesStr, UserExtension) && CurrentFieldValue != "")
		ErrList += " - The " + FieldNameOutput + " you selected is an invalid file type.\n";
}


// LOOPS THROUGH A LIST OF ORDINALY NAMED FILES AND VALIDATES
function loopThroughMultipleFileFields(formObj, InitFieldName, NumFiles, ValidFileTypesStr, FieldNameOutput) {
	var ImgErr = false;

	for (i=0;i<NumFiles;i++) {
		CurrentFieldName       = InitFieldName + i;
		CurrentFieldValue      = formObj[CurrentFieldName].value;
		UserExtension          = CurrentFieldValue.substr((CurrentFieldValue.lastIndexOf(".")+1), CurrentFieldValue.length);

		if (validateFileType(ValidFileTypesStr, UserExtension) && CurrentFieldValue != "")
			ErrList += " - " + FieldNameOutput + " #" + (i+1) + " you selected is not a valid file type\n";
	}
}


// COMPARES A LIST OF VALID FILE EXTENSIONS
function validateFileType(ValidFileTypesStr, FileExt) {
	ValidFileTypesStr = ValidFileTypesStr.split(" ");
	var ImgErr        = true;

	for (j=0;j<ValidFileTypesStr.length;j++) {
		ValidExtension   = false;
		FileExtLowerCase = FileExt.toLowerCase();

		if (FileExtLowerCase == ValidFileTypesStr[j])
			ValidExtension = true;

		if (ValidExtension) {
			ImgErr = false;
			break;
		}
	}

	return ImgErr;
}


// SETS THE "visibility" CSS PROPERTY OF AN OBJECT TO "hidden" OR "visible"
function toggleCSSVisibility(objID, displayOverride) {
	
	if (displayOverride)
		document.getElementById(objID).style.visibility = displayOverride;
	
	else {
		v = document.getElementById(objID).style.visibility;
		if (v == "visible" || v == "")
			document.getElementById(objID).style.visibility = "hidden";
		else
			document.getElementById(objID).style.visibility = "visible";
	}
}


// 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.value                     = (displayOverride == "block")?'1':'0';
	}
	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;
		}
	}
}

// CHANGES AN IMAGE
function changeImgSrc(imgName, newSrc) {
	document[imgName].src = newSrc;
}



// OPENS PASSWORD-RECOVERY WINDOW
function openPasswordRecoveryWindow() {
	window.open(JS_http_path_to_provisioner + "/admin/global/password_recover.php", "passwordRecoveryWindow", "left=" + getWindowCenterX(500) + ",top=" + getWindowCenterY(200) + ",width=500,height=200" + JS_PopupsResizable);
}


// UNCHECKS ALL CHECKBOXES THAT ARE DISABLED
function unCheckDisabledCheckboxes(formObj) {
	for (i=0;i<formObj.elements.length;i++) {
		if (formObj.elements[i].type == "checkbox" && formObj.elements[i].disabled == true)
			formObj.elements[i].checked = false;
	}
}

// OPENS DIALOGE WITH OPTIONS
function openDialogOptions(dialogWidth, dialogHeight, dynamicPHPScriptValue, submitFormToDialog) {
	dialogeWindow = window.showModelessDialog(dynamicPHPScriptValue, self, "dialogHeight:" + dialogHeight + "px;dialogWidth:" + dialogWidth + "px;status:false:help:false;");

	if (submitFormToDialog) {
		document[submitFormToDialog].action = dynamicPHPScriptValue;
		document[submitFormToDialog].target = 'OptionWindow';
		document[submitFormToDialog].submit();
	}
}


// CALCULATES TAX INFO
function calculateTaxInfo(TaxField, OriginalAmount, TaxRatePercent, OutputTaxAmount) {

	GST_Output  = "";
	TotalAmount = "";
	TaxAmount   = "";

	// No GST
	if (TaxField[0].checked) {
		GST_Output  = "(No GST)";
		TotalAmount = OriginalAmount;
	}

	// GST included
	else if (TaxField[1].checked) {
		GST_Output  = "(Includes GST)";
		TotalAmount = OriginalAmount;
	}

	// GST added
	else {
		GST_Output = "(Plus ";

		if (OutputTaxAmount) {
			TaxAmount   = roundWithTrailingZeros(OriginalAmount * (TaxRatePercent/100), 2);
			GST_Output += "$" + TaxAmount;
		}

		GST_Output  += " GST)";
		TotalAmount  = roundWithTrailingZeros(parseFloat(OriginalAmount) + parseFloat(TaxAmount), 2);
	}
}


// DISPLAYS INFO FOR WHETHER OR NOT CHARGING GST
function displayTaxInfo(TaxOutputElmnt, TaxField, OriginalAmount, TaxRatePercent, TotalAmountOutputElmnt, OutputTaxAmount) {

	calculateTaxInfo(TaxField, OriginalAmount, TaxRatePercent, OutputTaxAmount);

	document.getElementById(TaxOutputElmnt).innerHTML = GST_Output;

	if (TotalAmount && TotalAmountOutputElmnt)
		document.getElementById(TotalAmountOutputElmnt).innerHTML = roundWithTrailingZeros(TotalAmount, 2);
}


// CLEARS RATE RULE INFORMATION
function clearRateRuleInfo(formName) {
	document[formName].RateRuleID.value = "1";
	document[formName].RateRuleName.value = "(no rate selected)";
}


// SEARCH TEXT IN PAGE FUNCTION
// Original:  Mike Hall (MHall75819@aol.com)
// Web Site:  http://members.aol.com/MHall75819

// This script and many more are available free online at
// The JavaScript Source!! http://javascript.internet.com
function findInPage(str, SearchInObj) {
	var txt, i, found;

	var NS4 = (document.layers);
	var IE4 = (document.all);
	
	var win = this;
	var n   = 0;
	
	if (str == "")
		return false;

	/*
	if (NS4) {
		if (!win.find(str))
			while(win.find(str, false, true))
				n++;
		else
			n++;

		if (n == 0)
			alert(str + " was not found on this page.");
	}
	*/
	
	if (IE4) {
		txt = (SearchInObj)?SearchInObj.createTextRange():win.document.body.createTextRange();
		for (i = 0; i <= n && (found = txt.findText(str)) != false; i++) {
			txt.moveStart("character", 1);
			txt.moveEnd("textedit");
		}
		
		if (found) {
			txt.moveStart("character", -1);
			txt.findText(str);
			txt.select();
			txt.scrollIntoView();
			n++;
		}
		else {
			if (n > 0) {
				n = 0;
				findInPage(str);
			}
			else
				alert("The facility \"" + str + "\" was not found.");
		}
	}
	
	return false;
}


// SUBMITS A FORM TO A POPUP WINDOW THAT IS NOT YET OPENED
function submitFormToPopUp(formObj, ScriptName, WindowName, w, h, AdditionalWindowOptions) {
	w = (w)?w:JS_default_form_window_width;
	h = (h)?h:JS_default_form_window_height;

	if (AdditionalWindowOptions) AdditionalWindowOptions = "," + AdditionalWindowOptions;

	window.open(ScriptName, WindowName, "left=" + getWindowCenterX(w) + ",top=" + getWindowCenterY(h) + ",width=" + w + ",height=" + h + AdditionalWindowOptions);

	formObj.target = WindowName;
	formObj.action = ScriptName;
	formObj.submit();
}

// FOCUSES ON OPENER WINDOW AND CLOSES CURRENT WINDOW
function closeWin(refreshOpener, redirectOpenerTo, DoNotCalcForBrowser) {

	var openerExists = window.opener && !window.opener.closed;
	var redirected   = false;
	
	if (openerExists) {
		if (redirectOpenerTo) {
			if ((!DoNotCalcForBrowser)?navigator.appName == "Microsoft Internet Explorer":!refreshOpener) {
				window.opener.location.href = redirectOpenerTo;
				redirected = true;
			}
		}
		
		if (refreshOpener && !redirected) {
			if (navigator.appName == "Microsoft Internet Explorer")
				window.opener.history.go(0);
			else
				window.opener.location.reload();
		}
	}

	window.blur();
	
	if (openerExists)
		window.opener.focus();

	window.parent.close();
}


// CONFIRMS AN ACTION BEFORE EXECUTING (eg.: deleting something)
function confirmCommand(question, command) {
	if (confirm(question))
		eval(command);
}


// CONFIRMS ACTION THEN SUBMITS A FORM RATHER THAN REDIRECTS TO ANOTHER LOCATION
function confirmSubmitForm(question, formName, newAction) {
	SubmitForm = false;
	if (!question)
		SubmitForm = true;
	else
		SubmitForm = confirm(question);

	if (SubmitForm) {
		document[formName].action = newAction;
		document[formName].submit();
	}
}

// INSERTS HTML TAGS INTO TEXTAREAS
function insertTag(tag, close, formAndFormField) {
	if (!close || close == "") {
		closingTag = "</" + tag + ">";
	}
	else if (close == "none") {
		closingTag = "";
	}
	else {
		closingTag = "</" + close + ">";
	}
	formAndFormField.value += "<" + tag + ">" + closingTag;
	formAndFormField.focus();
}

// OPENS THE TAGS HELP FILE
function openTagsHelp(num_srcStepBacks) {
	window.open(JS_http_path_to_provisioner + "/admin/docs/tags_help.html", "tagshelpwin", "left=" + getWindowCenterX(400) + ",top=" + getWindowCenterY(500) + ",width=400,height=500,scrollbars" + JS_PopupsResizable);
}

// OPENS THE HELP FILES/DOCUMENTATION
function openHelp() {
	window.open(JS_http_path_to_provisioner + "/admin/docs/index.html", "mainHelpWin", "left=" + getWindowCenterX(650) + ",top=" + getWindowCenterY(520) + ",width=650,height=520" + JS_PopupsResizable);
}


// OPENS A PRESIZED WINDOWS FOR AN HTML FORM
function openForm(FileNameOfWindow, w, h, redirectAfterOpening, overRideFormName) {
	winWidth  = (w)?w:JS_default_form_window_width;
	winHeight = (h)?h:JS_default_form_window_height;

	if (overRideFormName) {
		winName = overRideFormName;
	}
	else {
		tmpName = Math.random();
		tmpName = tmpName.toString();
		winName = tmpName.replace(/\./, "");
	}

	window.open(JS_appendQueryStr(FileNameOfWindow, "ThisWindowWidth=" + winWidth + "&ThisWindowHeight=" + winHeight), winName, "width=" + winWidth + ",height=" + winHeight + ",scrollbars,status,left=" + getWindowCenterX(winWidth) + ",top=" + getWindowCenterY(winHeight) + JS_PopupsResizable);
	
	if (redirectAfterOpening)
		window.location.href = redirectAfterOpening;
}


// OPENS A WINDOW ACCORDING TO PASSED ARGUMENTS
function openGenWindow(FilePath, WindowOptions, CheckResToPassQueryStr, QueryStrToPass) {
	
// 	if (CheckResToPassQueryStr) {
// 		res_array = CheckResToPassQueryStr.split("x");
// 		res_x     = res_array[0];
// 		res_y     = res_array[1];
// 		
// 		if (screen.width <= res_x || screen.height <= res_y)
// 			FilePath = JS_appendQueryStr(FilePath, QueryStrToPass);
// 	}
	
	window.open(FilePath, String(Math.random()).replace(/\./, ""), WindowOptions + JS_PopupsResizable + getCenterForPopupWindow(WindowOptions));
}


// ENABLE OR DISABLE RADIO BOXES
function enableOrDisableRateRadios(formObj) {
	if (formObj.CustomerID.value == "1")
		doDisable = true;
	else
		doDisable = false;

	var num_BookingCharge = formObj.BookingCharge.length;
	for (i=0;i<num_BookingCharge;i++)
		formObj.BookingCharge[i].disabled = doDisable;

	formObj.ActualFee.disabled = doDisable;
}


// SELECTS A CHARGE FOR A BOOKING/PROGRAM/ETC (RateRuleID, custom charge, no charge)
function selectCharge(FormName, ChargeRadioName, OverrideFeeFieldName, IDChargeFieldName, DisplayChargeFieldName, OverrideDisplayText, ExtraFieldsToDisable) {

	formObj = document[FormName];

	if (formObj[ChargeRadioName][0].checked)
		DisableToggle = true;

	else {
		DisableToggle                         = false;
		formObj[IDChargeFieldName].value      = 1;
		formObj[DisplayChargeFieldName].value = (OverrideDisplayText)?OverrideDisplayText:"(no rate selected)";
	}

	formObj[OverrideFeeFieldName].disabled = DisableToggle;

	if (ExtraFieldsToDisable != "" && ExtraFieldsToDisable != false && typeof(ExtraFieldsToDisable) != "undefined") {
		ExtraFieldsToDisable_array = ExtraFieldsToDisable.split(",");
		for (i in ExtraFieldsToDisable_array) {
			if (ExtraFieldsToDisable_array[i] != "")
				formObj[ExtraFieldsToDisable_array[i]].disabled = DisableToggle;
		}
	}
}


// OPENS A WINDOW WHERE ADMIN CAN SELECT A RateRuleID (for FMS)
function openRateRuleIDSelectWindow(FacilityID, CustomerID, StartYear, StartMonth, StartDay, StartHour, StartMinute, StartAmPm, EndYear, EndMonth, EndDay, EndHour, EndMinute, EndAmPm, formName) {
	if (CustomerID == 1)
		alert("Please select a Customer");
	else if (FacilityID == 1)
		alert("Please select a Facility");
	else
		window.open("select_rateruleid.php?formName=" + formName + "&FacilityID=" + FacilityID + "&CustomerID=" + CustomerID + "&StartYear=" + StartYear + "&StartMonth=" + StartMonth + "&StartDay=" + StartDay + "&StartHour=" + StartHour + "&StartMinute=" + StartMinute + "&StartAmPm=" + StartAmPm + "&EndYear=" + EndYear + "&EndMonth=" + EndMonth + "&EndDay=" + EndDay + "&EndHour=" + EndHour + "&EndMinute=" + EndMinute + "&EndAmPm=" + EndAmPm, "RateRuleIDSelectWindow", "width=750,height=350,scrollbars,left=" + getWindowCenterX(750) + ",height=" + getWindowCenterY(350) + JS_PopupsResizable);
}


// CHECK IF RATE RULE ID IS NECESSARY TO BE SELECTED (not needed for program bookings)
function checkIfRateRuleIDIsNecessary(formObj) {
	if (formObj == document.ProgramsForm) {
		openWin = true;
	}
	else {
		if (formObj.name = "BookingsForm") {
// 			if (formObj.ProgramID.value > 1) {
// 				alert("No Rate is necessary because this is a program booking");
// 				openWin = false;
// 			}
// 			else {
				openWin = true;
// 			}
		}
	}

	if (openWin) {
		if (formObj.CustomerID.value < 1)
			alert("Please select a customer");
		else if (formObj.FacilityID.value < 2)
			alert("Please select a facility");
		else
			openRateRuleIDSelectWindow(formObj.FacilityID.value, formObj.CustomerID.value, formObj.StartTime_year.value, formObj.StartTime_month.value, formObj.StartTime_day.value, formObj.StartTime_hour.value, formObj.StartTime_minute.value, formObj.StartTime_ampm.value, formObj.EndTime_year.value, formObj.EndTime_month.value, formObj.EndTime_day.value, formObj.EndTime_hour.value, formObj.EndTime_minute.value, formObj.EndTime_ampm.value, formObj.name);
	}
}


// TOGGLES THE DATE SELECTIONS (None, Single, Range)
function toggleDateSelections(formObj, radioElmntName, setTextElmnt, setTextElmntValue) {
	if (eval("formObj." + radioElmntName + "[0].checked")) {
		disable0 = true;
		disable1 = true;
		SetField = false;
	}
	else if (eval("formObj." + radioElmntName + "[1].checked")) {
		disable0 = false;
		disable1 = true;
		SetField = true;
	}
	else {
		disable0 = true;
		disable1 = false;
		SetField = true;
	}

	formObj.SingleDate_month.disabled = disable0;
	formObj.SingleDate_year.disabled  = disable0;
	formObj.SingleDate_day.disabled   = disable0;

	formObj.RangeStartDate_month.disabled = disable1;
	formObj.RangeStartDate_year.disabled  = disable1;
	formObj.RangeStartDate_day.disabled   = disable1;
	formObj.RangeEndDate_month.disabled   = disable1;
	formObj.RangeEndDate_year.disabled    = disable1;
	formObj.RangeEndDate_day.disabled     = disable1;

	if (SetField && setTextElmnt)
		formObj[setTextElmnt].value = setTextElmntValue;
}


// EXECUTES AN ACTION FROM A <SELECT> BOX IN A REPORT (APPROVED, DECLINE, CANCEL, ETC...)
function doReportAction(formObj, selectMenuName, RunActionBeforeSubmit) {
	var selectMenu = document.all[selectMenuName];

	if (selectMenu.value != "") {
		if (confirm('Are you sure you want to ' + selectMenu.options[selectMenu.selectedIndex].text + "?  Transactions that this option cannot be applied to will be ignored.")) {
			if (RunActionBeforeSubmit)
				eval(RunActionBeforeSubmit);

			formObj.submit();
		}
		else {
			selectMenu.value = '';
			selectMenu.blur();
		}
	}
}


// CHECKS ALL BOXES IN SPECIFIED FORM ACCORDING TO THE CHECKED STATUS OF A SPECIFIED CHECKBOX
function checkAllBoxes(formObj, doCheck, OnlyIfNameMatchesRegexpStr) {
	
	OnlyIfNameMatchesRegexp = (OnlyIfNameMatchesRegexpStr)?new RegExp(OnlyIfNameMatchesRegexpStr):false;

	AltCounter = 0;
	IgnoreName_array = new Array();
	for (i=2;i<arguments.length;i++) {
		IgnoreName_array[AltCounter] = arguments[i];
		AltCounter++;
	}

	var NumFormElements = formObj.elements.length;
	for (i=0;i<NumFormElements;i++) {
		if (formObj.elements[i].type == "checkbox" && formObj.elements[i].disabled == false && !in_array(formObj.elements[i].name, IgnoreName_array) && ((OnlyIfNameMatchesRegexp)?formObj.elements[i].name.match(OnlyIfNameMatchesRegexp):true))
			formObj.elements[i].checked = doCheck;
	}
}


// 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;
}

// 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;
}


// OPENS CHILD FACILITY ID SELECTION WINDOW
function openChildFacilityIDSelectWindow(FacilityID, isProgram, AddnlQueryStr) {
	if (FacilityID == 1 || !FacilityID)
		alert("Please select a Facility.");
	else
		window.open("select_child_facilities.php?FacilityID=" + FacilityID + "&isProgram=" + isProgram + AddnlQueryStr, "SelectChildFacilityWin", "left=" + getWindowCenterX(400) + ",top=" + getWindowCenterY(600) + ",width=400,height=600,scrollbars,status" + JS_PopupsResizable);
}


// OPENS A WINDOW WHERE ADMIN CAN SELECT A HoursOfOperationID (for FMS)
function openPeriodIDSelectWindow(FacilityID, FormName) {
	window.open("select_periodid.php?FacilityID=" + FacilityID + "&formName=" + FormName, "HoursOfOperationIDSelectWindow", "left=" + getWindowCenterX(750) + ",top=" + getWindowCenterY(350) + ",width=750,height=350,scrollbars,status" + JS_PopupsResizable);
}


// OPENS A WINDOW WHERE USER CAN SELECT ProgramFeeID FOR PROGRAMREGISTRATION
function openProgramFeeIDSelectWindow(FormName) {
	ProgramIDObj = document[FormName].ProgramID.value;
	if (ProgramIDObj > 1)
		window.open("select_programfeeid.php?ProgramID=" + ProgramIDObj + "&formName=" + FormName, "ProgramFeeIDSelectWindow", "left=" + getWindowCenterX(750) + ",top=" + getWindowCenterY(350) + ",width=750,height=350,scrollbars,status" + JS_PopupsResizable);
	else
		alert("Please select a Program.");
}


// OPENS A WINDOW WHERE USER CAN SELECT MembershipFeeID FOR Memberships
function openMembershipFeeIDSelectWindow(FormName) {
	FacilityIDVal = document[FormName].FacilityID.value;
	if (FacilityIDVal > 1)
		window.open("select_membershipfeeid.php?FacilityID=" + FacilityIDVal + "&formName=" + FormName, "MembershipFeeIDSelectWindow", "left=" + getWindowCenterX(750) + ",top=" + getWindowCenterY(350) + ",width=750,height=350,scrollbars,status" + JS_PopupsResizable);
	else
		alert("Please select a Facility.");
}


// OPENS THE HOURS OF OPERATION LIST WINDOW
function openHoursOfOperation(FacilityID) {
	if (FacilityID == 1)
		alert("Please select a facility");
	else
		window.open("view_hoursofoperation.php?FacilityID=" + FacilityID + "&ViewClosedDates=true", "HoursOfOperationDisplayWin", "left=" + getWindowCenterX(500) + ",top=" + getWindowCenterY(500) + ",width=500,height=500,scrollbars" + JS_PopupsResizable);
}


// OPENS A SMALL WINDOW FOR VIEWING A LIST OF INFO
function openViewWindow(scriptName) {
	window.open(scriptName, "ViewWindow", "left=" + getWindowCenterX(650) + ",top=" + getWindowCenterY(300) + ",width=650,height=300,scrollbars" + JS_PopupsResizable);
}


// CHANGEFORMACTION() -- CHANGES THE ACTION OF A GIVEN FORM
function changeFormAction(formObj, actionScript) {
	formObj.action = actionScript;
	formObj.submit();
}


// COPY THE VALUES FROM THREE SELECT MENUS TO THREE OTHER CORRESPONDING SELECT MENUS (DATES)
function copyDate(startYear, startMonth, startDate, endYear, endMonth, endDate) {
	endYear.value  = startYear.value;
	endMonth.value = startMonth.value;
	endDate.value  = startDate.value;
}

// MAKE WINDOW FOR PRINTABLE VERSIONS OF SCHEDULES, ETC.
function popPrintWindow(url) {
	window.open(url, "printWin", "left=" + getWindowCenterX(750) + ",top=" + getWindowCenterY(400) + ",width=750,height=400,scrollbars,menubar,toolbar" + JS_PopupsResizable);
}

// OPENS INVOICES IN A NEW WINDOW
function openInvoiceWin(customer, facility, property, program, year, month, date, doLimit) {
	window.open("invoice.php?CustomerID=" + customer + "&facility=" + facility + "&FacilityID=" + property + "&program=" + program + "&from_year=" + year + "&from_month=" + month + "&from_day=" + date + "&to_year=" + year + "&to_month=" + month + "&to_day=" + date + "&doLimit=" + doLimit, "invoiceWin", "left=" + getWindowCenterX(750) + ",top=" + getWindowCenterY(500) + ",width=750,height=500,scrollbars,menubar,toolbar" + JS_PopupsResizable);
}

// CHECKS IN INVOICE IS SELECTED (FOR reports_invoice.php)
function checkIfInvoiceSelected(formObj) {
	var NumFormElements   = formObj.elements.length;
	var InvoiceIsSelected = false;
	for (i=0;i<NumFormElements;i++) {
		if (formObj.elements[i].checked == true) {
			InvoiceIsSelected = true;
			break;
		}
	}

	if (!InvoiceIsSelected) {
		alert("Please select at least one item to view in the invoice");
		return false;
	}
	else
		openBlankInvoice(formObj, false, true);
}

// OPENS A BLANK WINDOW FOR A FORM TO SUBMIT INVOICE DATA
function openBlankInvoice(formObj, redirAfterOpen, leaveWindowOpen) {
	window.open("view_invoice.php", "invoiceWindow", "left=" + getWindowCenterX(750) + ",top=" + getWindowCenterY(500) + ",width=750,height=500,scrollbars" + JS_PopupsResizable);
	formObj.action = "view_invoice.php";
	formObj.target = "invoiceWindow";
	formObj.submit();

	if (redirAfterOpen)
		document.location = redirAfterOpen;

	else if (!leaveWindowOpen)
		window.close();
}



// OPENS A RECORD (BOOKING, REGISTRATION, MEMBERSHIP, CUSTOMER)
function openRecord(RecordType, ID, ExtraQueryStr, OverrideWindowName) {
	var ScriptName  = new Array();
	var GETVarIdent = new Array();

	// Arrays for different types of records...

	ScriptName["Bookings"]              = "record_bookings.php";
	GETVarIdent["Bookings"]             = "BookingID";

	ScriptName["ProgramRegistrations"]  = "record_programregistrations.php";
	GETVarIdent["ProgramRegistrations"] = "RegistrationID";

	ScriptName["Memberships"]           = "record_memberships.php";
	GETVarIdent["Memberships"]          = "MembershipID";

	ScriptName["Customers"]             = "record_customers.php";
	GETVarIdent["Customers"]            = "CustomerID";

	ScriptName["Programs"]              = "record_programs.php";
	GETVarIdent["Programs"]             = "ProgramID";

	WindowName    = (OverrideWindowName)?OverrideWindowName:String(Math.random()).replace(/[^0-9]/, "");
	ExtraQueryStr = (ExtraQueryStr)?"&" + ExtraQueryStr:"";

	// Open Window for Record...
	window.open(JS_http_path_to_module + "/" + ScriptName[RecordType] + "?" + GETVarIdent[RecordType] + "=" + ID + "&referrer=" + escape(document.location.href) + "&" + ExtraQueryStr, WindowName, "left=" + getWindowCenterX(750) + ",top=" + getWindowCenterY(450) + ",width=700,height=450,scrollbars,menubar,status" + JS_PopupsResizable);
}


// OPENS CONTEXT-SENSITIVE HELP POPUP WINDOWS
function popHelp(help_title, help_text, JS) {
	helpWin = window.open("", "helpWinName", "left=" + getWindowCenterX(300) + ",top=" + getWindowCenterY(220) + ",width=300,height=220,scrollbars,status" + JS_PopupsResizable);

	if (JS)
		JS = "<scr" + "ipt language=\"javas" + "cript\">" + JS + "</scr" + "ipt>";
	else
		JS = "";

	with (helpWin.document) {

		open();
		write("<html><head><title>Help</title>" + JS + "</head><body leftmargin=0 rightmargin=0 topmargin=0 bottommargin=0><table border=0 cellpadding=0 cellspacing=0 width=100%><tr><td bgcolor=\"#CDCDCD\"><font face=\"arial\" size=2><b><center>" + help_title + "</center></b></font><table border=0 cellpadding=5 cellspacing=1 width=100%><tr><td bgcolor=\"#EFEFEF\"><font face=\"arial\" size=2>" + help_text + "<br></font></td></tr></table></td></tr></table><br><center><font face=\"arial\" size=1><a href=\"javascript:if(window.opener){window.opener.focus();} window.close()\">Close</a></font></center></body></html>");
		close();
	}

	helpWin.focus();
}

// OPENS THE CALENDAR
function openCalendar(numSrcCallBacks, year, month, day, yearFormElmnt, monthFormElmnt, dayFormElmnt, formName, DayOptions, NULLSelections) {
	srcCallBacks = "";
	for ($i=0;$i<numSrcCallBacks;$i++)
		srcCallBacks += "../";

	use_DayOptions     = (DayOptions)?DayOptions:"";
	use_NULLSelections = (NULLSelections)?NULLSelections:"false";

	window.open(srcCallBacks + "admin/global/calendar.php?year=" + year + "&month=" + month + "&day=" + day + "&yearFormElmnt=" + yearFormElmnt + "&monthFormElmnt=" + monthFormElmnt + "&dayFormElmnt=" + dayFormElmnt + "&formName=" + formName + "&DayOptions=" + use_DayOptions + "&NULLSelections=" + use_NULLSelections, "calendarWin", "left=" + getWindowCenterX(315) + ",top=" + getWindowCenterY(300) + ",width=315,height=300,status" + JS_PopupsResizable);
}

// ASKS A USER TO CONFIRM AN ACTION BEFORE REDIRECTING
function confirmRedirect(question, redirect_to, currentScript) {
	if (confirm(question)) {
		newLocation = redirect_to;
		if (currentScript) newLocation += "&referrer=" + currentScript;
		document.location.href = newLocation;
	}
}


// APPEND QUERY STRING TO URL
function JS_appendQueryStr(OriginalURL, QueryStr) {
	if (OriginalURL.match(/\?/))
		return OriginalURL + "&" + QueryStr;
	else
		return OriginalURL + "?" + QueryStr;
}


// DOES A SPECIAL FORM SUBMIT
function submitFormWithNewAction(AskQuestion, formObj, NewAction) {
	if (AskQuestion) {
		if (confirm(AskQuestion))
			continueCommands = true;
		else
			continueCommands = false;
	}
	else {
		continueCommands = true;
	}

	if (continueCommands) {

		for (i=3;i<arguments.length;i++)
			eval(arguments[i]);

		if (NewAction)
			formObj.action = NewAction;

		formObj.submit();
	}
}

// CANNOT CHOOSE TWO CONFLICTING OPTIONS AT THE SAME TIME (THEY TOGGLE EACHOTHER)
function toggleOptions(option1, option2) {
	if (option1.selectedIndex != 0)
		document.changeCriteriaForm[option2].selectedIndex = 0;
}