/**
* Script original por Adrien Friggeri - http://friggeri.net/
* Adicionado suporte ao Internet Explorer por Tarcísio Xavier Gruppi - http://blog.txgruppi.com
*
* Você deve adicionar no seu código uma tag <canvas id="gestures_canvas"></canvas>
* Se ela for adicionada pelo JavaScript dará erro no Internet Explorer
*
* Dependências: excanvas para IE - http://code.google.com/p/explorercanvas/
* @author Tarcísio Xavier Gruppi <tarcisio@txgruppi.com>
*/
jQuery.gestures = {};
(function ($) {
	var canvas;

	var active = false;
	var recording=false;
	var previous = {x:0,y:0};
	var chain = [];

	var registered = [];
	var error = null;

	var color;

	function exec(chain) {
		if (chain.length) {
			fun = registered[chain.join('')];
			if (fun) {
				fun.call(this);
			} else {
				if (error) {
					error($.map(chain, function(e) {
						if (e=='U') return 'Up';
						if (e=='D') return 'Down';
						if (e=='L') return 'Left';
						if (e=='R') return 'Right';
					}).join(', '));
				}
			}
		}
	}

	function get_last_move (previous, cur) {
		var diff = {x:cur.x-previous.x, y : cur.y-previous.y};
		var mv = null;
		if (Math.abs(diff.x) > Math.abs(diff.y)) {
			if (diff.x <= -10) mv = 'L';
			if (diff.x >= 10)  mv = 'R';
		} else {
			if (diff.y <= -10) mv = 'U';
			if (diff.y >= 10)  mv = 'D';
		}
		return mv;
	}

	function drawline(previous,cur) {
		var context = canvas.get(0).getContext('2d');
		context.strokeStyle = color;
		context.beginPath();
		context.moveTo(previous.x,previous.y);
		context.lineTo(cur.x,cur.y);
		context.closePath();
		context.stroke();
	}

	function setup() {
		if(active) {
			recording=false;
			chain=[];
			var canvasPosition = $.browser.msie ? 'absolute' : 'fixed';
			canvas.hide().css({
				position: canvasPosition,
				top: 0,
				left: 0
			}).attr({
				width: $(window).width(),
				height: $(window).height()
			}).show();
		}
	}

	$.gestures.init = function(ob) {
		ob = $.extend(ob, {active:false, color:'#FF0000'});
		color = ob.color;

		// add the canvas to the body element
		canvas = $('#gestures_canvas');
		canvas.hide();

		// capturing mouse gestures
		$(document).mousedown(function(e) {
			if (active) {
				recording=true;
				previous={x:e.clientX,y:e.clientY}
			}
		});
		$(document).mousemove(function(e) {
			if(active && recording) {
				var pos = {x:e.clientX,y:e.clientY};
				drawline(previous, pos);
				var mv = get_last_move(previous, pos);
				if (mv != null) {
					if (chain[chain.length-1] != mv) {
						chain.push(mv);
					}
				}
				previous={x:e.clientX,y:e.clientY}
			}
		});
		$(document).mouseup(function(e) {
			if(active && recording) {
				var c = chain;
				setup();
				exec(c);
				canvas.hide();
			}
		});

		// setting the observer
		if (ob.active) $.gestures.enable();
		else $.gestures.disable();
	}
	$.gestures.overlay = $('<div></div>');
	$.gestures.register = function (gesture, fun) { registered[gesture.replace(/,/g, '')] = fun; }
	$.gestures.error = function (fun) { error = fun; }
	$.gestures.enable = function () {
		active = true; setup();
		if ($.browser.msie) {
			$.gestures.overlay = $("<div style='position:absolute;top:0px;left:0px;width:100%;height:100%;background:#FFFFFF;opacity:0.01;filter:alpha(opacity=1);'>&nbsp;</div>").appendTo('body');
		}
	}
	$.gestures.disable = function () {
		active = false;
		if ($.browser.msie) {
			$.gestures.overlay.remove();
		}
	}
	$.gestures.active = function () { return active; }
})(jQuery);