
function phoneFilter(form, format) {
	var input = form.value;

	if(input.length > 0) { //do not perform if empty input

		var numbers = ""; //store all the numbers here

		//process to remove non-numbers and spaces
		for(var i = 0; i < input.length; i++) {
			var char = input.charAt(i);
			if(!(isNaN(char) || char == " ")) numbers += char;
		}

		//remove country code, if any
		if(numbers.substring(0, 2) == "47") numbers = numbers.substring(2, numbers.length);

		var output = ""; //assign numbers here

		//assign numbers to chosen format
		var n = 0, i = 0;
		while(i < format.length && n < numbers.length) {
			var char = format.charAt(i);
			if(char == "9") {
				output += numbers.charAt(n++)
			} else {
				output += char;
			}
			i++;
		}

		//give alert if length is less than 8.
		if(numbers.length < 10) {
			alert("The number must be of length 10");
			form.select();
		}

		form.value = output; //output to form
	}
}

function checkdateformat(userinput){
	var dateformat = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/
	return dateformat.test(userinput) //returns true or false depending on userinput
}

function isDateString(stringValue) {
	var theString = new String(stringValue);
	var delimiterCharacter
	if ( theString.indexOf('/') > 0 )
		delimiterCharacter = '/';
	else
		if ( theString.indexOf('-') > 0 )
			delimiterCharacter = '-';
		else
			if ( theString.indexOf(' ') > 0 )
				delimiterCharacter = ' ';
			else
				return false;
				
	var theTokens = theString.split(delimiterCharacter);
	
	if ( theTokens.length < 2 || theTokens.length > 3 )
		return false;
	
	var tokenIndex;
	for ( tokenIndex = 0; tokenIndex < theTokens.length; tokenIndex++ ) {
		theTokens[tokenIndex] = new String(theTokens[tokenIndex])			
		if ( theTokens[tokenIndex].charAt(0) == '0' )
			theTokens[tokenIndex] = theTokens[tokenIndex].substring(1, theTokens[tokenIndex].length);
	}

	for ( tokenIndex = 0; tokenIndex < theTokens.length; tokenIndex++ ) {
		if ( ! isNonnegativeInteger(theTokens[tokenIndex]) )
			return false;
	}
	var numericValue;
	var yearTokenIndex = -1;
	var monthTokenIndex = -1;
	var dayTokenIndex = -1;
	for ( tokenIndex = 0; tokenIndex < theTokens.length; tokenIndex++ ) {
		numericValue = parseInt(theTokens[tokenIndex], 10);
		if ( numericValue <= 12 ) {
			if ( monthTokenIndex == -1 ) {
				monthTokenIndex = tokenIndex;
				continue;
			}
			else {
				if ( dayTokenIndex == -1 ) {
					dayTokenIndex = tokenIndex;
					continue;
				}
				else {
					if ( yearTokenIndex == -1 ) {
						dayTokenIndex = tokenIndex;
						continue;
					}
				}
			}
		}
		else {
			if ( numericValue <= 31 ) {
				if ( dayTokenIndex == -1 ) {
					dayTokenIndex = tokenIndex;
					continue;
				}
				else {
					if ( yearTokenIndex == -1 ) {
						dayTokenIndex = tokenIndex;
						continue;
					}
				}
			}
			else {
				if ( numericValue <= 9999 ) {
					if ( yearTokenIndex == -1 ) {
						yearTokenIndex = tokenIndex;
					}
				}
			}
		}
	}	// end of for loop
	if ( theTokens.length == 2 ) {
		if ( monthTokenIndex == -1 )
			return false;
		if ( ! (yearTokenIndex == -1) ) {
			return true;
		}
		else
			if ( ! (dayTokenIndex == -1) ) {
				var today = new Date();
				var currentYear = today.getYear();
				return isDate(currentYear, theTokens[monthTokenIndex], theTokens[dayTokenIndex]);
			}
			else
				return false;
	}
	else {
		if ( yearTokenIndex == -1 || monthTokenIndex == -1 || dayTokenIndex == -1 )
			return false;
		else
			if ( monthTokenIndex == 0 ) {
				if ( dayTokenIndex != 1 || yearTokenIndex != 2)
					return false;
			}
			else
				if ( dayTokenIndex == 0 ) {
					if ( monthTokenIndex != 1 || yearTokenIndex != 2)
						return false;
				}
				else
					if ( yearTokenIndex == 0 ) {
						if ( monthTokenIndex != 1 || dayTokenIndex != 2)
							return false;
					}
					else
						return false;
			return isDate(theTokens[yearTokenIndex], theTokens[monthTokenIndex], theTokens[dayTokenIndex]);
	}
}
// most of the following was derived from Netscape's FormChek.js
// library, which should be reviewed for documentation and comments

