/*
   ------------------------------------------------
   The following functions are ment for validating
   a form input at browser side.
   ------------------------------------------------
   Author:      Marek Lints <marek@inspiral.net>
   Created:     2004-09-03
   Changed:     2004-09-30
   InspiralNet
   ------------------------------------------------
*/

/* ----------------------------------------
   FORM FIELD VALIDATION START
   ---------------------------------------- */

/*
  It validates given fields towards the
  validation terms given to a field.
  It also trims all the fields before validation.
  Please see an example file jstest.html
  for more information on how to use this function.
*/
function do_validation(intro_text, form_path, field_array)
{
   // intro_text:   for example - "Please correct the folowing problems:"
   // form_path: a reference to a form to talidate; for example - dodument.form_name
   // field_array: an array of fields and validation terms

   var error_array = new Array(); // Resulting errors go here.
   var array_index = 0;

   // Form path should be always determined.
   if(form_path && field_array.length > 0){

      // Each element in the array is one validation term.
      var index;
      for(index = 0; index < field_array.length; index++){

         // The three fields must be defined in order to validate.
         if( field_array[index]["field"] &&
             field_array[index]["validate_type"] &&
             field_array[index]["error_txt"]
         ){

            //Assigning variables...
            var validate_type = field_array[index]["validate_type"];

            var error_txt = field_array[index]["error_txt"];
            var error_txt2;
            if(field_array[index]["error_txt2"]){ error_txt2 = field_array[index]["error_txt2"]; }

            var field = field_array[index]["field"];
            var field2;

            // Let's check if the field(s) defined.
            if( form_path.elements[field] ){
               // Let's trim the field.
               form_path.elements[field].value = trim(form_path.elements[field].value);
            }
            if(field_array[index]["field2"]){
               // Field2 is defined.
               field2 = field_array[index]["field2"];
               if( form_path.elements[field2] ){
                  form_path.elements[field2].value = trim(form_path.elements[field2].value);
               }
            }
            if(field_array[index]["field3"]){
               // Field3 is defined.
               field3 = field_array[index]["field3"];
               if( form_path.elements[field3] ){
                  form_path.elements[field3].value = trim(form_path.elements[field3].value);
               }
            }
            // End assigning variables.

            //----------------------------------------------------
            // Filled-field-validation.
            //----------------------------------------------------
            if(validate_type == "filled"){
               // Is the field defined
               if(form_path.elements[field]){
                  if(form_path.elements[field].value == ""){
                     error_array[array_index] = error_txt;
                     array_index++;
                  }
               }//if
            }//if
            //----------------------------------------------------

            //----------------------------------------------------
            // Integer-field-validation.
            //----------------------------------------------------
            if(validate_type == "int"){
               // Is integer
               if(form_path.elements[field]){
                  if( !is_integer(form_path.elements[field].value) ){
                     error_array[array_index] = error_txt;
                     array_index++;
                  }
               }//if
            }//if
            //----------------------------------------------------

            //----------------------------------------------------
            // E-mail-validation.
            //----------------------------------------------------
            if(validate_type == "email"){
               // Is the field defined
               if(form_path.elements[field]){
                  if( !is_email(form_path.elements[field].value) ){
                     error_array[array_index] = error_txt;
                     array_index++;
                  }
               }//if
            }//if
            //----------------------------------------------------

            //----------------------------------------------------
            // E-mail-or-empty-validation.
            //----------------------------------------------------
            if(validate_type == "email_or_empty"){
               // Is the field defined
               if(form_path.elements[field]){
                  if(
                     !is_email(form_path.elements[field].value) &&
                     !form_path.elements[field].value == ""
                  ){
                     error_array[array_index] = error_txt;
                     array_index++;
                  }
               }//if
            }//if
            //----------------------------------------------------

            //----------------------------------------------------
            // Est-date-validation.
            //----------------------------------------------------
            if(validate_type == "estdate"){
               // Is the field defined
               if(form_path.elements[field]){
                  if( !is_valid_est_date(form_path.elements[field].value) ){
                     error_array[array_index] = error_txt;
                     array_index++;
                  }
               }//if
            }//if
            //----------------------------------------------------

            //----------------------------------------------------
            // Est-date-or-empty-validation.
            //----------------------------------------------------
            if(validate_type == "estdate_or_empty"){
               // Is the field defined
               if(form_path.elements[field]){
                  if(
                     !is_valid_est_date(form_path.elements[field].value) &&
                     !form_path.elements[field].value == ""
                  ){
                     error_array[array_index] = error_txt;
                     array_index++;
                  }
               }//if
            }//if
            //----------------------------------------------------

            //----------------------------------------------------
            // Est-date2-validation.
            //----------------------------------------------------
            if(validate_type == "estdate2"){
               // Is the field defined
               if(form_path.elements[field]){
                  if( !is_valid_est_date2(form_path.elements[field].value) ){
                     error_array[array_index] = error_txt;
                     array_index++;
                  }
               }//if
            }//if
            //----------------------------------------------------

            //----------------------------------------------------
            // Est-date2-or-empty-validation.
            //----------------------------------------------------
            if(validate_type == "estdate2_or_empty"){
               // Is the field defined
               if(form_path.elements[field]){
                  if(
                     !is_valid_est_date2(form_path.elements[field].value) &&
                     !form_path.elements[field].value == ""
                  ){
                     error_array[array_index] = error_txt;
                     array_index++;
                  }
               }//if
            }//if
            //----------------------------------------------------


            //----------------------------------------------------
            // Est_dates_correct (if end-date is greater than start-date).
            // Date foramt is DD.MM.YYYY.
            //----------------------------------------------------
            if(validate_type == "est_dates_correct"){
               // Are the fields defined
               if(form_path.elements[field] && form_path.elements[field2]){
                  if(
                        !are_est_dates_correct(form_path.elements[field].value,
                                               form_path.elements[field2].value)
                  ){
                     error_array[array_index] = error_txt;
                     array_index++;
                  }
               }//if
            }//if
            //----------------------------------------------------

            //----------------------------------------------------
            // Est_dates_correct2 (if end-date is greater than start-date).
            // Date foramt is DD-MM-YYYY.
            //----------------------------------------------------
            if(validate_type == "est_dates_correct2"){
               // Are the fields defined
               if(form_path.elements[field] && form_path.elements[field2]){
                  if(
                        !are_est_dates_correct2(form_path.elements[field].value,
                                                form_path.elements[field2].value)
                  ){
                     error_array[array_index] = error_txt;
                     array_index++;
                  }
               }//if
            }//if
            //----------------------------------------------------

            //----------------------------------------------------
            // Both-filled-or-empty-validation.
            //----------------------------------------------------
            if(validate_type == "both_filled_or_empty"){
               // Are the fields defined
               if(form_path.elements[field] && form_path.elements[field2]){

                  if( is_filled(form_path.elements[field].value) &&
                      !is_filled(form_path.elements[field2].value)
                  ){
                     error_array[array_index] = error_txt;
                     array_index++;
                  }
                  else if( !is_filled(form_path.elements[field].value) &&
                      is_filled(form_path.elements[field2].value)
                  ){
                     error_array[array_index] = error_txt2;
                     array_index++;
                  }

               }//if
            }//if
            //----------------------------------------------------

            //----------------------------------------------------
            // At least one of two filled.
            //----------------------------------------------------
            if(validate_type == "one_of_two_filled"){
               // Are the fields defined
               if(form_path.elements[field] && form_path.elements[field2]){

                  if( !is_filled(form_path.elements[field].value) &&
                      !is_filled(form_path.elements[field2].value)
                  ){
                     error_array[array_index] = error_txt;
                     array_index++;
                  }

               }//if
            }//if
            //----------------------------------------------------

            //----------------------------------------------------
            // At least one of three filled.
            //----------------------------------------------------
            if(validate_type == "one_of_three_filled"){
               // Are the fields defined
               if(form_path.elements[field] && form_path.elements[field2] && form_path.elements[field3]){

                  if( !is_filled(form_path.elements[field].value) &&
                      !is_filled(form_path.elements[field2].value) &&
                      !is_filled(form_path.elements[field3].value)
                  ){
                     error_array[array_index] = error_txt;
                     array_index++;
                  }

               }//if
            }//if
            //----------------------------------------------------

            //----------------------------------------------------
            // If one, then another also filled
            //----------------------------------------------------
            if(validate_type == "if_one_then_another_also_filled"){
               // Are the fields defined
               if(form_path.elements[field] && form_path.elements[field2]){

                  if( is_filled_or_checked(form_path.elements[field]) &&
                      !is_filled_or_checked(form_path.elements[field2])
                  ){
                     error_array[array_index] = error_txt;
                     array_index++;
                  }

               }//if
            }//if
            //----------------------------------------------------

         }

      }//for

      //No errors detected in validation.
      if(error_array.length < 1){
         return true;
      }else{ //Some errors were detected in validation.

         // displaying the validation results
         var intro = intro_text + "\n\n";
         display_errors(intro, error_array);
         return false;

      }

   }else{
      return false;
   }

}//do_validation

