/*  Validator Form Validation version 0.5
 *  (c) 2007 Billy Fowks <fowkswe@gmail.com>
 *
 *  Validator is freely distributable under the terms of an MIT-style license.
 *
/*--------------------------------------------------------------------------*/

function Validator(form, errorMsg, inline)
  {
  this.validation = new Array();
  this.errors = new Array();
  this.form = document.forms[form];
  this.errorMsg = errorMsg;
  
  // property to act as a flag that indicates whether or not to skip password validation
  // in case user enters an email address as their membername
  this.skipPass = false;

  // default to true if no parameter is passed in
  this.inline = (typeof inline == "undefined") ? true : inline;

  this.validation = eval(form);

  }

Validator.prototype.validate = function()
  {
  this.resetErrors();

  for (var i=0; i<this.validation.length; i++)
    {
    if(this.skipPass && this.form[this.validation[i].field].type=="password")
      continue;
    else
      this.skipPass = false;


    if (this.validation[i].method)
      {
      var argumentList = new Array();

      // store this off so we dont have to do the array loop anymore
      this.validationObject = this.validation[i];

      if (this.validationObject.params != undefined)
        for (var j=0; j< this.validationObject.params.length; j++)
          argumentList.push(this.validationObject.params[j]);

      // call the validation function
      error = eval("this."+this.validationObject.method).apply(this, argumentList);

      if (error)
        {
        this.errors.push({"error" : error, "field" : this.validationObject.field});
        if (!this.inline)
          return this.errors;
        }
      }
    }
  if (this.errors.length == 0)
    return true;
  else
    return this.errors;
  }

Validator.prototype.displayError = function ()
  {
  var parent = this.form[this.validationObject.field].parentNode;
  var errorMsg = new Array();

  // looks 5 levels up for the errorMsg
  for (var i=0; i<5; i++)
    {
    errorMsg = document.getElementsByClassName(this.errorMsg, parent);
    if (errorMsg.length > 0)
      break;
    parent = parent.parentNode;
    }

  if (errorMsg.length > 0)
    {
    if (this.inline)
      {
      // prototype show() doesnt work...
      errorMsg[0].style.display = "block";
      }
    else
      {
      alert(errorMsg[0].innerHTML);
      }
    if (this.form[this.validationObject.field].type != "hidden")
      this.form[this.validationObject.field].focus();

    return errorMsg[0].innerHTML;
    }
  else
    return "There was a validation error on '" + this.validationObject.field + "' but no message was defined";
  }

Validator.prototype.resetErrors = function ()
  {
  this.errors = new Array();

  if (this.inline)
    {
    var errorMsg = document.getElementsByClassName(this.errorMsg, this.form);

    for(var i=0; i<errorMsg.length; i++) 
      Element.hide(errorMsg[i]);
    }
  }


Validator.prototype.isDigit = function (c)
 {
 return ((c >= "0") && (c <= "9"))
 }

Validator.prototype.isANumber = function (s)
 {
 for (var i=0; i<s.length; i++)
   {
   // Check that current character is number.
   var c = s.charAt(i);

   if (!this.isDigit(c))
     return false;
   }

 // All characters are numbers.
 return true;
 }

Validator.prototype.isEmail = function (s)
 {
 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;
 }

/*
* BEGIN CUSTOMIZED VALIDATION FUNCTIONS
*/


Validator.prototype.validateTextField = function (maxCount)
  {
  if (this.form[this.validationObject.field].value == "")
    return this.displayError();

  if (maxCount != undefined)
    if (this.form[this.validationObject.field].value.length > maxCount)
      return this.displayError();
  }


Validator.prototype.validateOptionalField = function (type)
	{
	if(this.form[this.validationObject.field].value == "")
		return null
	else
		if(type == "number")
			return this.validateNumber();
    // TODO add more types
	}

Validator.prototype.validateNumber = function ()
  {
  var fieldValue = this.form[this.validationObject.field].value;

  if (fieldValue == "" || !this.isANumber(fieldValue))
    return this.displayError();

  return null;
  }

