
var MENU_SUBITEM_TAGNAME = "TD";
var MAINMENU_SUBITEM_TAGNAME = "TD";
var MENU_NAME_SUFFIX = "_menu";
var ITEM_NAME_SUFFIX = "_item";

document.MainMenus = new Array();
document.ActiveSubmenu = null;
SubMenuItemsNames = new Array();
///////////////////////////////////////////////////////////////////////////////////////////////////
// class for main menu
function MainMenu(name){
  this.element = document.getElementById(name);
  if (!this.element ){
    this.Disabled = true;
    return null;
  }
  document.ActiveSubmenu = this.ActiveSubmenu ;
  this.IsActive= false;
  var oItems = this.element.getElementsByTagName(MAINMENU_SUBITEM_TAGNAME);
  this.MenuItems = new Array();
  for (var i=0;i<oItems.length;i++){
    if(oItems[i].id.indexOf(ITEM_NAME_SUFFIX)>=0){
      this.MenuItems[this.MenuItems.length] = new MenuItem(oItems[i],this);     
    }
  }
}

MainMenu.prototype.RegisterSubMenu = mmRegSubMenu;

function mmRegSubMenu(){

}

function RegisterMain(name){
  return document.MainMenus[document.MainMenus.length] = new MainMenu(name);
}

///////////////////////////////////////////////////////////////////////////////////////////////////
// class for menusheet
function SubMenu(elemName, ownerName, isVertical, NormalDirection){
  this.element = document.getElementById(elemName);
  this.ownerMenuItem = document.getElementById(ownerName);
  //alert(ownerName);
  this.ownerMenuItem = this.ownerMenuItem.MenuItemObject ;
  this.Disabled = false;
  this.ActiveSubmenu = null;
  this.isVertical = (isVertical==true);
  this.NormalDirection = (NormalDirection==true);
  if (!(this.element && this.ownerMenuItem)){
    this.Disabled = true;
    return null;
  }
  markChildren(this.element, "Menu", this)
  if( this.ownerMenuItem){
    this.ownerMenuItem.RegisterSubMenu(this);
  }
  this.style = this.element.style;
  this.style.display= "block"; // we must set display to "none" in order to right page rendering
  this.x = 0;
  this.y = 0;
  this.MenuItems = new Array();
  var oItems = this.element.getElementsByTagName(MENU_SUBITEM_TAGNAME);
  for (var i=0; i<oItems.length;i++){
    if(oItems[i].id.indexOf(ITEM_NAME_SUFFIX)>=0){
      this.MenuItems[this.MenuItems.length] = this.RegisterMenuItem(oItems[i]);
    }                                             
  }
}

SubMenu.prototype.RegisterMenuItem = smRegMenuItem;
SubMenu.prototype.Show = smShow;
SubMenu.prototype.Hide = smHide;
SubMenu.prototype.SetPosition = smSetPos;

function smRegMenuItem(elem){
  return new MenuItem(elem, this);
}


function smShow(){
  this.style.visibility = "visible";
}
                                                                        
function smHide(){
  if (this.ActiveSubmenu){
    this.ActiveSubmenu.Hide();
  }
  this.style.visibility = "hidden";
}

function smSetPos(element){
  var pos = WindowPosition(element);
  switch(this.isVertical){
    case false: {
      this.style.top = pos.y + element.offsetHeight - 0;
      this.style.left = pos.x - 0;
      break;
    }
    case true: {
      this.style.top = pos.y ;
      this.style.left = pos.x + element.offsetWidth;
      break;
    }
  }

}

