var global_current_date  = new Date();
var global_current_month = global_current_date.getMonth()+1;
var global_current_day   = global_current_date.getDate();
var global_current_year  = global_current_date.getFullYear();

var possible_yes         = new Array();

possible_yes["yes"]      = true;
possible_yes["Yes"]      = true;
possible_yes["Y"]        = true;
possible_yes["y"]        = true;
possible_yes["1"]        = true;
possible_yes["true"]     = true;
possible_yes["True"]     = true;
possible_yes["on"]       = true;

/*
 *util functions
 *
 *isNullorEmpty :: check for empty or null values
 *trim :: remove white space
 *showHide:: hide or show hidden fields passing switch state and id
 *isDefined :: checks if id/field exists
 */
//test if null or empty
function isNullOrEmpty(id){
    return (  (trim($F(id)) == null || trim($F(id)) == '') && isDefined(id)  )
}

function trim (str){
    return str.replace(/^\s+/, '');
}

function showHide(trigger_value, hidden_id){
    if(possible_yes[trigger_value.value]){
        $(hidden_id).style.display = '';
    }else{
        $(hidden_id).style.display = 'none';
    }
}

function isDefined(id){
    if($(id) == null){
        if(document.getElementsByName(id).length == 0)
            return false;
    }else{
        return true;
    }

}

function fadeIn(id){
    if(isDefined(id)){
        new Effect.Appear(id);
    }
}

function fadeOut(id){
    if(isDefined(id)){
        new Effect.Fade(id);
    }
}

function clearInputField(id){
    if(isDefined(id)){
        $(id).value="";
    }
}

function clearErrorMessage(id){
    if(isDefined(id)){
        $(id).innerHTML="";
    }
}

function isValidLength(id,error_id, length_required){
    var is_valid  = true;
    var error_msg = '\nPlease enter a valid length.';
    if(isDefined(id) && isDefined(error_id)){
        if ($(id).value.length != length_required ){
            $(error_id).innerHTML = error_msg;
            fadeIn(error_id);
            is_valid = false;
        }
    }
    return is_valid;
}

function isValidSelection(id,error_id){
    var is_valid = true;
    if(isDefined(id) && isDefined(error_id)){
        if ( $(id).value == "" ){
        $(error_id).innerHTML = '\nThis is a required field.';
            fadeIn(error_id);
            is_valid = false;
        }
    }
    return is_valid;
}

function isChecked(error_id){
    var is_valid = true;
    if(isDefined(error_id) ){
      var parent   = $(error_id).parentNode;
      var cali     = parent.getElementsByTagName('INPUT');
      if ( cali.length > 0 && !cali[0].checked && !cali[1].checked  ){
        $(error_id).innerHTML = '\nPlease select one of the above options.';
        fadeIn(error_id);
        is_valid = false;
      }
    }
    return is_valid;
}

function unChecked(error_id){
    var is_valid = true;
    if(isDefined(error_id) ){
      var parent   = $(error_id).parentNode;
      var checkbox = parent.getElementsByTagName('INPUT');
      checkbox[0].checked = false;
      checkbox[1].checked = false;
    }
    return is_valid;
}

function isEmptyInput(id,error_id){
    var is_empty = false;
    if(isDefined(id) && isDefined(error_id)){
        if ( isNullOrEmpty(id)   ){
            is_empty = true;
            $(error_id).innerHTML = '\nThis is a required field.';
            fadeIn(error_id);
        }
    }
    return is_empty;
}

function isValidNumber(id,error_id){
    var is_valid = true;
    if(isDefined(id) && isDefined(error_id)){
        if ( isNaN(  trim($(id).value)  )   ){
        $(error_id).innerHTML = '\nThis is a numeric field.';
            fadeIn(error_id);
            is_valid = false;
        }
    }
    return is_valid;
}

