
(function($){
/*----------------------------------------------------------------------------------
Class: FloatObject
-------------------------------------------------------------------------------------*/
	function FloatObject(jqObj, params)
	{
		this.jqObj = jqObj;
		
		switch(params.speed)
		{
			case 'fast': this.steps = 5; break;
			case 'normal': this.steps = 10; break;
			case 'slow': this.steps = 20; break;
			default: this.steps = 10;
		};
		
		var offset = this.jqObj.offset();

		var content_offset = $("#content").offset();
		this.jqObj.css({'left': content_offset.left });		
		
		//this.currentY = offset.top;
		this.currentY = 0;
		
		this.origY = typeof(params.y) == "string" ?  this.currentY : params.y;

		//now we make sure the object is in absolute positions.
		//this.jqObj.css({'position':'fixed' , 'top':this.currentY});
		this.jqObj.css({'position':'fixed' , 'top': 0});
	}
	
	FloatObject.prototype.updateLocation = function()
	{	
		var content_offset = $("#content").offset();
		$("#float").css({'left': content_offset.left });

	//this.updatedY = $(window).scrollTop()+ this.origY;
		this.updatedY = $(window).scrollTop();
		this.dy = Math.abs(this.updatedY - this.currentY);

		return this.dy;
	}
	
	FloatObject.prototype.move = function()
	{
		if( this.jqObj.css("position") != "fixed" ) return;
		var cx = 0;
		var cy = 0;
		var scroll_direction;
		var move_amount;
		
		if( this.dy > 0 )
		{
			if( this.dy < this.steps / 2 )
				cy = (this.dy >= 1) ? 1 : 0;
			else
				cy = Math.round(this.dy/this.steps);
			
			if( this.currentY < this.updatedY ) {
				this.currentY += cy;
				scroll_direction = "down";
			}
			else {
				this.currentY -= cy;
				scroll_direction = "up";
			}
		}
	
		move_amount = Math.round(this.currentY) * -1;
		this.jqObj.css({'top': move_amount });		
	/*
		//this.jqObj.css({'left':this.currentX, 'top': this.currentY });
		if (scroll_direction == "down") {
			move_amount = Math.round(this.currentY) * -1;
			this.jqObj.css({'top': move_amount });			
		}
		else {
			move_amount = Math.round(this.currentY) * -1;
			this.jqObj.css({'top': move_amount });
		}*/
	}

	
	
/*----------------------------------------------------------------------------------
Object: floatMgr
-------------------------------------------------------------------------------------*/		
	$.floatMgr = {
		
		FOArray: new Array() ,
		
		timer: null ,
		
		initializeFO: function(jqObj,params) 
		{
			var settings =  $.extend({
				x: 0 ,
				y: 0 ,
				speed: 'normal'	},params||{});
			var newFO = new FloatObject(jqObj,settings);
			
			$.floatMgr.FOArray.push(newFO);
			
			if( !$.floatMgr.timer ) $.floatMgr.adjustFO();
			
			//now making sure we are registered to all required window events
			if( !$.floatMgr.registeredEvents ) 
			{
					$(window).bind("resize", $.floatMgr.onChange);
					$(window).bind("scroll", $.floatMgr.onChange);
					$.floatMgr.registeredEvents = true;
			}		
		} , 
		
		adjustFO: function() 
		{
			$.floatMgr.timer = null;
			
			var moveFO = false;
			
			for( var i = 0 ; i < $.floatMgr.FOArray.length ; i++ )
			{
				 FO = $.floatMgr.FOArray[i];
				 if( FO.updateLocation() )  moveFO = true;
			}
			
			if( moveFO )
			{
				for( var i = 0 ; i < $.floatMgr.FOArray.length ; i++ )
				{
					FO = $.floatMgr.FOArray[i];
					FO.move();
				}
				
				if( !$.floatMgr.timer ) $.floatMgr.timer = setTimeout($.floatMgr.adjustFO,50);
			}
		}	,
		
		onChange: function()
		{
			if( !$.floatMgr.timer ) $.floatMgr.adjustFO();
		}
	};
	
/*----------------------------------------------------------------------------------
Function: makeFloat
-------------------------------------------------------------------------------------*/		
	$.fn.makeFloat = function(params) {
		var obj = this.eq(0); //we only operate on the first selected object;
		$.floatMgr.initializeFO(obj,params); 
		if( $.floatMgr.timer == null ) $.floatMgr.adjustFO();
		return obj;
	};
})(jQuery);
