var ncMenuID = 1;
var ncMenuSeparatorID = 1;
var ncMenu_PopupMenuList = new Array();

/*
	The default container for the menu. By default the menu will be created under
	here.
	The HTML must include a tag (normally DIV) that has an ID of this value,
	otherwise pass the ID manually to the ncMenu(..) function when creating
	the menu.
*/
var ncMenu_ContainerID = 'netcatMenuContainer';

function ncMenuHideAll() {
  for (var i=0; i<ncMenu_PopupMenuList.length;i++) {
    try {
      ncMenu_PopupMenuList[i].hide();
    } catch(e) {
    }
  }
}

/*
  ncMenu(menuName,menuTitle,menuWidth,menuOrientation,menuContainerID)

  Returns a menu object.

  menuName        - the name of the menu
  menuTitle       - the title to display (blank to hide title area)
  menuOrientation - [left | right] - controls position of menuTitle area (defaults to 'left')
*/
function ncMenu(menuName,menuTitle,menuWidth,menuOrientation,menuContainerID) {
  // Properties

  this.name = menuName;

  this.id   = ncMenuID++;
  this.title = menuTitle;
  if (menuOrientation) {
    this.orientation = menuOrientation;
  } else {
    this.orientation = 'left';
  }
  
  if (menuContainerID) {
    this.containerID = menuContainerID;
  }
  else {
	this.containerID = ncMenu_ContainerID;
  }
  this.content = '';
  
  this.width = menuWidth;
  this.forceRedraw = false;

  this.timeOut = 0;

  // Objects
  this.menu = null;
  this.items = new Array();

  // Methods
  this.add = ncMenuAddItem;
  this.addSeparator = ncMenuAddSeparator;
  this.disableItem = ncMenuDisableItem;
  this.enableItem = ncMenuEnableItem;
  this.hideItem = ncMenuHideItem;
  this.showItem = ncMenuShowItem;
  this.itemByName = ncMenuItemByName;
  this.itemIndexByName = ncMenuItemIndexByName;
  this.show = ncMenuShow;
  this.init = ncMenuInit;
  this.hide = ncMenuHide;
  this.oninit = null;
  this.onshow = null;
  this.getNextVisible = ncMenuGetNextVisible;
  this.beginHide = ncMenuBeginHide;
  this.stopHide = ncMenuStopHide;
  ncMenu_PopupMenuList[ncMenu_PopupMenuList.length] = this;
  this.index = ncMenu_PopupMenuList.length-1;
}

function ncMenuAddItem(name,txt,myclick) {
  this.items[this.items.length] = {name: name, text: txt, click: myclick, visible: true, disabled: false, disabledTitle: ''};
  return this.items.length-1;
}

function ncMenuAddSeparator() {
  return this.add('sep-'+ncMenuSeparatorID++, '-', '');
}

function ncMenuDisableItem(name) {
  var aItem = this.itemByName(name);
  if (aItem) {
    aItem.disabled = true;
  }
}

function ncMenuEnableItem(name) {
  var aItem = this.itemByName(name);
  if (aItem) {
    aItem.disabled = false;
  }
}

function ncMenuHideItem(name) {
  var aItem = this.itemByName(name);
  if (aItem) {
    aItem.visible = false;
  }
}

function ncMenuShowItem(name) {
  var aItem = this.itemByName(name);
  if (aItem) {
    aItem.visible = true;
  }
}

function ncMenuItemByName(name) {
  for (var i=0; i<this.items.length; i++) {
    if (this.items[i].name == name) {
      return this.items[i];
    }
  }
  return null;
}

function ncMenuItemIndexByName(name) {
  for (var i=0; i<this.items.length; i++) {
    if (this.items[i].name == name) {
      return i;
    }
  }
  return -1;
}

