if (!GRAPHO) var GRAPHO = {};
if (!GRAPHO.Util) GRAPHO.Util = {};
if (!GRAPHO.Controles) GRAPHO.Controles = {};

GRAPHO.Util = {
    criaDelegate: function(objeto, metodo, funcReturn) {
        var s = function() {
            metodo.apply(objeto, arguments);
            return funcReturn;
        }
        return s;
    },

    elementosPorNome: function(tag, nome) {
        var elem = document.getElementsByTagName(tag);
        var arr = new Array();
        for (i = 0, iarr = 0; i < elem.length; i++) {
            att = elem[i].getAttribute("name");
            if (att == nome) {
                arr[iarr] = elem[i];
                iarr++;
            }
        }

        return arr;
    },
    
    elementosPorClass: function(tag, nome) {
        var elem = document.getElementsByTagName(tag);
        var arr = new Array();
        for (i = 0, iarr = 0; i < elem.length; i++) {
            att = elem[i].getAttribute("class");
            if (!att) att = elem[i].getAttribute("className");
            if (att == nome) {
                arr[iarr] = elem[i];
                iarr++;
            }
        }

        return arr;
    }
};

GRAPHO.Controles = {
    _PainelSlider: function PainelSlider(divSlider, btRecua, btAvanca, sentido, passo, efeitoSlide, disClass) {
        return {
            _disClass: disClass,
            _slider: divSlider,
            _sentido: sentido,
            _passo: passo,
            _botaoRecuar: btRecua,
            _botaoAvancar: btAvanca,
            _efeitoSlide: efeitoSlide,
            _iniciado: false,

            rollMais: function(valueTo) {
                var setTempo = null;

                if (this._sentido == 'h') {
                    this._slider.scrollLeft += 15;
                } else {
                    this._slider.scrollTop += 15;
                }

                if (valueTo > 0) {
                    setTempo = setTimeout(GRAPHO.Util.criaDelegate(this, function() { this.rollMais(valueTo - 15); }, true), 0.5);
                } else {
                    clearTimeout(setTempo)
                }
            },

            rollMenos: function(valueTo) {
                var setTempo = null;

                if (this._sentido == 'h') {
                    this._slider.scrollLeft += -15;
                } else {
                    this._slider.scrollTop += -15;
                }

                if (valueTo > 0) {
                    setTempo = setTimeout(GRAPHO.Util.criaDelegate(this, function() { this.rollMenos(valueTo - 15); }, true), 0.5);
                } else {
                    clearTimeout(setTempo);
                }
            },

            avancar: function() {
                if (!this._iniciado) return false;

                if (this._sentido == 'h') {
                    if (this._efeitoSlide) {
                        this.rollMais(this._passo);
                    } else {
                        this._slider.scrollLeft += this._passo;
                    }
                }
                else if (this._sentido == 'v') {
                    if (this._efeitoSlide) {
                        this.rollMais(this._passo);
                    } else {
                        this._slider.scrollTop += this._passo;
                    }
                }
                return false;
            },

            recuar: function() {
                if (!this._iniciado) return false;
                if (this._sentido == 'h') {

                    if (this._efeitoSlide) {
                        this.rollMenos(this._passo);
                    } else {
                        this._slider.scrollLeft -= this._passo;
                    }


                } else if (this._sentido == 'v') {
                    if (this._efeitoSlide) {
                        this.rollMenos(this._passo);
                    } else {
                        this._slider.scrollTop -= this._passo;
                    }
                }
                return false;
            },

            ini: function() {
                this._botaoAvancar.onclick = GRAPHO.Util.criaDelegate(this, this.avancar, false);
                this._botaoRecuar.onclick = GRAPHO.Util.criaDelegate(this, this.recuar, false);
                this._iniciado = true;
            }
        };
    },

    _PainelSlideShow: function PainelSlideShow(autoMuda, efeito, iniOculta, toClass) {
        return {

            _slides: new Array(),
            _botoes: new Array(),
            _elementosToClass: new Array(),
            _slideAtual: null,
            _slideProx: null,
            _slideAnt: null,
            _autoMuda: autoMuda,
            _iniOculta: iniOculta,
            _toClass: toClass,
            _efeitoSlide: efeito,
            _orgClass: '',

            roll: function(valueTo) {

                this._slideAtual.style.width = valueTo + ' px';

                if (valueTo > 0) {
                    setTempo = setTimeout(GRAPHO.Util.criaDelegate(this, function() { this.roll(valueTo - 15); }, true), 10);
                } else {
                    clearTimeout(setTempo);
                }
            },

            mudaSlide: function(paraSlide) {

                var _tem = false;
                var mostrando = this._slideAtual;

                for (i = 0; i < this._slides.length; i++) {


                    if (this._slides[i] == paraSlide) {
                        _tem = true;
                        this._slideAnt = this._slides[i == 0 ? this._slides.length - 1 : i - 1];
                        this._slideAtual = this._slides[i];
                        this._slideProx = this._slides[i == this._slides.length - 1 ? 0 : i + 1];
                        for (k = 0; k < this._elementosToClass[i].length; k++) {
                            this._elementosToClass[i][k].setAttribute("class", this._toClass ? this._orgClass + ' ' + this._toClass : this._orgClass);
                            this._elementosToClass[i][k].setAttribute("className", this._toClass ? this._orgClass + ' ' + this._toClass : this._orgClass); //IE
                        }
                    } else {
                        for (k = 0; k < this._elementosToClass[i].length; k++) {
                            this._elementosToClass[i][k].setAttribute("class", this._orgClass);
                            this._elementosToClass[i][k].setAttribute("className", this._orgClass); //IE
                        }
                    }

                }

                if (_tem) {
                    mostrando.style.display = 'none';
                    this._slideAtual.style.display = 'block';
                }

                return false;

            },

            autoMudaSlide: function() {
                this.mudaSlide(this._slideProx);
            },

            addSlide: function(divSlide, botao) {
                if (this._iniOculta) {
                    divSlide.style.display = 'none';
                } else {
                    divSlide.style.display = 'block';
                }

                this._orgClass = botao.getAttribute("class");
                if (this._orgClass == null) this._orgClass = botao.getAttribute("className");

                this._slides.push(divSlide);
                this._botoes.push(botao);


                this._elementosToClass.push(arguments[2] ? arguments[2] : new Array(botao));


                this._slideAnt = this._slideAtual ? this._slideAtual : divSlide;
                this._slideAtual = divSlide;
                this._slideProx = this._slides[0];

                botao.onclick = GRAPHO.Util.criaDelegate(this,
                            function() {
                                this.mudaSlide(divSlide);
                            }, false);

            },

            ini: function() {

                if (this._autoMuda) {
                    setInterval(GRAPHO.Util.criaDelegate(this, this.autoMudaSlide, void (0)), 10000);
                    this.mudaSlide(this._slideAtual);
                }

            }
        };
    }
};

