// ----------- DEBUGGING -------------- //

var DEBUG = false;
function debug(str)
{
	if (DEBUG)
		alert(str);
}

// ----------- FORM VALIDATION METHODS -------------- //

// When called will first call the validateForm() method
// If form is valid, it will then select all items in multiple select boxes with a class name of 'selectAllOnSubmit'
function prepareForm(form)
{
	if (validateForm(form))
	{
		var formElements = form.elements;
		
		debug("Form validated... checking " + formElements.length + " elements");
		
		for (elemIter = 0; elemIter < formElements.length; elemIter++)
		{
			var oneElem = formElements[elemIter];
			if (oneElem.tagName.toLowerCase() == 'select' && oneElem.className == 'selectAllOnSubmit')
			{
				selectAll(oneElem);
			}
		}
		return true;
	}
	else
	{
		return false;
	}
}

function validateForm(form)
{

	if (specificFormValidation(form))
	{

		var formElements = form.elements;
		var missingElements = "", invalidNumberElements = "", invalidDateElements = "", firstOffendingElement = null;
			
		debug("Form validation... checking " + formElements.length + " elements");
			
		for (elemIter = 0; elemIter < formElements.length; elemIter++)
		{
			var oneElem = formElements[elemIter];
			var oneElemName = oneElem.name;
			var oneElemValue = oneElem.value;
			
			if ( (oneElem.className == 'dateField' || oneElem.className == 'requiredDate') && oneElemName.substring(oneElemName.length-5,oneElemName.length).toLowerCase() == "month")
			{
				var dateField = oneElemName.substring(0,oneElemName.length-5);
				if (!dateElementEntered(form, dateField) && oneElem.className == 'requiredDate')
				{
					if (firstOffendingElement == null)
					{
						firstOffendingElement = oneElem;
					}
					
					if (missingElements != "")
					{
						missingElements += "\n";
					}
					missingElements += "\t" + dateField;
				}
				else if ( dateElementEntered(form, dateField) )
				{
					if ( !validateDateElementSet(form,dateField) )
					{
						if (firstOffendingElement == null)
						{
							firstOffendingElement = oneElem;
						}
						if (invalidDateElements != "")
						{
							invalidDateElements += "\n";
						}
						invalidDateElements += "\t" + dateField;
					}
				}
			}
			if ( oneElem.className == 'numberField' || oneElem.className == 'requiredNumber' )
			{
				if (oneElemValue != "" && !isNumeric(oneElemValue))
				{
					if (firstOffendingElement == null)
					{
						firstOffendingElement = oneElem;
					}
					if (invalidNumberElements != "")
					{
						invalidNumberElements += "\n";
					}
					invalidNumberElements += "\t" + oneElemName;
				}
			}
			if (oneElem.className == 'requiredText' || oneElem.className == 'requiredNumber' )
			{
				if (oneElemValue == "")
				{
					if (firstOffendingElement == null)
					{
						firstOffendingElement = oneElem;
					}
					
					if (missingElements != "")
					{
						missingElements += "\n";
					}
					missingElements += "\t" + oneElemName;
				}
			}
		}
	
		if (missingElements != "" || invalidNumberElements != "" || invalidDateElements != "")
		{
			var errMsg = "Form validation failed.";
			if (missingElements != "")
			{
				errMsg += "\nThe following values are required:\n" + missingElements;
			}
			if (invalidNumberElements != "")
			{
				errMsg += "\nThe following values must be numeric:\n" + invalidNumberElements;
			}
			if (invalidDateElements != "")
			{
				errMsg += "\nThe following date values are invalid:\n" + invalidDateElements;
			}
			
			alert(errMsg);
			firstOffendingElement.focus();
			return false;
		}
		else
		{
			return true;
		}
	}
	else
	{
		return false;
	}
}

function specificFormValidation(form)
{
	debug("No specific form validation");
	return true;
}

function isNumeric(str)
{
	return !isNaN(parseInt(str));
}

function dateElementEntered(form, dateField)
{
	return form[dateField + 'Month'].value != "";
}

function setDateElement(form, dateField, dateValue)
{
	if (dateValue == "" || dateValue == null)
	{
		clearDateField(form, dateField);
	}
	else
	{
		var dateCheck = Date.parse(dateValue);
		if (!dateCheck || isNaN(dateCheck) || !validDateValues(monthValue,dayValue,yearValue) )
		{
			debug("Invalid date value (" + dateValue + ") set to date field " + dateField + ".  Clearing date field");
			clearDateField(form, dateField);
		}
		else
		{
			form[dateField + 'Month'].value = dateCheck.getMonth() + 1;
			form[dateField + 'Day'].value = dateCheck.getDay() + 1;
			form[dateField + 'Year'].value = dateCheck.getFullYear() + 1;
		}
	}
}

function clearDateField(form, dateField)
{
	form[dateField + 'Month'].value = "";
	form[dateField + 'Day'].value = "";
	form[dateField + 'Year'].value = "";
}

function setDateField(form, dateField, m, d, y)
{
	form[dateField + 'Month'].value = m;
	form[dateField + 'Day'].value = d;
	form[dateField + 'Year'].value = y;
}