/*
   Is it an e-mail?
*/
function is_email(email)
{
   var result = false;
   var the_email = new String(email);
   var at_pos = the_email.indexOf("@");
   if (at_pos > 0){
      var dot_pos = the_email.indexOf(".",at_pos);
      if ( (the_email.length > dot_pos + 1) && (dot_pos > at_pos + 1) )
         result = true;
   }
   return result;
}//is_email

/*
   Is it a vaild USA date (YYYY-MM-DD).
*/
function is_valid_usa_date(the_field)
{
	var is_valid = true;
   var parts = the_field.split(".");

   is_valid = (parts.length == 3)?true:false;

   // There should be always three parts in a valid date.
   if (is_valid){
      var the_year = parseInt(parts[0], 10);
      var the_month = parseInt(parts[1], 10);
      var the_day = parseInt(parts[2], 10);

      if(
         (the_day > 0) && (the_day < 32) &&
         (the_month > 0) && (the_month < 13) &&
         (parts[0].length == 2) &&
         (parts[1].length == 2) &&
         (parts[2].length == 4)
      ){
         is_falid = true;
      }else{
         is_valid = false;
      }

   }

	return is_valid;

}//is_valid_usa_date

/*
   Is it a vaild Estonian date (DD.MM.YYY)
*/
function is_valid_est_date(the_field)
{
	var is_valid = true;
   var parts = the_field.split(".");

   is_valid = (parts.length == 3)?true:false;

   // There should be always three parts in a valid date.
   if (is_valid){
      var the_day = parseInt(parts[0], 10);
      var the_month = parseInt(parts[1], 10);
      var the_year = parseInt(parts[2], 10);

      if(
         (the_day > 0) && (the_day < 32) &&
         (the_month > 0) && (the_month < 13) &&
         (parts[0].length == 2) &&
         (parts[1].length == 2) &&
         (parts[2].length == 4)
      ){
         is_falid = true;
      }else{
         is_valid = false;
      }

   }

	return is_valid;

}//is_valid_est_date

