var eMessage	= "";
var gWhichForm;

function checkVal(field,label,type)
{
	var length		= "";
	var minLen		= ""
	var message		= "";
	var fieldValue	= "";
	
	
	//*******************************
	 // real live javascript method overloading (watch quick before it dissapears!)
	if (arguments.length >= 4)
	{
		if (parseInt(arguments[3]) == arguments[3])
		{
			length =  arguments[3];
			minLen = "{" + length + "}";
		} else {
			message = arguments[3];
		}
	}
	
	if (arguments.length == 5)
	{
		message = arguments[4];
	}
	//*********************************

	// now let's get the value of the field
	fieldValuePath	= "document.forms['" + gWhichForm + "'].elements['" + field + "'].value";
	fieldValue		= eval(fieldValuePath);
	
	//********************************
	
	switch(type)
	{
		case "text":
			var re = new RegExp("[a-zA-Z]" + minLen);
			pass = re.test(fieldValue);
			if (! pass)
			{
				if (message == "")
				{
					eMessage += "The " + label + " field requires a value"
					eMessage += (length =="") ? ".\n":" " + length + " characters in length.\n";
				} else {
					eMessage += message + "\n";
				}
			}
			break;
		case "integer":
			var re = new RegExp("[0-9]" + minLen);
			pass = re.test(fieldValue);
			if (! pass)
			{
				if (message == "")
				{
					eMessage += "The " + label + " field requires an integer value"
					eMessage += (length =="") ? ".\n":" " + length + " digits in length.\n";
				} else {
					eMessage += message + "\n";
				}
			}
			break;
		case "email":
			var re = new RegExp("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*");
			if (length != "")
			{
				alert("Ascribing a length to an email field is not supported. Please see your calling syntax in the \"setFieldNames\" method.");
				return false;
			}
			pass = re.test(fieldValue);
			if (! pass)
			{
				if (message == "")
				{
					eMessage += "The " + label + " field requires a valid email address.\n"
	
				} else {
					eMessage += message + "\n";
				}
			}
			break;
		case "date":
			var re = new RegExp("\\d{1,2}([/-]{1})\\d{1,2}\\1\\d{2}");
			if (length != "")
			{
				alert("Ascribing a length to a date field is not supported, as this validation code supports all \"human readable\" formats also supported by SQL Server. Please see your calling syntax in the \"setFieldNames\" method.");
				return false;
			}
			pass = re.test(fieldValue);
			if (! pass)
			{
				if (message == "")
				{
					eMessage += "The " + label + " field requires a valid date (##/##/####) format.\n"
	
				} else {
					eMessage += message + "\n";
				}
			}
			break;
		case "phone":
			var phLen = fieldValue.length;
			if (length != "")
			{
				alert("Ascribing a length to a phone field is not supported, as this validation code can define between \"short\" numbers (###-####) and those that include area codes. If you're checking a field with a \"short\" telephone number, you may want to consider using the \"integer\" data type to check the area code.");
				return false;
			}
			if (phLen > 9)
			{
				var re = new RegExp("\\d{3}([-.]?)\\d{3}\\1\\d{4}");
			
			} else {
				var re = new RegExp("\\d{3}[-.]?\\d{4}");
			}
			pass = re.test(fieldValue);
			if (! pass)
			{
				if (message == "")
				{
					eMessage += "The " + label + " field requires a valid phone numbe in common format.\n"
	
				} else {
					eMessage += message + "\n";
				}
			}
			break;
		case "zipcode":
			var phLen = fieldValue.length;
			if (length != "")
			{
				alert("Ascribing a length to a zipcode field is not supported, as this validation code can define between brief and extended zipcodes.");
				return false;
			}
			if (phLen > 5)
			{
				var re = new RegExp("\\d{5}-\\d{4}");
			} else {
				var re = new RegExp("\\d{5}");
			}
			pass = re.test(fieldValue);
			if (! pass)
			{
				if (message == "")
				{
					eMessage += "The " + label + " field requires a valid zipcode format, either 5 \"00000\" or 9 \"00000-0000\" digits.\n"
	
				} else {
					eMessage += message + "\n";
				}
			}
			break;
		case "creditcard":
			pass = validateCCNum(fieldValue);
			if (! pass)
			{
				if (message == "")
				{
					eMessage += "The " + label + " field requires a valid credit card number.\n"
	
				} else {
					eMessage += message + "\n";
				}
			}
			break;
		}	 
	}


function validateCCNum(cardNum)
{
	var parsedNum = cardNum.replace(/\D/gi,'')

	if (!checkCardNum(parsedNum) | parsedNum.length == 0)
	{
		return false;
	}
	
	return true;
}


function checkCardNum(cardNum) {
	var i;
	var cc = new Array(16);
	var checksum = 0;
	var validcc;
	// assign each digit of the card number to a space in the array
	for (i = 0; i < cardNum.length; i++) {
	  cc[i] = Math.floor(cardNum.substring(i, i+1));
	}
	for (i = (cardNum.length % 2); i < cardNum.length; i+=2) {
	  var a = cc[i] * 2;
  	if (a >= 10) {
		  var aStr = a.toString();
		  var b = aStr.substring(0,1);
		  var c = aStr.substring(1,2);
		  cc[i] = Math.floor(b) + Math.floor(c);
		  } else {
		  cc[i] = a;
	  }
	}
	
	for (i = 0; i < cardNum.length; i++) {
	  checksum += Math.floor(cc[i]);
	}
	validcc = ((checksum % 10) == 0);
	return validcc;
}

function validateFields(whichForm)
{	
	gWhichForm = whichForm;
	
	setFieldsToValidate();
	if (eMessage != "")
	{
		alert(eMessage);
		eMessage = "";
		return false;
	} else {
		return true;
	}
}