/** * Slider Kit v1.8 - Sliding contents with jQuery * http://www.kyrielles.net/sliderkit * * Copyright (c) 2010-2011 Alan Frog * Licensed under the GNU General Public License * See or * * Requires: jQuery v1.3+ * * --------------------------------- * This file is part of Slider Kit jQuery plugin. * * Slider Kit is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Slider Kit is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * --------------------------------- */ (function($){ /** * SliderKit class */ SliderKit = function() { var self = this; this._init = function( element, options ) { /*--------------------------------- * Basic settings *---------------------------------*/ // Passed in options and default options are mixed this.options = $.extend({}, this._settings, options); // CSS class names this.cssNames = { selected: this.options.cssprefix+"-selected", panel: this.options.cssprefix+"-panel", panels: this.options.cssprefix+"-panels", panelActive: this.options.cssprefix+"-panel-active", panelOld: this.options.cssprefix+"-panel-old", panelsWrapper: this.options.cssprefix+"-panels-wrapper", nav: this.options.cssprefix+"-nav", navClip: this.options.cssprefix+"-nav-clip", navBtn: this.options.cssprefix+"-nav-btn", navPrev: this.options.cssprefix+"-nav-prev", navNext: this.options.cssprefix+"-nav-next", btnDisable:this.options.cssprefix+"-btn-disable", btnPause: this.options.cssprefix+"-pause-btn", goPrev: this.options.cssprefix+"-go-prev", goNext: this.options.cssprefix+"-go-next", playBtn: this.options.cssprefix+"-play-btn", goBtns: this.options.cssprefix+"-go-btn" }; // Save the element reference this.domObj = $( element ); // The main container DOM element // Getting main elements (panels & nav) this.panels = $("."+this.cssNames.panel, this.domObj); this.allItems = this.panels.size(); this.nav = $("."+this.cssNames.nav, this.domObj); this.navClip = $("."+this.cssNames.navClip, this.nav); // Check if there is any reason to go further this.arePanels = this.allItems > 0 ? 1 : 0; this.isNavClip = this.navClip.size() > 0 ? 1 : 0; this.domObjHeight = this.domObj.height(); this.domObjWidth = this.domObj.width(); if( !this.arePanels && !this.isNavClip ){ this._errorReport( "Error #01", this.options.debug, 1 ); } // The function stops if there is no height value (unless 'freeheight' setting is true) else if( this.domObjHeight == "auto" && !this.options.freeheight ){ this._errorReport( "Error #02", this.options.debug, 1 ); } // By default, the widget should be hidden via CSS. Then shown only if javascript is available : this.domObj.css("display","block"); // Variables that will be needed all over the script this.currId = 0; this.prevId = 0; this.newId = 0; this.currPanel = null; this.prevPanel = 0; this.firstTime = 1; this.scrollActive = 0; this.isPlaying = null; this.changeOngoing = false; this.currLine = 1; this.animating = false; this.panelAnteFns = new Array; this.panelPostFns = new Array; this.navAnteFns = new Array; this.navPostFns = new Array; // Nav builder if(this.isNavClip){ this._buildNav(); } // Controls builder this._buildControls(); // Panels wrapper : this is only for internal code usage; // It allows a nice sliding effect in the panels container if(this.arePanels){ this.panelsBag = $("."+this.cssNames.panels, this.domObj); if(this.options.panelfx == "sliding"){ this._wrapPanels(); } } /*--------------------------------- * Navigation settings *---------------------------------*/ // In carousel mode (no panels), mousewheel and autoscroll should move lines instead of thumbnails. This behaviour is also set for 'navpanelautoswitch' option. this.lineScrollDo = !this.arePanels ? 1 : 0; // Keyboard navigation (beta) if( this.options.keyboard ){ this.domObj.keyup(function(event){ // slide left if(event.keyCode == 37){ self.stepBackward(); } // slide right else if (event.keyCode == 39){ self.stepForward(); } }); } // One-click navigation if(this.options.panelclick && this.arePanels){ this.panelsBag.click(function(){ self.stepForward(); return false; }); } // Sarting id this.startId = this.options.start >= this.allItems ? this.allItems-1 : this.options.start < 0 ? 0 : this.options.start; /*--------------------------------- * Add-ons *---------------------------------*/ // Counter if( this.options.counter ){ try{ this.Counter(); } catch( err ){ this._errorReport(err, this.options.debug, 0); } } // DelayCaptions if( this.options.delaycaptions ){ try{ this.DelayCaptions( this.options.delaycaptions ); } catch( err ){ this._errorReport(err, this.options.debug, 0); } } // Slide for the first time this.changeWithId( this.startId, null ); /*--------------------------------- * Time options *---------------------------------*/ // Auto-scrolling starter if(this.options.auto){ this.autoScrollStart(); // Stops autoScrolling when mouse is over the slider content this._autoScrollHoverStop(); } // Timer load if( this.options.timer ){ try{ this.Timer( this.options.timer ); } catch( err ){ this._errorReport(err, this.options.debug, 0); } } // return this so we can chain/use the bridge with less code. return this; }; this._settings = { cssprefix:"cSlider", start:0, auto:true, autospeed:4000, autostill:false, mousewheel:false, keyboard:false, circular:false, shownavitems:5, navitemshover:false, navclipcenter:false, navcontinuous:false, navscrollatend:false, navpanelautoswitch:true, navfx:"sliding", navfxbefore:function(){}, navfxafter:function(){}, scroll:null, scrollspeed:600, scrolleasing:null, panelfx:"fading", panelfxspeed:700, panelfxeasing:null, panelfxfirst:"none", panelfxbefore:function(){}, panelfxafter:function(){}, panelbtnshover:false, panelclick:false, verticalnav:false, verticalslide:false, tabs:false, freeheight:false, fastchange:true, counter:false, delaycaptions:false, timer:false, debug:false }; this._errorReport = function( errorCode, debug, stop ){ if(debug){ alert("Slider Kit error!\nMessage = "+errorCode+" (see doc for details)\nElement id = "+this.domObj.attr("id")+"\nElement class = "+this.domObj.attr("class")); } if(stop){ return false; } }; this._autoScrollHoverStop = function(){ // Stop auto-scrolling when mouse goes over the slider if( !this.isPlayBtn && !this.options.autostill ){ this.domObj.hover( function(){ if( self.isPlaying!=null ){ self.autoScrollStop(); } }, function(){ self.autoScrollStart(); } ); } // Restart auto-scrolling on mouse leave if 'autostill' is on if( this.options.autostill ){ this.domObj.mouseleave(function(){ if( self.isPlaying == null ){ self.autoScrollStart(); } }); } }; this._buildNav = function() { this.navUL = $("ul", this.navClip); this.navLI = $("li", this.navUL); this.navLINum = this.navLI.size(); // Check if nav size is equal to panels size (only if there are panels) if(this.arePanels && (this.navLINum != this.allItems) && this.nav.size() == 1){ this._errorReport("Error #03", this.options.debug, 1); } // If Slider Kit is used as a tabs menu, the nav scroll becomes useless (well, for now...) if(this.options.tabs){ this.options.shownavitems = this.allItems; } // Else we start initializing the carousel else{ // LI margins function: returns the
  • tag margins value in pixels function getLImargin(attr){ attrVal = self.navLI.css(attr); if(attrVal!="auto" && attr!="" && attr!="0px"){ return parseInt(attrVal); } else return 0; } // Nav elements size var navSize = this.options.verticalnav ? this.nav.height() : this.nav.width(); var navLIWidth = this.navLI.outerWidth(true); // padding + margin + border var navLIHeight = this.navLI.outerHeight(true); var navLIextHMarg = getLImargin("margin-left") + getLImargin("margin-right"); var navLIextVMarg = getLImargin("margin-top") + getLImargin("margin-bottom"); this.navLIsize = this.options.verticalnav ? navLIHeight : navLIWidth; this.navULSize = this.navLIsize * this.navLINum; this.navClipSize = (this.options.shownavitems * this.navLIsize) - (this.options.verticalnav ? navLIextVMarg : navLIextHMarg);// Removes the item side margins to center the nav clip // CSS attributes for position/height values this.cssPosAttr = this.options.verticalnav ? "top" : "left"; var cssSizeAttr = this.options.verticalnav ? "height" : "width"; var cssSizeAttrr = this.options.verticalnav ? "width" : "height"; // Setting height and width values(px) to Clip, UL & LI tags this.navLI.css({width:this.navLI.width(), height:this.navLI.height()}); this.navUL.css(cssSizeAttr, this.navULSize+"px"); this.navClip.css({width:this.options.verticalnav ? navLIWidth : this.navClipSize, height:this.options.verticalnav ? this.navClipSize : navLIHeight}); // Center the navclip in the nav container if(this.options.navclipcenter){ this.navClip.css(this.cssPosAttr,( navSize - this.navClipSize)/2 ).css("margin", "0"); } // Check if linescroll is necessary this.allItems = this.navLINum; // The nav scrolling is required only if the number of items is greater than the 'visible' param. if(this.allItems > this.options.shownavitems){ this.scrollActive = true; // Correcting a potentially 'this.options.scroll' wrong value if(this.options.scroll == null || this.options.scroll < 0 || this.options.scroll > this.allItems){ this.options.scroll = this.options.shownavitems; } // Nav Buttons this.navBtns = $("."+this.cssNames.navBtn, this.nav); if(this.navBtns.size() > 0){ this._buildNavButtons(); } } } // Nav
  • links mouse event if(this.options.navitemshover && this.arePanels){ this.navLI.mouseover(function(){ self.changeWithId(getIndex(this, "li"), $(this)); }); } else if(this.arePanels || this.options.navscrollatend){ this.navLI.click(function(){ self.changeWithId(getIndex(this, "li"), $(this)); return false; }); } // Get an item index function getIndex(item, tag){ return $(tag, $(item).parent()).index(item); } }; this._buildNavButtons = function() { this.scrollBtns = true; this.navBtnPrev = $("."+this.cssNames.navPrev, this.nav); this.navBtnNext = $("."+this.cssNames.navNext, this.nav); // Nav Buttons click event this.navBtnPrev.click(function(){ self.navPrev(); return false; }); this.navBtnNext.click(function(){ self.navNext(); return false; }); // Nav Buttons mousedown/up events if(this.options.navcontinuous){ this.navBtnPrev.mouseover(function(){ self.navPrev(true); }); this.navBtnNext.mouseover(function(){ self.navNext(true); }); this.navBtns.mouseout(function(){ self.navStopContinuous(); }); } // Disable first button if not circular if(!this.options.circular){ this.navBtnPrev.toggleClass(this.cssNames.btnDisable); } }; this._getNavPos = function() { this.navPos = this.options.verticalnav ? this.navUL.position().top : this.navUL.position().left; this.LIbefore = Math.ceil( Math.abs(this.navPos) / this.navLIsize ); this.LIafter = Math.floor(( this.navULSize - Math.abs(this.navPos) - this.navClipSize) / this.navLIsize ); if(this.LIafter < 0){ this.LIafter = 0; } }; this._buildControls = function() { this.playBtn = $("."+this.cssNames.playBtn, this.domObj); this.gBtns = $("."+this.cssNames.goBtns, this.domObj); this.isPlayBtn = this.playBtn.size() > 0 ? 1 : 0; this.goBtns = this.gBtns.size() > 0 ? 1 : 0; // Play button if( this.isPlayBtn ){ // If autoscroll is active, the play button is set to 'pause' mode if( this.options.auto ){ this.playBtn.addClass(this.cssNames.btnPause); } // Button mouse event this.playBtn.click(function(){ if(self.playBtn.hasClass(self.cssNames.btnPause)){ self.playBtnPause(); } else{ self.playBtnStart(); } return false; }); } // Go buttons (prev/next) if( this.goBtns ){ this.goBtnPrev = $("."+this.cssNames.goPrev, this.domObj); this.goBtnNext = $("."+this.cssNames.goNext, this.domObj); // Show/hide buttons on panel mouseover if(this.options.panelbtnshover){ this.gBtns.hide(); $("."+this.cssNames.panels, this.domObj).hover( function(){ self.gBtns.fadeIn(); }, function(){ self.gBtns.fadeOut(); } ); } // Button click binding this.goBtnPrev.click(function(){ self.stepBackward($(this)); return false; }); this.goBtnNext.click(function(){ self.stepForward($(this)); return false; }); } }; this._wrapPanels = function(){ this.panels.wrapAll('
    '); this.panelsWrapper = $("."+this.cssNames.panelsWrapper, this.panelsBag); this.panelsWrapper.css({"position":"relative"}); }; this._change = function( eventSrc, scrollWay, goToId, lineScrolling, stopAuto ) { // If there is a play button + auto-scrolling running if( stopAuto && this.isPlaying!=null ){ if( this.isPlayBtn ){ this.playBtnPause(); } if( this.options.autostill ){ self.autoScrollStop(); } } // Don't go further if the side is reached and carousel isn't circular // The slide is stopped if the button is disable if(eventSrc){ if(eventSrc.hasClass(this.cssNames.btnDisable)){ return false; } eventSrc.addClass(this.cssNames.btnDisable) } // By default, user action is blocked when nav is being animated. This to prevent the function calculation to go mad when the user is switching the items too quickly. // This security applies on panels too. However it can be removed using the 'fastchange' option. var stopGoing = 0; var running = $(":animated", this.options.fastchange ? this.nav : this.domObj).size() > 0 ? 1 : 0; if( !running && !this.animating ){ this.prevId = this.currId; // Increment the current id, only if linescrolling isn't required if(goToId == null && !lineScrolling){ this.currId = scrollWay == "-=" ? this.currId+1 : this.currId-1; } // Else if an id is given, we take it else if(goToId != null){ goToId = parseInt(goToId);// make sure it's a number this.currId = goToId < 0 ? 0 : goToId > this.allItems-1 ? this.allItems-1 : goToId;// make sure it's in the nav range var checkIdRange = eventSrc ? eventSrc.parent().parent().hasClass(this.cssNames.navClip) ? false : true : true; } // If panel buttons exist, we activate them if(this.goBtns){ this.gBtns.removeClass(this.cssNames.btnDisable); } // If the carousel isn't circular the controls must be hidden when sides are reached if(!this.options.circular){ // Top/left side is reached if(this.currId == -1){ this.currId = 0; stopGoing = 1; } if(this.currId == 0 && this.goBtns){ this.goBtnPrev.addClass(this.cssNames.btnDisable); } // Bottom/right side is reached if(this.currId == this.allItems){ this.currId = this.allItems-1; stopGoing = 1; } if(this.currId == this.allItems-1){ if(this.options.auto){ this.autoScrollStop(); } if(this.goBtns){ this.goBtnNext.addClass(this.cssNames.btnDisable); } } } // Otherwise if there is no scroll required, this.currId must be reset when sides are reached else if(!this.scrollActive){ if(this.currId == this.allItems){ this.currId = 0; } if(this.currId == -1){ this.currId = this.allItems-1; } } // If the slide function isn't triggered from a nav LI event, we must check if the line must be scrolled or not if( this.scrollActive && !stopGoing ){ //JS HAck if(eventSrc) { if(eventSrc.hasClass(this.cssNames.btnDisable)) { this._setNavScroll( lineScrolling, scrollWay, checkIdRange ); } setInterval(function(){ if(eventSrc.hasClass('cSlider-btn-disable')) { eventSrc.removeClass('cSlider-btn-disable'); clearInterval(); } },3000); } //setInterval(function(){if(eventSrc.hasClass(this.cssNames.btnDisable)){eventSrc.removeClass(this.cssNames.btnDisable);clearInterval();}},5000); } // Highlight selected menu if( this.isNavClip ){ this.selectThumbnail(this.currId); } // Switch to the next panel // Note: if 'navpanelautoswitch' option is false, the panels won't switch when line is scrolling if( ! (lineScrolling && !this.options.navpanelautoswitch) ){ if( this.arePanels ){ this._animPanel( this.currId, scrollWay ); } } // First time cancel if( this.firstTime ){ this.firstTime = 0; } } // else > be patient, the line scroll is running ! }; this._setNavScroll = function( lineScrolling, scrollWay, checkIdRange ) { // Get the current nav position this._getNavPos(); var triggerLineScroll = lineScrolling ? true : false; var jumpToId = 0; // No line scrolling required yet: we are going to check the current item position to determine if line scrolling is needed or not. if( ! lineScrolling ){ // Line scrolling will happen only if navclip sides are reached // Number of items from the clip sides: var idFromClipStart = Math.abs(this.currId+1 - this.LIbefore); var idToClipEnd = this.options.shownavitems - idFromClipStart +1; var currIdOnEdge = this.currId == 0 || this.currId == this.allItems-1 ? 1 : 0; // If 'navscrollatend' option is activated, the line will scroll when navclip edges are reached (except if currId is the first or last item of the nav) if( (this.options.navscrollatend && (idToClipEnd == 1 || idFromClipStart == 1)) && !this.firstTime && !currIdOnEdge ){ jumpToId = this.options.scroll - 1; triggerLineScroll = true; } // Else the line will scroll when currId is out of the navclip range by -1 or +1 if(idToClipEnd == 0 || idFromClipStart == 0){ triggerLineScroll = true; } // A target id is specified (using 'changeWithId' method). No direction ('scrollWay = ""'). // We check here the difference between target and previous Ids if(checkIdRange){ var idDiff = Math.abs(this.prevId - this.currId); // The nav will scroll if the target id is different from the previous Id // The scroll value will then be equal to the 'jumpToId' var, overwriting the 'scroll' option value. if(idDiff > 0){ jumpToId = idDiff; triggerLineScroll = true; } } // Dertermine scroll direction if(scrollWay == ""){ if(this.prevId == this.currId && !currIdOnEdge){ scrollWay = this.scrollWay == "-=" ? "+=" : "-="; } else{ scrollWay = this.prevId < this.currId ? "-=" : "+="; } } this.scrollWay = scrollWay; } // If line scrolling is required if( triggerLineScroll ){ // How many lines will scroll ? By default the answer is 'this.options.scroll' or 'jumpToId'. But we check if there are enough lines left. var scrollPower = jumpToId > 0 ? jumpToId : this.options.scroll; var LIremain = scrollWay == "-=" ? this.LIafter : this.LIbefore; var scrollto = LIremain < scrollPower ? LIremain : scrollPower; var scrollSize = scrollto * this.navLIsize; // Once the nav has scrolled, the
  • tag matching the currId value may not be visible in the nav clip. So we calculate here a new currId regarding to the nav position. this.newId = scrollWay == "-=" ? this.LIbefore+scrollto : this.LIbefore-scrollto+this.options.shownavitems-1; if( (scrollWay == "-=" && this.newId > this.currId) || (scrollWay == "+=" && this.newId < this.currId) ){ this.currId = this.newId; } // Circular option is active if(this.options.circular){ if(this.LIbefore <= 0 && scrollWay == "+="){ scrollWay = "-="; this.currId = this.allItems-1; scrollSize = ( this.LIafter/this.options.scroll )*( this.navLIsize*this.options.scroll ); } else if(this.LIafter == 0 && scrollWay == "-="){ scrollWay = "+="; this.currId = 0; scrollSize = Math.abs(this.navPos); } } // Finally, the scroll animation this._animNav(scrollWay, scrollSize); } }; this._animPanel = function( currId, scrollWay ) { // Current panel index this.currPanel = this.panels.eq( currId ); var panelComplete = function(){ if( $.isFunction(self.options.panelfxafter) ){ self.options.panelfxafter(); } // Additional callbacks self._runCallBacks( self.panelPostFns ); }; // Slide panel (only if not already active) if(!this.currPanel.hasClass( this.cssNames.panelActive )){ // First panel display (no effect) if(this.firstTime){ this.panelTransition = this.options.panelfxfirst; var FirstTime = 1; } // Else we check for the transition effect else{ // No effect var freeheightfx = this.options.freeheight && this.options.panelfx == "fading" ? "tabsfading" : "none"; this.panelTransition = this.options.freeheight ? freeheightfx : this.options.panelfx; } // Call the before function is it exists if( $.isFunction(self.options.panelfxbefore) ){ self.options.panelfxbefore(); } // Additional callbacks this._runCallBacks( this.panelAnteFns ); // Call the transition function this._panelTransitions[ this.panelTransition ](scrollWay, FirstTime, panelComplete); } }; this._animNav = function( scrollWay, scrollSize ) { var navComplete = function(){ // If the nav isn't circular, buttons are disabled when start or end is reached if(!self.options.circular && self.scrollBtns){ self.navBtns.removeClass(self.cssNames.btnDisable); // Get the nav position self._getNavPos(); // Start is reached if(self.LIbefore <= 0){ self.navBtnPrev.addClass(self.cssNames.btnDisable); } // End is reached else if(self.LIafter <= 0){ self.navBtnNext.addClass(self.cssNames.btnDisable); } } // Reload the animation if scrollcontinue option is true if(self.scrollcontinue){ setTimeout(function(){ self.scrollcontinue == "-=" ? self.navPrev() : self.navNext() }, 0); } // Nav callback else if( $.isFunction(self.options.navfxafter) ){ self.options.navfxafter(); } // Additional callbacks self._runCallBacks( self.navPostFns ); }; // Call the before function is it exists if( $.isFunction(self.options.navfxbefore) ){ self.options.navfxbefore(); } // Additional callbacks self._runCallBacks( self.navAnteFns ); // Call transition this._navTransitions[ this.options.navfx ](scrollWay, scrollSize, navComplete); }; this._runCallBacks = function( fns ){ $.each( fns, function(index, item) { if( $.isFunction( item ) ){ item(); } }); }; this._clearCallBacks = function( fns ){ fns.length = 0; }; this._panelTransitions = { none: function(scrollWay, FirstTime, complete) { self.panels.removeClass(self.cssNames.panelActive).hide(); self.currPanel.addClass(self.cssNames.panelActive).show(); complete(); }, sliding: function(scrollWay, FirstTime, complete) { // Slide direction if(scrollWay == ""){ scrollWay = self.prevPanel < self.currId ? "-=" : "+="; } self.prevPanel = self.currId; // Position/Size values for CSS var cssPosValue = scrollWay == "-=" ? "+" : "-"; var cssSlidePosAttr = self.options.verticalslide ? "top" : "left"; var domObjSize = self.options.verticalnav ? self.domObjHeight : self.domObjWidth; var slideScrollValue = cssSlidePosAttr == "top" ? {top: scrollWay+domObjSize} : {left: scrollWay+domObjSize}; // Panels selection self.oldPanel = $("."+self.cssNames.panelOld, self.domObj); self.activePanel = $("."+self.cssNames.panelActive, self.domObj); // Panels CSS properties self.panels.css(cssSlidePosAttr, "0"); self.oldPanel.removeClass(self.cssNames.panelOld).hide(); self.activePanel.removeClass(self.cssNames.panelActive).addClass(self.cssNames.panelOld); self.currPanel.addClass(self.cssNames.panelActive).css(cssSlidePosAttr, cssPosValue+domObjSize + "px").show(); // Wrapper animation self.panelsWrapper.stop(true, true).css(cssSlidePosAttr, "0").animate( slideScrollValue, self.options.panelfxspeed, self.options.panelfxeasing, function(){ complete(); } ); }, fading: function(scrollWay, FirstTime, complete) { if(FirstTime){ self.panels.hide(); } else{ self.currPanel.css("display","none"); } $("."+self.cssNames.panelOld, self.domObj).removeClass(self.cssNames.panelOld); $("."+self.cssNames.panelActive, self.domObj).stop(true, true).removeClass(self.cssNames.panelActive).addClass(self.cssNames.panelOld); self.currPanel.addClass(self.cssNames.panelActive) .animate( {"opacity":"show"}, self.options.panelfxspeed, self.options.panelfxeasing, function(){ complete(); } ); }, tabsfading: function(scrollWay, FirstTime, complete) { self.panels.removeClass(self.cssNames.panelActive).hide(); self.currPanel.fadeIn( self.options.panelfxspeed, function(){ complete(); } ); } }; this._navTransitions = { none: function(scrollWay, scrollSize, complete) { var newScrollSize = scrollWay == "-=" ? self.navPos-scrollSize : self.navPos+scrollSize; self.navUL.css( self.cssPosAttr, newScrollSize +"px" ); complete(); }, sliding: function(scrollWay, scrollSize, complete) { self.navUL.animate( self.cssPosAttr == "left" ? {left:scrollWay+scrollSize} : {top:scrollWay+scrollSize} , self.options.scrollspeed, self.options.scrolleasing , function(){ complete(); } ); } }; this.playBtnPause = function() { this.playBtn.removeClass(this.cssNames.btnPause); this.autoScrollStop(); }; this.playBtnStart = function() { this.playBtn.addClass(self.cssNames.btnPause); this.autoScrollStart(); }; this.autoScrollStart = function() { var self = this; this.isPlaying = setInterval(function(){ self._change(null, "-=", null, self.lineScrollDo, null); }, self.options.autospeed); }; this.autoScrollStop = function() { clearTimeout(this.isPlaying); this.isPlaying = null; }; this.changeWithId = function( id, eventSrc ) { this._change(eventSrc, "", id, 0, 1); }; this.stepBackward = function(eventSrc) { this._change(eventSrc, "+=", null, self.lineScrollDo, 1); }; this.stepForward = function(eventSrc) { this._change(eventSrc, "-=", null, self.lineScrollDo, 1); }; this.navPrev = function(c) { if(c){self.scrollcontinue = "-=";} this._change(this.navBtnPrev, "+=", null, 1, 1); }; this.navNext = function(c) { if(c){self.scrollcontinue = "+=";} this._change(this.navBtnNext, "-=", null, 1, 1); }; this.navStopContinuous = function() { self.scrollcontinue = ""; }; this.selectThumbnail = function( currId ){ $("."+this.cssNames.selected, this.navUL).removeClass(this.cssNames.selected); this.navLI.eq(currId).addClass(this.cssNames.selected); }; }; // Launch plugin $.fn.sliderkit = function( options ){ return this.each(function(){ $( this ).data( "sliderkit", new SliderKit()._init( this, options ) ); }); }; })(joms.jQuery);