var _reg = new RegExp("[_]", "g");
var _formulePrestige = 0;

jQuery.fn.exists = function(){
  return jQuery(this).length > 0;
}
/**
 * CODE JQUERY
 */
/* French initialisation for the jQuery UI date picker plugin. */
/* Written by Keith Wood (kbwood{at}iinet.com.au) and Stéphane Nahmani (sholby@sholby.net). */

function debug(data){
  if (typeof(console) == 'object') {
    console.log(data);
  }
}

/*
 * Efface le contenu d'un select, sauf la valeur Ã  0
 */
function emptySelect(name){
  emptySelect(name, false);
}

function emptySelect(name, Empty){
  $(name).childElements().each(function(elt){
    elt.remove();
  });
  if (!Empty) {
    $(name).options[0] = new Option(' - ', 0);
  }
}

function round2(val){
  return Math.round(val * 100) / 100;
}

function jumpFormule(e){
  var elt = e.element();
  // change le château
  var currentParams = {
    'formule': elt.value
  };

  var url = window.location.pathname + '?' + Object.toQueryString(currentParams);
  window.location.href = url;
};

/**
 * Observe les champs input avec une classe date pour afficher le calendrier dessus
 * @param {Object} lang
 */
function jCalendar(lang){
  var lang = lang || 'fr';
  $j.datepicker.setDefaults($j.datepicker.regional['fr']);
  $j('input.date').each(function(){
    $j(this).datepicker({
      changeMonth: true,
      changeYear: true,
      showOtherMonths: true,
      selectOtherMonths: true
    });
  });
}

/*
 * désactive des jours dans le datepicker.
 * prend en paramètre la date envoyé par datePicker
 * et un _datePickerDisabled qui est un tableau d'objet de la forme
 * [ { type:day, value: 1 }, { type:dates, value: {start:'dd/mm/yyyy', end:'dd/mm/yyyy'} } ]
 */
function calendar_preventDate(date) {
  // jour de la semaine      
  var day = date.getDay();
  
  // marqueur
  var _day = false;
      
  // On bloque les jours interdits
  _datePickerDisabled.each(function(v,k) {
    if (v.type == 'day' && v.value == day) {
      _day = true;
      return false;
    } else if (v.type=='dates') {
      var Start = v.value.start, Stop = v.value.end;
      var MyStart = new Date(Start.substring(6,10),(parseInt(Start.substring(3,5).replace('0', ''))-parseInt(1)),Start.substring(0,2));
      var MyStop = new Date(Stop.substring(6,10),(parseInt(Stop.substring(3,5).replace('0', ''))-parseInt(1)),Stop.substring(0,2));
				
      if (MyStart<=date && MyStop>=date) {
        _day = true;
        return false;
      }
    }
  });
  if (_day) return [false];
      
  return [true];
}

/**
 * Gestion du bloc de commande
 * updateWine() met à  jour la liste des vins + millésime pour ce chÃ¢teau
 * updateFormule() Affiche le nombre de bouteille dispo pour ce vin et ce millésime
 * updatePrice() affiche le prix pour cette formule et active le bouton de soumission.
 */
function observeCmdFormule(){
  var dispList = window._dispList || false;
  //$('selectWine').observe('change', updateFormule);
  if (dispList == true) {
    $('selectBottles').observe('change', updatePrice);
  } else {
    $$('#radioBottles input').each(function(elt){
      elt.observe('click', updatePrice);
    });
  }
  $$('#listStage input').each(function(elt){
    elt.observe('click', updatePrice);
  });
};

function stopObservingCmdFormule(){
  var dispList = window._dispList || false;
  //$('selectWine').stopObserving('change', updateFormule);
  if (dispList == true) {
    $('selectBottles').stopObserving('change', updatePrice);
  } else {
    $$('#radioBottles input').each(function(elt){
      elt.stopObserving('click', updatePrice);
    });
  }
  $$('#listStage input').each(function(elt){
    elt.stopObserving('click', updatePrice);
  });
};

function calcWineNumber(ary){
  var num = 0;
  var reg = new RegExp(/\d+/);
  Object.keys(ary).each(function(item){
    if (reg.test(item)) num++;
  });
  return num;
}

function updateWine(e){
  var elt = typeof(e) == 'object' ? e.element() : $(e);
  var castle = elt.value;
  stopObservingCmdFormule();
  if (_formules[castle] != 'undefined') {
    var ddWine = $('dd-wine');

    //			selWine = $('selectWine');
    //			emptySelect('selectWine', true);


    var j = 0, reg = new RegExp(/\d+/), wineContent = $H(), lastWineId = 0;
    new Object.keys(_formules[castle]).each(function(wKey){
      if (reg.test(wKey)) {
        wineContent.set(wKey, _formules[castle][wKey]['txt'] + ' (' + _formules[castle][wKey]['color'] + ') ');
        lastWineId = wKey;
      }
    });

    if (wineContent.keys().length > 1) {
      // Construit le select
      var selectWine = new Element('SELECT');
      selectWine.id = 'selectWine';
      selectWine.name = 'wine';
      wineContent.each(function(pair){
        selectWine.options[j++] = new Option(pair.value, pair.key);
      });
      ddWine.update(selectWine);
    } else {
      var hiddenWine = new Element('INPUT');
      hiddenWine.id = 'selectWine';
      hiddenWine.name = 'wine';
      hiddenWine.type = 'hidden';
      hiddenWine.value = lastWineId;

      ddWine.update(hiddenWine);
      ddWine.insert(wineContent.get(lastWineId));
    }
  }
  updateFormule();
}

