﻿/* Script by: www.jtricks.com
* Version: 20071017
* Latest version:
* www.jtricks.com/javascript/navigation/floating.html
*/
var floatingMenuId = 'floatdiv';
var floatingMenu =
{
  targetX: -155,
  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]
};

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;
      }
  }
}

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()
{
    floatingMenu.initSecondary();
    floatingMenu.doFloat();
};

// Some browsers init scrollbars only after
// full document load.
floatingMenu.initSecondary = function()
{
    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);
}

