/*---------------------------------------------------------------------------------------------------------------------------
' @file dropdownmenu.js
' @description
' Javascript fuer Dropdown Menu.
' $Header: /cvsroot/cpecom/code/PresentationLayer/i/dropdownmenu.js,v 1.4.2.1 2006/04/24 09:35:21 varga Exp $
' ---------------------------------------------------------------------------------------------------------------------------
*/

var ddOpeningLevel=new Array(), ddOpeningElm=new Array(); 
var ddClosingLevel=new Array(), ddClosingElm=new Array();
var ddActiveElm=new Array();
var ddLinkFollowed=false;
var DD_BORDER=1;

/*---------------------------------------------------------------------------------------------------------------------------
' @function ddMenuItemOver
' @description
' diese Funktion ist der onMouseOver-Handler fuer die LI-Elemente des Menues 
'
' @param elm: Referenz auf das LI-Element
' @param level: Menueebene (1, 2 oder 3)
' 
' @return Null
' ---------------------------------------------------------------------------------------------------------------------------
*/
function ddMenuItemOver(elm, level) {
  if (level == 1) // TODO only IE
    hideLangSelector();  

  for (var i=0; ddOpeningElm[i]; i++) 
    ; // find free index
  ddOpeningElm[i]=elm;
  ddOpeningLevel[i]=level;
  elm.isover=true;
  var delayTime=1;
  if (level < 3 && ddActiveElm[level+1] && ddActiveElm[level] != elm) { 
    // going back to upper level -> longer delay
    delayTime=400;
  }
  setTimeout("ddDelayedMenuItemOver("+i+")", delayTime);
}

/*---------------------------------------------------------------------------------------------------------------------------
' @function ddMenuItemOut
' @description
' diese Funktion ist der onMouseOut-Handler fuer die LI-Elemente des Menues 
'
' @param elm: Referenz auf das LI-Element
' @param level: Menueebene (1, 2 oder 3)
' 
' @return Null
' ---------------------------------------------------------------------------------------------------------------------------
*/
function ddMenuItemOut(elm, level) {
  elm.isover=false;
  for (var i=0; ddOpeningElm[i]; i++) // find free index
    ;
  ddClosingElm[i]=elm;
  ddClosingLevel[i]=level;
  setTimeout("ddDelayedMenuItemOut("+i+")", 1500);
}

/*---------------------------------------------------------------------------------------------------------------------------
' @function ddDelayedMenuItemOver
' @description
' verzeogerte Funktion fuer MenuItem mouse over 
' wenn die Maus immer noch ueber dem Element ist, wird Submenu aufgemacht 
'
' @param ind: Index der Arrays ddOpeningLevel, ddOpeningElm, die den Menuepunkt indetifizieren
' 
' @return Null
' ---------------------------------------------------------------------------------------------------------------------------
*/
function ddDelayedMenuItemOver(ind) {
  var level = ddOpeningLevel[ind];
  var elm = ddOpeningElm[ind];
  ddOpeningElm[ind] = null;  
  if (elm.isover && elm.className != "over") {
    // ensure that only one elm per level is active + close all sublevels
    for (var i=3; i>=level; i--) {
      ddCloseMenu(ddActiveElm[i]);
      ddActiveElm[i]=null;
    }
    ddOpenMenu(elm, level);
  }
}

/*---------------------------------------------------------------------------------------------------------------------------
' @function ddFollowLink
' @description
' onclick-Handler, damit die Links auch ausserhalb des A-elementes gefolgt werden  
'
' @param elm: Referenz auf das LI-Element
' @param level: Menueebene (1, 2 oder 3)
' 
' @return Null
' ---------------------------------------------------------------------------------------------------------------------------
*/
function ddFollowLink(elm, level) {
  if (!ddLinkFollowed) { 
    var anchors = elm.getElementsByTagName("A"); 
    document.location=anchors[anchors.length-1].getAttribute("href"); // last one (because the 3rd level submenu is first)
    ddLinkFollowed=true; // do it only once (ignore the second event that comes from the parent menu)
  }
}

/*---------------------------------------------------------------------------------------------------------------------------
' @function ddOpenMenu
' @description
' Oeffnet das Submenue 
'
' @param elm: Referenz auf das LI-Element
' @param level: Menueebene (1, 2 oder 3)
' 
' @return Null
' ---------------------------------------------------------------------------------------------------------------------------
*/
function ddOpenMenu(elm, level) {
  ddActiveElm[level]=elm;
  elm.className="over";
  var uls = elm.getElementsByTagName("UL");
  if (uls.length > 0) {
    var ul = uls[0];    
    ul.className="over";    
    if (level<3 && !elm.calcWidth) { 
      if (level==2) { // opening level 3 - adjust width and pos. (mainly Firefox)        
        if (ul.offsetLeft > -5 || ul.offsetWidth < 5) {
          ul.style.left="-218px"; // TODO how to make this dynamic?????
          ul.style.width="216px"; // TODO check if left is not outside the window ??
        }
      }
      else { // opening level 2 - adjust width (mainly Firefox)
        var li2s = elm.getElementsByTagName("LI");
        var maxw = ul.offsetWidth;
        for (var i=0; i<li2s.length; i++) {
          if (li2s[i].offsetWidth > maxw)
             maxw = li2s[i].offsetWidth;
        }
        maxw+=DD_BORDER;
        ul.style.width=maxw+"px";
        elm.calcWidth=maxw;
      }
    }
  }
}

/*---------------------------------------------------------------------------------------------------------------------------
' @function ddDelayedShowLangSelector
' @description
' zeigt den LangSelector wieder an, wenn alle Menues deaktiviert sind 
'
' @return Null
' ---------------------------------------------------------------------------------------------------------------------------
*/
function ddDelayedShowLangSelector() {
  if (!ddActiveElm[1] || !ddActiveElm[1].isover)
    showLangSelector();
  else {
    //window.status='still active';
  }
}

/*---------------------------------------------------------------------------------------------------------------------------
' @function ddDelayedMenuItemOut
' @description
' verzeogerte Funktion - wenn immer noch die Maus ausserhalb des Menuepunktes ist, wird das Submenue zugemacht 
'
' @param ind: Index der Arrays ddClosingElm, ddClosingLevel
' 
' @return Null
' ---------------------------------------------------------------------------------------------------------------------------
*/
function ddDelayedMenuItemOut(ind) {
  var elm=ddClosingElm[ind];
  var level=ddClosingLevel[ind];
  ddClosingElm[ind]=null;
  if (elm && !elm.isover) {
    ddCloseMenu(elm);
    if (level == 1)
      setTimeout("ddDelayedShowLangSelector()", 800);
  }
}

/*---------------------------------------------------------------------------------------------------------------------------
' @function ddCloseMenu
' @description
' Submenue schliessen 
'
' @param elm: Referenz auf das LI-Element
' 
' @return Null
' ---------------------------------------------------------------------------------------------------------------------------
*/
function ddCloseMenu(elm) {
  if (elm) {
    elm.className="";
    var uls = elm.getElementsByTagName("UL");
    if (uls.length > 0) {
      var ul = uls[0];
      ul.className="";
      var subuls = ul.getElementsByTagName("UL");
      for (var i=0; i<subuls.length; i++) {
        subuls[i].className="";
      }
    }
  }  
}