function updateFormule(e){
  var castle = $('selectCastle').value;
  var wine = $('selectWine').value;
  if (_formules[castle][wine] != 'undefined') {
    $('radioBottles').update('<tr><td></td></tr>');
    $('formulePrice').update('0');

    var content = '<tr>';
    var taille = 100 / Object.keys(_formules[castle][wine]['formules']).length;
    new Object.keys(_formules[castle][wine]['formules']).each(function(wKey){
      var value = _formules[castle][wine]['formules'][wKey]['txt'];
      content += '<td width="' + taille + '%">';
      content += '<input id="fo_' + wKey + '" type="radio" name="formule" value="' + wKey + '"';
      if (value == 24) content += ' checked="checked"';
      content += '>&nbsp;<label for="fo_' + wKey + '">' + value + ' ' + nbPieds + '</label></td>';
    });
    content += '</tr>';
    $('radioBottles').update(content);

    // Affichage de la boite langue du stage si besoin
    updateStages(castle, wine, _formules[castle][wine]['year']);
  }

  updatePrice();
  observeCmdFormule();
  return;
}

function updateStages(castle, wine, year){
  var html = '';
  var tab = 2; // On commence par la 2 pour afficher la 1 en dernier et supprimer les langues si besoins
  var curLang = 'fr';
  var stagesLangs = new Array();

  // StopObserving Select lang
  stopObservingStageLang();

  new Object.keys(_formules[castle]['stages'][year]).each(function(wKey){
    html = '';
    /*
     * Langue au dessus du stage
     */
    // Langues dispo pour ce stage
    var stageLangs = new Array();
    new Object.keys(_formules[castle]['stages'][year][wKey]).each(function(sKey){
      if (sKey.include('status_')) {
        var status = sKey.split(_reg);
        stageLangs.push(status[1]);
      }
    });

    // Si on a pas de langue du tout, on skip
    if (stageLangs.length == 0) {
      return;
    } else var disabled = '';
    // coche le stage découverte par défaut
    var checked = _formules[castle]['stages'][year][wKey]['type'] == 2 ? ' checked="checked"' : '';
    var labelText = _formules[castle]['stages'][year][wKey]['txt'];
    // Décoche et désactive si le stage est complet
    if (_formules[castle]['stages'][year][wKey]['status_' + curLang] == 'closed') {
      disabled = ' disabled="disabled"';
      checked = '';
    }

    html = '<input id="st_' + wKey + '" type="checkbox" name="stage[' + wKey + ']" value="1" class="type_' + _formules[castle]['stages'][year][wKey]['type'] + '"' + disabled + checked + ' />&nbsp;';
    html += '<label id="labelSt_' + wKey + '" for="st_' + wKey + '">' + labelText + '</label><br /><br />';

    if (stageLangs.length == 1) {
      stagesLangs.push(stageLangs[0]);
      // Si qu'une langue, on affiche que le texte et un hidden
      html += '<input type="hidden" name="langst[' + wKey + ']" value="' + stageLangs[0] + '"/>';
      html += '<span id="lang_' + wKey + '" class="stageLang">' + _lang['CMD_STAGE_' + stageLangs[0].toUpperCase()] + '</span><br /><br />';
      curLang = stageLangs[0];
    } else {
      html += '<select id="selectLangStage_' + wKey + '" name="langst[' + wKey + ']" class="selectLangStage">';
      stageLangs.each(function(val){
        stagesLangs.push(val);
        // Défini la langue par défaut
        html += '<option value="' + val + '">' + _lang['CMD_STAGE_' + val.toUpperCase()] + '</option>';
      });
      html += '</select><br /><br />';
    }

    // Complet ou non
    if (disabled != '') {
      html += '<b class="red" id="full_' + wKey + '">' + _lang['CMD_STAGE_FULL'] + '</b>';
    }

    $('divStage_' + tab).update(html);
    tab++;
  });

  // Affichage de la boite "aucun stage" et compression des langues
  html = '<input id="st_0" type="checkbox" name="stage[0]" value="1" class="type_0"  />&nbsp;';
  html += '<label for="st_0">' + _lang['CMD_NO_STAGE'] + '</label><br /><br />';
  stagesLangs = stagesLangs.uniq();
  // Si on a qu'une langue, on l'affiche sur la première box et on efface les autres
  if (stagesLangs.length == 1) {
    html += '<b>' + _lang['CMD_CHOOSE_STAGE_LANG_ONE'] + ': ' + _lang['CMD_STAGE_' + stagesLangs.shift().toUpperCase()] + '</b>';
    $$('#listStage span.stageLang').each(function(elt){
      elt.update('');
    });
  } else if (stagesLangs.length > 1) { // Sinon on affiche le texte de choix de langue
    html += '<b>' + _lang['CMD_CHOOSE_STAGE_LANG'] + '</b>';
  }

  $('divStage_1').update(html);

  // vide les divs des stages n'existant pas pour ce château
  for (tab; tab <= 4; tab++) {
    $('divStage_' + tab).update('');
  }

  // On observe les selects de langue de stage pour changer la case à cocher
  observeStageLang();
  return;
}

