/** # mod_jvslidepro - JV Slide Pro # @versions: 1.5.x,1.6.x,1.7.x,2.5.x # ------------------------------------------------------------------------ # author Open Source Code Solutions Co # copyright Copyright (C) 2011 joomlavi.com. All Rights Reserved. # @license - http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL or later. # Websites: http://www.joomlavi.com # Technical Support: http://www.joomlavi.com/my-tickets.html -------------------------------------------------------------------------*/ var JVSlider = (function ($) { var slider = function (_selector, _options) { var This = this, $This = $(this), options = $.extend({}, slider.options, _options), selector = $(_selector), isRTL = selector.css('direction') === 'rtl', preload = new JVPreload(selector), panel = selector.children('.jvsl-panel'), itemsPanel = panel.children('.jvsl-items'), items = itemsPanel.children(), waitToIndex = options.startindex, initialize = function () { itemsPanel.show(); selector.addClass(options.direction); initialize[options.direction](); var _to = to; to = function(i){ if(i<0 || i > items.length - 1) return; _to(i); } options.startindex = options.startindex > items.length - 1 ? 0 : options.startindex; options.mousewheel && itemsPanel.mousewheel(function (event, delta) { if (delta > 0) This.prevSlide(); else This.nextSlide(); return false; }); options.showtitle && items.children('.jvsl-title').show(); options.showdesc && items.children('.jvsl-desc').show(); options.hotkey && selector.hotkey({ left: function(){ This.prevSlide(); return false; }, right: function(){ This.nextSlide(); return false; }, up: function(){ This.prevSlide(); return false; }, down: function(){ This.nextSlide() return false; }, home: function(){ to(0); return false; }, end: function(){ to(items.length - 1); return false; } }); options.background && slider.background[options.background] && slider.background[options.background].call(This); items.click(function () { to($.inArray(this,items)); This.select($.inArray(this,items)); }); $This.bind('jvslideselect', function (e, index,el) { to(index); }); findPosition(); This.select(options.startindex); }, objAnimate = {}, to, findPosition, panelSize, atBegin, atEnd, btnPrev = $('').attr('href','javascript:void(0)').addClass('jvsl-btnprev').append($('').text('Prev')).click(function () { This.prevSlide(); return false; }).appendTo(selector), btnNext = $('').attr('href','javascript:void(0)').addClass('jvsl-btnnext').append($('').text('Next')).click(function () { This.nextSlide(); return false; }).appendTo(selector) ; $.extend(initialize, { horizontal: function () { var maxWidth = 0, panelWidth = panel.innerWidth() ; findPosition = isRTL?function () { var toRight = -parseInt(itemsPanel.css('margin-right')) || 0, toLeft = Math.floor(toRight + panel.innerWidth()) ; for(var i = waitToIndex; i > -1; i--){ var el = items.eq(i), posRight = itemsPanel.width() - el.outerWidth() - el.position().left ; if(posRight < toRight) break; } atBegin = i + 1; for(var i = waitToIndex; i < items.length; i++){ var el = items.eq(i), posRight = itemsPanel.width() - el.outerWidth() - el.position().left, posLeft = Math.floor(posRight + el.outerWidth()) ; if(posLeft > toLeft) break; } atEnd = i - 1; }:function () { var toLeft = -parseInt(itemsPanel.css('margin-left')) || 0, toright = Math.floor(toLeft + panel.innerWidth()) ; for(var i = waitToIndex; i > -1; i--){ var el = items.eq(i), posLeft = el.position().left ; if(posLeft < toLeft) break; } atBegin = i + 1; for(var i = waitToIndex; i < items.length; i++){ var el = items.eq(i), posLeft = el.position().left, posRight = Math.floor(posLeft + el.outerWidth()) ; if(posRight > toright) break; } atEnd = i - 1; } var objectTo = isRTL?function(el){ var toRight = itemsPanel.width() - el.outerWidth() - el.position().left, fromRight = -parseInt(itemsPanel.css('margin-right')) || 0, panelWidth = panel.innerWidth() ; if (toRight + el.outerWidth() > panelWidth + fromRight) { toRight = toRight - panel.innerWidth() + el.outerWidth(); } else if (toRight >= fromRight) return false; if (maxWidth < toRight + panelWidth) toRight = maxWidth - panel.innerWidth(); return { 'margin-right': - toRight}; }:function(el){ var toLeft = el.position().left, fromLeft = -parseInt(itemsPanel.css('margin-left')) || 0, panelWidth = panel.innerWidth() ; if (toLeft + el.outerWidth() > panelWidth + fromLeft) { toLeft = toLeft - panel.innerWidth() + el.outerWidth(); } else if (toLeft >= fromLeft) return false; if (maxWidth < toLeft + panelWidth) toLeft = maxWidth - panel.innerWidth(); return {'margin-left': - toLeft}; }; to = function (index) { if(index === waitToIndex || index > items.lenght - 1 || index < 0) return; waitToIndex = index; var el = items.eq(index); if (!el || !el.length) return; $This.trigger('jvslide_to',[index]); var obj = objectTo(el); obj && itemsPanel.stop().animate(obj, { duration: options.duration, easing: options.easing, step: function(val){ $This.trigger('jvslide_change',[-val]); }, complete: function () { findPosition(); $This.trigger('jvslide_changed',[index]); } }); } items.each(function () { var This = $(this); maxWidth += Math.round(This.outerWidth() + 0.5); }); itemsPanel.css('width', maxWidth ); options.slider && $(window).load(function(){ var isSlide = false, slider = $('
').addClass('jvslider-slider').appendTo(selector), maxCount = itemsPanel.innerWidth() - panel.innerWidth() ; slider[0].slide = null; slider.slider({ animate: true, value: 0, min: 0, max: maxCount, step: 1, slide: function( e, ui ) { var toPos = Math.round(ui.value / (itemsPanel.innerWidth() - panel.innerWidth()) * items.length - 1); console.log(toPos) to(toPos); return false; } }); $This.bind('jvslide_change',function(e,to){ to = isRTL ? maxCount - to: to; try{slider.slider('value',to);}catch(e){} }) }); }, vertical: function () { findPosition = function () { var toTop = -parseInt(itemsPanel.css('margin-top')) || 0, toBottom = Math.floor(toTop + panel.innerHeight()) ; for(var i = waitToIndex; i > -1; i--){ var el = items.eq(i), posTop = el.position().top ; if(posTop < toTop) break; } atBegin = i + 1; for(var i = waitToIndex; i < items.length; i++){ var el = items.eq(i), posTop = el.position().top, posBottom = Math.floor(posTop + el.outerHeight()) ; if(posBottom > toBottom) break; } atEnd = i - 1; } to = function (index) { if(index === waitToIndex) return; waitToIndex = index; el = items.eq(index); if (!el || !el.length) return; var maxHeight = itemsPanel.height(), toTop = el.position().top, fromtop = -parseInt(itemsPanel.css('margin-top')), panelHeight = panel.innerHeight() ; if (toTop + el.outerHeight() > panelHeight + fromtop) { toTop = toTop - panel.innerHeight() + el.outerHeight(); } else if (toTop >= fromtop) return; if (maxHeight < toTop + panelHeight) toTop = maxHeight - panel.innerHeight(); itemsPanel.stop().animate({ 'margin-top': -toTop }, { duration: options.duration, easing: options.easing, complete: function () { findPosition(); } }); } options.slider && $(window).load(function(){ var slider = $('
').addClass('jvslider-slider').appendTo(selector) ; var max = itemsPanel.innerHeight() - panel.innerHeight(); slider[0].slide = null; slider.slider({ animate: true, value:options.startIndex, min: 0, max: max, step: 1, slide: function( e, ui ) { var toPos = Math.round(ui.value / (itemsPanel.innerHeight() - panel.innerHeight()) * items.length - 1); to(toPos); return false; } }); $This.bind('jvslide_change',function(e,to){ try{slider.slider('value',to);}catch(e){} }) }); } }); $.extend(this, { els: { selector: selector, items: items, btnNext: btnNext, btnPrev: btnPrev, panel: panel, itemsPanel: itemsPanel }, options: options, select: function (index) { $This.trigger('jvslideselect', [index,items.eq(index)]); return this; }, nextSlide: function(){ to(++atEnd); }, prevSlide: function(){ to(--atBegin); }, to: function(index){ to(index); } }); selector.bind('preload_complete',function(){ initialize(); }); preload.load(); } $.extend(slider, { options: { direction: 'horizontal', //'horizontal', // vertical size: 100, duration: 500, mousewheel: true, startindex: 0, easing: 'linear' }, background: { ghostmove: function () { if (this.els.items.length === 0) return; var This = this, background = this.els.items.eq(0).clone().css({width: 0, height: 0}) ; background.addClass('jvsl-bg-ghostmove').css({ position: 'absolute' }).children().hide(); this.els.itemsPanel.prepend(background); var to = function (el) { el = $(el); var posel = el.position(); background.stop().animate({ width: el.width(), height: el.height(), left: posel.left, top: posel.top }, { duration: This.options.duration, easing: This.options.easing }); } $(this).bind('jvslideselect', function (e, index,el) { to(el); }); } } }); $.fn.jvslider = function(options){ $(this).data().jvslidercontrol = new slider(this,options); return this; } return slider; })(jQuery);