//fuggosegek:
if (typeof BROWSERDETECT == "undefined") {
    alert("(ULTIMATEMENU) BROWSERDETECT include missing");
}
//tobbszoros include:
if (typeof ULTIMATEMENU != "undefined") {
    alert("ULTIMATEMENU multiple insert!");
}
ULTIMATEMENU=true;


UltimateMenu.createMenu = function (config) {
  if (typeof this.ultimateMenus == 'undefined') {
    this.ultimateMenus=new Array();
  }
  var menu=new UltimateMenu(config,this.ultimateMenus.length);
  this.ultimateMenus[this.ultimateMenus.length]=menu;

  return menu;
}

UltimateMenu.getMenu = function (index) {
  return this.ultimateMenus[index];
}



/** A menuket osszefogo, menupontokat es menuket nyilvantarto kulso keret osztalya
  * @param config a parameterek objektuma
  * @param index az objektum indexe
  */
function UltimateMenu(config,index) {
  this.index=index;
  this.timerId=null;
  this.menus=new Array();
  this.itemChildMenu=new Array();                  //adott item ala milyen menu tartozik
  this.itemParentMenu=new Array();                 //adott item melyik menu-ben van
  

  this.mainItems=new Array();                      //az osszes fo menupont, ezek nem dinamikusak, mainItems[index]=id
  this.mountElems=new Array();                     //level 0 menuk szuloi, a meglevo elemek id-jai, mountElems[id]=1
  this.mainSeparators=new Array();                 //[index]=id
  
  this.activeIndex=0;                              //aktualisan teljesen kint levo menuk
  this.activeMenus=new Array();                    //lathato menuk verme, az utolso az aktiv mindig


  this.activatedItems=new Array();                 //minden szinten melyik az aktivalt menupont, activatedItems[index]=id 
  this.activatedIndex=0;



  
  this.recentItemEvent=null;                       //animacio kozbeni esemenyeket eltaroljuk, animacio vegen feldolgozzuk
  this.recentItemNode=null;
  this.recentMenuEvent=null;
  this.recentMenuNode=null;
  
  this.hiddenIndex=0;                              //animacio kozben eltuno menuk, kesleltetett select visszahozas miatt
  this.hiddenMenus=new Array();

  this.cache=new Array();                          //elemek cache

  this.input=null;
  this.ignoreFocus=false;
  this.ignoreMouseout=false;
  this.inputFocus=false;


  this.setDefaults();
  this.readConfig(config);
}

/** Alapertelmezett parameterek beallitasa
  */
UltimateMenu.prototype.setDefaults = function () {
  this.hideDelay=500;
  this.keepSelection=0;
  this.keyboardSupport=0;
  this.mainDirection=1;
  this.images="";
  this.classes={
                          menuDiv:                  "menuDiv",
                          menuContentDiv:           "menuContentDiv",
                          menuTable:                "menuTable",
                          menuTableOpacity:         "menuTableOpacity",
                          verticalSeparator:        "verticalSeparator",
                          horizontalSeparator:      "horizontalSeparator",
                          menuItem:                 "menuItem",
                          menuItemLink:             "menuItemLink",
                          menuItemSelected:         "menuItemSelected",
                          menuItemLinkSelected:     "menuItemLinkSelected",
                          menuItemOn:               "menuItemOn",
                          menuItemLinkOn:           "menuItemLinkOn",
                          menuItemLinkOnC:          "menuItemLinkOnC",
                          menuShadow:               "menuShadow",
                          menuBackground:           "menuBackground"
  };
}

/** Ervenyes adatokkal felulirja az alapertelmezett beallitasokat
  * @param config parameterek objektuma
  */
UltimateMenu.prototype.readConfig = function (config) {  
  /*
  if (!config.name) {
//    alert("globalis valtozonevet meg kene adnod!");
    throw new Error("ultimatemenu: name undefined");
    //lehetne itt is meg a menunel is, hogy statikus osztalytol keri le nevvel az objektumot
    //ehelyett a globalis objektumot hivja meg
  } else {
    this.name=config.name;
  }
  */
  /*
  if (typeof config.direction == 'string' 
      && (config.direction == 'N' || config.direction == 'E' 
         || config.direction == 'S' || config.direction == 'W' )) {
    this.direction=config.direction;
  }
  if (typeof config.align == 'string' 
      && (config.direction == 'N' || config.direction == 'E' 
         || config.direction == 'S' || config.direction == 'W' || config.direction == 'CENTER')) {
    this.align=config.align;
  } 
  */
  if (typeof config.hideDelay == 'number' && 0 <= config.hideDelay) {
    this.hideDelay=config.hideDelay;
  } 
  if (typeof config.keepSelection == 'number' && 0 <= config.keepSelection && config.keepSelection <= 1) {
    this.keepSelection=config.keepSelection;
  }

  if (typeof config.mainDirection == 'number' && 0 <= config.mainDirection && config.mainDirection <= 1) {
    this.mainDirection=config.mainDirection;
  }
  
  if (typeof config.keyboardSupport == 'number' && 0 <= config.keyboardSupport && config.keyboardSupport <= 1) {
    this.keyboardSupport=config.keyboardSupport;
  }

  if (typeof config.classes == 'object') {
    //le kell masolni az objektum tartalmat
    this.classes=mergeObject(this.classes,config.classes);
  }
  if (typeof config.images == 'string') {
    this.images=config.images;
  }

  if (typeof config.preloadImages == 'object') {
    for (var i in config.preloadImages) {
      if (typeof config.preloadImages[i] == "string") {
        new Image().src=this.images+config.preloadImages[i];
      }
    }
  }
 
}