function updateCheckStage(e){
  var elt = e.element();
  var lang = elt.value;
  var infos = elt.id.split(_reg);
  var wKey = infos[1];
  var castle = $('selectCastle').value;
  var wine = $('selectWine').value;
  var year = _formules[castle][wine]['year'];
  var stage = _formules[castle]['stages'][year][wKey];

  // Complet
  if (stage['status_' + lang] == 'closed') {
    $('st_' + wKey).checked = false;
    $('st_' + wKey).disable();
    $('labelSt_' + wKey).update(_formules[castle]['stages'][year][wKey]['txt']);
    $('full_' + wKey).update(_lang['CMD_STAGE_FULL']);
  } else {
    $('st_' + wKey).enable();
    $('labelSt_' + wKey).update(_formules[castle]['stages'][year][wKey]['txt']);
    $('full_' + wKey).update('');
  }
  updatePrice();
  return;
}

function updatePrice(e){
  var currentElt = typeof(e) == 'object' ? e.element() : '';
  var dispList = window._dispList || false;
  var castle = $('selectCastle').value;
  var wine = $('selectWine').value;
  var formule = 0;
  var prices = {};
  var _debug = '';
  var stagesTypes = new Array();

  if (dispList) {
    formule = $('selectBottles').value;
  } else {
    $$('#radioBottles input').each(function(elt){
      if (elt.checked) formule = elt.value;
    });
  }

  if (formule > 0 && wine > 0) {
    /**
     * Prix de la formule
     */
    prices['formule'] = parseFloat(_formules[castle][wine]['formules'][formule]['price']);
    var year = _formules[castle][wine]['year'];
    _debug += 'formule: ' + prices['formule'] + '<br />';

    /*
     * Forfait
     */
    prices['forfait'] = parseFloat(_pmod.fo[year]);
    _debug += 'forfai: ' + prices['forfait'] + '<br />';

    /*
     * Prix des stages
     */
    // Si la case aucun stage est cochée ou qu'on a aucun stage coché, on
    // coche "aucun stage"
    // si on a un stage coché, on décoche "aucun stage"
    var st_0 = true;
    $$('#listStage input').each(function(elt){
      if (elt.id == 'st_0' && typeof(e) == 'object' &&
        currentElt == elt) {
        st_0 = true;
        throw $break;
      } else {
        if (elt.checked && elt.id != 'st_0') {
          st_0 = false;
          throw $break;
        }
      }
    });
    _debug += 'st_0 : ' + st_0 + '<br />';

    // on a aucun stage
    if (st_0) {
      $$('#listStage input').each(function(elt){
        _debug += 'elt : ' + elt.id + '<br />';
        if (elt.id != 'st_0') elt.checked = false;
      });
      if ($('st_0')) $('st_0').checked = true;
    } else {
      if ($('st_0')) $('st_0').checked = false;
    }

    prices['stages'] = 0;
    var nbStage = 0, reduc = 0;
    if (!Object.isUndefined(_formules[castle]['stages'])) {
      Object.keys(_formules[castle]['stages'][year]).each(function(wKey){
        //alert($('st_' + wKey));
        if ($('st_' + wKey) != null &&
          $('st_' + wKey).checked == true) {
          prices['stages'] = prices['stages'] +
          parseFloat(_formules[castle]['stages'][year][wKey]['price']);
          _debug += 'stage: ' + parseFloat(_formules[castle]['stages'][year][wKey]['price']) + '<br />';
          nbStage++;
        }
      });
    }

    /*
     * Réduction pour le nombre de stage
     */
    // Options de réduction pour le prix des stages
    prices['reducStage'] = 1;
    if (!Object.isUndefined(_formules[castle].opt)) {
      while (nbStage) {
        if (!Object.isUndefined(_formules[castle]['opt'][nbStage])) {
          prices['reducStage'] = parseFloat(1 - _formules[castle]['opt'][nbStage] / 100);
          nbStage = 0;
        } else nbStage--;
      }
    }
    _debug += 'reducStage: ' + prices['reducStage'] + '<br />';

    // Application de la réduction au prix du stage
    prices['stagesEndPrice'] = parseFloat(prices['stages']) *
    parseFloat(prices['reducStage']);
    _debug += 'totalStage: ' + prices['stagesEndPrice'] + '<br />';

    prices['full'] = round2(prices['formule'] + prices['forfait'] +
      prices['stagesEndPrice']);

    /*
     * Promotion sur le domaine ou sur un chateau Applique la meilleure
     * promo
     */
    // Les types de stage coché
    $$('#listStage input').each(function(elt){
      if (elt.checked) {
        elt.classNames().each(function(className){
          if (className.include('type_')) {
            var infos = className.split(/_/g);
            _debug += 'stagesType: ' + infos[1] + '<br />';
            stagesTypes.push(infos[1]);
          }
        });
      }
    });

    prices['total'] = prices['full'];

    if (!Object.isUndefined(_pmod.promos)) {
      Object.keys(_pmod.promos).each(function(wKey){

        // Ici on vérifie que la formule est bien dans le chateau de la promo ou que la promo n'a pas de
        // château défini
        var applyPromo = false;
        var castles = null;
        
        if (_pmod['promos'][wKey]['castles'] != "undefined" && _pmod['promos'][wKey]['castles'] != null) {
          castles = _pmod['promos'][wKey]['castles'].split(',');
        } else castles = new Array();


        if (typeof(_pmod['promos'][wKey]['castles']) != "undefined" && (castles.include(castle) || castles.size() == 0)) {
          if (_pmod['promos'][wKey]['stages'] != null && !_pmod['promos'][wKey]['stages'].empty()) {
            // Est ce que un des stages choisi fait parti de la promo
            stagesTypes.each(function(type){
              if (_pmod['promos'][wKey]['stages'].include(type)) {
                _debug += 'applique stage: ' + stagesTypes + '<br />';
                applyPromo = true;
                throw $break;
              }
            });
          } else if (_pmod['promos'][wKey]['castles'] != null && _pmod['promos'][wKey]['castles'].include(castle)) {
            _debug += 'applique domaine' + '<br />';
            applyPromo = true;
          }
        } else if (wKey == 1) applyPromo = true; // parrainage
        
        
        if (applyPromo == true) {
          // réduction en Pourcent
          if (_pmod['promos'][wKey]['type'] == 'percent') {
            var tmpPromo = round2(prices['full'] -
              (prices['full'] *
                _pmod['promos'][wKey]['ammount'] /
                100));
            if (tmpPromo < prices['total'] ||
              Object.isUndefined(prices['total'])) {
              prices['promoId'] = wKey;
              prices['total'] = tmpPromo;
            }
          } else { // réduction en Euro
            var tmpPromo = round2(prices['full'] -
              _pmod['promos'][wKey]['ammount']);
            if (tmpPromo < prices['total'] ||
              Object.isUndefined(prices['total'])) {
              prices['promoId'] = wKey;
              prices['total'] = tmpPromo;
            }
          } // fin de promo en euro
        } // fin de promo de type chateau
      }); // fin du test par promo
    }

    // si on a une réduc, on affiche le prix complet sans la réduc mais barré
    // et le prix avec réduc à côté et le détail

    $('formulePrice').update(round2(prices['full']));
    if (prices['promoId'] > 0) {
      $('formulePricePromo').update(round2(prices['total']));
      $('promoText').update(_pmod['promos'][prices['promoId']]['name']);
      if (_pmod['promos'][prices['promoId']]['type'] == 'euro') {
        $('promoPrice').update('- ' + _pmod['promos'][prices['promoId']]['ammount'] + ' ' + _lang['DEVISE']);
      } else {
        $('promoPrice').update('- ' + _pmod['promos'][prices['promoId']]['ammount'] + ' %');
      }
    } else {
      $('promoText').update('&nbsp;');
      $('promoPrice').update('&nbsp;');
      $('formulePricePromo').update(round2(prices['full']));
    }
  } else {
    $('formulePrice').update('0');
  }

//$('debugJS').update(_debug);
}

