/* 
---------------------------------------------------------------------------
frm_validation01.js

Created:          06-15-2000

Description:      JavaScript functions for validating input in an HTML form.

Revsion Date      Changes Made
------------      ------------





---------------------------------------------------------------------------
*/
// Global Variables

var defaultEmptyOK = false

// whitespace characters as defined by this sample code
var whitespace = " \t\n\r";

// digits and letters
var digits = "0123456789";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz";
var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

// BOI, followed by one lower or uppercase English letter
// or digit, followed by EOI.
var reLetterOrDigit = /^([a-zA-Z]|\d)$/;

// US and Canadian phone numbers have 10 digits.
// They are formatted as 123 456 7890 or (123) 456-7890.
var digitsInPhoneNumber = 10;

// non-digit characters which are allowed in phone numbers
var phoneNumberDelimiters = "()- +.";

// domain names
var checkTLD = true;
var reUSDomains = /^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/i;
//var reEmail = /^.+\@.+\..+$/;
var reEmail = /^(.+)@(.+)$/;
var reSpecialChars = "\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
var reValidChars = "\[^\\s" + reSpecialChars + "\]";
var reQuotedUser = "(\"[^\"]*\")";
var reIPDomain = /^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
var atom = reValidChars + '+';
var word="(" + atom + "|" + reQuotedUser + ")";
var reUser = new RegExp("^" + word + "(\\." + word + ")*$");
var reDomain = new RegExp("^" + atom + "(\\." + atom +")*$");

// U.S. ZIP codes have 5 or 9 digits.
// They are formatted as 12345 or 12345-6789.
// Canadian postal code has 6 chars.
// They are formatted as M5H 3M7
// They are formatted as 1A2-3B4.
var digitsInZIPCode1 = 5
var digitsInZIPCode2 = 9
var charsInPostalCode1 = 6

// non-digit characters which are allowed in ZIP and Postal Codes
var PostalCodeDelimiters = "-";
var CAPostalCodeDelimiters = " ";

// FUNCTIONS

// isInteger (STRING s [, BOOLEAN emptyOK])
// isInteger ("5")            true 
// isInteger ("")             defaultEmptyOK
// isInteger ("-5")           false
// isInteger ("", true)       true
// isInteger ("", false)      false
// isInteger ("5", false)     true
function isInteger (s)
{
	if (isEmpty(s))
	{ 
		if (isInteger.arguments.length == 1)
		{
			return defaultEmptyOK;
		}
		else
		{
			return (isInteger.arguments[1] == true);
		}
	}
	return isEmpty(stripCharsInBag (s, digits))
}


// isLetterOrDigit (CHAR c)
function isLetterOrDigit (c)
{
	return reLetterOrDigit.test(c)
}


// isWhitespace (STRING s)
// Returns true if string s is empty or whitespace characters only.
function isWhitespace (s)
{
	s = stripWhitespace(s);
	return isEmpty(s);
}


// isEmpty (STRING s)
// Check whether string s is empty.
function isEmpty (s)
{
	return ((s == null) || (s.length == 0))
}


// stripWhitespace (STRING s)
// Removes all whitespace characters from s.
function stripWhitespace (s)
{
	return stripCharsInBag (s, whitespace)
}


// stripCharsInBag (STRING s, STRING bag)
// Removes all characters which appear in string bag from string s.
function stripCharsInBag (s, bag)
{
	var i;
	var returnString = "";

	// Search through string's characters one by one.
	// If character is not in bag, append to returnString.

	for (i = 0; i < s.length; i++)
	{   
		// Check that current character isn't whitespace.
		var c = s.charAt(i);
		if (bag.indexOf(c) == -1)
		{
			returnString += c;
		}
	}
	return returnString;
}


// stripCharsNotInBag (STRING s, STRING bag)
// Removes all characters which do NOT appear in string bag 
// from string s.

function stripCharsNotInBag (s, bag)
{   
	var i;
  var returnString = "";

  // Search through string's characters one by one.
  // If character is in bag, append to returnString.

  for (i = 0; i < s.length; i++)
  {   
		// Check that current character isn't whitespace.
    var c = s.charAt(i);
    if (bag.indexOf(c) != -1)
    {
			returnString += c;
		}
  }
  return returnString;
}


// isEmail (STRING s [, BOOLEAN emptyOK])
// E-mail address must be of form a@b.c
// where c is a valid tld
function isEmail (s)
{
	if (isEmpty(s))
	{
		if (isEmail.arguments.length == 1)
		{
			return defaultEmptyOK;
		}
		else
		{
			return (isEmail.arguments[1] == true);
		}
	}

	else
	{

		var arrEmail = s.match(reEmail);

		if (arrEmail == null) 
		{
			return false;
		}

		// Check for good and bad characters
		for (var i=0; i < s.length; i++)
		{
			if (s.charCodeAt(i) > 127)
			{
				return false;
			}
		}

		var badChars = " /:;,<>";
		for (var i=0; i < badChars.length; i++)
		{
			var oneBadChar = badChars.charAt(i);
			if (s.indexOf(oneBadChar) != -1)
			{
				return false;
			}
		}

		var user = arrEmail[1];
		var domain = arrEmail[2];

		// check user part
		if (user.match(reUser) == null)
		{
			return false;
		}

		// check for IP
		var arrIPAddress = domain.match(reIPDomain);
		if (arrIPAddress != null)
		{
			for (var i=1; i <= 4; i++) 
			{
				if (arrIPAddress[i] > 255)
				{
					return false;
				}
			}
			// IP Valid
			return true;
		}

		// check Domain
		 
		var reAtom = new RegExp("^" + atom + "$");
		var arrDomain = domain.split(".");

		for (i=0; i < arrDomain.length; i++)
		{
			if (arrDomain[i].search(reAtom) == -1)
			{
				return false;
			}
		}

		if (checkTLD && arrDomain[arrDomain.length-1].length != 2 && arrDomain[arrDomain.length-1].search(reUSDomains) == -1)
		{
			return false;
		}

		if (stripCharsInBag (arrDomain[arrDomain.length-1], lowercaseLetters + uppercaseLetters) != "")
		{
			return false;
		}

		// Make sure there's a host name preceding the domain.
		if (arrDomain.length < 2)
		{
			return false;
		}

		// Valid
		return true;
	}
}