UltimateMenu.prototype.addMainItem = function(id) {
  this.mainItems[this.mainItems.length]=id;
}

UltimateMenu.prototype.addMainSeparator = function(id) {
  this.mainSeparators[this.mainSeparators.length]=id;
}

/** Letrehoz egy Menu peldanyt es beregisztralja a szulojehez
  * @param cfg menu beallitasok objektuma
  */
UltimateMenu.prototype.addMenu = function(cfg) {
  cfg.id=this.getMenuId(cfg.parentId);
  cfg.ultimateMenu=this;

  if (cfg.level == 0) {
    //statikus szulo
    this.itemChildMenu[cfg.parentId]=cfg.id;

    //megjegyezzuk a statikus elem id-jat
    this.mountElems[cfg.parentId]=1;
  } else {
    //dinamikus szulo
    cfg.parentId=this.getItemId(cfg.parentId);
    this.itemChildMenu[cfg.parentId]=cfg.id;

    //cfg.parentId-ju elemmel tudatni kell, hogy szulo lett :)
    this.menus[this.itemParentMenu[cfg.parentId]].notifyParent(cfg.parentId);

  }
  this.menus[cfg.id]=new Menu(cfg);
}

/** Egy menupontot hoz letre, es beregisztralja szulo menujehez
  * @param cfg a menupont beallitasok objektuma
  */
UltimateMenu.prototype.addItem = function (cfg) {
  cfg.id=this.getItemId(cfg.id);       //itt kapja meg a vegleges id-t
  this.itemParentMenu[cfg.id]=this.getMenuId(cfg.parentId);
  this.menus[this.getMenuId(cfg.parentId)].addItem(cfg);
}

/** Egy szeparatort hoz letre, es beregisztralja szulo menujehez
  * @param cfg a szeparator beallitasok objektuma
  */
UltimateMenu.prototype.addSeparator = function (cfg) {
  this.menus[this.getMenuId(cfg.parentId)].addSeparator();
}

/** Letrehozza a menuk strukturait, a mount elemekhez engedelyezi az esemenykezelot, oldalbetoltesre esemenykezelot keszit
  */  
UltimateMenu.prototype.render = function () {
  var i;
  for (i in this.menus) {
    if (typeof this.menus[i] == "object") {
      this.menus[i].render();
    }
  }

  for (i=0; i<this.mainItems.length; ++i) {
    this.addMainItemEvents(this.mainItems[i]);
  }
  for (i=0; i<this.mainSeparators.length; ++i) {
    this.addMainSeparatorEvents(this.mainSeparators[i]);
  }

  var ulti=this;
  addEvent(window,"load",function() {ulti.onloadTrigger();});

  if (this.keyboardSupport == 1 ) {
    this.makeKeyInput();
  }
  
}

UltimateMenu.prototype.makeKeyInput = function() {
  var input;

  if (ieDOM) {
    input=document.createElement("select");
    input.setAttribute("multiple","multiple");
    input.size=2;
    input.style.position="absolute";
    input.style.border="none";
    setSize(input,{width:0,height:0});
    setPos(input,{top:0,left:0});
  } else {
    input=document.createElement("textarea");
    input.style.position="absolute";
    input.style.border="none";
    setSize(input,{width:0,height:0});
    setPos(input,{top:0,left:0});
  }
  document.body.appendChild(input);

  var ulti=this;
  addEvent(input,"focus",function(event) {ulti.onfocus(event);}); 
  addEvent(input,"keydown",function(event) {ulti.onkeydown(event);}); 

  addEvent(input,"blur",function(event) {ulti.onblurInput(event);});
  addEvent(document.body,"click",function(event) {ulti.onclick(event);});

  this.input=input;
}

/** Oldalbetoltes esemenykezeloje, a menuket is ertesiti az esemenyrol
  */
UltimateMenu.prototype.onloadTrigger = function () {  
  for (var i in this.menus) {
    if (typeof this.menus[i] == "object") {
      this.menus[i].onloadTrigger();
    }
  }
}

/** Egy mount elemhez beregisztralja az eger esemenykezeloket
  * @param id a mount elem ID-ja
  */
UltimateMenu.prototype.addMainItemEvents = function (id) {
  var ulti=this;
  var node=this.getElem(id);
///  if (this.itemChildMenu[id]) {
    //van almenuje
    addEvent(node,"mouseover",function (event) {ulti.itemMouseover(event,node);});
    addEvent(node,"mouseout",function (event) {ulti.itemMouseout(event,node);});
///  } else {
    //nincs almenuje
///    addEvent(node,"mouseover",function (event) {
///        ulti.ignoreFocus=true;
///        ulti.focus(event);
///        ulti.hideAll();
///        });
///  }
}

UltimateMenu.prototype.addMainSeparatorEvents = function (id) {  
  var node=this.getElem(id);
  var ulti=this;
  //nincs almenuje
  addEvent(node,"mouseover",function (event) {ulti.hideAll();});
}



/** Animacio befejezodesekor feldolgozza a legutobbi esemenyt, amit az animacio miatt eltaroltunk kesobbi feldolgozasra
  */
