(function(){[Element,Window,Document].invoke('implement',{hasEvent:function(event){var events=this.retrieve('events'),list=(events&&events[event])?events[event].values:null;if(list){for(var i=list.length;i--;)if(i in list){return true}}return false}});var wrap=function(custom,method,extended,name){method=custom[method];extended=custom[extended];return function(fn,customName){if(!customName){customName=name}if(extended&&!this.hasEvent(customName)){extended.call(this,fn,customName)}if(method){method.call(this,fn,customName)}}};var inherit=function(custom,base,method,name){return function(fn,customName){base[method].call(this,fn,customName||name);custom[method].call(this,fn,customName||name)}};var events=Element.Events;Element.defineCustomEvent=function(name,custom){var base=events[custom.base];custom.onAdd=wrap(custom,'onAdd','onSetup',name);custom.onRemove=wrap(custom,'onRemove','onTeardown',name);events[name]=base?Object.append({},custom,{base:base.base,condition:function(event){return(!base.condition||base.condition.call(this,event))&&(!custom.condition||custom.condition.call(this,event))},onAdd:inherit(custom,base,'onAdd',name),onRemove:inherit(custom,base,'onRemove',name)}):custom;return this};var loop=function(name){var method='on'+name.capitalize();Element[name+'CustomEvents']=function(){Object.each(events,function(event,name){if(event[method]){event[method].call(event,name)}})};return loop};loop('enable')('disable')})();Browser.Features.Touch=(function(){try{document.createEvent('TouchEvent').initTouchEvent('touchstart');return true}catch(exception){}return false})();Browser.Features.iOSTouch=(function(){var name='cantouch',html=document.html,hasTouch=false;if(!html.addEventListener){return false}var handler=function(){html.removeEventListener(name,handler,true);hasTouch=true};try{html.addEventListener(name,handler,true);var event=document.createEvent('TouchEvent');event.initTouchEvent(name);html.dispatchEvent(event);return hasTouch}catch(exception){}handler();return false})();(function(){var name='swipe',distanceKey=name+':distance',cancelKey=name+':cancelVertical',dflt=50;var start={},disabled,active;var clean=function(){active=false};var events={touchstart:function(event){if(event.touches.length>1){return}var touch=event.touches[0];active=true;start={x:touch.pageX,y:touch.pageY}},touchmove:function(event){if(disabled||!active){return}var touch=event.changedTouches[0],end={x:touch.pageX,y:touch.pageY};if(this.retrieve(cancelKey)&&Math.abs(start.y-end.y)>10){active=false;return}var distance=this.retrieve(distanceKey,dflt),delta=end.x-start.x,isLeftSwipe=delta<-distance,isRightSwipe=delta>distance;if(!isRightSwipe&&!isLeftSwipe){return}event.preventDefault();active=false;event.direction=(isLeftSwipe?'left':'right');event.start=start;event.end=end;this.fireEvent(name,event)},touchend:clean,touchcancel:clean};Element.defineCustomEvent(name,{onSetup:function(){this.addEvents(events)},onTeardown:function(){this.removeEvents(events)},onEnable:function(){disabled=false},onDisable:function(){disabled=true;clean()}})})();(function(){var preventDefault=function(event){event.preventDefault()};var disabled;Element.defineCustomEvent('touch',{base:'touchend',condition:function(event){if(disabled||event.targetTouches.length!=0){return false}var touch=event.changedTouches[0],target=document.elementFromPoint(touch.clientX,touch.clientY);do{if(target==this){return true}}while((target=target.parentNode)&&target);return false},onSetup:function(){this.addEvent('touchstart',preventDefault)},onTeardown:function(){this.removeEvent('touchstart',preventDefault)},onEnable:function(){disabled=false},onDisable:function(){disabled=true}})})();if(Browser.Features.iOSTouch)(function(){var name='click';delete Element.NativeEvents[name];Element.defineCustomEvent(name,{base:'touch'})})();
