/** 
 * Fusion 8 DHTML Menus
 */


/*****************************************
Global Parameters
*****************************************/

var GLOBAL_LoadedImages = new Array();
var GLOBAL_CurrentItem  = "";
var GLOBAL_Close     = null;
var GLOBAL_Hide     = null;
var GLOBAL_items     = new NOF_OpenedItems();

var GLOBAL_slideItem   = null;
var GLOBAL_slideSpeed  = 10; //Defines how fast the slide submenus will unfold
var GLOBAL_slidePixel  = 0; 
var GLOBAL_slideMinOffset = -800;
var GLOBAL_slideMaxOffset = 800;

var useDebuger  = false;


/*
* DOM compliant browsers
*/
function NOF_DOMBrowser() {

 this.getMenuItemLayerStartString = function getMenuItemLayerStartString(menuItemId, parentId) {

  parentId = ( (parentId != null) && (parentId != "undefined") && (typeof(parentId) != "undefined"))
         ? new String(parentId + CONSTANTS.MENU_LAYER_SUFIX) : null;
  menuItemId += CONSTANTS.MENU_LAYER_SUFIX;
  
  var isAutoClose = typeof(C_MENU_AUTO_CLOSE) == "undefined" || C_MENU_AUTO_CLOSE == true ? "true" : "false";

  return '<DIV ID="' + menuItemId + '" isautoclose="' + isAutoClose + '" STYLE="z-index: 5; filter: blendTrans(duration=0.5)" onmouseover="NOF_KeepOpen(\'' + menuItemId + '\', ' + parentId + ')" onmouseout="NOF_KeepClose()">';
 }

 this.getMenuItemLayerEndString = function getMenuItemLayerEndString() {
  return '</DIV>';
 }

 /** method showMenuItem
 *@parameter image Image object - item parent
 *@parameter item String or Object coresponding to a layer
 *@parameter offsetX: horizontal offset distance from parent
 *@parameter offsetY: vertical offset distance from parent
 *@parameter direction Horizontal = false, Vertical = true
 */
 this.showMenuItem = function showMenuItem(image, item, offsetX, offsetY, openEffect) {

  if (typeof(item) == "string")
   item  = this.getItem(item)

  image  = typeof(image) == "string" ? this.getItem(image) : image;

  var top = this.findItemTopOffset(image);
  var left = this.findItemLeftOffset(image);

  var slideDirection = "";
  if (openEffect.indexOf("left") > -1 || openEffect.indexOf("Left") > -1 ) {
    top += offsetY; 
    left -= offsetX;
    slideDirection = "left";
  } else if (openEffect.indexOf("top") > -1 || openEffect.indexOf("Top") > -1 ) {
    top  -= offsetY;
    left += offsetX;
    slideDirection = "top";
  } else if (openEffect.indexOf("right") > -1 || openEffect.indexOf("Right") > -1 ) {
    top += offsetY; 
    left += offsetX;
    slideDirection = "right";
  } else { // Bottom
    top  += offsetY;
    left += offsetX;
    slideDirection = "bottom";
  }
 
  if (item == null || typeof(item.style) == "undefined" || item.style == null )
   return;

  item.style.top = top;
  item.style.left = left;   
  item.style.visibility = "visible"; 
  
  if (openEffect.indexOf("slide") > -1)
   this.slideEffect(item, slideDirection);
  else if (openEffect.indexOf("fade") > -1)
   this.fadeEffect(item);  
 }


 this.hideMenuItem = function hideMenuItem(item) {

  if (typeof(item) == "string")
   item = this.getItem(item)  
 
  if ( item == null || typeof(item) == "undefined" || item == "")
   return;

  item.style.visibility = "hidden";
 }

 this.findItemLeftOffset = function findItemLeftOffset(item) {

  var offset = item.offsetLeft;
  if (item.offsetParent)
   offset += this.findItemLeftOffset(item.offsetParent);

  return offset;
 }

 this.findItemTopOffset = function findItemTopOffset(item) {

  var offset = item.offsetTop;
  if (item.offsetParent)
   offset += this.findItemTopOffset(item.offsetParent);

  return offset;
 }

 this.getItem = function getItem(itemId) {  
  return document.getElementById(itemId);
 }

 this.getItemAttribute = function getItemAttribute(itemId, attrId) {
 
  if (this.getItem(itemId)) {
   var attr = this.getItem(itemId).attributes;
   return eval("attr." + attrId.toLowerCase() + ".value");
  }
 }
 
 this.debug = function debug(txt) {

  var container = this.getItem("debug");
  if ( useDebuger )
   container.value += txt + "\n";
 }

 this.fadeEffect = function fadeEffect(item) {
   
   item.style.visibility = "hidden"; 
   item.filters.blendTrans.Apply();
   item.filters.blendTrans.Play();
   item.style.visibility = "visible"; 
 }

 this.slideEffect = function slideEffect(item, margin) {

  GLOBAL_slideItem = item;
  this.setItemClip('rect(auto, auto, auto, auto)');

  GLOBAL_slidePixel = (margin == "top" || margin == "left") ? 100 : 0;
  this.playEffect(margin);
 }

 this.playEffect = function playEffect(margin) {

  var clip = GLOBAL_slideItem.style.clip;
  if (clip.indexOf("-") > 0) // NS7.x fix
   return;

  if (GLOBAL_slidePixel < GLOBAL_slideMinOffset || GLOBAL_slidePixel > GLOBAL_slideMaxOffset)   
   return;

  var rect = 'rect(';
  if (margin == "top") {
   GLOBAL_slidePixel -= 3;
   rect += GLOBAL_slidePixel +'px auto auto auto)';
  } else if (margin == "right") {
   GLOBAL_slidePixel += 3; 
   rect += 'auto ' + GLOBAL_slidePixel +'px auto auto)';
  } else if (margin == "bottom") {
   GLOBAL_slidePixel += 3;
   rect += 'auto auto ' + GLOBAL_slidePixel + 'px auto)';
  } else {//left
   GLOBAL_slidePixel -= 3;
   rect += 'auto auto auto ' + GLOBAL_slidePixel + 'px)';
  }


  this.setItemClip(rect); 
  setTimeout('browser.playEffect("' + margin + '")', GLOBAL_slideSpeed);  
 }

 this.setItemClip = function setItemClip(rect) {
  GLOBAL_slideItem.style.clip = rect; 
 }

 this.getLayerTag = function getLayerTag() { return "div" };
}


