(function($){var Touchable=$.Touchable;$.fn.Hoverable=function(conf){return this.each(function(){var t=$(this).data['Hoverable']=new Hoverable(this,conf);return t;});}$.fn.newHover=function(fn1,fn2,disableHover){return this.each(function(){$(this).bind('newHoverIn',fn1).bind('newHoverOut',fn2);});}$.fn.newHover2=function(fn1,fn2){return this.each(function(){$(this).bind('newHoverIn2',fn1).bind('newHoverOut2',fn2);});}function Hoverable(elem,conf){var self=this;this.logging=false;var log=function(a){if(self.logging&&(typeof console!=='undefined')){console.log(Array.prototype.slice.call(arguments));}};this.elem=elem;if(!$(elem).Touchable)throw new Error('Hoverable depends on Touchable! Please be sure to include Touchable in your project.')this.$elem=$(elem).Touchable(conf);this.inHover=false;this.target=null;if(typeof conf!=='undefined'){if(typeof conf.disableHover!=='undefined'){this.disableHover=conf.disableHover;}else{this.disableHover=false;}if(typeof conf.logging!=='undefined'){this.logging=conf.logging;}}if(!this.disableHover){this.$elem.mouseenter(genericHover);this.$elem.bind('mouseleave',genericHover);}this.$elem.bind('longTap',genericHover);this.$elem.bind('touchableend',genericHover);function genericHover(e,touch){if(e.type==='touchableend'||e.type==='mouseleave'){log('Touchable newHoverOut');return self.$elem.trigger('newHoverOut',self);}log('Touchable newHoverIn');self.$elem.trigger('newHoverIn',self);}if(!this.disableHover){this.$elem.bind('mouseenter',genericHover2);this.$elem.bind('mouseleave',genericHover2);}self.$elem.bind('touchablestart',function(e,touch){self.$elem.bind('touchablemove',genericHover2);},false);self.$elem.bind('touchableend',function(e,touch){self.$elem.unbind('touchablemove',genericHover2);genericHover2(e,touch);},false);function genericHover2(e,touch){if(e.type==='touchableend'||e.type==='touchend'){log('Touchable newHoverOut2');self.inHover=false;return self.$elem.trigger('newHoverOut2',self);}else if(e.type==='mouseenter'){log('Touchable newHoverIn2');return self.$elem.trigger('newHoverIn2',self);}else if(e.type==='mouseleave'){log('Touchable newHoverOut2');return self.$elem.trigger('newHoverOut2',self);}if(e.type=='touchablemove'){if(touch instanceof Touchable){var hitTarget=self.hitTarget;log('Touchable target ID/node'+' hitTarget'+' '+hitTarget+'e.target'+e.target+' e.currentTarget'+e.currentTarget+' self in hover'+self.inHover);var pass=false;if(typeof e.currentTarget!=='undefined'&&e.currentTarget===self.$elem.get(0)){pass=true;}if(pass&&!self.inHover){self.inHover=true;log('Touchable newHoverIn2');self.$elem.trigger('newHoverIn2',self);}else if(pass===false&&self.inHover){self.inHover=false;log('Touchable newHoverOut2');self.$elem.trigger('newHoverOut2',self);}}}}}})(jQuery);(function($){$.fn.Touchable=function(conf){return this.each(function(){var t=$(this).data['Touchable']=new Touchable(this,conf);return t;});}$.fn.newHover=function(fn1,fn2,disableHover){return this.each(function(){$(this).bind('newHoverIn',fn1).bind('newHoverOut',fn2);});}$.fn.newHover2=function(fn1,fn2){return this.each(function(){$(this).bind('newHoverIn2',fn1).bind('newHoverOut2',fn2);});}$.Touchable=Touchable;function Touchable(elem,conf){this.logging=false;var log=function(a){if(self.logging&&(typeof console!=='undefined')){console.log(Array.prototype.slice.call(arguments));}};this.elem=elem;this.$elem=$(elem);this.is_doubleTap=false;this.is_currentlyTouching=false;this.isOneFingerGesture=false;this.startTouch={x:0,y:0};this.currentTouch={x:0,y:0};this.previousTouch={x:0,y:0};this.currentDelta={x:0,y:0};this.currentStartDelta={x:0,y:0};this.currentPosition={x:0,y:0};this.doubleTapTimer=null,this.longTapTimer=null;var self=this;if(typeof conf!=='undefined'){if(typeof conf.logging!=='undefined'){this.logging=conf.logging;}}var addEventListener=elem.addEventListener||elem.attachEvent
var removeEventListener=elem.removeEventListener||elem.detachEvent
addEventListener.call(elem,'touchstart',function(){self.$elem.trigger('touchstart')},true);addEventListener.call(elem,'touchend',function(){self.$elem.trigger('touchend')},false);addEventListener.call(elem,'touchmove',function(){self.$elem.trigger('touchmove')},false);addEventListener.call(elem,'touchstart',touchstart,false);this.$elem.mousedown(touchstart);function touchstart(e){if(typeof e.touches!=="undefined"){log('Touchable Touchstart touches length '+e.touches.length);if(e.touches.length!==1&&e.touches.length!==2){return false;}if(self.isCurrentlyTouching){return false;}self.isCurrentlyTouching=true;if(e.touches.length==1){self.isOneFingerGesture=true;self.startTouch.x=self.previousTouch.x=e.touches[0].clientX;self.startTouch.y=self.previousTouch.y=e.touches[0].clientY;}else if(e.touches.length==2){self.isOneFingerGesture=false;if(e.touches[0].clientY>e.touches[1].clientY){self.startTouch.x=self.previousTouch.x=e.touches[0].clientX;self.startTouch.y=self.previousTouch.y=e.touches[0].clientY;}else{self.startTouch.x=self.previousTouch.x=self.touches[1].clientX;self.startTouch.y=self.previousTouch.y=self.touches[1].clientY;}}addEventListener.call(document,'touchmove',touchmove,false);addEventListener.call(document,'touchend',touchend,false);}else{log('Touchable Touchstart touches length '+e.pageX+' '+e.pageY);self.startTouch.x=self.previousTouch.x=e.pageX;self.startTouch.y=self.previousTouch.y=e.pageY;$(document).mousemove(touchmove);$(document).mouseup(touchend);}self.target=e.target;self.currentTarget=e.currentTarget;var x=self.startTouch.x;var y=self.startTouch.y;self.hitTarget=(document.elementFromPoint)?(document.elementFromPoint(x,y)):'';e.preventDefault()if(!self.inDoubleTap){self.inDoubleTap=true;self.doubleTapTimer=setTimeout(function(){self.inDoubleTap=false;},500);}else{log('Touchable doubleTap');self.$elem.trigger('doubleTap',self);clearTimeout(self.doubleTapTimer);self.inDoubleTap=false;}self.longTapTimer=setTimeout(function(){log('Touchable longTap');$(self.elem).trigger('longTap',self);},1000);log('Touchable Tap');$(self.elem).trigger('tap',self);$(self.elem).trigger('touchablestart',self);}function touchmove(e){if(typeof e.touches!=='undefined'){log('Touchable Touchsmove touches length '+e.touches.length);if(e.touches.length!==1&&e.touches.length!==2)return false;if(e.touches.length==1||self.isOneFingerGesture){self.currentTouch.x=e.touches[0].clientX;self.currentTouch.y=e.touches[0].clientY;}else if(self.touches.length==2&&!self.isOneFingerGesture){if(e.touches[0].clientY>e.touches[1].clientY){self.currentTouch.x=e.touches[0].clientX;self.currentTouch.y=e.touches[0].clientY;}else{self.currentTouch.x=e.touches[1].clientX;self.currentTouch.y=e.touches[1].clientY;}}}else{self.currentTouch.x=e.pageX;self.currentTouch.y=e.pageY;}$(self.elem).removeClass('webkitAnimate');self.currentDelta.x=(self.currentTouch.x-self.previousTouch.x);self.currentDelta.y=(self.currentTouch.y-self.previousTouch.y);self.currentStartDelta.x=(self.currentTouch.x-self.startTouch.x);self.currentStartDelta.y=(self.currentTouch.y-self.startTouch.y);self.currentPosition.x=self.currentPosition.x+self.currentDelta.x;self.currentPosition.y=self.currentPosition.y+self.currentDelta.y;self.previousTouch.x=self.currentTouch.x;self.previousTouch.y=self.currentTouch.y;log('Touchable Touchablemove self e.target'+e.target+'e.currentTarget '+e.currentTarget+' x:'+self.currentStartDelta.x);self.target=e.target;self.currentTarget=e.currentTarget;var x=self.currentTouch.x;var y=self.currentTouch.y;self.hitTarget=(document.elementFromPoint)?(document.elementFromPoint(x,y)):'';$(self.elem).trigger('touchablemove',self);if(self.longTapTimer)clearTimeout(self.longTapTimer);}function touchend(e){if(typeof e.touches!=='undefined'){if(e.targetTouches.length>0)return false;removeEventListener.call(self.elem,'touchmove',touchmove,false);removeEventListener.call(self.elem,'touchend',touchend,false);}else{$(document).unbind('mousemove',touchmove);$(document).unbind('mouseup',touchend);}self.isCurrentlyTouching=false;if(self.longTapTimer)clearTimeout(self.longTapTimer);log('Touchable Touchend self '+self.currentStartDelta.x);$(self.elem).trigger('touchableend',self);log('Touchable: touchableend');$(self.hitTarget).trigger('click',self);log('Touchable: Hittarget click');}}})(jQuery);