/*
 * Mise à jour compléte du formulaire (changement chateau)
 */
function cmd_updateFormule(e){
  var elt = typeof(e) == 'object' ? e.element() : $(e);
  var castle = elt.value;

  cmd_stopObservingFormule();

  new Ajax.Request('cmd_formule.php', {
    postBody: $H({
      'mode': 'ajax',
      'castle': castle,
      'type': 'full'
    }).toQueryString(),
    onComplete: function(xhr, json){
      if (json.error == 0) {
        $('formule_detail').update(xhr.responseText);
        cmd_observeFormule();
        _formulePrestige = json.prestige;
      }
    }
  });
}

function cmd_observeFormule(){
  //$('selectWine').observe('change', updateFormule);
  $$('#listFormule input').each(function(elt){
    elt.observe('click', cmd_wineUpdatePrice);
  });
  $$('#listStage input').each(function(elt){
    elt.observe('mousedown', radioStatus);
    elt.observe('click', cmd_stageUpdatePrice);
  });
  $$('#listStage label').each(function(elt){
    elt.observe('mousedown', radioStatus);
    elt.observe('click', cmd_stageUpdatePrice);
  });
};

var _radioStatus = {};

function radioStatus(e){
  var elt = e.element();
  if (elt.nodeName != 'INPUT') elt = $(elt.readAttribute('for'));
  _radioStatus = elt.checked;
}

function cmd_stopObservingFormule(){
  //$('selectWine').observe('change', updateFormule);
  $$('#listFormule input').each(function(elt){
    elt.stopObserving('click', cmd_wineUpdatePrice);
  });
  $$('#listStage input').each(function(elt){
    elt.stopObserving('mouseup', cmd_stageUpdatePrice);
  });
};

