/**
 * I will be trying to create a validate object here.
 * Author : Auke van Leeuwen <auke@e-linewebsolutions.nl>
 * Date   : 9/13/2002
 * Version: 1.0 (initial)
 *          1.1 added generateScript( form2print )
 *          1.2 [rvl] added new validation methods
 *          1.3 [mjh] added isInvalidDutchZIP()
 */

/**
 * Add the trim( ) function to the native String Object
 */
String.prototype.trim = function( ) 
{
  return this.replace( /^\s*(\b.*\b|)\s*$/, "$1" );
}

function mod( div, base )
{
	return Math.round( div - ( Math.floor( div / base ) * base ));
}

/* create the object */
var Validation = new Object( );
var currentField;

/**
 * isValidEmail function, used to check if a certain string is a valid email-address
 * note: This validates about 99% of the used email addresses. It does not work for
 * joe@[213.196.33.10] nor does it work for "jimmy hendrix"@guitar.com. -AvL
 * 
 * @param      str         String to be checked.
 * @return     TRUE        if str is a valid emailaddress (in syntax)
 *             FALSE       if str is not a valid emailaddress (in syntax)
 */
Validation.isValidEmail = function( str )
{
  var emailFilter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9])+$/;
  
  if( arguments.length == 2 )
  {
    if( emailFilter.test( str ))
      return true;
    else
    {
      alert( arguments[1] );
      return false;
    }
  }
  else
    return emailFilter.test( str );
}

/**
 * isBlank( str ), used to check if a String is empty.
 * 
 * @param      str         String to be checked.
 * @param      errormes    (optional) String to be alerted when str == ""
 * @return     TRUE        if str == ""
 *             FALSE       if str != ""
 */
Validation.isBlank = function( str )
{
  if( arguments.length == 0 )
  {
    alert( "No arguments given to isBlank( str ) function:\n\n" + arguments.caller.callee.toString( ));
    return true;
  }
  else if( arguments.length == 2 )
    if( str.trim( ) == "" )
    {
      alert( arguments[1] );
      return true;
    }
    else
      return false;
  else
    return ( str.trim( ) == "" );
}

/**
 * isBlankField( ), used to check if a formfield is emptry or not.
 *
 * @param        field     formfield to be checked
 * @param        errormes  (optional) String to be alerted when the formfield is empty
 */
Validation.isBlankField = function( field )
{
  if( arguments.length == 0 )
  {
    alert( "No arguments given to isBlankField( field ) function:\n\n" + arguments.caller.callee.toString( ));
    return true;
  }
  if( field.type == null )
  {
    alert( "Argument passed to isBlankField( field ) function is not a valid form field\n\n" + field.name );
    return true;
  }

  currentField = field;

  switch( field.type )
  {
    case 'file':
    case 'password':
    case 'text':
    case 'hidden':
    case 'textarea':
      if( arguments.length == 2 )
        return Validation.isBlank( field.value, arguments[1] );
      else
        return Validation.isBlank( field.value );
      break;

    case 'radio':
      /* not yet implemented [avl] */
      break;

    case 'select-one':
      if( arguments.length == 2 )
        return Validation.isBlank( field.options[field.selectedIndex].value, arguments[1] );
      else
        return Validation.isBlank( field.options[field.selectedIndex].value );
      break;

    case 'select-multiple':
      /* not yet implemented [avl] */
      break;
  }
}

Validation.isEmptyCheckBoxGroup = function ( CBArray )
{
  if( CBArray.length == null ) /* no array */
  {
    if( CBArray.type == 'checkbox' ) /* but objecttype is checkbox */
    {
      if( CBArray.checked )
        return false;
      else /* it's not checked */     
      {
        if( arguments[1] != null )
          alert( arguments[1] );
        return true;
      }
    }
  }
  else /* is an array */
  {
    for( i = 0; i < CBArray.length; i++ )
    {
      if( CBArray[i].checked )
        return false;
    }
    if( arguments[1] != null )
      alert( arguments[1] );
    return true; /* if we end up here we have not a single checkbox checked */
  }
}

/** 
 * isValidDate will validate a date based on a mask such as "dd/mm/yyyy" or any other
 * order of those 3.
 */
Validation.isValidDate = function( str, mask )
{
  /* find the delimeter */
  maskChars = 'mdy';
  for( var i = 0; i < mask.length; i++ )
  {
    if( maskChars.indexOf( mask.substring( i, i+1 )) == -1 )
    {
      delim = mask.substring( i, i + 1 );
      break;
    }
  }
  var varName = mask.split( delim );
  var values  = str.split( delim );
  
  /* try to determine the seperate date, month, year values */
  for( var i = 0; i < varName.length; i++ )
  {
    if( varName[i].toLowerCase() == "dd" )
      var nDay = values[i];
    else if( varName[i].toLowerCase() == "mm" )
      var nMonth = values[i] - 1; /* month value is stored as 0 = jan ... 11 = dec */
    else if( varName[i].toLowerCase() == "yyyy" )
      var nYear = values[i];
    else
    {
      alert( 'Wrong mask in the date validation:\n\nUse a combination of "dd", "mm" and "yyyy"' );
      return false;
    }
  }
  
  /* try to create a date */
  var dDate = new Date( nYear, nMonth, nDay );
  
  /* now check if it's still the same date as it was */
  if(( dDate.getFullYear() == nYear ) && ( dDate.getMonth() == nMonth ) && ( dDate.getDate() == nDay ))
    return true;
  else
  {
    if( arguments.length == 3 )
      alert( arguments[2] );
    return false;
  }
}

/**
 * generateScript should generate a script for a form to be validated.
 * It does not produce perfect output, but gives you something to start with.
 */
