var elements = new Array();
var errorChecks = new Array();

function errorCheck( name, description, methodCall, showFields )
{
  this.name = name;
  this.description = description;
  this.methodCall = methodCall;
  this.showFields = (typeof(showFields)!="undefined") ? showFields : true;
}

function element( name, description, mandatory, type )
{
  this.name = name;
  this.description = description;
  this.mandatory = mandatory;
  this.type = type;
}


function addValidate( name, description, mandatory, type )
{
  elements[elements.length] = new element( name, description, mandatory, type );
}

function addErrorCheck( name, description, methodCall, showFields )
{
  errorChecks[name] = new errorCheck( name, description, methodCall, showFields );
}

function validate( f )
{
  var hasErrors = false;
  var errors = new Array();
  var empty = new Array();

  for ( var i=0; i<elements.length; i++ )
  {
    el = elements[i];
    if ( typeof(f.elements[el.name])!="undefined" && isMandatoryEmpty( f.elements[el.name], el.mandatory ) )
    {
      empty[empty.length] = el.description;
    }
    else
    if ( typeof( el.type )!="undefined" && el.type!="" )
    {
      if ( typeof( errorChecks[ el.type ] ) != "undefined" )
      {
        chk = errorChecks[el.type];
        if ( !eval( chk.methodCall + "(f,'" + el.name + "')" ) )
        {
          if ( typeof(errors[chk.name])=="undefined" )
          {
            errors[chk.name] = new Array();
          }
          if ( chk.showFields )
          {
            errors[chk.name][errors[chk.name].length] = el.description;
          }
          hasErrors = true;
        }
      }
    }
  }
  if ( hasErrors || empty.length > 0 )
  {
    error = "";
    for ( i in errors )
    {
      error += errorChecks[i].description + "\n";
      for ( j=0; j<errors[i].length; j++ )
      {
        error += " - " + errors[i][j] + "\n" ;
      }
    }
    for ( i=0; i<empty.length; i++ )
    {
      if ( i==0 )
      {
        error += "The following fields are mandatory and require inputs:\n";
      }
      error += " - " + empty[i] + "\n";
    }
    alert( error );
    return false;
  }
  return true;
}


function isMandatoryEmpty( element, mandatory )
{
  var val = "";
  if ( element.length > 0 )
  {
    for ( var i=0; i<element.length; i++ )
    {
      var subel = element[i];
      if( subel.checked || subel.selected )
      {
        val += subel.value;
      }
    }
  }
  else
  if( element.type.indexOf( "select-one" ) == 0 )
  {
    val = ( ( element.selectedIndex != -1 ) ? element.options[element.selectedIndex].value : "" );
  }
  else if( element.type.indexOf( "select-mul" ) == 0 )
  {
    for( op = 0 ; op < element.options.length ; op ++ )
    {
      if( element.options[op].selected )
      {
        val += element.options[op].value;
      }
    }
  }
  else if( element.type == "radio" )
  {
    elArray = element.form.elements[element.name];

    for( rb = 0 ; rb < elArray.length ; rb ++ )
    {
      if( elArray[rb].checked )
      {
        val = elArray[rb].value;
        break;
      }
    }
  }
  else if( element.type == "checkbox" )
  {
    val = ( ( element.checked ) ? element.value : "" );
  }
  else
  {
    val = element.value;
  }
  return ( mandatory && isEmpty( val ) );
}

function isEmpty( val )
{
  return ( typeof( val ) == "undefined" || typeof( val ) == "null" || val == "" || val == null );
}


function isNumber( f, name )
{
  val = f.elements[name].value;
  if ( val*1!=val )
  {
    return false;
  }
  return true;
}

function isEmail( f, name )
{
  email = f.elements[name].value;
  if ( email=="" )
  {
    return true;
  }
  if( email.indexOf( "<" ) != -1 )
    email = email.substring( email.indexOf( "<" ), email.length );

  if( email.indexOf( ">" ) != -1 )
    email = email.substring( 0, email.indexOf( ">" ) );

  atPos = email.indexOf( "@" );
  lastDotPos = email.lastIndexOf( "." );
  spacePos = email.indexOf( " " );

  if( atPos != -1 && lastDotPos != -1 && ( lastDotPos - atPos > 1 ) && spacePos == -1 ) return true;

  return false;
}

addErrorCheck( "number", "You have entered an invalid number:", "isNumber" )
addErrorCheck( "email", "Your email address is invalid", "isEmail" );