function RegisterSubMenu(name, isVertical,normalDirection){
  var ownerName = name + ITEM_NAME_SUFFIX;
  name = name + MENU_NAME_SUFFIX;
  var buffObj = new Object();
  buffObj.name = name;
  buffObj.ownerName = ownerName;
  buffObj.isVertical = isVertical;
  buffObj.normalDirection = normalDirection;
  SubMenuItemsNames[SubMenuItemsNames.length] = buffObj;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
// class for menuItem
function MenuItem(element, owner){
  if (!element) return ;
  this.element = element;
  this.element.MenuItemObject = this;
  this.SubMenu = null;
  this.owner = owner;
  this.EventForShow = "mouseover";
  this.EventForHide = "mouseout";
  addEvent(this.element, this.EventForShow, DispatchShowEvents) ;
}

MenuItem.prototype.RegisterSubMenu = miRegSubMenu;
MenuItem.prototype.registerActive = miRegActive;
MenuItem.prototype.HighLightOn = miHighLightOn;
MenuItem.prototype.HighLightOff = miHighLightOff;
/* members*/

function miRegSubMenu(obj){
  if(!obj) return;
  this.SubMenu = obj;
  markChildren(this.element, "SubMenu", this.SubMenu) ; // set pointer to submenu to all childnodes

}

function  miRegActive(obj){
  var buff = obj;
  while(obj){
    if (!(obj.ownerMenuItem)){
      break;
    };
    buff = obj;
    obj = obj.ownerMenuItem.owner;
  };
  return  buff;
}

function miHighLightOn(){

}                                                                     

function miHighLightOff(){

}


function DispatchShowEvents(e){
  var obj = GetMenuItem(getSrcElement(e||event));
  if(obj.SubMenu){
    obj.SubMenu.SetPosition(obj);
    obj.MenuItemObject.owner.ActiveSubmenu = obj.SubMenu;
    var  buff;
    if (document.ActiveSubmenu!=(buff=obj.MenuItemObject.registerActive(obj.SubMenu))){
      if (document.ActiveSubmenu){
        document.ActiveSubmenu.Hide();
      }
      document.ActiveSubmenu = buff;
    };
// alert();
    obj.SubMenu.Show();
  }
}

/* event handlers*/

function DispatchHideEvents(e){
  var obj = getSrcElement(e||event);
  if(obj.SubMenu){
    obj.SubMenu.Hide();
    obj.MenuItemObject.owner.ActiveSubmenu = null;
  }
}


/////////////// MENU global routines/////////////////////////////////

//retrieves MenuItem Object from childnode of menuItem element
function GetMenuItem(obj){
  var buff = obj;
  obj = (obj.nodeType==3)?obj.parentNode:obj;
  
  while(obj.SubMenu){
    buff=obj;
    obj =  obj.parentNode;
    if(obj==null) break;
  }
  return buff
}


function closeMenu(e){
 if (document.ActiveSubmenu){
   var obj = getSrcElement(e||event)
   if(!IsMenu(obj) ){
      document.ActiveSubmenu.Hide();
   }
 }
}

function IsMenu(obj){
  if (obj.nodeType==3){
    return (obj.parentNode.SubMenu||obj.parentNode.Menu)  
  }else{
    return (obj.SubMenu||obj.Menu)  
  };


}

/////////////INITIALIZATION/////////////////////////////////////
addEvent(window,'load',Initialize);

function Initialize(){
  addEvent(document.body,'mouseover',closeMenu);
}

function initMenuSystem(name1){
 var buffItem;
// var destDiv = document.getElementById("mc");
 var destDiv = document.getElementById(name1);
 if (destDiv){
   //destDiv.innerHTML = frames["mf"].document.body.innerHTML;
   for (var i=0;i<SubMenuItemsNames.length;i++){
     buffItem = new SubMenu(SubMenuItemsNames[i].name, SubMenuItemsNames[i].ownerName,SubMenuItemsNames[i].isVertical,SubMenuItemsNames[i].normalDirection);
   }
 }

}

function addEvent(elementPtr, eventType, eventFunc) {
   if (elementPtr.addEventListener) {
      elementPtr.addEventListener(eventType, eventFunc, false);
   } if (elementPtr.attachEvent) {
      elementPtr.attachEvent('on' + eventType, eventFunc);
   } else {  ;

   }
}

function markChildren(obj, mark, value){
  if (!obj) return false;
//   if (obj.tagName =="A") alert(obj.innerHTML);
  if(obj.nodeType !=3) {
    obj[mark] = value ;
  };
  for (var i=0;i<obj.childNodes.length; i++){
    markChildren(obj.childNodes[i], mark,value);
  };
  return true;
}

function getSrcElement(evObj){
  if (evObj){
    return (evObj.target||evObj.srcElement);
  };
  return null;
}

function WindowPosition(elt, rootElemID){
  var pos = new Object;
  pos.x = 0;
  pos.y = 0;
  if( elt == null ) return pos;
  
  var rootElem = document.getElementById[ ( rootElemID == null ) ? 0 : rootElemID ];
  if (!rootElem) {rootElem= document.body;};
  
  while( (elt != rootElem) &&(elt.style.position != 'absolute') ){
    pos.x += elt.offsetLeft;
    pos.y += elt.offsetTop;
    elt = elt.offsetParent;
    if( elt == null ) break;
  }
  if ((elt != null) && (elt.style.position == 'absolute')){
    pos.x += elt.offsetLeft;
    pos.y += elt.offsetTop;
  }
  return pos;
}
