function ValidationField( fieldName, validationExpression, minAllowed, maxAllowed, errorMessage, tabName )
{
  this.fieldName = fieldName;
  this.validationExpression = validationExpression ? validationExpression : '';
  this.minAllowed = minAllowed ? minAllowed : 0;
  this.maxAllowed = maxAllowed ? maxAllowed : 0;
  this.errorMessage = errorMessage ? errorMessage : '';
  this.tabName = tabName ? tabName : '';
}

function Validation( formName )
{
  this.formName = formName;
  this.tabName = '';
  this.validationFieldCount = 0;
  this.validationFields = new Array();
}

Validation.prototype.addValidationField = function( validationField )
{
  this.validationFields[this.validationFieldCount] = validationField;
  this.validationFieldCount += 1;
}

Validation.prototype.checkValidation = function()
{
  var errors = "";
  this.tabName = '';

  for ( var i = 0; i < this.validationFields.length; i++ )
  {
    errorString = "";
    validationField = this.validationFields[i];
    element = document.forms[this.formName].elements[validationField.fieldName];
		regexp = undefined;

	  if ( validationField.validationExpression.length > 0 )
	    regexp = new RegExp( validationField.validationExpression );

    if ( element == "[object NodeList]" )
    {
      var name = "";
      
    	if ( regexp )
    	{
        for ( var j = 0; j < element.length; j++ )
        {
	    		if ( element.item( j ).checked )
	    		{
	    			if ( !element.item( j ).value.match( regexp ) )
	    			{
		          if ( validationField.errorMessage.length > 0 )
		            errorString = validationField.errorMessage + "\n";
		          else
		            errorString = "Invalid Input for " + element.name + "\n";
	    			}
    			}
	    	}
    	}
      
      if ( validationField.minAllowed > 0 || validationField.maxAllowed > 0 )
      {
        count = 0;
        for ( var j = 0; j < element.length; j++ )
        {
          if ( j == 0 )
            name = element.item( j ).name;

          if ( element.item( j ).checked )
            count += 1;
        }

        if ( validationField.minAllowed > 0 && count < validationField.minAllowed )
          errorString += "You must select at least " + validationField.minAllowed + " item(s) for " + name + ".\n";
        else if ( validationField.maxAllowed > 0 && count > validationField.maxAllowed )
          errorString += "You may not select more than " + validationField.maxAllowed + " item(s) for " + name + ".\n";

        if ( errorString.length > 0 && this.tabName == '' )
          this.tabName = validationField.tabName;
      }
    }
    else if ( element.nodeName == "SELECT" )
    {
    	if ( regexp )
    	{
	    	for ( var j = 0; j < element.options.length; j++ )
	    	{
	    		if ( element.options[j].selected )
	    		{
	    			if ( !element.options[j].value.match( regexp ) )
	    			{
		          if ( validationField.errorMessage.length > 0 )
		            errorString = validationField.errorMessage + "\n";
		          else
		            errorString = "Invalid Input for " + element.name + "\n";
	    			}
    			}
	    	}
    	}
    	
      if ( validationField.minAllowed > 0 || validationField.maxAllowed > 0 )
      {
        count = 0;
        for ( var j = 0; j < element.options.length; j++ )
        {
          if ( element.options[j].selected )
            count += 1;
        }

        if ( validationField.minAllowed > 0 && count < validationField.minAllowed )
          errorString += "You must select at least " + validationField.minAllowed + " item(s) for " + element.name + ".\n";
        if ( validationField.maxAllowed > 0 && count > validationField.maxAllowed )
          errorString += "You may not select more than " + validationField.maxAllowed + " item(s) for " + element.name + ".\n";

        if ( errorString.length > 0 && this.tabName == '' )
          this.tabName = validationField.tabName;
      }
    }
    else if ( element.nodeName == "INPUT" )
    {
      if ( regexp )
      {
        if ( !element.value.match( regexp ) )
        {
          if ( validationField.errorMessage.length > 0 )
            errorString = validationField.errorMessage + "\n";
          else
            errorString = "Invalid Input for " + validationField.fieldName + "\n";

          if ( errorString.length > 0 && this.tabName == '' )
            this.tabName = validationField.tabName;
        }
      }
      else if ( validationField.minAllowed > 0 )
      {
      	if ( ( element.type == "radio" || element.type == "RADIO" ) && !element.checked )
      	  errorString += "You must select at least " + validationField.minAllowed + " item(s) for " + element.name + ".\n";
      }
    }

    if ( errorString.length > 0 )
      errors = errors + errorString;
  }

  if ( errors.length > 0 )
  {
    alert( "There were some errors with your submission:\n\n" + errors );
    return false;
  }
  else
    return true;
}

