//////////////////////////////////
// MAIN JAVASCRIPT FORM VALIDATION
//////////////////////////////////



// REGULAR EXPRESSIONS
///////////////////////////////////////////////////////////////////////////////////////////////////////////

// DATE (mm/dd/yyyy)
// re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
// OR
// re = /^[0-3]?[0-9]\/[01]?[0-9]\/[12][90][0-9][0-9]$/


// REFORMAT FUNCTION EXPLANATIONS
///////////////////////////////////////////////////////////////////////////////////////////////////////////

// moveNext(sWhat,sWhen,sWhat)		Move users along phone number fields.
// onBlur_phone(str)			Formats phone number to (503)646-0242.
// onFocus_phone(str)			Unformats phone number to 5036460242.
// stripCharsInBag (s, bag)            	Removes all characters in string bag from string s.
// stripCharsNotInBag (s, bag)         	Removes all characters NOT in string bag from string s.


// SINGLE VALIDATION FUNCTION EXPLANATIONS
///////////////////////////////////////////////////////////////////////////////////////////////////////////

// isCheckboxChecked(sel,multiple)	Check checkbox group to see if any has been checked. Multiple signifies whether the checkbox is by itself(1) or in a group(2).
// isCheckboxCount(sel)			Check if specified checkboxes have been checked; RETURN BOOLEAN
// isDigit (c)                          Check whether character c is a digit.
// isEmail(s)				Check whether String s is a valid email.
// isEmpty(s)				Check whether string s is empty.
// isInteger(s [,eok])                	True if all characters in string s are numbers.
// isLetter(c)				Check whether Character c is a valid letter (a-z;A-Z).
// isMoney(s)				Check whether string is a number (1 || 100 || 100.25)
// isName(c)				Check whether Character c is a valid name (a-z;A-Z;(');( );(-) ).
// isNamechr(c)				Check whether Character c is a valid name character ( (');( );(-) ).
// isOptionChecked(sel,n)		Check whether specified option is checked in radio group.
// isRadioChecked(sel,s)		Check radio group to see if any has been selected.
// isRadioValue(sel)			Check radio group to see if a particular value has been selected.
// isSelected(sel)			Check select list to see if valid item has been selected.
// isSelectedHaveValue(sel)		Check select list to see if selected item has a valid value.
// isSelectedValue(sel,s)		Check select list to see if selected item value is the right one.
// isSSN (s [,eok])                    	True if string s is a valid U.S. Social Security Number.
// isURL(s)				Check whether URL is valid
// isUSPhoneNumber(s [,eok])          	True if string s is a valid U.S. Phone Number. 
// isWhitespace(s)			Returns true if string s is empty or whitespace characters only.
// isZIPCode(s [,eok])                	True if string s is a valid U.S. ZIP code.
// stopTxtArea(obj,len, formName, id)	Prevent user from exceeding maximum length


// GROUP VALIDATION FUNCTION EXPLANATIONS
///////////////////////////////////////////////////////////////////////////////////////////////////////////

// checkBirthDate(theField, emptyOK)	Check that string theField.value is a valid birthdate.
// checkDate(theField, emptyOK)		Check that string theField.value is a valid date.
// checkEmail(theField, emptyOK)	Check that string theField.value is a valid email.
// checkName(theField, emptyOK)		Check that string theField.value is a valid name.
// checkSSN (theField [,eok])          	Check that theField.value is a valid SSN.
// checkString(theField, emptyOK)	Check that string theField.value is not empty or all whitespaces.
// checkUSPhone(theField, emptyOK)	Check that string theField.value is a valid US phone number.
// checkUSPhone2(s1,s2,s3, emptyOK)	Check that string theField.value is a valid US phone number.
// checkZIPCode(theField, emptyOK)	Check that string theField.value is a valid ZIP code.


// GENERAL FUNCTION EXPLANATIONS
///////////////////////////////////////////////////////////////////////////////////////////////////////////

// checkAll()						Check all checkboxes in array
// checkClicked(email_arr)				Check to see if user clicked at least one checkbox to generate email list
// checkForEnter(evt,the_form,the_userAction)		Check to see if user hits enter key; if so submit form
// checkThisOrThat(ckBox1, ckBox2)			When user checks one box, uncheck the others
// delete_record(the_form, the_userAction)		Make user confirm if deleting a record
// getCheckedValue(radioObj)				Return value of radio button checked
// jumpMenu(targ, selObj, restore)			Provide js for a select without a go button
// open_new_window(the_url,win_name,win_props)		Open new browser window
// trim()


// NON VALIDATION FUNCTION EXPLANATIONS
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// adjustFooter()					Adjusts footer based off of top and height of tallest div
// cancelForm()						Allow user to cancel once getting into certain forms
// toggleNav()						For logged-in users, provide a means of hiding the left nav
// putFocusOnSubmit()					Put focus on submit for pages that just have a submit button
// setEmailArray()
// view_hide_section(obj, handlingID)			View or hide a section with an id

