| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710 |
- /**
- * jmpress.js v0.4.5
- * http://jmpressjs.github.com/jmpress.js
- *
- * A jQuery plugin to build a website on the infinite canvas.
- *
- * Copyright 2013 Kyle Robinson Young @shama & Tobias Koppers @sokra
- * Licensed MIT
- * http://www.opensource.org/licenses/mit-license.php
- *
- * Based on the foundation laid by Bartek Szopka @bartaz
- *//*
- * core.js
- * The core of jmpress.js
- */
- (function( $, document, window, undefined ) {
- 'use strict';
- /**
- * Set supported prefixes
- *
- * @access protected
- * @return Function to get prefixed property
- */
- var pfx = (function () {
- var style = document.createElement('dummy').style,
- prefixes = 'Webkit Moz O ms Khtml'.split(' '),
- memory = {};
- return function ( prop ) {
- if ( typeof memory[ prop ] === "undefined" ) {
- var ucProp = prop.charAt(0).toUpperCase() + prop.substr(1),
- props = (prop + ' ' + prefixes.join(ucProp + ' ') + ucProp).split(' ');
- memory[ prop ] = null;
- for ( var i in props ) {
- if ( style[ props[i] ] !== undefined ) {
- memory[ prop ] = props[i];
- break;
- }
- }
- }
- return memory[ prop ];
- };
- }());
- /**
- * map ex. "WebkitTransform" to "-webkit-transform"
- */
- function mapProperty( name ) {
- if(!name) {
- return;
- }
- var index = 1 + name.substr(1).search(/[A-Z]/);
- var prefix = name.substr(0, index).toLowerCase();
- var postfix = name.substr(index).toLowerCase();
- return "-" + prefix + "-" + postfix;
- }
- function addComma( attribute ) {
- if(!attribute) {
- return "";
- }
- return attribute + ",";
- }
- /**
- * Return an jquery object only if it's not empty
- */
- function ifNotEmpty(el) {
- if(el.length > 0) {
- return el;
- }
- return null;
- }
- /**
- * Default Settings
- */
- var defaults = {
- /* CLASSES */
- stepSelector: '.step'
- ,containerClass: ''
- ,canvasClass: ''
- ,areaClass: ''
- ,notSupportedClass: 'not-supported'
- /* CONFIG */
- ,fullscreen: true
- /* ANIMATION */
- ,animation: {
- transformOrigin: 'top left'
- ,transitionProperty: addComma(mapProperty(pfx('transform'))) + addComma(mapProperty(pfx('perspective'))) + 'opacity'
- ,transitionDuration: '1s'
- ,transitionDelay: '500ms'
- ,transitionTimingFunction: 'ease-in-out'
- ,transformStyle: "preserve-3d"
- }
- ,transitionDuration: 1500
- };
- var callbacks = {
- 'beforeChange': 1
- ,'beforeInitStep': 1
- ,'initStep': 1
- ,'beforeInit': 1
- ,'afterInit': 1
- ,'beforeDeinit': 1
- ,'afterDeinit': 1
- ,'applyStep': 1
- ,'unapplyStep': 1
- ,'setInactive': 1
- ,'beforeActive': 1
- ,'setActive': 1
- ,'selectInitialStep': 1
- ,'selectPrev': 1
- ,'selectNext': 1
- ,'selectHome': 1
- ,'selectEnd': 1
- ,'idle': 1
- ,'applyTarget': 1
- };
- for(var callbackName in callbacks) {
- defaults[callbackName] = [];
- }
- /**
- * Initialize jmpress
- */
- function init( args ) {
- args = $.extend(true, {}, args || {});
- // accept functions and arrays of functions as callbacks
- var callbackArgs = {};
- var callbackName = null;
- for (callbackName in callbacks) {
- callbackArgs[callbackName] = $.isFunction( args[callbackName] ) ?
- [ args[callbackName] ] :
- args[callbackName];
- args[callbackName] = [];
- }
- // MERGE SETTINGS
- var settings = $.extend(true, {}, defaults, args);
- for (callbackName in callbacks) {
- if (callbackArgs[callbackName]) {
- Array.prototype.push.apply(settings[callbackName], callbackArgs[callbackName]);
- }
- }
- /*** MEMBER VARS ***/
- var jmpress = $( this )
- ,container = null
- ,area = null
- ,oldStyle = {
- container: ""
- ,area: ""
- }
- ,canvas = null
- ,current = null
- ,active = false
- ,activeSubstep = null
- ,activeDelegated = false;
- /*** MEMBER FUNCTIONS ***/
- // functions have to be called with this
- /**
- * Init a single step
- *
- * @param element the element of the step
- * @param idx number of step
- */
- function doStepInit( element, idx ) {
- var data = dataset( element );
- var step = {
- oldStyle: $(element).attr("style") || ""
- };
- var callbackData = {
- data: data
- ,stepData: step
- };
- callCallback.call(this, 'beforeInitStep', $(element), callbackData);
- step.delegate = data.delegate;
- callCallback.call(this, 'initStep', $(element), callbackData);
- $(element).data('stepData', step);
- if ( !$(element).attr('id') ) {
- $(element).attr('id', 'step-' + (idx + 1));
- }
- callCallback.call(this, 'applyStep', $(element), callbackData);
- }
- /**
- * Deinit a single step
- *
- * @param element the element of the step
- */
- function doStepDeinit( element ) {
- var stepData = $(element).data('stepData');
- $(element).attr("style", stepData.oldStyle);
- callCallback.call(this, 'unapplyStep', $(element), {
- stepData: stepData
- });
- }
- /**
- * Reapplies stepData to the element
- *
- * @param element
- */
- function doStepReapply( element ) {
- callCallback.call(this, 'unapplyStep', $(element), {
- stepData: element.data("stepData")
- });
- callCallback.call(this, 'applyStep', $(element), {
- stepData: element.data("stepData")
- });
- }
- /**
- * Completly deinit jmpress
- *
- */
- function deinit() {
- if ( active ) {
- callCallback.call(this, 'setInactive', active, {
- stepData: $(active).data('stepData')
- ,reason: "deinit"
- } );
- }
- if (current.jmpressClass) {
- $(jmpress).removeClass(current.jmpressClass);
- }
- callCallback.call(this, 'beforeDeinit', $(this), {});
- $(settings.stepSelector, jmpress).each(function( idx ) {
- doStepDeinit.call(jmpress, this );
- });
- container.attr("style", oldStyle.container);
- if(settings.fullscreen) {
- $("html").attr("style", "");
- }
- area.attr("style", oldStyle.area);
- $(canvas).children().each(function() {
- jmpress.append( $( this ) );
- });
- if( settings.fullscreen ) {
- canvas.remove();
- } else {
- canvas.remove();
- area.remove();
- }
- callCallback.call(this, 'afterDeinit', $(this), {});
- $(jmpress).data("jmpressmethods", false);
- }
- /**
- * Call a callback
- *
- * @param callbackName String callback which should be called
- * @param element some arguments to the callback
- * @param eventData
- */
- function callCallback( callbackName, element, eventData ) {
- eventData.settings = settings;
- eventData.current = current;
- eventData.container = container;
- eventData.parents = element ? getStepParents(element) : null;
- eventData.current = current;
- eventData.jmpress = this;
- var result = {};
- $.each( settings[callbackName], function(idx, callback) {
- result.value = callback.call( jmpress, element, eventData ) || result.value;
- });
- return result.value;
- }
- /**
- *
- */
- function getStepParents( el ) {
- return $(el).parentsUntil(jmpress).not(jmpress).filter(settings.stepSelector);
- }
- /**
- * Reselect the active step
- *
- * @param String type reason of reselecting step
- */
- function reselect( type ) {
- return select( { step: active, substep: activeSubstep }, type);
- }
- /**
- * Select a given step
- *
- * @param el element to select
- * @param type reason of changing step
- * @return Object element selected
- */
- function select( el, type ) {
- var substep;
- if ( $.isPlainObject( el ) ) {
- substep = el.substep;
- el = el.step;
- }
- if ( typeof el === 'string') {
- el = jmpress.find( el ).first();
- }
- if ( !el || !$(el).data('stepData') ) {
- return false;
- }
- scrollFix.call(this);
- var step = $(el).data('stepData');
- var cancelSelect = false;
- callCallback.call(this, "beforeChange", el, {
- stepData: step
- ,reason: type
- ,cancel: function() {
- cancelSelect = true;
- }
- });
- if (cancelSelect) {
- return undefined;
- }
- var target = {};
- var delegated = el;
- if($(el).data("stepData").delegate) {
- delegated = ifNotEmpty($(el).parentsUntil(jmpress).filter(settings.stepSelector).filter(step.delegate)) ||
- ifNotEmpty($(el).near(step.delegate)) ||
- ifNotEmpty($(el).near(step.delegate, true)) ||
- ifNotEmpty($(step.delegate, jmpress));
- if(delegated) {
- step = delegated.data("stepData");
- } else {
- // Do not delegate if expression not found
- delegated = el;
- }
- }
- if ( activeDelegated ) {
- callCallback.call(this, 'setInactive', activeDelegated, {
- stepData: $(activeDelegated).data('stepData')
- ,delegatedFrom: active
- ,reason: type
- ,target: target
- ,nextStep: delegated
- ,nextSubstep: substep
- ,nextStepData: step
- } );
- }
- var callbackData = {
- stepData: step
- ,delegatedFrom: el
- ,reason: type
- ,target: target
- ,substep: substep
- ,prevStep: activeDelegated
- ,prevSubstep: activeSubstep
- ,prevStepData: activeDelegated && $(activeDelegated).data('stepData')
- };
- callCallback.call(this, 'beforeActive', delegated, callbackData);
- callCallback.call(this, 'setActive', delegated, callbackData);
- // Set on step class on root element
- if (current.jmpressClass) {
- $(jmpress).removeClass(current.jmpressClass);
- }
- $(jmpress).addClass(current.jmpressClass = 'step-' + $(delegated).attr('id') );
- if (current.jmpressDelegatedClass) {
- $(jmpress).removeClass(current.jmpressDelegatedClass);
- }
- $(jmpress).addClass(current.jmpressDelegatedClass = 'delegating-step-' + $(el).attr('id') );
- callCallback.call(this, "applyTarget", delegated, $.extend({
- canvas: canvas
- ,area: area
- ,beforeActive: activeDelegated
- }, callbackData));
- active = el;
- activeSubstep = callbackData.substep;
- activeDelegated = delegated;
- if(current.idleTimeout) {
- clearTimeout(current.idleTimeout);
- }
- current.idleTimeout = setTimeout(function() {
- callCallback.call(this, 'idle', delegated, callbackData);
- }, Math.max(1, settings.transitionDuration - 100));
- return delegated;
- }
- /**
- * This should fix ANY kind of buggy scrolling
- */
- function scrollFix() {
- (function fix() {
- if ($(container)[0].tagName === "BODY") {
- try {
- window.scrollTo(0, 0);
- } catch(e) {}
- }
- $(container).scrollTop(0);
- $(container).scrollLeft(0);
- function check() {
- if ($(container).scrollTop() !== 0 ||
- $(container).scrollLeft() !== 0) {
- fix();
- }
- }
- setTimeout(check, 1);
- setTimeout(check, 10);
- setTimeout(check, 100);
- setTimeout(check, 200);
- setTimeout(check, 400);
- }());
- }
- /**
- * Alias for select
- */
- function goTo( el ) {
- return select.call(this, el, "jump" );
- }
- /**
- * Goto Next Slide
- *
- * @return Object newly active slide
- */
- function next() {
- return select.call(this, callCallback.call(this, 'selectNext', active, {
- stepData: $(active).data('stepData')
- ,substep: activeSubstep
- }), "next" );
- }
- /**
- * Goto Previous Slide
- *
- * @return Object newly active slide
- */
- function prev() {
- return select.call(this, callCallback.call(this, 'selectPrev', active, {
- stepData: $(active).data('stepData')
- ,substep: activeSubstep
- }), "prev" );
- }
- /**
- * Goto First Slide
- *
- * @return Object newly active slide
- */
- function home() {
- return select.call(this, callCallback.call(this, 'selectHome', active, {
- stepData: $(active).data('stepData')
- }), "home" );
- }
- /**
- * Goto Last Slide
- *
- * @return Object newly active slide
- */
- function end() {
- return select.call(this, callCallback.call(this, 'selectEnd', active, {
- stepData: $(active).data('stepData')
- }), "end" );
- }
- /**
- * Manipulate the canvas
- *
- * @param props
- * @return Object
- */
- function canvasMod( props ) {
- css(canvas, props || {});
- return $(canvas);
- }
- /**
- * Return current step
- *
- * @return Object
- */
- function getActive() {
- return activeDelegated && $(activeDelegated);
- }
- /**
- * fire a callback
- *
- * @param callbackName
- * @param element
- * @param eventData
- * @return void
- */
- function fire( callbackName, element, eventData ) {
- if( !callbacks[callbackName] ) {
- $.error( "callback " + callbackName + " is not registered." );
- } else {
- return callCallback.call(this, callbackName, element, eventData);
- }
- }
- /**
- * PUBLIC METHODS LIST
- */
- jmpress.data("jmpressmethods", {
- select: select
- ,reselect: reselect
- ,scrollFix: scrollFix
- ,goTo: goTo
- ,next: next
- ,prev: prev
- ,home: home
- ,end: end
- ,canvas: canvasMod
- ,container: function() { return container; }
- ,settings: function() { return settings; }
- ,active: getActive
- ,current: function() { return current; }
- ,fire: fire
- ,init: function(step) {
- doStepInit.call(this, $(step), current.nextIdNumber++);
- }
- ,deinit: function(step) {
- if(step) {
- doStepDeinit.call(this, $(step));
- } else {
- deinit.call(this);
- }
- }
- ,reapply: doStepReapply
- });
- /**
- * Check for support
- * This will be removed in near future, when support is coming
- *
- * @access protected
- * @return void
- */
- function checkSupport() {
- var ua = navigator.userAgent.toLowerCase();
- return (ua.search(/(iphone)|(ipod)|(android)/) === -1) || (ua.search(/(chrome)/) !== -1);
- }
- // BEGIN INIT
- // CHECK FOR SUPPORT
- if (checkSupport() === false) {
- if (settings.notSupportedClass) {
- jmpress.addClass(settings.notSupportedClass);
- }
- return;
- } else {
- if (settings.notSupportedClass) {
- jmpress.removeClass(settings.notSupportedClass);
- }
- }
- // grabbing all steps
- var steps = $(settings.stepSelector, jmpress);
- // GERNERAL INIT OF FRAME
- container = jmpress;
- area = $('<div />');
- canvas = $('<div />');
- $(jmpress).children().filter(steps).each(function() {
- canvas.append( $( this ) );
- });
- if(settings.fullscreen) {
- container = $('body');
- $("html").css({
- overflow: 'hidden'
- });
- area = jmpress;
- }
- oldStyle.area = area.attr("style") || "";
- oldStyle.container = container.attr("style") || "";
- if(settings.fullscreen) {
- container.css({
- height: '100%'
- });
- jmpress.append( canvas );
- } else {
- container.css({
- position: "relative"
- });
- area.append( canvas );
- jmpress.append( area );
- }
- $(container).addClass(settings.containerClass);
- $(area).addClass(settings.areaClass);
- $(canvas).addClass(settings.canvasClass);
- document.documentElement.style.height = "100%";
- container.css({
- overflow: 'hidden'
- });
- var props = {
- position: "absolute"
- ,transitionDuration: '0s'
- };
- props = $.extend({}, settings.animation, props);
- css(area, props);
- css(area, {
- top: '50%'
- ,left: '50%'
- ,perspective: '1000px'
- });
- css(canvas, props);
- current = {};
- callCallback.call(this, 'beforeInit', null, {});
- // INITIALIZE EACH STEP
- steps.each(function( idx ) {
- doStepInit.call(jmpress, this, idx );
- });
- current.nextIdNumber = steps.length;
- callCallback.call(this, 'afterInit', null, {});
- // START
- select.call(this, callCallback.call(this, 'selectInitialStep', "init", {}) );
- if (settings.initClass) {
- $(steps).removeClass(settings.initClass);
- }
- }
- /**
- * Return default settings
- *
- * @return Object
- */
- function getDefaults() {
- return defaults;
- }
- /**
- * Register a callback or a jmpress function
- *
- * @access public
- * @param name String the name of the callback or function
- * @param func Function? the function to be added
- */
- function register(name, func) {
- if( $.isFunction(func) ) {
- if( methods[name] ) {
- $.error( "function " + name + " is already registered." );
- } else {
- methods[name] = func;
- }
- } else {
- if( callbacks[name] ) {
- $.error( "callback " + name + " is already registered." );
- } else {
- callbacks[name] = 1;
- defaults[name] = [];
- }
- }
- }
- /**
- * Set CSS on element w/ prefixes
- *
- * @return Object element which properties were set
- *
- * TODO: Consider bypassing pfx and blindly set as jQuery
- * already checks for support
- */
- function css( el, props ) {
- var key, pkey, cssObj = {};
- for ( key in props ) {
- if ( props.hasOwnProperty(key) ) {
- pkey = pfx(key);
- if ( pkey !== null ) {
- cssObj[pkey] = props[key];
- }
- }
- }
- $(el).css(cssObj);
- return el;
- }
- /**
- * Return dataset for element
- *
- * @param el element
- * @return Object
- */
- function dataset( el ) {
- if ( $(el)[0].dataset ) {
- return $.extend({}, $(el)[0].dataset);
- }
- function toCamelcase( str ) {
- str = str.split( '-' );
- for( var i = 1; i < str.length; i++ ) {
- str[i] = str[i].substr(0, 1).toUpperCase() + str[i].substr(1);
- }
- return str.join( '' );
- }
- var returnDataset = {};
- var attrs = $(el)[0].attributes;
- $.each(attrs, function ( idx, attr ) {
- if ( attr.nodeName.substr(0, 5) === "data-" ) {
- returnDataset[ toCamelcase(attr.nodeName.substr(5)) ] = attr.nodeValue;
- }
- });
- return returnDataset;
- }
- /**
- * Returns true, if jmpress is initialized
- *
- * @return bool
- */
- function initialized() {
- return !!$(this).data("jmpressmethods");
- }
- /**
- * PUBLIC STATIC METHODS LIST
- */
- var methods = {
- init: init
- ,initialized: initialized
- ,deinit: function() {}
- ,css: css
- ,pfx: pfx
- ,defaults: getDefaults
- ,register: register
- ,dataset: dataset
- };
- /**
- * $.jmpress()
- */
- $.fn.jmpress = function( method ) {
- function f() {
- var jmpressmethods = $(this).data("jmpressmethods");
- if ( jmpressmethods && jmpressmethods[method] ) {
- return jmpressmethods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
- } else if ( methods[method] ) {
- return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
- } else if ( callbacks[method] && jmpressmethods ) {
- var settings = jmpressmethods.settings();
- var func = Array.prototype.slice.call( arguments, 1 )[0];
- if ($.isFunction( func )) {
- settings[method] = settings[method] || [];
- settings[method].push(func);
- }
- } else if ( typeof method === 'object' || ! method ) {
- return init.apply( this, arguments );
- } else {
- $.error( 'Method ' + method + ' does not exist on jQuery.jmpress' );
- }
- // to allow chaining
- return this;
- }
- var args = arguments;
- var result;
- $(this).each(function(idx, element) {
- result = f.apply(element, args);
- });
- return result;
- };
- $.extend({
- jmpress: function( method ) {
- if ( methods[method] ) {
- return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
- } else if ( callbacks[method] ) {
- // plugin interface
- var func = Array.prototype.slice.call( arguments, 1 )[0];
- if ($.isFunction( func )) {
- defaults[method].push(func);
- } else {
- $.error( 'Second parameter should be a function: $.jmpress( callbackName, callbackFunction )' );
- }
- } else {
- $.error( 'Method ' + method + ' does not exist on jQuery.jmpress' );
- }
- }
- });
- }(jQuery, document, window));
- /*
- * near.js
- * Find steps near each other
- */
- (function( $, document, window, undefined ) {
- 'use strict';
- // add near( selector, backwards = false) to jquery
- function checkAndGo( elements, func, selector, backwards ) {
- var next;
- elements.each(function(idx, element) {
- if(backwards) {
- next = func(element, selector, backwards);
- if (next) {
- return false;
- }
- }
- if( $(element).is(selector) ) {
- next = element;
- return false;
- }
- if(!backwards) {
- next = func(element, selector, backwards);
- if (next) {
- return false;
- }
- }
- });
- return next;
- }
- function findNextInChildren(item, selector, backwards) {
- var children = $(item).children();
- if(backwards) {
- children = $(children.get().reverse());
- }
- return checkAndGo( children, findNextInChildren, selector, backwards );
- }
- function findNextInSiblings(item, selector, backwards) {
- return checkAndGo(
- $(item)[backwards ? "prevAll" : "nextAll"](),
- findNextInChildren, selector, backwards );
- }
- function findNextInParents(item, selector, backwards) {
- var next;
- var parents = $(item).parents();
- parents = $(parents.get());
- $.each(parents.get(), function(idx, element) {
- if( backwards && $(element).is(selector) ) {
- next = element;
- return false;
- }
- next = findNextInSiblings(element, selector, backwards);
- if(next) {
- return false;
- }
- });
- return next;
- }
- $.fn.near = function( selector, backwards ) {
- var array = [];
- $(this).each(function(idx, element) {
- var near = (backwards ?
- false :
- findNextInChildren( element, selector, backwards )) ||
- findNextInSiblings( element, selector, backwards ) ||
- findNextInParents( element, selector, backwards );
- if( near ) {
- array.push(near);
- }
- });
- return $(array);
- };
- }(jQuery, document, window));
- /*
- * transform.js
- * The engine that powers the transforms or falls back to other methods
- */
- (function( $, document, window, undefined ) {
- 'use strict';
- /* FUNCTIONS */
- function toCssNumber(number) {
- return (Math.round(10000*number)/10000)+"";
- }
- /**
- * 3D and 2D engines
- */
- var engines = {
- 3: {
- transform: function( el, data ) {
- var transform = 'translate(-50%,-50%)';
- $.each(data, function(idx, item) {
- var coord = ["X", "Y", "Z"];
- var i;
- if(item[0] === "translate") { // ["translate", x, y, z]
- transform += " translate3d(" + toCssNumber(item[1] || 0) + "px," + toCssNumber(item[2] || 0) + "px," + toCssNumber(item[3] || 0) + "px)";
- } else if(item[0] === "rotate") {
- var order = item[4] ? [1, 2, 3] : [3, 2, 1];
- for(i = 0; i < 3; i++) {
- transform += " rotate" + coord[order[i]-1] + "(" + toCssNumber(item[order[i]] || 0) + "deg)";
- }
- } else if(item[0] === "scale") {
- for(i = 0; i < 3; i++) {
- transform += " scale" + coord[i] + "(" + toCssNumber(item[i+1] || 1) + ")";
- }
- }
- });
- $.jmpress("css", el, $.extend({}, { transform: transform }));
- }
- }
- ,2: {
- transform: function( el, data ) {
- var transform = 'translate(-50%,-50%)';
- $.each(data, function(idx, item) {
- var coord = ["X", "Y"];
- if(item[0] === "translate") { // ["translate", x, y, z]
- transform += " translate(" + toCssNumber(item[1] || 0) + "px," + toCssNumber(item[2] || 0) + "px)";
- } else if(item[0] === "rotate") {
- transform += " rotate(" + toCssNumber(item[3] || 0) + "deg)";
- } else if(item[0] === "scale") {
- for(var i = 0; i < 2; i++) {
- transform += " scale" + coord[i] + "(" + toCssNumber(item[i+1] || 1) + ")";
- }
- }
- });
- $.jmpress("css", el, $.extend({}, { transform: transform }));
- }
- }
- ,1: {
- // CHECK IF SUPPORT IS REALLY NEEDED?
- // this not even work without scaling...
- // it may better to display the normal view
- transform: function( el, data ) {
- var anitarget = { top: 0, left: 0 };
- $.each(data, function(idx, item) {
- var coord = ["X", "Y"];
- if(item[0] === "translate") { // ["translate", x, y, z]
- anitarget.left = Math.round(item[1] || 0) + "px";
- anitarget.top = Math.round(item[2] || 0) + "px";
- }
- });
- el.animate(anitarget, 1000); // TODO: Use animation duration
- }
- }
- };
- /**
- * Engine to power cross-browser translate, scale and rotate.
- */
- var engine = (function() {
- if ($.jmpress("pfx", "perspective")) {
- return engines[3];
- } else if ($.jmpress("pfx", "transform")) {
- return engines[2];
- } else {
- // CHECK IF SUPPORT IS REALLY NEEDED?
- return engines[1];
- }
- }());
- $.jmpress("defaults").reasonableAnimation = {};
- $.jmpress("initStep", function( step, eventData ) {
- var data = eventData.data;
- var stepData = eventData.stepData;
- var pf = parseFloat;
- $.extend(stepData, {
- x: pf(data.x) || 0
- ,y: pf(data.y) || 0
- ,z: pf(data.z) || 0
- ,r: pf(data.r) || 0
- ,phi: pf(data.phi) || 0
- ,rotate: pf(data.rotate) || 0
- ,rotateX: pf(data.rotateX) || 0
- ,rotateY: pf(data.rotateY) || 0
- ,rotateZ: pf(data.rotateZ) || 0
- ,revertRotate: false
- ,scale: pf(data.scale) || 1
- ,scaleX: pf(data.scaleX) || false
- ,scaleY: pf(data.scaleY) || false
- ,scaleZ: pf(data.scaleZ) || 1
- });
- });
- $.jmpress("afterInit", function( nil, eventData ) {
- var stepSelector = eventData.settings.stepSelector,
- current = eventData.current;
- current.perspectiveScale = 1;
- current.maxNestedDepth = 0;
- var nestedSteps = $(eventData.jmpress).find(stepSelector).children(stepSelector);
- while(nestedSteps.length) {
- current.maxNestedDepth++;
- nestedSteps = nestedSteps.children(stepSelector);
- }
- });
- $.jmpress("applyStep", function( step, eventData ) {
- $.jmpress("css", $(step), {
- position: "absolute"
- ,transformStyle: "preserve-3d"
- });
- if ( eventData.parents.length > 0 ) {
- $.jmpress("css", $(step), {
- top: "50%"
- ,left: "50%"
- });
- }
- var sd = eventData.stepData;
- var transform = [
- ["translate",
- sd.x || (sd.r * Math.sin(sd.phi*Math.PI/180)),
- sd.y || (-sd.r * Math.cos(sd.phi*Math.PI/180)),
- sd.z],
- ["rotate",
- sd.rotateX,
- sd.rotateY,
- sd.rotateZ || sd.rotate,
- true],
- ["scale",
- sd.scaleX || sd.scale,
- sd.scaleY || sd.scale,
- sd.scaleZ || sd.scale]
- ];
- engine.transform( step, transform );
- });
- $.jmpress("setActive", function( element, eventData ) {
- var target = eventData.target;
- var step = eventData.stepData;
- var tf = target.transform = [];
- target.perspectiveScale = 1;
- for(var i = eventData.current.maxNestedDepth; i > (eventData.parents.length || 0); i--) {
- tf.push(["scale"], ["rotate"], ["translate"]);
- }
- tf.push(["scale",
- 1 / (step.scaleX || step.scale),
- 1 / (step.scaleY || step.scale),
- 1 / (step.scaleZ)]);
- tf.push(["rotate",
- -step.rotateX,
- -step.rotateY,
- -(step.rotateZ || step.rotate)]);
- tf.push(["translate",
- -(step.x || (step.r * Math.sin(step.phi*Math.PI/180))),
- -(step.y || (-step.r * Math.cos(step.phi*Math.PI/180))),
- -step.z]);
- target.perspectiveScale *= (step.scaleX || step.scale);
- $.each(eventData.parents, function(idx, element) {
- var step = $(element).data("stepData");
- tf.push(["scale",
- 1 / (step.scaleX || step.scale),
- 1 / (step.scaleY || step.scale),
- 1 / (step.scaleZ)]);
- tf.push(["rotate",
- -step.rotateX,
- -step.rotateY,
- -(step.rotateZ || step.rotate)]);
- tf.push(["translate",
- -(step.x || (step.r * Math.sin(step.phi*Math.PI/180))),
- -(step.y || (-step.r * Math.cos(step.phi*Math.PI/180))),
- -step.z]);
- target.perspectiveScale *= (step.scaleX || step.scale);
- });
- $.each(tf, function(idx, item) {
- if(item[0] !== "rotate") {
- return;
- }
- function lowRotate(name) {
- if(eventData.current["rotate"+name+"-"+idx] === undefined) {
- eventData.current["rotate"+name+"-"+idx] = item[name] || 0;
- }
- var cur = eventData.current["rotate"+name+"-"+idx], tar = item[name] || 0,
- curmod = cur % 360, tarmod = tar % 360;
- if(curmod < 0) {
- curmod += 360;
- }
- if(tarmod < 0) {
- tarmod += 360;
- }
- var diff = tarmod - curmod;
- if(diff < -180) {
- diff += 360;
- } else if(diff > 180) {
- diff -= 360;
- }
- eventData.current["rotate"+name+"-"+idx] = item[name] = cur + diff;
- }
- lowRotate(1);
- lowRotate(2);
- lowRotate(3);
- });
- });
- $.jmpress("applyTarget", function( active, eventData ) {
- var target = eventData.target,
- props, step = eventData.stepData,
- settings = eventData.settings,
- zoomin = target.perspectiveScale * 1.3 < eventData.current.perspectiveScale,
- zoomout = target.perspectiveScale > eventData.current.perspectiveScale * 1.3;
- // extract first scale from transform
- var lastScale = -1;
- $.each(target.transform, function(idx, item) {
- if(item.length <= 1) {
- return;
- }
- if(item[0] === "rotate" &&
- item[1] % 360 === 0 &&
- item[2] % 360 === 0 &&
- item[3] % 360 === 0) {
- return;
- }
- if(item[0] === "scale") {
- lastScale = idx;
- } else {
- return false;
- }
- });
- if(lastScale !== eventData.current.oldLastScale) {
- zoomin = zoomout = false;
- eventData.current.oldLastScale = lastScale;
- }
- var extracted = [];
- if(lastScale !== -1) {
- while(lastScale >= 0) {
- if(target.transform[lastScale][0] === "scale") {
- extracted.push(target.transform[lastScale]);
- target.transform[lastScale] = ["scale"];
- }
- lastScale--;
- }
- }
- var animation = settings.animation;
- if(settings.reasonableAnimation[eventData.reason]) {
- animation = $.extend({},
- animation,
- settings.reasonableAnimation[eventData.reason]);
- }
- props = {
- // to keep the perspective look similar for different scales
- // we need to 'scale' the perspective, too
- perspective: Math.round(target.perspectiveScale * 1000) + "px"
- };
- props = $.extend({}, animation, props);
- if (!zoomin) {
- props.transitionDelay = '0s';
- }
- if (!eventData.beforeActive) {
- props.transitionDuration = '0s';
- props.transitionDelay = '0s';
- }
- $.jmpress("css", eventData.area, props);
- engine.transform(eventData.area, extracted);
- props = $.extend({}, animation);
- if (!zoomout) {
- props.transitionDelay = '0s';
- }
- if (!eventData.beforeActive) {
- props.transitionDuration = '0s';
- props.transitionDelay = '0s';
- }
- eventData.current.perspectiveScale = target.perspectiveScale;
- $.jmpress("css", eventData.canvas, props);
- engine.transform(eventData.canvas, target.transform);
- });
- }(jQuery, document, window));
- /*
- * active.js
- * Set the active classes on steps
- */
- (function( $, document, window, undefined ) {
- 'use strict';
- var $jmpress = $.jmpress;
- /* DEFINES */
- var activeClass = 'activeClass',
- nestedActiveClass = 'nestedActiveClass';
- /* DEFAULTS */
- var defaults = $jmpress( 'defaults' );
- defaults[nestedActiveClass] = "nested-active";
- defaults[activeClass] = "active";
- /* HOOKS */
- $jmpress( 'setInactive', function( step, eventData ) {
- var settings = eventData.settings,
- activeClassSetting = settings[activeClass],
- nestedActiveClassSettings = settings[nestedActiveClass];
- if(activeClassSetting) {
- $(step).removeClass( activeClassSetting );
- }
- if(nestedActiveClassSettings) {
- $.each(eventData.parents, function(idx, element) {
- $(element).removeClass(nestedActiveClassSettings);
- });
- }
- });
- $jmpress( 'setActive', function( step, eventData ) {
- var settings = eventData.settings,
- activeClassSetting = settings[activeClass],
- nestedActiveClassSettings = settings[nestedActiveClass];
- if(activeClassSetting) {
- $(step).addClass( activeClassSetting );
- }
- if(nestedActiveClassSettings) {
- $.each(eventData.parents, function(idx, element) {
- $(element).addClass(nestedActiveClassSettings);
- });
- }
- });
- }(jQuery, document, window));
- /*
- * circular.js
- * Repeat from start after end
- */
- (function( $, document, window, undefined ) {
- 'use strict';
- var $jmpress = $.jmpress;
- /* FUNCTIONS */
- function firstSlide( step, eventData ) {
- return $(this).find(eventData.settings.stepSelector).first();
- }
- function prevOrNext( jmpress, step, eventData, prev) {
- if (!step) {
- return false;
- }
- var stepSelector = eventData.settings.stepSelector;
- step = $(step);
- do {
- var item = step.near( stepSelector, prev );
- if (item.length === 0 || item.closest(jmpress).length === 0) {
- item = $(jmpress).find(stepSelector)[prev?"last":"first"]();
- }
- if (!item.length) {
- return false;
- }
- step = item;
- } while( step.data("stepData").exclude );
- return step;
- }
- /* HOOKS */
- $jmpress( 'initStep', function( step, eventData ) {
- eventData.stepData.exclude = eventData.data.exclude && ["false", "no"].indexOf(eventData.data.exclude) === -1;
- });
- $jmpress( 'selectInitialStep', firstSlide);
- $jmpress( 'selectHome', firstSlide);
- $jmpress( 'selectEnd', function( step, eventData ) {
- return $(this).find(eventData.settings.stepSelector).last();
- });
- $jmpress( 'selectPrev', function( step, eventData ) {
- return prevOrNext(this, step, eventData, true);
- });
- $jmpress( 'selectNext', function( step, eventData ) {
- return prevOrNext(this, step, eventData);
- });
- }(jQuery, document, window));
- /*
- * start.js
- * Set the first step to start on
- */
- (function( $, document, window, undefined ) {
- 'use strict';
- /* HOOKS */
- $.jmpress( 'selectInitialStep', function( nil, eventData ) {
- return eventData.settings.start;
- });
- }(jQuery, document, window));
- /*
- * ways.js
- * Control the flow of the steps
- */
- (function( $, document, window, undefined ) {
- 'use strict';
- var $jmpress = $.jmpress;
- /* FUNCTIONS */
- function routeFunc( jmpress, route, type ) {
- for(var i = 0; i < route.length - 1; i++) {
- var from = route[i];
- var to = route[i+1];
- if($(jmpress).jmpress("initialized")) {
- $(from, jmpress).data("stepData")[type] = to;
- } else {
- $(from, jmpress).attr('data-' + type, to);
- }
- }
- }
- function selectPrevOrNext( step, eventData, attr, prev ) {
- var stepData = eventData.stepData;
- if(stepData[attr]) {
- var near = $(step).near(stepData[attr], prev);
- if(near && near.length) {
- return near;
- }
- near = $(stepData[attr], this)[prev?"last":"first"]();
- if(near && near.length) {
- return near;
- }
- }
- }
- /* EXPORTED FUNCTIONS */
- $jmpress( 'register', 'route', function( route, unidirectional, reversedRoute ) {
- if( typeof route === "string" ) {
- route = [route, route];
- }
- routeFunc(this, route, reversedRoute ? "prev" : "next");
- if (!unidirectional) {
- routeFunc(this, route.reverse(), reversedRoute ? "next" : "prev");
- }
- });
- /* HOOKS */
- $jmpress( 'initStep', function( step, eventData ) {
- for(var attr in {next:1,prev:1}) {
- eventData.stepData[attr] = eventData.data[attr];
- }
- });
- $jmpress( 'selectNext', function( step, eventData ) {
- return selectPrevOrNext.call(this, step, eventData, "next");
- });
- $jmpress( 'selectPrev', function( step, eventData ) {
- return selectPrevOrNext.call(this, step, eventData, "prev", true);
- });
- }(jQuery, document, window));
- /*
- * ajax.js
- * Load steps via ajax
- */
- (function( $, document, window, undefined ) {
- 'use strict';
- var $jmpress = $.jmpress;
- /* DEFINES */
- var afterStepLoaded = 'ajax:afterStepLoaded',
- loadStep = 'ajax:loadStep';
- /* REGISTER EVENTS */
- $jmpress('register', loadStep);
- $jmpress('register', afterStepLoaded);
- /* DEFAULTS */
- $jmpress('defaults').ajaxLoadedClass = "loaded";
- /* HOOKS */
- $jmpress('initStep', function( step, eventData ) {
- eventData.stepData.src = $(step).attr('href') || eventData.data.src || false;
- eventData.stepData.srcLoaded = false;
- });
- $jmpress(loadStep, function( step, eventData ) {
- var stepData = eventData.stepData,
- href = stepData && stepData.src,
- settings = eventData.settings;
- if ( href ) {
- $(step).addClass( settings.ajaxLoadedClass );
- stepData.srcLoaded = true;
- $(step).load(href, function(response, status, xhr) {
- $(eventData.jmpress).jmpress('fire', afterStepLoaded, step, $.extend({}, eventData, {
- response: response
- ,status: status
- ,xhr: xhr
- }));
- });
- }
- });
- $jmpress('idle', function( step, eventData ) {
- if (!step) {
- return;
- }
- var settings = eventData.settings,
- jmpress = $(this),
- stepData = eventData.stepData;
- var siblings = $(step)
- .add( $(step).near( settings.stepSelector ) )
- .add( $(step).near( settings.stepSelector, true) )
- .add( jmpress.jmpress('fire', 'selectPrev', step, {
- stepData: $(step).data('stepData')
- }))
- .add( jmpress.jmpress('fire', 'selectNext', step, {
- stepData: $(step).data('stepData')
- }));
- siblings.each(function() {
- var step = this,
- stepData = $(step).data("stepData");
- if(!stepData.src || stepData.srcLoaded) {
- return;
- }
- jmpress.jmpress('fire', loadStep, step, {
- stepData: $(step).data('stepData')
- });
- });
- });
- $jmpress("setActive", function(step, eventData) {
- var stepData = $(step).data("stepData");
- if(!stepData.src || stepData.srcLoaded) {
- return;
- }
- $(this).jmpress('fire', loadStep, step, {
- stepData: $(step).data('stepData')
- });
- });
- }(jQuery, document, window));
- /*
- * hash.js
- * Detect and set the URL hash
- */
- (function( $, document, window, undefined ) {
- 'use strict';
- var $jmpress = $.jmpress,
- hashLink = "a[href^='#']";
- /* FUNCTIONS */
- function randomString() {
- return "" + Math.round(Math.random() * 100000, 0);
- }
- /**
- * getElementFromUrl
- *
- * @return String or undefined
- */
- function getElementFromUrl(settings) {
- // get id from url # by removing `#` or `#/` from the beginning,
- // so both "fallback" `#slide-id` and "enhanced" `#/slide-id` will work
- // TODO SECURITY check user input to be valid!
- try {
- var el = $( '#' + window.location.hash.replace(/^#\/?/,"") );
- return el.length > 0 && el.is(settings.stepSelector) ? el : undefined;
- } catch(e) {}
- }
- function setHash(stepid) {
- var shouldBeHash = "#/" + stepid;
- if(window.history && window.history.pushState) {
- // shouldBeHash = "#" + stepid;
- // consider this for future versions
- // it has currently issues, when startup with a link with hash (webkit)
- if(window.location.hash !== shouldBeHash) {
- window.history.pushState({}, '', shouldBeHash);
- }
- } else {
- if(window.location.hash !== shouldBeHash) {
- window.location.hash = shouldBeHash;
- }
- }
- }
- /* DEFAULTS */
- $jmpress('defaults').hash = {
- use: true
- ,update: true
- ,bindChange: true
- // NOTICE: {use: true, update: false, bindChange: true}
- // will cause a error after clicking on a link to the current step
- };
- /* HOOKS */
- $jmpress('selectInitialStep', function( step, eventData ) {
- var settings = eventData.settings,
- hashSettings = settings.hash,
- current = eventData.current,
- jmpress = $(this);
- eventData.current.hashNamespace = ".jmpress-"+randomString();
- // HASH CHANGE EVENT
- if ( hashSettings.use ) {
- if ( hashSettings.bindChange ) {
- $(window).bind('hashchange'+current.hashNamespace, function(event) {
- var urlItem = getElementFromUrl(settings);
- if ( jmpress.jmpress('initialized') ) {
- jmpress.jmpress("scrollFix");
- }
- if(urlItem && urlItem.length) {
- if(urlItem.attr("id") !== jmpress.jmpress("active").attr("id")) {
- jmpress.jmpress('select', urlItem);
- }
- setHash(urlItem.attr("id"));
- }
- event.preventDefault();
- });
- $(hashLink).on("click"+current.hashNamespace, function(event) {
- var href = $(this).attr("href");
- try {
- if($(href).is(settings.stepSelector)) {
- jmpress.jmpress("select", href);
- event.preventDefault();
- event.stopPropagation();
- }
- } catch(e) {}
- });
- }
- return getElementFromUrl(settings);
- }
- });
- $jmpress('afterDeinit', function( nil, eventData ) {
- $(hashLink).off(eventData.current.hashNamespace);
- $(window).unbind(eventData.current.hashNamespace);
- });
- $jmpress('setActive', function( step, eventData ) {
- var settings = eventData.settings,
- current = eventData.current;
- // `#/step-id` is used instead of `#step-id` to prevent default browser
- // scrolling to element in hash
- if ( settings.hash.use && settings.hash.update ) {
- clearTimeout(current.hashtimeout);
- current.hashtimeout = setTimeout(function() {
- setHash($(eventData.delegatedFrom).attr('id'));
- }, settings.transitionDuration + 200);
- }
- });
- }(jQuery, document, window));
- /*
- * keyboard.js
- * Keyboard event mapping and default keyboard actions
- */
- (function( $, document, window, undefined ) {
- 'use strict';
- var $jmpress = $.jmpress,
- jmpressNext = "next",
- jmpressPrev = "prev";
- /* FUNCTIONS */
- function randomString() {
- return "" + Math.round(Math.random() * 100000, 0);
- }
- function stopEvent(event) {
- event.preventDefault();
- event.stopPropagation();
- }
- /* DEFAULTS */
- $jmpress('defaults').keyboard = {
- use: true
- ,keys: {
- 33: jmpressPrev // pg up
- ,37: jmpressPrev // left
- ,38: jmpressPrev // up
- ,9: jmpressNext+":"+jmpressPrev // tab
- ,32: jmpressNext // space
- ,34: jmpressNext // pg down
- ,39: jmpressNext // right
- ,40: jmpressNext // down
- ,36: "home" // home
- ,35: "end" // end
- }
- ,ignore: {
- "INPUT": [
- 32 // space
- ,37 // left
- ,38 // up
- ,39 // right
- ,40 // down
- ]
- ,"TEXTAREA": [
- 32 // space
- ,37 // left
- ,38 // up
- ,39 // right
- ,40 // down
- ]
- ,"SELECT": [
- 38 // up
- ,40 // down
- ]
- }
- ,tabSelector: "a[href]:visible, :input:visible"
- };
- /* HOOKS */
- $jmpress('afterInit', function( nil, eventData ) {
- var settings = eventData.settings,
- keyboardSettings = settings.keyboard,
- ignoreKeyboardSettings = keyboardSettings.ignore,
- current = eventData.current,
- jmpress = $(this);
- // tabindex make it focusable so that it can receive key events
- if(!settings.fullscreen) {
- jmpress.attr("tabindex", 0);
- }
- current.keyboardNamespace = ".jmpress-"+randomString();
- // KEYPRESS EVENT: this fixes a Opera bug
- $(settings.fullscreen ? document : jmpress)
- .bind("keypress"+current.keyboardNamespace, function( event ) {
- for( var nodeName in ignoreKeyboardSettings ) {
- if ( event.target.nodeName === nodeName && ignoreKeyboardSettings[nodeName].indexOf(event.which) !== -1 ) {
- return;
- }
- }
- if(event.which >= 37 && event.which <= 40 || event.which === 32) {
- stopEvent(event);
- }
- });
- // KEYDOWN EVENT
- $(settings.fullscreen ? document : jmpress)
- .bind("keydown"+current.keyboardNamespace, function( event ) {
- var eventTarget = $(event.target);
- if ( !settings.fullscreen && !eventTarget.closest(jmpress).length || !keyboardSettings.use ) {
- return;
- }
- for( var nodeName in ignoreKeyboardSettings ) {
- if ( eventTarget[0].nodeName === nodeName && ignoreKeyboardSettings[nodeName].indexOf(event.which) !== -1 ) {
- return;
- }
- }
- var reverseSelect = false;
- var nextFocus;
- if (event.which === 9) {
- // tab
- if ( !eventTarget.closest( jmpress.jmpress('active') ).length ) {
- if ( !event.shiftKey ) {
- nextFocus = jmpress.jmpress('active').find("a[href], :input").filter(":visible").first();
- } else {
- reverseSelect = true;
- }
- } else {
- nextFocus = eventTarget.near( keyboardSettings.tabSelector, event.shiftKey );
- if( !$(nextFocus)
- .closest( settings.stepSelector )
- .is(jmpress.jmpress('active') ) ) {
- nextFocus = undefined;
- }
- }
- if( nextFocus && nextFocus.length > 0 ) {
- nextFocus.focus();
- jmpress.jmpress("scrollFix");
- stopEvent(event);
- return;
- } else {
- if(event.shiftKey) {
- reverseSelect = true;
- }
- }
- }
- var action = keyboardSettings.keys[ event.which ];
- if ( typeof action === "string" ) {
- if (action.indexOf(":") !== -1) {
- action = action.split(":");
- action = event.shiftKey ? action[1] : action[0];
- }
- jmpress.jmpress( action );
- stopEvent(event);
- } else if ( $.isFunction(action) ) {
- action.call(jmpress, event);
- } else if ( action ) {
- jmpress.jmpress.apply( jmpress, action );
- stopEvent(event);
- }
- if (reverseSelect) {
- // tab
- nextFocus = jmpress.jmpress('active').find("a[href], :input").filter(":visible").last();
- nextFocus.focus();
- jmpress.jmpress("scrollFix");
- }
- });
- });
- $jmpress('afterDeinit', function( nil, eventData ) {
- $(document).unbind(eventData.current.keyboardNamespace);
- });
- }(jQuery, document, window));
- /*
- * viewport.js
- * Scale to fit a given viewport
- */
- (function( $, document, window, undefined ) {
- 'use strict';
- function randomString() {
- return "" + Math.round(Math.random() * 100000, 0);
- }
- var browser = (function() {
- var ua = navigator.userAgent.toLowerCase();
- var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
- /(webkit)[ \/]([\w.]+)/.exec(ua) ||
- /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
- /(msie) ([\w.]+)/.exec(ua) ||
- ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
- [];
- return match[1] || "";
- }());
- var defaults = $.jmpress("defaults");
- defaults.viewPort = {
- width: false
- ,height: false
- ,maxScale: 0
- ,minScale: 0
- ,zoomable: 0
- ,zoomBindMove: true
- ,zoomBindWheel: true
- };
- var keys = defaults.keyboard.keys;
- keys[browser === 'mozilla' ? 107 : 187] = "zoomIn"; // +
- keys[browser === 'mozilla' ? 109 : 189] = "zoomOut"; // -
- defaults.reasonableAnimation.resize = {
- transitionDuration: '0s'
- ,transitionDelay: '0ms'
- };
- defaults.reasonableAnimation.zoom = {
- transitionDuration: '0s'
- ,transitionDelay: '0ms'
- };
- $.jmpress("initStep", function( step, eventData ) {
- for(var variable in {"viewPortHeight":1, "viewPortWidth":1, "viewPortMinScale":1, "viewPortMaxScale":1, "viewPortZoomable":1}) {
- eventData.stepData[variable] = eventData.data[variable] && parseFloat(eventData.data[variable]);
- }
- });
- $.jmpress("afterInit", function( nil, eventData ) {
- var jmpress = this;
- eventData.current.viewPortNamespace = ".jmpress-"+randomString();
- $(window).bind("resize"+eventData.current.viewPortNamespace, function (event) {
- $(jmpress).jmpress("reselect", "resize");
- });
- eventData.current.userZoom = 0;
- eventData.current.userTranslateX = 0;
- eventData.current.userTranslateY = 0;
- if(eventData.settings.viewPort.zoomBindWheel) {
- $(eventData.settings.fullscreen ? document : this)
- .bind("mousewheel"+eventData.current.viewPortNamespace+" DOMMouseScroll"+eventData.current.viewPortNamespace, function( event, delta ) {
- delta = delta || event.originalEvent.wheelDelta || -event.originalEvent.detail /* mozilla */;
- var direction = (delta / Math.abs(delta));
- if(direction < 0) {
- $(eventData.jmpress).jmpress("zoomOut", event.originalEvent.x, event.originalEvent.y);
- } else if(direction > 0) {
- $(eventData.jmpress).jmpress("zoomIn", event.originalEvent.x, event.originalEvent.y);
- }
- return false;
- });
- }
- if(eventData.settings.viewPort.zoomBindMove) {
- $(eventData.settings.fullscreen ? document : this).bind("mousedown"+eventData.current.viewPortNamespace, function (event) {
- if(eventData.current.userZoom) {
- eventData.current.userTranslating = { x: event.clientX, y: event.clientY };
- event.preventDefault();
- event.stopImmediatePropagation();
- }
- }).bind("mousemove"+eventData.current.viewPortNamespace, function (event) {
- var userTranslating = eventData.current.userTranslating;
- if(userTranslating) {
- $(jmpress).jmpress("zoomTranslate", event.clientX - userTranslating.x, event.clientY - userTranslating.y);
- userTranslating.x = event.clientX;
- userTranslating.y = event.clientY;
- event.preventDefault();
- event.stopImmediatePropagation();
- }
- }).bind("mouseup"+eventData.current.viewPortNamespace, function (event) {
- if(eventData.current.userTranslating) {
- eventData.current.userTranslating = undefined;
- event.preventDefault();
- event.stopImmediatePropagation();
- }
- });
- }
- });
- function maxAbs(value, range) {
- return Math.max(Math.min(value, range), -range);
- }
- function zoom(x, y, direction) {
- var current = $(this).jmpress("current"),
- settings = $(this).jmpress("settings"),
- stepData = $(this).jmpress("active").data("stepData"),
- container = $(this).jmpress("container");
- if(current.userZoom === 0 && direction < 0) {
- return;
- }
- var zoomableSteps = stepData.viewPortZoomable || settings.viewPort.zoomable;
- if(current.userZoom === zoomableSteps && direction > 0) {
- return;
- }
- current.userZoom += direction;
- var halfWidth = $(container).innerWidth()/2,
- halfHeight = $(container).innerHeight()/2;
- x = x ? x - halfWidth : x;
- y = y ? y - halfHeight : y;
- // TODO this is not perfect... too much math... :(
- current.userTranslateX =
- maxAbs(current.userTranslateX - direction * x / current.zoomOriginWindowScale / zoomableSteps,
- halfWidth * current.userZoom * current.userZoom / zoomableSteps);
- current.userTranslateY =
- maxAbs(current.userTranslateY - direction * y / current.zoomOriginWindowScale / zoomableSteps,
- halfHeight * current.userZoom * current.userZoom / zoomableSteps);
- $(this).jmpress("reselect", "zoom");
- }
- $.jmpress("register", "zoomIn", function(x, y) {
- zoom.call(this, x||0, y||0, 1);
- });
- $.jmpress("register", "zoomOut", function(x, y) {
- zoom.call(this, x||0, y||0, -1);
- });
- $.jmpress("register", "zoomTranslate", function(x, y) {
- var current = $(this).jmpress("current"),
- settings = $(this).jmpress("settings"),
- stepData = $(this).jmpress("active").data("stepData"),
- container = $(this).jmpress("container");
- var zoomableSteps = stepData.viewPortZoomable || settings.viewPort.zoomable;
- var halfWidth = $(container).innerWidth(),
- halfHeight = $(container).innerHeight();
- current.userTranslateX =
- maxAbs(current.userTranslateX + x / current.zoomOriginWindowScale,
- halfWidth * current.userZoom * current.userZoom / zoomableSteps);
- current.userTranslateY =
- maxAbs(current.userTranslateY + y / current.zoomOriginWindowScale,
- halfHeight * current.userZoom * current.userZoom / zoomableSteps);
- $(this).jmpress("reselect", "zoom");
- });
- $.jmpress('afterDeinit', function( nil, eventData ) {
- $(eventData.settings.fullscreen ? document : this).unbind(eventData.current.viewPortNamespace);
- $(window).unbind(eventData.current.viewPortNamespace);
- });
- $.jmpress("setActive", function( step, eventData ) {
- var viewPort = eventData.settings.viewPort;
- var viewPortHeight = eventData.stepData.viewPortHeight || viewPort.height;
- var viewPortWidth = eventData.stepData.viewPortWidth || viewPort.width;
- var viewPortMaxScale = eventData.stepData.viewPortMaxScale || viewPort.maxScale;
- var viewPortMinScale = eventData.stepData.viewPortMinScale || viewPort.minScale;
- // Correct the scale based on the window's size
- var windowScaleY = viewPortHeight && $(eventData.container).innerHeight()/viewPortHeight;
- var windowScaleX = viewPortWidth && $(eventData.container).innerWidth()/viewPortWidth;
- var windowScale = (windowScaleX || windowScaleY) && Math.min( windowScaleX || windowScaleY, windowScaleY || windowScaleX );
- if(windowScale) {
- windowScale = windowScale || 1;
- if(viewPortMaxScale) {
- windowScale = Math.min(windowScale, viewPortMaxScale);
- }
- if(viewPortMinScale) {
- windowScale = Math.max(windowScale, viewPortMinScale);
- }
- var zoomableSteps = eventData.stepData.viewPortZoomable || eventData.settings.viewPort.zoomable;
- if(zoomableSteps) {
- var diff = (1/windowScale) - (1/viewPortMaxScale);
- diff /= zoomableSteps;
- windowScale = 1/((1/windowScale) - diff * eventData.current.userZoom);
- }
- eventData.target.transform.reverse();
- if(eventData.current.userTranslateX && eventData.current.userTranslateY) {
- eventData.target.transform.push(["translate", eventData.current.userTranslateX, eventData.current.userTranslateY, 0]);
- } else {
- eventData.target.transform.push(["translate"]);
- }
- eventData.target.transform.push(["scale",
- windowScale,
- windowScale,
- 1]);
- eventData.target.transform.reverse();
- eventData.target.perspectiveScale /= windowScale;
- }
- eventData.current.zoomOriginWindowScale = windowScale;
- });
- $.jmpress("setInactive", function( step, eventData ) {
- if(!eventData.nextStep || !step || $(eventData.nextStep).attr("id") !== $(step).attr("id")) {
- eventData.current.userZoom = 0;
- eventData.current.userTranslateX = 0;
- eventData.current.userTranslateY = 0;
- }
- });
- }(jQuery, document, window));
- /*
- * mouse.js
- * Clicking to select a step
- */
- (function( $, document, window, undefined ) {
- 'use strict';
- var $jmpress = $.jmpress;
- /* FUNCTIONS */
- function randomString() {
- return "" + Math.round(Math.random() * 100000, 0);
- }
- /* DEFAULTS */
- $jmpress("defaults").mouse = {
- clickSelects: true
- };
- /* HOOKS */
- $jmpress("afterInit", function( nil, eventData ) {
- var settings = eventData.settings,
- stepSelector = settings.stepSelector,
- current = eventData.current,
- jmpress = $(this);
- current.clickableStepsNamespace = ".jmpress-"+randomString();
- jmpress.bind("click"+current.clickableStepsNamespace, function(event) {
- if (!settings.mouse.clickSelects || current.userZoom) {
- return;
- }
- // get clicked step
- var clickedStep = $(event.target).closest(stepSelector);
- // clicks on the active step do default
- if ( clickedStep.is( jmpress.jmpress("active") ) ) {
- return;
- }
- if (clickedStep.length) {
- // select the clicked step
- jmpress.jmpress("select", clickedStep[0], "click");
- event.preventDefault();
- event.stopPropagation();
- }
- });
- });
- $jmpress('afterDeinit', function( nil, eventData ) {
- $(this).unbind(eventData.current.clickableStepsNamespace);
- });
- }(jQuery, document, window));
- /*
- * mobile.js
- * Adds support for swipe on touch supported browsers
- */
- (function( $, document, window, undefined ) {
- 'use strict';
- var $jmpress = $.jmpress;
- /* FUNCTIONS */
- function randomString() {
- return "" + Math.round(Math.random() * 100000, 0);
- }
- /* HOOKS */
- $jmpress( 'afterInit', function( step, eventData ) {
- var settings = eventData.settings,
- current = eventData.current,
- jmpress = eventData.jmpress;
- current.mobileNamespace = ".jmpress-"+randomString();
- var data, start = [0,0];
- $(settings.fullscreen ? document : jmpress)
- .bind("touchstart"+current.mobileNamespace, function( event ) {
- data = event.originalEvent.touches[0];
- start = [ data.pageX, data.pageY ];
- }).bind("touchmove"+current.mobileNamespace, function( event ) {
- data = event.originalEvent.touches[0];
- event.preventDefault();
- return false;
- }).bind("touchend"+current.mobileNamespace, function( event ) {
- var end = [ data.pageX, data.pageY ],
- diff = [ end[0]-start[0], end[1]-start[1] ];
- if(Math.max(Math.abs(diff[0]), Math.abs(diff[1])) > 50) {
- diff = Math.abs(diff[0]) > Math.abs(diff[1]) ? diff[0] : diff[1];
- $(jmpress).jmpress(diff > 0 ? "prev" : "next");
- event.preventDefault();
- return false;
- }
- });
- });
- $jmpress('afterDeinit', function( nil, eventData ) {
- var settings = eventData.settings,
- current = eventData.current,
- jmpress = eventData.jmpress;
- $(settings.fullscreen ? document : jmpress).unbind(current.mobileNamespace);
- });
- }(jQuery, document, window));
- /*
- * templates.js
- * The amazing template engine
- */
- (function( $, document, window, undefined ) {
- 'use strict';
- var $jmpress = $.jmpress,
- templateFromParentIdent = "_template_",
- templateFromApplyIdent = "_applied_template_";
- /* STATIC VARS */
- var templates = {};
- /* FUNCTIONS */
- function addUndefined( target, values, prefix ) {
- for( var name in values ) {
- var targetName = name;
- if ( prefix ) {
- targetName = prefix + targetName.substr(0, 1).toUpperCase() + targetName.substr(1);
- }
- if ( $.isPlainObject(values[name]) ) {
- addUndefined( target, values[name], targetName );
- } else if( target[targetName] === undefined ) {
- target[targetName] = values[name];
- }
- }
- }
- function applyChildrenTemplates( children, templateChildren ) {
- if ($.isArray(templateChildren)) {
- if (templateChildren.length < children.length) {
- $.error("more nested steps than children in template");
- } else {
- children.each(function(idx, child) {
- child = $(child);
- var tmpl = child.data(templateFromParentIdent) || {};
- addUndefined(tmpl, templateChildren[idx]);
- child.data(templateFromParentIdent, tmpl);
- });
- }
- } else if($.isFunction(templateChildren)) {
- children.each(function(idx, child) {
- child = $(child);
- var tmpl = child.data(templateFromParentIdent) || {};
- addUndefined(tmpl, templateChildren(idx, child, children));
- child.data(templateFromParentIdent, tmpl);
- });
- } // TODO: else if(object)
- }
- function applyTemplate( data, element, template, eventData ) {
- if (template.children) {
- var children = element.children( eventData.settings.stepSelector );
- applyChildrenTemplates( children, template.children );
- }
- applyTemplateData( data, template );
- }
- function applyTemplateData( data, template ) {
- addUndefined(data, template);
- }
- /* HOOKS */
- $jmpress("beforeInitStep", function( step, eventData ) {
- step = $(step);
- var data = eventData.data,
- templateFromAttr = data.template,
- templateFromApply = step.data(templateFromApplyIdent),
- templateFromParent = step.data(templateFromParentIdent);
- if(templateFromAttr) {
- $.each(templateFromAttr.split(" "), function(idx, tmpl) {
- var template = templates[tmpl];
- applyTemplate( data, step, template, eventData );
- });
- }
- if (templateFromApply) {
- applyTemplate( data, step, templateFromApply, eventData );
- }
- if (templateFromParent) {
- applyTemplate( data, step, templateFromParent, eventData );
- step.data(templateFromParentIdent, null);
- if(templateFromParent.template) {
- $.each(templateFromParent.template.split(" "), function(idx, tmpl) {
- var template = templates[tmpl];
- applyTemplate( data, step, template, eventData );
- });
- }
- }
- });
- $jmpress("beforeInit", function( nil, eventData ) {
- var data = $jmpress("dataset", this),
- dataTemplate = data.template,
- stepSelector = eventData.settings.stepSelector;
- if (dataTemplate) {
- var template = templates[dataTemplate];
- applyChildrenTemplates( $(this).find(stepSelector).filter(function() {
- return !$(this).parent().is(stepSelector);
- }), template.children );
- }
- });
- /* EXPORTED FUNCTIONS */
- $jmpress("register", "template", function( name, tmpl ) {
- if (templates[name]) {
- templates[name] = $.extend(true, {}, templates[name], tmpl);
- } else {
- templates[name] = $.extend(true, {}, tmpl);
- }
- });
- $jmpress("register", "apply", function( selector, tmpl ) {
- if( !tmpl ) {
- // TODO ERROR because settings not found
- var stepSelector = $(this).jmpress("settings").stepSelector;
- applyChildrenTemplates( $(this).find(stepSelector).filter(function() {
- return !$(this).parent().is(stepSelector);
- }), selector );
- } else if($.isArray(tmpl)) {
- applyChildrenTemplates( $(selector), tmpl );
- } else {
- var template;
- if(typeof tmpl === "string") {
- template = templates[tmpl];
- } else {
- template = $.extend(true, {}, tmpl);
- }
- $(selector).each(function(idx, element) {
- element = $(element);
- var tmpl = element.data(templateFromApplyIdent) || {};
- addUndefined(tmpl, template);
- element.data(templateFromApplyIdent, tmpl);
- });
- }
- });
- }(jQuery, document, window));
- /*
- * jqevents.js
- * Fires jQuery events
- */
- (function( $, document, window, undefined ) {
- 'use strict';
- /* HOOKS */
- // the events should not bubble up the tree
- // elsewise nested jmpress would cause buggy behavior
- $.jmpress("setActive", function( step, eventData ) {
- if(eventData.prevStep !== step) {
- $(step).triggerHandler("enterStep");
- }
- });
- $.jmpress("setInactive", function( step, eventData ) {
- if(eventData.nextStep !== step) {
- $(step).triggerHandler("leaveStep");
- }
- });
- }(jQuery, document, window));
- /*
- * animation.js
- * Apply custom animations to steps
- */
- (function( $, document, window, undefined ) {
- 'use strict';
- function parseSubstepInfo(str) {
- var arr = str.split(" ");
- var className = arr[0];
- var config = { willClass: "will-"+className, doClass: "do-"+className, hasClass: "has-"+className };
- var state = "";
- for(var i = 1; i < arr.length; i++) {
- var s = arr[i];
- switch(state) {
- case "":
- if(s === "after") {
- state = "after";
- } else {
- $.warn("unknown keyword in '"+str+"'. '"+s+"' unknown.");
- }
- break;
- case "after":
- if(s.match(/^[1-9][0-9]*m?s?/)) {
- var value = parseFloat(s);
- if(s.indexOf("ms") !== -1) {
- value *= 1;
- } else if(s.indexOf("s") !== -1) {
- value *= 1000;
- } else if(s.indexOf("m") !== -1) {
- value *= 60000;
- }
- config.delay = value;
- } else {
- config.after = Array.prototype.slice.call(arr, i).join(" ");
- i = arr.length;
- }
- }
- }
- return config;
- }
- function find(array, selector, start, end) {
- end = end || (array.length - 1);
- start = start || 0;
- for(var i = start; i < end + 1; i++) {
- if($(array[i].element).is(selector)) {
- return i;
- }
- }
- }
- function addOn(list, substep, delay) {
- $.each(substep._on, function(idx, child) {
- list.push({substep: child.substep, delay: child.delay + delay});
- addOn(list, child.substep, child.delay + delay);
- });
- }
- $.jmpress("defaults").customAnimationDataAttribute = "jmpress";
- $.jmpress("afterInit", function( nil, eventData ) {
- eventData.current.animationTimeouts = [];
- eventData.current.animationCleanupWaiting = [];
- });
- $.jmpress("applyStep", function( step, eventData ) {
- // read custom animation from elements
- var substepsData = {};
- var listOfSubsteps = [];
- $(step).find("[data-"+eventData.settings.customAnimationDataAttribute+"]")
- .each(function(idx, element) {
- if($(element).closest(eventData.settings.stepSelector).is(step)) {
- listOfSubsteps.push({element: element});
- }
- });
- if(listOfSubsteps.length === 0) {
- return;
- }
- $.each(listOfSubsteps, function(idx, substep) {
- substep.info = parseSubstepInfo(
- $(substep.element).data(eventData.settings.customAnimationDataAttribute));
- $(substep.element).addClass(substep.info.willClass);
- substep._on = [];
- substep._after = null;
- });
- var current = {_after: undefined, _on: [], info: {}}; // virtual zero step
- $.each(listOfSubsteps, function(idx, substep) {
- var other = substep.info.after;
- if(other) {
- if(other === "step") {
- other = current;
- } else if(other === "prev") {
- other = listOfSubsteps[idx-1];
- } else {
- var index = find(listOfSubsteps, other, 0, idx - 1);
- if(index === undefined) {
- index = find(listOfSubsteps, other);
- }
- other = (index === undefined || index === idx) ? listOfSubsteps[idx-1] : listOfSubsteps[index];
- }
- } else {
- other = listOfSubsteps[idx-1];
- }
- if(other) {
- if(!substep.info.delay) {
- if(!other._after) {
- other._after = substep;
- return;
- }
- other = other._after;
- }
- other._on.push({substep: substep, delay: substep.info.delay || 0});
- }
- });
- if(current._after === undefined && current._on.length === 0) {
- var startStep = find(listOfSubsteps, eventData.stepData.startSubstep) || 0;
- current._after = listOfSubsteps[startStep];
- }
- var substepsInOrder = [];
- function findNextFunc(idx, item) {
- if(item.substep._after) {
- current = item.substep._after;
- return false;
- }
- }
- do {
- var substepList = [{substep: current, delay: 0}];
- addOn(substepList, current, 0);
- substepsInOrder.push(substepList);
- current = null;
- $.each(substepList, findNextFunc);
- } while(current);
- substepsData.list = substepsInOrder;
- $(step).data("substepsData", substepsData);
- });
- $.jmpress("unapplyStep", function( step, eventData ) {
- var substepsData = $(step).data("substepsData");
- if(substepsData) {
- $.each(substepsData.list, function(idx, activeSubsteps) {
- $.each(activeSubsteps, function(idx, substep) {
- if(substep.substep.info.willClass) {
- $(substep.substep.element).removeClass(substep.substep.info.willClass);
- }
- if(substep.substep.info.hasClass) {
- $(substep.substep.element).removeClass(substep.substep.info.hasClass);
- }
- if(substep.substep.info.doClass) {
- $(substep.substep.element).removeClass(substep.substep.info.doClass);
- }
- });
- });
- }
- });
- $.jmpress("setActive", function(step, eventData) {
- var substepsData = $(step).data("substepsData");
- if(!substepsData) {
- return;
- }
- if(eventData.substep === undefined) {
- eventData.substep =
- (eventData.reason === "prev" ?
- substepsData.list.length-1 :
- 0
- );
- }
- var substep = eventData.substep;
- $.each(eventData.current.animationTimeouts, function(idx, timeout) {
- clearTimeout(timeout);
- });
- eventData.current.animationTimeouts = [];
- $.each(substepsData.list, function(idx, activeSubsteps) {
- var applyHas = idx < substep;
- var applyDo = idx <= substep;
- $.each(activeSubsteps, function(idx, substep) {
- if(substep.substep.info.hasClass) {
- $(substep.substep.element)[(applyHas?"add":"remove")+"Class"](substep.substep.info.hasClass);
- }
- function applyIt() {
- $(substep.substep.element).addClass(substep.substep.info.doClass);
- }
- if(applyDo && !applyHas && substep.delay && eventData.reason !== "prev") {
- if(substep.substep.info.doClass) {
- $(substep.substep.element).removeClass(substep.substep.info.doClass);
- eventData.current.animationTimeouts.push(setTimeout(applyIt, substep.delay));
- }
- } else {
- if(substep.substep.info.doClass) {
- $(substep.substep.element)[(applyDo?"add":"remove")+"Class"](substep.substep.info.doClass);
- }
- }
- });
- });
- });
- $.jmpress("setInactive", function(step, eventData) {
- if(eventData.nextStep === step) {
- return;
- }
- function cleanupAnimation( substepsData ) {
- $.each(substepsData.list, function(idx, activeSubsteps) {
- $.each(activeSubsteps, function(idx, substep) {
- if(substep.substep.info.hasClass) {
- $(substep.substep.element).removeClass(substep.substep.info.hasClass);
- }
- if(substep.substep.info.doClass) {
- $(substep.substep.element).removeClass(substep.substep.info.doClass);
- }
- });
- });
- }
- $.each(eventData.current.animationCleanupWaiting, function(idx, item) {
- cleanupAnimation(item);
- });
- eventData.current.animationCleanupWaiting = [];
- var substepsData = $(step).data("substepsData");
- if(substepsData) {
- eventData.current.animationCleanupWaiting.push( substepsData );
- }
- });
- $.jmpress("selectNext", function( step, eventData ) {
- if(eventData.substep === undefined) {
- return;
- }
- var substepsData = $(step).data("substepsData");
- if(!substepsData) {
- return;
- }
- if(eventData.substep < substepsData.list.length-1) {
- return {step: step, substep: eventData.substep+1};
- }
- });
- $.jmpress("selectPrev", function( step, eventData ) {
- if(eventData.substep === undefined) {
- return;
- }
- var substepsData = $(step).data("substepsData");
- if(!substepsData) {
- return;
- }
- if(eventData.substep > 0) {
- return {step: step, substep: eventData.substep-1};
- }
- });
- }(jQuery, document, window));
- /*!
- * plugin for jmpress.js v0.4.5
- *
- * Copyright 2013 Kyle Robinson Young @shama & Tobias Koppers @sokra
- * Licensed MIT
- * http://www.opensource.org/licenses/mit-license.php
- *//*
- * jmpress.toggle plugin
- * For binding a key to toggle de/initialization of jmpress.js.
- */
- (function( $, document, window, undefined ) {
- 'use strict';
- $.jmpress("register", "toggle", function( key, config, initial ) {
- var jmpress = this;
- $(document).bind("keydown", function( event ) {
- if ( event.keyCode === key ) {
- if ($(jmpress).jmpress("initialized")) {
- $(jmpress).jmpress("deinit");
- } else {
- $(jmpress).jmpress(config);
- }
- }
- });
- if ( initial ) {
- $(jmpress).jmpress(config);
- }
- });
- }(jQuery, document, window));
- /*
- * jmpress.secondary plugin
- * Apply a secondary animation when step is selected.
- */
- (function( $, document, window, undefined ) {
- 'use strict';
- $.jmpress("initStep", function( step, eventData ) {
- for(var name in eventData.data) {
- if(name.indexOf("secondary") === 0) {
- eventData.stepData[name] = eventData.data[name];
- }
- }
- });
- function exchangeIf(childStepData, condition, step) {
- if(childStepData.secondary &&
- childStepData.secondary.split(" ").indexOf(condition) !== -1) {
- for(var name in childStepData) {
- if(name.length > 9 && name.indexOf("secondary") === 0) {
- var tmp = childStepData[name];
- var normal = name.substr(9);
- normal = normal.substr(0, 1).toLowerCase() + normal.substr(1);
- childStepData[name] = childStepData[normal];
- childStepData[normal] = tmp;
- }
- }
- $(this).jmpress("reapply", $(step));
- }
- }
- $.jmpress("beforeActive", function( step, eventData ) {
- exchangeIf.call(eventData.jmpress, $(step).data("stepData"), "self", step);
- var parent = $(step).parent();
- $(parent)
- .children(eventData.settings.stepSelector)
- .each(function(idx, child) {
- var childStepData = $(child).data("stepData");
- exchangeIf.call(eventData.jmpress, childStepData, "siblings", child);
- });
- function grandchildrenFunc(idx, child) {
- var childStepData = $(child).data("stepData");
- exchangeIf.call(eventData.jmpress, childStepData, "grandchildren", child);
- }
- for(var i = 1; i < eventData.parents.length; i++) {
- $(eventData.parents[i])
- .children(eventData.settings.stepSelector)
- .each();
- }
- });
- $.jmpress("setInactive", function( step, eventData ) {
- exchangeIf.call(eventData.jmpress, $(step).data("stepData"), "self", step);
- var parent = $(step).parent();
- $(parent)
- .children(eventData.settings.stepSelector)
- .each(function(idx, child) {
- var childStepData = $(child).data("stepData");
- exchangeIf.call(eventData.jmpress, childStepData, "siblings", child);
- });
- function grandchildrenFunc(idx, child) {
- var childStepData = $(child).data("stepData");
- exchangeIf.call(eventData.jmpress, childStepData, "grandchildren", child);
- }
- for(var i = 1; i < eventData.parents.length; i++) {
- $(eventData.parents[i])
- .children(eventData.settings.stepSelector)
- .each(grandchildrenFunc);
- }
- });
- }(jQuery, document, window));
- /*
- * jmpress.duration plugin
- * For auto advancing steps after a given duration and optionally displaying a
- * progress bar.
- */
- (function( $, document, window, undefined ) {
- 'use strict';
- $.jmpress("defaults").duration = {
- defaultValue: -1
- ,defaultAction: "next"
- ,barSelector: undefined
- ,barProperty: "width"
- ,barPropertyStart: "0"
- ,barPropertyEnd: "100%"
- };
- $.jmpress("initStep", function( step, eventData ) {
- eventData.stepData.duration = eventData.data.duration && parseInt(eventData.data.duration, 10);
- eventData.stepData.durationAction = eventData.data.durationAction;
- });
- $.jmpress("setInactive", function( step, eventData ) {
- var settings = eventData.settings,
- durationSettings = settings.duration,
- current = eventData.current;
- var dur = eventData.stepData.duration || durationSettings.defaultValue;
- if( current.durationTimeout ) {
- if( durationSettings.barSelector ) {
- var css = {
- transitionProperty: durationSettings.barProperty
- ,transitionDuration: '0'
- ,transitionDelay: '0'
- ,transitionTimingFunction: 'linear'
- };
- css[durationSettings.barProperty] = durationSettings.barPropertyStart;
- var bars = $(durationSettings.barSelector);
- $.jmpress("css", bars, css);
- bars.each(function(idx, element) {
- var next = $(element).next();
- var parent = $(element).parent();
- $(element).detach();
- if(next.length) {
- next.insertBefore(element);
- } else {
- parent.append(element);
- }
- });
- }
- clearTimeout(current.durationTimeout);
- delete current.durationTimeout;
- }
- });
- $.jmpress("setActive", function( step, eventData ) {
- var settings = eventData.settings,
- durationSettings = settings.duration,
- current = eventData.current;
- var dur = eventData.stepData.duration || durationSettings.defaultValue;
- if( dur && dur > 0 ) {
- if( durationSettings.barSelector ) {
- var css = {
- transitionProperty: durationSettings.barProperty
- ,transitionDuration: (dur-settings.transitionDuration*2/3-100)+"ms"
- ,transitionDelay: (settings.transitionDuration*2/3)+'ms'
- ,transitionTimingFunction: 'linear'
- };
- css[durationSettings.barProperty] = durationSettings.barPropertyEnd;
- $.jmpress("css", $(durationSettings.barSelector), css);
- }
- var jmpress = this;
- if(current.durationTimeout) {
- clearTimeout(current.durationTimeout);
- current.durationTimeout = undefined;
- }
- current.durationTimeout = setTimeout(function() {
- var action = eventData.stepData.durationAction || durationSettings.defaultAction;
- $(jmpress).jmpress(action);
- }, dur);
- }
- });
- }(jQuery, document, window));
- /*
- * jmpress.presentation-mode plugin
- * Display a window for the presenter with notes and a control and view of the
- * presentation
- */
- (function( $, document, window, undefined ) {
- 'use strict';
- var $jmpress = $.jmpress;
- var PREFIX = "jmpress-presentation-";
- /* FUNCTIONS */
- function randomString() {
- return "" + Math.round(Math.random() * 100000, 0);
- }
- /* DEFAULTS */
- $jmpress("defaults").presentationMode = {
- use: true,
- url: "presentation-screen.html",
- notesUrl: false,
- transferredValues: ["userZoom", "userTranslateX", "userTranslateY"]
- };
- $jmpress("defaults").keyboard.keys[80] = "presentationPopup"; // p key
- /* HOOKS */
- $jmpress("afterInit", function( nil, eventData) {
- var current = eventData.current;
- current.selectMessageListeners = [];
- if(eventData.settings.presentationMode.use) {
- window.addEventListener("message", function(event) {
- // We do not test orgin, because we want to accept messages
- // from all orgins
- try {
- if(typeof event.data !== "string" || event.data.indexOf(PREFIX) !== 0) {
- return;
- }
- var json = JSON.parse(event.data.slice(PREFIX.length));
- switch(json.type) {
- case "select":
- $.each(eventData.settings.presentationMode.transferredValues, function(idx, name) {
- eventData.current[name] = json[name];
- });
- if(/[a-z0-9\-]+/i.test(json.targetId) && typeof json.substep in {number:1,undefined:1}) {
- $(eventData.jmpress).jmpress("select", {step: "#"+json.targetId, substep: json.substep}, json.reason);
- } else {
- $.error("For security reasons the targetId must match /[a-z0-9\\-]+/i and substep must be a number.");
- }
- break;
- case "listen":
- current.selectMessageListeners.push(event.source);
- break;
- case "ok":
- clearTimeout(current.presentationPopupTimeout);
- break;
- case "read":
- try {
- event.source.postMessage(PREFIX + JSON.stringify({type: "url", url: window.location.href, notesUrl: eventData.settings.presentationMode.notesUrl}), "*");
- } catch(e) {
- $.error("Cannot post message to source: " + e);
- }
- break;
- default:
- throw "Unknown message type: " + json.type;
- }
- } catch(e) {
- $.error("Received message is malformed: " + e);
- }
- });
- try {
- if(window.parent && window.parent !== window) {
- window.parent.postMessage(PREFIX + JSON.stringify({
- "type": "afterInit"
- }), "*");
- }
- } catch(e) {
- $.error("Cannot post message to parent: " + e);
- }
- }
- });
- $jmpress("afterDeinit", function( nil, eventData) {
- if(eventData.settings.presentationMode.use) {
- try {
- if(window.parent && window.parent !== window) {
- window.parent.postMessage(PREFIX + JSON.stringify({
- "type": "afterDeinit"
- }), "*");
- }
- } catch(e) {
- $.error("Cannot post message to parent: " + e);
- }
- }
- });
- $jmpress("setActive", function( step, eventData) {
- var stepId = $(eventData.delegatedFrom).attr("id"),
- substep = eventData.substep,
- reason = eventData.reason;
- $.each(eventData.current.selectMessageListeners, function(idx, listener) {
- try {
- var msg = {
- "type": "select",
- "targetId": stepId,
- "substep": substep,
- "reason": reason
- };
- $.each(eventData.settings.presentationMode.transferredValues, function(idx, name) {
- msg[name] = eventData.current[name];
- });
- listener.postMessage(PREFIX + JSON.stringify(msg), "*");
- } catch(e) {
- $.error("Cannot post message to listener: " + e);
- }
- });
- });
- $jmpress("register", "presentationPopup", function() {
- function trySend() {
- jmpress.jmpress("current").presentationPopupTimeout = setTimeout(trySend, 100);
- try {
- popup.postMessage(PREFIX + JSON.stringify({type: "url", url: window.location.href, notesUrl: jmpress.jmpress("settings").presentationMode.notesUrl}), "*");
- } catch(e) {
- }
- }
- var jmpress = $(this),
- popup;
- if(jmpress.jmpress("settings").presentationMode.use) {
- popup = window.open($(this).jmpress("settings").presentationMode.url);
- jmpress.jmpress("current").presentationPopupTimeout = setTimeout(trySend, 100);
- }
- });
- }(jQuery, document, window));
|