
var Import = function (scriptName, noCache){
    var cache = noCache ? "?noCache=" + (new Date()).getTime() : "";
    var ext = /\./.test(scriptName) ? "" : ".js";
    document.write('<script type="text/javascript" charset="utf-8" src="/elements/js/' + scriptName + ext + cache + '"></script>');
};

var scripts = ["_cufon.js","medium.font.js","heavy.font.js"]

for(var i=0,l=scripts.length;i<l;i++){
    var script = scripts[i]
    Import(script);
}

function cufonize(){
    // IE tricks
    Cufon.now();
    var titres = document.getElementsByTagName('h1');
    for(var i=0,l=titres.length;i<l;i++){
        var titre = titres[i]
        Cufon.replace(titre, {fontFamily:"medium"});
    }
}

/* 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 clearInput(elm, state) {
    if (!elm.getAttribute('oldValue') || elm.getAttribute('oldValue') == elm.value){
        elm.setAttribute('oldValue', elm.value);
        elm.value = '';
    }
    elm.onblur=function() {
        if(elm.value=='') elm.value=elm.getAttribute('oldValue');
    }
}


function forceCheck(elm, linkedInput) {
    linkedInput = typeof linkedInput=="string" ? document.getElementById(linkedInput) : linkedInput;
    linkedInput.checked = elm.checked;
}


/**********
 * Navigation
 **********/

var navigation = {
    init : function() {
        var nav = document.getElementById("menu");
        if (!nav) return;
        var ul = getNode(nav, {nodeName:"ul"});
        if (!ul) return;
        var ulX = findPos(ul)[0];
        var ulX = findPos(ul)[0];
        var lis = getChildNodes(ul, {nodeName:"li"});
        lis.each(function(li) {
            var ul = getNode(li, {nodeName:'ul'});
            if (!ul || ul.offsetHeight==0) return;
            var lis2 = getChildNodes(ul, {nodeName:"li"});
            lis2.each(function(li){
                if (li.offsetHeight>0) {
                    var div = getNode(li, {nodeName:'div'});
                    if (div) {
                        var liX = findPos(li)[0];
                        div.style.display = 'block';
                        if (liX-ulX+div.offsetWidth>ul.offsetWidth) {
                            addClass(li, 'rightnav');
                        }
                        div.style.display = '';
                    }
                }
            });
            var last = lis2.last();
            if (last) last.className+=" lastnav";
        });
    }
}

/* 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 blockInsideParDefaut
    function getIsd(node, className) { return getNode(node, {className: (className || "blockInside")})};

    // 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
    for (i=div.length-1; i>=0; i--) {
        x=div[i];
        if (!x.alreadyProcessed) {
            /*
             if (x.className.match(/\bblock\b/)) //block par defaut
             add(getIsd(x), corners);
             if (x.className.indexOf("arrayBlock")!=-1) {
             add(x, corners);
             }
             */
            if (x.className.match(/\bspecialShadow\b/)) // block avec ombre dessous
                add(x, shadow);
            /*
             if (x.className.match(/\bblockToggle|blockShadowSimple\b/)) { //blocks avec coins absolus sur tous les cotes.
             add(getIsd(x), overtl);
             }
             */
            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) {
    // block a onglets
    if (x.className.match(/\bblockTabs(Sub)?\b/)) //block d'onglets en general (gere tous types d'onglets).
        tabs.init(x);
    if (x.className.indexOf("blockToggle")!=-1) //block ouvert/ferme
        toggleBlock.init(x);
    if (x.className.indexOf("scrollH")!=-1)  //block de scroll horizontal
        scroll.init(x);
    if (x.className.indexOf("blockDossiers")!=-1)  //block Dossiers Thematiques
        dossiersBlock.init(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) {
        var newSize =  a.offsetHeight + (ul.offsetHeight-a.offsetHeight) - getVStyles(a);
        a.style[heightPropertyToUse] = (newSize<0) ? 0 : newSize + "px"; //IE doesn't compute size under 0
    },
    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)
        if (!a.className.match(/\bnochange\b/)) {
            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"});
        var plusToggle = getNode(elm, {nodeName:"span", className:"plusToggle"});
        if(plusToggle.innerHTML == "[ - ]") plusToggle.innerHTML = "[ + ]";
        else plusToggle.innerHTML = "[ - ]";
        window[(hasAttributes(block, {className:"toggleClosed"}) ? "remove" : "add")+"Class"](block, "toggleClosed"); //addClass or RemoveClass
        fixHeights(block); fixCorners(); fixColumns();
        document.body.scrollTop = scrollTop;
    }
};

/*********
 * DossiersBlock :  block de dossiers thématiques paginé
 **********/
