/**
 * Script décrivant la classe benchmark.application.ecommerce.PanierSingleton
 */
/**
 * Définition de l'espace de nommage
 */
if (typeof benchmark == "undefined") var benchmark = {};
if (typeof benchmark.application == "undefined") benchmark.application = {};
if (typeof benchmark.application.ecommerce == "undefined") benchmark.application.ecommerce = {};

/**
 * Classe benchmark.application.ecommerce.PanierSingleton
 *
 * Fonctions :
 * - gestion de l'IHM panier
 * - bind les liens et les input d'une page, exemple :
 * 		<select name="" class="ecommerce_quantite_428" style="width: 40px;"></select>
 * 		<a href="#" class="ecommerce_ajouter" id="428_e3e3d940bed200263777183704777f20_8004370845" title="Ajouter au panier">Ajouter au panier</a>
 *
 * @see benchmark.framework.ihm.ObjPopup
 */
benchmark.application.ecommerce.PanierSingleton = function(){

  /**
  * constantes des types d'action possible sur les inputs
  */
  this.ACTION_AUCUNE				= 1;
  this.ACTION_SELECT_CHANGE		= 2;
  this.ACTION_RADIO_CHANGE		= 3;
  this.ACTION_RADIO_CHANGE_LABEL	= 4;

  /**
   *  Propriétés paramètres
   */
  this.ajax_ajoute_url = ""; //"/cgi/panier/ajout_panier.norevue.php";
  this.ajax_url = ""; //"/cgi/panier/panier.norevue.php";
  this.modifier_url = ""; //"/cgi/commande/commande_modifier.php";
  this.commander_url = ""; //"/cgi/compte/compte_creation.php";
  this.ajax_calcul_frais_de_port = ""; //"/cgi/panier/panier_fraisdeport.norevue.php";

  this.panier_nb_item = 0;
  this.panier_prix_total = 0;
  this.panier_fraisdeport = 0;
  this.panier_fraisdeport_valeur_brute = 0;
  this.panier_contenu = Array;

  this.dom_panier_tetiere = null;

  /**
   * Constantes
   */
  this.loading_img_src = "/framework/lib/objecommercecontroleurpanier/html_include/image/loading.gif";

  /**
   * Modificateurs
   */
  this.setAjaxAjouteUrl = function(val){
    this.ajax_ajoute_url = val;
  };

  this.setAjaxUrl = function(val){
    this.ajax_url = val;
  };

  this.setAjaxCalculFraisdeport = function(val){
    this.ajax_calcul_frais_de_port = val;
  };

  this.setModifierUrl = function(val){
    this.modifier_url = val;
  };

  this.setCommanderUrl = function(val){
    this.commander_url = val;
  };

  /**
   * Accesseurs
   */
  this.getAjaxAjouteUrl = function(){
    return this.ajax_ajoute_url;
  };

  this.getAjaxUrl = function(){
    return this.ajax_url;
  };

  this.getModifierUrl = function(){
    return this.modifier_url;
  };

  this.getCommanderUrl = function(){
    return this.commander_url;
  };

  this.getAjaxCalculFraisdeport = function(){
    return this.ajax_calcul_frais_de_port;
  };

   function Remplace(expr,a,b) {
      var i=0
      while (i!=-1) {
         i=expr.indexOf(a,i);
         if (i>=0) {
            expr=expr.substring(0,i)+b+expr.substring(i+a.length);
            i+=b.length;
         }
      }
      return expr;
   }

  /**
   * Permet d'initialiser la panier sur une page
   * - bind des dom class ecommerce_ajouter
   * 	 ex de <a> qui sera bindé :
   * 			<a href="#" class="ecommerce_ajouter" id="428_b4c9739559910c0af7f794e6f670cd1f_1991349015">+</a>
   * - affichage du panier au dom class ecommerce_panier_colonne
   */
  this.init = function() {

    /* on bind les liens d'ajout au panier */
    $(".ecommerce_ajouter").bind(
      "click",
      function(e) {

        url_controleurajax_ajoute = $(this).attr('f_ajax');

        if(url_controleurajax_ajoute == undefined || url_controleurajax_ajoute == ''){

          var chaineCritere = '';

          // gestion des criteres input (texte et radio et hidden)
          $("input[@class=formulaire_nouveau_critere]").each(function(){

            id_critere = $(this).attr('idcritere');
            type_input = $(this).attr('type');

            valeur_critere = Remplace(this.value,'"',"'");

            if((id_critere > 0) && ((type_input == 'radio' && this.checked) || ((type_input == 'text') && (valeur_critere != ''))|| ((type_input == 'hidden') && (valeur_critere != '')))){

              if(chaineCritere.length > 0){
                chaineCritere = chaineCritere + ',';
              }
              chaineCritere = chaineCritere + '"' + id_critere+'":"' + valeur_critere + '"';
            }
          });
          // gestion des criteres select
          $("select[@class=formulaire_nouveau_critere]").each(function(){

            nom_select = $(this).attr('name');
            position_dernier_underscore = nom_select.lastIndexOf('_');

            id_critere = nom_select.substr(position_dernier_underscore+1);

            valeur_critere = this.options[this.selectedIndex].value;

            if((id_critere > 0) && (id_critere != null) && (id_critere > '') && (valeur_critere > null)){

              if(chaineCritere.length > 0){
                chaineCritere = chaineCritere + ',';
              }
              chaineCritere = chaineCritere + '"' + id_critere+'":"' + valeur_critere + '"';
            }

          });

          if(chaineCritere.length > 0){
            chaineCritere = ',"criteres":{'+chaineCritere+'}';
          }

          var id_array = this.id.split("_");

          // recuperation de la quantite
          quantite = benchmark.application.ecommerce.panier.recupereQuantite(id_array[0]);

          benchmark.application.ecommerce.panier.ajoute('{"quantite":"' + quantite + '","id_produit":"' + id_array[0] + '","flag_personnalisable":"' + id_array[1] + '"' + chaineCritere + '}');

        }
        /* si l url du controleur ajax est sette */
        else{

          var id_array = this.id.split("_");

          // recuperation du mode de livraison
          mode_de_livraison = benchmark.application.ecommerce.panier.recupereModeDeLivraison();

          // recuperation de la quantite
          quantite = benchmark.application.ecommerce.panier.recupereQuantite(id_array[0]);

          benchmark.framework.net.ObjControleurAjax3.appelScriptAction(
              this,
              url_controleurajax_ajoute,
              { // handler sur les événements de la requête Ajax
                // en cas de succes, on ferme la popup
                // TODO gerer ici
                SUCCES: [benchmark.application.ecommerce.panier.traiteRetourAjout],
                COMPLET: ['DEFAUT'],
                AVANT_ENVOI: ['DEFAUT'],
                ERREUR: 'DEFAUT'
              },
              {
                'quantite': quantite,
                'mode_de_livraison' : mode_de_livraison
              }
            );
        }
      }
    );

    /* on charge le panier (seulement si l url est a ete initialise)*/
    if(this.getAjaxUrl() != ""){
      $.post(
          this.getAjaxUrl(),
                  {}, // contenu du post
                  function(data, textStatus){ // callback
                    benchmark.application.ecommerce.panier.refresh(data);
                  },
                  "json"
            );
    }

    /* mise a jour des frais de port (on teste prealablement que l on a l url)*/
    if(this.getAjaxCalculFraisdeport() != ''){
      if(document.getElementById("infoFDP")){
        benchmark.framework.net.ObjControleurAjax3.appelScriptAction(
	      this,
	      this.getAjaxCalculFraisdeport(),
	      { // handler sur les événements de la requête Ajax
	        SUCCES: [benchmark.application.ecommerce.panier.traiteRetourInfoFDP],
	        COMPLET: ['DEFAUT'],
	        AVANT_ENVOI: null,
	        ERREUR: 'DEFAUT'
	      }
	    );
      }
    }

    /* on ajoute une action au demarrage pour controler le panier */
    url_controle_panier = $("#bloc_controlepanier").attr('f_ajax');

    if((url_controle_panier != '') && (url_controle_panier != null) && (url_controle_panier != undefined)){
      benchmark.framework.net.ObjControleurAjax3.appelScriptAction(
        this,
        url_controle_panier,
        { // handler sur les événements de la requête Ajax
          // en cas de succes, on ferme la popup
          SUCCES: [benchmark.application.ecommerce.panier.affichePanierIncompatible],
          COMPLET: ['DEFAUT'],
          AVANT_ENVOI: ['DEFAUT'],
          ERREUR: 'DEFAUT'
        },
        { }
      );
    }


    /*  si l url de maj du total frais de port inclus est presente, on bind le select des quantites
      et les boutons radio du mode de livraison (s ils sont presents)	*/
    var url_ajax_majtotalfdpinclus = $('span[@class=totalfdpinclus]').attr('f_ajax');
    if(url_ajax_majtotalfdpinclus != undefined){

      /* on ajoute une action a chaque changement du select quantite */
      var id_ecommerce_ajouter = $(".ecommerce_ajouter").attr('id');
      var id_array = id_ecommerce_ajouter.split("_");
      id_produit = id_array[0];
      select = $('.ecommerce_quantite_' + id_produit );
      if(select.val() != undefined){
        //select.bind(
        $('.ecommerce_quantite_' + id_produit +':input').bind(
            "change",
            function(e){
              benchmark.application.ecommerce.panier.majTotalFdpInclus(e,url_ajax_majtotalfdpinclus,id_produit,benchmark.application.ecommerce.panier.ACTION_SELECT_CHANGE);
            }
        )
      } /* fin if */


      /* on ajoute une action a chaque changement de bouton radio mode de livraison */
      // on recupere l id de produit relatif au mode de livraison
      id_produit_fraisdeport = $("input[@type=hidden][@name=f_id_produit_fraisdeport]").val();
      if(id_produit_fraisdeport != undefined){
        // on regarde s il y a plusieurs modes de livraison
        //mode_de_livraison_radio = $("input[@type=radio][@name=f_id_mode_de_livraison_"+ id_produit_fraisdeport +"]");
        mode_de_livraison_radio = $("form input[@name=f_id_mode_de_livraison_"+ id_produit_fraisdeport +"]:radio");
        if(mode_de_livraison_radio.val() != undefined){
            $("form input[@name=f_id_mode_de_livraison_"+ id_produit_fraisdeport +"]:radio").bind(
                "click",
                function(e){
                  benchmark.application.ecommerce.panier.majTotalFdpInclus(e,url_ajax_majtotalfdpinclus,id_produit,benchmark.application.ecommerce.panier.ACTION_RADIO_CHANGE);
                }
            )
            $("form span[@class=f_id_mode_de_livraison_"+ id_produit_fraisdeport +"]").bind(
                "click",
                function(e){
                  benchmark.application.ecommerce.panier.majTotalFdpInclus(e,url_ajax_majtotalfdpinclus,id_produit,benchmark.application.ecommerce.panier.ACTION_RADIO_CHANGE_LABEL);
                }
            )
        }
      }

      // on appelle une première fois le script...
      benchmark.application.ecommerce.panier.majTotalFdpInclus(undefined,url_ajax_majtotalfdpinclus,id_produit,benchmark.application.ecommerce.panier.ACTION_AUCUNE);

    }


  };

  /**
   * Methode effectuant la mise a jour des infos relatives aux frais de port
   */
  this.traiteRetourInfoFDP = function(pEvent){
    // si le code retour == 1, cela veut dire cela s est bien passé
    if(pEvent.json.code_retour == 1 || pEvent.json.code_retour == true){
    	$("#infoFDP").empty();
        $("#infoFDP").append(pEvent.json.message_retour);
    }
    else{
    	$("#infoFDP").empty();
    }
  }

  /**
   * Methode qui appel un ajax
   * @param e evenement qui a provoqué l appel
   * @param ajax_majtotalfdpinclus url a appelé
   * @param id_produit identifiant du produit en cours
   * @param action action ayant amené l'evenement
   */
  this.majTotalFdpInclus = function(e,ajax_majtotalfdpinclus,id_produit,action){

    // on met a jour tous les select identique sur la page
    if(action == benchmark.application.ecommerce.panier.ACTION_SELECT_CHANGE){
      $('.ecommerce_quantite_' + id_produit +':input').val(e.target.value);
    }
    // on met a jour tous les boutons radio idientiques de la page
    else if(action == benchmark.application.ecommerce.panier.ACTION_RADIO_CHANGE){
      // [] obligatoire pour que cela selectione bien
      $("form input[@class=f_id_mode_de_livraison_"+ e.target.value +" ]:radio").val([e.target.value]);
    }
    else if(action == benchmark.application.ecommerce.panier.ACTION_RADIO_CHANGE_LABEL){
      var span_clique = $(e.target);
      var parents_span = span_clique.parent();
      var input_associe = parents_span[0].children[0];
      input_associe.click();
    }

    benchmark.framework.net.ObjControleurAjax3.appelScriptAction(
      this,
      ajax_majtotalfdpinclus,
      { // handler sur les événements de la requête Ajax
        // en cas de succes, on ferme la popup
        SUCCES: [benchmark.application.ecommerce.panier.traiteRetourMajTotalFdpInclus],
        COMPLET: ['DEFAUT'],
        AVANT_ENVOI: ['DEFAUT'],
        ERREUR: 'DEFAUT'
      },
      {
        'quantite': benchmark.application.ecommerce.panier.recupereQuantite(id_produit),
        'mode_de_livraison' : benchmark.application.ecommerce.panier.recupereModeDeLivraison()
      }
    );
  }


  /**
   * Methode effectuant la mise a jour du total avec les frais de port inclus
   */
  this.traiteRetourMajTotalFdpInclus = function(pEvent){
    // si le code retour == 1, cela veut dire que le calcul a eu lieu et s est passé correctement
    if(pEvent.json.code_retour == 1 || pEvent.json.code_retour == true){
      $('span[@class=totalfdpinclus]').html(pEvent.json.total.replace(/\./,','));
      $('div[@class=blocajout_totalfdpinclus]').show();
    }
    else{
      $('div[@class=blocajout_totalfdpinclus]').hide();
    }
  }


  /**
   * Methode permettant de recuperer la quantite
   * @param id_produit identifiant du produit
   */
  this.recupereQuantite = function(id_produit){
    var quantite = undefined;
    // on essaye de recuperer d abord avec un select
    quantite = $('.ecommerce_quantite_' + id_produit + ' option:selected').val();
    // sinon, c est un un champ caché
    if(quantite == undefined){
      quantite = $("input[@type=hidden][@name=f_quantite_"+ id_produit +"]").val();
    }
    if(quantite != undefined){
      return quantite;
    }
    else{
      alert('Erreur d\'exécution 1');
    }
  }

  /**
   * methode permettant de recuperer l id produit frais de port
   */
  this.recupereModeDeLivraison = function(){
    var mode_de_livraison = undefined;
    // on recupere l id de produit relatif au mode de livraison
    id_produit_fraisdeport = $("input[@type=hidden][@name=f_id_produit_fraisdeport]").val();
    if(id_produit_fraisdeport != undefined){
      // on regarde s il y a plusieurs modes de livraison
      mode_de_livraison = $("input[@type=radio][@name=f_id_mode_de_livraison_"+ id_produit_fraisdeport +"][@checked]").val();
      if(mode_de_livraison == undefined){
        // on regarde s il n y a qu un seul mode de livraison
        mode_de_livraison = $("input[@type=hidden][@name=f_id_mode_de_livraison_"+ id_produit_fraisdeport +"]").val();
        if(mode_de_livraison == undefined){
          mode_de_livraison = 0;
        }
      }
    }
    else{
      mode_de_livraison = 0;
    }
    return mode_de_livraison;
  }

  this.traiteRetourAjout = function(pEvent){

    // si le code retour == 1, cela veut dire que l ajout panier s est bien passé, on peut directement passé sur la page de commande
    // l url est dans url_commande
    if(pEvent.json.code_retour == 1 || pEvent.json.code_retour == true){
      // on redirige vers la page de commande
      location.href = pEvent.json.url_commande;
    }
  }

  /**
   * Fonction traitant le retour de l appel ajax a propos du controle de panier
   * Si le panier a un probleme (a deja des produits d un panier incompatible avec celui en cours, on affiche le message)
   */
  this.affichePanierIncompatible = function(pEvent) {

    // si le code retour == 1, cela veut dire que le panier est incompatible
    if(pEvent.json.code_retour == 1 || pEvent.json.code_retour == true){

      // on affiche le message si celui ci est présent
      if( pEvent.json.message_retour != undefined ){
        /**
        * on créé si besoin le domaine d'instanciation :
        * on a besoin de garder l'ObjPopup en question dans le scope global pour y acceder d'ailleurs (fermeture interne)
        */
        if(typeof(benchmark.framework.ihm) == "undefined") { benchmark.framework.ihm = new Object(); }
        benchmark.framework.ihm.objPopup = new benchmark.framework.ihm.ObjPopup();

        // on ouvre une popup
        benchmark.framework.ihm.objPopup.ouvreHtml(
          "<p>" + pEvent.json.message_retour + "</p>",
          {
            fermetureMasqueSurClic	: false,
            fermetureAfficheBouton	: false,
            ouvertureAvecAnimation	: false,
            fermetureSurClic		: false,
            masquerFlash			: false
          }
        );

        // Evt sur fermeture
        benchmark.framework.ihm.objPopup.addEventListener(
          benchmark.framework.ihm.objPopup.EVT_ONKEYDOWNFERMER,
              function(pEvent){
                benchmark.framework.net.ObjControleurAjax3.appelScriptAction(
              this,
              $("#lien_vider").attr('f_ajax'),
              {
                /* en cas de succes, on ferme la popup */
                SUCCES:benchmark.framework.util.delegate(benchmark.application.ecommerce.panier,benchmark.application.ecommerce.panier.fermePopup),
                COMPLET: ['DEFAUT'],
                AVANT_ENVOI: ['DEFAUT'],
                ERREUR: 'DEFAUT'
              },
              { }
            );
          }
        );

        // on ajoute une action sur l action de cliquer sur le le lien vider le panier
        $("#lien_vider").click(function(){
          monurl = $(this).attr('f_ajax');
          benchmark.framework.net.ObjControleurAjax3.appelScriptAction(
            this,
            monurl,
            { // handler sur les événements de la requête Ajax
              // en cas de succes, on ferme la popup
              SUCCES:benchmark.framework.util.delegate(benchmark.application.ecommerce.panier,benchmark.application.ecommerce.panier.fermePopup),
              COMPLET: ['DEFAUT'],
              AVANT_ENVOI: ['DEFAUT'],
              ERREUR: 'DEFAUT'
            },
            { }
          );
          return true;
        });

      }
    }
  };

  /**
   * Fonction permettant de fermer la pop up
   */
  this.fermePopup = function() {
    if(typeof(benchmark.execution) == "undefined") { benchmark.execution = new Object(); }
    benchmark.execution.objPopup = new benchmark.framework.ihm.ObjPopup();
    benchmark.execution.objPopup.ferme();
  };

  /**
   * Permet d'ajouter un élément au panier
   *
   * @param string json Chaine JSON
   */
  this.ajoute = function(json) {
    var url_frais_de_port = this.getAjaxCalculFraisdeport();
        $.post(
                this.getAjaxAjouteUrl(),
                {f_configuration: json},
                function(data, textStatus){

	                // mise a jour des frais de port
	                if(document.getElementById("infoFDP")){
	                  $.post(url_frais_de_port,
	                      function(data){
	                	  	// on transforme la chaine retournee en json par un eval
	                	  	  retour_json = eval('(' + data + ')')
	                          $("#infoFDP").empty();
	                          $("#infoFDP").append(retour_json.message_retour);
	                      }
	                  );

	                }

	                /* on raffraichit le panier en retour */
	                  benchmark.application.ecommerce.panier.refresh(data);
                },
                "json"
            );

        return 1;
  };


  /**
   * Methode qui affiche le panier
   */
  this.affichePanier = function(){

    this.dom_panier_tetiere = $("span[@class=mon_panier]");

    benchmark.application.ecommerce.panier.setLoading(true);

    this.dom_panier_tetiere.html(this.CreePanier()).slideDown(100,
        function(){
          /* loading desactive */
          benchmark.application.ecommerce.panier.setLoading(false);
        }
    );

    // on associe une action au lien du h3
    $("a[@id=lien_reduction]").bind(
      "click",
      function(e) {
        benchmark.application.ecommerce.panier.affichePanier();
      }
    );
  };

  /**
   * Gestion du titre du panier (h3)
   */
  this.CreeH3 = function(){
    var titre_panier_html = '';
    titre_panier_html += '<span style=\'float:left;\'>Panier</span>';
    titre_panier_html += '<span style=\'float:right;\'>' + this.panier_nb_item.toString() + " article" + (this.panier_nb_item > 1 ? "s" : "") + ' (' + this.panier_prix_total + ' &euro;)';
    titre_panier_html += '<a href=\'#\' id=\'lien_reduction\' style=\'text-decoration: none; color:#FFF;\'> <img src=\'/lib/objcontroleurpanier/html_include/image/panier_ferme.png\'> </a>';
    titre_panier_html += '</span>';
    return titre_panier_html;
  }

  /**
   * Gestion du contenu du panier
   */
  this.CreePanier = function(){

    var panier_html = 'Panier vide';
    var panier_valeur = 0;
    var panier_valeur_texte = '';

    /* on affiche le nombre de produits et le prix */
    if (!isNaN(this.panier_nb_item) && this.panier_nb_item > 0) {
      panier_html = this.panier_nb_item.toString() + " produit" + (this.panier_nb_item > 1 ? "s" : "") + " : ";
      if (this.panier_prix_total != null) {
        panier_valeur_texte = this.panier_prix_total.toString();
        panier_valeur += parseFloat(panier_valeur_texte.replace(',','.'));
        if ((this.panier_fraisdeport_valeur_brute != null) && (this.panier_fraisdeport_valeur_brute != 0)) {
          panier_valeur_texte = this.panier_fraisdeport_valeur_brute.toString();
          panier_valeur += parseFloat(panier_valeur_texte.replace(',','.'));
        }
        panier_html += panier_valeur.toFixed(2).toString().replace('.',',') + ' &euro;';
        panier_html += '&nbsp;<span>port inclus</span>';
      }
    }

    panier_html = '<a href="' + this.modifier_url + '">' + panier_html + '</a>';

    return panier_html;

  }

  /**
   * Gestion de l'affichage du loading
   */
  this.setLoading = function(active){
    if(active){
      var spanloading = document.createElement('span');
      var loading = document.createElement('img');
      $(loading).attr("class","panier_loading");
      $(loading).attr("src",this.loading_img_src);
      $(loading).css({'margin-bottom' : '-3px' , 'margin-left' : '5px'});//, 'width': '10px', 'height': '10px'});
      $(loading).appendTo($(spanloading));
      $(spanloading).appendTo($("div[@class=panier_colonne]").parent("div").children("h3"));
    }else{
      $("img[@class=panier_loading]").remove();
    }
  };

  /**
   * Raffraichit l'affichage du panier
   *
   * @param string json Chaine JSON
   */
  this.refresh = function(json) {
    if(json == undefined){
      /* pas d'action à réaliser */
      return;

    }else{
      /* si un message est retourné alors on l'affiche en popup */
      if( json.message_retour != undefined ){
        /**
        * on créé si besoin le domaine d'instanciation :
        * on a besoin de garder l'ObjPopup en question dans le scope global pour y acceder d'ailleurs (fermeture interne)
        */
        if(typeof(benchmark.execution) == "undefined") { benchmark.execution = new Object(); }
        benchmark.execution.objPopup = new benchmark.framework.ihm.ObjPopup();

        benchmark.execution.objPopup.ouvreHtml(
          "<p>" + json.message_retour + "</p>",
          {
			hauteur : 100,
			largeur : 240,
            fermetureMasqueSurClic	: false,
            fermetureAfficheBouton	: true,
            ouvertureAvecAnimation	: false,
            fermetureSurClic		: false,
            masquerFlash		: false
          }
        );
      }

      /* traitement spécifique au panier */
      this.panier_nb_item				= Number(json.panier_nb_item);
      this.panier_prix_total				= json.panier_prix_total;
      this.panier_contenu				= json.panier_contenu;
      this.panier_fraisdeport				= json.panier_fraisdeport;
      this.panier_fraisdeport_valeur_brute	= json.panier_fraisdeport_valeur_brute;

      // recuperation
      if(json.message_retour_critere != undefined && json.message_retour_critere != ''){
    	  if(json.code_retour == 1){
	    	  if($("#liste_criteres").attr('id') == "liste_criteres"){
	    		  //$("#liste_criteres").replaceWith(json.message_retour_critere);
	    		  $("#liste_criteres img").remove();
	    		  // si le "libelle_telecharger" existe, on le remontre
	    		  $('#libelle_telecharger').show();
	    	  }
    	  }
    	  else{
    		  alert(json.message_retour_critere);
    	  }
      }

      this.affichePanier();

    }
  };
}

