// JavaScript Document

function igallery() {
    
    /******** Gallery elements *********/
    this.idgallery      = null;
    this.backbtt        = null;
    this.nextbtt        = null;
    
    this.igElements     = 0;        // Gallery elements amount
    this.igArrayWidth   = [];       // Array of element's widths
    this.igTotalWidth   = 0;        // Sum of previous array
    this.igCurrent      = 1;        // Leftmost element full viewed
    this.parentw        = 0;
    
    this.step           = 10;
    this.cposx          = 0;
    this.cw             = 0;        // Get current window width
    this.remains        = 0;
    this.cubicout       = 0;
    
    this.mutex = false;             // Prevent others click during sliding effect
    this.to_mouseover   = null;
    this.to_rewind      = null; 
    this.planrewind     = null;
    this.seconds        = 8000;
    this.mouseOver      = false;
    this.continueAM     = false;
    this.steprewind     = 0;
    
    
    /***********************************/
    
    
    /*** $ function ***/
    this.$ = function(id) {
        return (document.getElementById)? document.getElementById(id) : document.all[id];
    }

    /*** $ function ***/
    this.setOpacity = function(el, op) {
        el.style.opacity = op/100;
        el.style.filter = "alpha(opacity=" + op + ")";
    }

    
    this.enumerateBlock = function() {
        var counter = 0;
        var igdivs = this.idgallery.getElementsByTagName('div');
        for(var i=0; i<igdivs.length; i++) {
            if (/(\s|\b|^)ig(\s|\b|$)/.test(igdivs[i].className)) {
                ++counter;
                if (igdivs[i].getElementsByTagName('span')[0]) {
                    igdivs[i].getElementsByTagName('span')[0].innerHTML = [counter, this.igElements].join("/");
                }
            }
        }
    }
    
    /*** init ***/
    this.init = function(id_gallery, id_backbutton, id_nextbutton, step, seconds) {
    
        var _self = this;
        this.idgallery = this.$(id_gallery.concat('_ig'));
        this.backbtt = this.$(id_backbutton);
        this.nextbtt = this.$(id_nextbutton);
        this.step    = step;
        this.seconds = seconds * 1000;
        
        var igdivs = this.idgallery.getElementsByTagName('div');
        for(var i=0; i<igdivs.length; i++) {
            if (/(\s|\b|^)ig(\s|\b|$)/.test(igdivs[i].className)) {
                var ow = parseInt(igdivs[i].offsetWidth, 10);
                this.igArrayWidth[this.igElements++] = ow;
                this.igTotalWidth += ow;
                //this.setOverEvt(igdivs[i].getElementsByTagName('a'));
            }
            this.idgallery.style.width = this.igTotalWidth + 'px';
        }
        
        
        this.enumerateBlock();        
        
        this.parentw = parseInt(this.idgallery.parentNode.offsetWidth, 10);
        //this.backbtt.style.visibility = 'hidden';
        
        this.setOpacity(this.backbtt, 20);
        this.backbtt.onclick = function() { return false; }
        
        /*** For debug purposes ***/
        /*
        alert(this.igElements);
        alert(this.igArrayWidth.toString());
        alert(this.igTotalWidth);
        */

        if (this.getBodyWidth() >= this.igTotalWidth) {
        
            this.idgallery.style.position = "static";
            this.idgallery.style.textAlign = "left";
            this.idgallery.style.width = this.igTotalWidth + 'px';
            this.idgallery.style.marginLeft = "auto";
            this.idgallery.style.marginRight = "auto";
            
            this.idgallery.parentNode.style.textAlign = "center";            
            this.idgallery.parentNode.style.width = 'auto';
            
            this.nextbtt.style.visibility = 'hidden';
            return;
        }
        
/*         if (!this.mouseOver) {
            // _self.$('debug').innerHTML += 'evento mouseover <br />';
            this.mouseOver = true;
            this.to_mouseover = setTimeout(function() {
                _self.startAutoMove();
            }, _self.seconds);        
        } */
        
        this.to_mouseover = setTimeout(function() {
            _self.startAutoMove();
        }, 10000);
    }


    
    
    this.clicOp = function() {
        clearInterval(this.to_mouseover); 
        clearInterval(this.planrewind); 
        this.mouseOver = false;
    }

    this.evtBack = function() { this.clicOp(); this.back(); this.continueAutoMove(); }
    this.evtNext = function() { this.clicOp(); this.next(); this.continueAutoMove(); }
    
    
       
    
    this.startAutoMove = function() {
        //this.$('debug').innerHTML += 'startAutoMove <br />';

        var _self = this;
        this.next();
        this.to_mouseover = setTimeout(function() {
            _self.startAutoMove();
        }, _self.seconds);
    } 
    
    
    this.continueAutoMove = function() {
        //this.$('debug').innerHTML += 'ContinueAutoMove ';
        var _self = this;
        if (this.mouseOver && !this.continueAM) {
            //this.$('debug').innerHTML += 'OK ' + this.mouseOver.toString() + '::'+ this.continueAM.toString(); +' <br />';
            this.continueAM = true;
            setTimeout(function() {
                _self.continueAM = false;
            }, _self.seconds);
        }
        else {
            clearInterval(this.to_mouseover);
            _self.mouseOver = true;
            //this.$('debug').innerHTML += 'NO '+ this.mouseOver.toString() + '::'+ this.continueAM.toString(); +' <br /><br />';        
        }
    }


    this.rewindGallery = function() {
        //this.$('debug').innerHTML += 'RewindGallery <br />';        
        
        var rew = this.idgallery.offsetLeft;
        if (rew >= 0) {
            this.idgallery.style.left = '0px';
            this.backbtt.style.visibility = 'hidden';
            this.nextbtt.style.visibility = 'visible';
            this.igCurrent = 1;
            clearInterval(this.to_rewind);
            return;
        }
        
        rew += this.steprewind;
        this.idgallery.style.left = rew + 'px';
        var intv = 5;
       
        _self = this;
        this.to_rewind = setTimeout(function() {
            _self.rewindGallery();
        }, intv);        
        
    }

    /*****************************************************************/
    
    this.shiftNext = function(d, s, e) {
    
        var _self = this; 
        
        if (s <= e) {
            this.mutex = false;
            return;
        }
        
        
        /*** Window width is wider than remaining gallery ***/
        if (this.cw >= (this.igTotalWidth + this.idgallery.offsetLeft)) {
        
            //this.nextbtt.style.visibility = 'hidden';
            this.setOpacity(this.nextbtt, 20);
            //alert('1');
            this.nextbtt.onclick = function() { return false; }

            if (this.mouseOver) {
                clearInterval(this.to_mouseover);
                this.to_mouseover = null;
                /*
                divisor = (document.all && !window.opera)? 20 : 10;
                this.steprewind = Math.ceil(((this.idgallery.offsetLeft * -1)/divisor), 10);            
                this.planrewind = setTimeout(function() { _self.rewindGallery() }, _self.seconds); 
                */
            }
            
            this.mutex = false;
            return;        
        }  
        
      
        /*** Rightmost element is fully viewed on the right ***/
        if (((this.idgallery.offsetLeft * -1) + this.parentw) >= (parseInt(this.idgallery.offsetWidth, 10) - 1)) {
            
            //this.nextbtt.style.visibility = 'hidden';
            this.setOpacity(this.nextbtt, 20);
            //alert('2');
            this.nextbtt.onclick = function() { return false; }

            if (this.mouseOver) {
                clearInterval(this.to_mouseover);
                this.to_mouseover = null;
                /*
                divisor = (document.all && !window.opera)? 20 : 10;
                this.steprewind = Math.ceil(((this.idgallery.offsetLeft * -1)/divisor), 10);            
                this.planrewind = setTimeout(function() { _self.rewindGallery() }, _self.seconds); 
                */
            }
            
            this.mutex = false;
            return;
        }
        
        
        s -= this.step;
        this.cposx += this.step;
        this.remains -= this.step;
        
        this.idgallery.style.left = s + 'px';


        this.cubicout = Math.pow((d / this.cposx), 3);
        intv = Math.ceil(80/this.cubicout) - 10;
        if (intv < 5) intv = 5;
        
        setTimeout(function() {
            _self.shiftNext(d, s, e)
        }, intv); 
        
    }
    
    
    this.shiftBack = function(d, s, e) {
    
        var _self = this; 
        
        if ((s >= e) || (this.idgallery.offsetLeft > -1)) {
            if (this.igCurrent == 1) {
                //this.backbtt.style.visibility = 'hidden';     
                this.setOpacity(this.backbtt, 20);
                //alert('3');
                this.backbtt.onclick = function() { return false; }
            }
                
            //this.mouseOver = false;            
            this.mutex = false;
            return;
        }
        
        s += this.step;
        this.cposx += this.step;
        this.idgallery.style.left = s + 'px';
                        
        this.cubicout = Math.pow((d / this.cposx), 3);
        var intv = Math.ceil(80/this.cubicout) - 10;
        if (intv < 5) intv = 5;
        
        
        setTimeout(function() {
            _self.shiftBack(d, s, e)
        }, intv);
    }
    
    
    this.next = function() {
    
        var _self = this;
        if (!this.mutex) {
            this.mutex = true;
            
            this.backbtt.onclick = function() { return _self.evtBack(); }            

            
            this.cposx = 0;                                 // Initialize delta 
            this.remains = 0;                               // Initialize remaining gallery width
            this.cw = 900;
            
            //this.backbtt.style.visibility = 'visible';
            this.setOpacity(this.backbtt, 100);

            
            for (j=this.igCurrent; j<this.igElements; j++) {
                this.remains += this.igArrayWidth[j];
            }
            
            var delta = this.igArrayWidth[this.igCurrent - 1];
            var start = parseInt(this.idgallery.offsetLeft, 10);
            var end = start - delta;
            
            ++this.igCurrent;
            this.shiftNext(delta, start, end);
        }
        
        return false;
    }

    
    this.back = function() {
    
    
        var _self = this;
        if (!this.mutex) {
            this.mutex = true;
            
            this.nextbtt.onclick = function() { return _self.evtNext(); }            
            
            
            this.cposx = 0;                                 // Initialize delta 
            this.cw = this.getBodyWidth();
            //this.nextbtt.style.visibility = 'visible';
            this.setOpacity(this.nextbtt, 100);
            
            var delta = 0;
            var start = parseInt(this.idgallery.offsetLeft, 10);
            
            if (this.igCurrent == 2) {
                delta = this.igArrayWidth[0];                    
            }
            else {
                n_minus_2 = 0;
                for (i=1; i<= (this.igCurrent-2); i++) n_minus_2 += this.igArrayWidth[i-1];
                delta = (start * (-1)) - n_minus_2;
            }
            
            var end = start + delta;
            
            --this.igCurrent;
            this.shiftBack(delta, start, end);
        }
        
        return false;
    }    
        
        
    this.getBodyWidth = function() {
        var w = document.body.offsetWidth;
        return parseInt(w, 10);
    }

}