/*================================
   Global Variables 
================================*/

var error_class = '__UNDEFINED__';
var non_error_class = '__UNDEFINED__';

var validationIsOff = false;

var error_queue = new Array();

/*===================================================================

  Public Function: setValidationClasses

  Description: This function sets the error state class and non-error
               state class for the input field.

  Usage: set_validation_classes( <error class>, <non-error class> );

  Parameters:

    error class - This is the CSS class name for when an error occurs.
    non-error class - This is the CSS class name for when an error 
                      has not occurred, or has been resolved.

  Returns:

    Nothing.

===================================================================*/

function setValidationClasses( input_ec, input_nec ) {
  error_class = input_ec;
  non_error_class = input_nec;
}


/*===================================================================

  Public Function: formIsValid

  Description: This is a boolean function, if there are errors on the
               page, the function will return false.
               

  Usage: if( formIsValid ) { ...

  Parameters:

    None.

  Returns:

    A Boolean Value.

===================================================================*/

function formIsValid() {
  if ( error_queue.length > 0 ) { 
     scanFields(); 
     return false; 
  } else { 
     return true;  
  }
}


/*===================================================================

  Public Function: scanFields

  Description: This function will scan down through each field, focusing
               and then bluring the fields specified.  This will trigger
               the onBlur validation check.  This function is useful
               for doing a end of page check to make sure no fields
               were completely skipped and left blank, thus never
               triggering an onBlur. 

  Usage: scanFields( validation_queue );  In addition, an additional
         form input is required, and should be like the following:

         <input type="hidden" id="validation_queue" value="field1|field2">

         This will have the effect of scanning "field1" and "field2" 
         when scanFields() is called, and pointed at "validation_queue".

  Parameters:

    validation_queue - This is the element id of the "validation_queue", 
                       which should be pipe delimited, without spaces.

  Returns:

    Nothing, but will cause validation checks to occur in the specified
    fields.

===================================================================*/

function scanFields() {
  var i = 0;

  while ( i < error_queue.length ) {
    document.getElementById( error_queue[i] ).onchange();
    i++;
  }
}


/*===================================================================

  Public Function: populateErrorQueue 

  Description: This function will load up the error queue with the 
               field ids specified, forcing them to be validated
               before the user can move on.

  Usage: populateErrorQueue( vqueue );

  Parameters:

    vfields - The pipe delimited list of input element ids to be 
              added to the error queue.

  Returns:

    Nothing.

===================================================================*/

function populateErrorQueue( vfields ) {

  var vqueue = new Array;
  vqueue = vfields.split('|');

  clearErrorQueue();

  if ( validationIsOff ) { 
     return; 
  }

  for ( i=0; i<vqueue.length; i++ ) { 
    if ( vqueue[i] != '' ) { 
       addToErrorQueue( vqueue[i] );  
    }
  }
}

/*===================================================================

  Public Function: toggleValidation()

  Description: 

  Usage: 

  Parameters:

  Returns:


===================================================================*/

function toggleValidation( status ) {
  if ( status != undefined && status != '' ) { 
     if ( status == 'off' ) {
        /* Validation is off */
        validationIsOff = true;
//      alert( "Validation has been turned off." );
     } else {
        /* Validation is on */
        validationIsOff = false;
//      alert( "Validation has been turned on." );
    }
  } else {
     validationIsOff = !validationIsOff;
//   alert( "Validation has been toggled to "+validationIsOff );
  }
}


/*===================================================================

  Public Function: validate

  Description: Intended for <input type="text"> fields.  Will validate
               fields based on the type specified.

  Usage: validate( this, <type>, <count> );

  Parameters:

    type  - This is the type of validation to take place.  This can
            be 'alphanumeric', 'number', 'name', 'email'.

    count - This is an optional value, used for the 'number' type,
            will check that the number entered is a specified 
            length.

  Returns:

    A boolean value, true if the value is good, and false if it's 
    bad.  Will also alert to the user on error and return focus to
    the field on error.

===================================================================*/