/*
* Netscape 6+ and Mozilla
*/
function NOF_BrowserNetscapeNavigator() {

 //Event capture
 window.onclick= HideMenu;
 
 this.fadeEffect = function fadeEffect() { return; };

 // Set a higher sliding speed
 GLOBAL_slideSpeed = 1;

 return this;
}
NOF_BrowserNetscapeNavigator.prototype = new NOF_DOMBrowser;

/*
* Internet Explorer 5+
*/
function NOF_BrowserInternetExplorer() {

 //Event capture
 document.onmouseup = HideMenu;
}
NOF_BrowserInternetExplorer.prototype = new NOF_DOMBrowser;


/*
* Nestcape Navigator version 4.x
*/
function NOF_BrowserNetscape4x() {

 this.getMenuItemLayerStartString = function getMenuItemLayerStartString(menuItemId, parentId) {

  parentId = ( (parentId != null) && (parentId != "undefined") && (typeof(parentId) != "undefined"))
         ? new String(parentId + CONSTANTS.MENU_LAYER_SUFIX) : null;
  menuItemId += CONSTANTS.MENU_LAYER_SUFIX;
  
  var isAutoClose = typeof(C_MENU_AUTO_CLOSE) == "undefined" || C_MENU_AUTO_CLOSE == true ? "true" : "false";

  return '<layer ID="' + menuItemId + '" isautoclose="' + isAutoClose + '" onmouseover="NOF_KeepOpen(\'' + menuItemId + '\', ' + parentId + ')" onmouseout="NOF_KeepClose()">';
 }

 this.getMenuItemLayerEndString = function getMenuItemLayerEndString() {
  return '</layer>';
 }  

 this.getImageParent = function getImageParent(imageObject){
 
  for (var position = 0; position < document.layers.length; position++) {   
   var layer = document.layers[position];
   for (var imagePosition = 0; imagePosition < layer.document.images.length; imagePosition++) { 
    if (layer.document.images[imagePosition].name == imageObject.name) {
     return layer;
    }
   }   
  }

  return null;  
 }

 /** method showMenuItem
 *@parameter image Image object - item parent
 *@parameter item String or Object coresponding to a layer
 *@parameter offsetX: horizontal offset distance from parent
 *@parameter offsetY: vertical offset distance from parent
 *@parameter direction Horizontal = false, Vertical = true
 */
 this.showMenuItem = function showMenuItem(image, item, offsetX, offsetY, openEffect) {

  var parent = this.getImageParent(image);

  var itemId = image;
  if (typeof(item) == "string")
   item  = this.getItem(item)
 
  image  = typeof(image) == "string" ? this.getItem(image) : image;

  var top = this.findItemTopOffset(image);
  var left = this.findItemLeftOffset(image);

  if (parent != null) {
   left += parent.pageX;
   top += parent.pageY;
  }

  var slideDirection = "";
  if (openEffect.indexOf("left") > -1 || openEffect.indexOf("Left") > -1 ) {
    top += offsetY; 
    left -= offsetX;
    slideDirection = "left";
  } else if (openEffect.indexOf("top") > -1 || openEffect.indexOf("Top") > -1 ) {
    top  -= offsetY;
    left += offsetX;
    slideDirection = "top";
  } else if (openEffect.indexOf("right") > -1 || openEffect.indexOf("Right") > -1 ) {
    top += offsetY; 
    left += offsetX;
    slideDirection = "right";
  } else { // Bottom
    top  += offsetY;
    left += offsetX;
    slideDirection = "bottom";
  }

  if (typeof(item) == "undefined")
   return;



  item.y = parseInt(top);
  item.x = parseInt(left);  
  item.visibility = "visible"; 
  
  if (openEffect.indexOf("slide") > -1)
   this.slideEffect(item, slideDirection);
  else if (openEffect.indexOf("fade") > -1) {   
   this.fadeEffect(item);
  }
 }

 this.hideMenuItem = function hideMenuItem(item) {
  if (typeof(item) == "string")
   item = this.getItem(item)
  
  if ( item == null || typeof(item) == "undefined" || item == "")
   return;

  item.visibility = "hide";
 }

 this.findItemLeftOffset = function findItemLeftOffset(item) {
  return item.x; 
 }

 this.findItemTopOffset = function findItemTopOffset(item) {
  return item.y;
 }

 this.getItem = function getItem(itemId) {  

  if (itemId == "")
   return;

  var item = eval("document.layers['" + itemId + "']");

  return item;
 }

 this.getItemAttribute = function getItemAttribute(itemId, attrId) {

  return eval("document.layers['" + itemId.toLowerCase() + "']." + attrId);
 }

 this.getLayerTag = function getLayerTag() { return "layer" };

 this.slideEffect = function slideEffect(item, margin) {

  GLOBAL_slideItem = item;
  GLOBAL_slidePixel = (margin == "bottom" || margin == "left") ? 200 : 0;

  this.playEffect(margin);
 }

 this.playEffect = function playEffect(margin) {

  if (GLOBAL_slidePixel < GLOBAL_slideMinOffset || GLOBAL_slidePixel > GLOBAL_slideMaxOffset)
   return;
 
  if (margin == "top") {
   GLOBAL_slideItem.clip.bottom = GLOBAL_slidePixel += 1;
  } else if (margin == "right") {
   GLOBAL_slideItem.clip.right = GLOBAL_slidePixel += 1;
  } else if (margin == "bottom") {
   GLOBAL_slideItem.clip.top = GLOBAL_slidePixel -= 1;
  } else {//left
   GLOBAL_slideItem.clip.left = GLOBAL_slidePixel -= 1;
  }

  setTimeout('browser.playEffect("' + margin + '")', GLOBAL_slideSpeed);  
 }
}
NOF_BrowserNetscape4x.prototype = new NOF_DOMBrowser;