var dossiersBlock = {
    init : function(elm) {
        /*UN COMMENT IF TOPIC NAVIGATION IS NEEDED*/
//        var db_displayButton = getNode(elm,{className:"displayTopics"});
//        db_displayButton.removeAttribute("href");
//        db_displayButton.onclick = function() {
//            var topicArray = new Array();
//            topicArray.push([getNode(elm, {name:"tri"}).value]);
//            dossiersBlock.changeTopic(topicArray);
//            dossiersBlock.db_prevButn.style.display = "none";
//            dossiersBlock.db_nextButn.style.display = "none";
//        };
        var db_pageButtons = getElementsByClassName(elm,"a","pglnk");
        for(var pgIndx = 0;pgIndx < db_pageButtons.length;pgIndx++){
            db_pageButtons[pgIndx].onclick = function() {
                dossiersBlock.setPage(this.firstChild.nodeValue);
            };
            db_pageButtons[pgIndx].removeAttribute("href");
        }
        dossiersBlock.pageQuantity = db_pageButtons.length;
        dossiersBlock.db_prevButn = getNode(getNode(elm,{className:"prev"}),{nodeName:"a"});
        dossiersBlock.db_prevButn.removeAttribute("href");
        dossiersBlock.db_prevButn.onclick = function(){
            dossiersBlock.setPage(dossiersBlock.currentPage - 1);
        };
        dossiersBlock.db_nextButn = getNode(getNode(elm,{className:"next"}),{nodeName:"a"});
        dossiersBlock.db_nextButn.removeAttribute("href");
        dossiersBlock.db_nextButn.onclick = function(){
            dossiersBlock.setPage((+dossiersBlock.currentPage) + 1);
        };

        dossiersBlock.setPage(1);
    },
    changeTopic : function(topicsArray) {
        var topicBlocks = getElementsByClassName(document,"div","dossierElm");
        for(var i=0;i < topicBlocks.length;i++){
            if((arrayContains(topicsArray,topicBlocks[i].id))||(arrayContains(topicsArray,"all")))
                topicBlocks[i].style.display = "block";
            else
                topicBlocks[i].style.display = "none";
        }
    },
    setPage : function(pageNb) {
        var firstItemNb = (((+pageNb)-1)*4);
        var topicBlocks = getElementsByClassName(document,"div","dossierElm");
        for(var i=0;i < topicBlocks.length;++i){
            if((i >= firstItemNb)&&(i < (firstItemNb+4))){
                topicBlocks[i].style.display = "block";
            }
            else {
                topicBlocks[i].style.display = "none";
            }
        }

        if(pageNb == 1){
            dossiersBlock.db_prevButn.style.display = "none";
            if(dossiersBlock.pageQuantity > 1)
                dossiersBlock.db_nextButn.style.display = "inline";
            else
                dossiersBlock.db_nextButn.style.display = "none";
        }
        else if(pageNb >= dossiersBlock.pageQuantity){
            dossiersBlock.db_prevButn.style.display = "inline";
            dossiersBlock.db_nextButn.style.display = "none";
        }
        else{
            dossiersBlock.db_prevButn.style.display = "inline";
            dossiersBlock.db_nextButn.style.display = "inline";
        }
        dossiersBlock.currentPage = pageNb;
    }
};

function arrayContains(myArray, myValue){
    var returnValue = false;
    for(var loopCount = 0;loopCount < myArray.length;loopCount++){
        if(myArray[loopCount] == myValue)
            returnValue = true;
    }
    return returnValue;
}


/********
 * Scroll
 **********/