/**
 * Initialisation
 *
 * On utilise le runOnLoad de David Flanagan qui attend vraiment que la page soit loadée.
 * Ce mécanisme est plus efficace que le ready $(function($){} de jQuery, avec lequel nous
 * avions un pb avec le cache de IE6.
 * Conséquence : les paramètre du controleur n'avaient pas le temps d'être lus.
 *
 * 1 - nous embarquons runOnLoad.
 * 2 - nous procédons à l'initialisation du panier
 *
 * @todo Retrouver cohérence avec le framework concernant le on load.
 */

/**
 * runOnLoad.js: portable registration for onload event handlers.
 *
 * This module defines a single runOnLoad() function for portably registering
 * functions that can be safely invoked only when the document is fully loaded
 * and the DOM is available.
 *
 * Functions registered with runOnLoad() will not be passed any arguments when
 * invoked. They will not be invoked as a method of any meaningful object, and
 * the this keyword should not be used.  Functions registered with runOnLoad()
 * will be invoked in the order in which they were registered.  There is no
 * way to deregister a function once it has been passed to runOnLoad().
 *
 * In old browsers that do not support addEventListener() or attachEvent(),
 * this function relies on the DOM Level 0 window.onload property and will not
 * work correctly when used in documents that set the onload attribute
 * of their <body> or <frameset> tags.
 */