function generateScript( form2print )
{
  document.write( '&lt;script language="JavaScript"&gt;<br>' );
  document.write( '&nbsp;&nbsp;function checkMe( form2check )<br>' );
  document.write( '&nbsp;&nbsp;{<br>' );
  document.write( '&nbsp;&nbsp;&nbsp;&nbsp;if( <br>' );
  for( i = 0; i < form2print.elements.length; i++ )
  {
    field = form2print.elements[i].name;
    if( field != "" )
    {
      document.write( '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' );
      document.write( 'Validation.isBlankField( form2check.' + field + ', "" ) ||<br>' );
    }
  }
  document.write( '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br>' );
  document.write( '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<br>' );
  document.write( '&nbsp;&nbsp;&nbsp;&nbsp;else<br>' );
  document.write( '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;<br>' );
  document.write( '&nbsp;&nbsp;}<br>' );
  document.write( '&lt;/script&gt;<br>' );
}

/* ======================================================================= */
/* Added section by rens@netconsorts.nl                                    */
/* ======================================================================= */

Validation.isFloat = function( sInput )
{
  /* used on histor.nl (paintcalculator) and it expects a return true on '4' too 
   * instead of '4.0'
   */
  return /^[0-9]+([\.,]?[0-9]+)?$/.test( sInput );
}

Validation.isNumeric = function( sInput )
{
  if( arguments.length == 0 )
  {
    alert( "No arguments given to isNumeric( input ) function:\n\n" + arguments.caller.callee.toString( ));
    return false;
  }
  else 
  {
    sInput = sInput.trim();

    if( sInput.length == 0 )
      return false;

    sReturn = !sInput.search(/^[\d\.]*$/gi);

    if( arguments.length == 2 )
    {
      if( !sReturn )
      {
        alert( arguments[1] );
        return false;
      }
      else
        return true;
    }
    else
      return( sReturn );
  }
}

Validation.isAlphaNumeric = function( sInput )
{
  sInput = sInput.trim();
  if( sInput.length == 0 )
  {
    return( false );
  }
  
  return( !sInput.search(/^\w*$/gi));
}

Validation.isAlpha = function( sInput )
{
  sInput = sInput.trim();
  if( sInput.length == 0 )
  {
    return( false );
  }
  
  return( !sInput.search(/^[A-Za-z]*$/gi));
}

/**
 * alphanumeric, '.', '-'
 */
Validation.isValidDomain = function( sInput )
{
  sInput = sInput.trim();
  if( sInput.length == 0 )
  {
    return( false );
  }
  
  return( !sInput.search(/^[A-Za-z0-9]{1}([A-Za-z0-9]|\.|-)*$/gi));
}

Validation.isValidIPAddress = function ( ipaddr )
{
  var re = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;

  if( re.test( ipaddr ))
  {
    var parts = ipaddr.split( "." );
    if( parseInt( parseFloat( parts[0] )) == 0 )
    {
      return( false );
    }
    
    for( var i = 0; i < parts.length; i++ )
    {
      if( parseInt( parseFloat( parts[i] )) > 255 )
      {
        return( false );
      }
    }
    return( true );
  }
  else
  {
    return( false );
  }
}

Validation.isValidDay = function( nDay )
{
  return(( Validation.isNumeric( nDay )) &&
         ( nDay >= 0 ) && 
         ( nDay <= 31 ));
}

Validation.isValidMonth = function( nMonth )
{
  return(( Validation.isNumeric( nMonth )) &&
         ( nMonth >= 0 ) && 
         ( nMonth <= 12 ));
}

Validation.isValidYear = function( nYear )
{
  return(( Validation.isNumeric( nMonth )) &&
         ( nMonth.length == 4 ));
}

Validation.isValidDutchZIP = function( sZIP )
{
  return( !sZIP.search(/^[0-9]{4}( ){0,1}[A-Za-z]{2}$/gi));
}

Validation.isIntBetweenValues = function( nValue, nMin, nMax )
{
  return( 
          ( Validation.isNumeric( nValue )) && 
          ( nValue >= nMin ) &&
          ( nValue <= nMax )
        );
}

/* [mjh] added this (validate-obj compliant) version on 30-sept-03 */
Validation.isInvalidDutchZIP = function( sZIP )
{
  if( arguments.length == 0 )
  {
    alert( "No arguments given to isInvalidDutchZIP( sZIP ) function:\n\n" + arguments.caller.callee.toString( ));
    return true;
  }
  else if( arguments.length == 2 )
    if( sZIP.search(/^[0-9]{4}( ){0,1}[A-Za-z]{2}$/gi))
    {
      alert( arguments[1] );
      return true;
    }
    else
      return false;
  else
    return ( sZIP.search(/^[0-9]{4}( ){0,1}[A-Za-z]{2}$/gi));
}

/* [mjh] 18-4-2005 Added isBelgianVAT */
Validation.isInvalidBelgianVAT = function( VAT )
{
  VAT = parseFloat( VAT.replace( new RegExp( "[^0-9]*", "g"), '' )).toString();

  if( arguments.length == 0 )
  {
    alert( "No arguments given to isInvalidBelgianVAT( sVAT ) function:\n\n" + arguments.caller.callee.toString( ));
    return true;
  }
  else if( arguments.length == 2 )
    if( !( 97 - mod( parseFloat( VAT.substring( 0, 7 )), 97 ) == VAT.substring( VAT.length - 2 )))
    {
      alert( arguments[1] );
      return true;
    }
    else
      return false;
  else
    return !( 97 - mod( parseFloat( VAT.substring( 0, 7 )), 97 ) == VAT.substring( VAT.length - 2 ));
}

