Subversion Repositories SmartDukaan

Rev

Blame | Last modification | View Log | RSS feed

/** 
 * jQuery Slidy - A Transition Plugin - http://wbotelhos.com/slidy 
 * --------------------------------------------------------------------------------- 
 * 
 * jQuery Slidy is a plugin that generates a customizable transitions automatically. 
 * 
 * Licensed under The MIT License 
 * 
 * @version         0.2.0 
 * @since           11.16.2010 
 * @author          Washington Botelho dos Santos 
 * @documentation   wbotelhos.com/slidy 
 * @twitter         twitter.com/wbotelhos 
 * @license         opensource.org/licenses/mit-license.php MIT 
 * @package         jQuery Plugins 
 * 
 * Usage with default values: 
 * --------------------------------------------------------------------------------- 
 * $('#banner').slidy(); 
 * 
 * <div id="banner"> 
 *   <img src="image-1.jpg"/> 
 *   <img src="image-2.jpg"/> 
 *   <img src="image-3.jpg"/> 
 * </div> 
 * 
 */ 
 
;(function($) { 
 
    $.fn.slidy = function(settings) { 
 
        if (this.length == 0) { 
            debug('Selector invalid or missing!'); 
            return; 
        } else if (this.length > 1) { 
            return this.each(function() { 
                $.fn.slidy.apply($(this), [settings]); 
            }); 
        } 
 
        var opt            = $.extend({}, $.fn.slidy.defaults, settings), 
            $this        = $(this), 
            id            = this.attr('id'), 
            elements    = $this.children(opt.children), 
            quantity    = elements.length, 
            images        = (opt.children == 'img') ? elements : elements.find('img'), 
            timer        = 0, 
            isAnimate    = false; 
 
        if (id === undefined) { 
            id = 'slidy-' + $this.index(); 
            $this.attr('id', id);  
        } 
 
        $this 
        .data('options', opt) 
        .css({ 
            'cursor':    opt.cursor, 
            'height':    opt.height + 'px', 
            'overflow':    'hidden', 
            'position':    'relative', 
            'width':    opt.width + 'px' 
        }); 
 
        elements.each(function(i) { 
            $(this) 
            .css({ 'position': 'absolute', 'z-index': quantity - i }) 
            .attr('id', $this.attr('id') + '-' + (i + 1)); 
        }); 
 
        images.attr({ height: opt.height, width: opt.width }).css('border', '0'); 
 
        if (opt.children == 'a' && opt.target != '') { 
            elements.attr('target',    opt.target); 
        } 
 
        elements.hide().first().show(); 
 
        if (opt.menu) { 
            $menu = $('<ul/>', { id: id + '-slidy-menu', 'class': 'slidy-menu' }).insertAfter($this); 
        } 
 
        var stop = function() { 
            clearTimeout(timer); 
        }, overBanner = function() { 
            stop(); 
        }, overMenu = function(thiz) { 
            stop(); 
 
            var $this        = $(this), 
                index        = $this.index(), 
                $current    = $this.parent().children('.slidy-link-selected'), 
                last        = $current.index(); 
 
            if (index != last) { 
                $current.removeClass('slidy-link-selected'); 
                $this.addClass('slidy-link-selected'); 
 
                change(last, index); 
            } 
        }, outBanner = function(thiz) { 
            go($(thiz.target).parent('a').index()); 
        }, outMenu = function() { 
            var $this        = $(this), 
                index        = $this.index(), 
                $current    = $this.parent().children('.slidy-link-selected'), 
                last        = $current.index(); 
 
            go(last); 
        }, clickMenu = function(thiz) { 
            stop(); 
 
            var $this        = $(this), 
                index        = $this.index(), 
                $current    = $this.parent().children('.slidy-link-selected'), 
                last        = $current.index(); 
 
            if (index != last) { 
                $current.removeClass('slidy-link-selected'); 
                $this.addClass('slidy-link-selected');
                change(last, index); 
            } 
 
            go(index); 
        }; 
 
        if (opt.menu) { 
            var target    = (opt.target != '') ? 'target="' + opt.target + '"' : '', 
                menu    = '', 
                parent, 
                img; 
 
            images.each(function() { 
                img        = $(this); 
                parent    = img.parent(opt.children); 
 
                menu += '<li><a href="javascript:void(0)" ' + target + '>' + img.attr('title') + '</a></li>'; 
            }); 
 
            $menu.html(menu); 
 
            var    space    = parseInt((opt.width / quantity) + (quantity - 1)), 
                diff    = opt.width - (space * quantity), 
                links    = $menu.children('li'); 
 
            if (opt.action == 'mouseenter') { 
                links.mouseenter(overMenu).mouseleave(outMenu);     
            } else if (opt.action == 'click') { 
                links.click(clickMenu); 
            } else { 
                debug('action attribute must to be "click" or "mouseenter"!'); 
                return; 
            } 
 
            links.css('width', space) 
                .first().addClass('slidy-link-selected') 
            .end() 
                .last().css({ 'border-right': '0', 'width': (space + diff) - (quantity) }); 
             
            if (opt.animation == 'slide' || opt.animation == 'fade') { 
                links.mousemove(function() { 
                    var $this = $(this); 
 
                    if (!$this.hasClass('slidy-link-selected')) { 
                        $this.mouseenter(); 
                    } 
                }); 
            } 
        } 
 
        go(0); 
 
        if (opt.pause) { 
            $this.mouseenter(overBanner).mouseleave(outBanner); 
        } 
 
        function go(index) { 
            var total    = quantity - 1, 
                last    = null; 
 
            if (index > total) { 
                index = 0; 
                last = total; 
            } else if (index <= 0) { 
                index = 0; 
                last = total; 
            } else { 
                last = index - 1; 
            } 
 
            change(last, index); 
 
            timer =    setTimeout(function() { 
                    go(++index); 
                }, opt.time); 
        } 
 
        function change(last, index) { 
            if (!isAnimate) { 
                isAnimate = true; 
 
                if (opt.animation == 'fade') { 
                    elements 
                        .eq(last).fadeOut(opt.speed) 
                    .end() 
                        .eq(index).fadeIn(opt.speed, function() { 
                            selectMenu(index); 
                            isAnimate = false; 
                        }); 
                } else if (opt.animation == 'slide') { 
                    animatedElement = elements.eq(index); 
                    elements.css('z-index', 0) 
                        .eq(index).css('z-index', quantity).slideLeftShow(opt.speed, function() { 
                                elements.eq(last).hide(); 
                                selectMenu(index); 
                                isAnimate = false; 
                        }); 
                } else { 
                    elements 
                    .eq(last).hide() 
                    .end() 
                    .eq(index).show(0, function() { 
                        selectMenu(index); 
                        isAnimate = false; 
                    }); 
                } 
            } 
        }; 
 
        function selectMenu(index) { 
            if (opt.menu) { 
                $this 
                    .next('ul.slidy-menu') 
                        .children().removeClass('slidy-link-selected') 
                            .eq(index).addClass('slidy-link-selected'); 
            } 
        }; 
 
        return $this; 
    }; 
 
    function debug(message) { 
        if (window.console && window.console.log) { 
            window.console.log(message); 
        } 
    }; 
 
    $.fn.slidy.defaults = { 
        action:        'click', 
        animation:    'slide', 
        children:    'img', 
        cursor:        'default', 
        height:        200, 
        menu:        false, 
        pause:        false, 
        speed:        600, 
        target:        '', 
        time:        3600, 
        width:        710 
    }; 
     
    $.fn.slideLeftHide = function(speed, callback) { 
        this.animate({ 
            width: "hide",  
            paddingLeft: "hide",  
            paddingRight: "hide",  
            marginLeft: "hide",  
            marginRight: "hide" 
        }, speed, callback); 
    } 
 
    $.fn.slideLeftShow = function(speed, callback) { 
        this.animate({ 
            width: "show",  
            paddingLeft: "show",  
            paddingRight: "show",  
            marginLeft: "show",  
            marginRight: "show" 
        }, speed, callback); 
    } 
})(jQuery);