UltimateMenu.prototype.processRecentEvent = function () {
  if (this.recentItemEvent != null && this.recentItemNode != null) {
    this.itemMouseover(this.recentItemEvent,this.recentItemNode);
    this.recentItemEvent=null;
    this.recentItemNode=null;
  }
  if (this.recentMenuEvent != null && this.recentMenuNode != null) {
    this.menuMouseover(this.recentMenuEvent,this.recentMenuNode);
    this.recentMenuEvent=null;
    this.recentMenuNode=null;
  }
}

/** Az eger egy szeparator fole kerult, ezt dolgozza fel
  * @param event esemeny objektum
  * @param menuId a szeparator menujenek ID-ja
  */
UltimateMenu.prototype.separatorMouseover = function(event,menuId) {
  //szeparatornal csak mouseover az erdekes
  var menu=this.menus[menuId];
  if (menu.state == 2) {
    //akt menu kivetelevel eltuntetunk
    this.startHide(menu.level+1);            
  }
}

/** Az eger egy menupont fole kerult, ezt dolgozza fel
  * @param event esemeny objektum
  * @param node a menupont node
  */
UltimateMenu.prototype.itemMouseover = function(event,node) {
  if (event.ignoreMenu == true) {
    //ezt a menu kuldte mountelemnek
  } else {
    //normal esemeny
    var process=true;
    this.ignoreMouseout=false;

    if (this.mountElems[node.id] != 1 && this.itemParentMenu[node.id]) {
//    if (this.itemParentMenu[node.id]) {
      //dinamikus menupont
      var parentId=this.itemParentMenu[node.id];
      var menu=this.menus[parentId];
    
      if (menu.state != 2) {
        //ha mozog vagy nem lathato
        process=false;
        if (ieDOM) {
          this.recentItemEvent=copyObject(event);
        } else {
          this.recentItemEvent=event;
        }
        this.recentItemNode=node;
      }
    }

    if (process) {
      this.ignoreFocus=true;
      this.focus(event);
//      this.getElem("dbg").value+="activate: "+node.id+"\n";
      this.activateItem(node.id,node,false);
    }
  }
}

/** Az eger kikerult egy menupontrol, ezt dolgozza fel
  * @param event esemeny objektum
  * @param node menupont node
  */
UltimateMenu.prototype.itemMouseout = function(event,node) {
  if (event.ignoreMenu == true) {
    //ezt a menu kuldte mountelemnek
//  } else if (this.ignoreMouseout == true) {
    //gombokkal megyek, ha kimegyek menurol, akkor nem szamit
  } else {
    var process=true;

    if (this.mountElems[node.id] != 1 && this.itemParentMenu[node.id]) {
//    if (this.itemParentMenu[node.id]) {
      //dinamikus menupont
      var parentId=this.itemParentMenu[node.id];
      var menu=this.menus[parentId];
    
      if (menu.state != 2) {
        //ha mozog vagy nem lathato
        process=false;
      }
    }

    if (process) {
//      this.getElem("dbg").value+="deactivate: "+node.id+"\n";
      this.deactivateItem(node.id,node,false);
      this.timeoutHide();  //billentyuzetnel erre nincs szukseg
    }

  }
}

/** Az eger egy menu fole kerult, ezt dolgozza fel
  * @param event esemeny objektum
  * @param node a menu node-ja
  */
UltimateMenu.prototype.menuMouseover = function (event,node) {
  //ramentem egy menure
  var menuId=node.id;   
  var menu=this.menus[menuId];

  if (menu.state == 2) {

    this.cancelHide();

    
//    this.getElem("dbg").value+=node.id+" "+this.activatedIndex+" "+(menu.level+1)+"\n";
    this.activatedItems[menu.level]=menu.parentId; //sajnos menumouseovert atugorhatja itemmouseover, 
                                                   //igy az activatedindex nem biztos, hogy jo lesz
    if (this.keepSelection == 1) {
      //frissitjuk a kijelolest      
      this.highlightItem(this.getElem(menu.parentId));        
    }
    if (this.activatedIndex < menu.level+1) {
      //hozza kell ujra adni a parent itemet
      this.activatedIndex=menu.level+1;
    }
  } else if (menu.state == 1) {
    //ha eppen jon elo
    this.cancelHide();
    this.recentMenuEvent=event;
    this.recentMenuNode=node;
  } else if (menu.state == 3) {
    //ha eppen csukodik ossze, akkor megforditjuk a folyamatot
    this.startHide(menu.level);
    this.activeMenus[menu.level]=menu;
    this.activeIndex=menu.level+1;
    menu.animatedShow();
  }
}

/** Az eger kikerult egy menurol, ezt dolgozza fel
  * @param event esemeny objektum
  * @param node menu node-ja
  */
UltimateMenu.prototype.menuMouseout = function (event,node) {
  //kimentem egy menurol
  var menuId=node.id;   
  var menu=this.menus[menuId];

  this.recentItemEvent=null;
  this.recentItemNode=null;
  this.recentMenuEvent=null;
  this.recentMenuNode=null;

  if (menu.state == 2) {
    this.timeoutHide();
  }
}


/** A menuk eltuntetesere beallitott idozitest torli
  */
UltimateMenu.prototype.cancelHide = function () {
  if (this.timerId != null) {
    clearTimeout(this.timerId);
    this.timerId=null;
  }
}

