var validator ;
var refDate = new Object();
//var flagDateDeNaissanceAA = false;

$('#dateDeNaissanceAA').focus(function(){
  if (this.selectedIndex == 0)
  {
    this.selectedIndex = this.length - 50;
    addListenerForDate("dateDeNaissance");
  }
});


function DateFieldUtil(){
  // dateFormat
  this.separator = '/';
  this.date = new Object();
  this.dateJJ = function (){
    return $("#"+this.field.attr("id")+"JJ option:selected").val();
  };
  this.dateMM = function (){
    return $("#"+this.field.attr("id")+"MM option:selected").val();
  };
  this.dateAA = function (){
    return $("#"+this.field.attr("id")+"AA option:selected").val();
  };
  this.updateDateField = function(){
    this.field.val(this.dateJJ()+this.separator+this.dateMM()+this.separator+this.dateAA());
  };
  this.notEmpty = function(){
    return (this.dateJJ()!= "" 
            && this.dateMM()!= ""
            && this.dateAA()!= "");
  };
  this.setField = function(dateField){
    this.field = dateField;
  };
  this.isActive = true;  
  this.field = 'null';
}


function initAdvancedLoginCSF(){
  initValidator();
  initListeners();
}

function initListeners(){
  addListenerForDate("dateDeNaissance");
}

function resetFormInput(element){
  $("label[for^="+element.attr("id")+"][generated!='true']").each(function(){
    $(this).removeClass("error");
  });
  $("span[id^="+element.attr("id")+"]").each(function(){
    $(this).removeClass("valid");
    $(this).removeClass("error");
  });
}

function resetForm(){
 var errors = validator.numberOfInvalids();
  if(errors){
    validator.resetForm();
    $(".error,.valid").each(function(){
      $(this).removeClass("valid");
      $(this).removeClass("error");
    });
    validator.form();
  }
}

function addListenerForDate(fieldName){

    var blocsDate = "select[id^='"+fieldName+"']";
    var currentDate = fieldName;
    var currentDateInput = $("#"+fieldName);
    var dateUtil = new DateFieldUtil;
    dateUtil.setField(currentDateInput);
    refDate[currentDate] = dateUtil;
    $(blocsDate).each(function(){
        var currentDateField = $(this);
        // selectionner le bon champ JJ, MM ou AA
        currentDateField.change(function(){
          refDate[currentDate].updateDateField();
        });
    });
    refDate[currentDate].updateDateField();
}

function initValidationRules(){
  jQuery.validator.addMethod("dateInvalide",function(value, element) { 
        return isDateValid(value);
      });

  jQuery.validator.addMethod("dateVide",function(value, element) { 
        return isDateVide(value);
      });
            
      jQuery.validator.addMethod("alpha",function(value, element) { 
      return /^[\sa-zA-ZÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ'-]+$/.test(value);
    },errorMessages['alpha'].value);
    
    jQuery.validator.addMethod("adresseEmailErr",function(value, element) { 
      return /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+[a-zA-Z0-9]{2,4}$/.test(value);
    },errorMessages['adresseEmailErr'].value);
    
    jQuery.validator.addMethod("num",function(value, element) { 
      if(value == "") return true;
      return /^[0-9]+$/.test(value);
    },errorMessages['num'].value);
}

function isDateValid(value){
  try{
    if (value != "" && value != "//"){
     var ladate = (value).split("/")
     if ((ladate.length != 3) || isNaN(parseInt(ladate[0])) || isNaN(parseInt(ladate[1])) || isNaN(parseInt(ladate[2]))) return false
     var unedate = new Date(eval(ladate[2]),eval(ladate[1])-1,eval(ladate[0]))
     var annee = unedate.getYear()
     if ((Math.abs(annee)+"").length < 4) annee = annee + 1900
     return ((unedate.getDate() == eval(ladate[0])) && (unedate.getMonth() == eval(ladate[1])-1) && (annee == eval(ladate[2])))
    }
  }catch(e){
    
  }
  return true
}

function isDateVide(value){
    if (value == "" || value == "//"){
      return false;
    }else{
      return true;
    }
}

function initValidator(){
    initValidationRules();
    validator = $("#editForm").validate({
      onfocusout: false,
      validClass:"valid",
      errorClass: "error",
      errorContainer: ".mbox",
      errorLabelContainer: ".mbox .mboxMsg.js",
      wrapper: "p",
      showErrors: function(errorMap, errorList) {
           this.defaultShowErrors();
      },
      invalidHandler:function(form, validator){
        var errors = validator.numberOfInvalids();
        var servletErrors = $(".mbox .mboxMsg p").size();
        var box = $(".mboxError").show();
        if(errors) box.show();
        else box.hide();
      },
      debug:true,
      onkeyup: false,
      highlight: function(element, errorClass) {
        $(element.form).find("label[for=" + element.name + "]").each(
          function(){
              $(this).addClass(errorClass);
          });
        $(element.form).find("#" + element.name + "_picto").each(
          function(){
              $(this).removeClass("valid").addClass(errorClass);
          });
      },
      unhighlight: function(element, errorClass) {
         $(element.form).find("label[for=" + element.name + "]").removeClass(errorClass);
         $(element.form).find("#" + element.name + "_picto").removeClass(errorClass).addClass("valid");
      },
      submitHandler: function(form) { 
        form.submit();
       },
      rules: {
        codePostal:{
          required:true,
          num:true,
          digits:true,
          minlength: 5,
          maxlength: 5
        },
        numeroDeParticulierCSF:{
          digits:true
        },
        dateDeNaissance:{
          dateVide: true,
          dateInvalide:true
        },
        adresseEmail:{
          required:true,
          adresseEmailErr: true
        },
        nom:{
          required:true,
          alpha:true
        },
        prenom:{
          required:true,
          alpha:true
        }
       },
      messages: {
          codePostal:{
            required:errorMessages['codePostal'].value,
            num:errorMessages['codePostalnum'].value,
            minlength: errorMessages['codePostalTaille'].value,
            maxlength: errorMessages['codePostalTaille'].value
          },
          numeroDeParticulierCSF:{
            digits: errorMessages['numeroDeParticulierCSF'].value
          }, 
          dateDeNaissance:{
            dateVide: errorMessages['dateDeNaissance'].vide,
            dateInvalide: errorMessages['dateDeNaissance'].value
          }, 
          adresseEmail:{
            required:errorMessages['adresseEmail'].value,
            emailErr:errorMessages['adresseEmailErr'].value
          },
          nom:{
            required:errorMessages['nom'].value,
            alpha:errorMessages['nomalpha'].value
          },
          prenom:{
            required:errorMessages['prenom'].value,
            alpha:errorMessages['prenomalpha'].value
          }

      }
    });
}