function cmd_wineUpdatePrice(e){
  cmd_updatePrice();
}

function cmd_stageUpdatePrice(e){
  var debug = '';
  var elt = e.element();

  // uncheck if not st_0 and already checked
  if (elt.id != 'st_0' && !_formulePrestige && _radioStatus) elt.checked = false;

  if (_formulePrestige) return;

  // parse each input
  var stageChecked = 0;
  $$('#listStage input').each(function(item){
    // uncheck all if necessary
    if (elt.id == 'st_0' && item.id != 'st_0') item.checked = false;
    if (item.id != 'st_0' && item.checked) stageChecked++;
  });

  // force check st_0
  if ($('st_0')) $('st_0').checked = stageChecked <= 0;

  cmd_updatePrice();
}

/*
 * Passe le formulaire complet dans une requête ajax et
 * met à jour le prix
 */
function cmd_updatePrice(){
  var castle = $('selectCastle').value;
  var form = $('formule_detail').serialize(true);
  Object.extend(form, {
    'mode': 'ajax',
    'castle': castle,
    'type': 'price'
  });

  new Ajax.Request('cmd_formule.php', {
    parameters: form,
    onComplete: function(xhr, json){
      if (json.error == 0) {
        $('total_cmd').update(xhr.responseText);
      }
    }
  });
}

/*
 * Configurateur formule
 */
function box_updateAll(e) {
  elt = $j(e.target);
  debug(elt);
  
  var sources = [
  'selectCastle', 
  'selectWine', 
  'selectBottles', 
  'listStage'
  ]
  
  sources.each(function(v,k){
    debug(k);
    debug(v);
  })
  
  var form = $j(elt).closest('form');
  
  debug(form.serialize());
  
}


/**
 * Mise à jour du vin (boite de simulation)
 * @param {Object} e
 */
function box_updateWine(e){
  var elt = typeof(e) == 'object' ? e.element() : $(e);
  var castle = elt.value;

  stopObservingCmdFormule();
  if (castle > 0) {
    if (_formules[castle] != undefined) {
      selWine = $('selectWine');
      emptySelect('selectWine', true);
      $('formulePrice').update('0');

      var j = 0, wineSelected = 0;
      Object.keys(_formules[castle]).each(function(wKey){
        if (wKey != 'stages' && wKey != 'opt') {
          var textOption = _formules[castle][wKey]['txt'];
          if ( castle == _cheapest.castle && wKey == _cheapest.wine) wineSelected = j;
          selWine.options[j] = new Option(textOption, wKey);
          j++;
        }
      });
      $('selectWine').selectedIndex = wineSelected;
    }
    box_updateFormule();
  } else {
    emptySelect('selectWine');
    $('selectBottles').update('<option value="0">-</option>');
    $('formulePrice').update('0');
    $('formulePricePromo').update();
    $('promoText').update();

    $('listStage').update('');
    return false;
  }
  return false
}

/**
 * Mise à jour de la formule (boite de simulation)
 * @param {Object} e
 */
function box_updateFormule(e){
  var castle = $('selectCastle').value;
  var wine = $('selectWine').value;
  stopObservingCmdFormule();
  if (_formules[castle] == undefined) return false;
  if (wine > 0) {
    if (_formules[castle][wine] != undefined) {
      selFormule = $('selectFormule');
      $('formulePrice').update('0');

      var content = '';
      Object.keys(_formules[castle][wine]['formules']).each(function(wKey){
        var value = _formules[castle][wine]['formules'][wKey]['txt'];
        content += '<option value="' + wKey + '"';
        if ( (castle == _cheapest.castle && wKey == _cheapest.formule) || ( castle != _cheapest.castle && value == 24 ) ) content += ' selected="selected"';
        content += '>' + value + '</option>';
      });
      $('selectBottles').update(content);

      // Affichage de la boite langue du stage si besoin
      var ulContent = '', year = _formules[castle][wine]['year'];
      // Ajoute au début la case: aucun stage, si formule non prestige
      if (_formules[castle][wine]['prestige'] == 0) {
        ulContent += '<li><input id="st_0" type="checkbox" name="stage[0]" value="0" class="type_0" '+(castle == _cheapest.castle ? ' checked="checked"' : '')+'/>&nbsp;';
        ulContent += '<label for="st_0">' + L_noStage + '</label></li>';
      }
      
      if (!Object.isUndefined(_formules[castle]['stages'])) {
        Object.keys(_formules[castle]['stages'][year]).each(function(wKey){
          var checked = castle != _cheapest.castle && (_formules[castle]['stages'][year][wKey]['type'] == 3 || _formules[castle][wine]['prestige'] == 1);
          
          ulContent += '<li><input id="st_' + wKey + '" type="checkbox" name="stage[' + wKey
          + ']" value="fr" class="type_'
          + _formules[castle]['stages'][year][wKey]['type'] + '" '

          // case coché si prestige ou stage découverte
          + (checked ? ' checked="checked"' : '')

          // case désactivé si prestige
          + (_formules[castle][wine]['prestige'] == 1 ? ' disabled="disabled"' : '')

          + ' />&nbsp;'  + '<label for="st_' + wKey + '">'
          + _formules[castle]['stages'][year][wKey]['txt'] + '</label></li>';
        });
      }

      $('listStage').update(ulContent);
      $$('#listStage input').each(function(elt){
        elt.observe('click', updatePrice);
      });
    }
    observeCmdFormule();
    updatePrice();
  }
}

