/*!
 * Touch enabled jQuery.event.drag
 * http://www.shamasis.net/projects/jquery-drag-touch/
 * @license Open Source MIT
 * @author Shamasis Bhattacharya <http://www.shamasis.net/>
 * @release 2.0.1
 *
 * @original-license
 * jquery.event.drag - v 2.0.0
 * Copyright (c) 2010 Three Dub Media - http://threedubmedia.com
 * Open Source MIT License - http://threedubmedia.com/code/license
 */
(function($){$.fn.drag=function(a,b,c){var d=typeof a=="string"?a:"",fn=$.isFunction(a)?a:$.isFunction(b)?b:null;if(d.indexOf("drag")!==0)d="drag"+d;c=(a==fn?b:c)||{};return fn?this.bind(d,c,fn):this.trigger(d)};var g=$.event,hasTouch='ontouchstart'in document.documentElement,initBindings=hasTouch?'touchstart':'mousedown',dragBindings=hasTouch?'touchmove touchend':'mousemove mouseup',touchEventXY=function(a,b){if(!b.touchXY||!a.originalEvent){return a}var c=a.originalEvent.changedTouches||a.originalEvent.touches;if(c&&c.length){$.extend(a,c[0])}return a},$special=g.special,drag=$special.drag={defaults:{which:1,distance:0,not:':input',handle:null,relative:false,drop:false,click:false,touchXY:true},datakey:"dragdata",livekey:"livedrag",add:function(c){var d=$.data(this,drag.datakey),opts=c.data||{};d.related+=1;if(!d.live&&c.selector){d.live=true;g.add(this,"draginit."+drag.livekey,drag.delegate)}$.each(drag.defaults,function(a,b){if(opts[a]!==undefined)d[a]=opts[a]})},remove:function(){$.data(this,drag.datakey).related-=1},setup:function(){if($.data(this,drag.datakey))return;var a=$.extend({related:0},drag.defaults);$.data(this,drag.datakey,a);g.add(this,initBindings,drag.init,a);if(this.attachEvent)this.attachEvent("ondragstart",drag.dontstart)},teardown:function(){if($.data(this,drag.datakey).related)return;$.removeData(this,drag.datakey);g.remove(this,initBindings,drag.init);g.remove(this,"draginit",drag.delegate);drag.textselect(true);if(this.detachEvent)this.detachEvent("ondragstart",drag.dontstart)},init:function(a){var b=a.data,results,touches=a.originalEvent?a.originalEvent.changedTouches||a.originalEvent.touches:[];if(touches&&touches.length){if(touches.length>1){return}}else{if(b.which>0&&a.which!=b.which){return}}if($(a.target).is(b.not))return;if(b.handle&&!$(a.target).closest(b.handle,a.currentTarget).length)return;b.propagates=1;b.interactions=[drag.interaction(this,b)];b.target=a.target;b.pageX=a.pageX;b.pageY=a.pageY;b.dragging=null;results=drag.hijack(a,"draginit",b);if(!b.propagates)return;results=drag.flatten(results);if(results&&results.length){b.interactions=[];$.each(results,function(){b.interactions.push(drag.interaction(this,b))})}b.propagates=b.interactions.length;if(b.drop!==false&&$special.drop)$special.drop.handler(a,b);drag.textselect(false);g.add(document,dragBindings,drag.handler,b);if(!hasTouch){return false}},interaction:function(a,b){return{drag:a,callback:new drag.callback(),droppable:[],offset:$(a)[b.relative?"position":"offset"]()||{top:0,left:0}}},handler:function(a){var b=a.data;if(!b.dragging&&(a.type==='mousemove'||a.type==='touchmove')){if(Math.pow(a.pageX-b.pageX,2)+Math.pow(a.pageY-b.pageY,2)<Math.pow(b.distance,2))return;a.target=b.target;drag.hijack(a,"dragstart",b);if(b.propagates)b.dragging=true}switch(a.type){case'touchmove':if(b.dragging){a.preventDefault();touchEventXY(a,b)}case'mousemove':if(b.dragging){drag.hijack(a,"drag",b);if(b.propagates){if(b.drop!==false&&$special.drop)$special.drop.handler(a,b);break}a.type="mouseup"}case'mouseup':case'touchend':g.remove(document,dragBindings,drag.handler);if(b.dragging){if(b.drop!==false&&$special.drop)$special.drop.handler(a,b);drag.hijack(a,"dragend",b)}drag.textselect(true);if(b.click===false&&b.dragging){jQuery.event.triggered=true;setTimeout(function(){jQuery.event.triggered=false},20);b.dragging=false}break}},delegate:function(b){var c=[],target,events=$.data(this,"events")||{};$.each(events.live||[],function(i,a){if(a.preType.indexOf("drag")!==0)return;target=$(b.target).closest(a.selector,b.currentTarget)[0];if(!target)return;g.add(target,a.origType+'.'+drag.livekey,a.origHandler,a.data);if($.inArray(target,c)<0)c.push(target)});if(!c.length)return false;return $(c).bind("dragend."+drag.livekey,function(){g.remove(this,"."+drag.livekey)})},hijack:function(b,c,d,x,e){if(!d)return;var f={event:b.originalEvent,type:b.type},mode=c.indexOf("drop")?"drag":"drop",result,i=x||0,ia,$elems,callback,len=!isNaN(x)?x:d.interactions.length;b.type=c;b.sourceEvent=f.event;b.originalEvent=null;d.results=[];do if(ia=d.interactions[i]){if(c!=="dragend"&&ia.cancelled)continue;callback=drag.properties(b,d,ia);ia.results=[];$(e||ia[mode]||d.droppable).each(function(p,a){callback.target=a;result=a?g.handle.call(a,b,callback):null;if(result===false){if(mode=="drag"){ia.cancelled=true;d.propagates-=1}if(c=="drop"){ia[mode][p]=null}}else if(c=="dropinit")ia.droppable.push(drag.element(result)||a);if(c=="dragstart")ia.proxy=$(drag.element(result)||ia.drag)[0];ia.results.push(result);delete b.result;if(c!=="dropinit")return result});d.results[i]=drag.flatten(ia.results);if(c=="dropinit")ia.droppable=drag.flatten(ia.droppable);if(c=="dragstart"&&!ia.cancelled)callback.update()}while(++i<len)b.type=f.type;b.originalEvent=f.event;return drag.flatten(d.results)},properties:function(a,b,c){var d=c.callback;d.drag=c.drag;d.proxy=c.proxy||c.drag;d.startX=b.pageX;d.startY=b.pageY;d.deltaX=a.pageX-b.pageX;d.deltaY=a.pageY-b.pageY;d.originalX=c.offset.left;d.originalY=c.offset.top;d.offsetX=a.pageX-(b.pageX-d.originalX);d.offsetY=a.pageY-(b.pageY-d.originalY);d.drop=drag.flatten((c.drop||[]).slice());d.available=drag.flatten((c.droppable||[]).slice());return d},element:function(a){if(a&&(a.jquery||a.nodeType==1))return a},flatten:function(b){return $.map(b,function(a){return a&&a.jquery?$.makeArray(a):a&&a.length?drag.flatten(a):a})},textselect:function(a){$(document)[a?"unbind":"bind"]("selectstart",drag.dontstart).attr("unselectable",a?"off":"on").css("MozUserSelect",a?"":"none")},dontstart:function(){return false},callback:function(){}};drag.callback.prototype={update:function(){if($special.drop&&this.available.length)$.each(this.available,function(i){$special.drop.locate(this,i)})}};$special.draginit=$special.dragstart=$special.dragend=drag})(jQuery);
