ipnGesture = new function(){
	var step = 20;
	var oldMX = 0;
	var oldMY = 0;
	var K = 180 / Math.PI;
	var trajectory = "";
	var callback = null;
	var pattern = {
		left	: new RegExp("^[234]{2,}[89a]{2,}$", "i"),
		right	: new RegExp("^[89a]{2,}[234]{2,}$", "i"),
		top	: new RegExp("^[b01]+[567]+$", "i"),
		bottom	: new RegExp("^[567]+[b01]+$", "i"),
		close	: new RegExp("^[6]{2,}[345]3+$", "i")
	};

	this.initialize = function( obj ){
		if( obj["func"] ){
			callback = obj["func"];
			document.body.addEventListener( "touchstart", startEvent, false );
			document.body.addEventListener( "touchend", endEvent, false );
			document.body.addEventListener( "touchmove", moveEvent, false );
		}
	};

	startEvent = function( e ){
		trajectory = "";
		oldMX = parseInt( e.touches[0].pageX ) - window.scrollX;
		oldMY = parseInt( e.touches[0].pageY ) - window.scrollY;
		callback( "", trajectory );
	};

	moveEvent = function( e ){
		var i, n, degreeAngle, hourAngle;
		var mx = parseInt( e.touches[0].pageX ) - window.scrollX;
		var my = parseInt( e.touches[0].pageY ) - window.scrollY;
		var lx = oldMX - mx;
		var ly = oldMY - my;
		var lz = Math.ceil( Math.sqrt( ( lx * lx ) + ( ly * ly ) ) );

		if( lz < step ) return;

		oldMX = mx;
		oldMY = my;
		degreeAngle = Math.floor( K * Math.atan2( -lx, ly ) );
		if( degreeAngle < 0 ) degreeAngle += 360;
		hourAngle = Math.floor( ( degreeAngle + 15 ) / 30 ) % 12;
		hourAngle = hourAngle.toString( 16 );
		n = Math.floor( lz / step );
		for( i = 0; i < n; i++ ){
			trajectory += hourAngle;
		}
	};

	endEvent = function( e ){
		var i, n;
		var gesture = "";
		if( trajectory ){
			for( i in pattern ){
				n = trajectory.search( pattern[ i ] );
				if( n !== -1 ){
					gesture = i;
					break;
				}
			}
			callback( gesture, trajectory );
		}
	};
};
