var obj = {object:null}

/* don't edit after this point */

function loadMenu(menuid) {
 setEventListener(document,'click',MenuCloseAll,true);

 var menu = document.getElementById(menuid);
 menu.setAttribute('role','role:menu');
 var lastItem;
 setEventListener(document,'keydown',menuKeydown,true);

 function crawl(ul,depth){
  var listItems = ul.childNodes;
  var i = 0;
  var prevSib = null;
  while(listItems[i]) {
   if(listItems[i].nodeName.toLowerCase() == 'li'){
    listItems[i].menu = menu; // referance to the menu.
    listItems[i].setAttribute('role','role:menuitem');
    setAaaAttri('level',listItems[i],depth);

    listItems[i].liPrev = lastItem;
    if(lastItem){
     lastItem.liNect = listItems[i];
    }
    lastItem = listItems[i];
    listItems[i].liSibPrev = prevSib;
    if(prevSib != null){
     prevSib.liSibNext = listItems[i];
    }
    prevSib = listItems[i];

    setEventListener(listItems[i],'mouseover',MenuHover,true);
    setEventListener(listItems[i],'focus',MenuHover,true);
    listItems[i].tabIndex = 0;

    var list = listItems[i].childNodes;
    var j = 0;
    while(list[j]){
     if(list[j].nodeName.toLowerCase() == 'ul'){
      listItems[i].ul = list[j];
      setClass(listItems[i],'hasub');
      setClass(listItems[i].ul,'vertical');
      list[j].setAttribute('role','role:menu');
      list[j].style.display = "none";
      crawl(list[j],depth+1);
     }
     j++;
    }
   }
   i++;
  }
 }
 crawl(menu,1);
}

function menuKeydown(aEvent){
 item = obj.object;
 if(item) {
  item = item.menu.focused;
  if(isClass(item.parentNode,'horizontal')){
   if(aEvent.keyCode == 37){
	item.liSibPrev.focus();
   }
   if(aEvent.keyCode == 39){
	item.liSibNext.focus();
   }
   if(aEvent.keyCode == 38){
	item.liSibPrev.focus();
   }
   if(aEvent.keyCode == 40){
    if(item.ul){
     var nodes = item.ul.childNodes;
     var i = 0;
     while(nodes[i]){
      if(nodes[i].nodeName.toLowerCase() == 'li'){
       nodes[i].focus();
       return;
      }
      i++;
     } 
    } else {
     item.liSibNext.focus();
    }
   }
  } else {
   if(aEvent.keyCode == 37 || aEvent.keyCode == 38){
     if(item.liSibPrev){
      item.liSibPrev.focus();
     } else {
      item.parentNode.parentNode.focus();
     }
   }
   if(aEvent.keyCode == 39){
    if(item.ul){
     var nodes = item.ul.childNodes;
     var i = 0;
     while(nodes[i]){
      if(nodes[i].nodeName.toLowerCase() == 'li'){
       nodes[i].focus();
       return;
      }
      i++;
     } 
    } else {
     item.liSibNext.focus();
    }
   }
   if(aEvent.keyCode == 40){
   item.liSibNext.focus();
   }
  }
 }
}

function MenuHover(aEvent){
 var target = getEventTarget(aEvent);
 while(target.nodeName.toLowerCase() != 'li'){
  target = target.parentNode;
 }

 var width = document.body.offsetWidth;
 var height = document.body.offsetHeight;

 MenuCloseAll(null,target);
 target.menu.focused = target;
 setClass(target,'active');
 obj.object = target;

 if(target.ul){
  target.ul.style.display = 'block';
  var pos = find_real_pos(target.ul);
  if(width - pos[0] < target.ul.offsetWidth){
   setClass(target.ul,'left-side');
  }
  if(height - pos[1] < target.ul.offsetHeight && pos[1] > target.ul.offsetHeight){
   // setClass(target.ul,'move-up');
  }
 }
}

function MenuCloseAll(aEvent,menu){
 if(menu == undefined) {
  menu = obj.object;
 }
 if(menu) {
  while(menu.nodeName.toLowerCase() != 'ul'){
   menu = menu.parentNode;
  }
  menu.focused == undefined;
  var listItems = menu.childNodes;
  var i = 0;
  while(listItems[i]) {
   removeClass(listItems[i],'active');
   if(listItems[i].ul){
    listItems[i].ul.style.display = 'none';
    MenuCloseAll(aEvent,listItems[i].ul);
   }
   i++;
  }
 }
}

function getEventTarget(aEvent){
 if(aEvent.srcElement){
  var target = aEvent.srcElement;
 } else {
  var target = aEvent.target;
 }
 return target;
}

function setEventListener(item,event,func,bool) {
 if(item.addEventListener){
   item.addEventListener(event,func,bool);
 } else {
  item.attachEvent('on'+event,func,bool);
 }
}

function find_real_pos(obj) {
 var curleft = curtop = 0;
  if(obj.offsetParent) {
   curleft = obj.offsetLeft
   curtop = obj.offsetTop
   while (obj = obj.offsetParent) {
    curleft += obj.offsetLeft
    curtop += obj.offsetTop
   }
  }
 return [curleft,curtop];
}

function noAction(event){
 if(event.stopPropagation){
  event.stopPropagation();
  event.preventDefault();
 } else {
  event.cancelBubble = true;
 }
 return false;
}

function getAaaAttri(aAttri,aElem){
 if(aElem.setAttributeNS) {
   return parseInt(aElem.getAttributeNS("http://www.w3.org/2005/07/aaa", aAttri));
 } else {
   return  parseInt(aElem.getAttribute("aaa:" + aAttri));
 }
 return null;
}

function setAaaAttri(aAttri,aElem,value){
 if(aElem.setAttributeNS) {
  aElem.setAttributeNS("http://www.w3.org/2005/07/aaa", aAttri, value);
 } else {
   aElem.setAttribute("aaa:" + aAttri, value);
 }
 return true;
}

function setClass(item,value){
 if(value != null){
  var valueNow = item.className;
  if(valueNow == null){
   return;
  }
  item.className = valueNow + ' ' + value;
 }
}

function removeClass(item,value){
 if(item) {
  var valueNow = item.className;
  if(valueNow == null){
    return;
  }
  var classReg = new RegExp(value,'gi');
  item.className = valueNow.replace(classReg,'');
 }
}

function isClass(item,value){
 var valueNow = item.className;
 if(valueNow == null){
   return false;
 }
 var classReg = new RegExp(value,'gi');
 return valueNow.match(classReg);
}
