/* Script by: www.jtricks.com
 * Version: 20071017
 * Latest version:
 * www.jtricks.com/javascript/navigation/floating.html
 */
 
/* Hacked by: doug@o3world.com
 * Version: 20100811
 * www.o3world.com
 */
 

// doug@o3world.com
// CONSTANTS:
// The y-shift is multiplied by this coefficient.  Used to solve long text going below the bottom of the page in smaller browser windows.
var xCoefficient = 0.7; 
// The minimum document height in which to enable scrolling.
var minHeight = 550;

//var height = $( document.body ).getCoordinates().height;
//alert(height);

if ( $( document.body ).getCoordinates().height > minHeight ) {

	var floatingMenuId = 'content-text';
	var floatingMenu =
	{
	    targetX: 0,
	    targetY: 0,
	
	    hasInner: typeof(window.innerWidth) == 'number',
	    hasElement: typeof(document.documentElement) == 'object'
		   && typeof(document.documentElement.clientWidth) == 'number',
	
	    menu:
		   document.getElementById
		   ? document.getElementById(floatingMenuId)
		   : document.all
			? document.all[floatingMenuId]
			: document.layers[floatingMenuId]
	};
	
	floatingMenu.move = function ()
	{
	    floatingMenu.menu.style.left = floatingMenu.nextX + 'px';
	    floatingMenu.menu.style.top = floatingMenu.nextY + 'px';
	}
	
	floatingMenu.computeShifts = function ()
	{
	    var de = document.documentElement;
	
	    floatingMenu.shiftX =  
		   floatingMenu.hasInner  
		   ? pageXOffset  
		   : floatingMenu.hasElement  
			? de.scrollLeft  
			: document.body.scrollLeft;  
	    if (floatingMenu.targetX < 0)
	    {
		   floatingMenu.shiftX +=
			  floatingMenu.hasElement
			  ? de.clientWidth
			  : document.body.clientWidth;
	    }
	
	    floatingMenu.shiftY = 
		   floatingMenu.hasInner
		   ? pageYOffset
		   : floatingMenu.hasElement
			? de.scrollTop
			: document.body.scrollTop;
	    if (floatingMenu.targetY < 0)
	    {
		   if (floatingMenu.hasElement && floatingMenu.hasInner)
		   {
			  // Handle Opera 8 problems
			  floatingMenu.shiftY +=
				 de.clientHeight > window.innerHeight
				 ? window.innerHeight
				 : de.clientHeight
		   }
		   else
		   {
			  floatingMenu.shiftY +=
				 floatingMenu.hasElement
				 ? de.clientHeight
				 : document.body.clientHeight;
		   }
	    }
	    
	    // author: doug@o3world.com
	    // 
	    floatingMenu.shiftY *= xCoefficient;
	}
	
	floatingMenu.calculateCornerX = function()
	{
	    if (floatingMenu.targetX != 'center')
		   return floatingMenu.shiftX + floatingMenu.targetX;
	
	    var width = parseInt(floatingMenu.menu.offsetWidth);
	
	    var cornerX =
		   floatingMenu.hasElement
		   ? (floatingMenu.hasInner
			 ? pageXOffset
			 : document.documentElement.scrollLeft) + 
			(document.documentElement.clientWidth - width)/2
		   : document.body.scrollLeft + 
			(document.body.clientWidth - width)/2;
	    return cornerX;
	};
	
	floatingMenu.calculateCornerY = function()
	{
	    if (floatingMenu.targetY != 'center')
		   return floatingMenu.shiftY + floatingMenu.targetY;
	
	    var height = parseInt(floatingMenu.menu.offsetHeight);
	
	    // Handle Opera 8 problems
	    var clientHeight = 
		   floatingMenu.hasElement && floatingMenu.hasInner
		   && document.documentElement.clientHeight 
			  > window.innerHeight
		   ? window.innerHeight
		   : document.documentElement.clientHeight
	
	    var cornerY =
		   floatingMenu.hasElement
		   ? (floatingMenu.hasInner  
			 ? pageYOffset
			 : document.documentElement.scrollTop) + 
			(clientHeight - height)/2
		   : document.body.scrollTop + 
			(document.body.clientHeight - height)/2;
	    return cornerY;
	};
	
	floatingMenu.doFloat = function()
	{
	    // Check if reference to menu was lost due
	    // to ajax manipuations
	    if (!floatingMenu.menu)
	    {
		   menu = document.getElementById
			  ? document.getElementById(floatingMenuId)
			  : document.all
			    ? document.all[floatingMenuId]
			    : document.layers[floatingMenuId];
	
		   initSecondary();
	    }
	
	    var stepX, stepY;
	
	    floatingMenu.computeShifts();
	
	    var cornerX = floatingMenu.calculateCornerX();
	
	    var stepX = (cornerX - floatingMenu.nextX) * .07;
	    if (Math.abs(stepX) < .5)
	    {
		   stepX = cornerX - floatingMenu.nextX;
	    }
	
	    var cornerY = floatingMenu.calculateCornerY();
	
	    var stepY = (cornerY - floatingMenu.nextY) * .07;
	    if (Math.abs(stepY) < .5)
	    {
		   stepY = cornerY - floatingMenu.nextY;
	    }
	
	    if (Math.abs(stepX) > 0 ||
		   Math.abs(stepY) > 0)
	    {
		   floatingMenu.nextX += stepX;
		   floatingMenu.nextY += stepY;
		   floatingMenu.move();
	    }
	
	    setTimeout('floatingMenu.doFloat()', 20);
	};
	
	// addEvent designed by Aaron Moore
	floatingMenu.addEvent = function(element, listener, handler)
	{
	    if(typeof element[listener] != 'function' || 
		  typeof element[listener + '_num'] == 'undefined')
	    {
		   element[listener + '_num'] = 0;
		   if (typeof element[listener] == 'function')
		   {
			  element[listener + 0] = element[listener];
			  element[listener + '_num']++;
		   }
		   element[listener] = function(e)
		   {
			  var r = true;
			  e = (e) ? e : window.event;
			  for(var i = element[listener + '_num'] -1; i >= 0; i--)
			  {
				 if(element[listener + i](e) == false)
					r = false;
			  }
			  return r;
		   }
	    }
	
	    //if handler is not already stored, assign it
	    for(var i = 0; i < element[listener + '_num']; i++)
		   if(element[listener + i] == handler)
			  return;
	    element[listener + element[listener + '_num']] = handler;
	    element[listener + '_num']++;
	};
	
	floatingMenu.init = function()
	{
		if( $( floatingMenuId ) ) {
		    floatingMenu.initSecondary();
		    floatingMenu.doFloat();
		};
	};
	
	// Some browsers init scrollbars only after
	// full document load.
	floatingMenu.initSecondary = function()
	{
		if( $( floatingMenuId ) ) {
			floatingMenu.computeShifts();
			floatingMenu.nextX = floatingMenu.calculateCornerX();
			floatingMenu.nextY = floatingMenu.calculateCornerY();
			floatingMenu.move();
		};
	}
	
	if (document.layers)
	    floatingMenu.addEvent(window, 'onload', floatingMenu.init);
	else
	{
	    floatingMenu.init();
	    floatingMenu.addEvent(window, 'onload',
		   floatingMenu.initSecondary);
	}
}