var scroll = {
    time : 20,
    increment : 4,
    // initialise les blocks de scrolling en rajoutant les fonctions sur les boutons, ainsi qu'en alignant ce qui doit etre aligne
    init : function(elm) {
        var left, right, scrollIsd, scrollCtn, totalWidth = 0;
        left = getNode(elm, {className:"scrollLeft"});
        right = getNode(elm, {className:"scrollRight"});
        elm.scrollIsd = getNode(elm, {className:"scrollIsd"});
        function initButton(btn, sens) {
            btn.onmouseover = function() { scroll.scrollH(this, sens); };
            btn.onmouseout = function() { scroll.stop(this); };
        };
        initButton(left, -1);
        initButton(right, 1);
        function init() {scroll.initButtonsPosition(elm,[left,right]);};
        init();
        addOnLoadFunc(function() {
            init();
            scroll.sizeHContent(elm);
        })
    },
    // centre verticalement les boutons de scrolling
    initButtonsPosition : function(elm, arrElms) {
        removeClass(document.documentElement, 'hasJS');
        arrElms.each(function(btn) {
            if (btn) {
                btn.style.marginTop = (elm.offsetHeight-btn.offsetHeight)/2+"px";
                if (elm.scrollIsd.scrollWidth>elm.scrollIsd.offsetWidth)
                    btn.style.visibility = "visible";
            }
        });
        addClass(document.documentElement, 'hasJS');

    },
    //resize les contenus horizontaux, cela permet d'afficher les produits correctement sans qu'aucun ne soit coupe � l'affichage.
    sizeHContent : function(elm) {
        scroll.getScrollElm(elm, "scrollH");
        if (!elm.scrollElm) return;
        var prods = getNode(elm, {nodeName:"table", className:"prods"}); //on recupere le tableau de produits
        if (!prods || elm.scrollElm.scrollWidth<=elm.scrollElm.offsetWidth) return;

        if (prods.rows[0]) {
            var tds = prods.rows[0].cells;
        }
        var width=0, paddings=0, td, sumWidth=0;
        //on recupere le nombre maximum de produits qu'on peut afficher, on recupere aussi les paddings sur les TD
        //et on joue avec les paddings pour reduire ou augmenter la largeur entre les produits
        for (var i=0; i<tds.length; i++) {
            td = tds[i]
            width+=td.offsetWidth;
            paddings += intStyle(td, "padding-left")+intStyle(td, "padding-right");
            if (width>elm.scrollElm.offsetWidth) break;
        }
        var lastProd = td;
        if (width-elm.scrollElm.offsetWidth>=lastProd.offsetWidth) return;
        var paddingsMin = 5*2*(i+1); //on calcule les paddings minimum qu'on peut accepter pour reduire les paddings afin d'afficher le dernier element qui est coupe
        var numberOfProductsToShow = (paddingsMin>=width-elm.scrollElm.offsetWidth) ? i+1 : i;
        for (var i=0; i<numberOfProductsToShow; i++) {
            var td = tds[i];
            sumWidth += td.offsetWidth-intStyle(td, "padding-left")-intStyle(td, "padding-right");
        }
        var newPaddings = parseInt(((elm.scrollElm.offsetWidth-sumWidth)/numberOfProductsToShow)/2)?parseInt(((elm.scrollElm.offsetWidth-sumWidth)/numberOfProductsToShow)/2):0;
        var moduloPaddings = (elm.scrollElm.offsetWidth-sumWidth)%numberOfProductsToShow?(elm.scrollElm.offsetWidth-sumWidth)%numberOfProductsToShow:0;
        for (var i=0; i<tds.length; i++) {
            var td=tds[i];
            td.style.paddingLeft = newPaddings + "px";
            td.style.paddingRight = newPaddings + (i<moduloPaddings ? 1 : 0) + "px";
        }
    },
    //scrollH() : fonction de scrolling (elle se rappelle elle meme, elle est initiee sur l'evenement onmouseover d'un bouton
    scrollH : function(elm, sens) {
        scroll.getScrollElm(elm, "scrollH");
        elm.scrollElm.scrollLeft += scroll.increment * sens;
        elm.scrollElm.scrollTimer = setTimeout(function() {scroll.scrollH(elm, sens)}, scroll.time);
    },
    getScrollElm : function(elm, className) {
        if (!elm.scrollElm) {
            var par = getParent(elm, {nodeName:"div", className:className});
            elm.scrollElm = getNode(par, {className:"scrollIsd"});
        }
    },
    //scrollStop() : stop le scrolling en se basant sur le timer accroche au block qui scrolle.
    stop : function(elm) {
        if (elm.scrollElm)
            clearTimeout(elm.scrollElm.scrollTimer);
    }
};

/**************
 * sizeBlocks : alignement des blocks en hauteurs
 **************/
var linesOfBlocks=[];
function sizeBlocks() {
    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
            var h = body.offsetHeight + size - getVStyles(body);
		  if (body && h>0) 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|blockTabs)"});
            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.last(), line.offsetHeight-unit.offsetHeight);
        });
    });
}

/**************
 * sizeContent : alignement des contenus
 **************/
var contentsArray=[];
function contentAdd(ContainerAttr, childNodeAttr, numberPerLines) {
    contentsArray.push({container:ContainerAttr, child:childNodeAttr, number:numberPerLines});
}
function contentSize() {
    contentsArray.each(function(attr) {
        var containers = getNodes(document, attr.container);
        containers.each(function(container) {
            var childs = getNodes(container, attr.child);
            var lineBreak = attr.number;
            var maxH = 0, count=1, lineArray=[];
            function sizeElements() {
                lineArray.each(function(line) {
                    line.style[heightPropertyToUse] = maxH - getVStyles(line) + "px";
                });
                lineArray=[];
                count=0;
                maxH=0;
            }
            childs.each(function(child) {
                if (count==1){
                    child.parentNode.style.clear="left";
                }
                if (child.offsetHeight>maxH) maxH = child.offsetHeight;
                lineArray.push(child);
                if (count>=lineBreak) {
                    sizeElements();
                }
                count++;
            });
            sizeElements();
        });
    });
}

/************
 * listMenu
 *************/