function ncMenuInit() {
  var o_ncBPFramework = ncBPFramework.DOM;
  var o_winDimensions = o_ncBPFramework.getViewportDimensions(self);
  
  // If oninit then call
  if (this.oninit) {
    this.oninit(this);
  }
  var mouseEnter = ' onmouseover="ncMenu_PopupMenuList['+this.index+'].stopHide();"';
  var mouseOut = ' onmouseout="ncMenu_PopupMenuList['+this.index+'].beginHide();"';
  // Generate the menu
  this.content='';
  
  // Title and Item Container
  if (this.title) {
    if (this.orientation != 'left') {
      this.content += '<div id="ncMenu'+this.id+'_Title" class=ncMenuTitleRight'+mouseEnter+mouseOut+'>'+this.title+'</div>';
    } else {
      this.content += '<div id="ncMenu'+this.id+'_Title" class=ncMenuTitleLeft'+mouseEnter+mouseOut+'>'+this.title+'</div>';
    }
    this.content += '<div class=ncMenuItemContainer '+mouseEnter+mouseOut+'>';
  } else {
    this.content += '<div class="ncMenuItemContainer ncMenuItemContainerNoTitle" '+mouseEnter+mouseOut+'>';
  }
  /* Items */
  for (var i=0;i<this.items.length;i++) {
    if (this.items[i].visible && this.items[i].text!='-') {
      // 1. Determine classname
      var nextVisible = this.getNextVisible(i+1);
      var first = i==0;
      var last = (nextVisible==-1) || ((this.items[nextVisible].text=='-') && (this.getNextVisible(nextVisible)==-1));
      var disabled = this.items[i].disabled;
      var separator = ((nextVisible!=-1) && (this.items[nextVisible].text=='-') && (this.getNextVisible(nextVisible)!=-1));
      var className = 'ncMenuItem'+(first?' ncMenuItemFirst':'')+(last?' ncMenuItemLast':'')+(disabled?' ncMenuItemDisabled':'')+(separator?' ncMenuItemSeparator':'');
      /* 2. Generate div and link */
      /* START Cross browser 13/04/2007 */
	  /*this.content += '<div id="ncMenuItem_'+this.items[i].name+'" class="'+className+'"><a href="#" onclick="ncMenu_PopupMenuList['+this.index+'].hide();'+(disabled?'':this.items[i].click)+';return false;"'+(disabled?' title="'+this.items[i].disabledTitle+'"':'')+'><nobr>'+this.items[i].text+'</nobr></a></div>';*/
	   this.content += '<div id="ncMenuItem_'+this.items[i].name+'" class="'+className+'"><a href="javascript:;" onclick="ncMenu_PopupMenuList['+this.index+'].hide();'+(disabled?'':this.items[i].click)+';return false;"'+(disabled?' title="'+this.items[i].disabledTitle+'"':'')+'><nobr>'+this.items[i].text+'</nobr></a></div>';
      /* END Cross browser */
    }
  }
  /* Close Item Container */
  this.content += '</div>';

  
  
  if (document.getElementById('ncMenu'+this.id)) {
  	o_ncBPFramework.removeElement(document.getElementById('ncMenu'+this.id));
//    try { document.getElementById('ncMenu'+this.id).removeNode(true); } catch (e) { window.alert(e.message); }
  }
  var aDiv = document.createElement('div');
  aDiv.id = 'ncMenu'+this.id;
  aDiv.className = "ncMenu";
  aDiv.style.width = this.width;
  var aMenuContainer = document.getElementById(this.containerID);
  if (!aMenuContainer) {
    aMenuContainer = document.body;
  }
  aMenuContainer.appendChild(aDiv);
  aDiv.innerHTML=this.content;
  return aDiv;
}

// This function returns the next visible items index
function ncMenuGetNextVisible(startIndex) {
  for (var i=startIndex;i<this.items.length;i++) {
    if (this.items[i].visible) {
      return i;
    }
  }
  return -1;
}

