// ------ Validation Library ------
var FV_TEXT = 1;
var FV_NUMBER = 2;
var FV_PHONE = 3;

// var FV_NAME_MAX = 30;
// var FV_ADDRESS_MAX = 50;
// var FV_CITY_MAX = 40;
// var FV_STATE_MAX = 2;
// var FV_ZIP_MAX = 10;
// var FV_PHONE_MAX = 14;
// var FV_EXT_MAX = 5;

var FV_ALPHA_US_MASK = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
var FV_ALPHA_INTL_MASK = "ƒŠŒŽšœžŸÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ";
var FV_ALPHA_MASK = FV_ALPHA_US_MASK + FV_ALPHA_INTL_MASK;
// var FV_ALPHA_MASK = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
var FV_NUMERIC_MASK = "0123456789";
var FV_WHITESPACE_MASK = "\t\r\n ";
var FV_ALLSYMBOLS_MASK = "`-=[]\\;',./~!@#$%^&*()_+{}|:\"<>?";
var FV_ZIPSYMBOLS_MASK = "-";
var FV_NAMESYMBOLS_MASK = ".',-";
var FV_PHONESYMBOLS_MASK = "()-";
var FV_ALPHANUMERIC_MASK = FV_ALPHA_MASK + FV_NUMERIC_MASK;
var FV_ALPHA_WHITE_MASK = FV_ALPHA_MASK + FV_WHITESPACE_MASK;
var FV_ALLTEXT_MASK = FV_ALPHANUMERIC_MASK + FV_ALLSYMBOLS_MASK + FV_WHITESPACE_MASK;
// var FV_NAME_MASK = FV_ALPHA_WHITE_MASK + FV_NAMESYMBOLS_MASK;
// var FV_PHONE_MASK = FV_NUMERIC_MASK + FV_PHONESYMBOLS_MASK;
// var FV_ZIP_MASK = FV_NUMERIC_MASK + FV_ZIPSYMBOLS_MASK;

var FV_ALPHA = 1;
var FV_NUMERIC = 2;
var FV_WHITESPACE = 4;
var FV_ALLSYMBOLS = 8;
var FV_NAMESYMBOLS = 16;
var FV_PHONESYMBOLS = 32;
var FV_ZIPSYMBOLS = 64;
var FV_ALPHANUMERIC = FV_ALPHA | FV_NUMERIC;
var FV_ALPHA_WHITE = FV_ALPHA | FV_WHITESPACE;
var FV_ALPHANUMERIC_WHITE = FV_ALPHANUMERIC | FV_WHITESPACE;
var FV_ALLTEXT = FV_ALPHANUMERIC_WHITE | FV_ALLSYMBOLS;
// var FV_NAME = FV_ALPHA_WHITE | FV_NAMESYMBOLS;
// var FV_PHONE= FV_NUMERIC + FV_PHONESYMBOLS;
// var FV_ZIP = FV_NUMERIC + FV_ZIPSYMBOLS;

function ConditionalAlert(msg)
{
	if (msg.length != 0)
		alert(msg);
	return msg.length == 0;
}		

function ValidateField(field, fname, freq, ftype)
{
	var msg, fmask, valid = true, fmasktype, fmaskadd, fmax = 0, fmin = 0;

	if (arguments.length > 4) fmasktype = arguments[4];
	if (arguments.length > 5) fmaskadd = arguments[5];
	if (arguments.length > 6) fmax = arguments[6];
	if (arguments.length > 7) fmin = arguments[7];

	if (freq) valid = ConditionalAlert(ValidateRequired(field.value, fname));

	if (valid) {
		if (ftype == FV_TEXT)
	  		valid = ConditionalAlert(ValidateText(field.value, fname, fmasktype, fmaskadd, fmax, fmin));
	  	else if (ftype == FV_NUMBER)
	  		valid = ConditionalAlert(ValidateNumber(field.value, fname, fmasktype, fmaskadd, fmax, fmin));
		else if (ftype == FV_PHONE)
			valid = ConditionalAlert(ValidatePhone(field.value, fname, fmasktype, fmaskadd, fmax, fmin));
	}
	
	if (!valid) field.focus();
	
	return valid;
}

function ValidateRequired(fvalue, fname)
{
	if (fvalue == "") return "Please enter a value for the \"" + fname + "\" field.";
	return "";
}

