jQuery.fn.gesture=function(handler,buffer,onchange){var bDetecting=false;var curGesture;var curGesturePos;var fullGesture;var onchange=onchange||(buffer&&buffer.constructor==Boolean?buffer:false)
var buffer=buffer&&buffer.constructor==Number?buffer*buffer:625;var self=this;var startelement=undefined;var blockSelect=function(){return false;};var processGesture=function(gesture){if(gesture!==''&&handler.constructor==Function)
return handler.apply(startelement,[gesture]);else if(gesture!==''&&handler.constructor==Object)
if(handler[gesture])return handler[gesture].apply(startelement,[gesture]);};var closeGesture=function(){bDetecting=false;curGesture='-';curGesturePos={};fullGesture='';startelement=undefined;jQuery(document).unbind("selectstart",blockSelect);jQuery(document).unbind("mousedown",blockSelect);}
var mdGesture=function(event){var x=event.pageX||(event.clientX+(document.documentElement.scrollLeft||document.body.scrollLeft))||0;var y=event.pageY||(event.clientY+(document.documentElement.scrollTop||document.body.scrollTop))||0;bDetecting=true;curGesture='-';curGesturePos={x:x,y:y};fullGesture='';startelement=this;jQuery(document).bind("selectstart",blockSelect);jQuery(document).mousedown(blockSelect);};var mmGesture=function(event){var thisGesture;if(bDetecting){var pointer={x:event.pageX||(event.clientX+(document.documentElement.scrollLeft||document.body.scrollLeft))||0,y:event.pageY||(event.clientY+(document.documentElement.scrollTop||document.body.scrollTop))||0};var r=(curGesturePos.x-pointer.x)*(curGesturePos.x-pointer.x)+(pointer.y-curGesturePos.y)*(pointer.y-curGesturePos.y)
if(r>buffer){if(Math.abs(curGesturePos.x-pointer.x)>Math.abs(curGesturePos.y-pointer.y))
thisGesture=curGesturePos.x-pointer.x>0?'L':'R';else
thisGesture=curGesturePos.y-pointer.y>0?'U':'D';if(curGesture!==thisGesture){curGesture=thisGesture;fullGesture+=thisGesture;if(onchange&&processGesture(fullGesture)===false)closeGesture();}
curGesturePos={"x":pointer.x,"y":pointer.y};}
return false;}};var muGesture=function(){if(bDetecting){if(onchange!=true)processGesture(fullGesture);closeGesture();}};this.unbind("mousedown",mdGesture);jQuery(document).unbind("mousemove",mmGesture).unbind("mouseup",muGesture);if(handler){this.mousedown(mdGesture);jQuery(document).mousemove(mmGesture).mouseup(muGesture);}
return this;};