function Validator(){
	this.isError = false;
	this.fields = new Array();
}

Validator.prototype.populateErrorMessage = function()
{
	var s = "Error(s): <br/>";
	for(var i = 0; i < this.fields.length; i++)
	{	
		var f = this.fields[i];
		if(f.isError){
			s+= "<b>" + f.title + "</b> - " + f.errorMessages.toString() + ",&nbsp;";
		}
	}
	s = s.replace(/,&nbsp;$/,""); // Get rid of last ', ' at the end of the error message.
	document.getElementById("errorMessage").innerHTML = s;
	this.getFirstErrorField().field.focus();
}

Validator.prototype.clearErrorMessage = function()
{
	document.getElementById("errorMessage").innerHTML = "";

}

Validator.prototype.validate = function()
{
	for(var i = 0; i < this.fields.length; i++)
	{
		var fObj = this.fields[i];
		if(!fObj.validate())
		{
			this.isError = true;
		}
	}
	if(this.isError)
	{
		this.populateErrorMessage();
	}
	else
	{
		this.clearErrorMessage();
	}
	return(!this.isError);
}

Validator.prototype.getFirstErrorField = function()
{
	for(var i = 0; i < this.fields.length; i++){
		var f = this.fields[i];
		if(f.isError){
			return(f);
		}
	}
	return(null);

}

function FieldValObj(id, title, validationArray)
{
	this.id = id;
	this.title = title;
	this.validationArray = validationArray;
	this.isError = false;
	this.errorMessages = new Array();
	this.field = document.getElementById(this.id);
	this.titleElm = document.getElementById(this.id + "_title");
}

FieldValObj.prototype.validate = function()
{
	//this.field.value = trim(this.field.value);
	if(this.field == null){alert("id = " + this.id);}
	for(var i = 0; i < this.validationArray.length; i++)
	{
		var valType = this.validationArray[i];
		var param;
		var params = valType.split(":");
		if(params.length > 1)
		{
			valType = params[0];
			param = params[1];
		}
		this[valType](param);
	}
	this.updateFieldUI();
	return(!this.isError);
}

FieldValObj.prototype.updateFieldUI = function()
{
	if(this.titleElm){
		this.titleElm.style.color = (this.isError)?"red":"#666";
	}
}

FieldValObj.prototype.required = function(){
	var result = (this.field.value.length > 0);
	if(!result)
	{
		this.isError = true;
		this.errorMessages.push(" Required Field");
	}
	return(result);
}

FieldValObj.prototype.checked = function(){
	var result = (this.field.checked);
	if(!result)
	{
		this.isError = true;
		this.errorMessages.push(" Required to be checked.");
	}
	return(result);
}



FieldValObj.prototype.numberWithDashes = function(){
	var val = this.field.value;
	var valParts = val.split("-");
	val = valParts.join("");
	val = Number(val);
	var result = !/\D/.test(val);
	if(!result)
	{
		this.isError = true;
		this.errorMessages.push(" Is not numeric");
	}
	return(result);
}

FieldValObj.prototype.number = function(){
	var val = this.field.value;
	var result = !/\D/.test(val);
	if(!result)
	{
		this.isError = true;
		this.errorMessages.push(" Is not numeric");
	}
	return(result);
}

FieldValObj.prototype.email = function(){
	var val = this.field.value;
	val = trim(val);
	
	var result = (val.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1);
	if(!result)
	{
		this.isError = true;
		this.errorMessages.push(" Not Valid Email");
	}
	return(result);
}

FieldValObj.prototype.min = function(minLength)
{
	var val = this.field.value;
	var result = (val.length >= minLength);
	if(!result)
	{
		this.isError = true;
		this.errorMessages.push(" Must have a minimum of " + minLength + " characters.");
	}
	return(result);	
}

FieldValObj.prototype.max = function(maxLength)
{
	var val = this.field.value;
	var result = (val.length <= maxLength);
	if(!result)
	{
		this.isError = true;
		this.errorMessages.push(" Must have a maximum of " + maxLength + " characters.");
	}
	return(result);	
}


FieldValObj.prototype.cc = function()
{
  var s = this.field.value;	
  var i, n, c, r, t;
  var result;

  // First, reverse the string and remove any non-numeric characters.

  r = "";
  for (i = 0; i < s.length; i++) {
    c = parseInt(s.charAt(i), 10);
    if (c >= 0 && c <= 9)
      r = c + r;
  }

  // Check for a bad string.

  if (r.length <= 1)
  {
    result=false;
  
  }
  else
  {
  // Now run through each single digit to create a new string. Even digits
  // are multiplied by two, odd digits are left alone.

  t = "";
  for (i = 0; i < r.length; i++) {
    c = parseInt(r.charAt(i), 10);
    if (i % 2 != 0)
      c *= 2;
    t = t + c;
  }

  // Finally, add up all the single digits in this string.

  n = 0;
  for (i = 0; i < t.length; i++) {
    c = parseInt(t.charAt(i), 10);
    n = n + c;
  }

  // If the resulting sum is an even multiple of ten (but not zero), the
  // card number is good.

  if (n != 0 && n % 10 == 0)
  {
    result = true;
    }
  else
  {
    result = false;
   }
   }
   
if(!result)
	{
		this.isError = true;
		this.errorMessages.push(" Not a Valid Credit Card Number");
	}
	return(result);
}
