// isPhoneNumber (STRING s [, BOOLEAN emptyOK])
function isPhoneNumber (s)
{
	if (isEmpty(s))
	{
		if (isPhoneNumber.arguments.length == 1)
		{
			return defaultEmptyOK;
		}
		else
		{
			return (isPhoneNumber.arguments[1] == true);
		}
	}

	var intPhone = stripCharsInBag (s, phoneNumberDelimiters);
	if (!isInteger(intPhone))
	{
		return false;
	}
	if (intPhone.length < digitsInPhoneNumber)
	{
		return false;
	}
	if (s.indexOf("+") != -1 && intPhone.length < digitsInPhoneNumber + 1)
	{
		return false;
	}
	return true;
}


// isUSPostalCode (STRING s [, BOOLEAN emptyOK])
function isUSPostalCode (s)
{
	if (isEmpty(s))
	{
		if (isUSPostalCode.arguments.length == 1)
		{
			return defaultEmptyOK;
		}
		else
		{
			return (isUSPostalCode.arguments[1] == true);
		}
	}
	if (s.indexOf("-") != -1 && (!(s.indexOf("-") == 5 && s.lastIndexOf("-") == 5)))
	{
		return false
	}

	var intZIPCode = stripCharsInBag (s, PostalCodeDelimiters);
	return (isInteger(intZIPCode) && ((intZIPCode.length == digitsInZIPCode1) || (intZIPCode.length == digitsInZIPCode2)));
}


// isCanadianPostalCode (STRING s [, BOOLEAN emptyOK])
function isCanadianPostalCode (s)
{
	if (isEmpty(s))
	{
		if (isCanadianPostalCode.arguments.length == 1)
		{
			return defaultEmptyOK;
		}
		else
		{
			return (isCanadianPostalCode.arguments[1] == true);
		}
	}

	var strPostalCode = stripCharsInBag (s, CAPostalCodeDelimiters);
	return (strPostalCode.length == charsInPostalCode1 && isEmpty(stripCharsInBag (strPostalCode, lowercaseLetters + uppercaseLetters + digits)));
}



function isEqualTo(val,comp){
	return (val==comp);
}

function isNotEqualTo(val,comp){
	return (val!=comp);
}

function isGreaterThan(val,comp){
	return (val>comp);
}

function isGreaterThanOrEqualTo(val,comp){
	return (isEqualTo(val,comp)&&isGreaterThan(val,comp));
}

function isLessThan(val,comp){
	return (val<comp);
}

function isLessThanOrEqualTo(val,comp){
	return (isEqualTo(val,comp)&&isLessThan(val,comp));
}

function isStringMatch(val,comp,pos){
	var str;
	var result=false;
	var startPos=-1;
	var strLen=comp.length;
	if (val.length>=comp.length) {
		switch (pos){
			case "b":
				startPos = 0;
				break;
			case "e":
				startPos = val.length - comp.length;
				break;
		}
		if (startPos<0) {
			str = val;
			result=(str.indexOf(comp)>-1);
		} else {
			str = val.substring(0,comp.length);
			result=(str==comp);
		}
	}
	return result;
}

function isNotStringMatch(val,comp,pos){
	return !isStringMatch(val,comp,pos);
}

function isCheckboxChecked(obj){
	try {
		return (obj.checked);
	} catch(e) {
		alert("ERROR (isRadioChecked): " + e.message);
	}
}

function isOneSelected(obj,idx){
	try {
		//idx is lowest acceptable index value
		return (obj.selectedIndex >= idx);
	} catch(e) {
		alert("ERROR (isRadioChecked): " + e.message);
	}
}

function isAtleastOneSelected(obj){
	options = obj.options;
	var isChecked=false;
	for(x=0;x<options.length;x++) {
		if (options[x].checked) {
			isChecked=true;
		}
	}
	return isChecked;
}

function isRadioChecked(str){
	try {
		var obj = document.getElementsByName(str);
		var isChecked=false;
		
		for(x=0;x<obj.length;x++) {
			if (obj[x].checked) {
				isChecked=true;
			}
		}
		return isChecked;
	} catch(e) {
		alert("ERROR (isRadioChecked): " + e.message);
	}
}

function getCheckedRadioVal(str){
	try {
		var obj = document.getElementsByName(str);
		var val="";
		
		for(x=0;x<obj.length;x++) {
			if (obj[x].checked) {
				val=obj[x].value;
			}
		}
		return val;
	} catch(e) {
		alert("ERROR (isRadioChecked): " + e.message);
	}
}

function getLabel(theObj) {
	try {
		var lbls = document.getElementsByTagName("label");
		var lblFor = "";
		var objId = "";
		for (l=0;l<lbls.length;l++) {
			objId = lbls[l].getAttribute("id").replace("lbl_","");
			if (lblFor == theObj.id) {
				return lbls[l].innerHTML;
			}
		}
		return "";
	} catch(e) { }
}
