{"version":3,"mappings":"AAoBA,oCAEA,YAAkB,aAGlBA,yBAGAA,qBAEAA,wBACAC,+EACAA,oEAEA,8BACAC,KAEA,0BACAC,KAKAH,wBACA,yBAGAA,2BACA,4BAGAA,0BACA,UAGAA,oBACAI,IACAA,uCACAA,kBACAA,wBAGAJ,uBACAI,IACAA,iBACAA,mBACGA,sBACHA,wBAEAA,mBAIAJ,qBACAA,UACAA,cAGAA,kBACA,6BACA,KACA,wCACA,0DACAI,mBAKAJ,gCAMA,GALA,qBACAK,IACAD,WAEAC,YACAD,WAEA,GADAA,kDACAA,mCACAA,qBACA,8BACA,kCACAA,qBACAE,IAIA,kBACA,mCACA,wBACA,eAIAD,KAHAD,4BAGAG,QAFAH,KAKA,UAIAI,wBAGA,GAFAC,QAEA,+BACA,QAGA,GAFAL,kBAAwBM,UAExBA,oBAMI,CACJ,gBACA,WACA,uBACAD,QAGA,SACA,gBACAE,mBACAC,OACAC,KACA,eACAA,UAGA,wBACAP,YACM,8BAON,SALA,aADAA,aACAM,EACA,0BACAC,WAMA,YAAoBC,WAAkBA,IACtCC,+BAGA,SAnCA,aAFAV,gBAAqBK,OACrBJ,oBAA6BI,WAC7BA,EACAD,UAsCA,WAEA,oCACA,iCAGI,CACJ,2BACAO,YACAC,qBACAC,iCACA,yBACAC,wBAEAC,4BACAD,wBACAE,kBAEIJ,GACJ,OAfAZ,SACAD,SAkBA,uBAEA,QADAA,gCACAkB,yDACA,eACAlB,QAKA,MACAmB,KACA,2BACA,uBAA4CC,IAAcA,KAC1DC,wBACAF,QAEA,YAcA,GAVA,sBAEA,KADAlB,mBACAqB,aACArB,gBACI,qBACJA,iBAKA,oBACA,6BACA,uBAA2CsB,IAAcA,KACzDF,wBACAF,gBAGA,gBAEAE,EADA,wBACAjB,mBAEAA,kCAEAe,QAGA,YAMA,GALG,sBACHlB,eAIA,gEACA,0EAGA,uBACAuB,4BAEA,6CAEA,GADAA,MACA,cACA,gBACAC,qBACAA,aACI,WACJ,QACA,kBACAA,KAGA,sCACA,QACAvB,gBACA,yBACA,oBAIAG,YACAA,WACAA,aACAA,kBAEAoB,mBAEA,YAGA,MADAC,OACA,QAA2BhB,WAAsBA,IAGjD,GADAiB,GADA1B,QACA,MACA,cACA,kBACAD,mBACAyB,aACK,WACL,oBACAzB,YAEAyB,MACAG,KACAC,OACAC,SACAC,WACAC,kBACA,YAAsBC,WAAsBA,IAC5CrC,uBAMA,cAKAsC,cACA,OACAF,kBACA,eACAhC,eAGAmC,eACA,eACAnC,cAOAoC,gBACA,kCACA,mBACAC,oBAIAC,GACAC,0DACAC,4CACAC,2CAGAC,GAEAC,gBACAC,gBACAC,cAEAC,aACAC,YACAC,WAEAC,YACAC,YACAC,WAgBAC,GAZAxD,cACAmB,oCACAnB,yBAEAA,kCACAA,qBAEAA,iCACAA,qBAKA,YACA,wCACAM,OACA,gBACA,SACA,wBACAG,kBAEA,SAEA,cAMAoB,KACA4B,IACAC,cACA,4BACAtD,0BACAA,iCACAA,aAIAuD,6DACAC,mEAQA5D,qCACA,gBACA6D,WACAC,yCACA,aACA,WACAzD,kBACAA,gBACAA,gBACAA,YACAA,YAGA,oCAGA,aAFA0D,qBACAA,kBACA1D,EACA,eACA0D,WAIA/D,sCADA+D,SAGA1D,8BAIA,SACAH,aAEA,sBACA,mBACA,kBACA,wBACA4D,OACAzD,qBACA,6CACA,QACA,mBACA2D,aAEAA,GACAC,WACAC,cAGA1D,wBAIA,QADAO,OACAH,IAAqBA,WAAkBA,IACvCkD,wBAKAxD,SACAA,aAGA6D,sCAEA/D,4BACAA,gCAEAA,yBAEAA,YACAA,YAGAgE,KACAjE,aAEA,yBACAC,sCACA,0BAAwCyD,IAAYA,IACpDQ,oCAGAjE,mCACA,0BAAwCyD,IAAYA,IACpDQ,mCA/cA,CAsdCC,cASD,+BACA,sCAEAA,0BAAkC,aAMlCtE,6BAEAsC,0BACAA,uCACAA,wCACAA,0CACAA,yCACAA,WAEAE,SACA+B,WACA/B,oBACAA,kBACAA,YAEA8B,+CACAhC,yBACAA,uCAGA,QACAQ,kFACA,oDAEAN,sBACAA,oBACAA,6BACAF,aACAkC,cAEAhC,kBACA,gBACAF,gEACAA,6DACAA,uDACAE,eAEAA,qBACA,gBACAF,mEACAA,gEACAA,0DACAE,UACAA,eAEAA,oBACAF,8EACAA,sEACAI,YACAJ,aAEAE,qBACAF,2EACAA,mEACAA,aAEAE,mBACAF,aACAA,aAGAE,GAOA,uBAEA8B,0BACAA,8BACAA,8BAEAtE,+BAEA,0CACA,wBACAsE,mBACAA,mBACAA,wBACG,wBACHA,mBACAA,mBACAA,wBACG,6BACHA,mBACAA,mBACAA,wBAGA,oBACA,aACA7D,UAEA,uBACA,WACAA,YACAA,YACA,UACA,qBAGA,IACA,aACAA,kBACAA,kBACA,UACA,OACAA,uBACAA,uBACA,cAEAA,4BACAA,2BAIA,wBACAqD,oBAEArD,aACAA,UACAA,4CACAA,QAAcoD,OACdpD,SAAeoD,OAEfnB,aAGAA,UACAF,oBACAE,oCACAF,mBAQA,QALAgB,aACA3B,YACA4B,mCACAC,WAEAC,IAAiBA,IAAYA,KAC7B,WACAc,oBAEA,cACA,4BACA,SACA,iCACA,gCACAjB,EAGA,eAEA,mBACA3B,KACA2C,OACA9B,YACA,MAKA,iBACA8B,YAEA3C,eACAW,yCACAE,YACAA,YACA8B,OAKA,aADArE,KACAuC,oBACA,gCAEAc,GAOAxD,+BAKA,QAHAwE,gBACAhB,WACA3B,KACA4B,IAAiBA,IAAYA,IAG7B5B,GADA8B,EADAa,KACAE,aACA,QAEA,wBACA,mBACA7C,aACAiB,GACAA,GACA6B,cACAC,cACAC,iBACAF,cACAC,cACAF,mCAEI,MAEJd,QACAlB,aAyBA,0BAEA,SAEA,aADAA,mBACAA,UACAA,mBACA+B,UAEA,iCAEA,GASAzE,wBACA,OACAA,iBADA,YACA,YACA,cACAiC,aACA4B,UACAF,UACAgB,cACAC,cACAF,+BAIA,YACA,+BACA,yBACAI,OACA7C,aACA4B,yBACAF,wBACAgB,6BACAC,4BACAF,kBAIA1E,gBASAA,uBACA,4BACA,QACA0C,IACA1C,uBACA,uBACA,mBACA,CACA6D,eACAF,gBAGA,CACAE,IACAF,WAKA3D,gBADG,8BACH,YACA,OACA6D,UACAF,YAIA,YACA,+BACA,MACA,CACAE,GAFAf,mBAEAiC,qBACApB,0BAIA,sBAOA,IAuFAjB,EAFAJ,EACAE,EAtFAhC,gBACA,2CACA,wBAGA,qCACA8B,6CAEA,SACAI,4BAaA,GAZAF,gBACAA,kBACAA,YACAA,WACAA,kCACAA,oCACAA,eACAA,eAKA,IAFA,gBADAM,8BACAkC,gCAEA,CACA,+BACAnD,4BACA4B,6BACAC,0BACAlB,mBACAA,QACAA,QACAA,aACAA,cASAA,kBACAA,mBAKA,QADAoB,aADAD,kCACArB,eACA,UACAsB,wBACA,iBAFA,CAGA,MACAD,EACA,iBADAA,GADAb,8BACAkC,8BAGI,iBAGJxC,oCACAA,sCACA,MAEAA,2BACAA,yBAGAoB,eAGA,sJACApB,6IAEAA,+BACAA,6BAEAA,GAaAA,QADAF,qCACAZ,qBAGAgB,EADAF,2BACA,CAAe,aACZA,6BACH,CAAe,QAEf,CAAe,QAEfxC,8BACAsE,yBACAA,6BACAA,2BACAA,6BACAA,+BACAA,+BAEAtE,0BACA,yBACA,4CACA0C,4CACA4B,oCACAA,uCACAA,kCAIAtE,EAncA,CAqcCsE,oBASD,0BAEAA,oCACA,yFACA/D,iBACA,kCACA+B,KACAE,aAAwBF,MACxB,sBACA9B,oDACIA,cAGJ,SAFAA,qCAKA,qCAEA8B,EAdA,GAiBA,qBACAtC,EAKA,kBACA8C,sBACAR,qCAGA2C,UATA,CACAC,WACAC,gBAQI5E,EACJ+D,4CACAhC,uBAEI,oCACJgC,2CACAhC,uCArCA,QAgDA,+BACA,sCAEAgC,0BAAkC,aAElC,2BACA/D,6BACAA,wCAEAA,4BACAP,uBACAsE,+CAGA/D,0BACA,wBACA+D,iDACA,IACA5B,GADAJ,kCACA,GACAQ,SACA0B,6BACAhB,0BACA3B,2BAEA,mBACAA,gBACAiB,2BAEA,6BACA,mBACAtC,cACAA,cAEAD,mBAKA,wBACA,uBAEA+D,kDAEA9D,GAGA8D,oCACAA,sEACAA,+CAEAtE,EA/CA,CAiDCsE,oBASD,+BACA,sCAEAA,0BAAkC,aAElC,gBACAtE,uBAIA,IACAsC,MACAQ,IALAvC,8BACAA,wCAMAA,4BACA,uCACA+B,OACAkC,OACAhC,2BAEAM,OACAR,uBACAE,IACA4C,gBACA1C,wBACAJ,KAfA,MAkBAtC,wBACAsE,8DACAA,gDAGA/D,4BACA,UACA,uCACAiE,OAEA,aACAb,eACAC,eACAD,gBACAC,iBACAyB,+BACAA,gCAEAf,qDACAc,gBACA9C,QAGA/B,0BAKA,GAJAP,sBACAsE,qDACAA,kDAEAhC,MACA,MA/CA,IA+CA,CAEA,aADAkB,kBACAjD,gBACA,mBACAiD,cACAA,cACAjD,gBAEA6E,gBACA9C,QAIA,wBACA,0BAEAgC,kDAEAd,GAGAc,oCACAA,sEACAA,iDACAA,qDAEAtE,EAhFA,CAkFCsE,oBAWD,+BACA,sCAEAA,0BAAkC,aAElC,mCACAtE,QACAsF,QACApD,SACAqD,gBACApD,uBACA5B,sBACAA,qBACA+D,uBAKAtE,mBACAO,iBACAA,4BACAP,wBACAO,YACA+D,+CACAA,6CAIA/D,2BAEAA,8BACA,wCAIA,QAFAuC,mCACA0B,WACAhB,IAAkBA,IAAYA,KAC9B,WACAC,oBACAC,gBAEAA,IACAA,gBACAA,gBAEAlD,kBACAA,eACAA,gBACAA,oBACA,mCACAA,sBACAA,sBACAkD,kBACAA,oBAEAlD,sBACAA,uBAGAD,mBAGAA,0BAEAP,sCACAO,YACA+D,kDACAA,iDAKA,wBAEA,eACA/D,0BAEA+D,kDACA/D,YACA+D,+CACAA,6CAIA9D,GAGA8D,oCACAA,sEACAA,6CAEAtE,EAvFA,CAyFCsE,oBAkBD,+BACA,sCAEAA,0BAAkC,aAElC,kBACA9D,gBACA,QACAsC,IACA0B,IACA,gBACA,WACA3C,OACAa,YACAI,YACA0B,KAEA,gBACAlC,SACAA,GAGA,6BACAA,+BACAA,wCAEAA,4BACA,gBAMA,GALAtC,wBACAsE,+CACAA,4CAGAhC,yCACAE,uBACAA,UACAA,aACAA,gBACA,SACA,4BACAA,yBACAhC,eACA8B,kBAIAA,8BAMA,QALAkC,SACAhB,YAEA3B,GADA4C,oCACAnD,OAEAmC,IAAkBA,IAAYA,KAC9B,IAEAG,IADAD,GADAD,QACAgB,kBAGAd,IAEAA,sBACAA,uBAGA,6BAEA,UACA1D,IACAkE,IAKA,aAFA5D,OAEAgD,GACA,MACA,KADAE,QACA8B,GACA,eACA,gBACA,cACAnF,UACAF,8BACAA,0BAGAC,eACAC,eAEAH,GADAmF,mBACAlF,WAEA,wBACA0D,0BACAH,cACAA,qBACA,aACAG,IACAH,0BAEAA,0BAEAU,eAGAK,gBAGAjC,YACAA,oBACAA,oBACAA,uBACAA,iBACAF,kBAEAA,0BAEA,gBACAtC,sBACAsE,kDACAA,+CAGAxB,2CACAN,oBACAA,cACAF,kBAIA,wBAEA,yDAEAE,GAGA8B,oCACAA,sEACAA,mDAEAtE,EAtIA,CAwICsE,oBAWD,+BACA,sCAEAA,0BAAkC,aAElC,qBACAtE,cACAA,wBAEA,GADAO,gCACAA,0BAEA,UACAA,4BACAC,KACA8B,wBACA/B,iBAEAA,4BACA+B,wBACA/B,mBAEAA,0BACAC,KACA8B,sBACA/B,oBAGA,wBAEA,yDACA+D,kDACAA,2CAEA/D,6BACA+B,IAGAgC,oCACAA,sEACAA,2DACAA,2DACAA,uDAEAtE,EAxCA,CA0CCsE,oBAYD,+BACA,sCAEAA,0BAAkC,aAElC,2BAEA,OACAmB,uBACAC,gBACAC,gCACAzD,gBACAC,oBACAC,kBACAjB,kDAQAqD,uBACAhB,GAAiBK,aACjBhC,GACAgC,GAAO+B,iBACPjC,GAAOiC,iBACPC,GAAOD,kBAGPnC,cACA,SACAG,iCASA,GARAJ,oBACAA,oBACAA,oBACAhD,iCACAA,yBACAA,yBACAA,yBAEA,2BAMA,QADAN,uBACAkE,MAFA,MAEA9C,OAAwC8C,IAAYA,KACpD,MAHA,MAGAA,GACA/D,oBACAC,OACAG,cAEA,SAlCA,MAoCAA,EArCA,EAqCA,CACA,YACAqD,sBAEAxD,WAvCA,KAwCAA,UACAA,UAxCA,IA0CAA,UACAC,gBAEAiE,IACAlE,UACAA,aAIAA,UACAA,iBA/BAC,iBAqCA,2BACA,oDAEAC,GAGA8D,oCACAA,sEACAA,+CAEAtE,EAtFA,CAwFCsE,oBAWD,+BACA,sCAEAA,0BAAkC,aAElC,kBAEA,2BACA9D,kBACAA,2BACAA,6BAEAA,4BACAR,wBACAsE,2DACAA,6CAGA9D,4BAGA,QAFAkC,mCACAI,WACA0B,IAAkBA,IAAYA,KAC9B,WAEAf,YADAD,oBAGAC,IACAA,iBACAA,iBACAA,mCAGAjD,0BACA,wBACA8D,kDACAA,8CAEA,MAEAE,EAGA3C,GAAiBgC,SACjBJ,IACAC,IACAC,IAEA,wBACA,mBACAzD,qBACAkE,qBAEAX,YACAC,YACA7B,eACAA,eACA8B,IAEA,yBACAvD,yBACAoD,wBACAV,UACA,cACA0B,IACA9B,cACM2C,mBAIN,OAHAb,UACA9B,WAMA,uBACAlC,kCACAkC,gBACAb,OACAA,OACAS,UACAA,QACAA,QACAA,8CACAA,aACAA,YACAA,gBACA9B,mBAMA,wBAEA,yDAEA8B,GAGAgC,oCACAA,sEACAA,+CAEAtE,EAnGA,CAqGCsE,oBAcD,+BACA,sCAEAA,0BAAkC,aAElC,+BACA,6BACAtE,UAGAA,kBAMA,QALAO,qBACAA,yBACAA,oCACAA,2BAIAA,4BACA,0BAMA,GALAC,uBAEA8D,2DACAA,2CAEA,+BACAhC,wBACA,8CAEA,SACA,wBACA,mBAEA,IADA,WACA/B,gBACAuC,IAGAvC,mCACAiC,gBACAA,YACAA,cACAA,cACAjC,mBAEIA,WAGJA,4BAIA,QAHAuC,SACA0B,mCACAhB,WACA3B,IAAkBA,IAAYA,KAC9B,WAEA8B,YADAF,mBAEA,KACA,oBACAgB,eAEAvE,cACAkE,cACAjE,qBACA,qBACAsE,iBACAtE,oBAIA,OAFAmE,uDACA/D,gBAKAA,0BACA,wBAIA,GAHA6E,gBACAd,kDACAA,8CACA5B,+CAEA,2BAKA,YAJA,oBACAF,cACAjC,kBAOA,GAFAA,WAEA,uCAEA,uBACAA,mCACAiC,cACAA,2BACAjC,mBAKA,wBAEA,yDAEAiC,GAGA8B,oCACAA,sEACAA,2CACAA,uDAEAtE,EA7GA,CA+GCsE,oBASD,+BACA,sCAEAA,0BAAkC,aAElC,gDACA/D,IACA,kDACA+D,oCACAhC,yBACAgC,oBAIAtE,oBAEA,MACAsC,iBACAE,IAEAE,GACA+C,gBACAK,cACAC,aACA7D,gBACAC,oBACA6D,iCACA,kBACArC,eACAA,mBACAD,gBACAW,oBACA,8CACAC,iBAEA/B,eACAhC,qBAEA6B,kBACA7B,sBAIAuC,cACAW,kBACAf,6BACAA,gDACAnC,gBACA6E,gBACA5E,wBACAgC,IACAE,cACAA,eACAnC,iBACG+B,IAGHkC,6DACAhB,mEACA3B,sEACA,2BAEAa,GAGA4B,oCACAA,sEACAA,+CAEAtE,EAlEA,CAoECsE","names":["i","isFinite","E","P","n","u","g","r","s","m","b","D","T","B","H","_","q","R","N","window","document","setTimeout","length","C","U","S","indexOf","O","L","l","K","Y","id","type","target","listener","remove","F","e","add","t","console","a","msPointer","touch","mouse","o","MSPointerDown","MSPointerMove","MSPointerUp","touchstart","touchmove","touchend","mousedown","mousemove","mouseup","p","f","v","y","h","x","G","c","X","useCall","useCapture","navigator","M","this","eventjs","enabled","d","w","identifier","pageX","pageY","changedTouches","Array","clientX","getPropertyValue","observe","subtree","attributes","clearTimeout","Math","event","position","up","gesture","acceleration","accelerationIncludingGravity","count","z","state","wheelDelta","preventElasticBounce"],"sources":["src\\Event.js"],"sourcesContent":["/*:\r\n\t----------------------------------------------------\r\n\tevent.js : 1.1.5 : 2014/02/12 : MIT License\r\n\t----------------------------------------------------\r\n\thttps://github.com/mudcube/Event.js\r\n\t----------------------------------------------------\r\n\t1 : click, dblclick, dbltap\r\n\t1+ : tap, longpress, drag, swipe\r\n\t2+ : pinch, rotate\r\n\t : mousewheel, devicemotion, shake\r\n\t----------------------------------------------------\r\n\tIdeas for the future\r\n\t----------------------------------------------------\r\n\t* GamePad, and other input abstractions.\r\n\t* Event batching - i.e. for every x fingers down a new gesture is created.\r\n\t----------------------------------------------------\r\n\thttp://www.w3.org/TR/2011/WD-touch-events-20110505/\r\n\t----------------------------------------------------\t\r\n*/\r\n\r\nif (typeof(eventjs) === \"undefined\") var eventjs = {};\r\n\r\n(function(root) { \"use strict\";\r\n\r\n// Add custom *EventListener commands to HTMLElements (set false to prevent funkiness).\r\nroot.modifyEventListener = false;\r\n\r\n// Add bulk *EventListener commands on NodeLists from querySelectorAll and others (set false to prevent funkiness).\r\nroot.modifySelectors = false;\r\n\r\nroot.configure = function(conf) {\r\n\tif (isFinite(conf.modifyEventListener)) root.modifyEventListener = conf.modifyEventListener;\r\n\tif (isFinite(conf.modifySelectors)) root.modifySelectors = conf.modifySelectors;\r\n\t/// Augment event listeners\r\n\tif (eventListenersAgumented === false && root.modifyEventListener) {\r\n\t\taugmentEventListeners();\r\n\t}\r\n\tif (selectorsAugmented === false && root.modifySelectors) {\r\n\t\taugmentSelectors();\r\n\t}\r\n};\r\n\r\n// Event maintenance.\r\nroot.add = function(target, type, listener, configure) {\r\n\treturn eventManager(target, type, listener, configure, \"add\");\r\n};\r\n\r\nroot.remove = function(target, type, listener, configure) {\r\n\treturn eventManager(target, type, listener, configure, \"remove\");\r\n};\r\n\r\nroot.returnFalse = function(event) {\r\n\treturn false;\t\r\n};\r\n\r\nroot.stop = function(event) {\r\n\tif (!event) return;\r\n\tif (event.stopPropagation) event.stopPropagation();\r\n\tevent.cancelBubble = true; // <= IE8\r\n\tevent.cancelBubbleCount = 0;\r\n};\r\n\r\nroot.prevent = function(event) {\r\n\tif (!event) return;\r\n\tif (event.preventDefault) {\r\n\t\tevent.preventDefault();\r\n\t} else if (event.preventManipulation) {\r\n\t\tevent.preventManipulation(); // MS\r\n\t} else {\r\n\t\tevent.returnValue = false; // <= IE8\r\n\t}\r\n};\r\n\r\nroot.cancel = function(event) {\r\n\troot.stop(event);\r\n\troot.prevent(event);\r\n};\r\n\r\nroot.blur = function() { // Blurs the focused element. Useful when using eventjs.cancel as canceling will prevent focused elements from being blurred.\r\n\tvar node = document.activeElement;\r\n\tif (!node) return;\r\n\tvar nodeName = document.activeElement.nodeName;\r\n\tif (nodeName === \"INPUT\" || nodeName === \"TEXTAREA\" || node.contentEditable === \"true\") {\r\n\t\tif (node.blur) node.blur();\r\n\t}\r\n};\r\n\r\n// Check whether event is natively supported (via @kangax)\r\nroot.getEventSupport = function (target, type) {\r\n\tif (typeof(target) === \"string\") {\r\n\t\ttype = target;\r\n\t\ttarget = window;\r\n\t}\r\n\ttype = \"on\" + type;\r\n\tif (type in target) return true;\r\n\tif (!target.setAttribute) target = document.createElement(\"div\");\r\n\tif (target.setAttribute && target.removeAttribute) {\r\n\t\ttarget.setAttribute(type, \"\");\r\n\t\tvar isSupported = typeof target[type] === \"function\";\r\n\t\tif (typeof target[type] !== \"undefined\") target[type] = null;\r\n\t\ttarget.removeAttribute(type);\r\n\t\treturn isSupported;\r\n\t}\r\n};\r\n\r\nvar clone = function (obj) {\r\n\tif (!obj || typeof (obj) !== 'object') return obj;\r\n\tvar temp = new obj.constructor();\r\n\tfor (var key in obj) {\r\n\t\tif (!obj[key] || typeof (obj[key]) !== 'object') {\r\n\t\t\ttemp[key] = obj[key];\r\n\t\t} else { // clone sub-object\r\n\t\t\ttemp[key] = clone(obj[key]);\r\n\t\t}\r\n\t}\r\n\treturn temp;\r\n};\r\n\r\n/// Handle custom *EventListener commands.\r\nvar eventManager = function(target, type, listener, configure, trigger, fromOverwrite) {\r\n\tconfigure = configure || {};\r\n\t// Check whether target is a configuration variable;\r\n\tif (String(target) === \"[object Object]\") {\r\n\t\tvar data = target;\r\n\t\ttarget = data.target; delete data.target;\r\n\t\t///\r\n\t\tif (data.type && data.listener) {\r\n\t\t\ttype = data.type; delete data.type;\r\n\t\t\tlistener = data.listener; delete data.listener;\r\n\t\t\tfor (var key in data) {\r\n\t\t\t\tconfigure[key] = data[key];\r\n\t\t\t}\r\n\t\t} else { // specialness\r\n\t\t\tfor (var param in data) {\r\n\t\t\t\tvar value = data[param];\r\n\t\t\t\tif (typeof(value) === \"function\") continue;\r\n\t\t\t\tconfigure[param] = value;\r\n\t\t\t}\r\n\t\t\t///\r\n\t\t\tvar ret = {};\r\n\t\t\tfor (var key in data) {\r\n\t\t\t\tvar param = key.split(\",\");\r\n\t\t\t\tvar o = data[key];\r\n\t\t\t\tvar conf = {};\r\n\t\t\t\tfor (var k in configure) { // clone base configuration\r\n\t\t\t\t\tconf[k] = configure[k];\r\n\t\t\t\t}\r\n\t\t\t\t///\r\n\t\t\t\tif (typeof(o) === \"function\") { // without configuration\r\n\t\t\t\t\tvar listener = o;\r\n\t\t\t\t} else if (typeof(o.listener) === \"function\") { // with configuration\r\n\t\t\t\t\tvar listener = o.listener;\r\n\t\t\t\t\tfor (var k in o) { // merge configure into base configuration\r\n\t\t\t\t\t\tif (typeof(o[k]) === \"function\") continue;\r\n\t\t\t\t\t\tconf[k] = o[k];\r\n\t\t\t\t\t}\r\n\t\t\t\t} else { // not a listener\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\t///\r\n\t\t\t\tfor (var n = 0; n < param.length; n ++) {\r\n\t\t\t\t\tret[key] = eventjs.add(target, param[n], listener, conf, trigger);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn ret;\r\n\t\t}\r\n\t}\r\n\t///\r\n\tif (!target || !type || !listener) return;\r\n\t// Check for element to load on interval (before onload).\r\n\tif (typeof(target) === \"string\" && type === \"ready\") {\r\n\t\tif (window.eventjs_stallOnReady) { /// force stall for scripts to load\r\n\t\t\ttype = \"load\";\r\n\t\t\ttarget = window;\r\n\t\t} else { //\r\n\t\t\tvar time = (new Date()).getTime();\r\n\t\t\tvar timeout = configure.timeout;\r\n\t\t\tvar ms = configure.interval || 1000 / 60;\r\n\t\t\tvar interval = window.setInterval(function() {\r\n\t\t\t\tif ((new Date()).getTime() - time > timeout) {\r\n\t\t\t\t\twindow.clearInterval(interval);\r\n\t\t\t\t}\r\n\t\t\t\tif (document.querySelector(target)) {\r\n\t\t\t\t\twindow.clearInterval(interval);\r\n\t\t\t\t\tsetTimeout(listener, 1);\r\n\t\t\t\t}\r\n\t\t\t}, ms);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\t// Get DOM element from Query Selector.\r\n\tif (typeof(target) === \"string\") {\r\n\t\ttarget = document.querySelectorAll(target);\r\n\t\tif (target.length === 0) return createError(\"Missing target on listener!\", arguments); // No results.\r\n\t\tif (target.length === 1) { // Single target.\r\n\t\t\ttarget = target[0];\r\n\t\t}\r\n\t}\r\n\r\n\t/// Handle multiple targets.\r\n\tvar event;\r\n\tvar events = {};\r\n\tif (target.length > 0 && target !== window) { \r\n\t\tfor (var n0 = 0, length0 = target.length; n0 < length0; n0 ++) {\r\n\t\t\tevent = eventManager(target[n0], type, listener, clone(configure), trigger);\r\n\t\t\tif (event) events[n0] = event;\r\n\t\t}\t\r\n\t\treturn createBatchCommands(events);\r\n\t}\r\n\r\n\t/// Check for multiple events in one string.\r\n\tif (typeof(type) === \"string\") {\r\n\t\ttype = type.toLowerCase();\r\n\t\tif (type.indexOf(\" \") !== -1) {\r\n\t\t\ttype = type.split(\" \");\r\n\t\t} else if (type.indexOf(\",\") !== -1) {\r\n\t\t\ttype = type.split(\",\");\r\n\t\t}\r\n\t}\r\n\t\r\n\t/// Attach or remove multiple events associated with a target.\r\n\tif (typeof(type) !== \"string\") { // Has multiple events.\r\n\t\tif (typeof(type.length) === \"number\") { // Handle multiple listeners glued together.\r\n\t\t\tfor (var n1 = 0, length1 = type.length; n1 < length1; n1 ++) { // Array [type]\r\n\t\t\t\tevent = eventManager(target, type[n1], listener, clone(configure), trigger);\r\n\t\t\t\tif (event) events[type[n1]] = event;\r\n\t\t\t}\r\n\t\t} else { // Handle multiple listeners.\r\n\t\t\tfor (var key in type) { // Object {type}\r\n\t\t\t\tif (typeof(type[key]) === \"function\") { // without configuration.\r\n\t\t\t\t\tevent = eventManager(target, key, type[key], clone(configure), trigger);\r\n\t\t\t\t} else { // with configuration.\r\n\t\t\t\t\tevent = eventManager(target, key, type[key].listener, clone(type[key]), trigger);\r\n\t\t\t\t}\r\n\t\t\t\tif (event) events[key] = event;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn createBatchCommands(events);\r\n\t} else if (type.indexOf(\"on\") === 0) { // to support things like \"onclick\" instead of \"click\"\r\n\t\ttype = type.substr(2);\r\n\t}\r\n\r\n\t// Ensure listener is a function.\r\n\tif (typeof(target) !== \"object\") return createError(\"Target is not defined!\", arguments);\r\n\tif (typeof(listener) !== \"function\") return createError(\"Listener is not a function!\", arguments);\r\n\r\n\t// Generate a unique wrapper identifier.\r\n\tvar useCapture = configure.useCapture || false;\r\n\tvar id = getID(target) + \".\" + getID(listener) + \".\" + (useCapture ? 1 : 0);\r\n\t// Handle the event.\r\n\tif (root.Gesture && root.Gesture._gestureHandlers[type]) { // Fire custom event.\r\n\t\tid = type + id;\r\n\t\tif (trigger === \"remove\") { // Remove event listener.\r\n\t\t\tif (!wrappers[id]) return; // Already removed.\r\n\t\t\twrappers[id].remove();\r\n\t\t\tdelete wrappers[id];\r\n\t\t} else if (trigger === \"add\") { // Attach event listener.\r\n\t\t\tif (wrappers[id]) {\r\n\t\t\t\twrappers[id].add();\r\n\t\t\t\treturn wrappers[id]; // Already attached.\r\n\t\t\t}\r\n\t\t\t// Retains \"this\" orientation.\r\n\t\t\tif (configure.useCall && !root.modifyEventListener) {\r\n\t\t\t\tvar tmp = listener;\r\n\t\t\t\tlistener = function(event, self) {\r\n\t\t\t\t\tfor (var key in self) event[key] = self[key];\r\n\t\t\t\t\treturn tmp.call(target, event);\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\t// Create listener proxy.\r\n\t\t\tconfigure.gesture = type; \r\n\t\t\tconfigure.target = target;\r\n\t\t\tconfigure.listener = listener;\r\n\t\t\tconfigure.fromOverwrite = fromOverwrite;\r\n\t\t\t// Record wrapper.\r\n\t\t\twrappers[id] = root.proxy[type](configure); \r\n\t\t}\r\n\t\treturn wrappers[id];\r\n\t} else { // Fire native event.\r\n\t\tvar eventList = getEventList(type);\r\n\t\tfor (var n = 0, eventId; n < eventList.length; n ++) {\r\n\t\t\ttype = eventList[n];\r\n\t\t\teventId = type + \".\" + id;\r\n\t\t\tif (trigger === \"remove\") { // Remove event listener.\r\n\t\t\t\tif (!wrappers[eventId]) continue; // Already removed.\r\n\t\t\t\ttarget[remove](type, listener, useCapture); \r\n\t\t\t\tdelete wrappers[eventId];\r\n\t\t\t} else if (trigger === \"add\") { // Attach event listener.\r\n\t\t\t\tif (wrappers[eventId]) return wrappers[eventId]; // Already attached.\r\n\t\t\t\ttarget[add](type, listener, useCapture); \r\n\t\t\t\t// Record wrapper.\r\n\t\t\t\twrappers[eventId] = { \r\n\t\t\t\t\tid: eventId,\r\n\t\t\t\t\ttype: type,\r\n\t\t\t\t\ttarget: target,\r\n\t\t\t\t\tlistener: listener,\r\n\t\t\t\t\tremove: function() {\r\n\t\t\t\t\t\tfor (var n = 0; n < eventList.length; n ++) {\r\n\t\t\t\t\t\t\troot.remove(target, eventList[n], listener, configure);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn wrappers[eventId];\r\n\t}\r\n};\r\n\r\n/// Perform batch actions on multiple events.\r\nvar createBatchCommands = function(events) {\r\n\treturn {\r\n\t\tremove: function() { // Remove multiple events.\r\n\t\t\tfor (var key in events) {\r\n\t\t\t\tevents[key].remove();\r\n\t\t\t}\r\n\t\t},\r\n\t\tadd: function() { // Add multiple events.\r\n\t\t\tfor (var key in events) {\r\n\t\t\t\tevents[key].add();\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n};\r\n\r\n/// Display error message in console.\r\nvar createError = function(message, data) {\r\n\tif (typeof(console) === \"undefined\") return;\r\n\tif (typeof(console.error) === \"undefined\") return;\r\n\tconsole.error(message, data);\r\n};\r\n\r\n/// Handle naming discrepancies between platforms.\r\nvar pointerDefs = {\r\n\t\"msPointer\": [ \"MSPointerDown\", \"MSPointerMove\", \"MSPointerUp\" ],\r\n\t\"touch\": [ \"touchstart\", \"touchmove\", \"touchend\" ],\r\n\t\"mouse\": [ \"mousedown\", \"mousemove\", \"mouseup\" ]\r\n};\r\n\r\nvar pointerDetect = {\r\n\t// MSPointer\r\n\t\"MSPointerDown\": 0, \r\n\t\"MSPointerMove\": 1, \r\n\t\"MSPointerUp\": 2,\r\n\t// Touch\r\n\t\"touchstart\": 0,\r\n\t\"touchmove\": 1,\r\n\t\"touchend\": 2,\r\n\t// Mouse\r\n\t\"mousedown\": 0,\r\n\t\"mousemove\": 1,\r\n\t\"mouseup\": 2\r\n};\r\n\r\nvar getEventSupport = (function() {\r\n\troot.supports = {};\r\n\tif (window.navigator.msPointerEnabled) {\r\n\t\troot.supports.msPointer = true;\r\n\t}\r\n\tif (root.getEventSupport(\"touchstart\")) {\r\n\t\troot.supports.touch = true;\r\n\t}\r\n\tif (root.getEventSupport(\"mousedown\")) {\r\n\t\troot.supports.mouse = true;\r\n\t}\r\n})();\r\n\r\nvar getEventList = (function() {\r\n\treturn function(type) {\r\n\t\tvar prefix = document.addEventListener ? \"\" : \"on\"; // IE\r\n\t\tvar idx = pointerDetect[type];\r\n\t\tif (isFinite(idx)) {\r\n\t\t\tvar types = [];\r\n\t\t\tfor (var key in root.supports) {\r\n\t\t\t\ttypes.push(prefix + pointerDefs[key][idx]);\r\n\t\t\t}\r\n\t\t\treturn types;\r\n\t\t} else {\r\n\t\t\treturn [ prefix + type ];\r\n\t\t}\r\n\t};\r\n})();\r\n\r\n/// Event wrappers to keep track of all events placed in the window.\r\nvar wrappers = {};\r\nvar counter = 0;\r\nvar getID = function(object) {\r\n\tif (object === window) return \"#window\";\r\n\tif (object === document) return \"#document\";\r\n\tif (!object.uniqueID) object.uniqueID = \"e\" + counter ++;\r\n\treturn object.uniqueID;\r\n};\r\n\r\n/// Detect platforms native *EventListener command.\r\nvar add = document.addEventListener ? \"addEventListener\" : \"attachEvent\";\r\nvar remove = document.removeEventListener ? \"removeEventListener\" : \"detachEvent\";\r\n\r\n/*\r\n\tPointer.js\r\n\t----------------------------------------\r\n\tModified from; https://github.com/borismus/pointer.js\r\n*/\r\n\r\nroot.createPointerEvent = function (event, self, preventRecord) {\r\n\tvar eventName = self.gesture;\r\n\tvar target = self.target;\r\n\tvar pts = event.changedTouches || root.proxy.getCoords(event);\r\n\tif (pts.length) {\r\n\t\tvar pt = pts[0];\r\n\t\tself.pointers = preventRecord ? [] : pts;\r\n\t\tself.pageX = pt.pageX;\r\n\t\tself.pageY = pt.pageY;\r\n\t\tself.x = self.pageX;\r\n\t\tself.y = self.pageY;\r\n\t}\r\n\t///\r\n\tvar newEvent = document.createEvent(\"Event\");\r\n\tnewEvent.initEvent(eventName, true, true);\r\n\tnewEvent.originalEvent = event;\r\n\tfor (var k in self) {\r\n\t\tif (k === \"target\") continue;\r\n\t\tnewEvent[k] = self[k];\r\n\t}\r\n\t///\r\n\tvar type = newEvent.type;\r\n\tif (root.Gesture && root.Gesture._gestureHandlers[type]) { // capture custom events.\r\n//\t\ttarget.dispatchEvent(newEvent);\r\n\t\tself.oldListener.call(target, newEvent, self, false);\r\n\t}\r\n};\r\n\r\nvar eventListenersAgumented = false;\r\nvar augmentEventListeners = function() {\r\n\t/// Allows *EventListener to use custom event proxies.\r\n\tif (!window.HTMLElement) return;\r\n\tvar augmentEventListener = function(proto) {\r\n\t\tvar recall = function(trigger) { // overwrite native *EventListener's\r\n\t\t\tvar handle = trigger + \"EventListener\";\r\n\t\t\tvar handler = proto[handle];\r\n\t\t\tproto[handle] = function (type, listener, useCapture) {\r\n\t\t\t\tif (root.Gesture && root.Gesture._gestureHandlers[type]) { // capture custom events.\r\n\t\t\t\t\tvar configure = useCapture;\r\n\t\t\t\t\tif (typeof(useCapture) === \"object\") {\r\n\t\t\t\t\t\tconfigure.useCall = true;\r\n\t\t\t\t\t} else { // convert to configuration object.\r\n\t\t\t\t\t\tconfigure = {\r\n\t\t\t\t\t\t\tuseCall: true,\r\n\t\t\t\t\t\t\tuseCapture: useCapture\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t}\r\n\t\t\t\t\teventManager(this, type, listener, configure, trigger, true);\r\n//\t\t\t\t\thandler.call(this, type, listener, useCapture);\r\n\t\t\t\t} else { // use native function.\r\n\t\t\t\t\tvar types = getEventList(type);\r\n\t\t\t\t\tfor (var n = 0; n < types.length; n ++) {\r\n\t\t\t\t\t\thandler.call(this, types[n], listener, useCapture);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t};\r\n\t\trecall(\"add\");\r\n\t\trecall(\"remove\");\r\n\t};\r\n\t// NOTE: overwriting HTMLElement doesn't do anything in Firefox.\r\n\tif (navigator.userAgent.match(/Firefox/)) {\r\n\t\t// TODO: fix Firefox for the general case.\r\n\t\taugmentEventListener(HTMLDivElement.prototype);\r\n\t\taugmentEventListener(HTMLCanvasElement.prototype);\r\n\t} else {\r\n\t\taugmentEventListener(HTMLElement.prototype);\r\n\t}\r\n\taugmentEventListener(document);\r\n\taugmentEventListener(window);\r\n};\r\n\r\nvar selectorsAugmented = false;\r\nvar augmentSelectors = function() {\r\n/// Allows querySelectorAll and other NodeLists to perform *EventListener commands in bulk.\r\n\tvar proto = NodeList.prototype;\r\n\tproto.removeEventListener = function(type, listener, useCapture) {\r\n\t\tfor (var n = 0, length = this.length; n < length; n ++) {\r\n\t\t\tthis[n].removeEventListener(type, listener, useCapture);\r\n\t\t}\r\n\t};\r\n\tproto.addEventListener = function(type, listener, useCapture) {\r\n\t\tfor (var n = 0, length = this.length; n < length; n ++) {\r\n\t\t\tthis[n].addEventListener(type, listener, useCapture);\r\n\t\t}\r\n\t};\r\n};\r\n\r\nreturn root;\r\n\r\n})(eventjs);\r\n/*:\r\n\t----------------------------------------------------\r\n\teventjs.proxy : 0.4.2 : 2013/07/17 : MIT License\r\n\t----------------------------------------------------\r\n\thttps://github.com/mudcube/eventjs.js\r\n\t----------------------------------------------------\r\n*/\r\n\r\nif (typeof(eventjs) === \"undefined\") var eventjs = {};\r\nif (typeof(eventjs.proxy) === \"undefined\") eventjs.proxy = {};\r\n\r\neventjs.proxy = (function(root) { \"use strict\";\r\n\r\n/*\r\n\tCreate a new pointer gesture instance.\r\n*/\r\n\r\nroot.pointerSetup = function(conf, self) {\r\n\t/// Configure.\r\n\tconf.target = conf.target || window;\r\n\tconf.doc = conf.target.ownerDocument || conf.target; // Associated document.\r\n\tconf.minFingers = conf.minFingers || conf.fingers || 1; // Minimum required fingers.\r\n\tconf.maxFingers = conf.maxFingers || conf.fingers || Infinity; // Maximum allowed fingers.\r\n\tconf.position = conf.position || \"relative\"; // Determines what coordinate system points are returned.\r\n\tdelete conf.fingers; //- \r\n\t/// Convenience data.\r\n\tself = self || {};\r\n\tself.enabled = true;\r\n\tself.gesture = conf.gesture;\r\n\tself.target = conf.target;\r\n\tself.env = conf.env;\r\n\t///\r\n\tif (eventjs.modifyEventListener && conf.fromOverwrite) {\r\n\t\tconf.oldListener = conf.listener;\r\n\t\tconf.listener = eventjs.createPointerEvent;\r\n\t}\r\n\t/// Convenience commands.\r\n\tvar fingers = 0;\r\n\tvar type = self.gesture.indexOf(\"pointer\") === 0 && eventjs.modifyEventListener ? \"pointer\" : \"mouse\";\r\n\tif (conf.oldListener) self.oldListener = conf.oldListener;\r\n\t///\r\n\tself.listener = conf.listener;\r\n\tself.proxy = function(listener) {\r\n\t\tself.defaultListener = conf.listener;\r\n\t\tconf.listener = listener;\r\n\t\tlistener(conf.event, self);\r\n\t};\r\n\tself.add = function() {\r\n\t\tif (self.enabled === true) return;\r\n\t\tif (conf.onPointerDown) eventjs.add(conf.target, type + \"down\", conf.onPointerDown);\r\n\t\tif (conf.onPointerMove) eventjs.add(conf.doc, type + \"move\", conf.onPointerMove);\r\n\t\tif (conf.onPointerUp) eventjs.add(conf.doc, type + \"up\", conf.onPointerUp);\r\n\t\tself.enabled = true;\r\n\t};\r\n\tself.remove = function() {\r\n\t\tif (self.enabled === false) return;\r\n\t\tif (conf.onPointerDown) eventjs.remove(conf.target, type + \"down\", conf.onPointerDown);\r\n\t\tif (conf.onPointerMove) eventjs.remove(conf.doc, type + \"move\", conf.onPointerMove);\r\n\t\tif (conf.onPointerUp) eventjs.remove(conf.doc, type + \"up\", conf.onPointerUp);\r\n\t\tself.reset();\r\n\t\tself.enabled = false;\r\n\t};\r\n\tself.pause = function(opt) {\r\n\t\tif (conf.onPointerMove && (!opt || opt.move)) eventjs.remove(conf.doc, type + \"move\", conf.onPointerMove);\r\n\t\tif (conf.onPointerUp && (!opt || opt.up)) eventjs.remove(conf.doc, type + \"up\", conf.onPointerUp);\r\n\t\tfingers = conf.fingers;\r\n\t\tconf.fingers = 0;\r\n\t};\r\n\tself.resume = function(opt) {\r\n\t\tif (conf.onPointerMove && (!opt || opt.move)) eventjs.add(conf.doc, type + \"move\", conf.onPointerMove);\r\n\t\tif (conf.onPointerUp && (!opt || opt.up)) eventjs.add(conf.doc, type + \"up\", conf.onPointerUp);\r\n\t\tconf.fingers = fingers;\r\n\t};\r\n\tself.reset = function() {\r\n\t\tconf.tracker = {};\r\n\t\tconf.fingers = 0;\r\n\t};\r\n\t///\r\n\treturn self;\r\n};\r\n\r\n/*\r\n\tBegin proxied pointer command.\r\n*/\r\n\r\nvar sp = eventjs.supports; // Default pointerType\r\n///\r\neventjs.isMouse = !!sp.mouse;\r\neventjs.isMSPointer = !!sp.touch;\r\neventjs.isTouch = !!sp.msPointer;\r\n///\r\nroot.pointerStart = function(event, self, conf) {\r\n\t/// tracks multiple inputs\r\n\tvar type = (event.type || \"mousedown\").toUpperCase();\r\n\tif (type.indexOf(\"MOUSE\") === 0) {\r\n\t\teventjs.isMouse = true;\r\n\t\teventjs.isTouch = false;\r\n\t\teventjs.isMSPointer = false;\r\n\t} else if (type.indexOf(\"TOUCH\") === 0) {\r\n\t\teventjs.isMouse = false;\r\n\t\teventjs.isTouch = true;\r\n\t\teventjs.isMSPointer = false;\r\n\t} else if (type.indexOf(\"MSPOINTER\") === 0) {\r\n\t\teventjs.isMouse = false;\r\n\t\teventjs.isTouch = false;\r\n\t\teventjs.isMSPointer = true;\r\n\t}\r\n\t///\r\n\tvar addTouchStart = function(touch, sid) {\t\r\n\t\tvar bbox = conf.bbox;\r\n\t\tvar pt = track[sid] = {};\r\n\t\t///\r\n\t\tswitch(conf.position) {\r\n\t\t\tcase \"absolute\": // Absolute from within window.\r\n\t\t\t\tpt.offsetX = 0;\r\n\t\t\t\tpt.offsetY = 0;\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"differenceFromLast\": // Since last coordinate recorded.\r\n\t\t\t\tpt.offsetX = touch.pageX;\r\n\t\t\t\tpt.offsetY = touch.pageY;\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"difference\": // Relative from origin.\r\n\t\t\t\tpt.offsetX = touch.pageX;\r\n\t\t\t\tpt.offsetY = touch.pageY;\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"move\": // Move target element.\r\n\t\t\t\tpt.offsetX = touch.pageX - bbox.x1;\r\n\t\t\t\tpt.offsetY = touch.pageY - bbox.y1;\r\n\t\t\t\tbreak;\r\n\t\t\tdefault: // Relative from within target.\r\n\t\t\t\tpt.offsetX = bbox.x1 - bbox.scrollLeft;\r\n\t\t\t\tpt.offsetY = bbox.y1 - bbox.scrollTop;\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\t///\r\n\t\tvar x = touch.pageX - pt.offsetX;\r\n\t\tvar y = touch.pageY - pt.offsetY;\r\n\t\t///\r\n\t\tpt.rotation = 0;\r\n\t\tpt.scale = 1;\r\n\t\tpt.startTime = pt.moveTime = (new Date()).getTime();\r\n\t\tpt.move = { x: x, y: y };\r\n\t\tpt.start = { x: x, y: y };\r\n\t\t///\r\n\t\tconf.fingers ++;\r\n\t};\r\n\t///\r\n\tconf.event = event;\r\n\tif (self.defaultListener) {\r\n\t\tconf.listener = self.defaultListener;\r\n\t\tdelete self.defaultListener;\r\n\t}\r\n\t///\r\n\tvar isTouchStart = !conf.fingers;\r\n\tvar track = conf.tracker;\r\n\tvar touches = event.changedTouches || root.getCoords(event);\r\n\tvar length = touches.length;\r\n\t// Adding touch events to tracking.\r\n\tfor (var i = 0; i < length; i ++) {\r\n\t\tvar touch = touches[i];\r\n\t\tvar sid = touch.identifier || Infinity; // Touch ID.\r\n\t\t// Track the current state of the touches.\r\n\t\tif (conf.fingers) {\r\n\t\t\tif (conf.fingers >= conf.maxFingers) {\r\n\t\t\t\tvar ids = [];\r\n\t\t\t\tfor (var sid in conf.tracker) ids.push(sid);\r\n\t\t\t\tself.identifier = ids.join(\",\");\r\n\t\t\t\treturn isTouchStart;\r\n\t\t\t}\r\n\t\t\tvar fingers = 0; // Finger ID.\r\n\t\t\tfor (var rid in track) {\r\n\t\t\t\t// Replace removed finger.\r\n\t\t\t\tif (track[rid].up) {\r\n\t\t\t\t\tdelete track[rid];\r\n\t\t\t\t\taddTouchStart(touch, sid);\r\n\t\t\t\t\tconf.cancel = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tfingers ++;\r\n\t\t\t}\r\n\t\t\t// Add additional finger.\r\n\t\t\tif (track[sid]) continue;\r\n\t\t\taddTouchStart(touch, sid);\r\n\t\t} else { // Start tracking fingers.\r\n\t\t\ttrack = conf.tracker = {};\r\n\t\t\tself.bbox = conf.bbox = root.getBoundingBox(conf.target);\r\n\t\t\tconf.fingers = 0;\r\n\t\t\tconf.cancel = false;\r\n\t\t\taddTouchStart(touch, sid);\r\n\t\t}\r\n\t}\r\n\t///\r\n\tvar ids = [];\r\n\tfor (var sid in conf.tracker) ids.push(sid);\r\n\tself.identifier = ids.join(\",\");\r\n\t///\r\n\treturn isTouchStart;\r\n};\r\n\r\n/*\r\n\tEnd proxied pointer command.\r\n*/\r\n\r\nroot.pointerEnd = function(event, self, conf, onPointerUp) {\r\n\t// Record changed touches have ended (iOS changedTouches is not reliable).\r\n\tvar touches = event.touches || [];\r\n\tvar length = touches.length;\r\n\tvar exists = {};\r\n\tfor (var i = 0; i < length; i ++) {\r\n\t\tvar touch = touches[i];\r\n\t\tvar sid = touch.identifier;\r\n\t\texists[sid || Infinity] = true;\r\n\t}\r\n\tfor (var sid in conf.tracker) {\r\n\t\tvar track = conf.tracker[sid];\r\n\t\tif (exists[sid] || track.up) continue;\r\n\t\tif (onPointerUp) { // add changedTouches to mouse.\r\n\t\t\tonPointerUp({\r\n\t\t\t\tpageX: track.pageX,\r\n\t\t\t\tpageY: track.pageY,\r\n\t\t\t\tchangedTouches: [{\r\n\t\t\t\t\tpageX: track.pageX,\r\n\t\t\t\t\tpageY: track.pageY,\r\n\t\t\t\t\tidentifier: sid === \"Infinity\" ? Infinity : sid \r\n\t\t\t\t}]\r\n\t\t\t}, \"up\");\r\n\t\t}\r\n\t\ttrack.up = true;\r\n\t\tconf.fingers --;\r\n\t}\r\n/*\t// This should work but fails in Safari on iOS4 so not using it.\r\n\tvar touches = event.changedTouches || root.getCoords(event);\r\n\tvar length = touches.length;\r\n\t// Record changed touches have ended (this should work).\r\n\tfor (var i = 0; i < length; i ++) {\r\n\t\tvar touch = touches[i];\r\n\t\tvar sid = touch.identifier || Infinity;\r\n\t\tvar track = conf.tracker[sid];\r\n\t\tif (track && !track.up) {\r\n\t\t\tif (onPointerUp) { // add changedTouches to mouse.\r\n\t\t\t\tonPointerUp({\r\n\t\t\t\t\tchangedTouches: [{\r\n\t\t\t\t\t\tpageX: track.pageX,\r\n\t\t\t\t\t\tpageY: track.pageY,\r\n\t\t\t\t\t\tidentifier: sid === \"Infinity\" ? Infinity : sid \r\n\t\t\t\t\t}]\r\n\t\t\t\t}, \"up\");\r\n\t\t\t}\r\n\t\t\ttrack.up = true;\r\n\t\t\tconf.fingers --;\r\n\t\t}\r\n\t} */\r\n\t// Wait for all fingers to be released.\r\n\tif (conf.fingers !== 0) return false;\r\n\t// Record total number of fingers gesture used.\r\n\tvar ids = [];\r\n\tconf.gestureFingers = 0;\r\n\tfor (var sid in conf.tracker) {\r\n\t\tconf.gestureFingers ++;\r\n\t\tids.push(sid);\r\n\t}\r\n\tself.identifier = ids.join(\",\");\r\n\t// Our pointer gesture has ended.\r\n\treturn true;\r\n};\r\n\r\n/*\r\n\tReturns mouse coords in an array to match event.*Touches\r\n\t------------------------------------------------------------\r\n\tvar touch = event.changedTouches || root.getCoords(event);\r\n*/\r\n\r\nroot.getCoords = function(event) {\r\n\tif (typeof(event.pageX) !== \"undefined\") { // Desktop browsers.\r\n\t\troot.getCoords = function(event) {\r\n\t\t\treturn Array({\r\n\t\t\t\ttype: \"mouse\",\r\n\t\t\t\tx: event.pageX,\r\n\t\t\t\ty: event.pageY,\r\n\t\t\t\tpageX: event.pageX,\r\n\t\t\t\tpageY: event.pageY,\r\n\t\t\t\tidentifier: event.pointerId || Infinity // pointerId is MS\r\n\t\t\t});\r\n\t\t};\r\n\t} else { // Internet Explorer <= 8.0\r\n\t\troot.getCoords = function(event) {\r\n\t\t\tvar doc = document.documentElement;\r\n\t\t\tevent = event || window.event;\r\n\t\t\treturn Array({\r\n\t\t\t\ttype: \"mouse\",\r\n\t\t\t\tx: event.clientX + doc.scrollLeft,\r\n\t\t\t\ty: event.clientY + doc.scrollTop,\r\n\t\t\t\tpageX: event.clientX + doc.scrollLeft,\r\n\t\t\t\tpageY: event.clientY + doc.scrollTop,\r\n\t\t\t\tidentifier: Infinity\r\n\t\t\t});\r\n\t\t};\r\n\t}\r\n\treturn root.getCoords(event);\r\n};\r\n\r\n/*\r\n\tReturns single coords in an object.\r\n\t------------------------------------------------------------\r\n\tvar mouse = root.getCoord(event);\r\n*/\r\n\r\nroot.getCoord = function(event) {\r\n\tif (\"ontouchstart\" in window) { // Mobile browsers.\r\n\t\tvar pX = 0;\r\n\t\tvar pY = 0;\r\n\t\troot.getCoord = function(event) {\r\n\t\t\tvar touches = event.changedTouches;\r\n\t\t\tif (touches && touches.length) { // ontouchstart + ontouchmove\r\n\t\t\t\treturn {\r\n\t\t\t\t\tx: pX = touches[0].pageX,\r\n\t\t\t\t\ty: pY = touches[0].pageY\r\n\t\t\t\t};\r\n\t\t\t} else { // ontouchend\r\n\t\t\t\treturn {\r\n\t\t\t\t\tx: pX,\r\n\t\t\t\t\ty: pY\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t};\r\n\t} else if(typeof(event.pageX) !== \"undefined\" && typeof(event.pageY) !== \"undefined\") { // Desktop browsers.\r\n\t\troot.getCoord = function(event) {\r\n\t\t\treturn {\r\n\t\t\t\tx: event.pageX,\r\n\t\t\t\ty: event.pageY\r\n\t\t\t};\r\n\t\t};\r\n\t} else { // Internet Explorer <=8.0\r\n\t\troot.getCoord = function(event) {\r\n\t\t\tvar doc = document.documentElement;\r\n\t\t\tevent = event || window.event;\r\n\t\t\treturn {\r\n\t\t\t\tx: event.clientX + doc.scrollLeft,\r\n\t\t\t\ty: event.clientY + doc.scrollTop\r\n\t\t\t};\r\n\t\t};\r\n\t}\r\n\treturn root.getCoord(event);\r\n};\r\n\r\n/*\r\n\tGet target scale and position in space.\t\r\n*/\r\n\r\nvar getPropertyAsFloat = function(o, type) {\r\n\tvar n = parseFloat(o.getPropertyValue(type), 10);\r\n\treturn isFinite(n) ? n : 0;\r\n};\r\n\r\nroot.getBoundingBox = function(o) { \r\n\tif (o === window || o === document) o = document.body;\r\n\t///\r\n\tvar bbox = {};\r\n\tvar bcr = o.getBoundingClientRect();\r\n\tbbox.width = bcr.width;\r\n\tbbox.height = bcr.height;\r\n\tbbox.x1 = bcr.left;\r\n\tbbox.y1 = bcr.top;\r\n\tbbox.scaleX = bcr.width / o.offsetWidth || 1;\r\n\tbbox.scaleY = bcr.height / o.offsetHeight || 1;\r\n\tbbox.scrollLeft = 0;\r\n\tbbox.scrollTop = 0;\r\n\t///\r\n\tvar style = window.getComputedStyle(o);\r\n\tvar borderBox = style.getPropertyValue(\"box-sizing\") === \"border-box\";\r\n\t///\r\n\tif (borderBox === false) {\r\n\t\tvar left = getPropertyAsFloat(style, \"border-left-width\");\r\n\t\tvar right = getPropertyAsFloat(style, \"border-right-width\");\r\n\t\tvar bottom = getPropertyAsFloat(style, \"border-bottom-width\");\r\n\t\tvar top = getPropertyAsFloat(style, \"border-top-width\");\r\n\t\tbbox.border = [ left, right, top, bottom ];\r\n\t\tbbox.x1 += left;\r\n\t\tbbox.y1 += top;\r\n\t\tbbox.width -= right + left;\r\n\t\tbbox.height -= bottom + top;\r\n\t}\r\n\r\n/*\tvar left = getPropertyAsFloat(style, \"padding-left\");\r\n\tvar right = getPropertyAsFloat(style, \"padding-right\");\r\n\tvar bottom = getPropertyAsFloat(style, \"padding-bottom\");\r\n\tvar top = getPropertyAsFloat(style, \"padding-top\");\r\n\tbbox.padding = [ left, right, top, bottom ];*/\r\n\t///\r\n\tbbox.x2 = bbox.x1 + bbox.width;\r\n\tbbox.y2 = bbox.y1 + bbox.height;\r\n\t\r\n\t/// Get the scroll of container element.\r\n\tvar position = style.getPropertyValue(\"position\");\r\n\tvar tmp = position === \"fixed\" ? o : o.parentNode;\r\n\twhile (tmp !== null) {\r\n\t\tif (tmp === document.body) break;\r\n\t\tif (tmp.scrollTop === undefined) break;\r\n\t\tvar style = window.getComputedStyle(tmp);\r\n\t\tvar position = style.getPropertyValue(\"position\");\r\n\t\tif (position === \"absolute\") {\r\n\r\n\t\t} else if (position === \"fixed\") {\r\n//\t\t\tbbox.scrollTop += document.body.scrollTop;\r\n//\t\t\tbbox.scrollLeft += document.body.scrollLeft;\r\n\t\t\tbbox.scrollTop -= tmp.parentNode.scrollTop;\r\n\t\t\tbbox.scrollLeft -= tmp.parentNode.scrollLeft;\r\n\t\t\tbreak;\r\n\t\t} else {\r\n\t\t\tbbox.scrollLeft += tmp.scrollLeft;\r\n\t\t\tbbox.scrollTop += tmp.scrollTop;\r\n\t\t}\r\n\t\t///\r\n\t\ttmp = tmp.parentNode;\r\n\t};\r\n\t///\r\n\tbbox.scrollBodyLeft = (window.pageXOffset !== undefined) ? window.pageXOffset : (document.documentElement || document.body.parentNode || document.body).scrollLeft;\r\n\tbbox.scrollBodyTop = (window.pageYOffset !== undefined) ? window.pageYOffset : (document.documentElement || document.body.parentNode || document.body).scrollTop;\r\n\t///\r\n\tbbox.scrollLeft -= bbox.scrollBodyLeft;\r\n\tbbox.scrollTop -= bbox.scrollBodyTop;\r\n\t///\r\n\treturn bbox;\r\n};\r\n\r\n/*\r\n\tKeep track of metaKey, the proper ctrlKey for users platform.\r\n\t----------------------------------------------------\r\n\thttp://www.quirksmode.org/js/keys.html\r\n\t-----------------------------------\r\n\thttp://unixpapa.com/js/key.html\r\n*/\r\n\r\n(function() {\r\n\tvar agent = navigator.userAgent.toLowerCase();\r\n\tvar mac = agent.indexOf(\"macintosh\") !== -1;\r\n\tvar metaKeys;\r\n\tif (mac && agent.indexOf(\"khtml\") !== -1) { // chrome, safari.\r\n\t\tmetaKeys = { 91: true, 93: true };\r\n\t} else if (mac && agent.indexOf(\"firefox\") !== -1) { // mac firefox.\r\n\t\tmetaKeys = { 224: true };\r\n\t} else { // windows, linux, or mac opera.\r\n\t\tmetaKeys = { 17: true };\r\n\t}\r\n\t(root.metaTrackerReset = function() {\r\n\t\teventjs.fnKey = root.fnKey = false;\r\n\t\teventjs.metaKey = root.metaKey = false;\r\n\t\teventjs.escKey = root.escKey = false;\r\n\t\teventjs.ctrlKey = root.ctrlKey = false;\r\n\t\teventjs.shiftKey = root.shiftKey = false;\r\n\t\teventjs.altKey = root.altKey = false;\r\n\t})();\r\n\troot.metaTracker = function(event) {\r\n\t\tvar isKeyDown = event.type === \"keydown\";\r\n\t\tif (event.keyCode === 27) eventjs.escKey = root.escKey = isKeyDown;\r\n\t\tif (metaKeys[event.keyCode]) eventjs.metaKey = root.metaKey = isKeyDown;\r\n\t\teventjs.ctrlKey = root.ctrlKey = event.ctrlKey;\r\n\t\teventjs.shiftKey = root.shiftKey = event.shiftKey;\r\n\t\teventjs.altKey = root.altKey = event.altKey;\r\n\t};\r\n})();\r\n\r\nreturn root;\r\n\r\n})(eventjs.proxy);\r\n/*:\r\n\t----------------------------------------------------\r\n\t\"MutationObserver\" event proxy.\r\n\t----------------------------------------------------\r\n\tauthor: Selvakumar Arumugam - MIT LICENSE\r\n\t src: http://stackoverflow.com/questions/10868104/can-you-have-a-javascript-hook-trigger-after-a-dom-elements-style-object-change\r\n\t----------------------------------------------------\r\n*/\r\nif (typeof(eventjs) === \"undefined\") var eventjs = {};\r\n\r\neventjs.MutationObserver = (function() {\r\n\tvar MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;\r\n\tvar DOMAttrModifiedSupported = !MutationObserver && (function() {\r\n\t\tvar p = document.createElement(\"p\");\r\n\t\tvar flag = false;\r\n\t\tvar fn = function() { flag = true };\r\n\t\tif (p.addEventListener) {\r\n\t\t\tp.addEventListener(\"DOMAttrModified\", fn, false);\r\n\t\t} else if (p.attachEvent) {\r\n\t\t\tp.attachEvent(\"onDOMAttrModified\", fn);\r\n\t\t} else {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\t///\r\n\t\tp.setAttribute(\"id\", \"target\");\r\n\t\t///\r\n\t\treturn flag;\r\n\t})();\r\n\t///\r\n\treturn function(container, callback) {\r\n\t\tif (MutationObserver) {\r\n\t\t\tvar options = {\r\n\t\t\t\tsubtree: false,\r\n\t\t\t\tattributes: true\r\n\t\t\t};\r\n\t\t\tvar observer = new MutationObserver(function(mutations) {\r\n\t\t\t\tmutations.forEach(function(e) {\r\n\t\t\t\t\tcallback.call(e.target, e.attributeName);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t\tobserver.observe(container, options)\r\n\t\t} else if (DOMAttrModifiedSupported) {\r\n\t\t\teventjs.add(container, \"DOMAttrModified\", function(e) {\r\n\t\t\t\tcallback.call(container, e.attrName);\r\n\t\t\t});\r\n\t\t} else if (\"onpropertychange\" in document.body) {\r\n\t\t\teventjs.add(container, \"propertychange\", function(e) {\r\n\t\t\t\tcallback.call(container, window.event.propertyName);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n})();\r\n/*:\r\n\t\"Click\" event proxy.\r\n\t----------------------------------------------------\r\n\teventjs.add(window, \"click\", function(event, self) {});\r\n*/\r\n\r\nif (typeof(eventjs) === \"undefined\") var eventjs = {};\r\nif (typeof(eventjs.proxy) === \"undefined\") eventjs.proxy = {};\r\n\r\neventjs.proxy = (function(root) { \"use strict\";\r\n\r\nroot.click = function(conf) {\r\n\tconf.gesture = conf.gesture || \"click\";\r\n\tconf.maxFingers = conf.maxFingers || conf.fingers || 1;\r\n\t/// Tracking the events.\r\n\tconf.onPointerDown = function (event) {\r\n\t\tif (root.pointerStart(event, self, conf)) {\r\n\t\t\teventjs.add(conf.target, \"mouseup\", conf.onPointerUp);\r\n\t\t}\r\n\t};\r\n\tconf.onPointerUp = function(event) {\r\n\t\tif (root.pointerEnd(event, self, conf)) {\r\n\t\t\teventjs.remove(conf.target, \"mouseup\", conf.onPointerUp);\r\n\t\t\tvar pointers = event.changedTouches || root.getCoords(event);\r\n\t\t\tvar pointer = pointers[0];\r\n\t\t\tvar bbox = conf.bbox;\r\n\t\t\tvar newbbox = root.getBoundingBox(conf.target);\r\n\t\t\tvar y = pointer.pageY - newbbox.scrollBodyTop;\r\n\t\t\tvar x = pointer.pageX - newbbox.scrollBodyLeft;\r\n\t\t\t////\r\n\t\t\tif (x > bbox.x1 && y > bbox.y1 &&\r\n\t\t\t\tx < bbox.x2 && y < bbox.y2 &&\r\n\t\t\t\tbbox.scrollTop === newbbox.scrollTop) { // has not been scrolled\r\n\t\t\t\t///\r\n\t\t\t\tfor (var key in conf.tracker) break; //- should be modularized? in dblclick too\r\n\t\t\t\tvar point = conf.tracker[key];\r\n\t\t\t\tself.x = point.start.x;\r\n\t\t\t\tself.y = point.start.y;\r\n\t\t\t\t///\r\n\t\t\t\tconf.listener(event, self);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\t// Generate maintenance commands, and other configurations.\r\n\tvar self = root.pointerSetup(conf);\r\n\tself.state = \"click\";\r\n\t// Attach events.\r\n\teventjs.add(conf.target, \"mousedown\", conf.onPointerDown);\r\n\t// Return this object.\r\n\treturn self;\r\n};\r\n\r\neventjs.Gesture = eventjs.Gesture || {};\r\neventjs.Gesture._gestureHandlers = eventjs.Gesture._gestureHandlers || {};\r\neventjs.Gesture._gestureHandlers.click = root.click;\r\n\r\nreturn root;\r\n\r\n})(eventjs.proxy);\r\n/*:\r\n\t\"Double-Click\" aka \"Double-Tap\" event proxy.\r\n\t----------------------------------------------------\r\n\teventjs.add(window, \"dblclick\", function(event, self) {});\r\n\t----------------------------------------------------\r\n\tTouch an target twice for <= 700ms, with less than 25 pixel drift.\r\n*/\r\n\r\nif (typeof(eventjs) === \"undefined\") var eventjs = {};\r\nif (typeof(eventjs.proxy) === \"undefined\") eventjs.proxy = {};\r\n\r\neventjs.proxy = (function(root) { \"use strict\";\r\n\r\nroot.dbltap =\r\nroot.dblclick = function(conf) {\r\n\tconf.gesture = conf.gesture || \"dbltap\";\r\n\tconf.maxFingers = conf.maxFingers || conf.fingers || 1;\r\n\t// Setting up local variables.\r\n\tvar delay = 700; // in milliseconds\r\n\tvar time0, time1, timeout; \r\n\tvar pointer0, pointer1;\r\n\t// Tracking the events.\r\n\tconf.onPointerDown = function (event) {\r\n\t\tvar pointers = event.changedTouches || root.getCoords(event);\r\n\t\tif (time0 && !time1) { // Click #2\r\n\t\t\tpointer1 = pointers[0];\r\n\t\t\ttime1 = (new Date()).getTime() - time0;\r\n\t\t} else { // Click #1\r\n\t\t\tpointer0 = pointers[0];\r\n\t\t\ttime0 = (new Date()).getTime();\r\n\t\t\ttime1 = 0;\r\n\t\t\tclearTimeout(timeout);\r\n\t\t\ttimeout = setTimeout(function() {\r\n\t\t\t\ttime0 = 0;\r\n\t\t\t}, delay);\r\n\t\t}\r\n\t\tif (root.pointerStart(event, self, conf)) {\r\n\t\t\teventjs.add(conf.target, \"mousemove\", conf.onPointerMove).listener(event);\r\n\t\t\teventjs.add(conf.target, \"mouseup\", conf.onPointerUp);\r\n\t\t}\r\n\t};\r\n\tconf.onPointerMove = function (event) {\r\n\t\tif (time0 && !time1) {\r\n\t\t\tvar pointers = event.changedTouches || root.getCoords(event);\r\n\t\t\tpointer1 = pointers[0];\r\n\t\t}\r\n\t\tvar bbox = conf.bbox;\r\n\t\tvar ax = (pointer1.pageX - bbox.x1);\r\n\t\tvar ay = (pointer1.pageY - bbox.y1);\r\n\t\tif (!(ax > 0 && ax < bbox.width && // Within target coordinates..\r\n\t\t\t ay > 0 && ay < bbox.height &&\r\n\t\t\t Math.abs(pointer1.pageX - pointer0.pageX) <= 25 && // Within drift deviance.\r\n\t\t\t Math.abs(pointer1.pageY - pointer0.pageY) <= 25)) {\r\n\t\t\t// Cancel out this listener.\r\n\t\t\teventjs.remove(conf.target, \"mousemove\", conf.onPointerMove);\r\n\t\t\tclearTimeout(timeout);\r\n\t\t\ttime0 = time1 = 0;\r\n\t\t}\r\n\t};\r\n\tconf.onPointerUp = function(event) {\r\n\t\tif (root.pointerEnd(event, self, conf)) {\r\n\t\t\teventjs.remove(conf.target, \"mousemove\", conf.onPointerMove);\r\n\t\t\teventjs.remove(conf.target, \"mouseup\", conf.onPointerUp);\r\n\t\t}\r\n\t\tif (time0 && time1) {\r\n\t\t\tif (time1 <= delay) { // && !(event.cancelBubble && ++event.cancelBubbleCount > 1)) {\r\n\t\t\t\tself.state = conf.gesture;\r\n\t\t\t\tfor (var key in conf.tracker) break;\r\n\t\t\t\tvar point = conf.tracker[key];\r\n\t\t\t\tself.x = point.start.x;\r\n\t\t\t\tself.y = point.start.y;\r\n\t\t\t\tconf.listener(event, self);\r\n\t\t\t}\r\n\t\t\tclearTimeout(timeout);\r\n\t\t\ttime0 = time1 = 0;\r\n\t\t}\r\n\t};\r\n\t// Generate maintenance commands, and other configurations.\r\n\tvar self = root.pointerSetup(conf);\r\n\tself.state = \"dblclick\";\r\n\t// Attach events.\r\n\teventjs.add(conf.target, \"mousedown\", conf.onPointerDown);\r\n\t// Return this object.\r\n\treturn self;\r\n};\r\n\r\neventjs.Gesture = eventjs.Gesture || {};\r\neventjs.Gesture._gestureHandlers = eventjs.Gesture._gestureHandlers || {};\r\neventjs.Gesture._gestureHandlers.dbltap = root.dbltap;\r\neventjs.Gesture._gestureHandlers.dblclick = root.dblclick;\r\n\r\nreturn root;\r\n\r\n})(eventjs.proxy);\r\n/*:\r\n\t\"Drag\" event proxy (1+ fingers).\r\n\t----------------------------------------------------\r\n\tCONFIGURE: maxFingers, position.\r\n\t----------------------------------------------------\r\n\teventjs.add(window, \"drag\", function(event, self) {\r\n\t\tconsole.log(self.gesture, self.state, self.start, self.x, self.y, self.bbox);\r\n\t});\r\n*/\r\n\r\nif (typeof(eventjs) === \"undefined\") var eventjs = {};\r\nif (typeof(eventjs.proxy) === \"undefined\") eventjs.proxy = {};\r\n\r\neventjs.proxy = (function(root) { \"use strict\";\r\n\r\nroot.dragElement = function(that, event) {\r\n\troot.drag({\r\n\t\tevent: event,\r\n\t\ttarget: that,\r\n\t\tposition: \"move\",\r\n\t\tlistener: function(event, self) {\r\n\t\t\tthat.style.left = self.x + \"px\";\r\n\t\t\tthat.style.top = self.y + \"px\";\r\n\t\t\teventjs.prevent(event);\r\n\t\t}\r\n\t});\r\n};\r\n\r\nroot.drag = function(conf) {\r\n\tconf.gesture = \"drag\";\r\n\tconf.onPointerDown = function (event) {\r\n\t\tif (root.pointerStart(event, self, conf)) {\r\n\t\t\tif (!conf.monitor) {\r\n\t\t\t\teventjs.add(conf.doc, \"mousemove\", conf.onPointerMove);\r\n\t\t\t\teventjs.add(conf.doc, \"mouseup\", conf.onPointerUp);\r\n\t\t\t}\r\n\t\t}\r\n\t\t// Process event listener.\r\n\t\tconf.onPointerMove(event, \"down\");\r\n\t};\r\n\tconf.onPointerMove = function (event, state) {\r\n\t\tif (!conf.tracker) return conf.onPointerDown(event);\r\n\t\tvar bbox = conf.bbox;\r\n\t\tvar touches = event.changedTouches || root.getCoords(event);\r\n\t\tvar length = touches.length;\r\n\t\tfor (var i = 0; i < length; i ++) {\r\n\t\t\tvar touch = touches[i];\r\n\t\t\tvar identifier = touch.identifier || Infinity;\r\n\t\t\tvar pt = conf.tracker[identifier];\r\n\t\t\t// Identifier defined outside of listener.\r\n\t\t\tif (!pt) continue;\r\n\t\t\tpt.pageX = touch.pageX;\r\n\t\t\tpt.pageY = touch.pageY;\r\n\t\t\t// Record data.\r\n\t\t\tself.state = state || \"move\";\r\n\t\t\tself.identifier = identifier;\r\n\t\t\tself.start = pt.start;\r\n\t\t\tself.fingers = conf.fingers;\r\n\t\t\tif (conf.position === \"differenceFromLast\") {\r\n\t\t\t\tself.x = (pt.pageX - pt.offsetX);\r\n\t\t\t\tself.y = (pt.pageY - pt.offsetY);\r\n\t\t\t\tpt.offsetX = pt.pageX;\r\n\t\t\t\tpt.offsetY = pt.pageY;\r\n\t\t\t} else {\r\n\t\t\t\tself.x = (pt.pageX - pt.offsetX);\r\n\t\t\t\tself.y = (pt.pageY - pt.offsetY);\r\n\t\t\t}\r\n\t\t\t///\r\n\t\t\tconf.listener(event, self);\r\n\t\t}\r\n\t};\r\n\tconf.onPointerUp = function(event) {\r\n\t\t// Remove tracking for touch.\r\n\t\tif (root.pointerEnd(event, self, conf, conf.onPointerMove)) {\r\n\t\t\tif (!conf.monitor) {\r\n\t\t\t\teventjs.remove(conf.doc, \"mousemove\", conf.onPointerMove);\r\n\t\t\t\teventjs.remove(conf.doc, \"mouseup\", conf.onPointerUp);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\t// Generate maintenance commands, and other configurations.\r\n\tvar self = root.pointerSetup(conf);\r\n\t// Attach events.\r\n\tif (conf.event) {\r\n\t\tconf.onPointerDown(conf.event);\r\n\t} else { //\r\n\t\teventjs.add(conf.target, \"mousedown\", conf.onPointerDown);\r\n\t\tif (conf.monitor) {\r\n\t\t\teventjs.add(conf.doc, \"mousemove\", conf.onPointerMove);\r\n\t\t\teventjs.add(conf.doc, \"mouseup\", conf.onPointerUp);\r\n\t\t}\r\n\t}\r\n\t// Return this object.\r\n\treturn self;\r\n};\r\n\r\neventjs.Gesture = eventjs.Gesture || {};\r\neventjs.Gesture._gestureHandlers = eventjs.Gesture._gestureHandlers || {};\r\neventjs.Gesture._gestureHandlers.drag = root.drag;\r\n\r\nreturn root;\r\n\r\n})(eventjs.proxy);\r\n/*:\r\n\t\"Gesture\" event proxy (2+ fingers).\r\n\t----------------------------------------------------\r\n\tCONFIGURE: minFingers, maxFingers.\r\n\t----------------------------------------------------\r\n\teventjs.add(window, \"gesture\", function(event, self) {\r\n\t\tconsole.log(\r\n\t\t\tself.x, // centroid \r\n\t\t\tself.y,\r\n\t\t\tself.rotation,\r\n\t\t\tself.scale, \r\n\t\t\tself.fingers, \r\n\t\t\tself.state\r\n\t\t);\r\n\t});\r\n*/\r\n\r\nif (typeof(eventjs) === \"undefined\") var eventjs = {};\r\nif (typeof(eventjs.proxy) === \"undefined\") eventjs.proxy = {};\r\n\r\neventjs.proxy = (function(root) { \"use strict\";\r\n\r\nvar RAD_DEG = Math.PI / 180;\r\nvar getCentroid = function(self, points) {\r\n\tvar centroidx = 0;\r\n\tvar centroidy = 0;\r\n\tvar length = 0;\r\n\tfor (var sid in points) {\r\n\t\tvar touch = points[sid];\r\n\t\tif (touch.up) continue;\r\n\t\tcentroidx += touch.move.x;\r\n\t\tcentroidy += touch.move.y;\r\n\t\tlength ++;\r\n\t}\r\n\tself.x = centroidx /= length;\r\n\tself.y = centroidy /= length;\r\n\treturn self;\r\n};\r\n\r\nroot.gesture = function(conf) {\r\n\tconf.gesture = conf.gesture || \"gesture\";\r\n\tconf.minFingers = conf.minFingers || conf.fingers || 2;\r\n\t// Tracking the events.\r\n\tconf.onPointerDown = function (event) {\r\n\t\tvar fingers = conf.fingers;\r\n\t\tif (root.pointerStart(event, self, conf)) {\r\n\t\t\teventjs.add(conf.doc, \"mousemove\", conf.onPointerMove);\r\n\t\t\teventjs.add(conf.doc, \"mouseup\", conf.onPointerUp);\r\n\t\t}\r\n\t\t// Record gesture start.\r\n\t\tif (conf.fingers === conf.minFingers && fingers !== conf.fingers) {\r\n\t\t\tself.fingers = conf.minFingers;\r\n\t\t\tself.scale = 1;\r\n\t\t\tself.rotation = 0;\r\n\t\t\tself.state = \"start\";\r\n\t\t\tvar sids = \"\"; //- FIXME(mud): can generate duplicate IDs.\r\n\t\t\tfor (var key in conf.tracker) sids += key;\r\n\t\t\tself.identifier = parseInt(sids);\r\n\t\t\tgetCentroid(self, conf.tracker);\r\n\t\t\tconf.listener(event, self);\r\n\t\t}\r\n\t};\r\n\t///\r\n\tconf.onPointerMove = function (event, state) {\r\n\t\tvar bbox = conf.bbox;\r\n\t\tvar points = conf.tracker;\r\n\t\tvar touches = event.changedTouches || root.getCoords(event);\r\n\t\tvar length = touches.length;\r\n\t\t// Update tracker coordinates.\r\n\t\tfor (var i = 0; i < length; i ++) {\r\n\t\t\tvar touch = touches[i];\r\n\t\t\tvar sid = touch.identifier || Infinity;\r\n\t\t\tvar pt = points[sid];\r\n\t\t\t// Check whether \"pt\" is used by another gesture.\r\n\t\t\tif (!pt) continue; \r\n\t\t\t// Find the actual coordinates.\r\n\t\t\tpt.move.x = (touch.pageX - bbox.x1);\r\n\t\t\tpt.move.y = (touch.pageY - bbox.y1);\r\n\t\t}\r\n\t\t///\r\n\t\tif (conf.fingers < conf.minFingers) return;\r\n\t\t///\r\n\t\tvar touches = [];\r\n\t\tvar scale = 0;\r\n\t\tvar rotation = 0;\r\n\r\n\t\t/// Calculate centroid of gesture.\r\n\t\tgetCentroid(self, points);\r\n\t\t///\r\n\t\tfor (var sid in points) {\r\n\t\t\tvar touch = points[sid];\r\n\t\t\tif (touch.up) continue;\r\n\t\t\tvar start = touch.start;\r\n\t\t\tif (!start.distance) {\r\n\t\t\t\tvar dx = start.x - self.x;\r\n\t\t\t\tvar dy = start.y - self.y;\r\n\t\t\t\tstart.distance = Math.sqrt(dx * dx + dy * dy);\r\n\t\t\t\tstart.angle = Math.atan2(dx, dy) / RAD_DEG;\r\n\t\t\t}\r\n\t\t\t// Calculate scale.\r\n\t\t\tvar dx = touch.move.x - self.x;\r\n\t\t\tvar dy = touch.move.y - self.y;\r\n\t\t\tvar distance = Math.sqrt(dx * dx + dy * dy);\r\n\t\t\tscale += distance / start.distance;\r\n\t\t\t// Calculate rotation.\r\n\t\t\tvar angle = Math.atan2(dx, dy) / RAD_DEG;\r\n\t\t\tvar rotate = (start.angle - angle + 360) % 360 - 180;\r\n\t\t\ttouch.DEG2 = touch.DEG1; // Previous degree.\r\n\t\t\ttouch.DEG1 = rotate > 0 ? rotate : -rotate; // Current degree.\r\n\t\t\tif (typeof(touch.DEG2) !== \"undefined\") {\r\n\t\t\t\tif (rotate > 0) {\r\n\t\t\t\t\ttouch.rotation += touch.DEG1 - touch.DEG2;\r\n\t\t\t\t} else {\r\n\t\t\t\t\ttouch.rotation -= touch.DEG1 - touch.DEG2;\r\n\t\t\t\t}\r\n\t\t\t\trotation += touch.rotation;\r\n\t\t\t}\r\n\t\t\t// Attach current points to self.\r\n\t\t\ttouches.push(touch.move);\r\n\t\t}\r\n\t\t///\r\n\t\tself.touches = touches;\r\n\t\tself.fingers = conf.fingers;\r\n\t\tself.scale = scale / conf.fingers;\r\n\t\tself.rotation = rotation / conf.fingers;\r\n\t\tself.state = \"change\";\r\n\t\tconf.listener(event, self);\r\n\t};\r\n\tconf.onPointerUp = function(event) {\r\n\t\t// Remove tracking for touch.\r\n\t\tvar fingers = conf.fingers;\r\n\t\tif (root.pointerEnd(event, self, conf)) {\r\n\t\t\teventjs.remove(conf.doc, \"mousemove\", conf.onPointerMove);\r\n\t\t\teventjs.remove(conf.doc, \"mouseup\", conf.onPointerUp);\r\n\t\t}\r\n\t\t// Check whether fingers has dropped below minFingers.\r\n\t\tif (fingers === conf.minFingers && conf.fingers < conf.minFingers) {\r\n\t\t\tself.fingers = conf.fingers;\r\n\t\t\tself.state = \"end\";\r\n\t\t\tconf.listener(event, self);\r\n\t\t}\r\n\t};\r\n\t// Generate maintenance commands, and other configurations.\r\n\tvar self = root.pointerSetup(conf);\r\n\t// Attach events.\r\n\teventjs.add(conf.target, \"mousedown\", conf.onPointerDown);\r\n\t// Return this object.\r\n\treturn self;\r\n};\r\n\r\neventjs.Gesture = eventjs.Gesture || {};\r\neventjs.Gesture._gestureHandlers = eventjs.Gesture._gestureHandlers || {};\r\neventjs.Gesture._gestureHandlers.gesture = root.gesture;\r\n\r\nreturn root;\r\n\r\n})(eventjs.proxy);\r\n/*:\r\n\t\"Pointer\" event proxy (1+ fingers).\r\n\t----------------------------------------------------\r\n\tCONFIGURE: minFingers, maxFingers.\r\n\t----------------------------------------------------\r\n\teventjs.add(window, \"gesture\", function(event, self) {\r\n\t\tconsole.log(self.rotation, self.scale, self.fingers, self.state);\r\n\t});\r\n*/\r\n\r\nif (typeof(eventjs) === \"undefined\") var eventjs = {};\r\nif (typeof(eventjs.proxy) === \"undefined\") eventjs.proxy = {};\r\n\r\neventjs.proxy = (function(root) { \"use strict\";\r\n\r\nroot.pointerdown = \r\nroot.pointermove = \r\nroot.pointerup = function(conf) {\r\n\tconf.gesture = conf.gesture || \"pointer\";\r\n\tif (conf.target.isPointerEmitter) return;\r\n\t// Tracking the events.\r\n\tvar isDown = true;\r\n\tconf.onPointerDown = function (event) {\r\n\t\tisDown = false;\r\n\t\tself.gesture = \"pointerdown\";\r\n\t\tconf.listener(event, self);\r\n\t};\r\n\tconf.onPointerMove = function (event) {\r\n\t\tself.gesture = \"pointermove\";\r\n\t\tconf.listener(event, self, isDown);\r\n\t};\r\n\tconf.onPointerUp = function (event) {\r\n\t\tisDown = true;\r\n\t\tself.gesture = \"pointerup\";\r\n\t\tconf.listener(event, self, true);\r\n\t};\r\n\t// Generate maintenance commands, and other configurations.\r\n\tvar self = root.pointerSetup(conf);\r\n\t// Attach events.\r\n\teventjs.add(conf.target, \"mousedown\", conf.onPointerDown);\r\n\teventjs.add(conf.target, \"mousemove\", conf.onPointerMove);\r\n\teventjs.add(conf.doc, \"mouseup\", conf.onPointerUp);\r\n\t// Return this object.\r\n\tconf.target.isPointerEmitter = true;\r\n\treturn self;\r\n};\r\n\r\neventjs.Gesture = eventjs.Gesture || {};\r\neventjs.Gesture._gestureHandlers = eventjs.Gesture._gestureHandlers || {};\r\neventjs.Gesture._gestureHandlers.pointerdown = root.pointerdown;\r\neventjs.Gesture._gestureHandlers.pointermove = root.pointermove;\r\neventjs.Gesture._gestureHandlers.pointerup = root.pointerup;\r\n\r\nreturn root;\r\n\r\n})(eventjs.proxy);\r\n/*:\r\n\t\"Device Motion\" and \"Shake\" event proxy.\r\n\t----------------------------------------------------\r\n\thttp://developer.android.com/reference/android/hardware/Sensoreventjs.html#values\r\n\t----------------------------------------------------\r\n\teventjs.add(window, \"shake\", function(event, self) {});\r\n\teventjs.add(window, \"devicemotion\", function(event, self) {\r\n\t\tconsole.log(self.acceleration, self.accelerationIncludingGravity);\r\n\t});\r\n*/\r\n\r\nif (typeof(eventjs) === \"undefined\") var eventjs = {};\r\nif (typeof(eventjs.proxy) === \"undefined\") eventjs.proxy = {};\r\n\r\neventjs.proxy = (function(root) { \"use strict\";\r\n\r\nroot.shake = function(conf) {\r\n\t// Externally accessible data.\r\n\tvar self = {\r\n\t\tgesture: \"devicemotion\",\r\n\t\tacceleration: {},\r\n\t\taccelerationIncludingGravity: {},\r\n\t\ttarget: conf.target,\r\n\t\tlistener: conf.listener,\r\n\t\tremove: function() {\r\n\t\t\twindow.removeEventListener('devicemotion', onDeviceMotion, false);\r\n\t\t}\r\n\t};\r\n\t// Setting up local variables.\r\n\tvar threshold = 4; // Gravitational threshold.\r\n\tvar timeout = 1000; // Timeout between shake events.\r\n\tvar timeframe = 200; // Time between shakes.\r\n\tvar shakes = 3; // Minimum shakes to trigger event.\r\n\tvar lastShake = (new Date()).getTime();\r\n\tvar gravity = { x: 0, y: 0, z: 0 };\r\n\tvar delta = {\r\n\t\tx: { count: 0, value: 0 },\r\n\t\ty: { count: 0, value: 0 },\r\n\t\tz: { count: 0, value: 0 }\r\n\t};\r\n\t// Tracking the events.\r\n\tvar onDeviceMotion = function(e) {\r\n\t\tvar alpha = 0.8; // Low pass filter.\r\n\t\tvar o = e.accelerationIncludingGravity;\r\n\t\tgravity.x = alpha * gravity.x + (1 - alpha) * o.x;\r\n\t\tgravity.y = alpha * gravity.y + (1 - alpha) * o.y;\r\n\t\tgravity.z = alpha * gravity.z + (1 - alpha) * o.z; \r\n\t\tself.accelerationIncludingGravity = gravity;\r\n\t\tself.acceleration.x = o.x - gravity.x;\r\n\t\tself.acceleration.y = o.y - gravity.y;\r\n\t\tself.acceleration.z = o.z - gravity.z;\r\n\t\t///\r\n\t\tif (conf.gesture === \"devicemotion\") {\r\n\t\t\tconf.listener(e, self);\r\n\t\t\treturn;\r\n\t\t} \r\n\t\tvar data = \"xyz\";\r\n\t\tvar now = (new Date()).getTime();\r\n\t\tfor (var n = 0, length = data.length; n < length; n ++) {\r\n\t\t\tvar letter = data[n];\r\n\t\t\tvar ACCELERATION = self.acceleration[letter];\r\n\t\t\tvar DELTA = delta[letter];\r\n\t\t\tvar abs = Math.abs(ACCELERATION);\r\n\t\t\t/// Check whether another shake event was recently registered.\r\n\t\t\tif (now - lastShake < timeout) continue;\r\n\t\t\t/// Check whether delta surpasses threshold.\r\n\t\t\tif (abs > threshold) {\r\n\t\t\t\tvar idx = now * ACCELERATION / abs;\r\n\t\t\t\tvar span = Math.abs(idx + DELTA.value);\r\n\t\t\t\t// Check whether last delta was registered within timeframe.\r\n\t\t\t\tif (DELTA.value && span < timeframe) {\r\n\t\t\t\t\tDELTA.value = idx;\r\n\t\t\t\t\tDELTA.count ++;\r\n\t\t\t\t\t// Check whether delta count has enough shakes.\r\n\t\t\t\t\tif (DELTA.count === shakes) {\r\n\t\t\t\t\t\tconf.listener(e, self);\r\n\t\t\t\t\t\t// Reset tracking.\r\n\t\t\t\t\t\tlastShake = now;\r\n\t\t\t\t\t\tDELTA.value = 0;\r\n\t\t\t\t\t\tDELTA.count = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Track first shake.\r\n\t\t\t\t\tDELTA.value = idx;\r\n\t\t\t\t\tDELTA.count = 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\t// Attach events.\r\n\tif (!window.addEventListener) return;\r\n\twindow.addEventListener('devicemotion', onDeviceMotion, false);\r\n\t// Return this object.\r\n\treturn self;\r\n};\r\n\r\neventjs.Gesture = eventjs.Gesture || {};\r\neventjs.Gesture._gestureHandlers = eventjs.Gesture._gestureHandlers || {};\r\neventjs.Gesture._gestureHandlers.shake = root.shake;\r\n\r\nreturn root;\r\n\r\n})(eventjs.proxy);\r\n/*:\r\n\t\"Swipe\" event proxy (1+ fingers).\r\n\t----------------------------------------------------\r\n\tCONFIGURE: snap, threshold, maxFingers.\r\n\t----------------------------------------------------\r\n\teventjs.add(window, \"swipe\", function(event, self) {\r\n\t\tconsole.log(self.velocity, self.angle);\r\n\t});\r\n*/\r\n\r\nif (typeof(eventjs) === \"undefined\") var eventjs = {};\r\nif (typeof(eventjs.proxy) === \"undefined\") eventjs.proxy = {};\r\n\r\neventjs.proxy = (function(root) { \"use strict\";\r\n\r\nvar RAD_DEG = Math.PI / 180;\r\n\r\nroot.swipe = function(conf) {\r\n\tconf.snap = conf.snap || 90; // angle snap.\r\n\tconf.threshold = conf.threshold || 1; // velocity threshold.\r\n\tconf.gesture = conf.gesture || \"swipe\";\r\n\t// Tracking the events.\r\n\tconf.onPointerDown = function (event) {\r\n\t\tif (root.pointerStart(event, self, conf)) {\r\n\t\t\teventjs.add(conf.doc, \"mousemove\", conf.onPointerMove).listener(event);\r\n\t\t\teventjs.add(conf.doc, \"mouseup\", conf.onPointerUp);\r\n\t\t}\r\n\t};\r\n\tconf.onPointerMove = function (event) {\r\n\t\tvar touches = event.changedTouches || root.getCoords(event);\r\n\t\tvar length = touches.length;\r\n\t\tfor (var i = 0; i < length; i ++) {\r\n\t\t\tvar touch = touches[i];\r\n\t\t\tvar sid = touch.identifier || Infinity;\r\n\t\t\tvar o = conf.tracker[sid];\r\n\t\t\t// Identifier defined outside of listener.\r\n\t\t\tif (!o) continue; \r\n\t\t\to.move.x = touch.pageX;\r\n\t\t\to.move.y = touch.pageY;\r\n\t\t\to.moveTime = (new Date()).getTime();\r\n\t\t}\r\n\t};\r\n\tconf.onPointerUp = function(event) {\r\n\t\tif (root.pointerEnd(event, self, conf)) {\r\n\t\t\teventjs.remove(conf.doc, \"mousemove\", conf.onPointerMove);\r\n\t\t\teventjs.remove(conf.doc, \"mouseup\", conf.onPointerUp);\r\n\t\t\t///\r\n\t\t\tvar velocity1;\r\n\t\t\tvar velocity2\r\n\t\t\tvar degree1;\r\n\t\t\tvar degree2;\r\n\t\t\t/// Calculate centroid of gesture.\r\n\t\t\tvar start = { x: 0, y: 0 };\r\n\t\t\tvar endx = 0;\r\n\t\t\tvar endy = 0;\r\n\t\t\tvar length = 0;\r\n\t\t\t///\r\n\t\t\tfor (var sid in conf.tracker) {\r\n\t\t\t\tvar touch = conf.tracker[sid];\r\n\t\t\t\tvar xdist = touch.move.x - touch.start.x;\r\n\t\t\t\tvar ydist = touch.move.y - touch.start.y;\r\n\t\t\t\t///\r\n\t\t\t\tendx += touch.move.x;\r\n\t\t\t\tendy += touch.move.y;\r\n\t\t\t\tstart.x += touch.start.x;\r\n\t\t\t\tstart.y += touch.start.y;\r\n\t\t\t\tlength ++;\r\n\t\t\t\t///\r\n\t\t\t\tvar distance = Math.sqrt(xdist * xdist + ydist * ydist);\r\n\t\t\t\tvar ms = touch.moveTime - touch.startTime;\r\n\t\t\t\tvar degree2 = Math.atan2(xdist, ydist) / RAD_DEG + 180;\r\n\t\t\t\tvar velocity2 = ms ? distance / ms : 0;\r\n\t\t\t\tif (typeof(degree1) === \"undefined\") {\r\n\t\t\t\t\tdegree1 = degree2;\r\n\t\t\t\t\tvelocity1 = velocity2;\r\n\t\t\t\t} else if (Math.abs(degree2 - degree1) <= 20) {\r\n\t\t\t\t\tdegree1 = (degree1 + degree2) / 2;\r\n\t\t\t\t\tvelocity1 = (velocity1 + velocity2) / 2;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t///\r\n\t\t\tvar fingers = conf.gestureFingers;\r\n\t\t\tif (conf.minFingers <= fingers && conf.maxFingers >= fingers) {\r\n\t\t\t\tif (velocity1 > conf.threshold) {\r\n\t\t\t\t\tstart.x /= length;\r\n\t\t\t\t\tstart.y /= length;\r\n\t\t\t\t\tself.start = start;\r\n\t\t\t\t\tself.x = endx / length;\r\n\t\t\t\t\tself.y = endy / length;\r\n\t\t\t\t\tself.angle = -((((degree1 / conf.snap + 0.5) >> 0) * conf.snap || 360) - 360);\r\n\t\t\t\t\tself.velocity = velocity1;\r\n\t\t\t\t\tself.fingers = fingers;\r\n\t\t\t\t\tself.state = \"swipe\";\r\n\t\t\t\t\tconf.listener(event, self);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\t// Generate maintenance commands, and other configurations.\r\n\tvar self = root.pointerSetup(conf);\r\n\t// Attach events.\r\n\teventjs.add(conf.target, \"mousedown\", conf.onPointerDown);\r\n\t// Return this object.\r\n\treturn self;\r\n};\r\n\r\neventjs.Gesture = eventjs.Gesture || {};\r\neventjs.Gesture._gestureHandlers = eventjs.Gesture._gestureHandlers || {};\r\neventjs.Gesture._gestureHandlers.swipe = root.swipe;\r\n\r\nreturn root;\r\n\r\n})(eventjs.proxy);\r\n/*:\r\n\t\"Tap\" and \"Longpress\" event proxy.\r\n\t----------------------------------------------------\r\n\tCONFIGURE: delay (longpress), timeout (tap).\r\n\t----------------------------------------------------\r\n\teventjs.add(window, \"tap\", function(event, self) {\r\n\t\tconsole.log(self.fingers);\r\n\t});\r\n\t----------------------------------------------------\r\n\tmulti-finger tap // touch an target for <= 250ms.\r\n\tmulti-finger longpress // touch an target for >= 500ms\r\n*/\r\n\r\nif (typeof(eventjs) === \"undefined\") var eventjs = {};\r\nif (typeof(eventjs.proxy) === \"undefined\") eventjs.proxy = {};\r\n\r\neventjs.proxy = (function(root) { \"use strict\";\r\n\r\nroot.longpress = function(conf) {\r\n\tconf.gesture = \"longpress\";\r\n\treturn root.tap(conf);\r\n};\r\n\r\nroot.tap = function(conf) {\r\n\tconf.delay = conf.delay || 500;\r\n\tconf.timeout = conf.timeout || 250;\r\n\tconf.driftDeviance = conf.driftDeviance || 10;\r\n\tconf.gesture = conf.gesture || \"tap\";\r\n\t// Setting up local variables.\r\n\tvar timestamp, timeout;\r\n\t// Tracking the events.\r\n\tconf.onPointerDown = function (event) {\r\n\t\tif (root.pointerStart(event, self, conf)) {\r\n\t\t\ttimestamp = (new Date()).getTime();\r\n\t\t\t// Initialize event listeners.\r\n\t\t\teventjs.add(conf.doc, \"mousemove\", conf.onPointerMove).listener(event);\r\n\t\t\teventjs.add(conf.doc, \"mouseup\", conf.onPointerUp);\r\n\t\t\t// Make sure this is a \"longpress\" event.\r\n\t\t\tif (conf.gesture !== \"longpress\") return;\r\n\t\t\ttimeout = setTimeout(function() {\r\n\t\t\t\tif (event.cancelBubble && ++event.cancelBubbleCount > 1) return;\r\n\t\t\t\t// Make sure no fingers have been changed.\r\n\t\t\t\tvar fingers = 0;\r\n\t\t\t\tfor (var key in conf.tracker) {\r\n\t\t\t\t\tvar point = conf.tracker[key];\r\n\t\t\t\t\tif (point.end === true) return;\r\n\t\t\t\t\tif (conf.cancel) return;\r\n\t\t\t\t\tfingers ++;\r\n\t\t\t\t}\r\n\t\t\t\t// Send callback.\r\n\t\t\t\tif (conf.minFingers <= fingers && conf.maxFingers >= fingers) {\r\n\t\t\t\t\tself.state = \"start\";\r\n\t\t\t\t\tself.fingers = fingers;\r\n\t\t\t\t\tself.x = point.start.x;\r\n\t\t\t\t\tself.y = point.start.y;\r\n\t\t\t\t\tconf.listener(event, self);\r\n\t\t\t\t}\r\n\t\t\t}, conf.delay);\r\n\t\t}\r\n\t};\r\n\tconf.onPointerMove = function (event) {\r\n\t\tvar bbox = conf.bbox;\r\n\t\tvar touches = event.changedTouches || root.getCoords(event);\r\n\t\tvar length = touches.length;\r\n\t\tfor (var i = 0; i < length; i ++) {\r\n\t\t\tvar touch = touches[i];\r\n\t\t\tvar identifier = touch.identifier || Infinity;\r\n\t\t\tvar pt = conf.tracker[identifier];\r\n\t\t\tif (!pt) continue;\r\n\t\t\tvar x = (touch.pageX - bbox.x1);\r\n\t\t\tvar y = (touch.pageY - bbox.y1);\r\n\t\t\t///\r\n\t\t\tvar dx = x - pt.start.x;\r\n\t\t\tvar dy = y - pt.start.y;\r\n\t\t\tvar distance = Math.sqrt(dx * dx + dy * dy);\r\n\t\t\tif (!(x > 0 && x < bbox.width && // Within target coordinates..\r\n\t\t\t\t y > 0 && y < bbox.height &&\r\n\t\t\t\t distance <= conf.driftDeviance)) { // Within drift deviance.\r\n\t\t\t\t// Cancel out this listener.\r\n\t\t\t\teventjs.remove(conf.doc, \"mousemove\", conf.onPointerMove);\r\n\t\t\t\tconf.cancel = true;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\tconf.onPointerUp = function(event) {\r\n\t\tif (root.pointerEnd(event, self, conf)) {\r\n\t\t\tclearTimeout(timeout);\r\n\t\t\teventjs.remove(conf.doc, \"mousemove\", conf.onPointerMove);\r\n\t\t\teventjs.remove(conf.doc, \"mouseup\", conf.onPointerUp);\r\n\t\t\tif (event.cancelBubble && ++event.cancelBubbleCount > 1) return;\r\n\t\t\t// Callback release on longpress.\r\n\t\t\tif (conf.gesture === \"longpress\") {\r\n\t\t\t\tif (self.state === \"start\") {\r\n\t\t\t\t\tself.state = \"end\";\r\n\t\t\t\t\tconf.listener(event, self);\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t// Cancel event due to movement.\r\n\t\t\tif (conf.cancel) return;\r\n\t\t\t// Ensure delay is within margins.\r\n\t\t\tif ((new Date()).getTime() - timestamp > conf.timeout) return;\r\n\t\t\t// Send callback.\r\n\t\t\tvar fingers = conf.gestureFingers;\r\n\t\t\tif (conf.minFingers <= fingers && conf.maxFingers >= fingers) {\r\n\t\t\t\tself.state = \"tap\";\r\n\t\t\t\tself.fingers = conf.gestureFingers;\r\n\t\t\t\tconf.listener(event, self);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\t// Generate maintenance commands, and other configurations.\r\n\tvar self = root.pointerSetup(conf);\r\n\t// Attach events.\r\n\teventjs.add(conf.target, \"mousedown\", conf.onPointerDown);\r\n\t// Return this object.\r\n\treturn self;\r\n};\r\n\r\neventjs.Gesture = eventjs.Gesture || {};\r\neventjs.Gesture._gestureHandlers = eventjs.Gesture._gestureHandlers || {};\r\neventjs.Gesture._gestureHandlers.tap = root.tap;\r\neventjs.Gesture._gestureHandlers.longpress = root.longpress;\r\n\r\nreturn root;\r\n\r\n})(eventjs.proxy);\r\n/*:\r\n\t\"Mouse Wheel\" event proxy.\r\n\t----------------------------------------------------\r\n\teventjs.add(window, \"wheel\", function(event, self) {\r\n\t\tconsole.log(self.state, self.wheelDelta);\r\n\t});\r\n*/\r\n\r\nif (typeof(eventjs) === \"undefined\") var eventjs = {};\r\nif (typeof(eventjs.proxy) === \"undefined\") eventjs.proxy = {};\r\n\r\neventjs.proxy = (function(root) { \"use strict\";\r\n\r\nroot.wheelPreventElasticBounce = function(el) {\r\n\tif (!el) return;\r\n\tif (typeof(el) === \"string\") el = document.querySelector(el);\r\n\teventjs.add(el, \"wheel\", function(event, self) {\r\n\t\tself.preventElasticBounce();\r\n\t\teventjs.stop(event);\r\n\t});\r\n};\r\n\r\nroot.wheel = function(conf) {\r\n\t// Configure event listener.\r\n\tvar interval;\r\n\tvar timeout = conf.timeout || 150;\r\n\tvar count = 0;\r\n\t// Externally accessible data.\r\n\tvar self = {\r\n\t\tgesture: \"wheel\",\r\n\t\tstate: \"start\",\r\n\t\twheelDelta: 0,\r\n\t\ttarget: conf.target,\r\n\t\tlistener: conf.listener,\r\n\t\tpreventElasticBounce: function(event) {\r\n\t\t\tvar target = this.target;\r\n\t\t\tvar scrollTop = target.scrollTop;\r\n\t\t\tvar top = scrollTop + target.offsetHeight;\r\n\t\t\tvar height = target.scrollHeight;\r\n\t\t\tif (top === height && this.wheelDelta <= 0) eventjs.cancel(event);\r\n\t\t\telse if (scrollTop === 0 && this.wheelDelta >= 0) eventjs.cancel(event);\r\n\t\t\teventjs.stop(event);\r\n\t\t},\r\n\t\tadd: function() {\r\n\t\t\tconf.target[add](type, onMouseWheel, false);\r\n\t\t},\r\n\t\tremove: function() {\r\n\t\t\tconf.target[remove](type, onMouseWheel, false);\r\n\t\t}\r\n\t};\r\n\t// Tracking the events.\r\n\tvar onMouseWheel = function(event) {\r\n\t\tevent = event || window.event;\r\n\t\tself.state = count++ ? \"change\" : \"start\";\r\n\t\tself.wheelDelta = event.detail ? event.detail * -20 : event.wheelDelta;\r\n\t\tconf.listener(event, self);\r\n\t\tclearTimeout(interval);\r\n\t\tinterval = setTimeout(function() {\r\n\t\t\tcount = 0;\r\n\t\t\tself.state = \"end\";\r\n\t\t\tself.wheelDelta = 0;\r\n\t\t\tconf.listener(event, self);\r\n\t\t}, timeout);\r\n\t};\r\n\t// Attach events.\r\n\tvar add = document.addEventListener ? \"addEventListener\" : \"attachEvent\";\r\n\tvar remove = document.removeEventListener ? \"removeEventListener\" : \"detachEvent\";\r\n\tvar type = eventjs.getEventSupport(\"mousewheel\") ? \"mousewheel\" : \"DOMMouseScroll\";\r\n\tconf.target[add](type, onMouseWheel, false);\r\n\t// Return this object.\r\n\treturn self;\r\n};\r\n\r\neventjs.Gesture = eventjs.Gesture || {};\r\neventjs.Gesture._gestureHandlers = eventjs.Gesture._gestureHandlers || {};\r\neventjs.Gesture._gestureHandlers.wheel = root.wheel;\r\n\r\nreturn root;\r\n\r\n})(eventjs.proxy);"],"sourceRoot":"webpack:///","file":"scripts.79f25997e6d3c522.js"}