var DATATYPE_TEXT = 0;
var DATATYPE_NUMBER = 1;
var DATATYPE_DATETIME = 2;
var DATATYPE_EMAIL = 3;
var DATATYPE_INTEGER = 5;


function ValidationStatus(Message, IsValid)
{
	this.Message = Message;
	this.IsValid = IsValid;
}
//General Character Functions
function getSpecialCharacterString(characterArray, withSpaces)
{
	var sCharacterString = "";
	var sSpace = "";
	for(i = 0; i < characterArray.length; i++)
	{
		if(withSpaces != false)
			sCharacterString += sSpace;
		
		sCharacterString += String.fromCharCode(characterArray[i]);

		if(withSpaces != false)
			sSpace = " ";	
	}
	return sCharacterString;
	//return "\\ / # : . * ? < > |";
}
function containsSpecialCharacters(characterArrayFunction, Value)
{
	var aSpecialCharacters = characterArrayFunction();
	for(i = 0; i < Value.length; i++)
	{
		for(j = 0; j < aSpecialCharacters.length; j++)
		{
			if(Value.charCodeAt(i) == aSpecialCharacters[j])
				return true;
				
		}
	}
	return false;
}
//Invalid Character Functions
function getInvalidCharacterArray()
{
	var aInvalidCharacters = new Array(92, 47, 35, 58, 46, 42, 63, 60, 62, 124, 38, 43, 59, 34)
	return aInvalidCharacters;
}
function getInvalidCharacterString(withSpaces)
{
	return getSpecialCharacterString(getInvalidCharacterArray(withSpaces));
}
function containsInvalidFileSystemCharacters(Value)
{
	return containsSpecialCharacters(getInvalidCharacterArray, Value);
}
//Foreign Character Functions
function getForeignCharacterArray()
{
	var aForeignCharacters = new Array()
	for(var i = 0; i < 30; i++)
	{
		aForeignCharacters[aForeignCharacters.length] = 192 + i;
		aForeignCharacters[aForeignCharacters.length] = 224 + i;
	}
	return aForeignCharacters;
}
function getForeignCharacterString(withSpaces)
{
	return getSpecialCharacterString(getForeignCharacterArray(withSpaces));
}
function containsForeignCharacters(Value)
{
	return containsSpecialCharacters(getForeignCharacterArray, Value);
}

function getCheckedValue(Control)
{
	if(Control.length)
	{
		for(var i = 0; i < Control.length; i ++)
		{
			if(Control[i].checked)
				return Control[i].value;
		}
	}
	else
		if(Control.checked)
			return Control.value;

	return '';
}

function isTextField(ControlType)
{
	switch(ControlType)
	{
		case "text": return true;
		case "password": return true;
		case "textarea": return true;
		case "file": return true;
		default: return false;
	}
}
function isPopulated(Control)
{
	var sValue = '';
	switch(getControlType(Control))
	{
		case "checkbox":
			sValue = getCheckedValue(Control);
			break;
		case "radio":
			sValue = getCheckedValue(Control);
			break;
		default:
			sValue = Control.value;
	}

	if(sValue == '')
		return false;
	return true;
}
function isValidNumber(Value)
{
	if(Value.length == 0)
		return true;

	return (Value.IsNumeric);
}
function isInteger(Value)
{
	if(Value.length == 0)
		return false;
	var valid = "0123456789"
	var temp;
	for (var i=0; i<Value.length; i++)
	{
		temp = "" + Value.substring(i, i+1);
		if (valid.indexOf(temp) == "-1")
			return false;
	}
	return true;
}



function isValidDateTime(Value)
{
	return false;
}
function isValidEmail(Value)
{
	if(Value.length == 0)
		return true;

	if(!Value.match(/^\S+\@\S+\.\S+$/ig))
		return false;

	return true;
}