var listMenu = {
    currentMenu : null,
    currentLink : null,
    init : function() {
        var ul = getNodes(document, {nodeName:"ul", className:"listMenu"});
        ul.eachInv(listMenu.transform);
    },
    transform : function(menu) {
        var ul = getNodes(menu, "ul");
        ul.each(function(ul) {ul.className="";});
        var className = menu.className;
        menu.className = "";
        var a = getNode(menu, "a");
        if (menu.getAttribute("title")) {
            var str = menu.getAttribute("title");
        } else {
            var str = a ? a.innerHTML : "";
        }
        menu.title="";
        /* creation bouton */
        var btn = document.createElement("a");
        btn.innerHTML = "<strong><span><span>"+str+"</span></span></strong>";
        btn.href="javascript:;";
        addClass(btn, "listMenuLink");
        btn = menu.parentNode.insertBefore(btn, menu);
        addEvent(btn, "click", cancelBubble);
        btn.onclick = listMenu.open;
        //creation du menu
        btn.menu = document.createElement("div");
        btn.menu.className = "listMenu";
        btn.menu.appendChild(menu);
        //on place le bouton dans un ul pour lui donner le style qu'il doit avoir par defaut.
        var ul = document.createElement("ul");
        ul.className = className;
        toggleClass(ul, "listMenu", "listMenuCtn");
        btn.parentNode.insertBefore(ul, btn);
        var li = ul.appendChild(document.createElement("li"));
        li.appendChild(btn);
    },
    open : function() {
        if (listMenu.currentMenu && this==listMenu.currentLink) {
            listMenu.close();
        } else {
            listMenu.currentLink = this;
            setTimeout(function() {addEvent(document, "click", listMenu.close)}, 20);
            listMenu.close();
            var container = document.getElementById("page") || document.getElementById("pageBol");
            var menu = container.appendChild(this.menu.cloneNode(true));
            listMenu.resize(menu, this, container);
            listMenu.position(menu, this, container);
            listMenu.currentMenu = menu;
            var a = getNode(menu, "a");
            if (a) a.focus(); //put the focus on the first link cause accessibility
            ifrlayer.make(menu);
        }
        return false;
    },
    close : function() {
        if (listMenu.currentMenu) {
            listMenu.currentMenu.parentNode.removeChild(listMenu.currentMenu);
            ifrlayer.kill(listMenu.currentMenu);
            delete listMenu.currentMenu;
        }
        removeEvent(document, "click", listMenu.close);
    },
    resize : function(menu, button) {
        var HStyles = getHStyles(menu);
        menu.style.width = button.offsetWidth-HStyles+"px";
        if (menu.scrollWidth>menu.offsetWidth)
            menu.style.width = menu.scrollWidth-HStyles+"px";
    },
    position : function(menu, button, container) {
        var pos = findPos(button);
        var posPage = findPos(container);
        var newLeft = pos[0]-posPage[0];
        menu.style.left = (newLeft+menu.offsetWidth < container.offsetWidth ? newLeft : newLeft-(menu.offsetWidth-button.offsetWidth-2))+"px"; //i don't know why i must add -2
        menu.style.top = pos[1]-posPage[1]+button.offsetHeight+"px";
    }
}

/***************
 * 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() { sum+=this.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);
}

/*************
 * PopLayer
 **************/
