/****
 Global vars
*******/
var IS_IE = document.all && window.print && !window.opera && ( !document.compatMode || /MSIE 6/.test(navigator.userAgent) || (document.compatMode && document.compatMode=="BackCompat"));
var IE_NG = document.all && window.print && !window.opera && /MSIE [7-9]/.test(navigator.userAgent) && document.compatMode && document.compatMode!="BackCompat"; //variable pour IE7 et + si besoin.
var IS_quirks = IS_IE && document.compatMode && document.compatMode=="BackCompat"; // variable qui declare le quirksmode seulement utile pour IE
var heightPropertyToUse = IS_IE ? "height" : "minHeight"; //variable utilisee pour l'alignement en hauteur des elements.
var IS_Webkit = /Konqueror|Safari|KHTML/.test(navigator.userAgent); 

//ajoute la classe hasJS si le JS est active sur le navigateur
document.documentElement.className+=" hasJS";
if (IS_IE) document.documentElement.className+=" IS_IE";

/* contextualisation */
if (!document.location.hostname.match(/pullman/)) document.documentElement.className+=" external";


/*******
* Framework : 
* Fonctions necessaires au fonctionnement general. Elles apportent une aide supplementaire pour le developpement d'autres fonctions. Ces fonction sont utilisees par toutes les autres.
*********/
Array.prototype.eachInv = function(f) {

  var i;
  for(i=this.length-1;i>=0;i--) {
    f(this[i]);
  }
}

function addEvent(elm, eventName, fn) {
  Event.observe(elm, eventName, fn);
}

function removeEvent(elm, event, fn) {
  Event.stopObserving(elm,event, fn);
}

/* domReadyAddFuncs */
var beforeDomReadyFuncs = [];
function addBeforeDomReady(fn) { beforeDomReadyFuncs.push(fn); }
// Update SDO 2009-12-18 (get rid of onDOMReady extension which was not compatible with https - now supported by prototype 1.6)
document.observe("dom:loaded", function() {
    beforeDomReadyFuncs.each(function(fn) {fn()}); //lance les fonctions ajoutees via addBeforeDomReady()
});




var beforeLoadFuncs = [];
function addBeforeLoad(fn) { beforeLoadFuncs.push(fn); }


/* supprime la propagation du click sur un &eacute;l&eacute;ment (le click n'est pas r&eacute;percut&eacute; sur les autres &eacute;l&eacute;ments en dessous du block en question) */
cancelClick = function(e){
  if (window.event){
    window.event.cancelBubble = true;
    return;
  }
  if (e){
    if (e.stopPropagation) {
      e.stopPropagation();
    }
  }
}

function getElementsByClassName(oElm, sTagName, sClassName){
  var aElements = (sTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(sTagName);
  var aReturnElements = new Array();
  sClassName = sClassName.replace(/\-/g, "\\-");
  var oRegExp = new RegExp("(^|\\s)" + sClassName + "(\\s|$)");
  var oElement;
  for(var i=0; i < aElements.length; i++){
    oElement = aElements[i];
    if(oRegExp.test(oElement.className))
      aReturnElements.push(oElement);
  }
  return aReturnElements
}

// getStyle : retourne la valeur d'une propriete CSS appliquee a un element
function getStyle(oElm, strCssRule){

  var strValue = "";
  if(document.defaultView && document.defaultView.getComputedStyle) {
    try{ 
      strValue = document.defaultView.getComputedStyle(oElm, null).getPropertyValue(strCssRule); 
    }
    catch(e) { strValue = ""; }
  }
  else if(oElm.currentStyle) {
    try{
      strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){
        return p1.toUpperCase();
      });
      strValue = oElm.currentStyle[strCssRule];
    } catch(e) {
      strValue = "";
    }
  }
  return strValue;
}

/*retourne la valeur entiere d'un style*/
function intStyle(oElm, strCSSRule) {
  var val = parseInt(getStyle(oElm, strCSSRule));
  if (isNaN(val)) val=0;
  return val;
}

/* retourne la somme de tous les styles verticaux appliques (border-width+padding) */ 
function getVStyles(elm) {
  return IS_quirks ? 0 : intStyle(elm, "border-top-width")+intStyle(elm, "border-bottom-width")+intStyle(elm, "padding-top")+intStyle(elm, "padding-bottom");
}
function getVMargins(elm) {
  return intStyle(elm, "margin-top")+intStyle(elm, "margin-bottom");
}
function getHStyles(elm) {
  return IS_quirks ? 0 : intStyle(elm, "border-left-width")+intStyle(elm, "border-right-width")+intStyle(elm, "padding-left")+intStyle(elm, "padding-right");
}
//removeClass
function removeClass(element, className) {
  element.className = element.className.replace(new RegExp("\\b"+className+"\\b","g"),"");
};

//addClass
function addClass(element, className) {
  element.className += " " + className;
};

//toggleClass
function toggleClass(element, className, classNameReplace) {
  element.className = element.className.replace(new RegExp("\\b"+className+"\\b","g"), classNameReplace);
};

function findPos(obj) {
  var curleft = curtop = 0;
  if (obj.offsetParent) {
    curleft = obj.offsetLeft
    curtop = obj.offsetTop
    while (obj = obj.offsetParent) {
      curleft += obj.offsetLeft
      curtop += obj.offsetTop
    }
  }
  return [curleft,curtop];
}

/* openclose */
function openclose(elm) {
  var par = getParent(elm, {className:"content(show|hide)"});
  par.className.match(/contenthide/) ? toggleClass(par, "contenthide", "contentshow") : toggleClass(par, "contentshow", "contenthide");
  fixColumns();
}