function runOnLoad(f) {
    if (runOnLoad.loaded) f();    // If already loaded, just invoke f() now.
    else runOnLoad.funcs.push(f); // Otherwise, store it for later
}

runOnLoad.funcs = []; // The array of functions to call when the document loads
runOnLoad.loaded = false; // The functions have not been run yet.

// Run all registered functions in the order in which they were registered.
// It is safe to call runOnLoad.run() more than once: invocations after the
// first do nothing. It is safe for an initialization function to call
// runOnLoad() to register another function.
runOnLoad.run = function() {
    if (runOnLoad.loaded) return;  // If we've already run, do nothing

    for(var i = 0; i < runOnLoad.funcs.length; i++) {
        try { runOnLoad.funcs[i](); }
        catch(e) { /* An exception in one function shouldn't stop the rest */ }
    }

    runOnLoad.loaded = true; // Remember that we've already run once.
    delete runOnLoad.funcs;  // But don't remember the functions themselves.
    delete runOnLoad.run;    // And forget about this function too!
};

// Register runOnLoad.run() as the onload event handler for the window
if (window.addEventListener)
    window.addEventListener("load", runOnLoad.run, false);
else if (window.attachEvent) window.attachEvent("onload", runOnLoad.run);
else window.onload = runOnLoad.run;