var popLayer = {
    template : '<b class="popt"><b></b></b><div class="popInside"><b class="popl"></b><b class="popr"></b><div class="popBody"><div class="popHead"><b class="close"></b></div><div class="popContent">Content Here</div></div></div><b class="popb"><b></b></b>',
    pop : null,
    currentPosition:null,
    popContent : null,
    timeout : null,
    elmSource : null,
    eventsArray : ["click", "mouseover", "mouseout", "mousemove", "mouseup", "mousedown", "keyup", "keydown", "keypress", "abort", "blur", "change", "dblclick", "error", "load", "reset", "resize", "select", "submit"],
    init : function(parent) {
        if (!popLayer.pop) {
            parent = (typeof parent =="string") ? document.getElementById(parent) : parent;
            parent = parent || document.body;
            var pop = document.getElementById("popLayer");
            if (!pop) {
                pop = parent.appendChild(document.createElement("div"));
                pop.id = "popLayer";
                pop.innerHTML = popLayer.template;
            }
            popLayer.pop = pop;
            popLayer.popContent = getNode(pop,  {nodeName:"div", className:"popContent"});
            pop.style.marginLeft = -pop.offsetWidth/2+"px"
            var close = getNode(pop, {className:"close"});
            close.onclick = function() { popLayer.close(); };
        }
        popLayer.close();
        popLayer.pop.style.width = "";
        popLayer.pop.className = "";
        popLayer.pop.style.display = "block";
        popLayer.popContent.innerHTML = "";
        popLayer.popContent.style.height = "";
    },
    openHtml : function(elm, content, width, height, mask) { popLayer.open(elm, 'html', content, width, height, mask); },
    openTag : function(elm, content, width, height, mask) { popLayer.open(elm, 'tag', content, width, height, mask); },
    openUrl : function(elm, content, width, height, mask) { popLayer.open(elm, 'url', content, width, height, mask); },
    open : function(elm, type, content, width, height, mask) {
        popLayer.elmSource = elm;
        popLayer.init();
        popLayer.setPosition(elm);
        switch(type) {
            case 'html' :
                popLayer.popContent.innerHTML = content;
                break;
            case 'tag' :
                content = typeof(content)=="string" ? document.getElementById(content) : content;
                popLayer.copyNodes(content, popLayer.popContent);
                break;
            case 'url' :
                popLayer.pop.className = "iframe loading";
                popLayer.popContent.innerHTML = '<iframe class="popIframe" onload="popLayer.loaded()" frameborder="0"></iframe>'; //cause IE, we must use innerHTML instead of DOM functions
                var loader = popLayer.popContent.appendChild(document.createElement("b"));
                loader.className="loader";
                var ifr = getNode(popLayer.popContent, {nodeName:"iframe"});
                popLayer.iframe = ifr;
                ifr.src = content;
                popLayer.timeout = setTimeout(popLayer.loaded,3000);
                break;
            default :
                alert("Vous n'avez pas specifie le bon type de contenu");
                return;
        }
        if (mask) {
            popLayer.showMask();
        }
        setTimeout(function() {
            if (popLayer.iframe) {
                var pWin = popLayer.iframe.contentWindow || popLayer.iframe.window;
                if (pWin && elm) {
                    pWin.onload = function() {
                        popLayer.setPosition(elm);
                    };
                }
            }
        }, 10);
        popLayer.resize(width, height);
        popLayer.setPosition(elm);
        popLayer.pop.style.visibility = "visible";
        ifrlayer.make(popLayer.pop);
    },
    close : function(url) {
        popLayer.hideMask();
        if (url) {
            if (window.parent) {
                window.parent.location.href=url;
            }
        }
        function close(from) {
            from.popLayer.hideMask();
            from.popLayer.pop.style.visibility = "hidden";
            from.popLayer.pop.style.display = "none";
            ifrlayer.hide(from.popLayer.pop);
        };
        if (window.parent) close(window.parent);
        ifrlayer.hide(popLayer.pop);
        try {close(window);}
        catch(e){ifrlayer.hide(popLayer.pop);};

    },
    resize: function(width, height) {
        var doc, objectSized;
        if (width) {
            var pWin = popLayer.iframe && (popLayer.iframe.contentWindow || popLayer.iframe.window);
            if (pWin) {
                popLayer.pop.style.width = width + (popLayer.pop.offsetWidth-popLayer.popContent.offsetWidth) + "px";
            }
            else
                popLayer.pop.style.width = width + ((width+"").match(/%/) ? "%" : "px");
        }
        if (height) {
            if (popLayer.iframe) {
                if (isNaN(height)) {
                    objectSized = height;
                    height = objectSized.offsetHeight;
                }
                popLayer.iframe.style.height="10px";
                if (objectSized && objectSized.scrollHeight>=popLayer.iframe.offsetHeight) {
                    popLayer.iframe.style.height = objectSized.scrollHeight + 1 + "px"; //on met la taille pour supprimer le scroller
                    popLayer.iframe.style.height = "10px"; //on remet la taille � 10 pour avoir le bon scrollHeight
                    popLayer.iframe.style.height = objectSized.scrollHeight + 1 + "px"; //on resize definitifement via le bon scrollHeight
                } else {
                    popLayer.iframe.style.height = height+"px";
                }
            }
            else
                popLayer.popContent.style.height = height+"px";
        }

        var sides = getNodes(popLayer.pop, {nodeName:"b", className:"pop(r|l)"});
        sides.each(function(side) { side.style.height = side.parentNode.offsetHeight + "px"; });
        ifrlayer.make(popLayer.pop);
    },
    setPosition : function(elm, top, left) {
        popLayer.pop.style.marginLeft = -popLayer.pop.offsetWidth/2+"px";
        if (elm && typeof elm!="string")
            popLayer.pop.style.top = findPos(elm)[1] + 10 + "px";
        else
            popLayer.pop.style.top = document.documentElement.clientHeight>popLayer.pop.offsetHeight ? parseInt((document.documentElement.clientHeight-popLayer.pop.offsetHeight)/2) + document.documentElement.scrollTop + "px" :  document.documentElement.scrollTop + 10 + "px";
        ifrlayer.move(popLayer.pop);
    },
    fixSize : function(elmSrc) {
        if (window.parent && window.parent.popLayer && window.parent.popLayer.iframe) {
            window.parent.popLayer.iframe.style.height="10px";
            window.parent.popLayer.resize(null, document.documentElement.scrollHeight+1);
            window.parent.popLayer.setPosition(elmSrc);
        }
    },
    loaded : function(elm) {
        clearTimeout(popLayer.timeout);
        var from = window.parent || window;
        if (from) {
            from.popLayer.pop.className = from.popLayer.pop.className.replace(/loading/g, "");
            var obj = from.popLayer.iframe.contentWindow || from.popLayer.iframe.window;
            try {
                obj.close =  function() {
                    return function() {
                        popLayer.close();
                    }();
                }
                if (document.all && window.print && !window.opera) {
                    var objToSend = obj.document.body || obj.document.documentElement;
                } else {
                    var objToSend = (obj.document.body && obj.document.documentElement && obj.document.body.scrollHeight>obj.document.documentElement.offsetHeight) ? obj.document.body : obj.document.documentElement;
                }
                objToSend.className += ' nobg';
                popLayer.resize(obj.document.documentElement.scrollWidth+10, objToSend);
            } catch(e) {}
        }
        popLayer.setPosition(popLayer.elmSource);
        popLayer.elmSource = null;
    },
    copyNodes : function(sourceElm, destElm) {
        for (var i=0; i<sourceElm.childNodes.length; i++) {
            destElm.appendChild(sourceElm.childNodes[i].cloneNode(true));
        }
        var allSourceNodes = $n.getByTagName(sourceElm, "*");
        var allDestNodes = $n.getByTagName(destElm, "*");
        for (var i=0; i<allSourceNodes.length; i++) {
            popLayer.copyEvents(allSourceNodes[i], allDestNodes[i]);
        }
    },
    copyEvents : function(sourceElm, destElm) {
        for (var i=0; i<popLayer.eventsArray.length; i++) {
            var evt = "on"+popLayer.eventsArray[i];
            destElm[evt] = sourceElm[evt];
        }
    },

    showMask : function() {
        if (!popLayer.mask) {
            var div = document.createElement('div');
            div.id = 'popLayerMask';
            popLayer.mask = document.body.appendChild(div);
        }
        popLayer.mask.style.height = document.documentElement.scrollHeight +'px';
        popLayer.mask.style.width = document.documentElement.scrollWidth +'px';
        popLayer.mask.style.display = 'block';
        ifrlayer.make(popLayer.mask);
    },

    hideMask : function() {
        if (popLayer.mask) {
            popLayer.mask.style.display = 'none';
            ifrlayer.kill(popLayer.mask);
        }
    }
}

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 = field.checked ? "block" : "none";
    });
    fixHeights(field);
}