function isValidRequiredAlphaInput(id,error_id){
    var is_valid = true;
    if(isDefined(id) && isDefined(error_id)){
        if (isEmptyInput(id,error_id)){
            $(error_id).innerHTML = '\nThis is a required field.';
            fadeIn(error_id);
            is_valid = false;
        }else if ( !/^[\D]+$/.test( (trim($(id).value)) )  ){
            $(error_id).innerHTML = '\nPlease use letters only (a-z).';
            fadeIn(error_id);
            is_valid = false;
        }
    }
    return is_valid;
}

function isValidDateRange(year1,month1,day1,year2,month2,day2){
    return( new Date(year1,month1-1,day1) < new Date(year2,month2-1,day2));
}

/*******************************************************************************
 *custom scripts
 *
 */
function isValidZip(zip, error_id){
    var is_valid   = true;
    var zip_length = 5;
    if(isDefined(zip) && isDefined(error_id)){
        if (isEmptyInput(zip,error_id)){
            is_valid = false;
        }
        if(is_valid){
            if(isNaN($F(zip))){
                $(error_id).innerHTML = '\nPlease enter a valid zip code.';
                fadeIn(error_id);
                is_valid = false;
            }
        }
        if(is_valid){
            if(!isValidLength(zip,error_id,zip_length)){
                is_valid = false;
            }
        }
    }
    return is_valid;
}

function isValidEmail(error_id){
      var is_valid = true;
      // validate email
      if( isDefined(error_id)  ){
        var parent_node = $(error_id).parentNode;
        var email_field = parent_node.getElementsByTagName('INPUT');
        if(email_field.length > 0){
          var email     = email_field[0].id;
          if (isNullOrEmpty(email)  ){
              $(error_id).innerHTML = '\nPlease enter your email address.';
              fadeIn(error_id);
              is_valid = false;
          }else if (!/^([A-Z0-9]+[._]?){1,}[A-Z0-9-]+\@(([A-Z0-9]+[-]?){1,}[A-Z0-9]+\.){1,}([A-Z]{2,4}|museum)$/i.test($F(email))){
              $(error_id).innerHTML = '\nPlease enter a valid email address.';
              fadeIn(error_id);
              is_valid = false;
          }
        }
      }
      return is_valid;
}

function isValidPhone(error_id){
    var is_valid     = true;
    if(  isDefined(error_id)  ){
        var parent_node  = $(error_id).parentNode;
        var phone_fields = parent_node.getElementsByTagName('INPUT');
      
        if(  !/^[2-9][0-8][0-9]$/.test($F(phone_fields[0])) || 
             !/^[2-9][0-9][0-9]$/.test($F(phone_fields[1])) || 
             !/^[0-9][0-9][0-9][0-9]$/.test($F(phone_fields[2]))  ){
          is_valid = false;
          $(error_id).innerHTML = "\nPlease enter a valid phone number.";
          fadeIn(error_id);
        }
    }
    return is_valid;
}

function isWeekend(yyyy,mm,dd){
  d = new Date(yyyy,mm-1,dd);
  return (d.getDay() == 0 || d.getDay() == 6)
}

function isBarelyLegal(error_id){
  var is_valid       = true;
  var parent_node    = $(error_id).parentNode;
  var date_fields    = parent_node.getElementsByTagName('SELECT');
  if(date_fields.length == 0){
    var date_fields  = parent_node.getElementsByTagName('INPUT');
  }
  var dob1_yyyy_on   = date_fields[2].value;
  
  if(((new Date().getFullYear() - parseInt(dob1_yyyy_on,10)) < 18)){
    $(error_id).innerHTML = "\nYou must be 18 year or older.";
    $(error_id).show();
    is_valid = false;
  }
  return is_valid;
}

/*function(s) with fadeouts
 *
 */
