var validator ;
var refDate = new Object();

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

$('#datee2AA').focus(function(){
  if (this.selectedIndex == 0)
  {
    this.selectedIndex = this.length - 50;
    setNombreEmprunteur(); // Spécifique en cas de choix de l'année "this.selectedIndex = this.length - 50;"
    addListenerForDate(2);
  }
});


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 initCSFCORE_ADE01()
{
  initValidator();
  initListeners();
  setNombreEmprunteur();
}


function initValidationRules(){
  jQuery.validator.addMethod("dateInvalide1",function(value, element) { 
        return isDateValid(value);
      });
      
  jQuery.validator.addMethod("dateInvalide2",function(value, element) { 
        if(getNbreEmprunter()>1) return isDateValid(value);
        return true;
      });
      
  jQuery.validator.addMethod("dateVide1",function(value, element) { 
        return isDateVide(value);
      });
      
  jQuery.validator.addMethod("dateVide2",function(value, element) { 
        if(getNbreEmprunter()>1) return isDateVide(value);
        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.jcms 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.id + "]").each(
              function(){
                  $(this).addClass(errorClass);
              });
      },
      unhighlight: function(element, errorClass) {
         $(element.form).find("label[for*=" + element.id + "]").removeClass(errorClass);
      },
      submitHandler: function(form) { 
        form.submit();
       },
      rules: {
        nbemprunteur: {
          required: true
        },
        datee1: {
          dateVide1: true,
          dateInvalide1:true
        },
        projete1: {
          required:true
        },
        email: {
          required:true,
          email:true
        },
        montant: {
          required:true,
          digits:true
        },
        duree: {
          required:true,
          digits:true
        }
       },
      messages: {
         nbemprunteur: {
          required: ""
        },
        datee1: {
          dateVide1: errorMessages['datee1'].vide,
          dateInvalide1: errorMessages['datee1'].value
        },
        projete1: {
          required: errorMessages['projete1'].value
        },
        email: {
          required:errorMessages['email'].vide,
          email:errorMessages['email'].value
        },
        montant: {
          required:errorMessages['montant'].vide,
          digits:errorMessages['montant'].value
        },
        duree: {
          required:errorMessages['duree'].vide,
          digits:errorMessages['duree'].value
        }
      }
    });
}


function initListeners(){
  
  // Masquage conditionnel du bloc Emprunteur2 (désactivé)
  if(getNbreEmprunter() < 2 ){
    //bloc.hide();
  } else {
    manageNbrEmprunteur();
  }

  // Listener date
  for(i = 1 ; i <= getNbreEmprunter();i++){
    addListenerForDate(i);
  }
  // Listener nbemprunteur
  addListenerNbEmprunteur();
  // Listener détectant si l'utilisateur saisit les infos de 1 ou 2 emprunteurs
  addListenerEmprunteurs();
  // Gestion de la valeur du Projet de l'emprunteur 2 : doit être identique à Emprunteur 1 si l'utilisateur renseigne un co-emprunteur 
  addListenerTypeProjet();
  
}

function addListenerNbEmprunteur(){
  $("#nbemprunteur").change(function(){
    manageNbrEmprunteur();
  });
}

function addListenerEmprunteurs(){

  /* Champs co-emprunteur
   * Modifie la valeur du champ caché nbemprunteur pour déterminer les traitements lors de la validation du formulaire
   * Si un champ est modifié, appel à la fonction setNombreEmprunteur
   */
  $("#emprunteur2").each(function (){
    $(this).find("input").change(function(){
      setNombreEmprunteur();
    });
    $(this).find("select").change(function(){
      setNombreEmprunteur();
    });
  });
  /* On met le même listener sur Emprunteur1
   * Nécessaire pour les rêgles de gestion sur la correspondance entre les champs Projet à financer des 2 empmrunteurs
   */
  $("#emprunteur1").each(function (){
    $(this).find("input").change(function(){
      setNombreEmprunteur();
    });
    $(this).find("select").change(function(){
      setNombreEmprunteur();
    });
  });
}

/* Champs projet à financer
 * Définit les rêgles de correspondance de ces 2 valeurs
 */
function addListenerTypeProjet(){
  $("#emprunteur1").each(function (){
    $(this).find("select[id='projete1']").change(function(){
      // Le changement de valeur du projete1 se reporte uniquement si projete2 est vide
      if ($("#projete2").val() != "") {
        setProjetEmprunteur2();
      }
    });
  });
  $("#emprunteur2").each(function (){
    $(this).find("select[id='projete2']").change(function(){
      // A partir du moment ou on change la valeur du projete2, celle-ci se reporte dans projete1
      setProjetEmprunteur1();
    });
  });

}