/** NOF.BrowserFactory
*@return The associate class for the browser
*/

function NOF_BrowserFactory() {

  var agt = navigator.userAgent.toLowerCase();

  var is_major = parseInt(navigator.appVersion);
  var is_minor = parseFloat(navigator.appVersion);

  var is_nav = ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1)
        && (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1)
        && (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1));
  var is_nav2 = (is_nav && (is_major == 2));
  var is_nav3 = (is_nav && (is_major == 3));
  var is_nav4 = (is_nav && (is_major == 4));
  var is_nav4up = (is_nav && (is_major >= 4));
  var is_navonly   = (is_nav && ((agt.indexOf(";nav") != -1) ||
             (agt.indexOf("; nav") != -1)) );
  var is_nav6 = (is_nav && (is_major == 5));
  var is_nav6up = (is_nav && (is_major >= 5));
  var is_gecko = (agt.indexOf('gecko') != -1);


  var is_ie   = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
  var is_ie3  = (is_ie && (is_major < 4));
  var is_ie4  = (is_ie && (is_major == 4) && (agt.indexOf("msie 4")!=-1) );
  var is_ie4up = (is_ie && (is_major >= 4));
  var is_ie5  = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.0")!=-1) );
  var is_ie5_5 = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.5") !=-1));
  var is_ie5up = (is_ie && !is_ie3 && !is_ie4);
  var is_ie5_5up =(is_ie && !is_ie3 && !is_ie4 && !is_ie5);
  var is_ie6  = (is_ie && (is_major == 4) && (agt.indexOf("msie 6.")!=-1) );
  var is_ie6up = (is_ie && !is_ie3 && !is_ie4 && !is_ie5 && !is_ie5_5);

  var is_opera = (agt.indexOf("opera") != -1);
  var is_opera2 = (agt.indexOf("opera 2") != -1 || agt.indexOf("opera/2") != -1);
  var is_opera3 = (agt.indexOf("opera 3") != -1 || agt.indexOf("opera/3") != -1);
  var is_opera4 = (agt.indexOf("opera 4") != -1 || agt.indexOf("opera/4") != -1);
  var is_opera5 = (agt.indexOf("opera 5") != -1 || agt.indexOf("opera/5") != -1);
  var is_opera5up = (is_opera && !is_opera2 && !is_opera3 && !is_opera4);

  this.getBrowser = function getBrowser() {
  
   if (is_ie5up) {  
    return new NOF_BrowserInternetExplorer();
   } 

   if (is_nav6up) {
    return new NOF_BrowserNetscapeNavigator();
   }

   if (is_opera5up) {
    return new NOF_BrowserInternetExplorer();    
   }

   if (is_nav4) {
    return new NOF_BrowserNetscape4x();
   }
  }
}