function isDataType(Control, DataType)
{
	switch(DataType)
	{
		case DATATYPE_TEXT: return true;
		case DATATYPE_NUMBER: return isValidNumber(Control.value);
		case DATATYPE_INTEGER: return isInteger(Control.value);
		case DATATYPE_DATETIME:
			try
			{
				var fValid = isValidDate(Control.value, "M/d/yyyy");

				if(fValid!=false)
				{
					var oDate =new Date(Control.value)
					var oMinDate = new Date("12/31/1899")
					if(oMinDate >= oDate)
						return false;
				}
				return fValid;
			}
			catch(e)
			{
				alert("Cannot validate DateTime.  Missing reference to 'modDateTime.js'")
				return true;
			}
		case DATATYPE_EMAIL: return isValidEmail(Control.value);
		default:
			return true;
	}
}

function isValidRange(Value, MinValue, MaxValue)
{
	if(!isNaN(MinValue))
	{
		if(Value < parseInt(MinValue))
			return false
	}
	if(!isNaN(MaxValue))
	{
		if(Value > parseInt(MaxValue))
			return false;
	}
	return true;
}

function getControlType(Control)
{
	if(Control.type)
		return Control.type;
	else
	{
		if(Control.length)
		{
			if(Control[0].type)
				return Control[0].type;
			else
			{
				alert("Unknown ControlType for " + Control[0].name);
				return "unknown";
			}
		}
		else
		{
			alert("Unknown ControlType for " + Control.name);
			return "unknown";
		}
	}
}
function getIndefiniteArticle(Value)
{
	var sIndefiniteStarters = "AEIOUaeiou";
	var sFirst = Value.charAt(0);
	if(sIndefiniteStarters.indexOf(sFirst) == -1)
		return "a";
	else
		return "a(n)";
}
function getRequiredMessage(Control, Label)
{
	var sVerb = '';
	var sArticle = '';
	var sMessage = "";
	var sControlType = getControlType(Control);
	if(isTextField(sControlType))
	{
		if(sControlType == "file")
		{
			return "Please select the " + Label + " (file path and file name) by clicking the Browse button.";
		}
		else
		{
			sVerb = "enter";
			sArticle = "the";
		}
	}
	else
	{
		switch (sControlType)
		{
			case "checkbox":
				if(Control.length)
				{
					sVerb = "select";
					sArticle = getIndefiniteArticle(Label);
				}
				else
				{
					sVerb = "check"
					sArticle = "the";
				}
				break;
			default:
				sVerb = "select";
				sArticle = getIndefiniteArticle(Label);
		}
	}
	sMessage = "Please " + sVerb + " " + sArticle + " " + Label;
	return sMessage;
}

function getDataTypeName(DataType)
{
	switch(DataType)
	{
		case DATATYPE_TEXT: return "Text";
		case DATATYPE_NUMBER: return "Number";
		case DATATYPE_INTEGER: return "Whole Number";
		case DATATYPE_DATETIME: return "Date/Time";
		case DATATYPE_EMAIL: return "Email";
		default:
			return "Unknown";
	}
}
function getFormat(DataType)
{
	var sFormat = "";
	switch(DataType)
	{
		case DATATYPE_EMAIL:
			sFormat = " in the format 'name@company.com'";
			break;
		case DATATYPE_DATETIME:
			sFormat = " in the format 'MM/DD/YYYY'";
			break;
	}
	return sFormat;
}

