/*
 * OUI (Other User Interface) - jQuery components
 *   ---> SLIDE component
 *
 * Copyright © 2009 Raphaël BENITTE & Matthieu LARCHER
 *   http://www.lindicible.com/
 * 
 * Depends:
 *  oui.js
 */
 
(function($){

    $.extend($.Oui, {
        Slide : function (element, options) {
            
            this.slidable = $(element);
            this.timer = null;
            this.fading = false;
            
            this.settings = $.extend({}, $.Oui.Slide.defaults, options || {});
            
            var dimension = this.getContentDimension();
            this.contentWidth  = dimension.width;
            this.contentHeight = dimension.height;
            
            this.slidable.addClass('oui-slide');
            
            this.slidable.wrapInner('<div class="oui-slide-mask" />');
            this.slidable.find('.oui-slide-mask').wrapInner('<div class="oui-slide-inner" />');
            
            this.slidable.find('.oui-slide-inner').css({
                margin:   0,
                padding:  0,
                width:    dimension.width,
                overflow: 'hidden'
            });
            
            this.buildCommands();
            
            this.slidable.find('.oui-slide-mask').css({
                margin:   0,
                padding:  0,
                overflow: 'hidden',
                width:    this.settings.width,
                height:   this.settings.height
            });
            
            if (dimension.width < this.slidable.find('.oui-slide-mask').width()) {
                this.slidable.find('.oui-slide-backward').addClass('oui-slide-backward-disabled');
                this.slidable.find('.oui-slide-forward').addClass('oui-slide-forward-disabled');
            }

            if (this.settings.useCookie === true) {
                var fromCookie = $.Oui.Cookie.read(this.settings.cookieId);
                if (fromCookie) {
                    var pos = parseFloat(fromCookie);
                    if (this.slidable.find('.oui-slide-mask').width() < this.contentWidth) {
                        this.slidable.find('.oui-slide-inner').css('margin-left', pos);
                    }
                }
            }
            
            return this;
        }
    });
    
    $.Oui.Slide.prototype = {
        
        getContentDimension: function() {
            
            var totalWidth = 0;
            var maxHeight  = 0;
            
            var children;
            if (this.settings.childrenSelector) {
                children = this.slidable.find(this.settings.childrenSelector);
            } else {
                children = this.slidable.children();
            }
            
            children.each(function () {
                
                var sizes = $(this).ouiGetSizes();
                
                totalWidth += sizes.totalWidth;
                
                if (sizes.totalHeight > maxHeight) {
                    maxHeight = sizes.totalHeight;
                }
            });
            
            var dimension = {
                height: maxHeight,
                width:  totalWidth
            };
            return dimension;
        },
        
        buildCommands: function () {
            
            var self = this;
            
            this.slidable.prepend('<a class="oui-slide-forward">' + this.settings.forwardText + '</a>');
            this.slidable.prepend('<a class="oui-slide-backward">' + this.settings.backwardText + '</a>');
            
            this.slidable.find('.oui-slide-backward, .oui-slide-forward').click(function (event) {
                event.preventDefault();
            });
            
            
            var startOn = this.settings.onOver === true ? 'mouseover' : 'mousedown';
            var stopOn  = this.settings.onOver === true ? 'mouseout'  : 'mouseup';
            
            this.slidable.find('.oui-slide-backward').bind(startOn, function (event) {
                $(this).addClass('oui-slide-backward-down');
                self.stopSlide();
                self.timer = setInterval(function(){
                    self.move('right');
                }, self.settings.interval);
            }).bind(stopOn, function () {
                $(this).removeClass('oui-slide-backward-down');
                self.stopSlide();
            });
            
            this.slidable.find('.oui-slide-forward').bind(startOn, function (event) {
                $(this).addClass('oui-slide-forward-down');
                self.stopSlide();
                self.timer = setInterval(function(){
                    self.move('left');
                }, self.settings.interval);
            }).bind(stopOn, function () {
                $(this).removeClass('oui-slide-forward-down');
                self.stopSlide();
            });
        },
        
        move: function (direction) {
            
            var maskWidth = this.slidable.find('.oui-slide-mask').width();

            if (maskWidth < this.contentWidth) {
                
                var newX = parseInt(this.slidable.find('.oui-slide-inner').css('marginLeft'), 10);
                var maxX = this.slidable.find('.oui-slide-mask').width() - this.contentWidth;
                
                if (direction == 'left') {
                    newX -= this.settings.offset;
                } else if (direction == 'right') {
                    newX += this.settings.offset;
                }

                if (newX > 0) {
                    newX = 0;
                    this.slidable.find('.oui-slide-backward').addClass('oui-slide-backward-disabled');
                } else {
                    this.slidable.find('.oui-slide-backward').removeClass('oui-slide-backward-disabled');
                }

                if (newX < maxX) {
                    newX = maxX;
                    this.slidable.find('.oui-slide-forward').addClass('oui-slide-forward-disabled');
                } else {
                    this.slidable.find('.oui-slide-forward').removeClass('oui-slide-forward-disabled');
                }
                this.slidable.find('.oui-slide-inner').css('margin-left', newX);
            }
        },
        
        stopSlide: function () {
            clearInterval(this.timer);
            
            if (this.settings.useCookie === true) {
                $.Oui.Cookie.create(this.settings.cookieId, parseInt(this.slidable.find('.oui-slide-inner').css('marginLeft'), 10));
            }
        }
    };

    $.extend($.Oui.Slide, {
        defaults: {
            offset:           5,
            interval:         20,
            namespace:        'default',
            backwardText:     'backward',
            forwardText:      'forward',
            onOver:           false,
            childrenSelector: false,
            // cookie options
            useCookie:        false,
            cookieId:         'ouislide',
            cookieSep:        '|'
        }
    });

    $.fn.extend({
        ouiSlide: function (options) {
            return this.each(function() {
                var slide = new $.Oui.Slide(this, options);
                $.data($(this).get(0), 'slide', slide);
            });
        },
        
        getOuiSlide: function() {
            if ($.data($(this).get(0), 'slide')) {
                return $.data($(this).get(0), 'slide');
            }   
        }
    });

})(jQuery);

