/*! Hammer.JS - v1.0.6dev - 2013-04-10 * http://eightmedia.github.com/hammer.js * * Copyright (c) 2013 Jorik Tangelder ; * Licensed under the MIT license */(function(window,undefined){'use strict';var Hammer=function(element,options){return new Hammer.Instance(element,options||{});};Hammer.defaults={stop_browser_behavior:{userSelect:'none',touchAction:'none',touchCallout:'none',contentZooming:'none',userDrag:'none',tapHighlightColor:'rgba(0,0,0,0)'}};Hammer.HAS_POINTEREVENTS=navigator.pointerEnabled||navigator.msPointerEnabled;Hammer.HAS_TOUCHEVENTS=('ontouchstart'in window);Hammer.MOBILE_REGEX=/mobile|tablet|ip(ad|hone|od)|android/i;Hammer.NO_MOUSEEVENTS=Hammer.HAS_TOUCHEVENTS&&navigator.userAgent.match(Hammer.MOBILE_REGEX);Hammer.EVENT_TYPES={};Hammer.DIRECTION_DOWN='down';Hammer.DIRECTION_LEFT='left';Hammer.DIRECTION_UP='up';Hammer.DIRECTION_RIGHT='right';Hammer.POINTER_MOUSE='mouse';Hammer.POINTER_TOUCH='touch';Hammer.POINTER_PEN='pen';Hammer.EVENT_START='start';Hammer.EVENT_MOVE='move';Hammer.EVENT_END='end';Hammer.DOCUMENT=document;Hammer.plugins={};Hammer.READY=false;function setup(){if(Hammer.READY){return;} Hammer.event.determineEventTypes();for(var name in Hammer.gestures){if(Hammer.gestures.hasOwnProperty(name)){Hammer.detection.register(Hammer.gestures[name]);}} Hammer.event.onTouch(Hammer.DOCUMENT,Hammer.EVENT_MOVE,Hammer.detection.detect);Hammer.event.onTouch(Hammer.DOCUMENT,Hammer.EVENT_END,Hammer.detection.detect);Hammer.READY=true;} Hammer.Instance=function(element,options){var self=this;setup();this.element=element;this.enabled=true;this.options=Hammer.utils.extend(Hammer.utils.extend({},Hammer.defaults),options||{});if(this.options.stop_browser_behavior){Hammer.utils.stopDefaultBrowserBehavior(this.element,this.options.stop_browser_behavior);} Hammer.event.onTouch(element,Hammer.EVENT_START,function(ev){if(self.enabled){Hammer.detection.startDetect(self,ev);}});return this;};Hammer.Instance.prototype={on:function onEvent(gesture,handler){var gestures=gesture.split(' ');for(var t=0;t0&&eventType==Hammer.EVENT_END){eventType=Hammer.EVENT_MOVE;} else if(!count_touches){eventType=Hammer.EVENT_END;} if(!count_touches&&last_move_event!==null){ev=last_move_event;} else{last_move_event=ev;} handler.call(Hammer.detection,self.collectEventData(element,eventType,ev));if(Hammer.HAS_POINTEREVENTS&&eventType==Hammer.EVENT_END){count_touches=Hammer.PointerEvent.updatePointer(eventType,ev);}} if(!count_touches){last_move_event=null;enable_detect=false;touch_triggered=false;Hammer.PointerEvent.reset();}});},determineEventTypes:function determineEventTypes(){var types;if(Hammer.HAS_POINTEREVENTS){types=Hammer.PointerEvent.getEvents();} else if(Hammer.NO_MOUSEEVENTS){types=['touchstart','touchmove','touchend touchcancel'];} else{types=['touchstart mousedown','touchmove mousemove','touchend touchcancel mouseup'];} Hammer.EVENT_TYPES[Hammer.EVENT_START]=types[0];Hammer.EVENT_TYPES[Hammer.EVENT_MOVE]=types[1];Hammer.EVENT_TYPES[Hammer.EVENT_END]=types[2];},getTouchList:function getTouchList(ev){if(Hammer.HAS_POINTEREVENTS){return Hammer.PointerEvent.getTouchList();} else if(ev.touches){return ev.touches;} else{return[{identifier:1,pageX:ev.pageX,pageY:ev.pageY,target:ev.target}];}},collectEventData:function collectEventData(element,eventType,ev){var touches=this.getTouchList(ev,eventType);var pointerType=Hammer.POINTER_TOUCH;if(ev.type.match(/mouse/)||Hammer.PointerEvent.matchType(Hammer.POINTER_MOUSE,ev)){pointerType=Hammer.POINTER_MOUSE;} return{center:Hammer.utils.getCenter(touches),timeStamp:new Date().getTime(),target:ev.target,touches:touches,eventType:eventType,pointerType:pointerType,srcEvent:ev,preventDefault:function(){if(this.srcEvent.preventManipulation){this.srcEvent.preventManipulation();} if(this.srcEvent.preventDefault){this.srcEvent.preventDefault();}},stopPropagation:function(){this.srcEvent.stopPropagation();},stopDetect:function(){return Hammer.detection.stopDetect();}};}};Hammer.PointerEvent={pointers:{},getTouchList:function(){var self=this;var touchlist=[];Object.keys(self.pointers).sort().forEach(function(id){touchlist.push(self.pointers[id]);});return touchlist;},updatePointer:function(type,pointerEvent){if(type==Hammer.EVENT_END){this.pointers={};} else{pointerEvent.identifier=pointerEvent.pointerId;this.pointers[pointerEvent.pointerId]=pointerEvent;} return Object.keys(this.pointers).length;},matchType:function(pointerType,ev){if(!ev.pointerType){return false;} var types={};types[Hammer.POINTER_MOUSE]=(ev.pointerType==ev.MSPOINTER_TYPE_MOUSE||ev.pointerType==Hammer.POINTER_MOUSE);types[Hammer.POINTER_TOUCH]=(ev.pointerType==ev.MSPOINTER_TYPE_TOUCH||ev.pointerType==Hammer.POINTER_TOUCH);types[Hammer.POINTER_PEN]=(ev.pointerType==ev.MSPOINTER_TYPE_PEN||ev.pointerType==Hammer.POINTER_PEN);return types[pointerType];},getEvents:function(){return['pointerdown MSPointerDown','pointermove MSPointerMove','pointerup pointercancel MSPointerUp MSPointerCancel'];},reset:function(){this.pointers={};}};Hammer.utils={extend:function extend(dest,src,merge){for(var key in src){if(dest[key]!==undefined&&merge){continue;} dest[key]=src[key];} return dest;},hasParent:function(node,parent){while(node){if(node==parent){return true;} node=node.parentNode;} return false;},getCenter:function getCenter(touches){var valuesX=[],valuesY=[];for(var t=0,len=touches.length;t=y){return touch1.pageX-touch2.pageX>0?Hammer.DIRECTION_LEFT:Hammer.DIRECTION_RIGHT;} else{return touch1.pageY-touch2.pageY>0?Hammer.DIRECTION_UP:Hammer.DIRECTION_DOWN;}},getDistance:function getDistance(touch1,touch2){var x=touch2.pageX-touch1.pageX,y=touch2.pageY-touch1.pageY;return Math.sqrt((x*x)+(y*y));},getScale:function getScale(start,end){if(start.length>=2&&end.length>=2){return this.getDistance(end[0],end[1])/this.getDistance(start[0],start[1]);} return 1;},getRotation:function getRotation(start,end){if(start.length>=2&&end.length>=2){return this.getAngle(end[1],end[0])- this.getAngle(start[1],start[0]);} return 0;},isVertical:function isVertical(direction){return(direction==Hammer.DIRECTION_UP||direction==Hammer.DIRECTION_DOWN);},stopDefaultBrowserBehavior:function stopDefaultBrowserBehavior(element,css_props){var prop,vendors=['webkit','khtml','moz','ms','o',''];if(!css_props||!element.style){return;} for(var i=0;ib.index){return 1;} return 0;});return this.gestures;}};Hammer.gestures=Hammer.gestures||{};Hammer.gestures.Hold={name:'hold',index:10,defaults:{hold_timeout:500,hold_threshold:1},timer:null,handler:function holdGesture(ev,inst){switch(ev.eventType){case Hammer.EVENT_START:clearTimeout(this.timer);Hammer.detection.current.name=this.name;this.timer=setTimeout(function(){if(Hammer.detection.current.name=='hold'){inst.trigger('hold',ev);}},inst.options.hold_timeout);break;case Hammer.EVENT_MOVE:if(ev.distance>inst.options.hold_threshold){clearTimeout(this.timer);} break;case Hammer.EVENT_END:clearTimeout(this.timer);break;}}};Hammer.gestures.Tap={name:'tap',index:100,defaults:{tap_max_touchtime:250,tap_max_distance:10,tap_always:true,doubletap_distance:20,doubletap_interval:300},handler:function tapGesture(ev,inst){if(ev.eventType==Hammer.EVENT_END){var prev=Hammer.detection.previous,did_doubletap=false;if(ev.deltaTime>inst.options.tap_max_touchtime||ev.distance>inst.options.tap_max_distance){return;} if(prev&&prev.name=='tap'&&(ev.timeStamp-prev.lastEvent.timeStamp)0&&ev.touches.length>inst.options.swipe_max_touches){return;} if(ev.velocityX>inst.options.swipe_velocity||ev.velocityY>inst.options.swipe_velocity){inst.trigger(this.name,ev);inst.trigger(this.name+ev.direction,ev);}}}};Hammer.gestures.Drag={name:'drag',index:50,defaults:{drag_min_distance:10,drag_max_touches:1,drag_block_horizontal:false,drag_block_vertical:false,drag_lock_to_axis:false,drag_lock_min_distance:25},triggered:false,handler:function dragGesture(ev,inst){if(Hammer.detection.current.name!=this.name&&this.triggered){inst.trigger(this.name+'end',ev);this.triggered=false;return;} if(inst.options.drag_max_touches>0&&ev.touches.length>inst.options.drag_max_touches){return;} switch(ev.eventType){case Hammer.EVENT_START:this.triggered=false;break;case Hammer.EVENT_MOVE:if(ev.distanceinst.options.transform_min_rotation){inst.trigger('rotate',ev);} if(scale_threshold>inst.options.transform_min_scale){inst.trigger('pinch',ev);inst.trigger('pinch'+((ev.scale<1)?'in':'out'),ev);} break;case Hammer.EVENT_END:if(this.triggered){inst.trigger(this.name+'end',ev);} this.triggered=false;break;}}};Hammer.gestures.Touch={name:'touch',index:-Infinity,defaults:{prevent_default:false,prevent_mouseevents:false},handler:function touchGesture(ev,inst){if(inst.options.prevent_mouseevents&&ev.pointerType==Hammer.POINTER_MOUSE){ev.stopDetect();return;} if(inst.options.prevent_default){ev.preventDefault();} if(ev.eventType==Hammer.EVENT_START){inst.trigger(this.name,ev);}}};Hammer.gestures.Release={name:'release',index:Infinity,handler:function releaseGesture(ev,inst){if(ev.eventType==Hammer.EVENT_END){inst.trigger(this.name,ev);}}};if(typeof module==='object'&&typeof module.exports==='object'){module.exports=Hammer;} else{window.Hammer=Hammer;if(typeof window.define==='function'&&window.define.amd){window.define('hammer',[],function(){return Hammer;});}}})(this);(function($,undefined){'use strict';if($===undefined){return;} Hammer.event.bindDom=function(element,eventTypes,handler){$(element).on(eventTypes,function(ev){var data=ev.originalEvent||ev;if(data.pageX===undefined){data.pageX=ev.pageX;data.pageY=ev.pageY;} if(!data.target){data.target=ev.target;} if(data.which===undefined){data.which=data.button;} if(!data.preventDefault){data.preventDefault=ev.preventDefault;} if(!data.stopPropagation){data.stopPropagation=ev.stopPropagation;} handler.call(this,data);});};Hammer.Instance.prototype.on=function(types,handler){return $(this.element).on(types,handler);};Hammer.Instance.prototype.off=function(types,handler){return $(this.element).off(types,handler);};Hammer.Instance.prototype.trigger=function(gesture,eventData){var el=$(this.element);if(el.has(eventData.target).length){el=$(eventData.target);} return el.trigger({type:gesture,gesture:eventData});};$.fn.hammer=function(options){return this.each(function(){var el=$(this);var inst=el.data('hammer');if(!inst){el.data('hammer',new Hammer(this,options||{}));} else if(inst&&options){Hammer.utils.extend(inst.options,options);}});};})(window.jQuery||window.Zepto);