/**********
 * filtrage
 **********/
function filterSelect(sel, filteredSelect, elementToHideAll) {
    var val = sel.value;
    filteredSelect = document.getElementById(filteredSelect);
    filteredSelect.style.display = 'none';
    filterHide(elementToHideAll);
    var options = filteredSelect.options;
    if (!filteredSelect.filteringOptions) {
        filteredSelect.filteringOptions = [];
        for (var i=0; i<options.length; i++) {
            var opt = options[i];
            if (opt.getAttribute("filter")) {
                filteredSelect.filteringOptions.push(filteredSelect.removeChild(opt));
                i--;
            }
        }

    }
    while(filteredSelect.options.length>1){
        filteredSelect.removeChild(filteredSelect.options[1]);
    }
    filteredSelect.filteringOptions.each(function(sel) {
        if (sel.getAttribute("filter")==val) {
            filteredSelect.appendChild(sel.cloneNode(true));
        }
    });
    if (filteredSelect.options.length > 1){
        filteredSelect.style.display = 'block';
    }else{
        filterHTML(filteredSelect, 'guideterminaux', 'div', sel.value);
    }
}

function filterHide(elementToHideAll) {
    if (!elementToHideAll) return;
    var elementToHideAll = typeof elementToHideAll == "string" ? document.getElementById(elementToHideAll) : elementToHideAll;
    var childs = getChildNodes(elementToHideAll);
    childs.each(function(child) {child.style.display='none'});
}

function filterHTML(sel, elementId, tagName, firstSelectValue) {
    var val = firstSelectValue ? firstSelectValue : sel.value;
    if (val==-1) return;
    var element = document.getElementById(elementId);
    var childs = getChildNodes(element, {nodeName:(tagName || 'div')});
    filterHide(element);
    childs.each(function(child){
        if (child.className == val || child.className == sel.options[sel.selectedIndex].getAttribute("filter")+ "_" + val) child.style.display="block";
    });
}


/**********
 * clickable lines
 *********/
var clickableLine = {
    init : function() {
        var trs = document.getElementsByTagName("tr");
        for (var i=0; i<trs.length; i++) {
            var tr = trs[i];
            if (tr.className.match(/clickable/)) {
                tr.onclick = clickableLine.click;
                var a = tr.getElementsByTagName("a");
                for (var j=0; j<a.length; j++) {
                    addEvent(a[j], 'click', cancelClick);
                }

            }
        }
    },
    click : function() {
        if (this.getAttribute("link")) {
            document.location.href = this.getAttribute("link");
        }
    }
}


/**********
 * clickable gradientToWatch
 *********/
var gradientToWatch = {
    stop: function(e) {
        if(e && e.stopPropagation && e.preventDefault) {
            e.stopPropagation();
            e.preventDefault();
        }
        else if(e && window.event) {
            window.event.cancelBubble = true;
            window.event.returnValue = false;
        }
        return false;
    },
    init: function() {
        var _aDivs = document.getElementsByTagName('div');
        var _iDiv = _aDivs.length;
        while(--_iDiv >= 0) {
            if(/\bgradientToWatch\b/.test(_aDivs[_iDiv].className)) {
                addEvent(
                        _aDivs[_iDiv],
                        'click',
                        (function() {
                            var _sRel = _aDivs[_iDiv].getAttribute('rel') || document.location;
                            return function(e) {
                                if(_sRel) {
                                    document.location = _sRel;
                                }
                                gradientToWatch.stop(e);
                            }
                        })()
                        );
            }
        }
    }
}
//fonction permeattant d'activer ou non un champs en fonction du statut d'un bouton radio ou d'une checkbox
//appel de la forme : onclick="activateReferentField(this, '___mon___id___')" 
var activateReferentField = function(oToggler, id){
    var oInput = $(id);

    if (oToggler.checked)
        oInput.disabled = ''

    var radios = oToggler.form[oToggler.name];
    for (var i=0; i < radios.length; i++) {
        if (radios[i] != oToggler){
            addEvent(radios[i], 'click', function(){
                oInput.disabled = 'true';
            })
        }
    };


}