/*
   Is it a vaild Estonian date (DD-MM-YYY)
*/
function is_valid_est_date2(the_field)
{
	var is_valid = true;
   var parts = the_field.split("-");

   is_valid = (parts.length == 3)?true:false;

   // There should be always three parts in a valid date.
   if (is_valid){
      var the_day = parseInt(parts[0], 10);
      var the_month = parseInt(parts[1], 10);
      var the_year = parseInt(parts[2], 10);

      if(
         (the_day > 0) && (the_day < 32) &&
         (the_month > 0) && (the_month < 13) &&
         (parts[0].length == 2) &&
         (parts[1].length == 2) &&
         (parts[2].length == 4)
      ){
         is_falid = true;
      }else{
         is_valid = false;
      }

   }

	return is_valid;

}//is_valid_est_date2

/*
   Removes leading and trailing spaces.
*/
function trim(the_field)
{

   // beginning
   var the_ch = the_field.substring(0, 1);
   while (the_ch == " ") {
      the_field = the_field.substring(1, the_field.length);
      the_ch = the_field.substring(0, 1);
   }

   // end
   the_ch = the_field.substring(the_field.length-1, the_field.length);
   while (the_ch == " ") {
      the_field = the_field.substring(0, the_field.length-1);
      the_ch = the_field.substring(the_field.length-1, the_field.length);
   }

   return the_field;

}//trim

/*
   Is it a non-empty string?
*/
function is_filled(the_field)
{
   var result = false;

   if(the_field.length > 0){
      result = true;
   }else{
      result = false;
   }

   return result;

}//is_filled

/*
   Is it a non-empty string or checked checkbox?
*/
function is_filled_or_checked(the_field)
{

   if(the_field.type == 'checkbox'){
      if(the_field.checked == true)
         return true;
   }else{
      if(the_field.value.length > 0)
         return true;
   }

   return false;

}//is_filled_or_checked

/*
   Check if start date is lower than end date.
   It returns false only if start date is greater than
   end date. If date(s) are invalid, it returns true.
   Dates must be given in YYYY-MM-DD format.
*/
function are_usa_dates_correct(start_date, end_date)
{

   // Let's check if start and end dates are correct.
   var is_start_date_correct = is_valid_usa_date(start_date);
   var is_end_date_correct = is_valid_usa_date(end_date);

   if(is_start_date_correct && is_end_date_correct){

      //--- Let's process the start date.
      var parts = start_date.split("-");
      // There should be always three parts in a valid date.
      var sum_num_start; // Result will be put here in YYYYMMDD format.
      if(parts.length == 3){
         var sum_string = parts[0] + parts[1] + parts[2];
         sum_num_start = parseInt(sum_string, 10);
      }else{
         // Start date is not in the right format.
         // It returns false only if start date is greater than end date.
         return true;
      }
      //---------------------------------

      //--- Let's process the end date.
      var parts2 = end_date.split("-");
      // There should be always three parts in a valid date.
      var sum_num_end; // Result will be put here in YYYYMMDD format.
      if(parts2.length == 3){
         var sum_string = parts2[0] + parts2[1] + parts2[2];
         sum_num_end = parseInt(sum_string, 10);
      }else{
         // End date is not in the right format.
         // It returns false only if start date is greater than end date.
         return true;
      }
      //---------------------------------

      //--- Check if end date is greater than start date.
      if( sum_num_end > sum_num_start ){
         return true; // dates OK
      }else{
         return false; // dates not OK
      }
      //---------------------------------

   }else{
      // Dates are not in the right format.
      // It returns false only if start date is greater than end date.
      return true;
   }

   return true;

}//are_usa_dates_correct

