/*! Deck JS - deck.step Copyright (c) 2011 RĂ©mi Emonet Dual licensed under the MIT license and GPL license. https://github.com/imakewebthings/deck.js/blob/master/MIT-license.txt https://github.com/imakewebthings/deck.js/blob/master/GPL-license.txt */ /* This module provides new methods for stepping without considering sub-slides, together with tools for finding toplevel slides etc. It also overrides the defaults keybinding and countNested value (so it is better to include it after "goto" and "status" extensions). */ (function($, deck, undefined) { var $d = $(document); // undo the defaults (to be sure jquery behaves properly when overriding it) $.extend(true, $[deck].defaults, { keys: {next:null, previous:null}}); // and go on $.extend(true, $[deck].defaults, { selectors: { subslidesToNotify: ".slide,.onshowtoplevel" }, // Here we redefined the defaults: // - we avoid counting nested slides // - we keep up/down for top-level slides // - we still use pgup/pgdown for inner slides as they are sent by some pluggable remote controls keys: { // backspace, left arrow, page down previous: [8, 37, 34], // enter, space, right arrow, page up next: [13, 32, 39, 33], // up arrow previousTopLevel: [38], // down arrow, nextTopLevel: [40] }, countNested: false }); var myInArray = function(el, arr) { for (i in arr) if (arr[i].is(el)) return i*1; // cast to int return -1; }; $[deck]('extend', 'getToplevelSlideOf', function(node) { var opts = $[deck]('getOptions'); var slides = $[deck]('getSlides'); var last = {node: $(node), index: myInArray(node, slides)}; $(node).parentsUntil(opts.selectors.container).each( function(ii, v) { var ind = myInArray(v, slides); if (ind != -1) { last = {node: $(v), index: ind}; } }); return last; }); $[deck]('extend', 'getToplevelSlideOfIndex', function(ind) { return $[deck]('getToplevelSlideOf', $[deck]('getSlide', ind)); }); $[deck]('extend', 'previousTopLevelSlide', function() { /* Find the real previous parent */ var current = $[deck]('getSlide'); var currentParent = $[deck]('getToplevelSlideOf', current); var toGo = currentParent.index; if (current.is(currentParent.node) && toGo > 0) { // This is already toplevel slide, just go to the previous toplevel one (parent of the previous one) toGo = $[deck]('getToplevelSlideOfIndex', toGo-1).index; } $[deck]('go', toGo); }); $[deck]('extend', 'nextTopLevelSlide', function() { /* Find the real next parent */ var current = $[deck]('getSlide'); var currentParent = $[deck]('getToplevelSlideOf', current); var icur = currentParent.index; for (; icur < $[deck]('getSlides').length; icur++) { var cursorParent = $[deck]('getToplevelSlideOfIndex', icur).node; if (!cursorParent.is(currentParent.node)) { $[deck]('go', icur); break; } } }); $d.bind('deck.init', function() { $d.unbind('keydown.decknexttoplevel').bind('keydown.decknexttoplevel', function(e) { var $opts = $[deck]('getOptions'); var key = $opts.keys.nextTopLevel; if (e.which === key || $.inArray(e.which, key) > -1) { e.preventDefault(); $[deck]('nextTopLevelSlide'); } }); $d.unbind('keydown.deckprevioustoplevel').bind('keydown.deckprevioustoplevel', function(e) { var $opts = $[deck]('getOptions'); var key = $opts.keys.previousTopLevel; if (e.which === key || $.inArray(e.which, key) > -1) { e.preventDefault(); $[deck]('previousTopLevelSlide'); } }); }); // When jumping (not steping), we will init the subslides (in case they are animations), in a backward order, and then fast forward necessary animations var bigJump = function(from, to) { var direction = "forward"; if (from > to){ direction = "reverse"; } var opts = $[deck]('getOptions'); $($[deck]('getToplevelSlideOfIndex', to).node.find(opts.selectors.subslidesToNotify).get().reverse()).trigger('deck.toplevelBecameCurrent', direction); for (icur = $[deck]('getToplevelSlideOfIndex', to).index + 1; icur < to+1; icur++) { $[deck]('getSlides')[icur].trigger('deck.afterToplevelBecameCurrent', 'forward'); } } $d.bind('deck.change', function(e, from, to) { if ( Math.abs(from - to) > 1 || ! $[deck]('getToplevelSlideOfIndex', to).node.is($[deck]('getToplevelSlideOfIndex', from).node)) { // consider natural jumps and the case where we actually changed (top level) slide (even with a step) bigJump(from, to); } }); })(jQuery, 'deck');