/* Script by: www.jtricks.com 
 * Version: 20071017 
 * Latest version: 
 * www.jtricks.com/javascript/navigation/floating.html 
 */  
var MenuTop =270;
var floatingMenuId = 'floatdiv';  
var floatingMenu =  
{  
    targetX: 250,  
    targetY: 10,
  
    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]  
};  
 
function findPosY(obj)
{
var curtop = 0;
if(obj.offsetParent)
	while(1)
	{
	  curtop += obj.offsetTop;
	  if(!obj.offsetParent)
		break;
	  obj = obj.offsetParent;
	}
else if(obj.y)
	curtop += obj.y;
return curtop;
}
 
  
floatingMenu.move = function ()  
{  
    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;    
  
    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;  
        }  
    }  
}  
  
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()  
{  
	//Speed should never go larger than 1 or lower than 0
	var speed = 0.1;
	
	if(speed > 1.0)
	{
		speed = 1.0;
	}
	
	if(speed < 0.0)
	{
		speed = 0.0
	}
	
	//Debug code for finding when to start moving the menu
	//var tempText = document.getElementById("tempText");
	//tempText.value = document.documentElement.scrollTop ?document.documentElement.scrollTop: document.body.scrollTop;  
       
	// 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) * speed;  
		if (Math.abs(stepX) < .5)  
		{  
			stepX = cornerX - floatingMenu.nextX;  
		}  
	  
		var cornerY = floatingMenu.calculateCornerY();  
	  
		var stepY = (cornerY - floatingMenu.nextY) * speed;  
		if (Math.abs(stepY) < .5)  
		{  
			stepY = cornerY - floatingMenu.nextY;  
		}  
	  
		if (Math.abs(stepX) > 0 ||  
			Math.abs(stepY) > 0)  
		{  
			if(document.documentElement.scrollTop ?document.documentElement.scrollTop > MenuTop: document.body.scrollTop > MenuTop)
			{
				floatingMenu.nextX += stepX;  
				floatingMenu.nextY += stepY;  
			}
			else
			{
				floatingMenu.nextX += stepX;  
				floatingMenu.nextY =MenuTop;  
			}
			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()  
{  
    floatingMenu.initSecondary();  
    floatingMenu.doFloat(); 
	
};  
  
// Some browsers init scrollbars only after  
// full document load.  
floatingMenu.initSecondary = function()  
{  
	var topMenu = document.getElementById  
        ? document.getElementById("topMenu")  
        : document.all  
          ? document.all["topMenu"]  
          : document.layers["topMenu"];
	MenuTop = findPosY(topMenu) + 50;
    floatingMenu.computeShifts();  
    floatingMenu.nextX = floatingMenu.calculateCornerX();  
    floatingMenu.nextY = 270;  
    floatingMenu.move();  
}  
  
if (document.layers)  
    floatingMenu.addEvent(window, 'onload', floatingMenu.init);  
else  
{  
    floatingMenu.init();  
    floatingMenu.addEvent(window, 'onload',  
        floatingMenu.initSecondary);  
}  
  