function observeStageLang(){
  $$('#listStage select').each(function(elt){
    elt.observe('change', updateCheckStage);
  });
}

function stopObservingStageLang(){
  $$('#listStage select').each(function(elt){
    elt.stopObserving('change', updateCheckStage);
  });
}

function formatDate(day, month, year){
  return day.toPaddedString(2) + '/' + (parseInt(month) + 1).toPaddedString(2) + '/' + year;
}

function updateDateArrive(e){
  
  //Une journée en millisecondes
  var mSecPerDay = 86400 * 1000;

  var current = $j('#send_date').val();
  if (current == '') return false;
  var day = current.substring(0, 2);
  var month = current.substring(3, 5);
  // supprime le 0 au début
  month = month.replace(/0?(\d+)/, '$1');
  var year = current.substring(6, 10);
  var sent = new Date(year, parseInt(month - 1), day);
  var arrived = new Date();
  var arrived2 = new Date();
  var msTime = sent.getTime();
  var final1;
  var final2;
  var idExp;
  
  $j('#modeExpe input:checked').each(function(){
    idExp = $j(this).attr('id').split('_')[0];
  });

  if (Object.isUndefined(delays[idExp])) {
    $('arr_date').update('');
    return false;
  }

  if (delays[idExp].mini == delays[idExp].maxi) {
    msTime = parseInt(msTime) + (delays[idExp].mini * mSecPerDay);
    arrived.setTime(msTime);
    // Si le jour d'arrivée est dimanche, on ajoute 1 jour
    if (arrived.getDay() == 0) {
      arrived.setTime(msTime + mSecPerDay);
    }
    $('arr_date').update(formatDate(arrived.getDate(), arrived.getMonth(), arrived.getFullYear()));
  } else {
    var dateMin = parseInt(msTime) + (delays[idExp].mini * mSecPerDay);
    var dateMax = parseInt(msTime) + (delays[idExp].maxi * mSecPerDay);

    // gestion des dimanches
    var sundayInMini = false;
    var sundayInMaxi = false;
    // Ajoute un jour à la date mini si c'est un dimanche
    // Si on a un dimanche entre aujourd'hui et la date mini
    $R(0, delays[idExp].mini).each(function(value){
      var today = sent.getDay();
      var destDay = (today + value) % 7;
      if (destDay == 0) sundayInMini = true;
    });
    if (sundayInMini) {
      sundayInExpe = true;
      arrived.setTime(dateMin + mSecPerDay);
    } else {
      arrived.setTime(dateMin);
    }

    $R(0, delays[idExp].maxi).each(function(value){
      var today = sent.getDay();
      var destDay = (today + value) % 7;
      if (destDay == 0) sundayInMaxi = true;
    });

    if (sundayInMaxi) {
      arrived2.setTime(dateMax + mSecPerDay);
    } else {
      arrived2.setTime(dateMax);

    }
    final1 = formatDate(arrived.getDate(), arrived.getMonth(), arrived.getFullYear());
    final2 = formatDate(arrived2.getDate(), arrived2.getMonth(), arrived2.getFullYear());
    $('arr_date').update(final1 + '  -  ' + final2);
  }

  // mise à jour du prix d'expédition des bouteilles
  var expeBottles = _expeBottles || false;
  if (expeBottles == true) {
    $('totalPrice').update(delays[idExp].price || 0);
  }
}

function updateExpeMode(country){
  if (country > 0) {
    $j.ajax({
      url: _paths['site_url'] + '/cmd_expedition.php',
      type: 'post',
      dataType: "json",
      data: {
        mode: 'mode',
        country: country
      },
      success : function(xhr) {
        if (xhr.error == 0) {
          delays = xhr;
          $j('#modeExpe input').each(function(){
            $j(this).unbind('click')
          });
          $j('#modeExpe').html(xhr.expModes);
          $j('#modeExpe input').each(function(){
            $j(this).click(updateDateArrive)
          });
          updateDateArrive('none');
        }
      }
    })
  }
}