// ALERT DECLARATIONS
///////////////////////////////////////////////////////////////////////////////////////////////////////////

var msgAddress = "Please enter a valid address\n";
var msgCity = "Please enter a valid city\n";
var msgCityOther = "Please select a City or enter City in Other\n";
var msgConfirm = "Please confirm your password\n";
var msgDOB = "Please enter a valid birth date\n";
var msgDescription = "Please enter a valid description\n";
var msgEmail = "Please enter a valid email\n";
var msgEmailHome = "Please enter a valid home email\n";
var msgEmailWork = "Please enter a valid work email\n";
var msgEmailConfirm = "Please enter a valid email confirmation\n";
var msgEmployer = "Please enter an employer name\n";
var msgExt = "Please enter a valid phone extension\n";
var msgFax = "Please enter a valid fax\n";
var msgFirst = "Please enter a valid first name\n";
var msgGender = "Please select a gender\n";
var msgLast = "Please enter a valid last name\n";
var msgMiddle = "Please enter a valid middle name\n";
var msgOrganization = "Please enter an organization\n";
var msgPassword = "Please enter a valid password (5-10 characters with at least 1 number)\n";
var msgPasswordConfirm = "Please enter a valid password confirmation\n";
var msgPasswordConfirmEqual = "Please ensure password and confirmation password are same\n";
var msgPhone = "Please enter a valid phone\n";
var msgPhoneWork = "Please enter a valid work phone\n";
var msgPhoneCell = "Please enter a valid cell phone\n";
var msgPhoneSecondary = "Please enter a valid secondary phone\n";
var msgSecurityAnswer = "Please enter a challenge answer\n";
var msgSecurityQuestion = "Please select a challenge question\n";
var msgSSN = "Please enter a valid social security number\n";
var msgState = "Please select a valid State\n";
var msgTitle = "Please enter a valid title\n";
var msgURL = "Please enter a valid URL\n";
var msgUsername = "Please enter a valid username (Your email address)\n";
var msgWebsite = "Please enter a valid website\n";
var msgZip = "Please enter a valid zip code\n";


// VARIABLE DECLARATIONS
///////////////////////////////////////////////////////////////////////////////////////////////////////////

var checkFlag = false;

var defaultEmptyOK = false;

var whitespace = " \t\n\r";

var digits = "0123456789";
var money = "0123456789.";
var numbers = "0123456789.";

var lower = "abcdefghijklmnopqrstuvwxyz";
var upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

var digitsInUSPhoneNumber = 10;
var phoneNumberDelimiters = "()- ";

var digitsInZIPCode1 = 5;
var digitsInZIPCode2 = 9;

var digitsInDateMin = 8;
var digitsInDateMax = 10;
var DateDelimiters = "/";
var validDateChars = digits;

var digitsInSocialSecurityNumber = 9;
var SSNDelimiters = "- ";
var validSSNChars = digits + SSNDelimiters;

var GPAFormat = /[0-9]\.[0-9][0-9]?/;


// REFORMAT FUNCTIONS
///////////////////////////////////////////////////////////////////////////////////////////////////////////

function moveNext(sWhat,sWhen,sWhere){
	if(sWhat.value.length==sWhen) sWhere.focus();
}

function onBlur_phone(str)
{
	var phonereturn = "(" + str.value.substr(0,3) + ")" + str.value.substr(3,3) + "-" + str.value.substr(6,4);
	//alert(phonereturn);

	if( (str.value.length != 10) && (str.value.length != 0) )
	{
		alert("Please enter a 10-digit number with no dashes or spaces.");
		str.focus();
		str.select();
	}

	else if(str.value.length == 0) null;

	else
	{
		var legalChr = "0123456789";
		for(i=0;i<str.value.length;i++)
		{
			myChar = str.value.charAt(i);
			if(legalChr.indexOf(myChar) < 0)
			{
				alert("Please enter numbers only.");
				str.focus();
				str.select();
				break;
			}
		}
		//str.value = "";
		//str.value = phonereturn;
	}
}


function onFocus_phone(str)
{
	var put_str = new String(str.value);
	var stripped = put_str.replace(/[\(\)\.\-\ ]/g, '');
	//str.value = stripped;
	str.focus();
	//str.select();
}


function reformatSSN (SSN)
{   return (reformat (SSN, "", 3, "-", 2, "-", 4))
}


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;
}


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;
}


// SINGLE VALIDATION FUNCTIONS
///////////////////////////////////////////////////////////////////////////////////////////////////////////

function isCheckboxChecked(sel,multiple)
{
	//1=single ; 2=multiple
	var nbr = 0;

	if(multiple == 1)
	{
		if(sel.checked) nbr++;
	}
	else
	{
		for(i=0;i<sel.length;i++)
		{
			if(sel[i].checked) nbr ++;
		}
	}
	if(nbr > 0) return true;
	else return false;
}