function validate( self, type, count, output_override_id, override_message, 
  option_flag ) {

  var output_cell = self.id + '__error';

  if ( output_override_id != undefined && output_override_id != '' ) { 
     output_cell = output_override_id; 
  } 

  if ( error_class == "__UNDEFINED__" || non_error_class == "__UNDEFINED__" ) {
     alert( "DEVELOPER ERROR: Please define validation error classes with:\n  setValidationClasses(<error_class>, <non_error_class>)" );
     return false;
  }

  var output_message;

  if ( override_message != undefined && override_message != '' ) { 
     output_message = override_message;
  }

  /* Handling the first and only option flag */
  if ( option_flag == 'validate_empty' && self.value.length == 0 ) {
     self.className = non_error_class;
     removeFromErrorQueue( self.id );
     removeErrorMessage( output_cell );
     return true;
  }

  switch( type ) {
    /* Alphanumeric is used for just letters and numbers */
    case 'alphanumeric':
      if ( !self.value.match( /^[\w]+$/ ) ) {
         if ( output_message == undefined ) { 
            output_message = 'Please enter an alpha-numeric value.'; 
         }
         self.className = error_class;
         addToErrorQueue( self.id );
         insertErrorMessage( output_cell, output_message );
         return false;
      } else {
         self.className = non_error_class;
         removeFromErrorQueue( self.id );
         removeErrorMessage( output_cell );
      }
      break;
    /* Name will allow both letters and spaces */
    case 'name':
      if ( !self.value.match( /^[A-Za-z ]+$/ ) ) {
         if ( output_message == undefined ) { 
            output_message = "Please enter a valid name value, containing only letters and spaces."; 
         }
         self.className = error_class;
         addToErrorQueue( self.id );
         insertErrorMessage( output_cell, output_message );
         return false;
      } else {
         self.className = non_error_class;
         removeFromErrorQueue( self.id );
         removeErrorMessage( output_cell );
      }
      break;
    /* Word will allow only letters */
    case 'word':
      if ( !self.value.match( /^[A-Za-z]+$/ ) ) {
         if ( output_message == undefined ) { 
            output_message = "Please enter a valid word value, containing only letters."; 
         }
         self.className = error_class;
         addToErrorQueue( self.id );
         insertErrorMessage( output_cell, output_message );
         return false;
      } else {
         self.className = non_error_class;
         removeFromErrorQueue( self.id );
         removeErrorMessage( output_cell );
      }
      break;
    /* Number will allow only numbers, and uses the optional 'count' parameter to test length */
    case 'number':
      if ( !self.value.match( /^[\d]+$/ ) ) {
         if ( output_message == undefined ) { 
            output_message = "Please enter a numeric value only."; 
         }
         self.className = error_class;
         addToErrorQueue( self.id );
         insertErrorMessage( output_cell, output_message );
         return false;
      } else if ( self.value.length != count && count != 0 
         && count != undefined ) {
         if ( output_message == undefined ) { 
            output_message = "Please enter a number consisting of "
              + count + " digits."; 
         }
         self.className = error_class;
         addToErrorQueue( self.id );
         insertErrorMessage( output_cell, output_message );
         return false;
      } else {
         self.className = non_error_class;
         removeFromErrorQueue( self.id );
         removeErrorMessage( output_cell );
      }
      break;
    /* Id will allow only numbers, and uses the optional 'count' parameter to test length.  Must start with 1 or 0. */
    case 'id':
      if ( !self.value.match( /^[\d]+$/ ) ) {
         if ( output_message == undefined ) { 
            output_message = "Please enter a numeric value only."; 
         }
         self.className = error_class;
         addToErrorQueue( self.id );
         insertErrorMessage( output_cell, output_message );
         return false;
      } else if ( self.value.length != count && count != 0 
         && count != undefined ) {
         if ( output_message == undefined ) { 
            output_message = "Please enter an employee id consisting of "
              + count + " digits."; 
         }
         self.className = error_class;
         addToErrorQueue( self.id );
         insertErrorMessage( output_cell, output_message );
         return false;
      } else if (self.value.substr(0,1) != '0' 
         && self.value.substr(0,1) != '1') {
         if ( output_message == undefined ) { 
            output_message = "Please enter an employee id beginning with 0 or 1."; 
         }
         self.className = error_class;
         addToErrorQueue( self.id );
         insertErrorMessage( output_cell, output_message );
         return false;
      } else {
         self.className = non_error_class;
         removeFromErrorQueue( self.id );
         removeErrorMessage( output_cell );
      }
      break;
    /* Phone will check for a 10 digit phone number */
    case 'phone':
      if ( self.value.length != 10 || !self.value.match(/^[0-9]+$/) ) {
         if ( output_message == undefined ) { 
            output_message = "Please enter a valid 10-digit phone number.";
         }
         self.className = error_class;
         addToErrorQueue( self.id );
         insertErrorMessage( output_cell, output_message );
         return false;
      } else {
         self.className = non_error_class;
         removeFromErrorQueue( self.id );
         removeErrorMessage( output_cell );
      }
      break;
    /* Email pretty obviously validates email addresses */
    case 'email':
      if ( !self.value.match( /^[\w._-]+[@]{1,1}[a-zA-Z0-9.-]+[.]{1,1}[a-zA-Z]{2,3}$/ ) ) {
         if ( output_message == undefined ) { 
            output_message = 'Please enter a valid email address.'; 
         }
         self.className = error_class;
         addToErrorQueue( self.id );
         insertErrorMessage( output_cell, output_message );
         return false;
      } else {
         self.className = non_error_class;
         removeFromErrorQueue( self.id );
         removeErrorMessage( output_cell );
      }
      break;
    /* This checks for the standard MM/DD/YYYY or MM/DD/YY date */ 
    case 'date':
      if ( !self.value.match( /^[0-9]{1,2}[\/]{1,1}[0-9]{1,2}[\/]{1,1}[0-9]{2,4}$/ ) ) {
         if ( output_message == undefined ) { 
            output_message = "Please enter a valid date in the format MM/DD/YYYY."; 
         }
         self.className = error_class;
         addToErrorQueue( self.id );
         insertErrorMessage( output_cell, output_message );
         return false;
      } else {
         self.className = non_error_class;
         removeFromErrorQueue( self.id );
         removeErrorMessage( output_cell );
      }
      break;
    default:
      alert( "DEVELOPER ERROR: Unknown validation type!" );
  }

  return true;
}

