 /* Retrouve les DomElements de type "tag" fils de l'élément "node" contenant la class "searchClass" */
    function rbGetElementsByClass(searchClasses, node, tag) {
        var classElements = new Array();
        if (node == null) node = document;
        if (tag == null) tag = ['*'];
        var els = null;
        for (var indice in tag) {
            els = (els == null) ? node.getElementsByTagName(tag[indice]) : els.concat(node.getElementsByTagName(tag[indice]));
        }
        
        for (i = 0, j = 0; i < els.length; i++) {
            if (testerClass(searchClasses, els[i].className) == true) {
                classElements[j] = els[i];
                j++;
            }
        }
        return classElements;
    }

    testerClass = function(searchClasses, className) {
        if (searchClasses == undefined) return false;
        if (searchClasses.length == 0) return false;
        if (className == "" || className == undefined) return false;

        for (var ind in searchClasses) {
            if (searchClasses[ind] == className)
                return true;
        }

        return false;
    }

    rbManager = function(tempBlock, tempMenus, param) {
        this.compteur = param.compteur;
        this.param = param;
        this.elements = new Array();
        this.timer = null;
        this.Init(tempBlock, tempMenus);
    }
    
    rbManager.prototype.Init = function(tempBlock, tempMenus) {
        for (var ind in tempBlock) {
            this.elements[ind] = new rbElement(tempBlock[ind], tempMenus[ind], this);
            /* branche un delegate sur l'objet rbElement et crée lien vers la methode clickMenu */
            this.elements[ind].handler = this.elements[ind].createDelegate(this.elements[ind], this.elements[ind].clickMenus);
            /* appel la methode connect de rbElement qui branche un eventlistener 'click' sur la div menuItem */
            this.elements[ind].connect(this.elements[ind].menuItem, 'click', this.elements[ind].handler, false);
            this.elements[ind].desactiveElement(); /* par defaut on desactive toutes les div block et menu */

            if (this.param.menu.classNameHover != null && this.param.menu.classNameHover != "") {
                this.elements[ind].handler = this.elements[ind].createDelegate(this.elements[ind], this.elements[ind].hoverMenus);
                this.elements[ind].connect(this.elements[ind].menuItem, 'mouseover', this.elements[ind].handler, false);
                this.elements[ind].handler = this.elements[ind].createDelegate(this.elements[ind], this.elements[ind].outMenus);
                this.elements[ind].connect(this.elements[ind].menuItem, 'mouseout', this.elements[ind].handler, false);
            }
        }
        /* Regarder les suppléments */
        if (this.param.supplements != null && this.param.supplements != "") {
            if (this.param.supplements.regles != null && this.param.supplements.regles != "" && this.param.supplements.regles.length > 0) {
                for (var ind in this.param.supplements.regles) {
                    eval(this.param.supplements.regles[ind]);
                }
            }
        }
        this.moveMenus(true); /* par defaut on active la premiere div block et menu */        
    }
    rbManager.prototype.moveMenus = function(start) {
        for (var ind in this.elements) {
            if (this.elements[ind].actif == true)
                this.elements[ind].desactiveElement();
        }
        if(start==false)
            this.compteur = ((this.compteur + 1) < this.elements.length) ? ++this.compteur : 0;
        this.elements[this.compteur].activeElement();
        this.lancerTimer();
    }
    var _rbTemporaire;
    rbManager.prototype.lancerTimer = function() {
        if (this.param.intervalTimer > 0) {
            _rbTemporaire = this;
            this.timer = setTimeout("_rbTemporaire.moveMenus(false)", this.param.intervalTimer);
        }
    }
    
    /* fonction spécifique (regle supplementaire sur l'objet param) */
    rbManager.prototype.calculerHauteur = function() {
        if (this.elements == null || this.elements == "" || this.elements.length < 1) return;
        var hauteur = this.elements.length * 25 + 40 + 30;
        for (var ind in this.elements) {
            if (this.elements[ind].block == null || this.elements[ind].block == "") continue;
            var divs = rbGetElementsByClass("content_milieu", this.elements[ind].block, ["div"]);
            if (divs != null && divs != "" && divs.length == 1)
                divs[0].style.minHeight = hauteur + "px";
        }
    }


    rbElement = function(block, menu, rbmanager) {
        this.block = block;
        this.menuItem = menu;
        this.handler = null;
        this.actif = false;
        this.rbmanager = rbmanager;
    }
    rbElement.prototype.hoverMenus = function(source, event) {
        if (this.actif == false)
            this.menuItem.className = this.rbmanager.param.menu.classNameHover;
    }
    rbElement.prototype.outMenus = function(source, event) {
        if (this.actif == false)
            this.menuItem.className = this.rbmanager.param.menu.className;
    }
    rbElement.prototype.clickMenus = function(source, event) {
        for (i = 0; i < this.rbmanager.elements.length; i++) {
            if (this.rbmanager.elements[i].actif == true)
                this.rbmanager.elements[i].desactiveElement();

            if (this.rbmanager.elements[i] === this)
                this.rbmanager.compteur = i;
        }
        this.activeElement();
        if (this.rbmanager.param.intervalTimer > 0) {
            clearTimeout(this.rbmanager.timer);
            this.rbmanager.lancerTimer();
        }
    }
    rbElement.prototype.activeElement = function() {
        this.menuItem.className = this.rbmanager.param.menu.classNameSelected;
        this.block.style.display = "block";
        this.actif = true;
    }
    rbElement.prototype.desactiveElement = function() {
        this.menuItem.className = this.rbmanager.param.menu.className;
        this.block.style.display = "none";
        this.actif = false;
    }
    rbElement.prototype.connect = function(oElem, sEvType, fn, bCapture) {
        return document.addEventListener ? oElem.addEventListener(sEvType, fn, bCapture) : oElem.attachEvent ? oElem.attachEvent('on' + sEvType, fn) : false;
    }
    rbElement.prototype.createDelegate = function(instance, method) {
        return function() {
            return method.apply(instance, arguments);
        }
    }
    
    rbDemarrer = function(param) {
        if (param.block.className == null || param.block.className == "")
            throw new Error("la class du block doit etre renseignee");
        else if (param.menu.className == null || param.menu.className == "")
            throw new Error("la class du menu doit etre renseignee");
        else if (param.menu.classNameSelected == null || param.menu.classNameSelected == "")
            throw new Error("la class du menu doit etre renseignee");
        if (param.intervalTimer == null || param.intervalTimer < 0)
            param.intervalTimer = 3000;
        else if (param.intervalTimer == 0)
            param.intervalTimer = 0;

        if (param.compteur == null || param.compteur == undefined)
            param.compteur = 0;

        var tempBlock = rbGetElementsByClass([param.block.className], param.block.nodeElm, param.block.tag);
        var tempMenus = rbGetElementsByClass([param.menu.className, param.menu.classNameSelected], param.menu.nodeElm, param.menu.tag);
		if(tempBlock==null || tempBlock=="" || tempMenus==null || tempMenus=="")
			return false;
        new rbManager(tempBlock, tempMenus, param);
    }