var browserFactory = new NOF_BrowserFactory();
var browser     = browserFactory.getBrowser();



/*****************************************
NOF.Menu Constants
*****************************************/

var CONSTANTS = {
 MENU_TYPE_IMAGE : "Image",
 MENU_TYPE_TEXT : "Text",

 BUTTON_TYPE_IMAGE : "image",
 BUTTON_TYPE_TEXT : "text",

 MENU_TABLE_HEADER : '<table border="0" cellspacing="0" cellpadding="0">',
 MENU_TABLE_END : '</table>',

 MOUSE_OVER_IMAGE : 1,
 MOUSE_OUT_IMAGE : 2,

 MENU_ITEM_HORIZONTAL : false,
 MENU_ITEM_VERTICAL  : true,

 MENU_LAYER_SUFIX : "LYR",

 NOT_A_MAIN_ITEM : 1,
 
 MENU_REFRESH_TIME : 600
}

/** 
* NOF_Menu
*/
function NOF_Menu() {
 return this;
}


/** 
* NOF_Menu_Item
*/
function NOF_Menu_Item() {

 this.id      = arguments[0]; //div id

 this.orientation = arguments[1];
 this.openEffect  = arguments[2];
 this.offsetX   = arguments[3];
 this.offsetY   = arguments[4];

 this.buttons = new Array();
 
 this.submenuHeight = 0;
 for (var i = 5; i < arguments.length; i++)
  this.buttons[i - 5] = arguments[i];


 this.getPosition = function () {
  return new Array(this.offsetX, this.offsetY);
 }


 this.getOffsetX = function getOffsetX() { return this.offsetX;}
 this.getOffsetY = function getOffsetY() { return this.offsetY;}
 this.getOpenEffect = function getOffsetY() { return this.openEffect;}
 this.getOrientation = function getOrientation() { return this.orientation; }

 return this;
}


/** 
@name NOF_Menu_Button
@parameter normal  : image name (src) or text (link value), depending on button type : image or text.
@parameter rollover : rollover image name or css attributes, depending on button type : image or text.
@parameter submenu : a NOF_Menu_Item instance.
*/
function NOF_Menu_Button(link, normal, rollover, submenu) {

 this.link   = link;
 this.normal  = normal;
 this.rollover = rollover != "" ? rollover : normal;
 this.submenu = submenu;

 this.hasSubmenu = function hasSubmenu() {
  return (this.submenu != null)
 }

 this.type = function type() {
  if (typeof(this.rollover) == "object")
   return CONSTANTS.BUTTON_TYPE_TEXT;
  else if (typeof(this.rollover) == "string")
   return CONSTANTS.BUTTON_TYPE_IMAGE;
  else 
   return null;
 }
 return this;
}