function initDest(user, disable){
  debug(user);
  Object.keys(user).each(function(wKey){
    if ($('dest_' + wKey)) {
      $('dest_' + wKey).value = user[wKey];
      if (disable) $('dest_' + wKey).disable();
      else $('dest_' + wKey).enable();
    } else if (wKey == 'gender') {
      if (user['gender'] == 'mr') $('dest_gen_mr').checked = true;
      else $('dest_gen_mr').checked = false;
      if (user['gender'] == 'mme') $('dest_gen_mme').checked = true;
      else $('dest_gen_mme').checked = false;
      if (user['gender'] == 'mlle') $('dest_gen_mlle').checked = true;
      else $('dest_gen_mlle').checked = false;
      if (user['gender'] == 'mr_mme') $('dest_gen_mr_mme').checked = true;
      else $('dest_gen_mr_mme').checked = false;

      if (disable) {
        $('dest_gen_mr').disable();
        $('dest_gen_mme').disable();
        $('dest_gen_mlle').disable();
        $('dest_gen_mr_mme').disable();
      } else {
        $('dest_gen_mr').enable();
        $('dest_gen_mme').enable();
        $('dest_gen_mlle').enable();
        $('dest_gen_mr_mme').enable();
      }
    } else if (wKey == 'country') {
      var countries = $A($('selectCountry').options);
      countries.each(function(elt){
        if (elt.value == user['country']) $('selectCountry').selectedIndex = elt.index;
      });
      if (disable) $('selectCountry').disable();
      else $('selectCountry').enable();
    }
  });
}

function observeTabs(){
  $$('#tabHeader .cmd_onglet').each(function(elt){
    elt.observe('click', function(e){
      var elt2 = e.element();
      var onglet = elt.id.replace(/^[^_]+_(.*)/, 'tab-text_$1');
      $$('#tabHeader .cmd_onglet').each(function(ong){
        if (elt2 == ong) {
          ong.addClassName('cmd_active');
        // alert(ong.id);
        } else ong.removeClassName('cmd_active');
      });
      $$('.tab-text').each(function(tab){
        if (onglet == tab.id) tab.show();
        else tab.hide();
      });
    });
  });
}

/* Prix d'un stage sec */
function stageSecPrice(){
  var castle = _castle;
  var type = _type;
  var applyPromo = false;

  // Nombre de places
  places = $j("input[@name=person]:checked").val();
  var prices = {};

  if (places > 0) {
    //$('totalPrice').show();
    prices['stage'] = _prices[places];
    if (!Object.isUndefined(_pmod.promos)) {
      Object.keys(_pmod.promos).each(function(wKey){
        // Ici on vérifie que le stage est bien dans le chateau de la promo ou que la promo n'a pas de
        // château défini
        if (_pmod['promos'][wKey]['castles'] === null  || _pmod['promos'][wKey]['castles'].empty() || _pmod['promos'][wKey]['castles'].include(castle)) {
          // Si c'est un promo
          // Le type de stage est bien dans cette promo
          applyPromo = _pmod['promos'][wKey]['stages'] === null 
          || _pmod['promos'][wKey]['stages'].empty() 
          || _pmod['promos'][wKey]['stages'].include(type) ? true : false;
        }

        if (applyPromo == true) {
          if (_pmod['promos'][wKey]['type'] == 'euro') {
            // réduction en Euro
            var tmpPromo = round2(prices['stage'] -
              _pmod['promos'][wKey]['ammount']);
            if (tmpPromo < prices['total'] ||
              Object.isUndefined(prices['total'])) {
              prices['promoId'] = wKey;
              prices['total'] = tmpPromo;
            }
          } else {
            // Réduction en pourcentage
            var tmpPromo = round2(prices['stage'] -
              (prices['stage'] *
                _pmod['promos'][wKey]['ammount'] /
                100));
            if (tmpPromo < prices['total'] ||
              Object.isUndefined(prices['total'])) {
              prices['promoId'] = wKey;
              prices['total'] = tmpPromo;
            }
          }
        } // fin de la formule dans la promo
      }); // fin du test par promo
    }
    // Met à jour l'étiquette pour le nombre de personne
    $('nbPerson').update($('person' + places + 'Text').innerHTML);
  }

  // si on a une réduc, on affiche le prix complet sans la réduc mais barré
  // et le prix avec réduc à côté et le détail

  $('priceTotal').update(round2(prices['stage']));

  var totalPrice = 0;
  if (prices['promoId'] > 0) {
    $('promoText').update(_pmod['promos'][prices['promoId']]['name']);
    $('promoPrice').update(_pmod['promos'][prices['promoId']]['type'] == 'euro' ? _pmod['promos'][prices['promoId']]['ammount'] + ' ' + _lang['DEVISE'] : _pmod['promos'][prices['promoId']]['ammount'] + ' %');
    totalPrice = parseFloat(prices['total']);
  } else {
    totalPrice = parseFloat(prices['stage']);
  }


  // Calcul suivant le site
  if (_siteid == 1) {
    $('priceTotalPromo').update(round2(totalPrice));
  } else if (_siteid == 2) {
    var ht = totalPrice;
    var tps = parseFloat(totalPrice * _tps / 100);
    var tvq = parseFloat((totalPrice + tps) * _tvq / 100);
    var taxes = round2(tps + tvq);

    $('priceTotalHT').update(round2(ht));
    $('priceTotalTaxes').update(taxes);
    $('priceTotalPromo').update(round2(ht + taxes));
  }
}



function countCaracs(id){
  var elt = $(id);
  var content = elt.value || elt.innerHTML;
  return content.stripScripts().stripTags().length;
}

function countBreakLine(text){
  var grep = text.match(/\n/g);
  return grep.length + 1;
}

