/*
jQuery grab 
https://github.com/jussi-kalliokoski/jQuery.grab
Ported from Jin.js::gestures   
https://github.com/jussi-kalliokoski/jin.js/
Created by Jussi Kalliokoski
Licensed under MIT License. 

Includes fix for IE
*/
(function(g){function e(a,b,f){if(b.substr(0,5)!=="touch")return g(a).unbind(b,f);var d;for(d=0;d<c._binds.length;d++)c._binds[d].elem===a&&c._binds[d].type===b&&c._binds[d].func===f&&(document.addEventListener?a.removeEventListener(b,c._binds[d].fnc,false):a.detachEvent("on"+b,c._binds[d].fnc),c._binds.splice(d--,1))}function c(a,b,f,d){if(b.substr(0,5)!=="touch")return g(a).bind(b,d,f);var e;if(c[b])return c[b].bind(a,b,f,d);e=function(b){if(!b)b=window.event;if(!b.stopPropagation)b.stopPropagation= function(){this.cancelBubble=true};b.data=d;f.call(a,b)};document.addEventListener?a.addEventListener(b,e,false):a.attachEvent("on"+b,e);c._binds.push({elem:a,type:b,func:f,fnc:e})}function p(a){a.data.position.x=a.pageX;a.data.position.y=a.pageY;a.data.start.x=a.pageX;a.data.start.y=a.pageY;a.data.event=a;if(!a.data.onstart||!a.data.onstart.call(a.data.element,a.data))a.preventDefault&&a.data.preventDefault&&a.preventDefault(),a.stopPropagation&&a.data.stopPropagation&&a.stopPropagation(),c(a.data.affects, h,i,a.data),c(a.data.affects,j,k,a.data)}function i(a){a.preventDefault&&a.data.preventDefault&&a.preventDefault();a.stopPropagation&&a.data.preventDefault&&a.stopPropagation();a.data.move.x=a.pageX-a.data.position.x;a.data.move.y=a.pageY-a.data.position.y;a.data.position.x=a.pageX;a.data.position.y=a.pageY;a.data.offset.x=a.pageX-a.data.start.x;a.data.offset.y=a.pageY-a.data.start.y;a.data.event=a;a.data.onmove&&a.data.onmove.call(a.data.element,a.data)}function k(a){a.preventDefault&&a.data.preventDefault&& a.preventDefault();a.stopPropagation&&a.data.stopPropagation&&a.stopPropagation();e(a.data.affects,h,i);e(a.data.affects,j,k);a.data.event=a;a.data.onfinish&&a.data.onfinish.call(a.data.element,a.data)}function q(a){a.data.position.x=a.touches[0].pageX;a.data.position.y=a.touches[0].pageY;a.data.start.x=a.touches[0].pageX;a.data.start.y=a.touches[0].pageY;a.data.event=a;if(!a.data.onstart||!a.data.onstart.call(a.data.element,a.data))a.preventDefault&&a.data.preventDefault&&a.preventDefault(),a.stopPropagation&& a.data.stopPropagation&&a.stopPropagation(),c(a.data.affects,l,m,a.data),c(a.data.affects,n,o,a.data)}function m(a){a.preventDefault&&a.data.preventDefault&&a.preventDefault();a.stopPropagation&&a.data.stopPropagation&&a.stopPropagation();a.data.move.x=a.touches[0].pageX-a.data.position.x;a.data.move.y=a.touches[0].pageY-a.data.position.y;a.data.position.x=a.touches[0].pageX;a.data.position.y=a.touches[0].pageY;a.data.offset.x=a.touches[0].pageX-a.data.start.x;a.data.offset.y=a.touches[0].pageY-a.data.start.y; a.data.event=a;a.data.onmove&&a.data.onmove.call(a.data.elem,a.data)}function o(a){a.preventDefault&&a.data.preventDefault&&a.preventDefault();a.stopPropagation&&a.data.stopPropagation&&a.stopPropagation();e(a.data.affects,l,m);e(a.data.affects,n,o);a.data.event=a;a.data.onfinish&&a.data.onfinish.call(a.data.element,a.data)}var r=g.extend,h="mousemove",j="mouseup",l="touchmove",n="touchend";c._binds=[];g.fn.grab=function(a){return this.each(function(){var b={move:{x:0,y:0},offset:{x:0,y:0},position:{x:0, y:0},start:{x:0,y:0},affects:document.documentElement,stopPropagation:false,preventDefault:true,touch:true};r(b,a);b.element=this;c(this,"mousedown",p,b);b.touch&&c(this,"touchstart",q,b)})};g.fn.ungrab=function(){return this.each(function(){e(this,"mousedown","mousedown")})}})(jQuery);