function validateDateElementSet(form, dateField)
{
	var monthValue = form[dateField + 'Month'].value, dayValue = form[dateField + 'Day'].value, yearValue = form[dateField + 'Year'].value;
	var dateCheck = Date.parse(monthValue + "/" + dayValue + "/" + yearValue);
	if (!dateCheck || isNaN(dateCheck) || !validDateValues(monthValue,dayValue,yearValue) )
	{
		return false;
	}
	else
	{
		return true;
	}
}

function validDateValues(intMonth, intDay, intYear)
{
	var ubDay = 0;
	
	switch(parseInt(intMonth))
	{
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			ubDay = 31;
			break;
		case 2:
			ubDay = (intYear % 4 == 0) ? 29 : 28;
			break;
		default:
			ubDay  = 30;
	}
	return (intDay <= ubDay);
}

// ----------- DATA SUBMISSION METHODS -------------- //

// Submits a form and redirects to newURL
// Requires that the form have an element named "redirectURL"
function submitAndRedirect(formName, newUrl)
{
	if ( prepareForm(document.forms[formName]) )
	{
		document.forms[formName].redirectURL.value = newUrl;
		document.forms[formName].submit();
	}
}

// Reloads the current page with the removedId=removeParameter string added/replaced in the querystring
function removeDatabaseItem(targetUrl, removedItemDesc, removedId, removeParameter)
{
	var newUrl = "", args = arguments, extraQueryString = ""; currentUrl = targetUrl;
	
	debug("Removing database item... currentUrl=" + currentUrl);
	
	if (args.length > 3)
	{
		extraQueryString = args[3];
	}
	
	 if (confirm("Are you sure that you want to remove " + removedItemDesc + "?"))
	 {
		if (currentUrl.indexOf("?") > 0)
		{
			// need to clean out the old parameter if it exists...
			newUrl = removeQueryItemFromUrl(currentUrl, removeParameter);
			
			debug("Cleaned URL (before adding param): " + newUrl);
			
			if (newUrl.indexOf("?") != -1)
			{
				newUrl += "&";
			}
			else
			{
				newUrl += "?";
			}
			
			newUrl += removeParameter + "=" + escape(removedId);
			
			debug("Change confirmed... new url = " + newUrl);
		}
		else
		{
			newUrl = currentUrl + "?" + removeParameter + "=" + escape(removedId);
		}
		if (extraQueryString != "")
		{
			// Extra query string specified.... check to see if it's already in there
			if (newUrl.indexOf(extraQueryString) == -1)
			{
				// add the extra query string
				newUrl += "&" + extraQueryString;
			}
		}
		
		window.location.href = newUrl;
	 }
}

function submitSearch()
{
	var searchCriteria = document.all['quickSearchCriteria'].value;
	var searchForm = document.forms['quickSearchForm'];
	searchForm.strQuickSearchCriteria.value = searchCriteria;
	searchForm.submit();
}

function checkForSubmit()
{
	if (window.event.keyCode == 13)
		submitSearch()
}

// ----------- DATA ELEMENT MANIPULATION METHODS -------------- //

// Appends a value to a textbox value
function appendToTextBox(textBox, str)
{
	textBox.value += str;
}

function setVisibilityByCheckbox(elem, chkbox)
{
	if (chkbox.checked)
	{
		elem.style.visibility = "visible";
	}
	else
	{
		elem.style.visibility = "hidden";
	}
}

function flipElementDisplay(elem)
{
	elem.style.display = (elem.style.display == "none" ? "" : "none");
}

// ----------- URL MANIPULATION METHODS -------------- //

// Removes a name=value pair from a URL with a querystring
function removeQueryItemFromUrl(currentUrl, qParameter)
{
	var newUrl = "";
	if (currentUrl.indexOf("?") != -1)
	{
		// need to clean out the old parameter if it exists...
		var qString = currentUrl.split("?")[1];
		// remove the removeParameter from the query string if it's there
		var newQS = "";
		var params = qString.split("&");
		for (i = 0; i < params.length; i++)
		{
			if (params[i].split("=")[0] != qParameter)
			{
				if (newQS != "")
				{
					newQS += "&";
				}
				newQS += params[i];
			}
		}
		
		// construct the new url
		newUrl = currentUrl.split("?")[0];
		if (newQS != "")
		{
			newUrl += "?" + newQS;
		}
	}
	else
	{
		newUrl = currentUrl;
	}
	
	return newUrl;
}

// ----------- WINDOW OPENING METHODS -------------- //

/** Standard popup window open
 * The first parameter will be the new URL.
 * Subsequent parameters will be (if supplied) the width and height.
 * If not specified the width and height will be 500 and 200 respectively. 
 */
function openWin()
{
	var url, width=500, height=200, menu=""; args = arguments;
	url = args[0];
	if (args.length>1)
	{
		width=args[1];
	}
	if (args.length>2)
	{
		height=args[2];
	}
	if (args.length>3)
	{
		if (args[3])
		{
			menu=",menubar=yes,toolbar=yes";
		}
	}
		
	var newwin = window.open(url, 'newWin', 'width='+width+',height='+height+',scrollbars,resizable' + menu);
}

