/*
Regular Expression Examples

1) Whole number:
i.e. "1,000" or "1000"
/(^[1-9]$)|(^[1-9][0-9]+$)|(^\d{1,3},?(\d{3},?)*\d{3}$)/

2) Currency:
i.e. "$3,000.00" or "3000"
/(^\$?((\d{1,3}|\d{1,3},?(\d{3},?)*\d{3})(\.\d{2})?)$)/

3) Email alias:
i.e. "johndoe" or "John.Doe"
/^([a-zA-Z0-9_\-\.]+$)/

4) Drop-down list values:
i.e. "U.K. Sub"
/^([a-zA-Z0-9!@#\$%\^&\*\(\)\-_=\+\[\]{}\\|;:',.<>/\?\s]+$)/
*/

function ValidateFields()
{
	var element;
	var fieldValue;
	var fieldTitle;
	var fieldError;
	var invalidFields = "";
	var required;
	var maxLength;
	var formatValidRegExp;
	var formatInvalidMessage;
	var retval = true;
	var objRegExp_Trim = /^(\s*)([\W\w]*)(\b\s*$)/;		// Leading and trailing whitespace characters

	for (i=0; i < document.all.length; i++)
	{
		element		= document.all[i];
		fieldError	= false;

		// Extract Required, MaxLength, FormatValidRegExp, and FormatInvalidMessage attribute values
		required				= element.getAttribute("Required");
		maxLength				= element.getAttribute("MaxLength");
		formatValidRegExp		= element.getAttribute("FormatValidRegExp");
		formatInvalidMessage	= element.getAttribute("FormatInvalidMessage");

		if (element.tagName.toUpperCase() == "SPAN")
		{
			// Set reference to child form element
			element = element.firstChild;
		}

		// Check for need to validate attribute values
		if ((required != null && required.toUpperCase() == "TRUE") || (maxLength != null && maxLength > 0) || (formatValidRegExp != null))
		{
			// Validate non-datagrid field
			if (element.parentNode.id.substr(0, 2) != "dg")
			{
				switch (element.tagName.toUpperCase())
				{
					case "SELECT" :
						fieldTitle = element.parentNode.parentNode.parentNode.firstChild.innerText.replace(":", "").replace("*", "").replace("($ USD)", "").replace(objRegExp_Trim, "$2");

						// Validate "required field" criteria
						if (required != null && required.toUpperCase() == "TRUE")
						{
							if (element.selectedIndex < 1)
							{
								fieldError = true;
								invalidFields += "* " + fieldTitle + " (required)\n";
								retval = false;
							}
						}
						break;
					case "INPUT" :
						fieldTitle = element.parentNode.parentNode.parentNode.firstChild.innerText.replace(":", "").replace("*", "").replace("($ USD)", "").replace(objRegExp_Trim, "$2");
						fieldValue = element.value.replace(objRegExp_Trim, "$2");		// Trim value

						// Validate "required field" criteria
						if (required != null && required.toUpperCase() == "TRUE")
						{
							if (fieldValue.length <= 0)
							{
								fieldError = true;
								invalidFields += "* " + fieldTitle + " (required)\n";
								retval = false;
							}
						}

						// Validate "format" criteria
						if (!fieldError && formatValidRegExp != null)
						{
							if (fieldValue.length > 0 && !eval(formatValidRegExp).test(fieldValue))
							{
								fieldError = true;
								invalidFields += "* " + fieldTitle + " (invalid format" + (formatInvalidMessage != null ? " - " + formatInvalidMessage : "") + ")\n";
								retval = false;
							}
						}

						break;
					case "TEXTAREA" :
						fieldTitle = element.parentNode.parentNode.parentNode.firstChild.innerText.replace(":", "").replace("*", "").replace("($ USD)", "").replace(objRegExp_Trim, "$2");
						fieldValue = element.value.replace(objRegExp_Trim, "$2");		// Trim value

						// Validate "required field" criteria
						if (required != null && required.toUpperCase() == "TRUE")
						{
							if (fieldValue.length <= 0)
							{
								fieldError = true;
								invalidFields += "* " + fieldTitle + " (required)\n";
								retval = false;
							}
						}

						// Validate "maximum length" criteria
						if (!fieldError && maxLength != null && maxLength > 0)
						{
							if (fieldValue.length > maxLength)
							{
								fieldError = true;
								invalidFields += "* " + fieldTitle + " (invalid length; maximum " + maxLength + " characters; currently " + element.value.length + ")\n";
								retval = false;
							}
						}

						// Validate "format" criteria
						if (!fieldError && formatValidRegExp != null)
						{
							if (fieldValue.length > 0 && !eval(formatValidRegExp).test(fieldValue))
							{
								fieldError = true;
								invalidFields += "* " + fieldTitle + " (invalid format" + (formatInvalidMessage != null ? " - " + formatInvalidMessage : "") + ")\n";
								retval = false;
							}
						}

						break;
					default :
						break;
				}

				// Skip next element (to suppress duplicate error messages)
				if (fieldError && element.parentNode.tagName.toUpperCase() == "SPAN")
					i++;
			}
		}
	}

	if (retval == false)
		alert("Please enter or select an appropriate value for the following fields:\n\n" + invalidFields)

	return retval;
}

