

ns4=(document.layers) ? true : false
msie=(navigator.userAgent.indexOf("MSIE")!=-1) ? true : false
msie5=(navigator.userAgent.indexOf("MSIE 5")!=-1) ? true : false
konq=(navigator.userAgent.indexOf("Konqueror")!=-1) ? true : false
opera=(navigator.userAgent.indexOf("Opera")!=-1) ? true : false
opera5=(navigator.userAgent.indexOf("Opera 5")!=-1) ? true : false
//ns6=(navigator.userAgent.indexOf("Gecko")!=-1) ? true : false
//mac=(navigator.appVersion.indexOf("Mac")!=-1) ? true : false
//ie4=(!document.getElementById && document.all) ? true : false
var menuTimers = new Array();
var openMenus = new Array();

Array.prototype.hasElem = function(elem) {
  for(var i = 0; i < this.length; i++)
    if(this[i] == elem) return true;
  return false;
}

Array.prototype.delElemByVal = function(elem) {
  for(var i = 0; i < this.length; i++)
    if(this[i] == elem) delete this[i];
}

// Tämä on tarpeellinen koska vanhemmat selaimet eivät osaa push:ia
Array.prototype.ppush = function(elem) {
  this[this.length] = elem;
  return this.length
}

// Return an array with the X and Y coordinates
// FIXME: sivuskrollaus aiheuttanee ongelmia
function getPosition(elementObj) {
  var xCoord = 0; var yCoord = 0;
  var width; var height;
   if(ns4) {
     xCoord = elementObj.pageX; yCoord = elementObj.pageY;
   }
   else while(elementObj) {
     xCoord += elementObj.offsetLeft;
     yCoord += elementObj.offsetTop;
     elementObj = elementObj.offsetParent;
   }
  var a=new Array(); a[0] = xCoord; a[1] = yCoord;
  return a;
}

// Return an object by it's name
function getObject(objectName) {
  if(document.getElementById) {
    return document.getElementById(objectName)
  } else if(document.all) { 
    return document.all[objectName]
  } else if(document.layers) {
    return document[objectName]
  }
}

// Return a reference to the object's style object
function getStyle(elementObj) {
  return (ns4) ? elementObj : elementObj.style;
}

// Return the element that the mouse is moving to
function getToElement(event) {
  return (event.relatedTarget) ? event.relatedTarget : event.toElement;
}

// Does the element have a parent called id?
function hasParent(element, id) {
  while(element) {
    if(element.id && element.id.indexOf(id) == 0) return true;
    element = element.parentNode;
  }
  return false;
}

function setPosition(elementObj, x, y, visibility) {
  var style = getStyle(elementObj);
  style.left = x;
  style.top = y;
  if(visibility) style.visibility = (ns4) ? "show" : "visible";
  else style.visibility = "hidden";
}

function isSubmenu(menuName) {
  return (menuName.indexOf("A")!=-1) ? true : false
}

function showMenu(menuName)
{
  if(ns4) return false;

  // Pysäytetään timeri
  if(menuTimers[menuName]) { clearTimeout(menuTimers[menuName]); delete menuTimers[menuName]; }
  if(openMenus.hasElem(menuName)) { return false; }
  openMenus.ppush(menuName);

  // Jos tämä ei ole alamenu, niin poistetaan turhat menut
  if(!isSubmenu(menuName))
    for(var i = 0; i < openMenus.length; i++)
      if(openMenus[i] && openMenus[i].indexOf(menuName) != 0)
	hideDiv(openMenus[i]);

  var xPos; var yPos;
  menuObj = getObject(menuName+'Div');
  linkObj = getObject(menuName+'Link');
  // Konqueror ei osaa katsoa A-tagien offsettiä oikein
  if(konq && !isSubmenu(menuName)) linkObj = getObject(menuName+'Img');
  var menuDX = (isSubmenu(menuName)) ? linkObj.offsetWidth - 1 : -15;
  var menuDY = (isSubmenu(menuName)) ? -16 : linkObj.offsetHeight - 1;
  // tyylipuhdas kludge
  if(document.location.href.indexOf('intra.kepa.fi') != -1)
    var menuDY = (isSubmenu(menuName)) ? -16 : linkObj.offsetHeight + 2;
  if(konq) {
    if(isSubmenu(menuName))
      menuDY += 5;
    else {
     menuDX += 12; menuDY += 5;
    }
  }
  // Tällä menulla on eri paddingit
  if(menuName == 'toimintaAmikakepa') menuDY = -1;
  //if(opera) menuDY += 5;
  linkPos = getPosition(linkObj);
  // Varmistetaan ettei mene laidasta yli
  if(document.body.clientWidth && (linkPos[0] + menuDX + menuObj.offsetWidth) > document.body.clientWidth)
    xPos = document.body.clientWidth - menuObj.offsetWidth;
  else xPos = linkPos[0] + menuDX; 
  if(document.body.clientHeight && (linkPos[1] + menuDY + menuObj.offsetHeight) > document.body.clientHeight)
    yPos = document.body.clientHeight - menuObj.offsetHeight + 1;
  else yPos = linkPos[1] + menuDY; 
  setPosition(menuObj, xPos, yPos, 1);
}

// Jos olemme siirtyneet asiaankuulumattomaan elementtiin, lisätään timeri joka poistaa menun hetken päästä.
function hideMenu(menuName, event, noTimer)
{
  if(ns4) return false;

  toElem = getToElement(event);
  if(hasParent(toElem, menuName+'Img') || hasParent(toElem, menuName+'Div') || hasParent(toElem, menuName+'A')) return false;
  if(noTimer || (isSubmenu(menuName) && hasParent(toElem, 'toimintaTable'))) hideDiv(menuName);
  else menuTimers[menuName] = setTimeout("hideDiv('"+menuName+"');", 500);
}

function hideDiv(menuName)
{
  openMenus.delElemByVal(menuName);
  //delete menuTimers[menuName];
  // highlight.js:stä (FIXME?)
  if(!isSubmenu(menuName)) resetImg(menuName);
  menuObj = getObject(menuName+'Div');
  setPosition(menuObj, -500, -1000, 0);
}