function getRangeMessage(Label, Value, DataType, MinValue, MaxValue)
{
	var sMessage = "";
	var iMinValue = parseInt(MinValue);
	var iMaxValue = parseInt(MaxValue);
	if(isNaN(iMinValue) && isNaN(iMaxValue))
		return "";

	sMessage = " * " + Label + " must be ";
	if(!isNaN(iMinValue) && !isNaN(iMaxValue))
	{
		sMessage += "between " + MinValue + " and " + MaxValue;
		if(DataType != DATATYPE_NUMBER && DataType != DATATYPE_INTEGER)
			sMessage += " characters.  You have entered " + (Value - MaxValue) +  " characters over the limit.";
		else
			sMessage += "."
		return sMessage + "\n\n";
	}
	if(!isNaN(iMinValue))
	{
		if(DataType != DATATYPE_NUMBER && DataType != DATATYPE_INTEGER)
			sMessage += "at least " + MinValue + " characters";
		else
			sMessage += "greater than " + MinValue + ".";
		return sMessage + "\n\n";
	}
	if(!isNaN(iMaxValue))
	{
		if(DataType != DATATYPE_NUMBER && DataType != DATATYPE_INTEGER)
			sMessage += "no more than " + MaxValue + " characters.  You have entered " + (Value - MaxValue) +  " characters over the limit.";
		else
			sMessage += "less than " + MaxValue + ".";
		return sMessage + "\n\n";
	}

	return "";

}

function checkRequiredCheckbox(Form, ValidationStatus)
{
	ValidationStatus.IsValid = false;

	if(!Form)
	{
		alert("Error validating Control. Form does not exist.");
		return false;
	}
	
	var iTotal = Form.elements.length;
	for (var i = 0; i<iTotal; i++) {
		var element = Form.elements[i];
		if (getControlType(element) == "checkbox") {
			if (element.checked) {
				ValidationStatus.IsValid = true;
				return ValidationStatus.IsValid;
			}
		}
	}
	
	ValidationStatus.Message += " * Please check off one or more check boxes" + ".\n\n";
	return ValidationStatus.IsValid;
}

function validateControl(Control, Label, ValidationStatus, DataType, Required, MinValue, MaxValue)
{
	var sMessage = ""
	var fValid = true;
	if(!Control)
	{
		alert("Error validating Control.  Control does not exist.");
		return false;
	}

	var sControlType = getControlType(Control);
	var fIsTextField = isTextField(sControlType);
	if(fIsTextField)
	{
		try
		{
			Control.value = Trim(Control.value);
		}
		catch(e)
		{
			alert("Error trimming Control value.  Missing reference to 'modCommon.js'.");
		}
	}
	if(!isPopulated(Control))
	{
		if(Required)
		{
			var sRangeMessage = getRangeMessage(DataType, MinValue, MaxValue);
			if(sRangeMessage.length > 0)
				sRangeMessage = " (" + sRangeMessage + ")"
			ValidationStatus.Message += " * " + getRequiredMessage(Control, Label) + sRangeMessage + ".\n\n";
			ValidationStatus.IsValid = false;
		}
	}
	else
	{
		if(fIsTextField)
		{
			if(!isDataType(Control, DataType))
			{
				ValidationStatus.Message += " * " + Label + " is not a valid " + getDataTypeName(DataType) + ". Please re-enter the " + Label + getFormat(DataType) + ".\n\n";
				ValidationStatus.IsValid = false;
			}
			else
			{
				if(DataType == DATATYPE_TEXT)
					var sValue = Control.value.length;
				else
					var sValue = Control.value;
				if(!isValidRange(sValue, MinValue, MaxValue))
				{
					ValidationStatus.Message += getRangeMessage(Label, sValue, DataType, MinValue, MaxValue);
					ValidationStatus.IsValid = false;
				}

			}
		}
	}
	return ValidationStatus.IsValid;
}

// Check Dependencies
//		modDateTime.js
//		modCommon.js
var gsMessage = "";
try
{
	var goFunction = isValidDate;
}
catch(e)
{
	var goFunction = null;
	gsMessage += " * modDateTime.js\n\n"
}
try
{
	var goFunction = Trim;
}
catch(e)
{
	var goFunction = null;
	gsMessage += " * modCommon.js\n\n"
}
if(gsMessage.length > 0)
	alert("MISSING REFERENCES: modValidation.js requires the following files:\n\n" + gsMessage);
