/**
 * jMeditate
 * v0.0.1
 * Copyright(c) 2009 Manuel Bua, F4F-Creative Factory
 *
 */

 
(function($)
{
	var __sinIsPrecomputed = false;
	
	
	var __PiOn180 = Math.PI / 180.;
	var __luSin = new Array();
	var __thisId = 0;
	
	$.fn.meditate = function(options)
	{
		// this instance' vars

		var settings =
		{
			frametimeHz: 32,
			altitude: 10,
			altitudeStep: 3,
			minOpacity: 0.1
		};

		if(options)
		{
			$.extend(settings, options);
		}

		//
		// utilities
		//
		
		
		__deg2rad = function( inDeg )
		{
			return( inDeg * __PiOn180 );
		};
		
		//
		// precompute sin table
		//
		
		for( var angle = 0; angle < 360; angle++ )
		{
			__luSin[ angle ] = Math.sin( __deg2rad( angle ) );
		}
		
		// dbg assertions
		//alert( __luSin[ 0 ] == 0 );	//alert( __luSin[ 90 ] == 1 );	//alert( __luSin[ 180 ] == 0 );	//alert( __luSin[ 270 ] == -1 );
		
		// setup
		__thisId = $(this).attr( "id" );
		
		// initial state
		__currAngle = 0;
		$(this).css( "position", "absolute" );
		$(this).css( "top", "0px" );

		var hOnRenderFrameEvent = 0;
		var __currAngle = 270;
		__onRenderFrame = function( o )
		{
			if( __currAngle > 360 ) __currAngle -= 360;
			
			// compute scroll amount
			var xScroll = parseInt( __luSin[ __currAngle ] * settings.altitude );
			
			// update scroll
			o.css( "top", xScroll + "px" );

			// update opacity
			var opacity = (__luSin[ __currAngle ] + 1 ) / 2;
			opacity *= ( 1. - settings.minOpacity );
			opacity += settings.minOpacity;
			o.css( "opacity", opacity );

			__currAngle += settings.altitudeStep;

			//$("p#textout").get(0).innerHTML = xScroll; //o.css( "opacity" );
			//clearInterval( hOnRenderFrameEvent );
		};

		var desiredFrameTime = parseInt( (1. / settings.frametimeHz) * 1000. + .5 );
		$( this ).animate(
			{
				opacity: settings.minOpacity,
				top: -settings.altitude + "px"
			}, 1000, "linear", function()
				{
					hOnRenderFrameEvent = setInterval( '__onRenderFrame( $("#' + __thisId + '" ) );', desiredFrameTime );
				}
		);
	}

})(jQuery);