function isValidDate(error_id){
    var is_valid       = true;
    if(isDefined(error_id)){      
      //error msgs        
      var error_msg_mm   = '\nPlease select a valid month.';
      var error_msg_dd   = '\nPlease select a valid day.';
      var error_msg_yyyy = '\nPlease select a valid year.';
      var error_msg_valid= '\nPlease select a valid date.';
      
      var parent_node    = $(error_id).parentNode;
      var date_fields    = parent_node.getElementsByTagName('SELECT');
      
      if(date_fields.length == 0){
        var date_fields  = parent_node.getElementsByTagName('INPUT');
        error_msg_mm     = '\nPlease enter a valid month.';
        error_msg_dd     = '\nPlease enter a valid day.';
        error_msg_yyyy   = '\nPlease enter a valid year.';
        error_msg_valid  = '\nPlease enter a valid date.';
      }
      if(  date_fields.length == 3  ){
        var id_mm   = date_fields[0].id;
        var id_dd   = date_fields[1].id;
        var id_yyyy = date_fields[2].id;
      
        if(isDefined(id_mm) && isDefined(id_dd) && isDefined(id_yyyy) && isDefined(error_id)){
          if(is_valid){
              if ( isNullOrEmpty(id_mm) ){
                  $(error_id).innerHTML = error_msg_mm;
                  fadeIn(error_id);
                  is_valid = false;
              }else if( isNaN($(id_mm).value) ){
                  $(error_id).innerHTML = error_msg_mm;
                  fadeIn(error_id);
                  is_valid = false;
              }else if(  !(($(id_mm).value) <= 12 && ($(id_mm).value) >= 1)  ){
                  $(error_id).innerHTML = error_msg_mm;
                  fadeIn(error_id);
                  is_valid = false;
              }
          }
          if(is_valid){
              if (  isNullOrEmpty(id_dd)  ){
                  $(error_id).innerHTML = error_msg_dd;
                  fadeIn(error_id);
                  is_valid = false;
              }else if( isNaN($(id_dd).value) ){
                  $(error_id).innerHTML = error_msg_dd;
                  fadeIn(error_id);
                  is_valid = false;
              }else if(!($(id_dd).value <= 31 && $(id_dd).value >= 1) ){
                  $(error_id).innerHTML = error_msg_dd;
                  fadeIn(error_id);
                  is_valid = false;
              }
          }
          if(is_valid){
              if (  isNullOrEmpty(id_yyyy)  ){
                  $(error_id).innerHTML = error_msg_yyyy;
                  fadeIn(error_id);
                  is_valid = false;
              }else if( isNaN($(id_yyyy).value) ){
        	        $(error_id).innerHTML = error_msg_yyyy;
                  fadeIn(error_id);
                  is_valid = false;
              }else if(($(id_yyyy).value).length < 4){
                  $(error_id).innerHTML = error_msg_yyyy;
                  fadeIn(error_id);
                  is_valid = false;
              }else if($(id_yyyy).value > (parseInt(global_current_year)) || $(id_yyyy).value < (parseInt(global_current_year)-100)){
                  $(error_id).innerHTML = error_msg_yyyy;
                  fadeIn(error_id);
                  is_valid = false;
              }
          }
        	//validate if it is a valid date (day is in the month)
          if(is_valid){
              var new_date = new Date();
              var this_mm  = $F(id_mm) - 1;
              new_date.setFullYear( $F(id_yyyy), this_mm, $F(id_dd) );
            	if ( new_date.getMonth() != this_mm ) {
                $(error_id).innerHTML = error_msg_valid;
                fadeIn(error_id);
            	  is_valid = false;
            	}
          }
        }
      }
    }
    return is_valid;
}