function ValidateMakeMask(fmasktype, fmaskadd)
{
	var fmask = "";
	if (fmasktype & FV_ALPHA)
		fmask += FV_ALPHA_MASK;
	if (fmasktype & FV_NUMERIC)
		fmask += FV_NUMERIC_MASK;
	if (fmasktype & FV_WHITESPACE)
		fmask += FV_WHITESPACE_MASK;
	if (fmasktype & FV_ALLSYMBOLS)
		fmask += FV_ALLSYMBOLS_MASK;
	return fmask + fmaskadd;
}

function ValidateCharacters(fvalue, fname, fmasktype, fmaskadd)
{
	var msg = "", valid = true;
	var fmask = ValidateMakeMask(fmasktype, fmaskadd);
	
	for (i = 0;  i < fvalue.length;  i++)
	{
 		ch = fvalue.charAt(i);
 		for (j = 0;  j < fmask.length;  j++)
			if (ch == fmask.charAt(j))
				break;
		if (j == fmask.length)
			valid = false;
	}
	charTypes = new Array;
	if (!valid) {
		if (fmasktype & FV_ALPHA)
			charTypes.push("alphabetic");
		if (fmasktype & FV_NUMERIC)
			charTypes.push("numeric");
		if (fmasktype & FV_WHITESPACE)
			charTypes.push("whitespace");
		if (fmasktype & FV_ALLSYMBOLS)
			fmaskadd = FV_ALLSYMBOLS_MASK;
		if (fmaskadd != "")
			charTypes.push("\"" + fmaskadd + "\"");
			
		msg = "Please enter only";
		for (i = 0; i < charTypes.length; i++) {
			if (i == 0 || charTypes.length == 1) msg += " ";
			if (i > 0 && i < charTypes.length - 1) msg += ", ";
			if (charTypes.length > 1 && i == charTypes.length - 1) msg += " and ";
			msg += charTypes[i];
		}
		msg += " characters in the \"" + fname + "\" field.";
	}
	return msg;
}

function ValidateLength(fvalue, fname, fmax, fmin)
{
	if (fmin < 0) fmin = 0;
	if (fmin > fmax) fmax = fmin;
	if (fvalue.length > fmax)
		return "Please enter a maximum of " + fmax + " characters in the \"" + fname + "\" field.";
	if (fvalue.length >= 1 && fvalue.length < fmin)
		return "Please enter a minimum of " + fmin + " characters in the \"" + fname + "\" field.";
	return "";
}

function ValidateRange(fvalue, fname, fmax, fmin)
{
	var prsVal = parseInt(fvalue);
	if (fmin > fmax) fmax = fmin;
	if (fvalue != "" && !(prsVal >= fmin && prsVal <= fmax))
		return "Please enter a value greater than or equal to " + fmin + " and less than or equal to " + fmax + " in the \"" + fname + "\" field.";
	return ""
}

function ValidateText(fvalue, fname, fmasktype, fmaskadd, fmax, fmin)
{
	var msg = "";
	if (fmax > 0 || fmin > 0)
		msg = ValidateLength(fvalue, fname, fmax, fmin);
	if (!msg.length)
		msg = ValidateCharacters(fvalue, fname, fmasktype, fmaskadd);
	return msg;
}

function ValidateNumber(fvalue, fname, fmasktype, fmaskadd, fmax, fmin)
{
	var msg = "";
	msg = ValidateCharacters(fvalue, fname, fmasktype, fmaskadd);
	if (!msg.length && fmax > 0 || fmin > 0)
		msg = ValidateRange(fvalue, fname, fmax, fmin);
	return msg;
}

function ValidatePhone(fvalue, fname, fmasktype, fmaskadd, fmax, fmin)
{
	var msg = "";
	if (fmax > 0 || fmin > 0)
		msg = ValidateLength(fvalue, fname, fmax, fmin);
	if (!msg.length)
		msg = ValidateCharacters(fvalue, fname, fmasktype, fmaskadd);
	return msg;
}

function ValidateEmail(fvalue)
{
	var idx = fvalue.indexOf("@");
	if (idx == -1 || idx != fvalue.lastIndexOf("@") ) {
		alert("A valid e-mail address must contain exactly one \"@\" character");
		return false;
	}
	if (fvalue.indexOf(".") == -1) {
		alert("A valid e-mail address must contain at least one \".\" character");
		return false;
	}
	return true;
}

