
/*
 * Javascript form validator
 * Logic to process form specification array.
 * Ray Taylor
 */

// Should work with:
//   IE 6+, Fire Fox 1.5+, Safari 2.0+, Netscape 8+

/*
 * Field array structure:
 * FieldArray[n] = (ID, Name, Required, Format, MinLength, MaxLength ErrorMessage)
 *      HTML ID of element,
 *      User-friendly name of input, 
 *      required (true or false), 
 *      regular expression to check format, one of:
 *        Any -- allows anything; used for required fields of no specific format
 *        Alpha -- allows only letters and spaces
 *        AlphaNumeric -- allows letters, digits, and underscores, but no spaces
 *        Numeric -- allows digits only
 *        RealNumeric -- allows digits and one decimal
 *        Email -- e-mail address
 *        URL -- allows anything, but not ://, so no http://, https://, or ftp:// prefix.
 *      minimum length, 
 *      maximum length,
 *      error message for invalid format);
 */
var FieldArray = new Array(); // define this in separate fields.js file

/* Regular expressions for format matching */
// var URL = /^[A-Za-z0-9\-]+\.([A-Za-z0-9\-]+\.)*[A-Za-z0-9]{2,3}$/;
 var URL = /:\/\//;
// var Email = /^\w+@[A-Za-z0-9-]+?\.[A-Za-z0-9]{2,3}$/;
 var Email = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[(2([0-4]\d|5[0-5])|[01]?\d{1,2})(\.(2([0-4]\d|5[0-5])|[01]?\d{1,2})){3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
 var Alpha = /^[A-Za-z\s]+$/;
 var Numeric = /^\d+$/;
 var RealNumeric = /^\d*\.?\d+$/;
 var AlphaNumeric = /^\w+$/;
 var Any = /.+/;


function trim(value) {
  /* Thanks to:http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256C0C0062AC78 */
   var temp = value;
   var obj = /^(\s*)([\W\w]*)(\b\s*$)/;
   if (obj.test(temp)) { temp = temp.replace(obj, '$2'); }
   var obj = /  /g;
   while (temp.match(obj)) { temp = temp.replace(obj, " "); }
   return temp;
}


function match_re( Field, Value, Negate ) {
  /* Allow for negative matches (eg 'match anything not containing /http:\/\//). */
  if( Negate )
    return( Value.match( Field[FORMAT] ) == null );
  return( Value.match( Field[FORMAT] ) != null );
}

/* called once for each field */
function validate_field( c ) {
  var Field = FieldArray[c];
  var Element = document.getElementById( FieldArray[c][ID] );
  var Value = trim( Element.value );
  var Negate = Field[FORMAT] == URL;

  if( Value.length > Field[MAXLENGTH] ) {
    errormsg += "Field " + Field[NAME] + " has a maximum length of " + Field[MAXLENGTH] + " characters.\n";
    return false;
  }

  if ( Field[REQUIRED] ) {
    if ( Value.length >= Field[MINLENGTH] ) {
      if( match_re( Field, Value, Negate ) ) {
        return true;
      } else {
        errormsg += Field[ERRORMESSAGE] + '\n';
      }
    } else {
      if( Field[MINLENGTH] < 2 ) {
        errormsg += Field[NAME] + " is a required field.\n";
      } else {
        errormsg += "Field " + Field[NAME] + " has a minimum length of " + Field[MINLENGTH] + " characters.\n";
      }
    }
    return false;
  } else if( Value.length ) {
    if( match_re( Field, Value, Negate ) ) {
      return true;
    } else {
      errormsg += Field[ERRORMESSAGE] + '\n';
    }
  }
  return true;
}


var errormsg = "";
function validate_form() {
  // used to validate entire form when clicking 'Submit'
  errormsg = "";
  for( c = 0; c < FieldArray.length; c++ )
    validate_field( c );
  errormsg = trim( errormsg );
  if ( !errormsg.length )
    return true;
  alert( errormsg );
  return false;
}