function validate_fields(){
    var is_valid        = true;
    var form_fields     = $("loanform").parentNode;
    var required_fields = form_fields.getElementsByClassName("validate");
    var alpha_fields    = form_fields.getElementsByClassName("validate-alpha");
    var number_fields   = form_fields.getElementsByClassName("validate-number");
    var phone_numbers   = form_fields.getElementsByClassName("validate-phone");
    var birthdays       = form_fields.getElementsByClassName("validate-dob");
    var email           = form_fields.getElementsByClassName("validate-email");
    var append_error    = "_error";
    var error_id        = "";
    
    for(i=0; i < alpha_fields.length; i++){
      error_id = alpha_fields[i].id + append_error;
      if(  !isValidRequiredAlphaInput(alpha_fields[i].id,error_id)  ){
        is_valid = false;
      }else{
        fadeOut(error_id);
      }
    } 
    for(i=0; i < number_fields.length; i++){
        error_id = number_fields[i].id + append_error;
          if(  isEmptyInput(number_fields[i].id,error_id)  ){
            is_valid = false;
          }else{
            if(  !isValidNumber(number_fields[i].id,error_id)  ){
              is_valid = false;
            }else{
              fadeOut(error_id);
            }
          }
    } 
    for(i=0; i < required_fields.length; i++){
        error_id = required_fields[i].id + append_error;
        if(required_fields[i].length > 0){
          if(  !isValidSelection(required_fields[i].id,error_id)  ){
            is_valid = false;
          }else{
            fadeOut(error_id);
          }
        }else{
          if(  isEmptyInput(required_fields[i].id,error_id)  ){
            is_valid = false;
          }else{
            fadeOut(error_id);
          }
        }
    }   
  /***************************************************************************
   *validate phone numbers
   *work in progress...can't seem to iterate in a loop
   */
    if(phone_numbers.length != 0){
      if( !isValidPhone(  phone_numbers[0].id  )  ){
        is_valid = false;
      }else{
        fadeOut(phone_numbers[0].id);
      }
      if( phone_numbers.length == 2  ){
        if( !isValidPhone(  phone_numbers[1].id  )  ){
          is_valid = false;
        }else{
          fadeOut(phone_numbers[1].id);
        }
      }
      if( phone_numbers.length == 3  ){
        if( !isValidPhone(  phone_numbers[1].id  )  ){
          is_valid = false;
        }else{
          fadeOut(phone_numbers[1].id);
        }
        if( !isValidPhone(  phone_numbers[2].id  )  ){
          is_valid = false;
        }else{
          fadeOut(phone_numbers[2].id);
        }
      }
    }
  /***************************************************************************
   *validate email
   */
    if(  email.length > 0  ){
      if( !isValidEmail(email[0].id)  ){
        is_valid = false;
      }else{
        fadeOut(email[0].id);
      }
    }
  /***************************************************************************
   *validate birthday
   */
    if(birthdays.length != 0){
      if(!isValidDate(  birthdays[0].id  )  ){
        is_valid = false;
      }
      if(is_valid){
        if(!isBarelyLegal(  birthdays[0].id  )){
          is_valid = false;
        }
      }
      if(is_valid){
        fadeOut(birthdays[0].id);
      }
    }
    
  /***************************************************************************
   *custom scripts for landing
   *validate ssn
   *validate paydates
   *california agreement
   */
    var ssn = form_fields.getElementsByClassName("validate-ssn");
    if(  ssn.length > 0  ){
      if(  isDefined(ssn[0].id)  ){
        if(  !isValidSSN(ssn[0].id)  ){
          is_valid = false;
        }else{
          fadeOut(ssn[0].id);
        }
      }
    }
    
  /***************************************************************************
   *validate paydates
   */
    var paydates          = form_fields.getElementsByClassName("validate-paydate");
    var is_valid_paydate1 = true;
    var is_valid_paydate2 = true;
    if(paydates.length == 2){
      if(  isDefined(paydates[0].id)  ){
        is_valid_paydate1 = isValidDate( paydates[0].id  );
        if(is_valid_paydate1){
          if( !isCurrentDate( paydates[0].id  )  ){
            is_valid_paydate1 = false;
          }
        }  
      }   
      if(  isDefined(paydates[1].id)  ){
        is_valid_paydate2 = isValidDate( paydates[1].id  );
        if(is_valid_paydate2){
          if( !isCurrentDate( paydates[1].id  )  ){
            is_valid_paydate2 = false;
          }
        }
      }      
      //validate if first paydate is before laste paydate 
      if(is_valid_paydate1 && is_valid_paydate2){
        if(!isFutureDate(  paydates[0].id, paydates[1].id  )  ){
          fadeIn(paydates[0].id);
          fadeIn(paydates[1].id);
          is_valid = false;
        }else{
          fadeOut(paydates[0].id);
          fadeOut(paydates[1].id);
        }
      }else{
        if(is_valid_paydate1){
          fadeOut(paydates[0].id);
        }else{
          is_valid = false;
        } 
        if(is_valid_paydate2){
          fadeOut(paydates[1].id);
        }else{
          is_valid = false;
        }
      } 
    }  
  /***************************************************************************
   *validate aba routing number
   */
    var aba_number = form_fields.getElementsByClassName("validate-aba");
    if(aba_number.length > 0){
      if( !isValidABA(aba_number[0].id) ){
        is_valid = false;
      }else{
        fadeOut(aba_number[0].id);
      } 
    }
    
    if(californiaAgreement()){
      if(is_valid){
        is_valid = false;  //change is valid to false if everything is true
      }
    }
  return is_valid; // <--validate_fields return
}	

  /******************************Custom Scripts********************************/  
   /***************************************************************************
   *validate california agreement
   */
  function californiaAgreement(){
    var is_cali = false;
    var form_fields = $('loanform').parentNode;
    if(  $('ca_agreement_error') != undefined  ){
      var ca_agreement = form_fields.getElementsByClassName("validate-ca-agreement");
      if(  isDefined($('address1_state'))  ){
        if(  /(ca)/i.test($('address1_state').value)  ){
          if(  isDefined($('cali_consent'))  ){
            $('cali_consent').show();
            if(  isChecked($('ca_agreement_error'))  ){
              clearErrorMessage('ca_agreement_error');
            }else{
              fadeIn('ca_agreement_error');
              is_cali = true
            }              
          }else{
            unChecked('ca_agreement_error');
            clearErrorMessage('ca_agreement_error');
            $('cali_consent').style.display = "none";
          }
        }else{
            unChecked('ca_agreement_error');
            clearErrorMessage('ca_agreement_error');
            $('cali_consent').style.display = "none";
        }
      }
    }
    return is_cali;
  }
    
  /***************************************************************************
   *isValidSSN(error_id)
   *returns true : false
   *uses isEmptyInput
   *isValidNumber
   *isValidLength
   */
    function isValidSSN(error_id){
      var is_valid = true;
      if( isDefined(error_id)  ){
        var parent_node = $(error_id).parentNode;
        var ssn_fields  = parent_node.getElementsByTagName('INPUT');
        if(ssn_fields.length == 3){
          if(  isEmptyInput(ssn_fields[0].id, error_id)  ){
            is_valid = false;
          }
          if(is_valid){
            if(  !isValidNumber(ssn_fields[0].id, error_id)  ){
              is_valid = false;
            }
          }
          if(  isEmptyInput(ssn_fields[1].id, error_id)  ){
            is_valid = false;
          }
          if(is_valid){
            if(  !isValidNumber(ssn_fields[1].id, error_id)  ){
              is_valid = false;
            }
          }
          if(  isEmptyInput(ssn_fields[2].id, error_id)  ){
            is_valid = false;
          }
          if(is_valid){
            if(  !isValidNumber(ssn_fields[2].id, error_id)  ){
              is_valid = false;
            }
          }
          if(is_valid){
            if(  !isValidLength(ssn_fields[0].id, error_id,3)  ){
              is_valid = false;
            }
          }
          if(is_valid){
            if(  !isValidLength(ssn_fields[1].id, error_id,2)  ){
              is_valid = false;
            }
          }
          if(is_valid){
            if(  !isValidLength(ssn_fields[2].id, error_id,4)  ){
              is_valid = false;
            }
          }
        }        
      } 
      return is_valid; 
    }
    
  function isFutureDate(error1_id, error2_id){
    var is_valid = true;
    /* This expects mm dd yyyy as the order of select tags */
    if(  isDefined(error1_id) && isDefined(error2_id)  ){
      var parent1_node   = $(error1_id).parentNode;
      var date1_fields   = parent1_node.getElementsByTagName('SELECT');
      
      var parent2_node   = $(error2_id).parentNode;
      var date2_fields   = parent2_node.getElementsByTagName('SELECT');
      var error1_msg     = '\nNext Paydate 1 must be before Next Paydate 2.';        
      var error2_msg     = '\nNext Paydate 2 must be after Next Paydate 1.';  
      
      if(date1_fields.length == 0){
        var date1_fields = parent1_node.getElementsByTagName('INPUT');
      }
      if(date2_fields.length == 0){
        var date2_fields = parent2_node.getElementsByTagName('INPUT');
      }
      if(date1_fields.length == 3 && date2_fields.length == 3){
      	//validate if it is a valid date (day is in the month)
        var this_mm        = parseInt(date1_fields[0].value,10) - 1;
        var this_dd        = parseInt(date1_fields[1].value,10);
        var this_yyyy      = parseInt(date1_fields[2].value,10);
                
        var next_mm        = parseInt(date2_fields[0].value,10) - 1;
        var next_dd        = parseInt(date2_fields[1].value,10);
        var next_yyyy      = parseInt(date2_fields[2].value,10);

        if( new Date(this_yyyy,this_mm,this_dd) > new Date(next_yyyy,next_mm,next_dd)  ){
          is_valid = false;
          $(error1_id).innerHTML = error1_msg;
          $(error2_id).innerHTML = error2_msg;
        }
      }
    }
    return is_valid;
  }
  
  function isCurrentDate(error_id){
    var is_valid = true;
    if(  isDefined(error_id)  ){
      var parent_node   = $(error_id).parentNode;
      var date_fields   = parent_node.getElementsByTagName('SELECT');

      if(date_fields.length == 0){
        var date_fields = parent_node.getElementsByTagName('INPUT');
      }
      if(date_fields.length == 3){
      	//validate if it is a valid date (day is in the month)
        var this_mm    = parseInt(date_fields[0].value,10) - 1;
        var this_dd    = parseInt(date_fields[1].value,10);
        var this_yyyy  = parseInt(date_fields[2].value,10);
        if( new Date(this_yyyy,this_mm,this_dd) < new Date()  ){
          is_valid = false;
          $(error_id).innerHTML = "\nPlease select a current or future date.";
          fadeIn(error_id);
        }
      }
    }
    return is_valid;
  }  
  
  function isValidABA(error_id){
    var is_valid = true;
    if(isDefined(error_id)){
      var parent_node   = $(error_id).parentNode;
      var aba_values    = parent_node.getElementsByTagName('INPUT');
      var aba_value     = aba_values[0].value;
      var i, n, t;
      // First, remove any non-numeric characters.  
      t = "";
      for (i = 0; i < aba_value.length; i++) {
        c = parseInt(aba_value.charAt(i), 10);
        if (c >= 0 && c <= 9)
          t = t + c;
      }    
      // Check the length, it should be nine digits.
      if (t.length != 9){
        is_valid = false;
      }    
      // Now run through each digit and calculate the total.
      n = 0;
      for (i = 0; i < t.length; i += 3) {
        n += parseInt(t.charAt(i),     10) * 3
          +  parseInt(t.charAt(i + 1), 10) * 7
          +  parseInt(t.charAt(i + 2), 10);
      }    
      // If the resulting sum is an even multiple of ten (but not zero),
      // the aba routing number is good.
      if (n != 0 && n % 10 == 0){
        is_valid = true;
      }else{
        is_valid = false;
      }
    }
    if(!is_valid){
      $(error_id).innerHTML = "Please enter a valid ABA\Routing number.";
      fadeIn(error_id);
    }
    return is_valid;
  }
