// FormChek.js
//


// VARIABLE DECLARATIONS

var digits = "0123456789";

var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz"

var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

// whitespace characters
var whitespace = " \t\n\r";

// CONSTANT STRING DECLARATIONS
// (grouped for ease of translation and localization)

// m is an abbreviation for "missing"

var mPrefix = "You did not enter '"
var mSuffix = "'. This is required. Please enter it now."
var ePrefix = "Since you have selected to send this pedigree to your friends, we need a valid email address in '"
var eSuffix = "'. Our check is indicating that the email address is incorrect. Please reenter it."
var e2Prefix = "We need a valid email address in '"
var e2Suffix = "'. Our check is indicating that the email address is incorrect. Please reenter it."

// s is an abbreviation for "string"

var sEmail = "Your e-mail address"
var sVerEmail = "Your e-mail address again for verification"
var sName = "Your name"
var sAnimalName = "Animal's Name"
var sAnimalType = "Animal Type"
var sFrEmail1 = "Friend's Email Address (Email 1)"
var sFrEmail2 = "Friend's Email Address (Email 2)"
var sFrEmail3 = "Friend's Email Address (Email 3)"
var sFrEmail4 = "Friend's Email Address (Email 4)"

// i is an abbreviation for "invalid"

var iEmail = "We require a valid email address. Please reenter it now."


// p is an abbreviation for "prompt"

var pEntryPrompt = "Please enter a "
var pEmail = "valid email address (like foo@bar.com)."

var defaultEmptyOK = false




// Check whether string s is empty.

function isEmpty(s)
{   return ((s == null) || (s.length == 0))
}


// Returns true if string s is empty or
// whitespace characters only.

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;
}



// 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;
}



// 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;
}



// Removes all whitespace characters from s.
// Global variable whitespace (see above)
// defines which characters are considered whitespace.

function stripWhitespace (s)

{   return stripCharsInBag (s, whitespace)
}




// Returns true if character c is an English letter
// (A .. Z, a..z).
//
// NOTE: Need i18n version to support European characters.
// This could be tricky due to different character
// sets and orderings for various languages and platforms.

function isLetter (c)
{   return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) )
}



// Returns true if character c is a digit
// (0 .. 9).

function isDigit (c)
{   return ((c >= "0") && (c <= "9"))
}



// Returns true if character c is a letter or digit.

function isLetterOrDigit (c)
{   return (isLetter(c) || isDigit(c))
}



// isEmail (STRING s [, BOOLEAN emptyOK])
//
// Email address must be of form a@b.c -- in other words:
// * there must be at least one character before the @
// * there must be at least one character before and after the .
// * the characters @ and . are both required
//
// For explanation of optional argument emptyOK,
// see comments of function isInteger.

function isEmail (s)
{   if (isEmpty(s))
       if (isEmail.arguments.length == 1) return defaultEmptyOK;
       else return (isEmail.arguments[1] == true);

    // is s whitespace?
    if (isWhitespace(s)) return false;

    // 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;
}





/* FUNCTIONS TO NOTIFY USER OF INPUT REQUIREMENTS OR MISTAKES. */


// Display prompt string s in status bar.

function prompt (s)
{   window.status = s
}



// Display data entry prompt string s in status bar.

function promptEntry (s)
{   window.status = pEntryPrompt + s
}




// Notify user that required field theField is empty.
// String s describes expected contents of theField.value.
// Put focus in theField and return false.

function warnEmpty (theField, s)
{   theField.focus()
    alert(mPrefix + s + mSuffix)
    return false
}



// Notify user that contents of field theField are invalid.
// String s describes expected contents of theField.value.
// Put select theField, pu focus in it, and return false.

function warnInvalid (theField, s)
{   theField.focus()
    theField.select()
    alert(ePrefix + s + eSuffix)
    return false
}

// Notify user that contents of field theField are invalid.
// String s describes expected contents of theField.value.
// Put select theField, pu focus in it, and return false.

function warnInvalid2 (theField, s)
{   theField.focus()
    theField.select()
    alert(e2Prefix + s + e2Suffix)
    return false
}


// Get checked value from radio button.

function getRadioButtonValue (radio)
{   for (var i = 0; i < radio.length; i++)
    {   if (radio[i].checked) { break }
    }
    return radio[i].value
}



/* FUNCTIONS TO INTERACTIVELY CHECK VARIOUS FIELDS. */

// checkString (TEXTFIELD theField, STRING s, [, BOOLEAN emptyOK==false])
//
// Check that string theField.value is not all whitespace.
//
// For explanation of optional argument emptyOK,
// see comments of function isInteger.

function checkString (theField, s, emptyOK)
{   // Next line is needed on NN3 to avoid "undefined is not a number" error
    // in equality comparison below.
    if (checkString.arguments.length == 2) emptyOK = defaultEmptyOK;
		if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (isWhitespace(theField.value))
       return warnEmpty (theField, s);
    else return true;
}


// checkEmail (TEXTFIELD theField [, BOOLEAN emptyOK==false])
//
// Check that string theField.value is a valid Email.
//
// For explanation of optional argument emptyOK,
// see comments of function isInteger.

function checkEmail (theField, s, emptyOK)
{   theField.value = stripWhitespace(theField.value)
	  if (checkEmail.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else if (!isEmail(theField.value, false))
       return warnInvalid (theField, s);
    else return true;
}

function checkEmail2 (theField, s, emptyOK)
{   theField.value = stripWhitespace(theField.value)
	  if (checkEmail2.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else if (!isEmail(theField.value, false))
       return warnInvalid2 (theField, s);
    else return true;
}


// end of form validate


function MM_openBrWindow(theURL,winName,features) { //v2.0
  window.open(theURL,winName,features);
}
 
function validateInfo(form)
{

	if (form.elements["Your_Email"].value != form.elements["2nd_Email"].value ) {
	  var err_val = "We had you enter your email address twice so we could compare them to make sure they were entered correctly. Well guess what? Your two don't match! You'll need to correct this before you can continue."
			form.elements["Your_Email"].focus();
			alert (err_val);
			return false;
			}
			
 var radio_value = getRadioButtonValue(form.elements["dothis"]);
		if ( radio_value == 'email_friends' )
		valFR = false;
	else valFR = true;
 
	return (
	  checkString(form.elements["Your_Name"],sName) &&
			checkEmail2(form.elements["Your_Email"],sEmail) &&
			checkEmail2(form.elements["2nd_Email"],sVerEmail) &&
	  checkString(form.elements["Animal_Name"],sAnimalName) &&
	  checkString(form.elements["Animal_type"],sAnimalType) &&
	  checkEmail(form.elements["femail1"],sFrEmail1, valFR) &&
	  checkEmail(form.elements["femail2"],sFrEmail2, true) &&
	  checkEmail(form.elements["femail3"],sFrEmail3, true) &&
	  checkEmail(form.elements["femail4"],sFrEmail4, true)
   )
}

