// JavaScript Document

var log = '';

if (typeof(window.addEventListener) !== 'function') {
  window.addEventListener = function (strevent, callback, flag) {
    window.attachEvent('on'+strevent,callback);
  }
}

function getPosition (e) {
  var x = 0, y = 0;
  while (e.offsetParent != null) {
    x += e.offsetLeft;
    y += e.offsetTop;
    e = e.offsetParent;
  }
  return { left: x, top: y };
}

function previousElement (e) {
  while (e = e.previousSibling) {
    if (e.nodeType == 1)
      break;
  }
  return e;
}

function isDescendant (e) {
  do {
    e = e.parentNode;
    if (this == e) return true;
  } while (e);
  return false;
}

function Animation (strid,domel) {

  var alg    = new Object();
  var dt     = 30;
  var dur    = Math.abs(arguments[arguments.length-1]);
  var timer  = 0;
  var frame  = 0;
  var lframe = (dur = Math.round(dur / dt) * dt) / dt;

  switch (strid) {

    case 'MUExpandH':
      alg.Hi = arguments[2];
      alg.H  = arguments[3];
      alg.V  = (alg.H - alg.Hi) / dur;
      alg.exec = function () {
        var t = dt * frame;
        domel.style.height = Math.round(alg.Hi + alg.V * t) + 'px';
      }
      break;

    case 'MUVExpandH':
      alg.Hi   = arguments[2];
      alg.H    = arguments[3];
      alg.Vi  = 2 * (alg.H - alg.Hi) / dur;
      alg.Acc = (0 - alg.Vi) / dur;
      alg.exec = function () {
        var t = dt * frame;
        domel.style.height = Math.round(alg.Hi + alg.Vi*t + alg.Acc*t*t/2) + 'px';
      }
      break;

    case 'MUVExpand2D':
      alg.Xi   = arguments[2];
      alg.Yi   = arguments[3];
      alg.X    = arguments[4];
      alg.Y    = arguments[5];
      alg.xVi  = 2 * (alg.X - alg.Xi) / dur;
      alg.xAcc = (0 - alg.xVi) / dur;
      alg.yVi  = 2 * (alg.Y - alg.Yi) / dur;
      alg.yAcc = (0 - alg.yVi) / dur;
      alg.exec = function () {
        var t = dt * frame;
        domel.style.width = Math.round(alg.Xi + alg.xVi*t + alg.xAcc*t*t/2) + 'px';
        domel.style.height = Math.round(alg.Yi + alg.yVi*t + alg.yAcc*t*t/2) + 'px';
      }
      break;

  }

  this.open = function (callback) {
    if (timer) clearInterval(timer);
    timer = setInterval (function () {
        alg.exec();
        if (frame == lframe) {
          clearInterval(timer);
          if (typeof(callback) == 'function')
            setTimeout(callback,0);
        }
        else frame++;
      },dt);
  }

  this.close = function (callback) {
    if (timer) clearInterval(timer);
    timer = setInterval (function () {
        alg.exec();
        if (frame == 0) {
          clearInterval(timer);
          if (typeof(callback) == 'function')
            setTimeout(callback,0);
        }
        else frame--;
      },dt);
  }

}

function setupMenu (se) {

  var CLOSE       = 0;
  var OPEN        = 1;
  var OPENING     = 2;
  var CLOSING     = 3;
  var DELAY       = 200;

  function open () {
    var menu = this, p = getPosition(menu.opener);
    menu.style.zIndex = 1010;
    menu.style.display = 'block';
    menu.style.left = p.left + 'px';
    menu.style.top = (p.top + 29) + 'px';
    if (menu.animation) {
      menu.animation.open();
    }
    else {
      menu.animation = new Animation('MUVExpand2D',menu,0,0,menu.startWidth,menu.startHeight,280);
      menu.animation.open();
    }
  }

  function close () {
    var menu = this;
    function hide () { menu.style.display = 'none'; }
    close = function () {
        menu.style.zIndex = 1000;
        menu.animation.close(hide);
      }
    close();
  }

  function opener_mouseover (e) {
    var menu, target, related;
    if (!e) e = window.event;
    target = e.srcElement ? e.srcElement : e.target;
    related = e.fromElement ? e.fromElement : e.relatedTarget;
    if (e.stopPropagation) e.stopPropagation();
    else e.cancelBubble = true;
    if (this.isDescendant(target)) return;
    if (this.isDescendant(related)) return;
    menu = this.menu;
    if (menu.timer) clearTimeout(menu.timer);
    if (menu.status == CLOSE) {
      menu.timer = setTimeout(function () {
          menu.open();
          menu.status = OPEN;
        },DELAY);
    }
  }

  function opener_mouseout (e) {
    var menu, target, related;
    if (!e) e = window.event;
    target = e.srcElement ? e.srcElement : e.target;
    related = e.toElement ? e.toElement : e.relatedTarget;
    if (e.stopPropagation) e.stopPropagation();
    else e.cancelBubble = true;
    if (this.isDescendant(target)) return;
    if (this.isDescendant(related)) return;
    menu = this.menu;
    if (menu.timer) clearTimeout(menu.timer);
    if (menu.status == OPEN) {
      menu.timer = setTimeout(function () {
          menu.close();
          menu.status = CLOSE;
        },DELAY);
    }
  }

  function menu_mouseover (e) {
    var menu, related;
    if (!e) e = window.event;
    related = e.fromElement ? e.fromElement : e.relatedTarget;
    if (e.stopPropagation) e.stopPropagation();
    else e.cancelBubble = true;
    menu = this;
    if (related == menu || menu.isDescendant(related)) return;
    if (menu.timer) clearTimeout(menu.timer);
  }

  function menu_mouseout (e) {
    var menu, related;
    if (!e) e = window.event;
    related = e.toElement ? e.toElement : e.relatedTarget;
    if (e.stopPropagation) e.stopPropagation();
    else e.cancelBubble = true;
    menu = this;
    if (related == menu || menu.isDescendant(related)) return;
    if (menu.timer) clearTimeout(menu.timer);
    if (menu.status == OPEN) {
      menu.timer = setTimeout(function () {
          menu.close();
          menu.status = CLOSE;
        },DELAY);
    }
  }

  function setup () {
    var opener, menu, ls = se.getElementsByTagName('ul');
    var i, st = new Array();
    for (i = 0; i < ls.length; i++) {
      st.push(ls[i]);
    }
    for (i = 0; i < st.length; i++) {
      menu = st[i];
      opener = previousElement(menu);
      opener.menu = menu;
      opener.onmouseover = opener_mouseover;
      opener.onmouseout = opener_mouseout;
      opener.isDescendant = isDescendant;
      menu.status = CLOSE;
      menu.open = open;
      menu.close = close;
      menu.opener = opener;
      menu.onmouseover = menu_mouseover;
      menu.onmouseout = menu_mouseout;
      menu.isDescendant = isDescendant;
      menu.startWidth = menu.offsetWidth;
      menu.startHeight = menu.offsetHeight;
      menu.style.width = '0px';
      menu.style.height = '0px';
      menu.startWidth -= menu.offsetWidth; // Get rid of horizontal padding
      menu.startHeight -= menu.offsetHeight; // Get rid of vertical padding
      menu.parentNode.removeChild(menu);
      menu.style.display = 'none';
      menu.style.position = 'absolute';
      document.body.appendChild(menu);
    }
  }

  setup();
}

window.addEventListener('load',function () { setupMenu(document.getElementById('menu_bar')); }, false);