/**********
* $n : objet de parcours du DOM, facile. Les fonctions ne font que les nodes HTML
***********/
var $nodes= {
  /*  hasAttributes : retourne true si l'element passe en parametre correspond a tous les attributs passes, on peut aussi donner des attributs que l'on ne veut pas, afin de filtrer tous les &eacute;lements
    ex : if (hasAttributes(div, {nodeName:"div", className:"foobar"), {className:"idontwant"} ) doStuff();
    ici on recherche tous les DIV qui on la classe "foobar", mais on ne prend pas ceux qui ont la classe "idontwant" ex : <div class="foobar idontwant"> ne sera pas recupere.
  */
  hasAttr : function(n, a, not) {
    var re, at;
    if (n.nodeType!=1) return false;
    function check(attr) {
      for (var i in attr) {
        at = (typeof n[i]) !="undefined" ? n[i] : n.getAttribute(i);
        re = attr[i] instanceof RegExp ? re : new RegExp("\\b" + attr[i] + "\\b","i");
        if (!at || !re.test(at)) 
          return false;
      }
      return true;
    };
    if (not && check(not))  return false;
    if (check(a)) return true;
    return false;
  },
  /* getByTagName : equivalent a element.getElementsByTagName, mais compatible avec IE5 et IE5.5 pour l'histoire du "*" */
  getByTagName : function(n, tag) {
    return  (tag=="*") ? (n.all ? n.all : n.getElementsByTagName("*")) : n.getElementsByTagName(tag);
  },
  /* fonction qui retourne le premier element correspondant aux attributs donnes */
  node : function(n, a, not) {
    return $nodes.nodes(n, a, not, true);
  },
  /* fonction qui retourne tous les elements correspondant selon "a" */
  nodes : function(n, a, not, oneNode, arrElms) {
    var aRetElms=[];
    if (!a) a = {};
    if (typeof a == "string") a = {nodeName:a}; //si une chaine de caract&egrave;res pass&eacute;e en param&egrave;tre, cela signifie qu'on ne veut que r&eacute;cup&eacute;rer des tags
    if (a.nodeName && a.nodeName=="*") delete a.nodeName;
    var elms = arrElms || $nodes.getByTagName(n, (a.nodeName || "*"));
    for (var i=0; i<elms.length; i++) {
      var x = elms[i];
      if ($nodes.hasAttr(x, a, not)) {
        if (oneNode) return x;
        else aRetElms.push(x);
      }
    }
    if (oneNode) return null;
    return aRetElms;
  },
  /* childs : retourne tous les noeuds enfants de l'element  */
  childs : function(n, a, not) {
    return $nodes.nodes(n, a, not, false, n.childNodes);
  },
  firstChild : function(n, a, not) {
    return $nodes.nodes(n, a, not, true, n.childNodes);
  },
  lastChild : function(n, a, not) {
    var node = $nodes.nodes(n, a, not, false, n.childNodes);
    return node[node.length-1];
  },
  move : function(n, a, not, action) {
    do {
      n = n[action]; 
      if (n && $nodes.hasAttr(n, a, not)) return n;
    } while (n) 
    return null;
  },
  after : function(n, a, not) { 
    return $nodes.move(n, a, not, "nextSibling");
  },
  before : function(n, a, not) {
    return $nodes.move(n, a, not, "previousSibling");
  },
  parent : function(n, a, not) {
    return $nodes.move(n, a, not, "parentNode");
  }
}
/* fonctions raccourcis */
var getNode = $nodes.node,
  getNodes = $nodes.nodes,
  getChildNodes = $nodes.childs,
  getNextSibling = $nodes.after,
  getPreviousSibling = $nodes.before,
  getParent = $nodes.parent,
  hasAttributes = $nodes.hasAttr,
  getElementsByTagName = $nodes.getByTagName;

/*  ifrlayer : 
  Cette fonction corrige un probleme sous IE6 lorsqu'un layer passe par dessus un select, le select sera toujours au dessus. Pour corriger ce probl&egrave;me.
  ex :  
    - afficher un bloc : 
      myBlock.style.display='block';
      ifrlayer.make(myBlock); //genere ou affiche l'iframe
    - cacher un bloc :
      myBlock.style.display='none';
      ifrlayer.hide(myBlock); //cache l'iframe associee au bloc
    -deplacer un bloc : 
      myBlock.style.left = "100px";
      ifrlayer.move(myBlock); // deplace l'iframe associee au bloc
*/
var ifrlayer = {
    make:function(obj) {
        if(!obj) return; obj = (typeof(obj)=="string") ? document.getElementById(obj) : obj; if(!obj) return;
        if(document.all && window.print && document.getElementById && !obj.iframelayer ) {
            if(obj.parentNode && !obj.iframelayer) var ifr = obj.parentNode.insertBefore(document.createElement("iframe"), obj);
            ifr.src = "javascript:false";
            if(obj.currentStyle.zIndex != "" && parseInt(obj.currentStyle.zIndex)>1 ) {
                ifr.style.zIndex = parseInt(obj.currentStyle.zIndex)-1;
            }
            with(ifr.style) {
                filter = "mask()";
                position = "absolute";
            }
            obj.iframelayer = ifr;
        }
        if (obj.iframelayer) {
            obj.iframelayer.style.visibility = "visible";
            ifrlayer.move(obj,true);
        }
    },
    hide:function(obj){
        if(!obj) return; obj = typeof(obj)=="string" ? document.getElementById(obj) : obj; if (!obj) return;
        if(obj.iframelayer) {
            obj.iframelayer.style.visibility="hidden";
        }
    },
    kill:function(obj){
        if(!obj) return; obj = typeof(obj)=="string" ? document.getElementById(obj) : obj; if (!obj) return;
        if(obj.iframelayer) {
            obj.iframelayer.parentNode.removeChild(obj.iframelayer);
        }
    },
    move:function(obj, size) {
        if(obj && obj.iframelayer) {
            with(obj.iframelayer.style) {
                top = obj.offsetTop+"px";
                left = obj.offsetLeft+"px";
                if (size) {
                    width  =  obj.offsetWidth+"px";
                    height =  obj.offsetHeight+"px";
                }
            }
        }
    }
}
/*  addHover :
   Cette fonction ajoute le fonctionnement de la pseudo classe hover en CSS, et seulement pour IE
   Elle se base sur les evenement propres a IE qui sont les evenements qui ont le comportement le plus proche du :hover en CSS.
   Pour utiliser cette fonction il faut le faire en CSS, on peut en plus ajouter en parametre la classe CSS qui sera ajoutee en CSS
   ex :
       #menu ul li {behavior:expression(addHover(this))}
       #menu ul li {behavior:expression(addHover(this, "maclassehover"))}
       Afin de ne pas prendre en compte IE7 en mode strict il suffit de placer la classe .IS_IE avant, cette classe est ajoutee pendant le chargement de la page.
       .IS_IE #menu ul li {behavior:expression(addHover(this))}
*/
function addHover(elm, className, iframeTag) {
  className = className || "hover";
  elm.style.behavior = " "; //reecriture du style behavior
  elm.hoverClassName = className;
  if (iframeTag) {
    elm.iframeElm = getNode(elm, iframeTag);
  }
  elm.onmouseenter = function() {
     this.className+= ' ' + this.hoverClassName;
     if (this.iframeElm) ifrlayer.make(this.iframeElm);
  }
  elm.onmouseleave = function() {
     this.className = this.className.replace(new RegExp("\\b" + this.hoverClassName + "\\b", "g"),"");
     if (this.iframeElm) ifrlayer.hide(this.iframeElm);
  }
}

/*************
* Fonctions pour fixer les coins sous IE
* Une fonctions est prevue aussi pour Safari 2.0, Opera 8.5 et FF 1.0 pour certains cas
**************/
var CSSBottomCorners=[]; //array pouvant contenir les coins absolu positionnes en bottom
var CSSHeightCorners=[]; //array pouvant contenir les listes des blocks dont les coins font 100% de la hauteur
var currentBlockToFixCorners=null; //variable gloable utilisee lorsqu'on veux fixer les coins sur un seul bloc