/** 
*@name NOF_Main_Menu
*@description Menu generation - HTML code insertion in page
*@parameter NOF_Menu_Item menuItem
*@parameter parentId (another NOF_Menu_Item) of NOF_Menu_Item menuItem
*/
function NOF_Main_Menu(menuItem, parentId) {

 if(typeof(menuItem) == "undefined")
  return;

 var menuItemId    = menuItem.id;
 var buffer      = browser.getMenuItemLayerStartString(menuItemId, parentId) + '<table width="10" border="' + C_MENU_BORDER + '" cellspacing="' + C_MENU_SPACING + '" cellpadding="0" bgcolor="' + C_MENU_BGCOLOR + '">';
 var i         = 0;

 buffer += '<tr>';
 while (i < menuItem.buttons.length) {
  var menuButton   = menuItem.buttons[i];
  if (menuButton == null) // If page is excluded from navigation then button is 'null'
   return;

  var submenuId = "";
 
  if (menuButton.hasSubmenu() && menuButton.submenu) {
   submenuId = menuButton.submenu.id;
  }

  var link      = menuButton.link; // Link to Page
  var image      = menuButton.normal; // Image - menu cell
  var rollOverButton = menuButton.rollover; // Roll over image - loaded onmouseover, 
  var isImageMenu   = menuButton.type() == CONSTANTS.BUTTON_TYPE_IMAGE ? true : false;
  var imageName    = isImageMenu ? menuItemId + 's' + i : 'NavigationButton_' + menuItemId + '_' + i;
  var isVertical   = menuItem.orientation == "vertical" ? true : false;

  // Extract link target and href
  var target     = '';
  if (link.indexOf(' target=') != -1) {
   target      = link.substr(link.indexOf(' target=') + 8);
   link       = link.substr(0, link.indexOf(' target='));
  }

  // Append buttons on vertical or horizontal
  buffer += (isVertical && i > 1) ? '<tr><td>' : '<td>';

  // Append button link and mouse over event
  buffer += '<a style="text-decoration: none; cursor: hand;" href="' + link + '" ';
  buffer += 'onMouseOver="F_roll(\'' + imageName + '\' ,' + CONSTANTS.MOUSE_OVER_IMAGE + ', \'' + menuItemId + '\', \''+ 
               CONSTANTS.NOT_A_MAIN_ITEM + '\')" onMouseOut="F_roll(\'' + imageName + '\' ,' + 
               CONSTANTS.MOUSE_OUT_IMAGE + ', \''+menuItemId+'\', \'' + CONSTANTS.NOT_A_MAIN_ITEM + '\')"';

  // Append button link target
  buffer += target.length ? ' target="' + target + '">' : '>';  

  // If button is image then append <img> tag, otherwise append <div>
  buffer += isImageMenu ? '<img border="0" src="' + image + '"' : '<' + browser.getLayerTag() + ' ';

  if (typeof(rollOverButton) != "undefined" || rollOverButton.length || !isImageMenu) {
   // This item has a submenu
   if (submenuId != "") {
    var submenu = menuButton.submenu;
    if (isImageMenu) {
     buffer += 'id="' + imageName + '" name="' + imageName + 
          '" onLoad="F_loadRollover(this,\'' + rollOverButton + '\', new Array(\'' + submenuId + '\',\'' + submenu.getOrientation() + '\' , \'' + submenu.getOpenEffect() + '\', ' + submenu.getOffsetX() + ',' + submenu.getOffsetY() + '))"';
    } else {
     NOF_MenuLoadRollOver(imageName, rollOverButton, new Array(submenuId, submenu.getOrientation(), submenu.getOpenEffect(), submenu.getOffsetX(), submenu.getOffsetY() ));     
     buffer += 'id="' + imageName + '" name="' + imageName + '" class="' + imageName + '" ' ;

     // Text menu has inline css
     if (typeof(menuButton.rollover) == "object")
      buffer+= ' style="' + rollOverButton[0] + '"'; 
    }
   } 
   // No submenu, simple rollover
   else {
    if (isImageMenu)
     buffer += 'id="' + imageName + '" name="' + imageName + 
          '" onLoad="F_loadRollover(this,\'' + rollOverButton + '\',0)"';
    else {
     NOF_MenuLoadRollOver(imageName, rollOverButton, 0);
     buffer += 'id="' + imageName + '" name="' + imageName + '" class="' + imageName + '" ';
     // Text menu has inline css
     if (typeof(menuButton.rollover) == "object")
      buffer+= ' style="' + rollOverButton[0] +'"';
    }
   }
  } 

  // For text buttons 'image' is the name appears on it. 
  buffer += isImageMenu ? '></a></td>' : '><' + browser.getLayerTag() + ' id="' + imageName + '_padding" style="padding: ' + rollOverButton[1] + '" padding="' + rollOverButton[1] + '" paddingOver="' + rollOverButton[3] + '">' + image + 
           '</' + browser.getLayerTag() + '></' + browser.getLayerTag() + '></a></td>'; 
  buffer += isVertical ? "</tr>" : "";

  i++; 
 }

 buffer += CONSTANTS.MENU_TABLE_END + browser.getMenuItemLayerEndString();
 document.writeln(buffer); 

 var k = 0;
 while (k < menuItem.buttons.length) {
  if (menuItem.buttons[k].hasSubmenu()) {
   NOF_Main_Menu(menuItem.buttons[k].submenu, menuItem.id);   
  }
  k++;
 }
}