/** A menuk eltuntetesere allit be idozitest
  */
UltimateMenu.prototype.timeoutHide = function () {
  var ulti=this;
  if (this.timerId != null) {
    clearTimeout(this.timerId);
  }
  this.timerId=setTimeout(function() {ulti.onblur();},this.hideDelay);
}

/** Kezdemenyezi az osszes menu eltunteteset
  */
UltimateMenu.prototype.hideAll = function () {
  this.startHide(0);
  if (this.keepSelection == 1 && this.activatedIndex > 0) {
    //ha eppen fomenun allok es vezereljuk a selectiont
    this.dehighlightItem(this.getElem(this.activatedItems[0]));
  }

  this.activatedIndex=0;
}

/** Kezdemenyezi adott szinttol kezdve a menuk eltunteteset
  * @param level ettol a szinttol kezdve kell a menuknek eltunni
  */
UltimateMenu.prototype.startHide = function (level) {
  //letelt a timeout, level es afolotti menuk eltuntetese

  if (this.activeIndex > level) {
    //level felettiek szimplan eltunnek
    for (var i=this.activeIndex-1; i > level; --i) {
      this.activeMenus[i].hide();
    }
    //level animalva tunik el
    this.activeMenus[level].animatedHide();
    
    this.activeIndex=level;
  }
}

/** Egy menupont kivalasztottkent megjelolese
  * @param node a menupont node-ja
  */
UltimateMenu.prototype.highlightItem = function (node) {
  if (this.itemParentMenu[node.id]) {
    //ha nem fomenu elem, csak akkor allitgatjuk a class-jat
    var menuId=this.itemParentMenu[node.id];
    var menu=this.menus[menuId];
    menu.highlight(node.id);
  } else {
    if (nsDOM || operaDOM) {           
      var evt=document.createEvent("MouseEvents");
      evt.initEvent("mouseover",true,true);
      evt.ignoreMenu=true;

      node.dispatchEvent(evt);
    } else if (ieDOM) {
      //csak egy egyszeru mouseover-t kuldunk
      var evt=document.createEventObject();
      evt.ignoreMenu=true;
      node.fireEvent("onmouseover",evt);
    } 
  }
}

/** Egy menupont kivalasztasanak torlese
  * @param node a menupont node-ja
  */
UltimateMenu.prototype.dehighlightItem = function (node) {
  if (this.itemParentMenu[node.id]) {
    var menuId=this.itemParentMenu[node.id];
    var menu=this.menus[menuId];
    menu.dehighlight();
  } else {
    if (nsDOM || operaDOM) {           
      var evt=document.createEvent("MouseEvents");
      evt.initEvent("mouseout",true,true);
      evt.ignoreMenu=true;

      node.dispatchEvent(evt);
    } else if (ieDOM) {
      //csak egy egyszeru mouseover-t kuldunk
      var evt=document.createEventObject();
      evt.ignoreMenu=true;
      node.fireEvent("onmouseout",evt);
    } 
  }
}

/** A cache-bol visszaad egy elemet
  * @param id a kert elem id-ja
  * @return a kert elem
  */
UltimateMenu.prototype.getElem = function (id) {
  if (this.cache[id] == null) {
    this.cache[id]=document.getElementById(id);
  }
  return this.cache[id];
}

/** Egy menu ID-jat szarmaztatja a szulo elem ID-jabol
  * @param parentId a szulo elem ID-ja
  * @return a menu ID-ja
  */
UltimateMenu.prototype.getMenuId = function (parentId) {
  return "menu_"+this.index+"_"+parentId;
}

/** Egy menupont ID-jat szarmaztatja a sajat ID-jabol (id csak menun belul egyedi, ezert html namespace-beli egyedi ID-ra kell konvertalni)
  * @param id a menupont ID-ja
  * @return a menupont ID-ja
  */
UltimateMenu.prototype.getItemId = function (id) {
  return "menuitem_"+this.index+"_"+id;
}


/** Egy menu megjelenitesenek esemenyet dolgozza fel, hideselect kezelese
  * @param menu a menu objektum
  */
UltimateMenu.prototype.notifyShow = function (menu) {
  if (this.hiddenIndex > 0) {
    //ha animacio kozben eltunt menu
    var i;
    for (i=0; i<this.hiddenIndex; ++i) {
      if (i == this.hiddenIndex-1) {
        //eleg az utolsonal eltuntetni a lathatoak alatti selecteket
        HideSelect.notifyHide(this.hiddenMenus[i].id,true);
      } else {
        HideSelect.notifyHide(this.hiddenMenus[i].id);
      }
    }
    this.hiddenIndex=0;
//erre nincsen szukseg, mert notifyHide true miatt az osszes lathato node-nal eltunnek a selectek    
//    for (i=0; i<this.activeIndex; ++i) {
//      HideSelect.notifyShow(this.activeMenus[i].id);
//    }
  } else {
    //ha animacio kozben nem tunt el egy menu sem
    HideSelect.notifyShow(menu.id);
  }
  
}
/** Egy menu animalt megjelenitesenek befejezeset dolgozza fel, hideselect kezelese
  * @param menu a menu objektum
  */