//gestion appel ajax registrar
var initAjaxRegistrar = function(){
    var oForm = document.getElementById('dnForm');
    oForm.onsubmit = function(){ return false; };
    oForm.innerHTML += '<input type="hidden" name="action" value="step2"/>';
    refreshDNSZones();
}
var refreshDNSZones = function(){
    var oForm = document.getElementById('dnForm');
    var oZoneContinue = document.getElementById('continueBtn');
    var oZoneReturn = document.getElementById('returnBtn');
    var oImgStatus = document.getElementById('imgStatus');
    oForm.DNSName.readOnly = false;
    oImgStatus.innerHTML = '';
    oZoneReturn.innerHTML = '';
    oZoneContinue.innerHTML = '<a href="javascript:checkAjaxDN();" class="btn btnStyle"><strong><span>Tester la disponibilit&eacute; du nom de domaine&nbsp;&nbsp;<img src="/elements/img/pictos/arrowContinuer.png" alt="Tester la disponibilit� du nom de domaine saisi"/></span></strong></a>';
}
var checkAjaxDN = function(){
    var oForm = document.getElementById('dnForm');
    var sUrl = "/do/registrar/"; //'/js/dn.js';
    var oZoneContinue = document.getElementById('continueBtn');
    var oZoneReturn = document.getElementById('returnBtn');
    //var oUpdatableBtn = oForm.getElementsByTagName('button')[0].getElementsByTagName('strong')[0];
    var oImgStatus = document.getElementById('imgStatus');
    var params = {"action" : "checkDomain"};
    params.DNSName = oForm.DNSName.value;
    //get selected Suffixe
    var suffixes = oForm.suffixe;
    for (var i=0; i < suffixes.length; i++) {
        var suffixe = suffixes[i];
        if (suffixe.checked) params.suffixe = suffixe.value;
    };
    var reg = new RegExp("^[a-z0-9-]{2,63}$","i");
    if(!reg.test(params.DNSName)){
        oImgStatus.innerHTML = '<img src="/elements/css/skin/contenus/dnIndispo.png" width="255" height="43" alt="Nom de domaine indisponible" />';
        oZoneContinue.innerHTML = '';
        oZoneReturn.innerHTML = '<a href="javascript:refreshDNSZones();" class="btn btnStyle"><strong><span><img src="/elements/img/pictos/arrowPrecedent.png" alt="Tester avec un autre nom de domaine"/>&nbsp;&nbsp;Tester avec un autre nom de domaine</span></strong></a>';
        return;
    }
    var toDoOnError = function(){
        oForm.className = 'error';
    }
    var toDoOnSuccess = function(bAnswer){
        if (bAnswer.success) {
            oForm.DNSName.readOnly = 'true';
            if (bAnswer.available){
                //oForm.DNSName.readOnly = 'true';
                oImgStatus.innerHTML = '<img src="/elements/css/skin/contenus/dndispo.png" width="255" height="53" alt="" />';
                //oImgStatus.appendChild(image);
                //	oImgStatus.className = 'ok';
                oZoneContinue.innerHTML = '<button class="btn btnStyle" type="submit"><span><strong>Poursuivre avec ce nom de domaine <img src="/elements/img/pictos/arrowContinuer.png" alt="Poursuivre avec ce nom de domaine"/></strong></span></button>';
                oZoneReturn.innerHTML = '<a href="javascript:refreshDNSZones();" class="btn btnStyle"><strong><span><img src="/elements/img/pictos/arrowPrecedent.png" alt="Tester avec un autre nom de domaine"/>&nbsp;&nbsp;Tester avec un autre nom de domaine</span></strong></a>';
                oForm.onsubmit = function(){ return true; };
            }else{
                oImgStatus.innerHTML = '<img src="/elements/css/skin/contenus/dnIndispo.png" width="255" height="43" alt="Nom de domaine indisponible" />';
                //oImgStatus.className = 'nok';
                oZoneContinue.innerHTML = '';
                oZoneReturn.innerHTML = '<a href="javascript:refreshDNSZones();" class="btn btnStyle"><strong><span><img src="/elements/img/pictos/arrowPrecedent.png" alt="Tester avec un autre nom de domaine"/>&nbsp;&nbsp;Tester avec un autre nom de domaine</span></strong></a>';
            }
        } else {
            toDoOnError();
        }
    }
    new Ajax({
        url : sUrl,
        onSuccess : function(xhr) {
            try {
                toDoOnSuccess(eval("(" + xhr.responseText+ ")"));
            } catch (e) {
                alert(e);
            }
        },
        onError : function(){
            toDoOnError();
        }
    }).send(params);

}
//gestion du panier registrar
var basketRegistrar = {
    init : function(){
        this.basket = $('optionsDN');
        if (!this.basket) return;
        this.basketParams = basketOptions;
        this.currency = ' ' + this.basketParams.currency;


        //recup other Things
        this.basket.oGlobPrice = $('optionsDNGlobal');
        this.basket.oPromo = $('optionsDNPromo');
        this.basket.oRemise = $('optionsDNRemise');
        this.basket.oDNTotal = $('optionsDNTotal');

        //recup ligne + doLigne
        this.basketLines = [];
        var lines = getNodes(this.basket, {nodeName:'tr'});
        for (var i=0; i < lines.length; i++) {
            if (lines[i].className.match(/option/)) {
                this.basketLines.push(lines[i])
                this.setLine(lines[i]);
            }
            if (lines[i].getAttribute('name') && lines[i].getAttribute('name').match(/mail/)) {
                lines[i].bMail = true;
            }
        };

    },
    setLine : function(oLine){
        var _self = this;
        oLine.sOption = oLine.className;
        oLine.oNb = getNode(oLine, {nodeName:'select', className:'nbOption'});
        //gestion pas de menu d�roulant donc 1
        if (!oLine.oNb)	oLine.oNb = {'value':1};
        //si duree
        if (oLine.sOption.match(/\boptionEngagement\b/)){
            this.getEngagement(oLine);
            return;
        }

        oLine.oPrice = getNode(oLine, {nodeName:'td', className:'price'});
        oLine.oTotal = getNode(oLine, {nodeName:'td', className:'linePrice'});

        //initial update
        oLine.oPrice.innerHTML = this.basketParams.options[oLine.sOption] + this.currency;
        //countLine
        this.countLine(oLine);


        //set Events
        addEvent(oLine.oNb, "change", function(){_self.countLine(oLine)});
    },
    getEngagement : function(oLine){
        var _self = this;
        var aOptions = getNodes(oLine, {nodeName:'input'});
        for (var i=0; i < aOptions.length; i++) {
            if (aOptions[i].checked) _self.setEngagement(aOptions[i]);
            addEvent(aOptions[i], "click", function(){_self.setEngagement(this)});
        };
    },
    setEngagement : function(oOption){
        this.engagement = oOption.id.match(/\btrenteSixMois\b/) ? true : false;
        this.updateTotal();
    },
    countLine : function(oLine){
        oLine.fTotal = parseFloat(this.basketParams.options[oLine.sOption]) * oLine.oNb.value;
        oLine.oTotal.innerHTML = oLine.fTotal + this.currency;

        this.updateTotal();
    },
    updateTotal : function(){
        var _self = this;

        //prix global avant promo
        this.basket.fGlobPrice = 0;
        this.iTotalMails = 0;
        this.basketLines.each(function(oLine){
            if (oLine.fTotal){
                _self.basket.fGlobPrice += oLine.fTotal;
            }
            if (oLine.bMail){
                _self.iTotalMails += parseInt(oLine.oNb.value);
            }
        });
        this.basket.oGlobPrice.innerHTML = this.basket.fGlobPrice + this.currency;

        //prix total apres promotions
        //this.basket.fRemise = ((this.basket.fGlobPrice - this.basketParams.options['optionPromo']) * this.basketParams.infosPrice.remise) / 100;
        this.basket.fRemise = (this.engagement ? parseFloat(this.basketParams.infosPrice.remise) : 0) +  (this.iTotalMails > 50 ? parseFloat(this.basketParams.infosPrice.remiseMails) : 0);



        this.basket.fPromo = this.iTotalMails == 0 ? 0 : this.basketParams.options['optionPromo'];
        this.basket.oPromo.innerHTML = this.basket.fPromo != 0 ? '-' + this.basket.fPromo + this.currency : '';
        this.basket.fRemiseAmount = ((this.basket.fGlobPrice - this.basket.fPromo) * this.basket.fRemise) / 100;
        this.basket.oRemise.innerHTML = this.basket.fRemise > 0 ? this.basket.fRemise + ' %' : '';
        this.basket.oDNTotal.innerHTML = this.setMeRound((this.basket.fGlobPrice - this.basket.fPromo - this.basket.fRemiseAmount)) + this.currency;
    },
    setMeRound : function(fPrice){
        //dirty way to round as i want numbers
        var split  = fPrice.toString().split('.');
        //if (split[1])
        if (!split[1]) return fPrice;
        if (split[1].length == 1) return split[0] + '.' + split[1] + '0';
        if (split[1].length > 1){
            var iFirNb = split[1].substring(0,1);
            var iSecNb = split[1].substring(1,2);
            if (iSecNb > 7) iFirNb = parseInt(iFirNb)+1;
            iSecNb = iSecNb < 3 || iSecNb > 7 ? 0 : 5;

            var string = iFirNb.toString() + iSecNb.toString();
            return split[0] + '.' + string;
        }
    }
}


var helpBox = function(oElm){
    oElm.span = oElm.getElementsByTagName('span')[0];
    oElm.span.style.visibility = 'visible';
    oElm.onmouseout = function(){
        oElm.span.style.visibility = 'hidden';
    }
}


/***********
 * Init
 ************/
//initialisation de certains elements (contenus � aligner);
contentAdd({nodeName:"ul", className:"list3cols"}, {nodeName:"div", className:"listCtn"}, 3);
contentAdd({nodeName:"ul", className:"list2cols"}, {nodeName:"div", className:"listCtn"}, 2);

//fonction lancee pendant le chargement de la page
function domLoadFunctions() {
    navigation.init();
    listMenu.init();
    maxLengthOntextarea();
    generateElements();
    clickableLine.init();
    gradientToWatch.init();
}
//fonction lancee une fois toute la page chargee
function onLoadFunctions() {
    contentSize();
    sizeBlocks();
    fixCorners();
    fixHeights();
    fixColumns();
	cufonize();
    //oblige pour laisser au navigateur le temps de se rafraichir
}










function SWFchallengeOff()
{
	addClass(document.getElementById("challengeFlash"), 'hidden');	
	document.getElementById("lineChallenge").style.zIndex='-1';
	
}