function getElt(eltId){
  var elt;
  if (document.getElementById()) {
    elt = document.getElementById(eltId);
  } else if (document.all) {
    elt = document.all(eltId);
  }
  return elt;
}

function hover(obj){
  if (document.all) { // This block will be interpreted only by IE Browsers
    var ulTags = obj.getElementsByTagName('ul');
    if (ulTags.length > 0) {
      var sousMenu = ulTags[0].style;
      if (sousMenu.display == 'none' || sousMenu.display == '') {
        // IE trick to hide the select tags of the page
        // because if not, it would ever be on top of every menu
        hideSelect(true);
        sousMenu.display = 'block';
      } else {
        hideSelect(false);
        sousMenu.display = 'none';
      }
    }
  }
}

function setHover(menuId){
  if (getElt(menuId) == null) {
    return false;
  }
  var liTags = getElt(menuId).getElementsByTagName('li');
  if (liTags == null) return false;
  var liTagsNb = liTags.length;
  for (i = 0; i < liTagsNb; i++) {
    liTags[i].onmouseover = function(){
      hover(this);
    }
    liTags[i].onmouseout = function(){
      hover(this);
    }
  }
  return true;
}

function hideSelect(flag){
  var selectTags = document.getElementsByTagName('select');
  var selectTagsNb = selectTags.length;
  for (j = 0; j < selectTagsNb; j++) {
    if (flag) {
      selectTags[j].style.visibility = 'hidden';
    } else {
      selectTags[j].style.visibility = 'visible';
    }
  }
}

/*
 * Mise à jour compléte du formulaire (changement chateau)
 */
function user_selectState(e){
  var elt = typeof(e) == 'object' ? e.element() : $(e);
  var country = elt.value;
  var dest = elt.id.include('Ben') ? 'Ben' : '';

  new Ajax.Request('ajax.php', {
    postBody: $H({
      'mode': 'user_state',
      'country': country
    }).toQueryString(),
    onComplete: function(xhr, json){
      if (json.error == 0) {
        if (json.result == 1) {
          $('dd_selectState' + dest).update(xhr.responseText);
          $('dl_selectState' + dest).show();
        } else {
          $('dl_selectState' + dest).hide();
          $('dd_selectState' + dest).update(xhr.responseText);
        }
      }
    }
  });
}


/**
 * javascript pour génération étiquettes
 */
function etik_changeBackground(e){
  var elt = typeof(e) == 'object' ? $j(e.target) : $j('#'+e);
  var infos = elt.attr('id').split(_reg);

  var etik = eval(elt.val());

  $('etik-cuvee').setStyle({
    fontSize: etik['cuvee_font_size'],
    fontFamily: etik['cuvee_font_name'],
    fontStyle: etik['cuvee_font_style'] || 'normal',
    textAlign: etik['cuvee_align'] || 'center',
    color: etik['cuvee_font_color'],
    top: etik['cuvee_top'],
    left: etik['cuvee_left'],
    width: etik['cuvee_width'],
    height: etik['cuvee_height'],
    lineHeight: etik['cuvee_font_size']
  });
}

function etik_updateSuivi(){
  var elt = $j(this);
  $j('#etik-suivi').html(elt.val());
}

function etik_updateCuvee(){
  var elt = $j(this);
  $j('#etik-cuvee').html(elt.val());
}

/*
 * récupère les modes d'expéditions pour un département/pays
 */
function expe_updateModeBottle(e){
  new Ajax.Request(_paths['site_url']+'/user.php', {
    postBody: $H({
      mode: 'bottles',
      ajax: 1,
      expe: 1,
      'country': $j('#selectCountryExpe').val(),
      'cp': $j('#dest_cp').val(),
      'qty_more':  $j('#more_nomore:checked').exists() ? 0 : Number($j('#inputMoreQty').val())
    }).toQueryString(),
    onComplete: function(xhr, json){
      if (json == undefined || json.error == 0) {
        delays = xhr.responseText.evalJSON();
        $j('#modeExpe').html(delays.expModes);
      }
    }
  });
}

function keyboard_badNumericKey(e){
  if (
    !(e.keyCode >= 96 && e.keyCode <= 105) && // pavé num
    !(e.keyCode >= 48 && e.keyCode <= 57) && // numéro
    e.keyCode!=8 && // backspace
    e.keyCode!=9 && // Tab
    e.keyCode!=46 && // delete
    e.keyCode!=16 // shift
    )
    {
    return false;
  }
  return true;
}

function dialogBox(url,optsAjax,optsDialog) {
  var optsAjax = optsAjax || {};
  var optsDialog = optsDialog || {};
  
  // Requete Ajax + mise à jour dialog
  $j.getJSON(url, optsAjax, function(xhr){
    $j('#globalDialog').html(xhr.view).dialog({
      title: xhr.title,
      modal:true,
      autoOpen: true,
      width: parseInt(xhr.width) > 0 ? parseInt(xhr.width) : optsDialog['width'],
      height: parseInt(xhr.height) > 0 ? parseInt(xhr.height) : optsDialog['height'],
      buttons: optsDialog['buttons'],
      open : eval(optsDialog['open'])
    });
  })
}