/** 
*@name NOF.MenuLoadRollOverImage
*@parameter button: *@parameter buttonName: *@parameter submenu: Array(int offsetX, int offsetY, String submenuId, boolean ??).
*/
function NOF_MenuLoadRollOver(button, buttonName, submenu) {

 // Check if button is image
 if (button && button.src &&
     (null == button.out || typeof(button.out) == typeof(void(0)))) {


  var imageSrc  = button.src;
  button.out   = new Image();
  button.out.src = imageSrc;
  button.over  = new Image();


  if (buttonName.lastIndexOf('/') >= 0 || buttonName.lastIndexOf('\\') >= 0) {
   imageSrc = buttonName;
  } else {
   var i = imageSrc.lastIndexOf('/');
   if (i < 0) 
     i = imageSrc.lastIndexOf('\\');
   if (i < 0)
     imageSrc = buttonName;
   else  
     imageSrc = imageSrc.substring(0, i + 1) + buttonName;
  }

  button.over.src         = imageSrc;
  button.submenu          = submenu;  
  GLOBAL_LoadedImages[button.name] = button;

 // Button is text
 } else {  
   if (typeof(buttonName) == "object") {
    if (typeof(GLOBAL_LoadedImages[button]) == "undefined") {
     GLOBAL_LoadedImages[button + "Normal"] = buttonName[0];
     GLOBAL_LoadedImages[button + "Over"]  = buttonName[2]; 
     GLOBAL_LoadedImages[button]       = submenu; 
    }
    return;
   }
   if (typeof(submenu) != "undefined" && typeof(button) == "string" && typeof(GLOBAL_LoadedImages[button]) == "undefined") 
     GLOBAL_LoadedImages[button] = submenu;      
 }
}


/** 
*@name NOF.MenuRollButton
*@description Show rollover cell
*@parameter buttonName: image name
*@parameter over: 1 means mouse over (load rollverimage) , 0 means mouseout (load original image).
*/
function NOF_MenuRollButton(buttonName, over, layerId, isNotMainItem) { 

  var rollType  = (over == CONSTANTS.MOUSE_OVER_IMAGE) ? "over" : "out"; // Defined in NOF_MenuLoadRollOver
  var isOver   = (over == CONSTANTS.MOUSE_OVER_IMAGE) ? true : false;
  var rollOver  = GLOBAL_LoadedImages[buttonName];
 
  if (typeof(rollOver) == "undefined")
   return;
 
  var menuType = typeof(rollOver.src) == "undefined" ? CONSTANTS.MENU_TYPE_TEXT : CONSTANTS.MENU_TYPE_IMAGE;
  
  if (menuType == CONSTANTS.MENU_TYPE_IMAGE) { // Image menu
   var imageRollSrcString = "rollOver." + rollType + ".src"; 
   if (rollOver) 
     rollOver.src = eval(imageRollSrcString) ? eval(imageRollSrcString) : "";   
  
  } else if (menuType == CONSTANTS.MENU_TYPE_TEXT){ // Text menu       
    if (typeof(buttonName) == "string") {
     browser.getItem(buttonName).className = isOver ? buttonName + "Hover" : buttonName;
   
     if (browser.getItem(buttonName + "_padding")){
       browser.getItem(buttonName + "_padding").style.padding = isOver ? 
               browser.getItem(buttonName + "_padding").paddingOver : browser.getItem(buttonName + "_padding").padding;
     }
 
     if (typeof(browser.getItem(buttonName).style) != "undefined")
      browser.getItem(buttonName).style.cssText = isOver ? 
              GLOBAL_LoadedImages[buttonName + "Over"] : GLOBAL_LoadedImages[buttonName + "Normal"]; 
    }
 
  } else // Undefined menu type
    return;
 
  if ((isNotMainItem == null || typeof(isNotMainItem) == "undefined" ) && over == CONSTANTS.MOUSE_OUT_IMAGE) {  
   GLOBAL_CurrentItem = "";
   GLOBAL_items.removeAll();  
  }
   
  var hasSubmenu = null;
  if (menuType == CONSTANTS.MENU_TYPE_IMAGE)
   hasSubmenu = rollOver.submenu;
  else if (menuType == CONSTANTS.MENU_TYPE_TEXT)
   hasSubmenu = typeof(rollOver) == "object";
 
  if (hasSubmenu) {
   if (over == CONSTANTS.MOUSE_OVER_IMAGE) {
    if ( layerId && typeof(layerId) != "undefined" && layerId != "null") {
     if (GLOBAL_Close != null)
      clearTimeout(GLOBAL_Close);
     GLOBAL_items.removeSubitems(layerId + CONSTANTS.MENU_LAYER_SUFIX);
    } else
     GLOBAL_items.removeAll();
 
    if (menuType == CONSTANTS.MENU_TYPE_IMAGE)
     NOF_MenuOpenItem(rollOver, rollOver.submenu, layerId);
    else
     NOF_MenuOpenItem(buttonName, rollOver, layerId); 
   }
   else { // MOUSE_OUT_IMAGE
    if (menuType == CONSTANTS.MENU_TYPE_IMAGE)
     NOF_MenuCloseItem(rollOver.submenu);
    else
     NOF_MenuCloseItem(rollOver);
   }
  
  } else if (over == CONSTANTS.MOUSE_OVER_IMAGE ) { // This image doesn't have a submenu, only a rollover button   
    if ( layerId && typeof(layerId) != "undefined" && layerId != "null" ) {
     GLOBAL_CurrentItem = layerId + CONSTANTS.MENU_LAYER_SUFIX;
     GLOBAL_items.removeSubitems(GLOBAL_CurrentItem);
    } else // Only for html - always visible - menu part    
      browser.hideMenuItem(GLOBAL_CurrentItem);
  }
}