function ncMenuShow(x,y) {
  /* START Cross browser # 12/04/2007 */
  ncMenuHideAll();
  var o_ncBPFramework = ncBPFramework.DOM;
  var o_winDimensions = o_ncBPFramework.getViewportDimensions(self);
  /* END Cross browser */
  
  var menObj = document.getElementById('ncMenu'+this.id);
  if (!menObj || this.forceRedraw) {
    menObj = this.init();
  }
  
  if (document.compatMode == 'CSS1Compat') {
    var sTop = document.documentElement.scrollTop;
    var sLeft = document.documentElement.scrollLeft;
    var cHeight = o_winDimensions.h+sTop;
    var cWidth = o_winDimensions.w+sLeft;
  } else {
	var o_winScrollOffsets = o_ncBPFramework.getViewportOffset(window);
    var sTop = document.body.scrollTop;
    var sLeft = document.body.scrollLeft;
    var cHeight = o_winDimensions.h+sTop;
    var cWidth = o_winDimensions.w+sLeft;
  }
  
  /* START Cross browser # 12/04/2007 */
  var o_menuDim = new o_ncBPFramework.elementDimensions(menObj);
  var menHeight = o_menuDim.h;
  var menWidth = o_menuDim.w;
  /*menHeight = menObj.clientHeight;
  menWidth = menObj.clientWidth; */
  /* END Cross browser */
  
  var menTitleObj = document.getElementById('ncMenu'+this.id+'_Title');	
  
  menx=x;
  meny=y;

  /* START Cross browser # 12/04/2007 */
  /* menObj.style.top = -1000; */
  var o_newPos = new o_ncBPFramework.Coordinates(menx, -1000);
  /* END Cross browser */
  menObj.style.display = 'block';

  
	
  if (menx+menWidth > (cWidth-3)) {
    this.orientation = 'right';
	if (document.all) {
		menTitleObj.className = 'ncMenuTitleRight';
	} else {
		/* START Cross browser # 12/04/2007 */
		/* Floats are handled quite differently between browsers, therefore Firefox requires some help */
		/* This is probably an issue with mis-formed HTML */
		var o_titleDim = new o_ncBPFramework.elementDimensions(menTitleObj);
		var titleHeight = o_titleDim.h;
		var titleWidth = o_titleDim.w;
		o_ncBPFramework.updateNodeAttributes(menTitleObj, {'style': {'marginLeft': menWidth-titleWidth+'px' }});
		menx -= menWidth -titleWidth -3;
		menTitleObj.className = 'ncMenuTitleLeft';
		/* END Cross browser */
	}
  } else {
    this.orientation = 'left';
    menTitleObj.className = 'ncMenuTitleLeft';
  }

  if ((this.title) && (this.orientation != 'left')) {
    if (document.all) menx -= this.width-(menObj.clientWidth-menTitleObj.offsetLeft); /* Cross browser # 12/04/2007 */
	
  } else {
  }
  
// If onshow then call
  if (this.onshow) {
    this.onshow(this);
  }

  // Reposition based upon whether crossing window boundary.
  if (menx+menWidth > cWidth) {
    menx-=(menx+menWidth)-cWidth+3;
  }
  if (meny+menHeight>cHeight) {
    meny-=(meny+menHeight)-cHeight+3;
  }
  
  /* START Cross browser # 12/04/2007 */
  var o_newPos = new o_ncBPFramework.Coordinates(menx, meny);
  o_ncBPFramework.setElementPosition(menObj,o_newPos);
  /*menObj.style.pixelLeft = menx; */
  /*menObj.style.pixelTop = meny; */
  /* END Cross browser */
  
  return false;
}

function ncMenuHide() {
  var o_ncBPFramework = ncBPFramework.DOM;
  
  try {
    var menObj = document.getElementById('ncMenu'+this.id);//alert(menObj.innerHTML);
    if (menObj) {
      if (menObj.onhide) {
        menObj.onhide(this);
      }
	  /* START Cross browser # 12/04/2007 */
      /*menObj.style.display = 'none';*/
      /*menObj.style.top = -1000;*/
	  var o_newPos = new o_ncBPFramework.Coordinates(0, -1000);
	  o_ncBPFramework.setElementPosition(menObj,o_newPos);
  	  o_ncBPFramework.hideElement(menObj);
	  //window.alert(menObj.innerHTML);
	  
	  var menTitleObj = document.getElementById('ncMenu'+this.id+'_Title');	
	  o_ncBPFramework.updateNodeAttributes(menTitleObj, {'style': {'marginLeft': '0px' }});
	  /* END Cross browser */
    }
  } catch(e) {
  }
}

function ncMenuBeginHide() {
//  ncMenu_PopupMenuList['+this.index+'].timeOut = setTimeout(\'ncMenuHideAll();\',200);document.all.ncTest.innerHTML += \'out \';
  this.timeOut = setTimeout('ncMenuHideAll();',1000);
}

function ncMenuStopHide() {
//clearTimeout(ncMenu_PopupMenuList['+this.index+'].timeOut);document.all.ncTest.innerHTML += \'enter \';
  clearTimeout(this.timeOut);
  this.timeOut = 0;
}