UltimateMenu.prototype.notifyAnimateEnd = function (menu) {
  if (this.hiddenIndex > 0) {
    //ha animacio kozben eltunt menu
    var i;
    for (i=0; i<this.hiddenIndex; ++i) {
      if (i == this.hiddenIndex-1) {
        //eleg az utolsonal eltuntetni a lathatoak alatti selecteket
        HideSelect.notifyHide(this.hiddenMenus[i].id,true);
      } else {
        HideSelect.notifyHide(this.hiddenMenus[i].id);
      }
    }
    this.hiddenIndex=0;
  }
  
}


/** Egy menu eltunesenek esemenyet dolgozza fel, hideselect kezelese
  * @param menu a menu objektum
  */
UltimateMenu.prototype.notifyHide = function (menu) {
  var actives=false;
  var i;
  for (i=0; i<this.activeIndex && actives == false; ++i) {
    if (this.activeMenus[i].state == 1) {
      actives=true;
    }
  }
  if (actives) {
    //van elobujo, akkor el kell raktarozni
    this.hiddenMenus[this.hiddenIndex]=menu;
    this.hiddenIndex++;
  } else {
    //nincs elobujo, ez eddigiekrol ertesiteni hideSelect-et
    for (var i=0; i<this.hiddenIndex; ++i) {
      HideSelect.notifyHide(this.hiddenMenus[i].id);
    }
    this.hiddenIndex=0;
    //eleg itt eltuntetni a lathato node-ok selectjeit
    HideSelect.notifyHide(menu.id,true);
  }
}




///////////////////////////////////////////////////////////////////////////////////dsfdf



UltimateMenu.prototype.onfocus = function(event) {
//elso elemre mouseover esemenyt generalni  
  this.inputFocus=true;

  if (this.ignoreFocus == false) {
    if (this.activatedIndex == 0) {
      //ha nincs kirakva meg aktiv elem

      var firstMainItem=this.getElem(this.mainItems[0]);
      if (firstMainItem) {
        //      this.getElem("dbg").value+="firstmainitem\n";
        this.activateItem(firstMainItem.id,firstMainItem,true);
      }
    }  
  } else {
    this.ignoreFocus=false;
  }
}

UltimateMenu.prototype.onblur = function(event) {
  //itt csak akkor kell hideall, ha ha nem a menukon belul kattintottunk, vagy tabot nyomtunk, kulonben vissza a focus-t!
  this.hideAll();
/*  
  if (this.keyboardSupport == 1) {
    this.input.blur();
  }
*/  
}

UltimateMenu.prototype.onblurInput = function(event) {
  //nem a mienk a kijelolt elem
  this.inputFocus=false;
}

UltimateMenu.prototype.focus = function(event) {
  if (this.keyboardSupport == 1) {
    if (nsDOM || operaDOM) {
      setPos(this.input,getEventPos(event));
    }
    //        var scrollPos=getScrollPos();
//    if (document.activeElement != this.input) 
    if (this.inputFocus == false) {
      //ha meg nincs focus, akkor nyomas
//      alert("focus");
      var ulti=this;
      setTimeout(function() {ulti.input.focus();},10);
//      this.input.focus();
    }
    //        window.scrollTo(scrollPos.left,scrollPos.top);
  }
}


//activate, deactivate
UltimateMenu.prototype.activateItem = function (id,node,keyboard) {
  if (node == null) {
    node=this.getElem(id);
  }
  //ramentem egy elemre
//  this.getElem("dbg").value+="activate: "+node.id+"\n";

  if (this.mountElems[node.id] == 1) {
    //mount elem
    if (this.keepSelection == 1  && this.activatedIndex > 0 && this.activatedItems[0] != node.id) {        
      //ha mount elem es iranyitjuk a selection-t, es nem ora mentunk vissza
      //csak egernel
      this.dehighlightItem(this.getElem(this.activatedItems[0]));
    }
  } else {   
    //dinamikus elem vagy fomenu elem
    if (this.itemParentMenu[node.id]) {
      //dinamikus elem
      if (this.keepSelection == 1) {   
        var menuId=this.itemParentMenu[node.id];
        var menu=this.menus[menuId];
        if (menu && this.activatedIndex > menu.level+2) {
          //csak egernel
          this.deactivateItem(this.activatedItems[menu.level+2],this.getElem(this.activatedItems[menu.level+2]),keyboard);            }
      }
    } else if (this.activatedIndex > 0) {
//      this.getElem("dbg").value+="activate(de): "+this.activatedItems[0]+"\n";
      this.deactivateItem(this.activatedItems[0],this.getElem(this.activatedItems[0]),true);      
    }
  }


  
  //type: 0 (item), 1 (sep)
  this.cancelHide();
  this.highlightItem(node);



  var parentId=this.itemParentMenu[node.id];
  if (parentId) {
    //menuben van
    var menu=this.menus[parentId];
    var index=menu.level+1;   //elso dinamikus menu indexe: 0
    this.activatedItems[index]=node.id;
    this.activatedIndex=index+1;
  } else {
    //ha static resz eleme (html-ben szereplo elem)
    this.activatedItems[0]=node.id;
    this.activatedIndex=1;
  }




  var menuId=this.itemChildMenu[node.id];
  if (menuId) {
    //van menuje
    var menu=this.menus[menuId];
    if (menu.state == 2) {
      //akt menu kivetelevel eltuntetunk
      this.startHide(menu.level+1);
    } else {
      this.startHide(menu.level);
      this.activeMenus[menu.level]=menu;
      this.activeIndex=menu.level+1;
      menu.animatedShow();
      
    }      
  } else if (parentId) {
    //nincsen menuje es nem a fomenuben van
//    var parentId=this.itemParentMenu[node.id];
    var menu=this.menus[parentId];
    //akt menu kivetelevel eltuntetunk
    this.startHide(menu.level+1);            
  } else {
    //nincsen menuje es a fomenuben van
    this.startHide(0);            
  }

}