/** 
*@name NOF.MenuOpenItem
*@description Opens (visibility = 'visible') one menu item
*@parameter image Image object that is parent for this submenu
*@parameter imageSubmenu : Array(offset, layerId, horizontal) : *   offsetX - distance from parent left
*   offsetY - distance from parent top
*   layerId - layer ID that will be opened
*   horizontal - indicates if it's horizontal or vertical. True = vertical, False = horizontal
*@parameter parentId
*@parameter
*/
function NOF_MenuOpenItem(image, submenu, parentId) {

 var layerId    = submenu[0] + CONSTANTS.MENU_LAYER_SUFIX; 
 var orientation  = submenu[1];
 var openEffect  = submenu[2];
 var offsetX    = submenu[3];
 var offsetY    = submenu[4];

 GLOBAL_items.addItem(layerId, parentId);
 GLOBAL_CurrentItem = layerId; // Current opened layer 

 browser.showMenuItem(image, layerId, offsetX, offsetY, openEffect);
}


/** 
*@name NOF.MenuCloseItem
*@description Close a menu item if mouse is out of it but not on his child.
*@parameter
*/
function NOF_MenuCloseItem(imageSubmenu) {

 if (imageSubmenu[0]) {
  var layerId = imageSubmenu[0] + CONSTANTS.MENU_LAYER_SUFIX; 
 
  // If mouse outside a cell that belongs to main menu (root) - close it
  if (GLOBAL_items.toArray().length == 1)
   GLOBAL_CurrentItem = 0;
 
  GLOBAL_Close = setTimeout("NOF_MenuHideItem('" + layerId + "')", CONSTANTS.MENU_REFRESH_TIME/4);
 }
}


/** 
*@name NOF.MenuHideItem
*@description 
*@parameter itemId 
*/
function NOF_MenuHideItem(itemId) {

 if (itemId && itemId != null && GLOBAL_CurrentItem != itemId) { // Close item if mouse not over it
  browser.hideMenuItem(itemId);
 }
}


/** 
*@name NOF_KeepOpen
*@description Keeps a menu item (child) opened when mouse over it
*@parameter item Layer (Div) object
*/
function NOF_KeepOpen(itemId, parentId) {  

 GLOBAL_CurrentItem = itemId;
 if (GLOBAL_Hide != null)
  for (var i = 0; i < GLOBAL_Hide.length; i++) 
   clearTimeout(GLOBAL_Hide[i]);
}


/** 
*@name NOF_KeepClose
*@description Keeps a menu item (child) closed when mouse out of it
*/
function NOF_KeepClose() { 

 GLOBAL_CurrentItem = "";
 setTimeout("NOF_CloseChilds()", CONSTANTS.MENU_REFRESH_TIME);
}


/** 
*@name NOF_CloseChilds
*@description Close submenus when mouse goes out of layer
*/
function NOF_CloseChilds() {

 var itemsList = GLOBAL_items.toArray();
 GLOBAL_Hide  = new Array(); 
 if (GLOBAL_CurrentItem == "" || GLOBAL_CurrentItem == 0)  
  for (var i in itemsList)
   if (itemsList[i])
    GLOBAL_Hide[i] = setTimeout("browser.hideMenuItem('" + itemsList[i] + "')", CONSTANTS.MENU_REFRESH_TIME/4);        

 if (!isMenuAutoClose()) {
  itemsList = GLOBAL_items.toArray();

  // Keep visible current opened submenus
  for ( var i in itemsList ) 
   if (itemsList[i])
    NOF_KeepOpen(itemsList[i]);   
 } 
}