Validator.prototype.validateMaxNumber = function (max)
  {
  var fieldValue = this.form[this.validationObject.field].value;

  var results = this.validateNumber();
  if (results)
    return results;

  if (fieldValue.length > max)
    return this.displayError();

  return null;
  }

Validator.prototype.validateMinNumber = function (min)
  {
  var fieldValue = this.form[this.validationObject.field].value;

  var results = this.validateNumber();
  if (results)
    return results;

  if (fieldValue.length < min)
    return this.displayError();

  return null;
  }

Validator.prototype.validateMaxValue = function (max)
  {
  var fieldValue = this.form[this.validationObject.field].value;

  var results = this.validateNumber();
  if (results)
    return results;

  if (fieldValue > max)
    return this.displayError();

  return null;
  }

Validator.prototype.validateMinValue = function (min)
  {
  var fieldValue = this.form[this.validationObject.field].value;

  var results = this.validateNumber();
  if (results)
    return results;

  if (fieldValue < min)
    return this.displayError();

  return null;
  }


Validator.prototype.validateZip = function ()
  {
  var fieldValue = this.form[this.validationObject.field].value;

  var results = this.validateNumber();
  if (results)
    return results;

  if (fieldValue.length <= 5)
    return this.displayError();

  return null;
  }

Validator.prototype.validateEmail = function ()
  {
  var fieldValue = this.form[this.validationObject.field].value;

	if (fieldValue=="")
		return this.displayError();

  if (!this.isEmail(fieldValue))
    return this.displayError();

  return null;
  }

Validator.prototype.duplicateTextField = function (fieldToValidateAgainst, email)
  {
  var otherFieldValue = this.form[fieldToValidateAgainst].value;
  var thisFieldValue = this.form[this.validationObject.field].value;

  if (otherFieldValue != thisFieldValue)
    return this.displayError();

  return null;
  }


Validator.prototype.duplicateEmail = function (fieldToValidateAgainst)
  {
  var error = this.duplicateTextField(fieldToValidateAgainst);
  var value = this.form[this.validationObject.field].value;

  if (error)
    return error;
  else
    if (!this.isEmail(value))
      return this.displayError();

  return null;
  }


Validator.prototype.validateCheckbox = function ()
  {
  if (!this.form[this.validationObject.field].checked)
    return this.displayError();

  return null;
  }

Validator.prototype.validateTextFieldThenEmail = function() {
  var value = this.form[this.validationObject.field].value;

  if (value == "")
    return this.displayError();
  
  else if (this.isEmail(value))
    return this.displayErrorAlternate();

  return null;
  }

Validator.prototype.validateMemberName = function() {
  var error = this.validateTextField();
  
  if (error)
    return error;
  else
    {
    var value = this.form[this.validationObject.field].value;
    var valid="123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_";
    for (var i=0; i<value.length; i++)
      if (valid.indexOf(value.charAt(i)) < 0) 
        return this.displayError();
    }

  return null;
  }


Validator.prototype.validatePassword = function() {
  var error = this.validateMemberName();
  
  if (error)
    return error;
  else
    {
    var value = this.form[this.validationObject.field].value;
    if (value.length < 4 || value.length>20)
      return this.displayError();
    }

  return null;
  }


Validator.prototype.validateDropDown = function() {
  var field = this.form[this.validationObject.field];

  if (field.selectedIndex == 0)
    return this.displayError();

  return null;
  }

Validator.prototype.validateYear = function() {
  var error = this.validateNumber();
  if (error)
    return error;
  else
    {	
    var value = this.form[this.validationObject.field].value;
    if (value.length != 4 )
      return this.displayError();
    }
  return null;
  }
  	
/* validate child ages */


Validator.prototype.validateChildAge = function (min)
  {
 	var childNum = this.form.dynamic_children.value; // verify that have children selected
    var fieldValue = this.form[this.validationObject.field].value;
	var fieldNum = this.validationObject.field.charAt(this.validationObject.field.length-1);;
			if(childNum > 0) {
				if (childNum >= fieldNum) {
					 var results = this.validateNumber();
  						 if (results){
				    		return results;
						 }	
						  if (fieldValue < min) {
						  	return this.displayError();
						  }	
					  return null;
				}
	
			}

 }
  
/* validate child ages */