function ValidateGridFields(gridID, srcElement)
{
	var element;
	var fieldValue;
	var fieldTitle;
	var fieldError;
	var invalidFields = "";
	var tdElement;
	var required;
	var maxLength;
	var formatValidRegExp;
	var formatInvalidMessage;
	var retval = true;
	var objRegExp_Trim = /^(\s*)([\W\w]*)(\b\s*$)/;		// Leading and trailing whitespace characters

	// Set reference to source element's parent table row
	var trElement = srcElement.parentElement.parentElement.parentElement;

	// Loop through cells within current table row
	for (i=0; i < trElement.childNodes.length; i++)
	{
		tdElement = trElement.childNodes[i];

		// If present, drill down past 2-column table containing "required" indicator
		// and set reference to inner form element (second column/cell)
		try
		{
			if (tdElement.firstChild.tagName.toUpperCase() == "TABLE")
				if (tdElement.firstChild.cells.length == 2)
					tdElement = tdElement.firstChild.cells[1];
		}
		catch (e) {}

		// Loop through elements within current table cell
		for (j=0; j < tdElement.childNodes.length; j++)
		{
			element		= tdElement.childNodes[j];
			fieldError	= false;

			if (element.tagName != null)
			{
				// Extract SPAN attributes and set reference to child form element
				if (element.tagName.toUpperCase() == "SPAN")
				{
					// Extract Required, MaxLength, FormatValidRegExp, and FormatInvalidMessage attribute values
					required				= element.getAttribute("Required");
					maxLength				= element.getAttribute("MaxLength");
					formatValidRegExp		= element.getAttribute("FormatValidRegExp");
					formatInvalidMessage	= element.getAttribute("FormatInvalidMessage");

					// Set reference to child form element
					element = element.firstChild;

					j++;
				}

				// Check for need to validate attribute values
				if ((required != null && required.toUpperCase() == "TRUE") || (maxLength != null && maxLength > 0) || (formatValidRegExp != null))
				{
					switch (element.tagName.toUpperCase())
					{
						case "SELECT" :
							fieldTitle = document.all[gridID].rows[0].cells[i].innerText;

							// Validate "required field" criteria
							if (required != null && required.toUpperCase() == "TRUE")
							{
								if (element.selectedIndex < 1)
								{
									fieldError = true;
									invalidFields += "* " + fieldTitle + " (required)\n";
									retval = false;
								}
							}
							break;
						case "INPUT" :
							fieldTitle = document.all[gridID].rows[0].cells[i].innerText;
							fieldValue = element.value.replace(objRegExp_Trim, "$2");		// Trim value

							// Validate "required field" criteria
							if (required != null && required.toUpperCase() == "TRUE")
							{
								if (fieldValue.length <= 0)
								{
									fieldError = true;
									invalidFields += "* " + fieldTitle + " (required)\n";
									retval = false;
								}
							}

							// Validate "format" criteria
							if (!fieldError && formatValidRegExp != null)
							{
								if (fieldValue.length > 0 && !eval(formatValidRegExp).test(fieldValue))
								{
									fieldError = true;
									invalidFields += "* " + fieldTitle + " (invalid format" + (formatInvalidMessage != null ? " - " + formatInvalidMessage : "") + ")\n";
									retval = false;
								}
							}

							break;
						case "TEXTAREA" :
							fieldTitle = document.all[gridID].rows[0].cells[i].innerText;
							fieldValue = element.value.replace(objRegExp_Trim, "$2");		// Trim value

							// Validate "required field" criteria
							if (required != null && required.toUpperCase() == "TRUE")
							{
								if (fieldValue.length <= 0)
								{
									fieldError = true;
									invalidFields += "* " + fieldTitle + " (required)\n";
									retval = false;
								}
							}

							// Validate "maximum length" criteria
							if (!fieldError && maxLength != null && maxLength > 0)
							{
								if (fieldValue.length > maxLength)
								{
									fieldError = true;
									invalidFields += "* " + fieldTitle + " (invalid length; maximum " + maxLength + " characters; currently " + element.value.length + ")\n";
									retval = false;
								}
							}

							// Validate "format" criteria
							if (!fieldError && formatValidRegExp != null)
							{
								if (fieldValue.length > 0 && !eval(formatValidRegExp).test(fieldValue))
								{
									fieldError = true;
									invalidFields += "* " + fieldTitle + " (invalid format" + (formatInvalidMessage != null ? " - " + formatInvalidMessage : "") + ")\n";
									retval = false;
								}
							}

							break;
						default :
							break;
					}
				}
			}
		}
	}

	if (retval == false)
		alert("Please enter or select an appropriate value for the following fields:\n\n" + invalidFields)

	return retval;
}






function GetPartialLocation() {
// Removes end part of the current location.
// eg:
//		http://localhost/EDT/Test.aspx		->		http://localhost/EDT/
//		http://localhost/EDT/					->		http://localhost/

	path = location.toString() ;

	if( ( path == null ) || ( path.length == 0 ) )
		return "" ;

	path = path.replace( "\\", "/" ) ;		// Just in case there are any back slashes.

	var pathDepth = path.charAt( path.length - 1 ) == "/" ? 2 : 1 ;
	var pathParts = path.split( "/" ) ;
	var newPath = "" ;

	for( var pathPartsIndex = 0; pathPartsIndex < pathParts.length - pathDepth; pathPartsIndex++ )
		newPath += pathParts[ pathPartsIndex ] + "/" ;

	return newPath ;

} // GetPartialLocation