/*  cssRight : 
  fixe les coins positionnes en absolu a droite
  ex : 
    body.IS_IE .tr {right:expression(addHover(this))}
    Il faut afin que cela fonctionne, avoir declare le right dans un selecteur precedent (pour les autres navigateurs).
    ex : .tr {height:5px;  width:5px; right:0}
    Afin de ne pas prendre en compte IE7 en mode strict il suffit de placer la classe .IS_IE avant, cette classe est ajoutee pendant le chargement de la page et n'est ajoutee que pour IE5.x ou 6.
*/
function cssRight(elm) {
  if (elm.currentStyle.right!="auto") {
    elm.style.right = (parseInt(elm.currentStyle.right)-(elm.parentNode.offsetWidth%2))+"px";
  } else {
    elm.style.right = "auto";
  }
}
 
/*  cssBottom :  (comme CSS right avec un parametre supplementaire)
  fixe les coins positionnes en absolu a droite
  ex : 
    body.IS_IE .br {bottom:expression(addHover(this))}
  Il faut afin que cela fonctionne, avoir declare le right dans un selecteur precedent (pour les autres navigateurs).
  Afin de ne pas prendre en compte IE7 en mode strict il suffit de placer la classe .IS_IE avant, cette classe est ajoutee pendant le chargement de la page et n'est ajoutee que pour IE5.x ou 6.
  
  Si on veut rajouter ces coins dans un array qui permettra de les refixer si le bloc s'agrandit ou autre. il suffit de rajouter "true" dans les parametres.
  ex : 
    body.IS_IE .br {bottom:expression(addHover(this, true))}
*/
function cssBottom(elm, pushElement) {
  if (pushElement && !elm.CSSBottomAlreadyCSS) {
    CSSBottomCorners.push(elm);
    elm.CSSBottomAlreadyCSS=true;
  }
  if (elm.currentStyle.bottom!="auto") {
    elm.style.bottom = (parseInt(elm.currentStyle.bottom)-(elm.parentNode.offsetHeight%2))+"px";
  } else {
    elm.style.bottom = "auto";
  }
}

/*  fixCorners : 
  Cette fonction  est appelee lorsque l'on doit fixer tous les coins d'une page ou d'un block.
  ex : 
    fixCorners ();  //Lance la fonction pour fixer tous les blocks, il faut lancer la fonction une fois la page chargee.
    fixCorners(block); //en passant un element en parametre, le traitement ne se fera que sur le bloc et non sur toute la page.
*/
function fixCorners(block) {
  if (IS_IE) {
    for (var i=CSSBottomCorners.length-1; i>-1; --i) {
      CSSBottomCorners[i].style.bottom="";
    }
  } else {
    if (IS_Webkit || /Gecko\/200[56]|Opera 8.5/i.test(navigator.userAgent)) fixCornersOnBlocks(block);
  }
}

/* 
  fixCornersOnBlocks : 
  Ajoute une classe CSS hidecorners afin de cacher les coins puis les reafficher.
  Cette fonction n'est lancee que pour Safari, Le moteur Gecko 2005 (FF1.0) et Opera 8.5), car lorsqu'on agrandit un block en Javascript, les coins en absolu positionnes en bas restent a leur place. Cette fonction corrige le probleme.
*/
function fixCornersOnBlocks(block) {
  var currentBlockToFixCorners = block || document.body;
  currentBlockToFixCorners.className+=" hidecorners";
  setTimeout(fixCornersOnBlocksShowCorners,5);
}

/* 
  fixCornersOnBlocksShowCorners : 
  Fonction associee a fixCornersOnBlocks(), cette fonction retire la classe hidecorners qui a ete appliquee a currentBlockToFixCorners
*/
function fixCornersOnBlocksShowCorners() {
  if (currentBlockToFixCorners) currentBlockToFixCorners.className=currentBlockToFixCorners.className.replace(/\bhidecorners\b/g,"");
  currentBlockToFixCorners=null;
}
/* height Corners : coins qui font tout le tour d'un bloc */
function cssHeight(elm, pushElement) {
  if (pushElement && !elm.CSSHeightAlreadyCSS) {
    CSSHeightCorners.push(elm);
    elm.CSSHeightAlreadyCSS=true;
  }
  elm.style.height = elm.parentNode.offsetHeight+"px";
}

function fixHeights(block) {
  if (IS_IE) {
    var array = block ? getNodes(block, {nodeName:"b", className:"tr|bl"}) : CSSHeightCorners;
    array.eachInv(function(elm) {
      elm.style.height="";
    });
  }
}