function isCheckboxCount(sel,cnt)
{
	var n=0;
	//alert(sel.length);
	for(i=0;i<sel.length;i++)
	{
		if(sel[i].checked) n++;
	}

	if(n==cnt) return true;
	else return false;
}


function isDigit(c)
{
	return ((c >= "0") && (c <= "9"))
}


function isEmail (s)
{
	if (isEmpty(s)) 
       	if (isEmail.arguments.length == 1) return defaultEmptyOK;
       	else return (isEmail.arguments[1] == true);
   
    	if (isWhitespace(s)) return false;

	// /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/

	//  julie.stenson@bus.oregonstate.edu

	//var validEmail = /^([\w]+)(.[\w]+)*@([\w]+)(.[\w]{2,11}){1,3}$/;
	//var validEmail = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	//if (!validEmail.test(s)) return false;
	//else return true;


    	// there must be >= 1 character before @, so we
    	// start looking at character position 1 
    	// (i.e. second character)
    	var i = 1;
    	var sLength = s.length;

    	// look for @
    	while ((i < sLength) && (s.charAt(i) != "@"))
    	{ i++
    	}

    	if ((i >= sLength) || (s.charAt(i) != "@")) return false;
    	else i += 2;

    	// look for .
    	while ((i < sLength) && (s.charAt(i) != "."))
    	{ i++
    	}

    	// there must be at least one character after the .
    	if ((i >= sLength - 1) || (s.charAt(i) != ".")) return false;
    	else return true;
}


function isEmpty(s)
{
	return ((s == null) || (s.length == 0))
}

function isFile(s){
//alert(s);
	/*var validFile = /^[a-zA-Z0-9_\-\.\/\:\\]$/;
	if (!validFile.test(s)) return false;
	else return true;*/

return true;
}


function isInteger(s)

{
	var i;

    	if (isEmpty(s)){
       		if (isInteger.arguments.length == 1) return defaultEmptyOK;
       		else return (isInteger.arguments[1] == true);
	}

    	// Search through string's characters one by one
    	// until we find a non-numeric character.
    	// When we do, return false; if we don't, return true.
    	for (i = 0; i < s.length; i++)
    	{   
        	// Check that current character is number.
        	var c = s.charAt(i);
        	if (!isDigit(c)) return false;
    	}
    	// All characters are numbers.
    	return true;
}


function isLetter(c)
{
	return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) )
}


function isMoney(s){
	var i;
	var IsMoney=true;
	var dots=0;
	var afterDot=0;

	//alert(isMoney.arguments.length);

    	if (isEmpty(s)) 
       		if (isMoney.arguments.length == 1) return defaultEmptyOK;
       		else return (isMoney.arguments[1] == true);

    	for (i = 0; i < s.length; i++)
    	{
        	var c = s.charAt(i);

		if(money.indexOf(c) == -1){
			IsMoney = false;
		}

		if(c==".") dots+=1;
		if(c!="." && dots==1) afterDot+=1;
    	}
	//alert(dots);
	//alert(afterDot);
	//REFUSE IF MORE THAN ONE DOT
	//REFUSE IF MORE THAN TWO DIGITS AFTER DOT
	if(dots>1 || afterDot>2) IsMoney = false;
    	return IsMoney;

}


function isName(s)
{
	var i;

    	if (isEmpty(s)) 
       		if (isName.arguments.length == 1) return defaultEmptyOK;
       		else return (isName.arguments[1] == true);

    	for (i = 0; i < s.length; i++)
    	{   
        	var c = s.charAt(i);

        	if (!isLetter(c) && (!isNamechr(c)) ) return false;
    	}
    	return true;
}


function isNamechr(c)
{
	return ( (c==" " || c=="'" || c=="-") )
}


/* http://www.codetoad.com/javascript/isnumeric.asp */
function isNumeric(s)
{
	//   var ValidChars = "0123456789.";
	var IsNumber=true;
	var Char;

	for (i=0;i<s.length && IsNumber==true;i++){ 
		Char = s.charAt(i); 
      		if (numbers.indexOf(Char) == -1){
        		IsNumber = false;
        	}
	}
	return IsNumber;
}



function isRadioChecked(sel,s)
{
	var nbr = 0;

	if(sel.length == undefined){
		if(sel.checked) nbr = 1;
	}
	else{
		for(i=0;i<sel.length;i++){
			if(sel[i].checked) nbr ++;
		}
	}

	if(nbr > 0) return true;
	else return false;
}


function isRadioValue(sel)
{
	var selectedValue;
	for(i=0;i<sel.length;i++)
	{
		if(sel[i].checked) selectedValue =  sel[i].value;	
	}
	return selectedValue;
}

// RADIO GROUP
function isOptionChecked(sel,n)
{
	var selectedIndex;
	for(i=0;i<sel.length;i++)
	{
		if(sel[i].checked) selectedIndex =  i;	
	}
	//alert("selectedIndex=" + selectedIndex);
	if(selectedIndex == n) return true;
	else return false;
}