/*===================================================================*/
/*===================================================================*/
/*=======  Private Functions intended for internal use only.  =======*/
/*===================================================================*/
/*===================================================================*/


/*===================================================================

  Private Function: insertErrorMessage

  Description: This function will change the innerHTML of a table cell
               that is designed to contain an error message.  This is
               meant for internal use only.

               NOTE: validator.js requires that cells that are validated
                     have a corresponding cell that is named with the
                     same name, + '__error'.
                   
                     EXAMPLE: phone -> phone__error

  Usage: insertErrorMessage( element_id, message ); 

  Parameters:

    element_id - This is the id of the error cell.

    message - The error message to be inserted.

  Returns:

    Nothing.

===================================================================*/

function insertErrorMessage( element_id, message ) {

  var error_cell = document.getElementById( element_id );

  error_cell.innerHTML = message;

}

/*===================================================================

  Private Function: removeErrorMessage

  Description: This function will change the innerHTML of a table cell
               that is designed to contain an error message.  This is
               meant for internal use only.

               NOTE: validator.js requires that cells that are validated
                     have a corresponding cell that is named with the
                     same name, + '__error'.
                   
                     EXAMPLE: phone -> phone__error

  Usage: removeErrorMessage( element_id );

  Parameters:

    element_id - This is the id of the the error cell.

  Returns:

    Nothing.

===================================================================*/

function removeErrorMessage( element_id ) {

  var error_cell = document.getElementById( element_id );

//alert( "removeErrorMessage: "+element_id );
  error_cell.innerHTML = '';

}