UltimateMenu.prototype.deactivateItem = function (id,node,keyboard) {
  if (node == null) {
    node=this.getElem(id);
  }
//  this.getElem("dbg").value+="deactivate: "+node.id+"\n";
  //kimentem egy elemrol
  //type: 0 (item), 1 (sep)
  var found=false;
  for (var i=0; i < this.activatedIndex; ++i) {
    if (this.activatedItems[i] == node.id) {
      found=true;
    }
  }
  if (found) {
    this.dehighlightItem(node);

    --this.activatedIndex;  //nem lesz aktivalt


    if (keyboard) {
      //ha volt menuje, akkor kinyirni a menut
      var menuId=this.itemChildMenu[id];
      if (menuId) {
        var menu=this.menus[menuId];
        this.startHide(menu.level);
      }
    }
  }
}

UltimateMenu.prototype.contains = function (node) {
  var i;
  for (i in this.menus) {
    if (typeof this.menus[i] == "object") {
      if (contains(this.menus[i].node,node)) {
        return true;
      }
    }      
  }
  for (i=0; i<this.mainItems.length; ++i) {
    if (contains(this.getElem(this.mainItems[i]),node)) {
      return true;
    }
  }
  for (i=0; i<this.mainSeparators.length; ++i) {
    if (contains(this.getElem(this.mainSeparators[i]),node)) {
      return true;
    }
  }
  return false;
}

UltimateMenu.prototype.onclick = function (event) {
  var target=getTarget(event);
  if (this.contains(target)) {
    this.ignoreFocus=true;
    this.focus(event);
  } else {
    this.onblur();
  }
  return true;
}

/** Ez a metodus kezeli le azt az esemenyt, amikor egy billentyut lenyomtunk a checkselecten
 * @param event az esemeny objektum
 */
UltimateMenu.prototype.onkeydown = function(event) {
  if (event.keyCode == 32) {
    //space
    this.ignoreMouseout=true;
    if (this.activatedIndex > 0) {
      var itemId=this.activatedItems[this.activatedIndex-1]; 
      var item=this.getElem(itemId);
      if (item) {
        var link;
        if (item.nodeType == 1 && item.tagName.toLowerCase() == "a") {
          link=item;
        } else {
          var links=item.getElementsByTagName("a");
          link=links[0];
        }
        if (nodeHasAttribute(link,"href")) {
          window.location=link.getAttribute("href");
        }
      }
    }
  } else if (event.keyCode == 33) {
    //page up
//    this.jumpItemAbs(0);
//    this.jumpOptionRel(-this.size,false);
  } else if (event.keyCode == 34) {
    //page down
//    this.jumpItemAbs(-1);
//    this.jumpOptionRel(this.size,false);
  } else if (event.keyCode == 36) {
    //home
    this.ignoreMouseout=true;
    this.jumpItemAbs(0);
//    this.jumpOptionAbs(0,true,shift);
  } else if (event.keyCode == 35) {
    //end
    this.ignoreMouseout=true;
    this.jumpItemAbs(-1);
//    this.jumpOptionAbs(this.options.length-1,true);
  } else if (event.keyCode == 38) {
    //fel
    this.ignoreMouseout=true;
    this.onArrowKeyPressed(event);
//    this.jumpItemRel(-1,true);
//    this.jumpOptionRel(-1,true);
  } else if (event.keyCode == 40) {
    //le
    this.ignoreMouseout=true;
    this.onArrowKeyPressed(event);
//    this.jumpItemRel(1,true);
//    this.jumpOptionRel(1,true);
  } else if (event.keyCode == 37) {
    //balra
    this.ignoreMouseout=true;
    this.onArrowKeyPressed(event);
//    this.jumpPrevMenu();
//    this.jumpOptionRel(1,true,shift);
  } else if (event.keyCode == 39) {
    //jobbra
    this.ignoreMouseout=true;
    this.onArrowKeyPressed(event);
//    this.jumpNextMenu();
//    this.jumpOptionRel(1,true,shift);  
  } else if (event.keyCode == 9) {
    //tab
    this.onblur();
  }

}