/****************
* Validation de formulaires
******************/
var formval={
  defaultErrorMessage:"Ce champ est erron\u00E9",
  defaultPosition:"beforefield",
  globalErrorMsg : "",
  callbackfunctions : function() {
    fixColumns();
    if (popLayer.pop) popLayer.resize();
  },
  lineInput : {nodeName:"(div|p|li)"},
  validationFunc:{
    required:function(field) {
      var returnMessage=true;
      switch(field.type) {
        case "text":
        case "file":
        case "password":
        case "textarea":
          if (field.value=="") returnMessage="text";
          break;
        case "checkbox":
        case "radio":
          var sameElt = formval.getSameElements(field);
          var onecheck=false;
          for (var i=0; i<sameElt.length; i++) {
            if (sameElt[i].checked)
              onecheck=true;
          }
          if (!onecheck) returnMessage=field.type;
          break;
        case "select-one":
        case "select-multiple":
          if(field.selectedIndex==0) 
            returnMessage="select";
          break;
      }
      return returnMessage;
    },
    email:function(field) {return (field.value=="" || !!field.value.match(/^[a-z0-9._-]+@[a-z0-9.-]{2,}[.][a-z]{2,3}$/));},
    name:function(field) {return (field.value=="" || !!field.value.match(/^([a-zA-Z]|\s|\'|\.|\-)+$/));},
    pseudo:function(field) {return !!field.value.match(/^[a-zA-Z0-9_\-]{3,20}$/);},
    image:function(field) {return (field.value=="" || !!field.value.match(/^.+\.(gif|jpe?g|png)$/));},
    codepostal:function(field){return !!field.value.match(/\d{5}/);},
    cpordep:function(field){if (field.value=="") return true; return !!field.value.match(/\d{2}(\d{3})?/);},
    phonenumber:function(field){if (field.value=="") return true; return !!field.value.match(/^\d{10}$/);},
    phonenumber2:function(field){
      var val = field.value;
      if (val=="") return true; 
      var cleanNum = val.match(/(\+)?\d+/g)
      if (!cleanNum) return false;
      cleanNum = cleanNum.join(""); //on recupere le numero de telephone en version nettoyee.
      if (!cleanNum.match(/^\+?(33|033|0033)0?[1-9]\d{8}$/)) return false; //on checke reelement le numero de telephone
      return !!val.match(/^(\d|\s|-|\.|\\|\/|_|\+)+$/); //on check si des caract&egrave;res autres que chiffes,-,+,.,_,/,\  sont pr&eacute;sents
    },
    numbers:function(field){if (field.value=="") return true; return !!field.value.match(/^\d+$/);},
    decimal:function(field){if (field.value=="") return true; return !!field.value.match(/^\d+([.,]\d+)?$/);},
    equalsto:function(field) {
      var equalsFieldId = field.getAttribute("equalsto");
      var equalsField = document.getElementById(equalsFieldId);
      return (field.value==equalsField.value);
    },
    minimum:function(field) {
      if (field.nodeName!="FIELDSET") return true;
      var minNum = field.getAttribute("minimum_num") || 1;
      var properties = field.getAttribute("minimum_field") || "text,femail";
      var properties = properties.split(/,/g);
      var inputs = field.getElementsByTagName("input");
      var counter = 0;
      for (var i=0; i<inputs.length; i++) {
        var x=inputs[i];
        if (x.type==properties[0] && new RegExp(properties[1]).test(x.name) && x.offsetHeight>0) {
          if (formval.validationFunc["required"](x)===true) {
            counter++;
          }
        }
      }
      return counter<minNum ? ([false,minNum]) : true;
    },
    requiredexclusif:function(field) {
      var reqExclusifField = document.getElementById(field.getAttribute("reqexclusiffield"));
      if (!reqExclusifField) {
        alert("Vous n'avez pas associe le bon champ, verifiez l'attribut reqexclusif");
        return false;
      }
      if (field.getAttribute("requiredexclusifcondition")) {
        if (field.getAttribute("requiredexclusifcondition")=="noempty") {
          if (field.value!="" || reqExclusifField.value!="") return true;
          else return false;
        }
      } else 
        if ((field.value=="" && reqExclusifField.value=="") || (field.value!="" && reqExclusifField.value!="") ) return false;
    }
  },
  errorMessages:{
    required:{
      checkbox:I18N._('formval','required checkbox'),
      radio:I18N._('formval','required radio'),
      text:I18N._('formval','required text'),
      select:I18N._('formval','required select')
    },
    requiredoptional:this.required,
    email:I18N._('formval','email'),
    name:I18N._('formval','name'),
    numbers:I18N._('formval','numbers'),
    decimal:I18N._('formval','decimal'),
    phonenumber:I18N._('formval','phonenumber'),
    phonenumber2:I18N._('formval','phonenumber2'),
    equalsto:I18N._('formval','equalsto'),
    codepostal:I18N._('formval','codepostal'),
    cpordep:I18N._('formval','cpordep'),
    pseudo:I18N._('formval','pseudo'),
    image:I18N._('formval','image'),
    minimum:I18N._('formval','minimum'),
    requiredexclusif:I18N._('formval','requiredexclusif')
  },
  getMessagePosition:function(field){
    var element=field;
    var position="";
    if (field.getAttribute("position")) {
      var position = field.getAttribute("position");
      if (!position.match(/^(before|after)(label|parentnode|field)$/)) {
        position = formval.defaultPosition;
      }
      var arrPos = position.match(/^(before|after)(label|parentnode|field)$/);
      switch(arrPos[2]) {
        case "label" : 
          var node = field;
          while(node.nodeName!="LABEL") {
            node=node.previousSibling;
          }
          if (node.nodeName=="LABEL") element=node;
          break;
        case "parentnode" : 
          var parentPos = field.getAttribute("parentnode_pos") ? parseInt(field.getAttribute("parentnode_pos")) : 1;
          var element=field;
          for (var i=0; i<parentPos; i++) {
            element=element.parentNode;
          }         
          break;
      }
      return [arrPos[1],element];
    } else {
      return [formval.defaultPosition.match(/(before|after)(label|parentnode|field)/)[1],element]
    }
  },
  getSameElements:function(field) { //return an array of elements in form who have same nodeName, name and type
    var aReturnElements=[];
    var elt=field.form.elements;
    for (var i=0; i<elt.length; i++) {
      if (elt[i].nodeName==field.nodeName && elt[i].name==field.name && elt[i].type==field.type) {
        aReturnElements.push(elt[i]);
      }
    }
    return aReturnElements;
  },
  check:function(theForm, showOnlyOneMessage, otherReturnValues) {
    formval.globalErrorMsg = "";
    var scrollTop = document.body.scrollTop;
    var finalErrorMessage="";
    var hasError=false;
    var elm = theForm.elements;
    for (var i=0; i<elm.length; i++) {
      var x=elm[i];
      if (x.getAttribute("validation") && x.offsetHeight && x.offsetHeight>0) {
        var validOptions = x.getAttribute("validation").split(/\s+/g);
        finalErrorMessage="";
        for (var j=validOptions.length-1; j>=0; j--) {
          if (typeof(formval.validationFunc[validOptions[j]])=="function") {
            var returnMessage = formval.validationFunc[validOptions[j]](x);
            var quantity = typeof(returnMessage)=="object" && returnMessage.length ? returnMessage[1] : 0;
            returnMessage = typeof(returnMessage)=="object" && returnMessage.length ? returnMessage[0] : returnMessage;
            if (returnMessage==false || typeof(returnMessage)=="string") { //si message erreur ou index de tableau associatif
              hasError=true;
              if (x.getAttribute(validOptions[j]+"_em")!=null) { //si le champ possede un message personnalis&eacute; pour l'erreur alors on affihce
                finalErrorMessage=x.getAttribute(validOptions[j]+"_em");
              } else { //sinon
                if (typeof(returnMessage)=="string") { //si le message d'erreur est un index de tableau associatif
                  finalErrorMessage=formval.errorMessages[validOptions[j]][returnMessage]; //on va chercher le message associ&eacute; &agrave; cet index
                } else {
                  if (formval.errorMessages[validOptions[j]] && typeof(formval.errorMessages[validOptions[j]])=="string") { //si le message d'error est false
                    finalErrorMessage=formval.errorMessages[validOptions[j]]; //alors on retourne le message d'erreur associ&eacute;
                    if (quantity>0) finalErrorMessage=finalErrorMessage.replace(/\#\#/g,quantity);
                  }
                  else finalErrorMessage=formval.defaultErrorMessage; //sinon on affiche le message d'erreur par d&eacute;faut pour tout champ
                }
              }
            } else {
              formval.clearMessage(x);
            }           
          }
        }
        if (finalErrorMessage!="") formval.showMessage(x, finalErrorMessage);
      }
    }
    document.body.scrollTop=scrollTop;
    var secondErrorValue=false;
    if (otherReturnValues!=null) {
      if(typeof(otherReturnValues)=="boolean") {
        secondErrorValue=!otherReturnValues;
      } else {
        for (var i=0; i<otherReturnValues.length; i++) {
          if (!otherReturnValues[i]) secondErrorValue = true;
        }
      }
    }
    hasError = hasError || secondErrorValue;
    if (showOnlyOneMessage) {
      if (showOnlyOneMessage==true) {
        elm = null;
      } else {
        var elm = document.getElementById(showOnlyOneMessage);
      }
      if (hasError) {
        //elm.className+=" errorAlertShow";
        
      //  alert(formval.globalErrorMsg);
      } else {
        if (elm) elm.className=elm.className.replace(/\berrorAlertShow\b/g,"");
      }
    }
    formval.callbackfunctions();
    popLayer.fixSize();
    return (!hasError); //return true si aucune erreur sinon false;
  },
  checkIfErrorMessageBefore:function(field) {
    var node = field;
    var i=0;
    while(node.previousSibling && i<=2) {
      if (node.nodeType==1 && node.className.match(/\berrormsg\b/))
        return node;
      node=node.previousSibling;
      i++;
    }
    return null;
  },
  clearMessage:function(field) {
    if (field.getAttribute("typemessage") && field.getAttribute("typemessage")=="aspect") {
      if (field.getAttribute("rel") && field.getAttribute("rel")!="") {
        var elm = document.getElementById(field.getAttribute("rel"));
        elm.className = elm.className.replace(/\berror\b/g,"");
      }
    } else {
      if (field.associatedErrorMessage) {
        field.associatedErrorMessage.style.display="none";
      }
    }
  },
  insertAfter:function(parent, nodeToInsert, nodeInDom) {
    var node = parent.insertBefore(nodeToInsert, nodeInDom);
    parent.insertBefore(nodeInDom, nodeToInsert);
    return nodeToInsert;
  },
  showMessage:function(field, msg) {
    formval.globalErrorMsg += "- " + msg + "\n";
    if (field.getAttribute("typemessage") && field.getAttribute("typemessage")=="aspect") {
      if (field.getAttribute("rel") && field.getAttribute("rel")!="") {
        var elm = document.getElementById(field.getAttribute("rel"));
        elm.className+=" error";
      }
    } else {
      if (!field.associatedErrorMessage) {
        if (!formval.checkIfErrorMessageBefore(field)) {
          var pos = formval.getMessagePosition(field);
          var parentField = getParent(field, formval.lineInput);
          var msgField = formval.insertAfter(parentField.parentNode, document.createElement("span"),parentField);
          
          /*if (pos[0]=="before") {
            var msgField = pos[1].parentNode.insertBefore(document.createElement("span"),pos[1]);
          } else {
            var msgField = formval.insertAfter(pos[1].parentNode,document.createElement("span"),pos[1]);
          }*/
          msgField.className="errormsg";
          field.associatedErrorMessage=msgField;
        } else {
          field.associatedErrorMessage = formval.checkIfErrorMessageBefore(field);
        }
      }
      field.associatedErrorMessage.innerHTML=msg;
      field.associatedErrorMessage.style.display="";  
      //<span class="errormsg">Attention, ce champ est obligatoire</span>
    }
  }
}

/* addFormActions */

/* Add maxlength on textareas */
function maxLengthOntextarea() {
  var container = document.body;
  var textareas = container.getElementsByTagName("textarea");
  for (var i=0; i<textareas.length; i++) {
    var x= textareas[i];
    if (x.getAttribute("maxlength")) {
      addEvent(x, "keyup", checkMaxlength);
      addEvent(x, "keydown", checkMaxlength);
      addEvent(x, "blur", checkMaxlength);
    }
  }
}
function checkMaxlength(e) {
  var maxL = parseInt(this.getAttribute("maxlength"));
  if (this.value.length>maxL) {
    this.value=this.value.substr(0,maxL);
    this.scrollTop = this.scrollHeight;
  }
}
/* /maxlength */


function formInput(inputId, attributes) {
  var inp = document.getElementById(inputId);
  if (!inp) return;
  for (var i in attributes) {
    inp.setAttribute(i,attributes[i]);
  }
}

//function initFormInputs() {
/*
  formInput("champemail", { validation : "required email", email_em : "Cette email n'est pas bon", type_message : aspect};
  formInput("champ", { validation : "required"};
*/
//}
//addEvent(window, "load", initFormInputs);




/* ********************************* Fin Lib + Mootools ************************************* */
/* inputValue : function
  Permet de mettre le texte par defaut d'un champ de type texte.
*/ 
function inputValue(elm, state) {
  elm.oldValue=elm.value;
  elm.onfocus=function() {
    if (!this.isChecking && this.value==this.oldValue) this.value='';     
  }
  elm.onblur=function() {
    if(this.value=='') this.value=this.oldValue;
  }
  if (!elm.isChecking) elm.onfocus();
}

function forceCheck(elm, linkedInput) {
  linkedInput = typeof linkedInput=="string" ? document.getElementById(linkedInput) : linkedInput;
  linkedInput.checked = elm.checked;
}

/* generates corners and others elements if needed */
function generateElements(parent, stringClasses) {
  var i, x;
  parent = (typeof parent == "string") ? document.getElementById(parent) : parent;
  var content = parent || document.body;
  var div = content.getElementsByTagName("div");
  
  //recupere un node avec la class block_insideParDefaut
  function getIsd(node, className) { return getNode(node, {className: (className || "block_inside")})};
  
  // fonction de creation d'un coin (b avec className) 
  function nc(clN) {var b = document.createElement("b");b.className=clN;return b;};
  
  //ajoute un element ou une liste d'elements (c) sur l'element x
  function add(x, c) {
    var i=0; if (!x) return; 
    if (c.length) for (i=0; i<c.length; i++) x.appendChild(c[i].cloneNode(true));
    else x.appendChild(c.cloneNode(true));
  };
  
  //-- creation des elements qui seronts clones --
  var corners = [nc("tl"), nc("tr"), nc("bl"), nc("br")]; //corners 
  var shadow = nc("specialShadow"); add(shadow, [nc("lt"), nc("rt"), nc("trame")]); // specialShadow
  var overtl = nc("overtl"); // overtl : coin arrodis supplementaire pour les blocks avec des bordures speciales
  
  // -- creation des coins ou autres elements -- 
  // parcours des divs pour leur rajouter les corners
  
  // TODO SOUS IE 
  
  for (i=div.length-1; i>=0; i--) {
    x=div[i];
    if (!x.alreadyProcessed) {
      if (x.className.match(/\bblock\b/)) add(x, corners);
      x.alreadyProcessed = true;  
      initOtherBlocks(x); // fonction d'initialisation d'autres blocks
    }
  }
  //fixColumns();
}
/* initOtherBlocks() : fonction rajoute d'autres fonctionnalites sur differents blocks  (toggle, onglets),
   Cette fonction est forcement lancee depuis generateElements, et cela evite de faire une deuxieme passe sur les divs de la page
 */
function initOtherBlocks(x) {
  if (x.className.match(/\bline\b/)) //si ligne de block, on la stocke dans un tableau
    linesOfBlocks.push(x);
}

/******* 
* Tabs
 *******/
var tabs = {
  init : function(elm) {
    var ul = getNode(elm, {nodeName:"ul"});
    if (!ul) return;
    var a = ul.getElementsByTagName("a");
    for (var i=0; i<a.length; i++) {
      if (!hasAttributes(a[i], {className:"nochange"}))  {
        a[i].onclick = function() {
          tabs.change(this);
          return false;
        }
        tabs.size(a[i], ul);
      }
    }
  },
  size : function(a, ul) {
    a.style[heightPropertyToUse] = a.offsetHeight + (ul.offsetHeight-a.offsetHeight) - getVStyles(a) - getVMargins(a) - getVMargins(a.parentNode) - getVStyles(a.parentNode)+ "px";
  },
  change : function(elm) {
    var i, n, tabs, ul, li, body, tabCtns, current=0, block;
    ul = getParent(elm, {nodeName:"ul", className:"tabs(Big|Sub)?"});
    li = getParent(elm, {nodeName:"li"});
    tabs = ul.getElementsByTagName("li");
    block = getParent(ul, {nodeName:"div", className:"blockTabs(Sub)?"});
    // get What is the index of the new Tab and remove otherClass "current"
    for (i=0; i<tabs.length; i++) {
      if (tabs[i]==li) {
        current = i;
        addClass(li, "current");
      } else 
        removeClass(tabs[i], "current");
    }
    //get the tabCtn blocks, and show the contentTab that is match with clicked tab
    body = getNode(block, {nodeName:"div", className:"body"});
    tabCtns = getChildNodes(body, {nodeName:"div", className:"tabCtn"});
    for (i=0; i<tabs.length; i++) {
      n = tabCtns[i];
      removeClass(n, "tabCurrent");
      if (i==current) {
        addClass(n ,"tabCurrent");
      }
    }
    fixHeights(block); fixCorners(); //fixColumns();
  }
}

/*********
* ToggleBlock :  block qui s'ouvre et qui se ferme
**********/
var toggleBlock = {
  init : function(elm) {
    var head = getNode(elm, {className:"head"});
    if (head) 
      var a = getNode(head, {nodeName:"a"});
      if (a)
        a.onclick = function() {
          toggleBlock.toggle(this);
          return false;
        }
  },
  // ajout les fonctionnalites du open/close (toggle);
  toggle : function(elm) {
    elm.blur();
    var scrollTop = document.body.scrollTop;
    var block = getParent(elm, {nodeName:"div", className:"blockToggle"});
    window[(hasAttributes(block, {className:"toggleClosed"}) ? "remove" : "add")+"Class"](block, "toggleClosed"); //addClass or RemoveClass
    fixHeights(block); fixCorners(); //fixColumns();
    document.body.scrollTop = scrollTop;
  }
};


/**************
* sizeBlocks : alignement des blocks en hauteurs
**************/
var linesOfBlocks=[];
function sizeBlocks(parentBlock) {
  function size(block, size){
    if (block){
      var body = block.className.match(/\bblock\b/) ? getNode(block, {nodeName:"div", className:"body"}) : block; //si on a une line ou bien un block
      if (body) body.style[heightPropertyToUse] = body.offsetHeight + size - getVStyles(body) + "px";
    }
  };
  linesOfBlocks.eachInv(function (line) { //les lignes fournies sont
    var units = getChildNodes(line, {className:"unit"});
    units.each(function(unit) {
      var blocks = getChildNodes(unit, {className:"(block|line)"}, {className:"noresize"});
      var sizeToApply = line.offsetHeight-unit.offsetHeight;
      var sizePerBlock = parseInt(sizeToApply/blocks.length);
      blocks.each(function(block) {
        size(block, sizePerBlock);
      });
      //sur une division on tombe parfois sur un calcul pas precis, on resize le dernier element d'un unit, afin que le calcul soit correct
      if (blocks.length>1) size(blocks.getLast(), line.offsetHeight-unit.offsetHeight);
    });
  });
}

/***************
* fixColumns()
****************/
function fixColumns() {
  function fix() {
    var colonnes = ['main','rightColumn'],
      colonnesInside = ["", ""];
    var hMax=0, i, b, minMax=0, sum=0; hToU = heightPropertyToUse;
    
    function each(f) { //fonction d'iteration
      for (i=0; i<colonnes.length; i++){
        b = $(colonnes[i]);
        f();
      }
    }
    
    each(function() {
      sum=0;
      if (b) {
        getChildNodes(b, {}).each(function(node) { sum+=node.offsetHeight });
        if (sum>minMax) minMax=sum;
      }
    });
    // on remet la hauteur par defaut a toutes les colonnes (hauteur minimum)
    each(function() {
      var bToSize = $(colonnesInside[i]) || b;
      if (bToSize) bToSize.style[hToU] = minMax + "px";
    });
    // on recupere la hauteur la plus grande
    each(function() {
      if (b){
        if (b.offsetHeight + intStyle(b, "margin-top") >= hMax) {
          hMax = b.offsetHeight - intStyle(b, "margin-top");
        }
      }
    });
    // on applique la nouvelle hauteur sur les colonnes
    each(function() {
      var bIsd = $(colonnesInside[i]);
      if (b && bIsd) {
        var diff = (hMax - b.offsetHeight) + bIsd.clientHeight - getVStyles(bIsd);
        bIsd.style[hToU] = diff + 'px';
      } else if (b) {
        getVStyles(b);
        b.style[hToU] = hMax  - getVStyles(b) - intStyle(b, "margin-top") + 'px';
      }
      
    });
  };
  setTimeout(fix,1);
}


function showAndHide(field) {
  var allFields = getNodes(field.form, {name:field.name}, null, false, field.form.elements);
  allFields.each(function(field) {
    var elm = document.getElementById(field.value);
    elm.style.display = this.checked ? "block" : "none";
  });
  fixHeights(field);
}

/* pop up */
function popupcentree(page,largeur,hauteur,options) {
  var top=(screen.height-hauteur)/2;
  var left=(screen.width-largeur)/2;
  window.open(page,"","top="+top+",left="+left+",width="+largeur+",height="+hauteur+","+options);
}



/**** page seminaire ****/

function initArrayHotel(arrayId) {
  var array = $(arrayId);
  if (!array) return;
  for (var i=0; i<array.rows.length; i++) {
    var r = array.rows[i];
    if (r.className.match(/\bwantdetail\b/)) {
      r.onclick = function() {
        var detailRow = getNextSibling(this, {nodeName:'tr'});
        detailRow.className = detailRow.className.match(/\bhidden\b/) ? detailRow.className.replace(/\bhidden\b/,'') : detailRow.className+' hidden';
      }
    }
  } 
}

Element.observe(window, 'load', function() {
  initArrayHotel('arrayHotels');
});



/***********
* Init
************/
//fonction lancee pendant le chargement de la page

addBeforeDomReady(function() {
  maxLengthOntextarea();
  generateElements();
});
//fonction lancee une fois toute la page chargee
addEvent(window, 'load', function() {
  //sizeBlocks();
  fixCorners();
  fixHeights();

  //fixColumns(); //oblige pour laisser au navigateur le temps de se rafraichir
});


Event.observe(
  window,
  'load',
  function()
  {
    if(document.getElementById('arrivee'))
    {
      Event.observe(
        document.getElementById('arrivee'),
        'click',
        function(e)
        {
          Event.stop(e);
          pul_afficher("Calendrier");
        },
        false
      );
    }
    if(
      document.getElementById('liste_destinations') 
      && document.getElementById('liste_destinations').nodeName == "SELECT"
    )
    {
      Event.observe(
        document.getElementById('liste_destinations'),
        'change',
        function(e)
        {
          if(document.getElementById("nb_nuit") && document.getElementById("nb_nuit").value=="")
          {
            document.getElementById("nb_nuit").value = 1;
          }
        },
        false
      );
    }
    if(document.getElementById('bookingEngine'))
    {
      Event.observe(
        document.getElementById('bookingEngine'),
        'submit',
        function(e)
        {
          if(pul_checkRechercheForm(document.getElementById('bookingEngine')) === false)
          {
            Event.stop(e);
          }
        },
        false
      );
    }
    if (document.getElementById('calendar_link'))
    {
      Event.observe(
        document.getElementById('calendar_link'),
        'click',
        function(e)
        {
          Event.stop(e);
          pul_afficher("Calendrier");
        },
        false
      );
    }
    if (document.getElementById('calendar_prev'))
    {
      Event.observe(
        document.getElementById('calendar_prev'),
        'click',
        function(e)
        {
          Event.stop(e);
          pul_prevMonth();
        },
        false
      );
    }
    if (document.getElementById('calendar_next'))
    {
      Event.observe(
        document.getElementById('calendar_next'),
        'click',
        function(e)
        {
          Event.stop(e);
          pul_nextMonth();
        },
        false
      );
    }
    if(document.getElementById('email'))
    {
      Event.observe(
        document.getElementById('email'),
        'focus',
        function(e)
        {
          inputValue(document.getElementById('email'));
        },
        false
      );
    }
    if(document.getElementById('abonn_link'))
    {
      Event.observe(
        document.getElementById('abonn_link'),
        'click',
        function(e)
        {
          top.document.location.href="/mailing_list.svlt?action=SUBSCRIBE&site=PUL,AEC|PMO&email="+document.mailform.email.value+"&origine=WEB";
          Event.stop(e);
        },
        false
      );
    }
    if(document.getElementById('destRadioList'))
    {
      Event.observe(
        document.getElementById('destRadioList'),
        'click',
        function(e)
        {
          for (var i = document.getElementById('destRadioList').getElementsByTagName("INPUT").length - 1; i >= 0; i--)
          {
            var item = document.getElementById('destRadioList').getElementsByTagName("INPUT")[i];
            if (item.checked === true)
            {
              document.getElementById("liste_destinations").value = item.value;
            }
          };
        },
        false
      );
    }
  if(document.getElementById('menu'))
    {
    for (var i = document.getElementById('menu').getElementsByTagName("A").length - 1; i >= 0; i--)
    {
      var a = document.getElementById('menu').getElementsByTagName("A")[i];
      if(a.href.lastIndexOf("#") == (a.href.length - 1))
      {
        Event.observe(
              a,
              'click',
              function(e)
              {
            Event.stop(e);
          },
          false
        );
      }
    }
    }
  for(var i = 0; i < document.getElementsByTagName('a').length; i++)
  {
    var lien = document.getElementsByTagName('a')[i];
    if(lien.className.search(/clickPop/) != -1)
    {
      Event.observe(
        lien,
        'click',
        function(e)
        {
          Event.stop(e);
          var link = Event.element(e);
          window.open(link.href,'popup','location=no,toolbar=no,directories=no,menubar=no,resizable=yes,scrollbars=yes,status=no,width=400,height=400');
        },
        false
      );
    }
  }
  },
  false
);

Event.observe(
  window,
  'load',
function (){
if($('nav-gauche')){
  
    var ClassCurrent = $('nav-gauche').className;
    var i = 0;
    var e;

    while (e = $('nav-gauche').getElementsByTagName('li') [i++]) {
      
      if(e.id == ClassCurrent) {
        e.className = 'current'; 
        break;
      }
    
    }
  }else{
    
    return;
  }

}
);

Event.observe(
  window,
  'load',
function () {
  if($('toggle_appear')){
  $('toggle_appear').hide();
  $$('a.toggle_closed').each(function(elt) {
    $(elt).observe('click', function(event){
                     
    Effect.toggle(
    'toggle_appear', 
    'slide', 
    { delay: -1 });
    
    });
  });
  }
  
}
);

function pop_v(URL,larg,haut){
  window.open(URL,'pop' + larg+haut,'location=no,toolbar=no,directories=no,menubar=no,resizable=no,scrollbars=no,status=no,width=' + larg + ',height=' + haut);
}

/*****/
var PUL_Slider= Class.create();
PUL_Slider.prototype = {
  clickItems : [],
  newsList : null,
  itemIndex : 0,
  onEffect:false,
  isInfinite:false,
  toTop: false,
  delay: 0,
  duration: 0,
  initialize: function(param){
    this.newsList = param.listItem;
    this.isInfinite = param.isInfinite;
    this.clickItems.clear();
    this.clickItems[0] = param.clickItemUp;
    if(param.clickItemDown)
      this.clickItems[1]= param.clickItemDown;
    if(param.delay)
      this.delay = param.delay;
    if(param.duration)
      this.duration = param.duration;
    this.initEvents();
    if(param.doIt)
      this.doIt();
  },
  initEvents: function(){
    this.clickItems.each(function(item){
      Event.observe(item, 'click', function(event){
        var direction = '';
        if(Event.element(event).up('div').hasClassName('up')) direction = 'up';
        this.move(direction, false);
      }.bind(this));
    }.bind(this));
  },
  move: function(direction, isAuto){
    var height = this.newsList.immediateDescendants()[0].getHeight();
    height = direction == 'up' ? 0 - height : height;
    if(!this.onEffect && (this.isInfinite || !this.isInfinite && (this.itemIndex > 0 && direction != 'up' || this.itemIndex < this.newsList.immediateDescendants().length-1 && direction == 'up'))){
      new Effect.MoveBy(this.newsList, height, 0, {duration: this.duration, delay: (isAuto ? this.delay : 0), transition: Effect.Transitions.sinoidal, 
      beforeStart:
        function(){
          this.onEffect = true;
        }.bind(this),
      afterFinish: 
        function(){
          if(direction == 'up'){
            if(this.isInfinite){
              var clonedItem = this.newsList.immediateDescendants()[this.itemIndex].cloneNode(true);
              this.newsList.appendChild(clonedItem);
            }
            this.itemIndex++;
          }
          else if(!this.isInfinite){
            this.itemIndex = this.itemIndex == 0 ? 0 : this.itemIndex - 1;
          }
          this.onEffect = false;
        }.bind(this)
      });
    }
  },
  doIt: function(){
    new PeriodicalExecuter(function(pe){
      var direction = '';
      
      if(this.isInfinite || !this.toTop && !this.isInfinite && this.itemIndex < this.newsList.immediateDescendants().length-1)
        direction = 'up';
      else if(!this.toTop) this.toTop = true;
      else if(this.itemIndex <= 1) this.toTop = false;
      
      this.move(direction, true);
    }.bind(this), 4);
  }
}

Event.observe(window, 'load', function(){
  var lang = 'gb';                     


  try {     
    var contentLanguageMetaTag = $$('meta[@http-equiv=Content-Language]')[0];
    lang = contentLanguageMetaTag.getAttribute('content') == 'en' ? 'gb' : contentLanguageMetaTag.getAttribute('content');
  } catch (e) {
  }


  if($('home')){
    try {
      new PUL_Slider({listItem: $$('#deals ul')[0], 
            clickItemUp: $$('#main #mainInside .line .unit .arrowBottom img')[0], 
            isInfinite: true,
            doIt: true,
            delay: 4});
    } catch (e) {
      
    } 
    flashHome(lang);
    generateElements();
  }

	if($('slideShowBooking'))
    slideshow('booking');
  if($('liste_destinations') && !$('slideShow') && !$('slideShowBooking')){
    Event.observe($('recherche'), 'mouseover', function(){
      Event.observe(this, 'mouseout', function(){
        $('liste_destinations').setStyle({visibility:'visible'});
        new PeriodicalExecuter(function(pe){$('liste_destinations').setStyle({visibility:'visible'});pe.stop();}, .2);
      });
    });
  }   
  
  rewriteForm(); 
  if ($('liste_destinations_pays')){
	Event.observe("liste_destinations_pays", 'change', function(event){rewriteListeVilleOuHotel();});
  }
  
  
  
  
    
});

function rewriteForm(){
  rewriteListePays();
  if($("liste_destinations_pays")){  
    if($("liste_destinations_pays").value != ""){
      rewriteListeVilleOuHotel();
    }
    else{
      var citySelect = $("liste_destinations");
      citySelect.disabled = true;
    }
  }
  
} 

function rewriteListePays(){
try{
  var countrySelect = $("liste_destinations_pays");
  countrySelect.options[0] = new Option(selectCountry, "");      
 
  var citySelect = $("liste_destinations");
  citySelect.options[0] = new Option(selectCity, "");
  /*citySelect.options[0].setStyle({fontWeight:  'bold'});*/
  
  
  
  var countries = new Array();
  if(mapSelectLieu != null){
    var filter= getFilteredOffer(); 
    for(var pays in mapSelectLieu){
      var nbHotels = mapSelectLieu[pays].length;
      var nbHotelsFiltered = 0;
      for(var i=0; i<nbHotels; i++){
    
        try{
      if((filter !== false)  && eval('mapSelectLieu["'+pays+'"][i].'+filter) == 0){
        continue;
      }
    }catch(e){
    
    }
        nbHotelsFiltered=nbHotelsFiltered+1;
      }
      if(nbHotelsFiltered>0){
        countries.push(pays);
      }
    }
    for (var i=0; i<countries.length; i++){
      countrySelect.options[i+1] = new Option(countries[i],countries[i]);
    /*countrySelect.options[i+1].setStyle({paddingLeft:'10px'});
    countrySelect.options[i+1].setStyle({fontWeight:'normal'});   */
    }
  }
  }
  catch(e){
  
  }
}

function getFilteredOffer(){
    var filter=false;
	if ($('slideShowGateway')) filter='getAway';
	if ($('slideShowmomentoffers')) filter='earlyBooking';
	return filter;
}

function rewriteListeVilleOuHotel(){
  var countrySelect = $("liste_destinations_pays");
  var citySelect = $("liste_destinations");
  citySelect.options.length = 0;
  citySelect.innerHTML = "";
  citySelect.options[0] = new Option(selectCity, "");
  if($("liste_destinations_pays").value != ""){
    citySelect.disabled = false;
    if(mapSelectLieu[countrySelect.value] != null && mapSelectLieu[countrySelect.value].length>0){
      var hotelOuVilles = new Array();
      var nbHotels = mapSelectLieu[countrySelect.value].length;
      var filter= getFilteredOffer(); 
      for(var i=0; i<nbHotels; i++){
        if((filter !== false)  && eval('mapSelectLieu[countrySelect.value][i].'+filter) == 0){
          continue; 
        }
        hotelOuVilles.push(mapSelectLieu[countrySelect.value][i]);
      }
      for(var i=0; i<hotelOuVilles.length; i++){
        var nomHotel  = hotelOuVilles[i].txt;
        var codeHotel = nomHotel;
        if (hotelOuVilles[i].val){
          codeHotel = hotelOuVilles[i].val;
        }
        citySelect.options[i+1] = new Option(nomHotel,codeHotel);
    /*citySelect.options[i+1].setStyle({paddingLeft:'10px'});
    citySelect.options[i+1].setStyle({fontWeight:'normal'});    */
    
      }
      // if only one result, select it.
      if(hotelOuVilles.length == 1){
         citySelect.options[1].selected="selected";  
      }
    }
  }
  else{
    citySelect.disabled = true;
  }
  /*citySelect.options[0].setStyle({fontWeight:  'bold'});*/
}
 
function flashHome(lang){
  var flash = new SWFObject("/"+lang+"/flash/home.swf", "flash", "672", "345", "7", "#ffffff");
  flash.addParam("wmode", "transparent");
  flash.addVariable("brand","PUL");
  flash.addVariable("mark","PUL");
  flash.addVariable("lang","fr");
  flash.addVariable("cat","C");
  //flash.write("flash");
}

function slideshow(name){
  var flashSlide = new SWFObject("/flash/slideshow_"+name+".swf", "flash", "614", "120", "7", "#ffffff");
  flashSlide.addParam("wmode", "transparent");
  flashSlide.write("flash");
}

function start_slideshow(start_frame, end_frame, delay, lis) {
  setTimeout(fadeInOut(start_frame,start_frame,end_frame, delay, lis), delay);
}


function fadeInOut(frame, start_frame, end_frame, delay, lis) {
  return (function() {
    lis = $('#news_flow').getElementsByTagName('li');
    Effect.Fade(lis[frame]);
    if (frame == end_frame) { frame = start_frame; } else { frame++; }
    lisAppear = lis[frame];
    setTimeout("Effect.Appear(lisAppear);", 0);
    setTimeout(fadeInOut(frame, start_frame, end_frame, delay), delay + 1850);
  })
  
}