/**
 * Initialisation du panier
 */
$(document).ready(
    function() {
      benchmark.application.ecommerce.panier = new benchmark.application.ecommerce.PanierSingleton();
      if(	typeof benchmark_application_ecommerce_panier_ajax_url == "undefined" ) {
        benchmark_application_ecommerce_panier_ajax_url = "";
      }
      if(typeof benchmark_application_ecommerce_panier_commander_url == "undefined" ) {
        benchmark_application_ecommerce_panier_commander_url = "";
      }
      if(typeof benchmark_application_ecommerce_panier_modifier_url == "undefined" ) {
        benchmark_application_ecommerce_panier_modifier_url = "";
      }
      if(typeof benchmark_application_ecommerce_panier_ajax_ajoute_url == "undefined") {
        benchmark_application_ecommerce_panier_ajax_ajoute_url = "";
      }

	  if(typeof benchmark_application_ecommerce_panier_ajax_calcul_fraisdeport == "undefined") {
		benchmark_application_ecommerce_panier_ajax_calcul_fraisdeport = "";
	  }

      benchmark.application.ecommerce.panier.setAjaxUrl(benchmark_application_ecommerce_panier_ajax_url);
      benchmark.application.ecommerce.panier.setCommanderUrl(benchmark_application_ecommerce_panier_commander_url);
      benchmark.application.ecommerce.panier.setModifierUrl(benchmark_application_ecommerce_panier_modifier_url);
      benchmark.application.ecommerce.panier.setAjaxAjouteUrl(benchmark_application_ecommerce_panier_ajax_ajoute_url);
      benchmark.application.ecommerce.panier.setAjaxCalculFraisdeport(benchmark_application_ecommerce_panier_ajax_calcul_fraisdeport);
      benchmark.application.ecommerce.panier.init();
    }
);