UltimateMenu.prototype.onArrowKeyPressed = function(event) {
  var shift=false;
  if (event.shiftKey || event.shiftLeft) {
    shift=true;
  }
  preventDef(event);  //shift+left lenyelese IE esetenm, sajnos ezt az input nem eszi meg
  if (this.activatedIndex == 1) {
    //fomenuben vagyok
    var itemId=this.activatedItems[0];
    var menuId=this.itemChildMenu[itemId];
    var menu=this.menus[menuId];
    if (this.mainDirection == 1) {
      //vizszintes
      if (event.keyCode == 38) {
        //fel
        if (menu && menu.actPosition == "N") {
          this.jumpNextMenu();
        }
      } else if (event.keyCode == 40) {
        //le
        if (menu && menu.actPosition == "S") {
          this.jumpNextMenu();
        }
      } else if (event.keyCode == 37) {
        //bal
        if (menu && menu.actPosition == "W" && shift == false) {
          this.jumpNextMenu();
        } else {
          this.jumpItemRel(-1,true);
        }
      } else if (event.keyCode == 39) {
        //jobb
        if (menu && menu.actPosition == "E" && shift == false) {
          this.jumpNextMenu();
        } else {
          this.jumpItemRel(1,true);
        }
      }
    } else {
      //fuggoleges
      if (event.keyCode == 38) {
        //fel
        if (menu && menu.actPosition == "N" && shift == false) {
          this.jumpNextMenu();
        } else {
          this.jumpItemRel(-1,true);
        }
      } else if (event.keyCode == 40) {
        //le
        if (menu && menu.actPosition == "S" && shift == false) {
          this.jumpNextMenu();
        } else {
          this.jumpItemRel(-1,true);
        }
      } else if (event.keyCode == 37) {
        //bal
        if (menu && menu.actPosition == "W") {
          this.jumpNextMenu();
        }
      } else if (event.keyCode == 39) {
        //jobb
        if (menu && menu.actPosition == "E") {
          this.jumpNextMenu();
        }
      }
    }    
  } else {
    var itemId=this.activatedItems[this.activatedIndex-1];
    var menuId=this.itemParentMenu[itemId];
    var menu=this.menus[menuId];
    var childMenuId=this.itemChildMenu[itemId];
    var childMenu=this.menus[childMenuId];
    if (menu && menu.direction == 1) {
      //vizszintes
      if (event.keyCode == 38) {
        //fel
        if (childMenu && childMenu.actPosition == "N" && shift == false) {            
          this.jumpNextMenu();
        } else if (menu.getIndexById(itemId) == 0 && menu.actPosition == "S") {
          //fent allunk es fent van a parent item
          this.jumpPrevMenu();
        }
      } else if (event.keyCode == 40) {
        //le
        if (childMenu && childMenu.actPosition == "S" && shift == false) {            
          this.jumpNextMenu();
        } else if (menu.getIndexById(itemId) == menu.items.length-1 && menu.actPosition == "N") {
          //lent allunk es lent van a parent item
          this.jumpPrevMenu();
        }
      } else if (event.keyCode == 37) {
        //bal
        if (childMenu && (childMenu.actPosition == "NW" || childMenu.actPosition == "W" || childMenu.actPosition == "SW") 
            && shift == false) {            
          this.jumpNextMenu();
        } else if (menu.getIndexById(itemId) == 0 
            && (menu.actPosition == "E" || menu.actPosition == "SE" || menu.actPosition == "NE") && shift == false) {
          //bal oldalon allunk es balra van a parent item
          this.jumpPrevMenu();
        } else {
          this.jumpItemRel(-1,true);
        }
      } else if (event.keyCode == 39) {
        //jobb
        if (childMenu && (childMenu.actPosition == "NE" || childMenu.actPosition == "E" || childMenu.actPosition == "SE") 
            && shift == false) {            
          this.jumpNextMenu();
        } else if (menu.getIndexById(itemId) == menu.items.length-1
            && (menu.actPosition == "W" || menu.actPosition == "SW" || menu.actPosition == "NW") && shift == false) {
          //jobb oldalon allunk es jobbra van a parent item
          this.jumpPrevMenu();
        } else {
          this.jumpItemRel(1,true);
        }
      }
    } else {
      //fuggoleges
      if (event.keyCode == 38) {
        //fel
        if (childMenu && childMenu.actPosition == "N" && shift == false) {            
          this.jumpNextMenu();
        } else {
          if (menu.getIndexById(itemId) == 0 && menu.actPosition == "S" && shift == false) {
            //fent allunk es fent van a parent item
            this.jumpPrevMenu();
          } else {
            this.jumpItemRel(-1,true);
          }
        }
      } else if (event.keyCode == 40) {
        //le
        if (childMenu && childMenu.actPosition == "S" && shift == false) {            
          this.jumpNextMenu();
        } else {
          if (menu.getIndexById(itemId) == menu.items.length-1 && menu.actPosition == "N" && shift == false) {
            //fent allunk es fent van a parent item
            this.jumpPrevMenu();
          } else {
            this.jumpItemRel(1,true);
          }
        }
      } else if (event.keyCode == 37) {
        //bal
        if (childMenu && (childMenu.actPosition == "W" || childMenu.actPosition == "NW" ||childMenu.actPosition == "SW") 
            && shift == false) {            
          this.jumpNextMenu();
        } else if (menu.getIndexById(itemId) == 0 && (menu.actPosition == "E" || menu.actPosition == "SE")) {
          //fent allunk es balra van a parent item
          this.jumpPrevMenu();
        } else if (menu.getIndexById(itemId) == menu.items.length-1 && menu.actPosition == "NE") {
          //fent allunk es balra van a parent item
          this.jumpPrevMenu();
        }
      } else if (event.keyCode == 39) {
        //jobb
        if (childMenu && (childMenu.actPosition == "E" || childMenu.actPosition == "NE" ||childMenu.actPosition == "SE") 
            && shift == false) {            
          this.jumpNextMenu();
        } else if (menu.getIndexById(itemId) == 0 && (menu.actPosition == "W" || menu.actPosition == "SW")) {
          //fent allunk es balra van a parent item
          this.jumpPrevMenu();
        } else if (menu.getIndexById(itemId) == menu.items.length-1 && menu.actPosition == "NW") {
          //fent allunk es balra van a parent item
          this.jumpPrevMenu();
        }
      }
    }
  }    
}