var daysInMonth = makeArray(12);
daysInMonth[1] = 31;
daysInMonth[2] = 29;
daysInMonth[3] = 31;
daysInMonth[4] = 30;
daysInMonth[5] = 31;
daysInMonth[6] = 30;
daysInMonth[7] = 31;
daysInMonth[8] = 31;
daysInMonth[9] = 30;
daysInMonth[10] = 31;
daysInMonth[11] = 30;
daysInMonth[12] = 31;

var whitespace = " \t\n\r";

function charInString(c, s) {
	for (i = 0; i < s.length; i++) {
		if (s.charAt(i) == c)
			return true;
    }
    return false
}

function daysInFebruary(year) {
    return ( ((year % 4 == 0) && ((!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}

function isDate(year, month, day) {
    if ( ! ( isYear(year) && isMonth(month) && isDay(day) ) ) return false;
    var intYear = parseInt(year);
    var intMonth = parseInt(month);
    var intDay = parseInt(day);
    if ( intDay > daysInMonth[intMonth] ) return false; 
    if ( ( intMonth == 2 ) && ( intDay > daysInFebruary(intYear) ) ) return false;
    return true;
}

function isDay(s) {
    return isIntegerInRange(s, 1, 31);
}

function isDigit(c) {
	return ( ( c >= "0" ) && ( c <= "9" ) )
}

function isInteger(s) {
	var i;
    for ( i = 0; i < s.length; i++ )
    {   
        var c = s.charAt(i);
        if ( ! isDigit(c) ) return false;
    }
    return true;
}

function isIntegerInRange(s, a, b) {
    if ( ! isInteger(s) ) return false;
    var num = parseInt (s);
    return ( ( num >= a ) && ( num <= b ) );
}

function isMonth(s) {
    return isIntegerInRange (s, 1, 12);
}

function isNonnegativeInteger(s) {
    return ( isSignedInteger(s) && ( parseInt(s) >= 0 ) );
}

function isSignedInteger(s) {
    var startPos = 0;
    if ( ( s.charAt(0) == "-" ) || ( s.charAt(0) == "+" ) )
       startPos = 1;    
    return ( isInteger(s.substring(startPos, s.length)) )
}

function isYear(s) {
	if ( ! isNonnegativeInteger(s) ) return false;
    return ( (s.length == 2) || (s.length == 4) );
}


function makeArray(n) {
   for ( var i = 1; i <= n; i++ ) {
      this[i] = 0
   } 
   return this
}

function lTrim(s) {
	var i = 0;
    while ( (i < s.length) && charInString(s.charAt(i), whitespace) )
       i++;
    return s.substring(i, s.length);
}
function rTrim(s) {
	var i = 0;
    while ( (i < s.length) && charInString(s.charAt(i), whitespace) )
       i++;
    return s.substring(i, s.length);
}
function trim(s) {
	s.value = lTrim(rTrim(s.value));
}

function isWhitespace(expS) {
	var allWhitespace = true;
    if ( isWhitespace.arguments[0] != null ) {
		if (typeof expS != "string") expS = expS.toString();
		if (expS.length != 0) {
			var i = 0;
			var whitespace = " \t\n\r";
	    	for (i=0; i<expS.length; i++) {
		        if (whitespace.indexOf( expS.charAt(i) ) == -1) {
					allWhitespace = false;
					break;
				}
		    }
		}
	}
    return allWhitespace;
}

function ForceUppercase(fieldObj) {
	fieldObj.value = fieldObj.value.toUpperCase();
}

function ForceLowercase(fieldObj) {
	fieldObj.value = fieldObj.value.toLowerCase();
}

function FirsttoUpperCase(stringValue) {
	var theString = new String(stringValue);
    var pattern = /(\w)(\w*)/; // a letter, and then one, none or more letters 

    var a = stringValue.value.split(/\s+/g); // split the sentence into an array of words

    for (i = 0 ; i < a.length ; i ++ ) {
        var parts = a[i].match(pattern); // just a temp variable to store the fragments in.

        var firstLetter = parts[1].toUpperCase();
        var restOfWord = parts[2].toLowerCase();

        a[i] = firstLetter + restOfWord; // re-assign it back to the array and move on
    }
    
    stringValue.value = a.join(' '); // join it back together
}

function checkInteger(checkString){
    newString = "";    
    count = 0;         
    for (i = 0; i < checkString.value.length; i++) {
        ch = checkString.value.substring(i, i+1);
        if (ch >= "0" && ch <= "9") {
            newString += ch;
        }
    } 	
    if (checkString.value != newString) {
      	alert("The value you have entered contains invalid characters. \nPlease remove them! \nCorrect Example: 12");
		checkString.focus();
        return newString;
    }
    return checkString;
}
function checkFloat(checkString){
    newString = "";    
    count = 0;      
    for (i = 0; i < checkString.value.length; i++) {
        ch = checkString.value.substring(i, i+1);
        if ((ch >= "0" && ch <= "9") || (ch == ".")) {
            newString += ch;
        }
    }
    if (checkString.value != newString) {
	    alert("The value you have entered contains invalid characters.\nPlease remove them!\nCorrect Example: 12.00 or 12");
		checkString.focus();
        return newString;
      } 
}

function checkEmail(checkString){
	if (!isWhitespace(checkString.value)) {
	    var newstr = "";
	    var at = false;
	    var dot = false;

	    if (checkString.value.indexOf("@") != -1) {
	      at = true;
	    } 
		else if (checkString.value.indexOf(".") != -1) {
	      dot = true;
	    }
	
	    for (var i = 0; i < checkString.value.length; i++) {
	        ch = checkString.value.substring(i, i + 1)
	        if ((ch >= "A" && ch <= "Z") || (ch >= "a" && ch <= "z")
	                || (ch == "@") || (ch == ".") || (ch == "_")
	                || (ch == "-") || (ch >= "0" && ch <= "9")) {
	                newstr += ch;
	                if (ch == "@") {
	                    at=true;
	                }
	                if (ch == ".") {
	                    dot=true;
	                }
	        }
	    }
	    if ((at == true) && (dot == true)) {
	        return newstr;
	    }
	    else {
	      alert ("Sorry, the email address you\nentered is not in the correct format.");
		  checkString.focus();
	      return checkString;
	    }
	}
}
function validateDate(checkString) {
	if (!isWhitespace(checkString.value)) {
		var stringValue = checkString.value;
		if (!isDateString(stringValue)){
		alert("The Date is not in the correct!\nDate must be entered in a date MM/DD/YYYY format.");
		checkString.focus();
		} 
	}
}

// Validator Object
var valid = new Object();

// REGEX Elements

// matches zip codes
valid.zipCode = /\d{5}(-\d{4})?/;

// matches $17.23 or $14,281,545.45 or ...
valid.Currency = /\$\d{1,3}(,\d{3})*\.\d{2}/;

// matches 5:04 or 12:34 but not 75:83
valid.Time = /^([1-9]|1[0-2]):[0-5]\d$/;

//matches email
valid.emailAddress = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/;

// matches phone ###-###-####
valid.phoneNumber = /^\(?\d{3}\)?\s|-\d{3}-\d{4}$/;

// International Phone Number
valid.phoneNumberInternational = /^\d(\d|-){7,20}/;

// IP Address
valid.ipAddress = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;

// Date xx/xx/xxxx
valid.Date = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;

// State Abbreviation
valid.State = /^(AK|AL|AR|AZ|CA|CO|CT|DC|DE|FL|GA|HI|IA|ID|IL|IN|KS|KY|LA|MA|MD|ME|MI|MN|MO|MS|MT|NB|NC|ND|NH|NJ|NM|NV|NY|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VA|VT|WA|WI|WV|WY)$/i;

// Social Security Number
valid.SSN = /^\d{3}\-\d{2}\-\d{4}$/;

function validateForm(theForm) {

    var elArr = theForm.elements; 

    for(var i = 0; i < elArr.length; i++) {

       with(elArr[i]) { 

          var v = elArr[i].validator; 

          if(!v) continue; 

          var thePat = valid[v]; 

          var gotIt = thePat.exec(value); 

          if(! gotIt){
             alert(name + ": failure to match " + v + " to " + value);                  
             elArr[i].select();
             elArr[i].focus(); 
             return false;
          }
       }
    }
    return true;
}

	
