// FormChek.js

// VARIABLE DECLARATIONS

var digitsInZIPCode1 = 5
var digitsInZIPCode2 = 9

var whitespace = " \t\n\r";

var mPrefix = "Enter a value into the ";
var mSuffix = " field.";
var sEmail = "Email";

var iEmail = "Enter a valid email address.";

var pEntryPrompt = "Please enter a ";
var pEmail = "valid email address (like foo@bar.com).";

var defaultEmptyOK = false

// FUNCTIONS

function isEmpty(s)
{   
    return ((s == null) || (s.length == 0))
}

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;
}

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;
}

function isDigit (c)
{  
    return ((c >= "0") && (c <= "9"))
}

function isInteger (s)
{   
    var i;

    if (isEmpty(s)) 
       if (isInteger.arguments.length == 1) return defaultEmptyOK;
       else return (isInteger.arguments[1] == true);

    for (i = 0; i < s.length; i++)
    {   
        var c = s.charAt(i);

        if (!isDigit(c)) return false;
    }

    return true;
}

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 warnEmpty (errorMsg, theField, s)
{
    changeObjectVisibility(errorMsg, "visible", "static");
    document.getElementById(errorMsg).innerHTML += mPrefix + s + mSuffix+"<br>";
    return false
}

function warnInvalid (errorMsg, theField, s)
{
    changeObjectVisibility(errorMsg, "visible", "static");
    document.getElementById(errorMsg).innerHTML += s+"<br>";
    return false
}

function checkString (errorMsg, 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 (errorMsg, theField, s);
    else return true;
}

function checkEmail (errorMsg, theField, emptyOK)
{   if (checkEmail.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else if (!isEmail(theField.value, false)) 
       return warnInvalid (errorMsg, theField, iEmail);
    else return true;
}

var ZIPCodeDelimiters = "-";
var iZIPCode = "Enter a 5 digit U.S. ZIP Code."

function stripCharsInBag (s, bag)
{   
    var i;
    var returnString = "";

    for (i = 0; i < s.length; i++)
    {   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }

    return returnString;
}

function checkZIPCode (errorMsg, 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 warnInvalid (errorMsg, theField, iZIPCode);
      else 
      {  // if you don't want to insert a hyphen, comment next line out
         // theField.value = reformatZIPCode(normalizedZIP)
         return true;
      }
    }
}

// FORM ERROR

function setupFormErrorMsg(obj, msg){
    changeObjectVisibility(obj, "hidden", "absolute");
    document.getElementById(obj).innerHTML = "<b><span style=\"background-color: #FFFFFF; color: red; padding: 2px;\"> "+msg+" </span></b><br><br><b><u>Resolve the following then re-submit</u></b><br>";
}

function getObject (objectId)
{
  // cross-browser function to get an object reference
  if(document.getElementById && document.getElementById(objectId)) {
    // W3C DOM
    return document.getElementById(objectId);
  }
  else if (document.all && document.all(objectId)) {
    // MSIE 4 DOM
    return document.all(objectId);
  }
  else if (document.layers && document.layers[objectId]) {
    // NN 4 DOM.. note: this won't find nested layers
    return document.layers[objectId];
  }
  else {
    return false;
  }
}

function getStyleObject(objectId)
{
  // cross-browser function to get an object's style object given its id
  if(document.getElementById && document.getElementById(objectId)) {
    // W3C DOM
    return document.getElementById(objectId).style;
  }
  else if (document.all && document.all(objectId)) {
    // MSIE 4 DOM
    return document.all(objectId).style;
  }
  else if (document.layers && document.layers[objectId]) {
    // NN 4 DOM.. note: this won't find nested layers
    return document.layers[objectId];
  }
  else {
    return false;
  }
} // getStyleObject

function changeObjectVisibility(objectId, newVisibility, position)
{
  // get a reference to the cross-browser style object and make sure the object exists
  var styleObject = getStyleObject(objectId);
  if(styleObject) {
    styleObject.visibility = newVisibility;
    if (arguments.length > 2)
      styleObject.position = position

    return true;
  }
  else {
    // we couldn't find the object, so we can't change its visibility
    return false;
  }
} // changeObjectVisibility