UltimateMenu.prototype.getIndexById = function(id) {
  for(var i=0; i<this.mainItems.length; ++i) {
    if (this.mainItems[i] == id) {
      return i;
    }
  }
  return null;
}


UltimateMenu.prototype.jumpItemAbs = function (index) {
  if (this.activatedIndex == 1) {
    //fomenuben vagyunk
    if (index == -1) {
      //utolso elemre kell ugrani
      index=this.mainItems.length-1;
    }
    if (this.activatedItems[0] != this.mainItems[index]) {
      //ha nem ugyanarra kell menni, akkor lepunk 
      this.deactivateItem(this.activatedItems[0],this.getElem(this.activatedItems[0]),true);
      this.activateItem(this.mainItems[index],this.getElem(this.mainItems[index]),true);
    }
  } else {
    //almenuben vagyunk
    var nodeId=this.activatedItems[this.activatedIndex-1];
    var menuId=this.itemParentMenu[nodeId];
    var menu=this.menus[menuId];
    var prevIndex=menu.getIndexById(nodeId);
    if (index == -1) {
      index=menu.items.length-1;
    } 
    if (index != prevIndex) {      
      //ha nem ugyanarra kell menni, akkor lepunk 
      this.deactivateItem(this.activatedItems[this.activatedIndex-1],this.getElem(this.activatedItems[this.activatedIndex-1]),true);
      this.activateItem(menu.items[index],this.getElem(menu.items[index]),true);
    }
  }
}


UltimateMenu.prototype.jumpItemRel = function (step,turnaround) {
  if (this.activatedIndex == 1) {
    //fomenuben vagyunk
    var prevIndex=this.getIndexById(this.activatedItems[0]);
    var nextIndex=prevIndex+step;
    if (nextIndex < 0) {
      if (turnaround) {
        nextIndex=this.mainItems.length-1;
      } else {
        nextIndex=0;
      }
    } else if (nextIndex >= this.mainItems.length) {
      if (turnaround) {
        nextIndex=0;
      } else {
        nextIndex=this.mainItems.length-1;
      }
    }
    if (prevIndex != nextIndex) {
      //ha nem ugyanarra kell menni, akkor lepunk 
      this.deactivateItem(this.activatedItems[0],this.getElem(this.activatedItems[0]),true);
      this.activateItem(this.mainItems[nextIndex],this.getElem(this.mainItems[nextIndex]),true);
    }
  } else {
    //almenuben vagyunk
    var nodeId=this.activatedItems[this.activatedIndex-1];
    var menuId=this.itemParentMenu[nodeId];
    var menu=this.menus[menuId];
    var prevIndex=menu.getIndexById(nodeId);
    var nextIndex=prevIndex+step;
    if (nextIndex < 0) {
      if (turnaround) {
        nextIndex=menu.items.length-1;
      } else {
        nextIndex=0;
      }
    } else if (nextIndex >= menu.items.length) {
      if (turnaround) {
        nextIndex=0;
      } else {
        nextIndex=menu.items.length-1;
      }
    }
    if (prevIndex != nextIndex) {
      //ha nem ugyanarra kell menni, akkor lepunk 
      this.deactivateItem(this.activatedItems[this.activatedIndex-1],this.getElem(this.activatedItems[this.activatedIndex-1]),true);
      this.activateItem(menu.items[nextIndex],this.getElem(menu.items[nextIndex]),true);
    }
  }
}

UltimateMenu.prototype.jumpNextMenu = function() {
 var actItemId=this.activatedItems[this.activatedIndex-1]; 
 var menuId=this.itemChildMenu[actItemId];
 if (menuId) {
   //van menuje
   var menu=this.menus[menuId];
   if ((menu.direction == 1 && (menu.actPosition == "W" || menu.actPosition == "NW" || menu.actPosition == "SW")) 
       ||
       (menu.direction == 0 && (menu.actPosition == "N" || menu.actPosition == "NE" || menu.actPosition == "NW"))) {
     //utolso elemre megyunk
     if (menu.items[menu.items.length-1]) {
       if (this.keepSelection == 0) {
         //elozo elem nem lesz kijelolve
         this.dehighlightItem(this.getElem(this.activatedItems[this.activatedIndex-1]));
       }
       this.activateItem(menu.items[menu.items.length-1],this.getElem(menu.items[menu.items.length-1]),true);
     }
   } else {
     //elso elemre megyunk
     if (menu.items[0]) {
       if (this.keepSelection == 0) {
         //elozo elem nem lesz kijelolve
         this.dehighlightItem(this.getElem(this.activatedItems[this.activatedIndex-1]));
       }
       this.activateItem(menu.items[0],this.getElem(menu.items[0]),true);
     }
   }
 }
}

UltimateMenu.prototype.jumpPrevMenu = function() {
  if (this.activatedIndex > 1) {
    //nem fomenuben vagyok
    this.deactivateItem(this.activatedItems[this.activatedIndex-1],this.getElem(this.activatedItems[this.activatedIndex-1]),true);
    if (this.keepSelection == 0) {
      //kijelolni elozo elemet 
      this.highlightItem(this.getElem(this.activatedItems[this.activatedIndex-1]));
    }
  }
}
