$(document).ready(function(){
	//console.log('Setting up gallery');
	//console.log('slides:');
	//console.log($('.intro > ul > li'));
    $('div#main').gallery({
        duration: 500,
        autoRotation: 5000,
        listOfSlides: '.intro > ul > li',
        switcher: false,
        effect:true
    });
});
(function($) {
    $.fn.gallery = function(options) { return new Gallery(this.get(0), options); };
    
    function Gallery(context, options) { this.init(context, options); };
    
    Gallery.prototype = {
        options:{},
        init: function (context, options){
	
	//console.log('gallery!');
            this.options = $.extend({
                duration: 700,
                slideElement: 1,
                autoRotation: false,
                effect: false,
                listOfSlides: 'ul > li',
                switcher: false,
                disableBtn: false,
                nextBtn: 'a.link-next, a.btn-next, a.next',
                prevBtn: 'a.link-prev, a.btn-prev, a.prev',
                circle: true,
                direction: false,
                event: 'click',
                IE: false
            }, options || {});
            var _el = $(context).find(this.options.listOfSlides);
            if (this.options.effect) this.list = _el;
            else this.list = _el.parent();
            this.switcher = $(context).find(this.options.switcher);
            this.nextBtn = $(context).find(this.options.nextBtn);
            this.prevBtn = $(context).find(this.options.prevBtn);
            this.count = _el.index(_el.filter(':last'));
            
            if (this.options.switcher) this.active = this.switcher.index(this.switcher.filter('.active:eq(0)'));
            else this.active = _el.index(_el.filter('.active:eq(0)'));
            if (this.active < 0) this.active = 0;
            this.last = this.active;
            
            this.woh = _el.outerWidth(true);
            if (!this.options.direction) this.installDirections(this.list.parent().width());
            else {
                this.woh = _el.outerHeight(true);
                this.installDirections(this.list.parent().height());
            }
            
            if (!this.options.effect) {
                this.rew = this.count - this.wrapHolderW + 1;
                if (!this.options.direction) this.list.css({marginLeft: -(this.woh * this.active)});
                else this.list.css({marginTop: -(this.woh * this.active)});
            }
            else {
                this.rew = this.count;
                this.list.css({opacity: 0}).removeClass('active').eq(this.active).addClass('active').css({opacity: 1}).css('opacity', 'auto');
                this.switcher.removeClass('active').eq(this.active).addClass('active');
            }
            
            if (this.options.disableBtn) {
                if (this.count < this.wrapHolderW) this.nextBtn.addClass(this.options.disableBtn);
                if (this.active == 0) this.prevBtn.addClass(this.options.disableBtn);
            }
            
            this.initEvent(this, this.nextBtn, this.prevBtn, true);
            this.initEvent(this, this.prevBtn, this.nextBtn, false);
            
            if (this.options.autoRotation) this.runTimer(this);
            
            if (this.options.switcher) this.initEventSwitcher(this, this.switcher);
        },
        installDirections: function(temp){
            this.wrapHolderW = Math.ceil(temp / this.woh);
            if (((this.wrapHolderW - 1) * this.woh + this.woh / 2) > temp) this.wrapHolderWwrapHolderW--;
        },
        fadeElement: function(){
            if ($.browser.msie && this.options.IE){
                this.list.eq(this.last).css({opacity:0});
                this.list.removeClass('active').eq(this.active).addClass('active').css({opacity:'auto'});
            }
            else{
                this.list.eq(this.last).animate({opacity:0}, {queue:false, duration: this.options.duration});
                this.list.removeClass('active').eq(this.active).addClass('active').animate({
                    opacity:1
                }, {queue:false, duration: this.options.duration, complete: function(){
                    $(this).css('opacity','auto');
                }});
            }
            if (this.options.switcher) this.switcher.removeClass('active').eq(this.active).addClass('active');
            this.last = this.active;
        },
        scrollElement: function(){
            if (!this.options.direction) this.list.animate({marginLeft: -(this.woh * this.active)}, {queue:false, duration: this.options.duration});
            else this.list.animate({marginTop: -(this.woh * this.active)}, {queue:false, duration: this.options.duration});
            if (this.options.switcher) this.switcher.removeClass('active').eq(this.active).addClass('active');
        },
        runTimer: function($this){
            if($this._t) clearTimeout($this._t);
            $this._t = setInterval(function(){
                $this.toPrepare($this, true);
            }, this.options.autoRotation);
        },
        initEventSwitcher: function($this, el){
            el.bind($this.options.event, function(){
                $this.active = $this.switcher.index($(this));
                if($this._t) clearTimeout($this._t);
                if (!$this.options.effect) $this.scrollElement();
                else $this.fadeElement();
                if ($this.options.autoRotation) $this.runTimer($this);
                return false;
            });
        },
        initEvent: function($this, addEventEl, addDisClass, dir){
            addEventEl.bind($this.options.event, function(){
                if($this._t) clearTimeout($this._t);
                if ($this.options.disableBtn &&($this.count > $this.wrapHolderW)) addDisClass.removeClass($this.options.disableBtn);
                $this.toPrepare($this, dir);
                if ($this.options.autoRotation) $this.runTimer($this);
                return false;
            });
        },
        toPrepare: function($this, side){
            if (($this.active == $this.rew) && $this.options.circle && side) $this.active = -$this.options.slideElement;
            if (($this.active == 0) && $this.options.circle && !side) $this.active = $this.rew + $this.options.slideElement;
            for (var i = 0; i < $this.options.slideElement; i++){
                if (side) {
                    if ($this.active + 1 > $this.rew) {
                        if ($this.options.disableBtn && ($this.count > $this.wrapHolderW)) $this.nextBtn.addClass($this.options.disableBtn);
                    }
                    else $this.active++;
                }
                else{
                    if ($this.active - 1 < 0) {
                        if ($this.options.disableBtn && ($this.count > $this.wrapHolderW)) $this.prevBtn.addClass($this.options.disableBtn);
                    }
                    else $this.active--;
                }
            };
            if ($this.active == $this.rew && side) if ($this.options.disableBtn &&($this.count > $this.wrapHolderW)) $this.nextBtn.addClass($this.options.disableBtn);
            if ($this.active == 0 && !side) if ($this.options.disableBtn &&($this.count > $this.wrapHolderW)) $this.prevBtn.addClass($this.options.disableBtn);
            if (!$this.options.effect) $this.scrollElement();
            else $this.fadeElement();
        },
        stop: function(){
            if (this._t) clearTimeout(this._t);
        },
        play: function(){
            if (this._t) clearTimeout(this._t);
            if (this.options.autoRotation) this.runTimer(this);
        }
    }
}(jQuery));