/*
   Check if start date is lower than end date.
   It returns false only if start date is greater than
   end date. If date(s) are invalid, it returns true.
   Dates must be given in DD.MM.YYYY format.
*/
function are_est_dates_correct(start_date, end_date)
{

   // Let's check if start and end dates are correct.
   var is_start_date_correct = is_valid_est_date(start_date);
   var is_end_date_correct = is_valid_est_date(end_date);

   if(is_start_date_correct && is_end_date_correct){

      //--- Let's process the start date.
      var parts = start_date.split(".");
      // There should be always three parts in a valid date.
      var sum_num_start; // Result will be put here in YYYYMMDD format.
      if(parts.length == 3){
         var sum_string = parts[2] + parts[1] + parts[0];
         sum_num_start = parseInt(sum_string, 10);
      }else{
         // Start date is not in the right format.
         // It returns false only if start date is greater than end date.
         return true;
      }
      //---------------------------------

      //--- Let's process the end date.
      var parts2 = end_date.split(".");
      // There should be always three parts in a valid date.
      var sum_num_end; // Result will be put here in YYYYMMDD format.
      if(parts2.length == 3){
         var sum_string = parts2[2] + parts2[1] + parts2[0];
         sum_num_end = parseInt(sum_string, 10);
      }else{
         // End date is not in the right format.
         // It returns false only if start date is greater than end date.
         return true;
      }
      //---------------------------------

      //--- Check if end date is greater than start date.
      if( sum_num_end > sum_num_start ){
         return true; // dates OK
      }else{
         return false; // dates not OK
      }
      //---------------------------------

   }else{
      // Dates are not in the right format.
      // It returns false only if start date is greater than end date.
      return true;
   }

   return true;

}//are_est_dates_correct

/*
   Check if start date is lower than end date.
   It returns false only if start date is greater than
   end date. If date(s) are invalid, it returns true.
   Dates must be given in DD-MM-YYYY format.
*/
function are_est_dates_correct2(start_date, end_date)
{

   // Let's check if start and end dates are correct.
   var is_start_date_correct = is_valid_est_date2(start_date);
   var is_end_date_correct = is_valid_est_date2(end_date);

   if(is_start_date_correct && is_end_date_correct){

      //--- Let's process the start date.
      var parts = start_date.split("-");
      // There should be always three parts in a valid date.
      var sum_num_start; // Result will be put here in YYYYMMDD format.
      if(parts.length == 3){
         var sum_string = parts[2] + parts[1] + parts[0];
         sum_num_start = parseInt(sum_string, 10);
      }else{
         // Start date is not in the right format.
         // It returns false only if start date is greater than end date.
         return true;
      }
      //---------------------------------

      //--- Let's process the end date.
      var parts2 = end_date.split("-");
      // There should be always three parts in a valid date.
      var sum_num_end; // Result will be put here in YYYYMMDD format.
      if(parts2.length == 3){
         var sum_string = parts2[2] + parts2[1] + parts2[0];
         sum_num_end = parseInt(sum_string, 10);
      }else{
         // End date is not in the right format.
         // It returns false only if start date is greater than end date.
         return true;
      }
      //---------------------------------

      //--- Check if end date is greater than start date.
      if( sum_num_end > sum_num_start ){
         return true; // dates OK
      }else{
         return false; // dates not OK
      }
      //---------------------------------

   }else{
      // Dates are not in the right format.
      // It returns false only if start date is greater than end date.
      return true;
   }

   return true;

}//are_est_dates_correct2

/*
   Is integer (empty field is also true)?
   Spaces between numbers will not affect
   evaluation.
*/
function is_integer(integer)
{

   integer = integer.replace(/ /g, "");

   if( (integer > 0) || (integer.length == 0) || (integer == "0") ){
      return true;
   }else{
      return false;
   }

}//is_integer

/*
   Displays errors on alert popup.
   intro: introduction text;
   errors error array;
*/
function display_errors(intro, errors)
{
   if(errors.length > 0){
      var error_string = "";
      var i;
      for(i = 0; i < errors.length; i++){
         error_string += "* " + errors[i] + "\n";
      }
      alert(intro + error_string);
   }

}//display_errors

/* ----------------------------------------
   FORM FIELD VALIDATION END
   ---------------------------------------- */
