;(function () { 'use strict'; /** * @namespace */ db.utils = { /** * Binds a component to jQuery as plugin. All methods exposed from the component is available as $(el).component('method'); * @param {object} component A module following the revealing module pattern */ jQueryPlugin: function(component){ $.fn[component] = function( method ) { if ( db.libs[component][method] ) { arguments[0] = this; return db.libs[component][method].apply(null, arguments); } else if( typeof method === 'object' || ! method ){ return db.libs[component].init.apply(null, this); } else { console.warn('db.libs.' + component + ' > no method with name ' + method + ' exists or is exposed'); } }; }, /** * Check if a component is initialized * @param {jQuery} el jQuery element to check * @param {string} name the name of the component */ isInitialized: function(el, name){ if( $(el).data(name + '-init') !== true ){ return false; } return true; }, /** * Flag a element as component has initialized * @param {jQuery} el jQuery element to initialized * @param {string} name the name of the component */ initialized: function(el, name){ $(el).data(name + '-init', true); }, /** * Generate a unique integer id (unique within the entire client session). Useful for temporary DOM ids. * @param {string} prefix * @return string */ idCounter: 0, uniqueId: function(prefix) { var id = ++this.idCounter + ''; return prefix ? prefix + id : id; }, swipe: function(el){ var $el = $(el); var data = {}; data.width = $el.width(); $el.get(0).addEventListener('touchstart', function(){ var touches = event.touches[0]; data.start = { x: touches.pageX, y: touches.pageY, time: new Date() }; data.isScrolling = undefined; data.delta = {}; }, false); $el.get(0).addEventListener('touchmove', function(){ if ( event.touches.length > 1 || event.scale && event.scale !== 1) return; var touches = event.touches[0]; data.delta = { x: touches.pageX - data.start.x, y: touches.pageY - data.start.y }; if ( typeof data.isScrolling == 'undefined') { data.isScrolling = !!( data.isScrolling || Math.abs(data.delta.x) < Math.abs(data.delta.y) ); } if (!data.isScrolling) { event.preventDefault(); } }, false); $el.get(0).addEventListener('touchend', function(){ var duration = new Date() - data.start.time; var isValidSlide = Number(duration) < 250 && Math.abs(data.delta.x) > 20 || Math.abs(data.delta.x) > data.width/2; if(isValidSlide){ $el.trigger('swipe'); if(data.start.x < data.delta.x){ $el.trigger('swipe:left'); } else { $el.trigger('swipe:right'); } } }, false); }, tap: function(el) { var $el = $(el); var caption = $el.find('.caption'); if(caption) { if(!caption.hasClass('fadeOut')){ caption.removeClass('fadeIn'); caption.addClass('fadeOut'); } else { caption.removeClass('fadeOut'); caption.addClass('fadeIn'); } } } }; })();