// SELECT LIST
function isOptionSelected(sel,n)
{
	if(sel.selectedIndex != n) return false;
	else return true;
}


function isSelected(sel)
{
	var indx = sel.selectedIndex;
	if(indx == 0 || indx == -1) return false;
	else return true;
}

function isSelectedHaveValue(sel)
{
//alert("here");
	var indx = sel.selectedIndex;
//alert(sel.options[indx].value.length);
	if(sel.options[indx].value.length==0) return false;
	else return true;	
}

function isSelectedValue(sel,s)
{
	var indx = sel.selectedIndex;
	if(sel.options[indx].text==s) return true;
	else return false;
}


function isSSN (s){
	if (isEmpty(s)) 
       		if (isSSN.arguments.length == 1) return defaultEmptyOK;
       		else return (isSSN.arguments[1] == true);
    	return (isInteger(s) && s.length == digitsInSocialSecurityNumber)
}

// NOT USING BECAUSE IT EITHER REQUIRES "HTTP://" (FIRST REGEXP)
// OR BECAUSE THE CODE HAS TO ALLOW FOR "HTTP://" OR NOTHING (SECOND REGEXP)
function isURL(theField){
//	alert(theField.value);
	if(isEmpty(theField.value)){
       		if (isURL.arguments.length == 1) return defaultEmptyOK;
	}
	else{
		//var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/
		var regexp = /(ftp|http|https)?:?\/?\/?(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/

		//alert(regexp);
		//alert(regexp.test(theField.value));
		return regexp.test(theField.value);
	}
}


function isUSPhoneNumber(s)
{
	if (isEmpty(s)) 
       	if (isUSPhoneNumber.arguments.length == 1) return defaultEmptyOK;
       	else return (isUSPhoneNumber.arguments[1] == true);
    	return (isInteger(s) && s.length == digitsInUSPhoneNumber)
}



function isWhitespace(s)
{
	var i;

    	// Is s empty?
    	if (isEmpty(s)) return true;

    	// Search through string's characters one by one
    	// until we find a non-whitespace character.
    	// When we do, return false; if we don't, return true.

    	for (i = 0; i < s.length; i++)
    	{   
        	// Check that current character isn't whitespace.
        	var c = s.charAt(i);

        	if (whitespace.indexOf(c) == -1) return false;
    	}

    	// All characters are whitespace.
    	return true;
}


// POSSIBLE NEW WAYS
// http://www.dreamincode.net/code/snippet70.htm
// http://www.zend.com/code/codex.php?id=991&single=1
// http://www.zip-codes.com/zip-code-maps/oregon-zip-code-map.asp
// [http://www.oregonlibraries.net/stats/zipcodes]

function isZIPCode(s)
{  
	if (isEmpty(s)) 
       		if (isZIPCode.arguments.length == 1) return defaultEmptyOK;
       	else return (isZIPCode.arguments[1] == true);
   	return (isInteger(s) && ((s.length == digitsInZIPCode1) || (s.length == digitsInZIPCode2)))
}


function stopTxtArea(obj,len, formName, id)
{
	//alert(obj.value.length);

	// DO NOT LET USER PUT IN MORE WORDS
	if(obj.value.length >= len)
	{
		alert("You have exceeded the maximum character limit.");
		obj.value = obj.value.substring(0,len-1);
	}

	// ONLY PERFORM FOR FORMS THAT ALLOW FOR THIS
	if(formName){
		var str = (len-obj.value.length) + " words left";
		document.getElementById(id).innerHTML=str;
	}
}


// GROUP VALIDATION FUNCTIONS
///////////////////////////////////////////////////////////////////////////////////////////////////////////

function checkBirthDate (theField, emptyOK)
{   if (checkBirthDate.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else
    {
	re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
	if(!theField.value.match(re)) return false;

	var strArr = theField.value.split("/");
	if(isEmpty(theField.value)) return false;
	if(theField.value.length<4) return false;
	if(strArr[0] > 12) return false;
	if(strArr[1] > 31) return false;
	if( (strArr[2] < 1920) || (strArr[2] > 2000) ) return false;
	return true;
    }
}

function checkDate (theField, emptyOK)
{   if (checkDate.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else
    {  
	re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
	if(!theField.value.match(re)) return false;

	var strArr = theField.value.split("/");
	if(isEmpty(theField.value)) return false;
	if(strArr[0] > 12) return false;
	if(strArr[1] > 31) return false;
	if( (strArr[2] < 1900) || (strArr[2] > 2050) ) return false;
	return true;
    }
}

function checkEmail(theField, emptyOK)
{
	if (checkEmail.arguments.length == 1) emptyOK = defaultEmptyOK;
    	if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    	else if (!isEmail(theField.value, false)) return false;
    	else return true;
}




function checkGPA(theField, emptyOK)
{
	if (checkGPA.arguments.length == 1) emptyOK = defaultEmptyOK;
    	if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    	else if (theField.value.search(GPAFormat)== -1) return false;
    	else return true;
}


function checkName(theField, emptyOK)
{   
    	if (checkName.arguments.length == 1) emptyOK = defaultEmptyOK;
    	if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    	if (isWhitespace(theField.value)) return false;
    	else if (!isName(theField.value)) return false;
    	else return true;
}


function checkString(theField, emptyOK)
{   
	// Next line is needed on NN3 to avoid "undefined is not a number" error
    	// in equality comparison below.

    	if (checkString.arguments.length == 1) emptyOK = defaultEmptyOK;
    	if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    	if (isWhitespace(theField.value)) return false;
    	else return true;
}


function checkSSN (theField, emptyOK)
{   if (checkSSN.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else
    {  var normalizedSSN = stripCharsInBag(theField.value, SSNDelimiters)
       if (!isSSN(normalizedSSN, false)) 
          return false;
       else 
       {  // if you don't want to reformats as 123-456-7890, comment next line out
          //theField.value = reformatSSN(normalizedSSN)
	  theField.value = normalizedSSN;
          return true;
       }
    }
}
/*
function isPasswordCharacter(c)
{
	return ( ( (c >= "0") && (c <= "9") ) || ( (c>="a") && (c<="z") ) || ( (c>="A") && (c<="Z") ) )
}*/


function isCharacter(c)
{
	return ( ( (c>="a") && (c<="z") ) || ( (c>="A") && (c<="Z") ) )
}


function checkPassword(str, emptyOK){
	// 5 to 10 characters in length
	// must include at least one number

//	alert(str.value);
//	alert(str.value.length);

	var chrctr = 0;
	var numbr = 0;

    	if (checkPassword.arguments.length == 1) emptyOK = defaultEmptyOK;
    	if ((emptyOK == true) && (isEmpty(str.value))) return true;


    	for (i = 0; i < str.value.length; i++){   
 		//alert(str.value.charAt(i));
		var c = str.value.charAt(i);
		if(isDigit(c)) numbr+=1;
		if(isCharacter(c)) chrctr+=1;
    	}
//	alert("number cnt = " + numbr);
//	alert("character cnt = " + chrctr);

	if(numbr < 1) return false;
	if(str.value.length < 5) return false
	if(str.value.length > 10) return false
	return true;
}


function checkUSPhone(theField, emptyOK)
{
	if (checkUSPhone.arguments.length == 1) emptyOK = defaultEmptyOK;
    	if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    	else
    	{
		var normalizedPhone = stripCharsInBag(theField.value, phoneNumberDelimiters)
       		if(!isUSPhoneNumber(normalizedPhone, false)) return false;
		//if(!isUSPhoneNumber(theField.value)) return false;
       		else
		{
			theField.value = normalizedPhone;
			return true;
		}
       	}
}

// NPA AND NNX CANNOT START WITH A ZERO
function checkUSPhone2(s1,s2,s3, emptyOK)
{
	if (checkUSPhone2.arguments.length == 3) emptyOK = defaultEmptyOK;
    	if ( (emptyOK == true) && (isEmpty(s1.value)) && (isEmpty(s2.value)) && (isEmpty(s3.value)) ) return true;
    	else
    	{
		var npa = s1.value;
		var nnx = s2.value;
		var line = s3.value;

		if( (isNaN(s1.value)) || (s1.value.length!=3) ) return false;
		if( (isNaN(s2.value)) || (s2.value.length!=3) ) return false;
		if( (!isNumeric(s3.value)) || (s3.value.length!=4) ) return false;
		if(npa.substr(0,1)=="0") return false;
		if(nnx.substr(0,1)=="0") return false;
		else return true;
       	}
}

function checkYear (theField, emptyOK){
	if (checkYear.arguments.length == 1) emptyOK = defaultEmptyOK;
    	if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else
    {  
	//re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
	re = /\d{4}/;
	if(!theField.value.match(re)) return false;

	if(isEmpty(theField.value)) return false;
	if( (theField.value < 1930) || (theField.value > 2050) ) return false;
	return true;
    }
}


function checkZIPCode(theField, emptyOK)
{   
	if (checkZIPCode.arguments.length == 1) emptyOK = defaultEmptyOK;
    	if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    	else
    	{
		//var normalizedZIP = stripCharsInBag(theField.value, ZIPCodeDelimiters)
	      	//if (!isZIPCode(normalizedZIP, false)) return false;
		if (!isZIPCode(theField.value, false)) return false;
	      	else return true;
    	}
}


// GENERAL FUNCTIONS
///////////////////////////////////////////////////////////////////////////////////////////////////////////

function checkAll(the_form, default_msg, second_msg){
	// ONLY ONE CHECKBOX
	if(the_form.length==undefined){
		if(checkFlag == false){
			the_form.checked=true;
			checkFlag = true;
		}
		else{
			the_form.checked=false;
			checkFlag = false;
		}
	}


	else{
    		if(checkFlag == false){
    			for(x=0;x<the_form.length;x++){
    				the_form[x].checked = true;
    				checkFlag = true;
    			}
    
    			if(second_msg) return second_msg;
    		}
    		else{
    			for(x=0;x<the_form.length;x++){
    				the_form[x].checked = false;
    				checkFlag = false;
    			}
    			if(default_msg) return default_msg;
    		}
	}
}

function checkAllBoxesOnForm(frmID, ckID){
	var frm = document.getElementById(frmID);
	var ckBox = document.getElementById(ckID);
	
	var cnt = 0;
	
	if(ckBox.checked){
		for(x=0;x<frm.length;x++){
			if(frm[x].type == "checkbox" && frm[x].name != ckBox.name){
				frm[x].checked=true;
				cnt++;
			}
		}
	}
	else{
		for(x=0;x<frm.length;x++){
			if(frm[x].type == "checkbox" && frm[x].name != ckBox.name){
				frm[x].checked=false;
				cnt++;
			}
		}
	}
	//alert("cnt: " + cnt);
}

function checkForEnter(evt, the_form, the_userAction)
{
	evt = (evt) ? evt : event;
	var charCode = (evt.which) ? evt.which : evt.keyCode;

	if(charCode == 13){
		validate_form(the_form, the_userAction);
		return false;
	}
	return true;
}

/***
	THIS FUNCTION IS FOR THE NEW FORM FORMAT
	WHICH DOES NOT USE THE VALIDATE_FORM FUNCTION
	THIS FUNCTION IS SET ON THE FORM ITSELF

	ONLY SUBMIT FORM WHEN USER NOT USING SELECT LIST
	ALL SELECT LISTS IN FORM MUST HAVE ID IN ORDER FOR THIS TO WORK
***/
function checkForEnter2(evt, thisForm)
{
	// CAPTURE EVENT
	evt = (evt) ? evt : event;

	// CAPTURE WHICH KEY WAS PRESSED
	var charCode = (evt.which) ? evt.which : evt.keyCode;

	// DETERMINE OBJECT ID THAT TRIGGERED EVENT
	var objectID = (evt.target) ? evt.target.id : ((evt.srcElement) ? evt.srcElement.id : null);

	// DETERMINE TYPE OF OBJECT THAT TRIGGERED EVENT
	if(objectID) var obj = document.getElementById(objectID).type;

	// SUBMIT WHEN USER CLICKS ENTER AND NOT FROM A SELECT LIST
	if( (charCode == 13) && (obj != "select-one") ){
		thisForm.submit();
	}
}

function checkThisOrThat(ckBox1,nbr){
	if(nbr==0) ckBox1[1].checked=false;
	else ckBox1[0].checked=false;
}


function delete_record(the_form, the_userAction)
{

	var return_value = confirm("Are you sure");
	if(return_value)
	{
		the_form.userAction.value = the_userAction;
		the_form.submit();
	}//end if
}//end function


// http://www.somacon.com/p143.php
// return the value of the radio button that is checked
// return an empty string if none are checked, or
// there are no radio buttons
function getCheckedValue(radioObj) {
	if(!radioObj)
		return "";
	var radioLength = radioObj.length;
	if(radioLength == undefined)
		if(radioObj.checked)
			return radioObj.value;
		else
			return "";
	for(var i = 0; i < radioLength; i++) {
		if(radioObj[i].checked) {
			return radioObj[i].value;
		}
	}
	return "";
}


/* not sure about the quotes; pulled out of pl/sql */
/*
function index_jumpMenu(targ,selObj,restore)
{
	eval(targ + ".location=''" + selObj.options[selObj.selectedIndex].value + "''");
	if (restore) selObj.selectedIndex=0;
}
*/

function open_new_window (the_url,win_name,win_props){
	window.open(the_url,win_name,win_props);
}

// ********************************************************************************


function Selected_Count(the_element)
{
	var checked_counter = 0;

	// IF RADIO BUTTON
   	if (( isNaN(the_element.length) ) || (the_element.length == null))
	{
		// IF RADIO BUTTON IS CHECKED, SET CHECKED_COUNTER = 1
		if (the_element.checked == true)
		{
          	checked_counter ++;
		}
	}

	// IF CHECKBOXES
   	else
	{
     	for (i=0; i<the_element.length; i++)
		{
			// DETERMINE HOW MANY CHECKBOXES ARE CHECKED
			if (the_element[i].checked == true)
			{
               	checked_counter ++;
			}
        	}
   	}

	return(checked_counter);
}



// NON VALIDATION FUNCTION EXPLANATIONS
///////////////////////////////////////////////////////////////////////////////////////////////////////////

// THIS IS TO ADJUST THE FOOTER WHEN USING CONTENTTWO DIV, WHICH IS ABSOLUTELY POSITIONED
// THUS MAKING THE FOOTER DISPLAY UNDERNEATH THE ABOVE DIV...THIS WE DON'T WANT

// FOR THE TIME BEING, ONLY SET FOOTER WHEN THERE IS A CONTENTTWO DIV
// YOU MAY PERFORM THE RESETTING REGARDLESS OF THE EXISTENCE OF CONTENTTWO DIV IF YOU WISH

function adjustFooter(plusThisAmount){
//alert("here " + plusThisAmount);
var amt;
if(plusThisAmount) amt = plusThisAmount;
else amt = 0;

if(document.getElementById("contentTwo")){
  var obj = document.getElementById("contentTwo");

  var maxTop = 0;
  var maxHeight = 0;

  // LOOP THROUGH ALL DIVS AND FIND TOP AND HEIGHT FOR DIVS WITH AN ID
  var doc = document.getElementsByTagName("div");
  for(i=0;i<doc.length;i++){
    if(doc[i].id && (doc[i].id!="footer")){
      //alert(doc[i].id);
      maxTop = Math.max(maxTop,document.getElementById(doc[i].id).offsetTop);
      maxHeight = Math.max(maxHeight,document.getElementById(doc[i].id).offsetHeight);
    }
  }
  //alert(maxTop+maxHeight+"px");
  var maxPosition = (maxTop + maxHeight + amt + "px")

  document.getElementById("footer").style.position = "absolute";
  document.getElementById("footer").style.top = maxPosition;
//  document.getElementById("footer").style.left = "10%";
  document.getElementById("footer").style.left = "170px";
  document.getElementById("footer").style.width = "630px";


/*
  // RETRIEVE TOP AND HEIGHT FOR CONTENTTWO DIV
  var obj = document.getElementById("contentTwo");
  var t = obj.offsetTop;
  var h = obj.offsetHeight;

  // RETRIEVE TOP AND HEIGHT FOR LEFTNAV DIV
  var obj2 = document.getElementById("leftSection");
  var t2 = obj2.offsetTop;
  var h2 = obj2.offsetHeight;

  var max = Math.max((t+h),(t2+h2));
  //alert(max);

  position = (max+"px");
  //alert(position);

  //if(document.getElementById("footer")) alert ("yes there is a footer");

  if(obj){
    document.getElementById("footer").style.position = "absolute";
    document.getElementById("footer").style.top = position;
  }
*/
}
}

// //////////////////////////////////////////////////////////////////////////
// HOW TO USE THIS FUNCTION
// t_base_url VARCHAR2(200) := get.base_url('ctdi_speaker.list');
// all_put_input.button(NULL,NULL,'Cancel',p_display=>'running',p_onclick=>'cancelForm(''' || t_base_url || ''');');
// OR
// input('button',NULL,'Cancel',p_onclick=>'cancelForm(''' || t_base_url || ''');');

function cancelForm(url){
  location.href = url;
}



// //////////////////////////////////////////////////////////////////////////
// DYNAMICALLY CHANGE CURSOR TO HAND / POINTER
// INITIALLY THIS IS BEING USED FOR THE TOGGLE NAVIGATION DIV
function changeCursor(evt){
	var objID = (evt.target) ? evt.target.id : ((evt.srcElement) ? evt.srcElement.id : null);
	var obj = document.getElementById(objID);
	obj.style.cursor="pointer"; // NS6, IE6
	obj.style.cursor="hand"; // cross browser
}

// //////////////////////////////////////////////////////////////////////////
function toggleNav(){
	if(document.getElementById("leftSection")){
		objToToggle = document.getElementById("leftSection");
		if(objToToggle.style.display.length == 0) objToToggle.style.display="block";

		var dis = (objToToggle.style.display == "block") ? "none" : "block";
		objToToggle.style.display = dis;

		if(document.getElementById("contentTwo")){
			if(objToToggle.style.display == "none"){
				with(document.getElementById("contentTwo").style){
					left = "5em";
					right = "5em";
					width = "730px";
				}
  			}
  			else{
				with(document.getElementById("contentTwo").style){
					left = "170px";
					right = "120px";
					width = "700px";
				}
  			}
		}
	}
}

// //////////////////////////////////////////////////////////////////////////
function putFocusOnSubmit(){
	if(!document.forms) return false;
	var f = document.forms;

	for(i=0;i<f.length;i++){
		for(y=0;y<f[i].length;y++){
			if(f[i][y].type=="submit"){
				f[i][y].focus();
				break;
			}
		}
	}
}

// //////////////////////////////////////////////////////////////////////////

function setEmailArray(thisForm){
	var len = thisForm.length;
	var str = new Array();
	var cnt = 0;

	for(x=0;x<len;x++){
		if(thisForm[x].checked){
			str[cnt] = thisForm[x].value;
			cnt++;
		}
	}

	// ASSIGN ARRAY OF IDS TO FIELD AS A STRING
	document.frmEmail.p_str_array.value = str.toString();

	if(cnt==0) return false;
	else return true;
}

// //////////////////////////////////////////////////////////////////////////
// THIS SECTION (http://www.somacon.com/p355.php)

// HOW TO USE
// myString.trim()


String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function() {
	return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function() {
	return this.replace(/\s+$/,"");
}


// //////////////////////////////////////////////////////////////////////////

// how to call:       a('nem_request.request_match',p_contents=>'View Current Requests',p_id=>'requestA',p_onclick=>'return view_hide_section(this,''nemCurrentRequests'',''View Current Requests'',''Hide Current Requests'');');

function view_hide_section(linkObj, handlingID, viewText, closeText){
	// 0 = close
	// 1 = open

	// view_hide_section(this,''filterSection'',''View Filter'',''Close Filter'');
	/*
	EXAMPLE
	p(a_f('nem_request.request_match',p_contents=>'View/Hide Instructions',p_onclick=>'return view_hide_section(this,''instructions'',''View/Hide Instructions'',''View/Hide Instructions'');',p_id=>'aInstructions'),p_class=>'center');
    div(p_id=>'instructions',p_style=>'display: block;');
	*/

	var handlingObj = document.getElementById(handlingID);
	var isHandlingObjVisible = (handlingObj.style.display=="block") ? true : false;

	var alink = document.getElementById(linkObj.id);

	if(isHandlingObjVisible==true) handlingObj.style.display="none";
	else handlingObj.style.display="block";

	var alinkText = (isHandlingObjVisible) ? viewText : closeText;

	//alert(alink.style.height);

	alink.innerHTML=alinkText;

	//alert(alink.style.height);

	//alert(alink.innerHTML);
	//alert(alink.aHref);
	//alert(alink.id);
	//alert(alink.onclick);

	return false;
}



/*********************************************************************************/
/*
*	how to call: showHide("divMe",true,"div","div")
*	id = the element in which you want to show or hide
*	hide_others = indicate you want to hide others of the same type
*	idName = partial name of the other elements to hide
*/
function showHide(id, hide_others, tagName, idName, top, left){
	if(hide_others){
		var arr = document.getElementsByTagName(tagName);
		for(x=0;x<arr.length;x++){
			if(arr[x].id.indexOf(idName)>-1 && arr[x].id!=id){
				var o = document.getElementById(arr[x].id);
				o.style.display="none";
			}
		}
	}
	
	var obj = document.getElementById(id);
	if(obj){
		if(top) obj.style.top = top;
		if(left) obj.style.left = left;

		var style = obj.style.display;
		var do_it = (style=="none" || style=="") ? obj.style.display="block" : obj.style.display="none";
	}
	return false;
}


function closeDiv(div_id){
	var obj = document.getElementById(div_id);
	obj.style.display="none";
	return false;
}

// //////////////////////////////////////////////////////////////////////////

function trim(s){
	return rtrim(ltrim(s));
}

function ltrim(s){
	var l=0;
	while(l < s.length && s[l] == ' ')
	{	l++; }
	return s.substring(l, s.length);
}

function rtrim(s){
	var r=s.length -1;
	while(r > 0 && s[r] == ' ')
	{	r-=1;	}
	return s.substring(0, r+1);
}

// //////////////////////////////////////////////////////////////////////////


function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}


// //////////////////////////////////////////////////////////////////////////






















/*
	Developed by Robert Nyman, http://www.robertnyman.com
	Code/licensing: http://code.google.com/p/getelementsbyclassname/
	
To get all elements in the document with a “info-links” class. 
getElementsByClassName("info-links"); 

To get all div elements within the element named "container", with a "col" class. 
getElementsByClassName("col", "div", document.getElementById("container")); 

To get all elements within in the document with a "click-me" and a sure-thang class. 
getElementsByClassName("click-me sure-thang");
*/	
var getElementsByClassName = function (className, tag, elm){
	if (document.getElementsByClassName) {
		getElementsByClassName = function (className, tag, elm) {
			elm = elm || document;
			var elements = elm.getElementsByClassName(className),
				nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
				returnElements = [],
				current;
			for(var i=0, il=elements.length; i<il; i+=1){
				current = elements[i];
				if(!nodeName || nodeName.test(current.nodeName)) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	else if (document.evaluate) {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = "",
				xhtmlNamespace = "http://www.w3.org/1999/xhtml",
				namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
				returnElements = [],
				elements,
				node;
			for(var j=0, jl=classes.length; j<jl; j+=1){
				classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
			}
			try	{
				elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
			}
			catch (e) {
				elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
			}
			while ((node = elements.iterateNext())) {
				returnElements.push(node);
			}
			return returnElements;
		};
	}
	else {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = [],
				elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
				current,
				returnElements = [],
				match;
			for(var k=0, kl=classes.length; k<kl; k+=1){
				classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
			}
			for(var l=0, ll=elements.length; l<ll; l+=1){
				current = elements[l];
				match = false;
				for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
					match = classesToCheck[m].test(current.className);
					if (!match) {
						break;
					}
				}
				if (match) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	return getElementsByClassName(className, tag, elm);
};







