').appendTo('body').remove(); /* Cache existing DOM elements for later */ /* base.jqel = original ul */ /* for wrap - get parent() then closest in case the ul has "anythingSlider" class */ base.jqwrapper = base.jqel.parent().closest('div.anythingSlider').addClass('anythingSlider-' + o.theme); base.jqwindow = base.jqel.closest('div.anythingWindow'); base.win = window; base.jqwin = jq(base.win); base.jqcontrols = jq('
'); base.jqnav = jq('
'); base.jqstartStop = jq('
'); if (o.buildStartStop || o.buildNavigation) { base.jqcontrols.appendTo( (o.appendControlsTo && jq(o.appendControlsTo).length) ? jq(o.appendControlsTo) : base.jqwrapper); } if (o.buildNavigation) { base.jqnav.appendTo( (o.appendNavigationTo && jq(o.appendNavigationTo).length) ? jq(o.appendNavigationTo) : base.jqcontrols ); } if (o.buildStartStop) { base.jqstartStop.appendTo( (o.appendStartStopTo && jq(o.appendStartStopTo).length) ? jq(o.appendStartStopTo) : base.jqcontrols ); } /* Figure out how many sliders are on the page for indexing */ base.runTimes = jq('.anythingBase').length; base.regex = new RegExp('panel' + base.runTimes + '-(\\d+)', 'i'); /* hash tag regex */ if (base.runTimes === 1) { base.makeActive(); } /* make the first slider on the page active */ /* Set up a few defaults & get details */ base.flag = false; /* event flag to prevent multiple calls (used in control click/focusin) */ base.playing = o.autoPlay; /* slideshow state; removed "startStopped" option */ base.slideshow = false; /* slideshow flag needed to correctly trigger slideshow events */ base.hovered = false; /* actively hovering over the slider */ base.panelSize = []; /* will contain dimensions and left position of each panel */ base.currentPage = o.startPanel = parseInt(o.startPanel,10) || 1; /* make sure this isn't a string */ o.changeBy = parseInt(o.changeBy,10) || 1; /* set slider type, but keep backward compatibility with the vertical option */ t = (o.mode || 'h').toLowerCase().match(/(h|v|f)/); t = o.vertical ? 'v' : (t || ['h'])[0]; o.mode = t === 'v' ? 'vertical' : t === 'f' ? 'fade' : 'horizontal'; if (t === 'f') { o.showMultiple = 1; /* all slides are stacked in fade mode */ o.infiniteSlides = false; /* no cloned slides */ } base.adj = (o.infiniteSlides) ? 0 : 1; /* adjust page limits for infinite or limited modes */ base.width = base.jqel.width(); base.height = base.jqel.height(); base.outerPad = [ base.jqwrapper.innerWidth() - base.jqwrapper.width(), base.jqwrapper.innerHeight() - base.jqwrapper.height() ]; if (o.playRtl) { base.jqwrapper.addClass('rtl'); } /* Expand slider to fit parent */ if (o.expand) { base.jqouter = base.jqwrapper.parent(); base.jqwindow.css({ width: '100%', height: '100%' }); /* needed for Opera */ base.checkResize(); } /* Build start/stop button */ if (o.buildStartStop) { base.buildAutoPlay(); } /* Build forwards/backwards buttons */ if (o.buildArrows) { base.buildNextBackButtons(); } /* can't lock autoplay it if it's not enabled */ if (!o.autoPlay) { o.autoPlayLocked = false; } base.jqlastPage = base.jqtargetPage = base.jqcurrentPage; base.updateSlider(); /* Make sure easing function exists. */ if (!jq.isFunction(jq.easing[o.easing])) { o.easing = "swing"; } /* If pauseOnHover then add hover effects */ if (o.pauseOnHover) { base.jqwrapper.hover(function() { if (base.playing) { base.jqel.trigger('slideshow_paused', base); base.clearTimer(true); } }, function() { if (base.playing) { base.jqel.trigger('slideshow_unpaused', base); base.startStop(base.playing, true); } }); } /* Hide/Show navigation & play/stop controls */ base.slideControls(false); base.jqwrapper.bind('mouseenter mouseleave', function(e){ /* add hovered class to outer wrapper */ jq(this)[e.type === 'mouseenter' ? 'addClass' : 'removeClass']('anythingSlider-hovered'); base.hovered = (e.type === 'mouseenter') ? true : false; base.slideControls(base.hovered); }); /* Add keyboard navigation */ jq(document).keyup(function(e){ /* Stop arrow keys from working when focused on form items */ if (o.enableKeyboard && base.jqwrapper.hasClass('activeSlider') && !e.target.tagName.match('TEXTAREA|INPUT|SELECT')) { if (o.mode !== 'vertical' && (e.which === 38 || e.which === 40)) { return; } switch (e.which) { case 39: case 40: /* right & down arrow */ base.goForward(); break; case 37: case 38: /* left & up arrow */ base.goBack(); break; } } }); /* If a hash can not be used to trigger the plugin, then go to start panel */ base.currentPage = base.gotoHash() || o.startPanel || 1; base.gotoPage(base.currentPage, false, null, -1); /* Binds events */ var triggers = "slideshow_paused slideshow_unpaused slide_init slide_begin slideshow_stop slideshow_start initialized swf_completed".split(" "); jq.each("onShowPause onShowUnpause onSlideInit onSlideBegin onShowStop onShowStart onInitialized onSWFComplete".split(" "), function(i,f){ if (jq.isFunction(o[f])){ base.jqel.bind(triggers[i], o[f]); } }); if (jq.isFunction(o.onSlideComplete)){ /* Added setTimeout (zero time) to ensure animation is complete... see this bug report: http://bugs.jquery.com/ticket/7157 */ base.jqel.bind('slide_complete', function(){ setTimeout(function(){ o.onSlideComplete(base); }, 0); return false; }); } base.initialized = true; base.jqel.trigger('initialized', base); /* trigger the slideshow */ base.startStop(o.autoPlay); }; /* called during initialization & to update the slider if a panel is added or deleted */ base.updateSlider = function(){ /* needed for updating the slider */ base.jqel.children('.cloned').remove(); base.navTextVisible = base.jqnav.find('span:first').css('visibility') !== 'hidden'; base.jqnav.empty(); /* set currentPage to 1 in case it was zero - occurs when adding slides after removing them all */ base.currentPage = base.currentPage || 1; base.jqitems = base.jqel.children(); base.pages = base.jqitems.length; base.dir = (o.mode === 'vertical') ? 'top' : 'left'; o.showMultiple = (o.mode === 'vertical') ? 1 : parseInt(o.showMultiple,10) || 1; /* only integers allowed */ o.navigationSize = (o.navigationSize === false) ? 0 : parseInt(o.navigationSize,10) || 0; /* Fix tabbing through the page, but don't change the view if the link is in view (showMultiple = true) */ base.jqitems.find('a').unbind('focus.AnythingSlider').bind('focus.AnythingSlider', function(e){ var panel = jq(this).closest('.panel'), indx = base.jqitems.index(panel) + base.adj; /* index can be -1 in nested sliders - issue #208 */ base.jqitems.find('.focusedLink').removeClass('focusedLink'); jq(this).addClass('focusedLink'); base.jqwindow.scrollLeft(0).scrollTop(0); if ( ( indx !== -1 && (indx >= base.currentPage + o.showMultiple || indx < base.currentPage) ) ) { base.gotoPage(indx); e.preventDefault(); } }); if (o.showMultiple > 1) { if (o.showMultiple > base.pages) { o.showMultiple = base.pages; } base.adjustMultiple = (o.infiniteSlides && base.pages > 1) ? 0 : o.showMultiple - 1; base.pages = base.jqitems.length - base.adjustMultiple; } /* Hide navigation & player if there is only one page */ base.jqcontrols .add(base.jqnav) .add(base.jqstartStop) .add(base.jqforward) .add(base.jqback)[(base.pages <= 1) ? 'hide' : 'show'](); if (base.pages > 1) { /* Build/update navigation tabs */ base.buildNavigation(); } /* Top and tail the list with 'visible' number of items, top has the last section, and tail has the first */ /* This supports the "infinite" scrolling, also ensures any cloned elements don't duplicate an ID */ /* Moved removeAttr before addClass otherwise IE7 ignores the addClass: http://bugs.jquery.com/ticket/9871 */ if (o.mode !== 'fade' && o.infiniteSlides && base.pages > 1) { base.jqel.prepend( base.jqitems.filter(':last').clone().addClass('cloned') ); /* Add support for multiple sliders shown at the same time */ if (o.showMultiple > 1) { base.jqel.append( base.jqitems.filter(':lt(' + o.showMultiple + ')').clone().addClass('cloned multiple') ); } else { base.jqel.append( base.jqitems.filter(':first').clone().addClass('cloned') ); } base.jqel.find('.cloned').each(function(){ /* disable all focusable elements in cloned panels to prevent shifting the panels by tabbing */ jq(this).find('a,input,textarea,select,button,area,form').attr({ disabled : 'disabled', name : '' }); jq(this).find('[id]').andSelf().removeAttr('id'); }); } /* We just added two items, time to re-cache the list, then get the dimensions of each panel */ base.jqitems = base.jqel.addClass(o.mode).children().addClass('panel'); base.setDimensions(); /* Set the dimensions of each panel */ if (o.resizeContents) { base.jqitems.css('width', base.width); base.jqwrapper .css('width', base.getDim(base.currentPage)[0]) .add(base.jqitems).css('height', base.height); } else { base.jqwin.load(function(){ /* set dimensions after all images load */ base.setDimensions(); /* make sure the outer wrapper is set properly */ t = base.getDim(base.currentPage); base.jqwrapper.css({ width: t[0], height: t[1] }); base.setCurrentPage(base.currentPage, false); }); } if (base.currentPage > base.pages) { base.currentPage = base.pages; } base.setCurrentPage(base.currentPage, false); base.jqnav.find('a').eq(base.currentPage - 1).addClass('cur'); /* update current selection */ if (o.mode === 'fade') { base.jqitems .eq(base.currentPage-1).css({ opacity: 1 }) .siblings().css({ opacity: 0 }); } }; /* Creates the numbered navigation links */ base.buildNavigation = function() { if (o.buildNavigation && (base.pages > 1)) { var a, c, i, t, jqli; base.jqitems.filter(':not(.cloned)').each(function(j){ jqli = jq('
'); i = j + 1; c = (i === 1 ? ' first' : '') + (i === base.pages ? ' last' : ''); a = '
@'; /* If a formatter function is present, use it */ if (jq.isFunction(o.navigationFormatter)) { t = o.navigationFormatter(i, jq(this)); if (typeof(t) === "string") { jqli.html(a.replace(/@/g,t)); } else { jqli = jq('
', t); } } else { jqli.html(a.replace(/@/g,i)); } jqli .appendTo(base.jqnav) .addClass(c) .data('index', i); }); base.jqnav.children('li').bind(o.clickControls, function(e) { if (!base.flag && o.enableNavigation) { /* prevent running functions twice (once for click, second time for focusin) */ base.flag = true; setTimeout(function(){ base.flag = false; }, 100); base.gotoPage( jq(this).data('index') ); } e.preventDefault(); }); /* Add navigation tab scrolling - use !! in case someone sets the size to zero */ if (!!o.navigationSize && o.navigationSize < base.pages) { if (!base.jqcontrols.find('.anythingNavWindow').length){ base.jqnav .before('
') .after('
') .wrap('
'); } /* include half of the left position to include extra width from themes like tabs-light and tabs-dark (still not perfect) */ base.navWidths = base.jqnav.find('li').map(function(){ return jq(this).outerWidth(true) + Math.ceil(parseInt(jq(this).find('span').css('left'),10)/2 || 0); }).get(); base.navLeft = base.currentPage; /* add 25 pixels (old IE needs more than 5) to make sure the tabs don't wrap to the next line */ base.jqnav.width( base.navWidth( 1, base.pages + 1 ) + 25 ); base.jqcontrols.find('.anythingNavWindow') .width( base.navWidth( 1, o.navigationSize + 1 ) ).end() .find('.prev,.next').bind(o.clickControls, function(e) { if (!base.flag) { base.flag = true; setTimeout(function(){ base.flag = false; }, 200); base.navWindow( base.navLeft + o.navigationSize * ( jq(this).is('.prev') ? -1 : 1 ) ); } e.preventDefault(); }); } } }; base.navWidth = function(x,y){ var i, s = Math.min(x,y), e = Math.max(x,y), w = 0; for (i = s; i < e; i++) { w += base.navWidths[i-1] || 0; } return w; }; base.navWindow = function(n){ if (!!o.navigationSize && o.navigationSize < base.pages && base.navWidths) { var p = base.pages - o.navigationSize + 1; n = (n <= 1) ? 1 : (n > 1 && n < p) ? n : p; if (n !== base.navLeft) { base.jqcontrols.find('.anythingNavWindow').animate( { scrollLeft: base.navWidth(1, n), width: base.navWidth(n, n + o.navigationSize) }, { queue: false, duration: o.animationTime }); base.navLeft = n; } } }; /* Creates the Forward/Backward buttons */ base.buildNextBackButtons = function() { base.jqforward = jq('
' + o.forwardText + ''); base.jqback = jq('
' + o.backText + ''); /* Bind to the forward and back buttons */ base.jqback.bind(o.clickBackArrow, function(e) { /* prevent running functions twice (once for click, second time for swipe) */ if (o.enableArrows && !base.flag) { base.flag = true; setTimeout(function(){ base.flag = false; }, 100); base.goBack(); } e.preventDefault(); }); base.jqforward.bind(o.clickForwardArrow, function(e) { /* prevent running functions twice (once for click, second time for swipe) */ if (o.enableArrows && !base.flag) { base.flag = true; setTimeout(function(){ base.flag = false; }, 100); base.goForward(); } e.preventDefault(); }); /* using tab to get to arrow links will show they have focus (outline is disabled in css) */ base.jqback.add(base.jqforward).find('a').bind('focusin focusout',function(){ jq(this).toggleClass('hover'); }); /* Append elements to page */ base.jqback.appendTo( (o.appendBackTo && jq(o.appendBackTo).length) ? jq(o.appendBackTo) : base.jqwrapper ); base.jqforward.appendTo( (o.appendForwardTo && jq(o.appendForwardTo).length) ? jq(o.appendForwardTo) : base.jqwrapper ); base.arrowWidth = base.jqforward.width(); /* assuming the left & right arrows are the same width - used for toggle */ base.arrowRight = parseInt(base.jqforward.css('right'), 10); base.arrowLeft = parseInt(base.jqback.css('left'), 10); }; /* Creates the Start/Stop button */ base.buildAutoPlay = function(){ base.jqstartStop .html('
' + (base.playing ? o.stopText : o.startText) + '') .bind(o.clickSlideshow, function(e) { if (o.enableStartStop) { base.startStop(!base.playing); base.makeActive(); if (base.playing && !o.autoPlayDelayed) { base.goForward(true); } } e.preventDefault(); }) /* show button has focus while tabbing */ .bind('focusin focusout',function(){ jq(this).toggleClass('hover'); }); }; /* Adjust slider dimensions on parent element resize */ base.checkResize = function(stopTimer){ clearTimeout(base.resizeTimer); base.resizeTimer = setTimeout(function(){ var w = base.jqouter.width() - base.outerPad[0], h = (base.jqouter[0].tagName === "BODY" ? base.jqwin.height() : base.jqouter.height()) - base.outerPad[1]; /* base.width = width of one panel, so multiply by # of panels; outerPad is padding added for arrows. */ if (base.width * o.showMultiple !== w || base.height !== h) { base.setDimensions(); /* adjust panel sizes */ /* make sure page is lined up (use -1 animation time, so we can differeniate it from when animationTime = 0) */ base.gotoPage(base.currentPage, base.playing, null, -1); } if (typeof(stopTimer) === 'undefined'){ base.checkResize(); } }, 500); }; /* Set panel dimensions to either resize content or adjust panel to content */ base.setDimensions = function(){ var w, h, c, t, edge = 0, fullsize = { width: '100%', height: '100%' }, /* determine panel width */ pw = (o.showMultiple > 1) ? base.width || base.jqwindow.width()/o.showMultiple : base.jqwindow.width(), winw = base.jqwin.width(); if (o.expand){ w = base.jqouter.width() - base.outerPad[0]; base.height = h = base.jqouter.height() - base.outerPad[1]; base.jqwrapper.add(base.jqwindow).add(base.jqitems).css({ width: w, height: h }); base.width = pw = (o.showMultiple > 1) ? w/o.showMultiple : w; } base.jqitems.each(function(i){ t = jq(this); c = t.children(); if (o.resizeContents){ /* resize panel */ w = base.width; h = base.height; t.css({ width: w, height: h }); if (c.length) { if (c[0].tagName === "EMBED") { c.attr(fullsize); } /* needed for IE7; also c.length > 1 in IE7 */ if (c[0].tagName === "OBJECT") { c.find('embed').attr(fullsize); } /* resize panel contents, if solitary (wrapped content or solitary image) */ if (c.length === 1){ c.css(fullsize); } } } else { /* get panel width & height and save it */ w = t.width() || base.width; /* if image hasn't finished loading, width will be zero, so set it to base width instead */ if (c.length === 1 && w >= winw){ w = (c.width() >= winw) ? pw : c.width(); /* get width of solitary child */ c.css('max-width', w); /* set max width for all children */ } t.css('width', w); /* set width of panel */ h = (c.length === 1 ? c.outerHeight(true) : t.height()); /* get height after setting width */ if (h <= base.outerPad[1]) { h = base.height; } /* if height less than the outside padding, then set it to the preset height */ t.css('height', h); } base.panelSize[i] = [w,h,edge]; edge += (o.mode === 'vertical') ? h : w; }); /* Set total width of slider */ base.jqel.css((o.mode === 'vertical' ? 'height' : 'width'), o.mode === 'fade' ? base.width : edge ); }; /* get dimension of multiple panels, as needed */ base.getDim = function(page){ var i, w = base.width, h = base.height; if (base.pages < 1 || isNaN(page)) { return [ w, h ]; } /* prevent errors when base.panelSize is empty */ page = (o.infiniteSlides && base.pages > 1) ? page : page - 1; i = base.panelSize[page]; if (i) { w = i[0] || w; h = i[1] || h; } if (o.showMultiple > 1) { for (i=1; i < o.showMultiple; i++) { w += base.panelSize[(page + i)][0]; h = Math.max(h, base.panelSize[page + i][1]); } } return [w,h]; }; base.goForward = function(autoplay) { base.gotoPage(base.currentPage + o.changeBy * (o.playRtl ? -1 : 1), autoplay); }; base.goBack = function(autoplay) { base.gotoPage(base.currentPage + o.changeBy * (o.playRtl ? 1 : -1), autoplay); }; base.gotoPage = function(page, autoplay, callback, time) { if (autoplay !== true) { autoplay = false; base.startStop(false); base.makeActive(); } /* check if page is an id or class name */ if (/^[#|.]/.test(page) && jq(page).length) { page = jq(page).closest('.panel').index() + base.adj; } /* rewind effect occurs here when changeBy > 1 */ if (o.changeBy !== 1){ if (page < 0) { page += base.pages; } if (page > base.pages) { page -= base.pages; } } if (base.pages <= 1) { return; } /* prevents animation */ base.jqlastPage = base.jqcurrentPage; if (typeof(page) !== "number") { page = parseInt(page,10) || o.startPanel; base.setCurrentPage(page); } /* pause YouTube videos before scrolling or prevent change if playing */ if (autoplay && o.isVideoPlaying(base)) { return; } base.exactPage = page; if (page > base.pages + 1 - base.adj) { page = (!o.infiniteSlides && !o.stopAtEnd) ? 1 : base.pages; } if (page < base.adj ) { page = (!o.infiniteSlides && !o.stopAtEnd) ? base.pages : 1; } if (!o.infiniteSlides) { base.exactPage = page; } /* exact page used by the fx extension */ base.currentPage = ( page > base.pages ) ? base.pages : ( page < 1 ) ? 1 : base.currentPage; base.jqcurrentPage = base.jqitems.removeClass('activePage').eq(base.currentPage - base.adj); base.targetPage = (page === 0) ? base.pages : (page > base.pages) ? 1 : page; base.jqtargetPage = base.jqitems.eq(base.targetPage - base.adj); time = time || o.animationTime; /* don't trigger events when time < 0 - to prevent FX from firing multiple times on page resize */ if (time >= 0) { base.jqel.trigger('slide_init', base); } /* toggle arrows/controls only if there is time to see it - fix issue #317 */ if (time > 0) { base.slideControls(true); } /* Set visual */ if (o.buildNavigation){ base.setNavigation(base.targetPage); } /* When autoplay isn't passed, we stop the timer */ if (autoplay !== true) { autoplay = false; } /* Stop the slider when we reach the last page, if the option stopAtEnd is set to true */ if (!autoplay || (o.stopAtEnd && page === base.pages)) { base.startStop(false); } if (time >= 0) { base.jqel.trigger('slide_begin', base); } /* delay starting slide animation */ setTimeout(function(d){ var p, empty = true; /* resize slider if content size varies */ if (!o.resizeContents) { /* animating the wrapper resize before the window prevents flickering in Firefox */ /* don't animate the dimension if it hasn't changed - fix for issue #264 */ p = base.getDim(page); d = {}; /* prevent animating a dimension to zero */ if (base.jqwrapper.width() !== p[0]) { d.width = p[0] || base.width; empty = false; } if (base.jqwrapper.height() !== p[1]) { d.height = p[1] || base.height; empty = false; } if (!empty) { base.jqwrapper.filter(':not(:animated)').animate(d, { queue: false, duration: (time < 0 ? 0 : time), easing: o.easing }); } } if (o.mode === 'fade') { if (base.jqlastPage[0] !== base.jqtargetPage[0]) { base.jqlastPage.filter(':not(:animated)').fadeTo((time < 0 ? 0 : time), 0); base.jqtargetPage.filter(':not(:animated)').fadeTo((time < 0 ? 0 : time), 1, function(){ base.endAnimation(page, callback, time); }); } } else { d = {}; d[base.dir] = -base.panelSize[(o.infiniteSlides && base.pages > 1) ? page : page - 1][2]; /* Animate Slider */ base.jqel.filter(':not(:animated)').animate( d, { queue: false, duration: time, easing: o.easing, complete: function(){ base.endAnimation(page, callback, time); } } ); } }, parseInt(o.delayBeforeAnimate, 10) || 0); }; base.endAnimation = function(page, callback, time){ if (page === 0) { base.jqel.css( base.dir, o.mode === 'fade' ? 0 : -base.panelSize[base.pages][2]); page = base.pages; } else if (page > base.pages) { /* reset back to start position */ base.jqel.css( base.dir, o.mode === 'fade' ? 0 : -base.panelSize[1][2]); page = 1; } base.exactPage = page; base.setCurrentPage(page, false); /* Add active panel class */ /* base.jqitems.removeClass('activePage').eq(page - base.adj).addClass('activePage'); */ if (!base.hovered) { base.slideControls(false); } if (o.hashTags) { base.setHash(page); } if (time >= 0) { base.jqel.trigger('slide_complete', base); } /* callback from external slide control: jq('#slider').anythingSlider(4, function(slider){ }) */ if (typeof callback === 'function') { callback(base); } /* Continue slideshow after a delay */ if (o.autoPlayLocked && !base.playing) { setTimeout(function(){ base.startStop(true); /* subtract out slide delay as the slideshow waits that additional time. */ }, o.resumeDelay - (o.autoPlayDelayed ? o.delay : 0)); } }; base.setCurrentPage = function(page, move) { page = parseInt(page, 10); if (base.pages < 1 || page === 0 || isNaN(page)) { return; } if (page > base.pages + 1 - base.adj) { page = base.pages - base.adj; } if (page < base.adj ) { page = 1; } /* hide/show arrows based on infinite scroll mode */ if (o.buildArrows && !o.infiniteSlides && o.stopAtEnd){ base.jqforward[ page === base.pages ? 'addClass' : 'removeClass']('disabled'); base.jqback[ page === 1 ? 'addClass' : 'removeClass']('disabled'); if (page === base.pages && base.playing) { base.startStop(); } } /* Only change left if move does not equal false */ if (!move) { var d = base.getDim(page); base.jqwrapper .css({ width: d[0], height: d[1] }) .add(base.jqwindow).scrollLeft(0).scrollTop(0); /* reset in case tabbing changed this scrollLeft - probably overly redundant */ base.jqel.css( base.dir, o.mode === 'fade' ? 0 : -base.panelSize[(o.infiniteSlides && base.pages > 1) ? page : page - 1][2] ); } /* Update local variable */ base.currentPage = page; base.jqcurrentPage = base.jqitems.removeClass('activePage').eq(page - base.adj).addClass('activePage'); if (o.buildNavigation){ base.setNavigation(page); } }; base.setNavigation = function(page){ base.jqnav .find('.cur').removeClass('cur').end() .find('a').eq(page - 1).addClass('cur'); }; base.makeActive = function(){ /* Set current slider as active so keyboard navigation works properly */ if (!base.jqwrapper.hasClass('activeSlider')){ jq('.activeSlider').removeClass('activeSlider'); base.jqwrapper.addClass('activeSlider'); } }; /* This method tries to find a hash that matches an ID and panel-X */ /* If either found, it tries to find a matching item */ /* If that is found as well, then it returns the page number */ base.gotoHash = function(){ var h = base.win.location.hash, i = h.indexOf('&'), n = h.match(base.regex); /* test for "/#/" or "/#!/" used by the jquery address plugin - jq('#/') breaks jQuery */ if (n === null && !/^#&/.test(h) && !/#!?\//.test(h)) { /* #quote2&panel1-3&panel3-3 */ h = h.substring(0, (i >= 0 ? i : h.length)); /* ensure the element is in the same slider */ n = (jq(h).length && jq(h).closest('.anythingBase')[0] === base.el) ? base.jqitems.index(jq(h).closest('.panel')) + base.adj : null; } else if (n !== null) { /* #&panel1-3&panel3-3 */ n = (o.hashTags) ? parseInt(n[1],10) : null; } return n; }; base.setHash = function(n){ var s = 'panel' + base.runTimes + '-', h = base.win.location.hash; if ( typeof h !== 'undefined' ) { base.win.location.hash = (h.indexOf(s) > 0) ? h.replace(base.regex, s + n) : h + "&" + s + n; } }; /* Slide controls (nav and play/stop button up or down) */ base.slideControls = function(toggle){ var dir = (toggle) ? 'slideDown' : 'slideUp', t1 = (toggle) ? 0 : o.animationTime, t2 = (toggle) ? o.animationTime : 0, op = (toggle) ? 1 : 0, sign = (toggle) ? 0 : 1; /* 0 = visible, 1 = hidden */ if (o.toggleControls) { base.jqcontrols.stop(true,true).delay(t1)[dir](o.animationTime/2).delay(t2); } if (o.buildArrows && o.toggleArrows) { if (!base.hovered && base.playing) { sign = 1; op = 0; } /* don't animate arrows during slideshow */ base.jqforward.stop(true,true).delay(t1).animate({ right: base.arrowRight + (sign * base.arrowWidth), opacity: op }, o.animationTime/2); base.jqback.stop(true,true).delay(t1).animate({ left: base.arrowLeft + (sign * base.arrowWidth), opacity: op }, o.animationTime/2); } }; base.clearTimer = function(paused){ /* Clear the timer only if it is set */ if (base.timer) { base.win.clearInterval(base.timer); if (!paused && base.slideshow) { base.jqel.trigger('slideshow_stop', base); base.slideshow = false; } } }; /* Pass startStop(false) to stop and startStop(true) to play */ base.startStop = function(playing, paused) { if (playing !== true) { playing = false; } /* Default if not supplied is false */ base.playing = playing; if (playing && !paused) { base.jqel.trigger('slideshow_start', base); base.slideshow = true; } /* Toggle playing and text */ if (o.buildStartStop) { base.jqstartStop.toggleClass('playing', playing).find('span').html( playing ? o.stopText : o.startText ); /* add button text to title attribute if it is hidden by text-indent */ if ( base.jqstartStop.find('span').css('visibility') === "hidden" ) { base.jqstartStop.addClass(o.tooltipClass).attr( 'title', playing ? o.stopText : o.startText ); } } /* Pause slideshow while video is playing */ if (playing){ base.clearTimer(true); /* Just in case this was triggered twice in a row */ base.timer = base.win.setInterval(function() { /* prevent autoplay if video is playing */ if ( !o.isVideoPlaying(base) ) { base.goForward(true); /* stop slideshow if resume if false */ } else if (!o.resumeOnVideoEnd) { base.startStop(); } }, o.delay); } else { base.clearTimer(); } }; /* Trigger the initialization */ base.init(); }; jq.anythingSlider.defaults = { /* Appearance */ theme : "default", /* Theme name, add the css stylesheet manually */ mode : "horiz", /* Set mode to "horizontal", "vertical" or "fade" (only first letter needed); replaces vertical option */ expand : true, /* If true, the entire slider will expand to fit the parent element */ resizeContents : false, /* If true, solitary images/objects in the panel will expand to fit the viewport */ showMultiple : false, /* Set this value to a number and it will show that many slides at once */ easing : "swing", /* Anything other than "linear" or "swing" requires the easing plugin or jQuery UI */ buildArrows : false, /* If true, builds the forwards and backwards buttons */ buildNavigation : true, /* If true, builds a list of anchor links to link to each panel */ buildStartStop : false, /* ** If true, builds the start/stop button */ /* commented out as this will reduce the size of the minified version */
/* appendForwardTo : null, */ /* Append forward arrow to a HTML element (jQuery Object, selector or HTMLNode), if not null */
/* appendBackTo : null, */ /* Append back arrow to a HTML element (jQuery Object, selector or HTMLNode), if not null */
/* appendControlsTo : null, */ /* Append controls (navigation + start-stop) to a HTML element (jQuery Object, selector or HTMLNode), if not null */
/* appendNavigationTo : null, */ /* Append navigation buttons to a HTML element (jQuery Object, selector or HTMLNode), if not null */
/* appendStartStopTo : null, */ /* Append start-stop button to a HTML element (jQuery Object, selector or HTMLNode), if not null */ toggleArrows : true, /* If true, side navigation arrows will slide out on hovering & hide @ other times */ toggleControls : false, /* if true, slide in controls (navigation + play/stop button) on hover and slide change, hide @ other times */ startText : "Starta", /* Start button text */ stopText : "Stoppa", /* Stop button text */ forwardText : "»", /* Link text used to move the slider forward (hidden by CSS, replaced with arrow image) */ backText : "«", /* Link text used to move the slider back (hidden by CSS, replace with arrow image) */ tooltipClass : "tooltip", /* Class added to navigation & start/stop button (text copied to title if it is hidden by a negative text indent) */ /* Function */ enableArrows : true, /* if false, arrows will be visible, but not clickable. */ enableNavigation : true, /* if false, navigation links will still be visible, but not clickable. */ enableStartStop : false, /* if false, the play/stop button will still be visible, but not clickable. Previously "enablePlay" */ enableKeyboard : true, /* if false, keyboard arrow keys will not work for this slider. */ /* Navigation */ startPanel : 1, /* This sets the initial panel */ changeBy : 1, /* Amount to go forward or back when changing panels. */ hashTags : false, /* Should links change the hashtag in the URL? */ infiniteSlides : true, /* if false, the slider will not wrap & not clone any panels */ navigationFormatter : null, /* Details at the top of the file on this use (advanced use) */ navigationSize : false, /* Set this to the maximum number of visible navigation tabs; false to disable */ /* Slideshow options */ autoPlay : true, /* If true, the slideshow will start running; replaces "startStopped" option */ autoPlayLocked : false, /* If true, user changing slides will not stop the slideshow */ autoPlayDelayed : false, /* If true, starting a slideshow will delay advancing slides; if false, the slider will immediately advance to the next slide when slideshow starts */ pauseOnHover : true, /* If true & the slideshow is active, the slideshow will pause on hover */ stopAtEnd : false, /* If true & the slideshow is active, the slideshow will stop on the last page. This also stops the rewind effect when infiniteSlides is false. */ playRtl : false, /* If true, the slideshow will move right-to-left */ /* Times */ delay : 5000, /* How long between slideshow transitions in AutoPlay mode (in milliseconds) */ resumeDelay : 15000, /* Resume slideshow after user interaction, only if autoplayLocked is true (in milliseconds). */ animationTime : 600, /* How long the slideshow transition takes (in milliseconds) */ delayBeforeAnimate : 0, /* How long to pause slide animation before going to the desired slide (used if you want your "out" FX to show). */ /* Callbacks - commented out to reduce size of the minified version - they still work */
/* onBeforeInitialize : function(e, slider) {}, *//* Callback before the plugin initializes */
/* onInitialized : function(e, slider) {}, *//* Callback when the plugin finished initializing */
/* onShowStart : function(e, slider) {}, *//* Callback on slideshow start */
/* onShowStop : function(e, slider) {}, *//* Callback after slideshow stops */
/* onShowPause : function(e, slider) {}, *//* Callback when slideshow pauses */
/* onShowUnpause : function(e, slider) {}, *//* Callback when slideshow unpauses - may not trigger properly if user clicks on any controls */
/* onSlideInit : function(e, slider) {}, *//* Callback when slide initiates, before control animation */
/* onSlideBegin : function(e, slider) {}, *//* Callback before slide animates */
/* onSlideComplete : function(slider) {}, *//* Callback when slide completes - no event variable! */ /* Interactivity */ clickForwardArrow : "click", /* Event used to activate forward arrow functionality (e.g. add jQuery mobile's "swiperight") */ clickBackArrow : "click", /* Event used to activate back arrow functionality (e.g. add jQuery mobile's "swipeleft") */ clickControls : "click focusin", /* Events used to activate navigation control functionality */ clickSlideshow : "click", /* Event used to activate slideshow play/stop button */ /* Video */ resumeOnVideoEnd : true, /* If true & the slideshow is active & a supported video is playing, it will pause the autoplay until the video is complete */ resumeOnVisible : true, /* If true the video will resume playing (if previously paused, except for YouTube iframe - known issue); if false, the video remains paused. */ addWmodeToObject : "opaque", /* If your slider has an embedded object, the script will automatically add a wmode parameter with this setting */ isVideoPlaying : function(base){ return false; } /* return true if video is playing or false if not - used by video extension */ }; jq.fn.anythingSlider = function(options, callback) { return this.each(function(){ var page, anySlide = jq(this).data('AnythingSlider'); /* initialize the slider but prevent multiple initializations */ if ((typeof(options)).match('object|undefined')){ if (!anySlide) { (new jq.anythingSlider(this, options)); } else { anySlide.updateSlider(); } /* If options is a number, process as an external link to page #: jq(element).anythingSlider(#) */ } else if (/\d/.test(options) && !isNaN(options) && anySlide) { page = (typeof(options) === "number") ? options : parseInt(jq.trim(options),10); /* accepts " 2 " */ /* ignore out of bound pages */ if ( page >= 1 && page <= anySlide.pages ) { anySlide.gotoPage(page, false, callback); /* page #, autoplay, one time callback */ } /* Accept id or class name */ } else if (/^[#|.]/.test(options) && jq(options).length) { anySlide.gotoPage(options, false, callback); } }); };
})(jq);
//]]>