/*===================================================================

  Private Function: addToErrorQueue

  Description: This is a function to add an id to the error 
               queue, and is meant for internal use only, though
               if you can find a public use, god bless.

  Usage: addToErrorQueue( element_id );

  Parameters:

    element_id - This is the id to be found and added to the array.

  Returns:

    Nothing.

===================================================================*/

function addToErrorQueue( element_id ) {

  if ( validationIsOff ) { 
     return;
  }

  for ( i in error_queue ) { 
    if ( error_queue[i] == element_id ) { 
       return;
    }
  }

  /* if we made it this far, the element wasn't already in the queue */
  error_queue.push( element_id );

}


/*===================================================================

  Private Function: removeFromErrorQueue

  Description: This is a function to remove an id from the error 
               queue, and is meant for internal use only, though
               if you can find a public use, god bless.

               Note: This will remove ALL instances of a particular id.
               

  Usage: removeFromErrorQueue( element_id );

  Parameters:

    element_id - This is the id to be found and removed in the array.

  Returns:

    Nothing.

===================================================================*/

function removeFromErrorQueue( element_id ) {

  var err_len = error_queue.length;

  while ( err_len ) { 
    var item = error_queue.shift();
    if ( item != element_id ) { 
       error_queue.push( item ); 
    }
    err_len--;
  }
  
}

/*===================================================================

  Private Function: clearErrorQueue

  Description: This is a function resets the error queue to 0 length.

  Usage: clearErrorQueue();

  Parameters:

    None.

  Returns:

    Nothing.

===================================================================*/

function clearErrorQueue() {
  while ( error_queue.length > 0 ) { 
    error_queue.shift(); 
  }
}

function validatePage2() {
  var lname = document.getElementById('2_last_name').value;
  var fname = document.getElementById('2_first_name').value;
  var phone1 = document.getElementById('2_area_code').value;
  var phone2 = document.getElementById('2_phone_3').value;
  var phone3 = document.getElementById('2_phone_4').value;
  var id = document.getElementById('2_employee_id').value;

  if ((lname != "" && fname != ""
     && phone1 != "" && phone2 != "" & phone3 != "")
     || (id != "")) {
     document.getElementById( '2_page__error' ).innerHTML =
       "&nbsp;";
     return true;
  } else {
     document.getElementById( '2_page__error' ).innerHTML =
       "<center>Either last name, first name, and phone number are required; or employee id is required.</center>";
     return false;
  }
}

function validatePage5() {
  var phone1 = document.getElementById('5_area_code').value;
  var phone2 = document.getElementById('5_phone_3').value;
  var phone3 = document.getElementById('5_phone_4').value;
  var email = document.getElementById('5_email').value;

  if ((phone1 != "" && phone2 != "" & phone3 != "") || (email != "")) {
     document.getElementById( '5_page__error' ).innerHTML =
       "&nbsp;";
     //gotoPage('9');
     submitForm( this, '6' );
     return true;
  } else {
     document.getElementById( '5_page__error' ).innerHTML =
       "<center>Either phone number or email is required.</center>";
     return false;
  }
}

function validatePage5_hr() {
  var phone1 = document.getElementById('5_area_code').value;
  var phone2 = document.getElementById('5_phone_3').value;
  var phone3 = document.getElementById('5_phone_4').value;
  var email = document.getElementById('5_email').value;

  if ((phone1 != "" && phone2 != "" & phone3 != "") || (email != "")) {
     document.getElementById( '5_page__error' ).innerHTML =
       "&nbsp;";
     gotoPage('9');
     return true;
  } else {
     document.getElementById( '5_page__error' ).innerHTML =
       "<center>Either phone number or email is required.</center>";
     return false;
  }
}

function validatePage7() {
  var lname = document.getElementById('7_last_name').value;
  var fname = document.getElementById('7_first_name').value;
  var id = document.getElementById('7_employee_id').value;

  if ((lname != "" && fname != "") || (id != "")) {
     document.getElementById( '7_page__error' ).innerHTML =
       "&nbsp;";
     return true;
  } else {
     document.getElementById( '7_page__error' ).innerHTML =
       "<center>Either last name and first name are required; or employee id is required.</center>";
     return false;
  }
}