function isMenuAutoClose() {

 var itemsList = GLOBAL_items.toArray();
 if (itemsList[0] && itemsList[0].length) {
  var autoClose = browser.getItemAttribute(itemsList[0], "isautoclose");
   if ( autoClose == "true")
    return true;
   else 
    return false;
 }
 return false;  
}

/**
*@name HideMenu()
*@description Hide menu when click outside his area. Used in 'Non auto close navbars'.
*/
function HideMenu() {
 
 if (isMenuAutoClose())
  return;

 var itemsList = GLOBAL_items.toArray();

 if (GLOBAL_Hide == null)
  GLOBAL_Hide = new Array();
 
 for (var i in itemsList)
  if (itemsList[i] && itemsList[i].length) {
   GLOBAL_items.removeItem(itemsList[i]);   
   GLOBAL_Hide[i] = browser.hideMenuItem(itemsList[i]);    
  }
}


/**
*@name NOF_OpenedItems() 
*@description Keeps a list w/ current submenus open (visible)
*/
function NOF_OpenedItems() {

 this.openedItems = "";
 this.separator  = "*";

 /** method addItem
 *@description: adds one item in list using "*" separator
 */
 this.addItem = function addItem(item, parent) {

  if ( item == null || !item || item == "" )
   return;
 
  if (this.openedItems.indexOf(item) == -1) {

   this.openedItems += this.openedItems.length ? 
     ( this.openedItems.indexOf(this.separator) == this.openedItems.length - 1 ? "" : this.separator ) + item : item;  
  }  
 }
 

 /** method removeItem
 *@description: remove one item
 */
 this.removeItem = function removeItem(item) { 
  
  if ( item == GLOBAL_CurrentItem )
   return;

  var temp = this.openedItems;
  if (temp.indexOf(item) > 0) {
   var a = temp.substring(0, temp.indexOf(item));
   var b = temp.substring(temp.indexOf(item) + item.length, temp.length );
   temp = a + b;
  }

  while (temp.lastIndexOf(this.separator) == temp.length - 1)
   temp = temp.substring(0, temp.length - 1);

  this.openedItems = temp;  
 }


 /** method removeSubitems
 *@description: remove all subitems (items above) 'item' 
 */
 this.removeSubitems = function removeSubitems(item) {
  
  if (item && typeof(item) != "undefined") {  
   var temp = this.openedItems;
   temp   = temp.substring(0, temp.lastIndexOf(item) + item.length); 
   var temp1 = this.openedItems.substring(this.openedItems.indexOf(temp) + temp.length, this.openedItems.length);
   temp1 = temp1.split(this.separator);
 
   for (var i = temp1.length - 1; i >= 0; i--)
     if (temp1[i])
      browser.hideMenuItem(temp1[i]);
 
   this.openedItems = temp;
  }
 }

 /** method currentItem
 *@description: return current item
 */
 this.currentItem = function currentItem() {

  var list = this.toArray();
  return list[list.length - 1];
 }

 /** method removeAll
 *@description: remove all items and hide them
 */
 this.removeAll = function removeAll() {

  var items = this.toArray();
  clearTimeout(GLOBAL_Close);
  for (var i = items.length - 1; i >= 0; i--)
   if ( items[i] != null && items[i] != "" ) {
    clearTimeout(items[i]);
    browser.hideMenuItem(items[i]);
   }

  this.openedItems = "";  
 }

 /** method toArray
 *@description: return an array with all items using split method by list separator
 */
 this.toArray = function toArray() {
  return this.openedItems.split(this.separator);
 } 
}


/**
*@name F_menu()
*@description backward compatibility
*/
function F_menu(item) {
 NOF_Menu(item);
}

/**
*@name F_roll()
*@description backward compatibility
*/
function F_roll(itemId, over, layerId, isNotMainItem){

 var layerId = (layerId == null || typeof(layerId) == "undefined") ? null : layerId;
 var isNotMainItem = (isNotMainItem == null || typeof(isNotMainItem) == "undefined") ? null : isNotMainItem;

 NOF_MenuRollButton(itemId, over, layerId, isNotMainItem);
}

/** F_loadRollover
*@param image
*@param submenu: Array(String submenuId, submenuOrientation, int offsetX, int offsetY).
*/
function F_loadRollover(image, rollOverButton, submenu) { 
 return NOF_MenuLoadRollOver(image, rollOverButton, submenu);
}