/* Champs projet à financer
 * Fonctions permettant d'avoir la même valeur
 * dans les champs "Projet à financer" pour les 2 emprunteurs 
 */
function setProjetEmprunteur1(){
  // projete1 est toujours égal à projete2 si celui-ci est renseigné
  if ($("#projete2").val() != "") {
    $("#projete1").val($("#projete2 option:selected").val());
  }
}
function setProjetEmprunteur2(){
  // Projet Emprunteur 2 = Projet Emprunteur 1
  $("#projete2").val($("#projete1 option:selected").val());
}


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;
    }
}


/* JCA - Modification de la fonction manageDateRulesValidation existante
 * 
 */
function manageDateRulesValidation(nbrEmprunteur){
    // Ajout des règles de validation du bloc Emprunteur 2 si on a renseigné au moins un champ de ce bloc
    if(nbrEmprunteur > 1){
      $("#datee"+nbrEmprunteur).rules("add", {
         dateVide2: function(){return (getNbreEmprunter()>1);},
         dateInvalide2: function(){return (getNbreEmprunter()>1);},
         messages: {
           dateVide2: errorMessages['datee2'].vide,
           dateInvalide2: errorMessages['datee2'].value
         }
      });
      $("#projete"+nbrEmprunteur).rules("add", {
         required:  function(){return (getNbreEmprunter()>1);},
         messages: {
           required: errorMessages['projete2'].value
         }
      });
    }
    
    // Suppression des règles de validation du bloc Emprunteur 2
    // Si l'utilisateur a commencé à remplir le bloc emprunteur 2 mais remet les champs à vide, on enlève les rêgles de contrôle sur ces champs
    if(nbrEmprunteur < 2){
      $("#datee2").rules("remove","dateVide2");
      $("#datee2").rules("remove","dateInvalide2");
      $("#projete2").rules("remove","required");
      resetFormInput($("#projete2"));
      resetFormInput($("#datee2"));
    }
}


function addListenerForDate(nbrEmprunteur){

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


function manageNbrEmprunteur(){
  // masque ou affiche le bloc emprunteur2
  var nbrEmprunteur = getNbreEmprunter();
  
  addListenerForDate(nbrEmprunteur);
  manageDateRulesValidation(nbrEmprunteur);
  
  $("#emprunteur1 legend:first").text(labelsEmprunteur1[nbrEmprunteur].text);
}


function setNombreEmprunteur(){
  /* Change le contenu du champ caché "nbemprunteur" 
   * Cette valeur est utilisé pour d'afficher 1 ou 2 résultats dans ade02simulationresult
   * La valeur par défaut est 1 et change en fonction des rêgles ci-dessous
   */
  
  var datee2JJ = $("#datee2JJ").val();
  var datee2MM = $("#datee2MM").val();
  var datee2AA = $("#datee2AA").val();
  var projete2 = $("#projete2").val();

  // Si au moins un des champs du bloc Emprunteur 2 est rempli -> nbemprunteur = 2
  if(datee2JJ != "" || datee2MM != "" || datee2AA != "" || projete2 != "") {
    $("#nbemprunteur").val("2");
  }
  // Si tous les champs du bloc Emprunteur 2 sont remplis -> nbemprunteur = 2
  if((datee2JJ != "") && (datee2MM != "") && (datee2AA != "") && (projete2 != "")) {
    $("#nbemprunteur").val("2");
  }
  // Si tous les champs du bloc Emprunteur 2 sont vides -> nbemprunteur = 1
  // Pour le cas où l'utilisateur renseigne une ou plusieurs valeurs du bloc Emprunteur 2, puis décide de ne mettre qu'un seul emprunteur
  if((datee2JJ == "") && (datee2MM == "") && (datee2AA == "") && (projete2 == "")) {
    $("#nbemprunteur").val("1");
  }
  
  // Ajout / Suppression des rêgles de gestion
  manageNbrEmprunteur();
}


function getNbreEmprunter(){
  //var nbrESelected = $("#nbemprunteur option:selected").val();
  var nbrESelected = $("#nbemprunteur").val();
  return nbrESelected;
}


function resetForm(){
  validator.resetForm();
  $("label").removeClass("error");
}

function resetFormInput(element){
  // Supprime le highlight sur les éléments qui n'ont pas passé la validation
  $("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");
  });
}


