(function () {

  var Dom = Buclo.util.Dom,
  Event = Buclo.util.Event;
  
  Buclo.widget.MenuManager = function () {
    
  var m_bInitializedEventHandlers = false,
  
    m_oMenus = {},


 
  m_oVisibleMenus = {},
  
  
   

  m_oItems = {},


    
  m_oEventTypes = {
  "click": "clickEvent",
  "mousedown": "mouseDownEvent",
  "mouseup": "mouseUpEvent",
  "mouseover": "mouseOverEvent",
  "mouseout": "mouseOutEvent",
  "keydown": "keyDownEvent",
  "keyup": "keyUpEvent",
  "keypress": "keyPressEvent"
  },
  
  
  m_oFocusedMenuItem = null;
  
  
  
  
  

  
  
  
  function getMenuRootElement(p_oElement) {
  
  var oParentNode;
  
  if (p_oElement && p_oElement.tagName) {
  
  switch (p_oElement.tagName.toUpperCase()) {
  
  case "DIV":
  
  oParentNode = p_oElement.parentNode;
  


  if (
  (
  Dom.hasClass(p_oElement, "hd") ||
  Dom.hasClass(p_oElement, "bd") ||
  Dom.hasClass(p_oElement, "ft")
  ) && 
  oParentNode && 
  oParentNode.tagName && 
  oParentNode.tagName.toUpperCase() == "DIV") 
  {
  
  return oParentNode;
  
  }
  else {
  
  return p_oElement;
  
  }
  
  break;

  case "LI":
  
  return p_oElement;

  default:
  
  oParentNode = p_oElement.parentNode;
  
  if (oParentNode) {
  
  return getMenuRootElement(oParentNode);
  
  }
  
  break;
  
  }
  
  }
  
  }
  
  
  

  
  
  
  function onDOMEvent(p_oEvent) {
  

  
  var oTarget = Event.getTarget(p_oEvent),
  
  
  oElement = getMenuRootElement(oTarget),
  sCustomEventType,
  sTagName,
  sId,
  oMenuItem,
  oMenu; 
  
  
  if (oElement) {
  
  sTagName = oElement.tagName.toUpperCase();
  
  if (sTagName == "LI") {
  
  sId = oElement.id;
  
  if (sId && m_oItems[sId]) {
  
  oMenuItem = m_oItems[sId];
  oMenu = oMenuItem.parent;
  
  }
  
  }
  else if (sTagName == "DIV") {
  
  if (oElement.id) {
  
  oMenu = m_oMenus[oElement.id];
  
  }
  
  }
  
  }
  
  
  if (oMenu) {
  
  sCustomEventType = m_oEventTypes[p_oEvent.type];
  
  
  
  
  if (oMenuItem && !oMenuItem.cfg.getProperty("disabled")) {
  
  oMenuItem[sCustomEventType].fire(p_oEvent);  
  
  
  if (
  p_oEvent.type == "keyup" || 
  p_oEvent.type == "mousedown") 
  {
  
  if (m_oFocusedMenuItem != oMenuItem) {
  
  if (m_oFocusedMenuItem) {
  
  m_oFocusedMenuItem.blurEvent.fire();
  
  }
  
  oMenuItem.focusEvent.fire();
  
  }
  
  }
  
  }
  
  oMenu[sCustomEventType].fire(p_oEvent, oMenuItem);
  
  }
  else if (p_oEvent.type == "mousedown") {
  
  if (m_oFocusedMenuItem) {
  
  m_oFocusedMenuItem.blurEvent.fire();
  
  m_oFocusedMenuItem = null;
  
  }
  
  
  
  
  for (var i in m_oVisibleMenus) {
  
  if (Buclo.lang.hasOwnProperty(m_oVisibleMenus, i)) {
  
  oMenu = m_oVisibleMenus[i];

  if (oMenu.cfg.getProperty("clicktohide") && 
  !(oMenu instanceof Buclo.widget.MenuBar) && 
  oMenu.cfg.getProperty("position") == "dynamic") {
  
  oMenu.hide();
  
  }
  else {
  
							if (oMenu.cfg.getProperty("showdelay") > 0) {
							
								oMenu._cancelShowDelay();
							
							}


							if (oMenu.activeItem) {
						
								oMenu.activeItem.blur();
								oMenu.activeItem.cfg.setProperty("selected", false);
						
								oMenu.activeItem = null;  
						
							}
  
  }
  
  }
  
  } 
  
  }
  else if (p_oEvent.type == "keyup") { 
  
  if (m_oFocusedMenuItem) {
  
  m_oFocusedMenuItem.blurEvent.fire();
  
  m_oFocusedMenuItem = null;
  
  }
  
  }
  
  }
  
  
  
  function onMenuDestroy(p_sType, p_aArgs, p_oMenu) {
  
  if (m_oMenus[p_oMenu.id]) {
  
  this.removeMenu(p_oMenu);
  
  }
  
  }
  
  
  
  function onMenuFocus(p_sType, p_aArgs) {
  
  var oItem = p_aArgs[0];
  
  if (oItem) {
  
  m_oFocusedMenuItem = oItem;
  
  }
  
  }
  
  
  
  function onMenuBlur(p_sType, p_aArgs) {
  
  m_oFocusedMenuItem = null;
  
  }
  
  
  
  
  function onMenuVisibleConfigChange(p_sType, p_aArgs) {
  
  var bVisible = p_aArgs[0],
  sId = this.id;
  
  if (bVisible) {
  
  m_oVisibleMenus[sId] = this;
  
  
  }
  else if (m_oVisibleMenus[sId]) {
  
  delete m_oVisibleMenus[sId];
  
  
  }
  
  }
  
  
  
  function onItemDestroy(p_sType, p_aArgs) {
  
  removeItem(this);
  
  }

  
  function removeItem(p_oMenuItem) {

  var sId = p_oMenuItem.id;
  
  if (sId && m_oItems[sId]) {
  
  if (m_oFocusedMenuItem == p_oMenuItem) {
  
  m_oFocusedMenuItem = null;
  
  }
  
  delete m_oItems[sId];
  
  p_oMenuItem.destroyEvent.unsubscribe(onItemDestroy);
  
  
  }

  }
  
  
  
  function onItemAdded(p_sType, p_aArgs) {
  
  var oItem = p_aArgs[0],
  sId;
  
  if (oItem instanceof Buclo.widget.MenuItem) { 
  
  sId = oItem.id;
  
  if (!m_oItems[sId]) {
  
  m_oItems[sId] = oItem;
  
  oItem.destroyEvent.subscribe(onItemDestroy);
  
  
  }
  
  }
  
  }
  
  
  return {
  
  
  
  
  addMenu: function (p_oMenu) {
  
  var oDoc;
  
  if (p_oMenu instanceof Buclo.widget.Menu && p_oMenu.id && 
  !m_oMenus[p_oMenu.id]) {
  
  m_oMenus[p_oMenu.id] = p_oMenu;
  
  
  if (!m_bInitializedEventHandlers) {
  
  oDoc = document;
  
  Event.on(oDoc, "mouseover", onDOMEvent, this, true);
  Event.on(oDoc, "mouseout", onDOMEvent, this, true);
  Event.on(oDoc, "mousedown", onDOMEvent, this, true);
  Event.on(oDoc, "mouseup", onDOMEvent, this, true);
  Event.on(oDoc, "click", onDOMEvent, this, true);
  Event.on(oDoc, "keydown", onDOMEvent, this, true);
  Event.on(oDoc, "keyup", onDOMEvent, this, true);
  Event.on(oDoc, "keypress", onDOMEvent, this, true);
  
  
  m_bInitializedEventHandlers = true;
  
  
  }
  
  p_oMenu.cfg.subscribeToConfigEvent("visible", 
  onMenuVisibleConfigChange);

  p_oMenu.destroyEvent.subscribe(onMenuDestroy, p_oMenu, 
  this);
  
  p_oMenu.itemAddedEvent.subscribe(onItemAdded);
  p_oMenu.focusEvent.subscribe(onMenuFocus);
  p_oMenu.blurEvent.subscribe(onMenuBlur);
  
  
  }
  
  },
  
  
 
  removeMenu: function (p_oMenu) {
  
  var sId,
  aItems,
  i;
  
  if (p_oMenu) {
  
  sId = p_oMenu.id;
  
  if (m_oMenus[sId] == p_oMenu) {


  aItems = p_oMenu.getItems();

  if (aItems && aItems.length > 0) {

  i = aItems.length - 1;

  do {

  removeItem(aItems[i]);

  }
  while (i--);

  }



  delete m_oMenus[sId];
  
  

  

  if (m_oVisibleMenus[sId] == p_oMenu) {
  
  delete m_oVisibleMenus[sId];
  
  
  }



  if (p_oMenu.cfg) {

  p_oMenu.cfg.unsubscribeFromConfigEvent("visible", 
  onMenuVisibleConfigChange);
  
  }

  p_oMenu.destroyEvent.unsubscribe(onMenuDestroy, 
  p_oMenu);
  
  p_oMenu.itemAddedEvent.unsubscribe(onItemAdded);
  p_oMenu.focusEvent.unsubscribe(onMenuFocus);
  p_oMenu.blurEvent.unsubscribe(onMenuBlur);

  }
  
  }
  
  },
  
  
 
  hideVisible: function () {
  
  var oMenu;
  
  for (var i in m_oVisibleMenus) {
  
  if (Buclo.lang.hasOwnProperty(m_oVisibleMenus, i)) {
  
  oMenu = m_oVisibleMenus[i];
  
  if (!(oMenu instanceof Buclo.widget.MenuBar) && 
  oMenu.cfg.getProperty("position") == "dynamic") {
  
  oMenu.hide();
  
  }
  
  }
  
  }  
  
  },


  
  getVisible: function () {
  
  return m_oVisibleMenus;
  
  },

  
  
  getMenus: function () {
  
  return m_oMenus;
  
  },
  
  
 
  getMenu: function (p_sId) {
  
  var oMenu = m_oMenus[p_sId];
  
  if (oMenu) {
  
  return oMenu;
  
  }
  
  },
  
  
  
  getMenuItem: function (p_sId) {
  
  var oItem = m_oItems[p_sId];
  
  if (oItem) {
  
  return oItem;
  
  }
  
  },


  
  getMenuItemGroup: function (p_sId) {

  var oUL = Dom.get(p_sId),
  aItems,
  oNode,
  oItem,
  sId;
  

  if (oUL && oUL.tagName && 
  oUL.tagName.toUpperCase() == "UL") {

  oNode = oUL.firstChild;

  if (oNode) {

  aItems = [];
  
  do {

  sId = oNode.id;

  if (sId) {
  
  oItem = this.getMenuItem(sId);
  
  if (oItem) {
  
  aItems[aItems.length] = oItem;
  
  }
  
  }
  
  }
  while ((oNode = oNode.nextSibling));


  if (aItems.length > 0) {

  return aItems;
  
  }

  }
  
  }
  
  },

  
  
  getFocusedMenuItem: function () {
  
  return m_oFocusedMenuItem;
  
  },
  
  
  
  getFocusedMenu: function () {
  
  if (m_oFocusedMenuItem) {
  
  return (m_oFocusedMenuItem.parent.getRoot());
  
  }
  
  },
  
  
  
  toString: function () {
  
  return "MenuManager";
  
  }
  
  };
  
  }();

})();



(function () {


Buclo.widget.Menu = function (p_oElement, p_oConfig) {

  if (p_oConfig) {

  this.parent = p_oConfig.parent;
  this.lazyLoad = p_oConfig.lazyLoad || p_oConfig.lazyload;
  this.itemData = p_oConfig.itemData || p_oConfig.itemdata;

  }


  Buclo.widget.Menu.superclass.constructor.call(this, p_oElement, p_oConfig);

};



function checkPosition(p_sPosition) {

  if (typeof p_sPosition == "string") {

  return ("dynamic,static".indexOf((p_sPosition.toLowerCase())) != -1);

  }

}


var Dom = Buclo.util.Dom,
  Event = Buclo.util.Event,
  Module = Buclo.widget.Module,
  Overlay = Buclo.widget.Overlay,
  Menu = Buclo.widget.Menu,
  MenuManager = Buclo.widget.MenuManager,
  CustomEvent = Buclo.util.CustomEvent,
  Lang = Buclo.lang,
  UA = Buclo.env.ua,
  
  m_oShadowTemplate,

  
  EVENT_TYPES = {
  
  "MOUSE_OVER": "mouseover",
  "MOUSE_OUT": "mouseout",
  "MOUSE_DOWN": "mousedown",
  "MOUSE_UP": "mouseup",
  "CLICK": "click",
  "KEY_PRESS": "keypress",
  "KEY_DOWN": "keydown",
  "KEY_UP": "keyup",
  "FOCUS": "focus",
  "BLUR": "blur",
  "ITEM_ADDED": "itemAdded",
  "ITEM_REMOVED": "itemRemoved"
  
  },


  
  DEFAULT_CONFIG = {

  "VISIBLE": { 
  key: "visible", 
  value: false, 
  validator: Lang.isBoolean
  }, 
  
  "CONSTRAIN_TO_VIEWPORT": {
  key: "constraintoviewport", 
  value: true, 
  validator: Lang.isBoolean, 
  supercedes: ["iframe","x","y","xy"]
  }, 
  
  "POSITION": { 
  key: "position", 
  value: "dynamic", 
  validator: checkPosition, 
  supercedes: ["visible", "iframe"]
  }, 
  
  "SUBMENU_ALIGNMENT": { 
  key: "submenualignment", 
  value: ["tl","tr"],
  suppressEvent: true
  },
  
  "AUTO_SUBMENU_DISPLAY": { 
  key: "autosubmenudisplay", 
  value: true, 
  validator: Lang.isBoolean,
  suppressEvent: true
  }, 
  
  "SHOW_DELAY": { 
  key: "showdelay", 
  value: 250, 
  validator: Lang.isNumber, 
  suppressEvent: true
  }, 
  
  "HIDE_DELAY": { 
  key: "hidedelay", 
  value: 0, 
  validator: Lang.isNumber, 
  suppressEvent: true
  }, 
  
  "SUBMENU_HIDE_DELAY": { 
  key: "submenuhidedelay", 
  value: 250, 
  validator: Lang.isNumber,
  suppressEvent: true
  }, 
  
  "CLICK_TO_HIDE": { 
  key: "clicktohide", 
  value: true, 
  validator: Lang.isBoolean,
  suppressEvent: true
  },
  
  "CONTAINER": { 
  key: "container",
  suppressEvent: true
  }, 

  "SCROLL_INCREMENT": { 
  key: "scrollincrement", 
  value: 1, 
  validator: Lang.isNumber,
  supercedes: ["maxheight"],
  suppressEvent: true
  },

  "MIN_SCROLL_HEIGHT": { 
  key: "minscrollheight", 
  value: 90, 
  validator: Lang.isNumber,
  supercedes: ["maxheight"],
  suppressEvent: true
  },  
  
  "MAX_HEIGHT": { 
  key: "maxheight", 
  value: 0, 
  validator: Lang.isNumber,
  supercedes: ["iframe"],
  suppressEvent: true
  }, 
  
  "CLASS_NAME": { 
  key: "classname", 
  value: null, 
  validator: Lang.isString,
  suppressEvent: true
  }, 
  
  "DISABLED": { 
  key: "disabled", 
  value: false, 
  validator: Lang.isBoolean,
  suppressEvent: true
  }
  
  };



Buclo.lang.extend(Menu, Overlay, {




CSS_CLASS_NAME: "yuimenu",


ITEM_TYPE: null,


GROUP_TITLE_TAG_NAME: "h6",


OFF_SCREEN_POSITION: [-10000, -10000],





_nHideDelayId: null,


_nShowDelayId: null,


_nSubmenuHideDelayId: null,


_nBodyScrollId: null,


_bHideDelayEventHandlersAssigned: false,


_bHandledMouseOverEvent: false,


_bHandledMouseOutEvent: false,


_aGroupTitleElements: null,


_aItemGroups: null,


_aListElements: null,


_nCurrentMouseX: 0,

_bStopMouseEventHandlers: false,



_sClassName: null,






lazyLoad: false,



itemData: null,


activeItem: null,


parent: null,


srcElement: null,





mouseOverEvent: null,


mouseOutEvent: null,


mouseDownEvent: null,


mouseUpEvent: null,


clickEvent: null,


keyPressEvent: null,


keyDownEvent: null,


keyUpEvent: null,


itemAddedEvent: null,


itemRemovedEvent: null,


init: function (p_oElement, p_oConfig) {

  this._aItemGroups = [];
  this._aListElements = [];
  this._aGroupTitleElements = [];

  if (!this.ITEM_TYPE) {

  this.ITEM_TYPE = Buclo.widget.MenuItem;

  }


  var oElement;

  if (typeof p_oElement == "string") {

  oElement = document.getElementById(p_oElement);

  }
  else if (p_oElement.tagName) {

  oElement = p_oElement;

  }


  if (oElement && oElement.tagName) {

  switch(oElement.tagName.toUpperCase()) {
  
  case "DIV":

  this.srcElement = oElement;

  if (!oElement.id) {

  oElement.setAttribute("id", Dom.generateId());

  }


  
  Menu.superclass.init.call(this, oElement);

  this.beforeInitEvent.fire(Menu);


  
  break;
  
  case "SELECT":
  
  this.srcElement = oElement;

  

  Menu.superclass.init.call(this, Dom.generateId());

  this.beforeInitEvent.fire(Menu);



  break;

  }

  }
  else {

 
  Menu.superclass.init.call(this, p_oElement);

  this.beforeInitEvent.fire(Menu);



  }


  if (this.element) {

  Dom.addClass(this.element, this.CSS_CLASS_NAME);



  this.initEvent.subscribe(this._onInit);
  this.beforeRenderEvent.subscribe(this._onBeforeRender);
  this.renderEvent.subscribe(this._onRender);
  this.renderEvent.subscribe(this.onRender);
  this.beforeShowEvent.subscribe(this._onBeforeShow);
  this.hideEvent.subscribe(this.positionOffScreen);
  this.showEvent.subscribe(this._onShow);
  this.beforeHideEvent.subscribe(this._onBeforeHide);
  this.mouseOverEvent.subscribe(this._onMouseOver);
  this.mouseOutEvent.subscribe(this._onMouseOut);
  this.clickEvent.subscribe(this._onClick);
  this.keyDownEvent.subscribe(this._onKeyDown);
  this.keyPressEvent.subscribe(this._onKeyPress);
  

  if (UA.gecko || UA.webkit) {

  this.cfg.subscribeToConfigEvent("y", this._onYChange);

  }


  if (p_oConfig) {
  
  this.cfg.applyConfig(p_oConfig, true);
  
  }



  MenuManager.addMenu(this);
  

  this.initEvent.fire(Menu);

  }

},





_initSubTree: function () {

  var oSrcElement = this.srcElement,
  sSrcElementTagName,
  nGroup,
  sGroupTitleTagName,
  oNode,
  aListElements,
  nListElements,
  i;


  if (oSrcElement) {
  
  sSrcElementTagName = 
  (oSrcElement.tagName && oSrcElement.tagName.toUpperCase());


  if (sSrcElementTagName == "DIV") {
  
  
  oNode = this.body.firstChild;
  

  if (oNode) {
  
  nGroup = 0;
  sGroupTitleTagName = this.GROUP_TITLE_TAG_NAME.toUpperCase();
  
  do {
  

  if (oNode && oNode.tagName) {
  
  switch (oNode.tagName.toUpperCase()) {
  
  case sGroupTitleTagName:
  
  this._aGroupTitleElements[nGroup] = oNode;
  
  break;
  
  case "UL":
  
  this._aListElements[nGroup] = oNode;
  this._aItemGroups[nGroup] = [];
  nGroup++;
  
  break;
  
  }
  
  }
  
  }
  while ((oNode = oNode.nextSibling));
  
  
  
  if (this._aListElements[0]) {
  
  Dom.addClass(this._aListElements[0], "first-of-type");
  
  }
  
  }
  
  }
  
  
  oNode = null;
  
  

  if (sSrcElementTagName) {
  
  switch (sSrcElementTagName) {
  
  case "DIV":

  aListElements = this._aListElements;
  nListElements = aListElements.length;
  
  if (nListElements > 0) {
  
  
  i = nListElements - 1;
  
  do {
  
  oNode = aListElements[i].firstChild;
  
  if (oNode) {

  
  do {
  
  if (oNode && oNode.tagName && 
  oNode.tagName.toUpperCase() == "LI") {
  
  
  this.addItem(new this.ITEM_TYPE(oNode, 
  { parent: this }), i);
  
  }
  
  }
  while ((oNode = oNode.nextSibling));
  
  }
  
  }
  while (i--);
  
  }
  
  break;
  
  case "SELECT":
  
  
  oNode = oSrcElement.firstChild;
  
  do {
  
  if (oNode && oNode.tagName) {
  
  switch (oNode.tagName.toUpperCase()) {
  
  case "OPTGROUP":
  case "OPTION":
  
  
  this.addItem(
  new this.ITEM_TYPE(
  oNode, 
  { parent: this }
  )
  );
  
  break;
  
  }
  
  }
  
  }
  while ((oNode = oNode.nextSibling));
  
  break;
  
  }
  
  }  
  
  }

},


_getFirstEnabledItem: function () {

  var aItems = this.getItems(),
  nItems = aItems.length,
  oItem;
  
  for(var i=0; i<nItems; i++) {

  oItem = aItems[i];

  if (oItem && !oItem.cfg.getProperty("disabled") && 
  oItem.element.style.display != "none") {

  return oItem;

  }
  
  }
  
},


_addItemToGroup: function (p_nGroupIndex, p_oItem, p_nItemIndex) {

  var oItem,
  nGroupIndex,
  aGroup,
  oGroupItem,
  bAppend,
  oNextItemSibling,
  nItemIndex;

  function getNextItemSibling(p_aArray, p_nStartIndex) {

  return (p_aArray[p_nStartIndex] || getNextItemSibling(p_aArray, 
  (p_nStartIndex+1)));

  }

  if (p_oItem instanceof this.ITEM_TYPE) {

  oItem = p_oItem;
  oItem.parent = this;

  }
  else if (typeof p_oItem == "string") {

  oItem = new this.ITEM_TYPE(p_oItem, { parent: this });
  
  }
  else if (typeof p_oItem == "object") {

  p_oItem.parent = this;

  oItem = new this.ITEM_TYPE(p_oItem.text, p_oItem);

  }


  if (oItem) {

  if (oItem.cfg.getProperty("selected")) {

  this.activeItem = oItem;
  
  }


  nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0;
  aGroup = this._getItemGroup(nGroupIndex);



  if (!aGroup) {

  aGroup = this._createItemGroup(nGroupIndex);

  }


  if (typeof p_nItemIndex == "number") {

  bAppend = (p_nItemIndex >= aGroup.length);  


  if (aGroup[p_nItemIndex]) {
  
  aGroup.splice(p_nItemIndex, 0, oItem);
  
  }
  else {
  
  aGroup[p_nItemIndex] = oItem;
  
  }


  oGroupItem = aGroup[p_nItemIndex];

  if (oGroupItem) {

  if (bAppend && (!oGroupItem.element.parentNode || 
  oGroupItem.element.parentNode.nodeType == 11)) {
  
  this._aListElements[nGroupIndex].appendChild(
  oGroupItem.element);
  
  }
  else {
  
  oNextItemSibling = getNextItemSibling(aGroup, 
  (p_nItemIndex+1));
  
  if (oNextItemSibling && (!oGroupItem.element.parentNode || 
  oGroupItem.element.parentNode.nodeType == 11)) {
  
  this._aListElements[nGroupIndex].insertBefore(
  oGroupItem.element, 
  oNextItemSibling.element);
  
  }
  
  }
  

  oGroupItem.parent = this;
  
  this._subscribeToItemEvents(oGroupItem);
  
  this._configureSubmenu(oGroupItem);
  
  this._updateItemProperties(nGroupIndex);
  

  this.itemAddedEvent.fire(oGroupItem);
  this.changeContentEvent.fire();

  return oGroupItem;
  
  }

  }
  else {
  
  nItemIndex = aGroup.length;
  
  aGroup[nItemIndex] = oItem;

  oGroupItem = aGroup[nItemIndex];
  

  if (oGroupItem) {
  
  if (!Dom.isAncestor(this._aListElements[nGroupIndex], 
  oGroupItem.element)) {
  
  this._aListElements[nGroupIndex].appendChild(
  oGroupItem.element);
  
  }
  
  oGroupItem.element.setAttribute("groupindex", nGroupIndex);
  oGroupItem.element.setAttribute("index", nItemIndex);
  
  oGroupItem.parent = this;
  
  oGroupItem.index = nItemIndex;
  oGroupItem.groupIndex = nGroupIndex;
  
  this._subscribeToItemEvents(oGroupItem);
  
  this._configureSubmenu(oGroupItem);
  
  if (nItemIndex === 0) {
  
  Dom.addClass(oGroupItem.element, "first-of-type");
  
  }

  

  this.itemAddedEvent.fire(oGroupItem);
  this.changeContentEvent.fire();

  return oGroupItem;
  
  }
  
  }

  }
  
},


_removeItemFromGroupByIndex: function (p_nGroupIndex, p_nItemIndex) {

  var nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0,
  aGroup = this._getItemGroup(nGroupIndex),
  aArray,
  oItem,
  oUL;

  if (aGroup) {

  aArray = aGroup.splice(p_nItemIndex, 1);
  oItem = aArray[0];
  
  if (oItem) {
  
  
  this._updateItemProperties(nGroupIndex);
  
  if (aGroup.length === 0) {
  
  
  oUL = this._aListElements[nGroupIndex];
  
  if (this.body && oUL) {
  
  this.body.removeChild(oUL);
  
  }
  
  
  this._aItemGroups.splice(nGroupIndex, 1);
  
  
  
  this._aListElements.splice(nGroupIndex, 1);
  
  
  
  oUL = this._aListElements[0];
  
  if (oUL) {
  
  Dom.addClass(oUL, "first-of-type");
  
  }  
  
  }
  

  this.itemRemovedEvent.fire(oItem);
  this.changeContentEvent.fire();


  
  return oItem;
  
  }

  }
  
},


_removeItemFromGroupByValue: function (p_nGroupIndex, p_oItem) {

  var aGroup = this._getItemGroup(p_nGroupIndex),
  nItems,
  nItemIndex,
  i;

  if (aGroup) {

  nItems = aGroup.length;
  nItemIndex = -1;
  
  if (nItems > 0) {
  
  i = nItems-1;
  
  do {
  
  if (aGroup[i] == p_oItem) {
  
  nItemIndex = i;
  break;  
  
  }
  
  }
  while(i--);
  
  if (nItemIndex > -1) {
  
  return (this._removeItemFromGroupByIndex(p_nGroupIndex, 
  nItemIndex));
  
  }
  
  }
  
  }

},


_updateItemProperties: function (p_nGroupIndex) {

  var aGroup = this._getItemGroup(p_nGroupIndex),
  nItems = aGroup.length,
  oItem,
  oLI,
  i;


  if (nItems > 0) {

  i = nItems - 1;

  
  do {

  oItem = aGroup[i];

  if (oItem) {
  
  oLI = oItem.element;

  oItem.index = i;
  oItem.groupIndex = p_nGroupIndex;

  oLI.setAttribute("groupindex", p_nGroupIndex);
  oLI.setAttribute("index", i);

  Dom.removeClass(oLI, "first-of-type");

  }
  
  }
  while(i--);


  if (oLI) {

  Dom.addClass(oLI, "first-of-type");

  }

  }

},


_createItemGroup: function (p_nIndex) {

  var oUL;

  if (!this._aItemGroups[p_nIndex]) {

  this._aItemGroups[p_nIndex] = [];

  oUL = document.createElement("ul");

  this._aListElements[p_nIndex] = oUL;

  return this._aItemGroups[p_nIndex];

  }

},


_getItemGroup: function (p_nIndex) {

  var nIndex = ((typeof p_nIndex == "number") ? p_nIndex : 0);

  return this._aItemGroups[nIndex];

},


_configureSubmenu: function (p_oItem) {

  var oSubmenu = p_oItem.cfg.getProperty("submenu");

  if (oSubmenu) {
  
 

  this.cfg.configChangedEvent.subscribe(this._onParentMenuConfigChange, 
  oSubmenu, true);

  this.renderEvent.subscribe(this._onParentMenuRender, oSubmenu, true);

  oSubmenu.beforeShowEvent.subscribe(this._onSubmenuBeforeShow);

  }

},




_subscribeToItemEvents: function (p_oItem) {

  p_oItem.focusEvent.subscribe(this._onMenuItemFocus);

  p_oItem.blurEvent.subscribe(this._onMenuItemBlur);

  p_oItem.destroyEvent.subscribe(this._onMenuItemDestroy, p_oItem, this);

  p_oItem.cfg.configChangedEvent.subscribe(this._onMenuItemConfigChange,
  p_oItem, this);

},


_onVisibleChange: function (p_sType, p_aArgs) {

  var bVisible = p_aArgs[0];
  
  if (bVisible) {

  Dom.addClass(this.element, "visible");

  }
  else {

  Dom.removeClass(this.element, "visible");

  }

},


_cancelHideDelay: function () {

  var oRoot = this.getRoot();

  if (oRoot._nHideDelayId) {

  window.clearTimeout(oRoot._nHideDelayId);

  }

},


_execHideDelay: function () {

  this._cancelHideDelay();

  var oRoot = this.getRoot(),
  me = this;

  function hideMenu() {
  
  if (oRoot.activeItem) {

  oRoot.clearActiveItem();

  }

  if (oRoot == me && !(me instanceof Buclo.widget.MenuBar) && 
  me.cfg.getProperty("position") == "dynamic") {

  me.hide();
  
  }
  
  }


  oRoot._nHideDelayId = 
  window.setTimeout(hideMenu, oRoot.cfg.getProperty("hidedelay"));

},


_cancelShowDelay: function () {

  var oRoot = this.getRoot();

  if (oRoot._nShowDelayId) {

  window.clearTimeout(oRoot._nShowDelayId);

  }

},


_execShowDelay: function (p_oMenu) {

  var oRoot = this.getRoot();

  function showMenu() {

  if (p_oMenu.parent.cfg.getProperty("selected")) {

  p_oMenu.show();

  }

  }


  oRoot._nShowDelayId = 
  window.setTimeout(showMenu, oRoot.cfg.getProperty("showdelay"));

},


_execSubmenuHideDelay: function (p_oSubmenu, p_nMouseX, p_nHideDelay) {

  var me = this;

  p_oSubmenu._nSubmenuHideDelayId = window.setTimeout(function () {

  if (me._nCurrentMouseX > (p_nMouseX + 10)) {

  p_oSubmenu._nSubmenuHideDelayId = window.setTimeout(function () {
  
  p_oSubmenu.hide();

  }, p_nHideDelay);

  }
  else {

  p_oSubmenu.hide();
  
  }

  }, 50);

},





_disableScrollHeader: function () {

  if (!this._bHeaderDisabled) {

  Dom.addClass(this.header, "topscrollbar_disabled");
  this._bHeaderDisabled = true;

  }

},


_disableScrollFooter: function () {

  if (!this._bFooterDisabled) {

  Dom.addClass(this.footer, "bottomscrollbar_disabled");
  this._bFooterDisabled = true;

  }

},

_enableScrollHeader: function () {

  if (this._bHeaderDisabled) {

  Dom.removeClass(this.header, "topscrollbar_disabled");
  this._bHeaderDisabled = false;

  }

},


_enableScrollFooter: function () {

  if (this._bFooterDisabled) {

  Dom.removeClass(this.footer, "bottomscrollbar_disabled");
  this._bFooterDisabled = false;

  }

},

_onMouseOver: function (p_sType, p_aArgs) {

  if (this._bStopMouseEventHandlers) {
  
  return false;
  
  }


  var oEvent = p_aArgs[0],
  oItem = p_aArgs[1],
  oTarget = Event.getTarget(oEvent),
  oParentMenu,
  nShowDelay,
  bShowDelay,
  oActiveItem,
  oItemCfg,
  oSubmenu;


  if (!this._bHandledMouseOverEvent && (oTarget == this.element || 
  Dom.isAncestor(this.element, oTarget))) {


  this._nCurrentMouseX = 0;

  Event.on(this.element, "mousemove", this._onMouseMove, this, true);

		this.clearActiveItem();


  if (this.parent && this._nSubmenuHideDelayId) {

  window.clearTimeout(this._nSubmenuHideDelayId);

  this.parent.cfg.setProperty("selected", true);

  oParentMenu = this.parent.parent;

  oParentMenu._bHandledMouseOutEvent = true;
  oParentMenu._bHandledMouseOverEvent = false;

  }


  this._bHandledMouseOverEvent = true;
  this._bHandledMouseOutEvent = false;
  
  }


  if (oItem && !oItem.handledMouseOverEvent && 
  !oItem.cfg.getProperty("disabled") && 
  (oTarget == oItem.element || Dom.isAncestor(oItem.element, oTarget))) {


  nShowDelay = this.cfg.getProperty("showdelay");
  bShowDelay = (nShowDelay > 0);


  if (bShowDelay) {
  
  this._cancelShowDelay();
  
  }


  oActiveItem = this.activeItem;
  
  if (oActiveItem) {
  
  oActiveItem.cfg.setProperty("selected", false);
  
  }


  oItemCfg = oItem.cfg;
  
  
  oItemCfg.setProperty("selected", true);


  if (this.hasFocus()) {
  
  oItem.focus();
  
  }


  if (this.cfg.getProperty("autosubmenudisplay")) {


  oSubmenu = oItemCfg.getProperty("submenu");
  
  if (oSubmenu) {
  
  if (bShowDelay) {

  this._execShowDelay(oSubmenu);
  
  }
  else {

  oSubmenu.show();

  }

  }

  }  

  oItem.handledMouseOverEvent = true;
  oItem.handledMouseOutEvent = false;

  }

},


_onMouseOut: function (p_sType, p_aArgs) {

  if (this._bStopMouseEventHandlers) {
  
  return false;
  
  }


  var oEvent = p_aArgs[0],
  oItem = p_aArgs[1],
  oRelatedTarget = Event.getRelatedTarget(oEvent),
  bMovingToSubmenu = false,
  oItemCfg,
  oSubmenu,
  nSubmenuHideDelay,
  nShowDelay;


  if (oItem && !oItem.cfg.getProperty("disabled")) {

  oItemCfg = oItem.cfg;
  oSubmenu = oItemCfg.getProperty("submenu");


  if (oSubmenu && (oRelatedTarget == oSubmenu.element ||
  Dom.isAncestor(oSubmenu.element, oRelatedTarget))) {

  bMovingToSubmenu = true;

  }


  if (!oItem.handledMouseOutEvent && ((oRelatedTarget != oItem.element && 
  !Dom.isAncestor(oItem.element, oRelatedTarget)) || 
  bMovingToSubmenu)) {


  if (!bMovingToSubmenu) {

  oItem.cfg.setProperty("selected", false);


  if (oSubmenu) {

  nSubmenuHideDelay = 
  this.cfg.getProperty("submenuhidedelay");

  nShowDelay = this.cfg.getProperty("showdelay");

  if (!(this instanceof Buclo.widget.MenuBar) && 
  nSubmenuHideDelay > 0 && 
  nShowDelay >= nSubmenuHideDelay) {

  this._execSubmenuHideDelay(oSubmenu, 
  Event.getPageX(oEvent),
  nSubmenuHideDelay);

  }
  else {

  oSubmenu.hide();

  }

  }

  }


  oItem.handledMouseOutEvent = true;
  oItem.handledMouseOverEvent = false;
  
  }

  }


  if (!this._bHandledMouseOutEvent && ((oRelatedTarget != this.element && 
  !Dom.isAncestor(this.element, oRelatedTarget)) || bMovingToSubmenu)) {


  Event.removeListener(this.element, "mousemove", this._onMouseMove);

  this._nCurrentMouseX = Event.getPageX(oEvent);

  this._bHandledMouseOutEvent = true;
  this._bHandledMouseOverEvent = false;

  }

},


_onMouseMove: function (p_oEvent, p_oMenu) {

  if (this._bStopMouseEventHandlers) {
  
  return false;
  
  }

  this._nCurrentMouseX = Event.getPageX(p_oEvent);

},


_onClick: function (p_sType, p_aArgs) {

	var oEvent = p_aArgs[0],
		oItem = p_aArgs[1],
		bInMenuAnchor = false,
		oSubmenu,
		oRoot,
		sId,
		sURL,
		nHashPos,
		nLen;


	if (oItem) {
	
		if (oItem.cfg.getProperty("disabled")) {
		
			Event.preventDefault(oEvent);

		}
		else {

			oSubmenu = oItem.cfg.getProperty("submenu");
	
			
			
			
			sURL = oItem.cfg.getProperty("url");

		
			if (sURL) {
	
				nHashPos = sURL.indexOf("#");
	
				nLen = sURL.length;
	
	
				if (nHashPos != -1) {
	
					sURL = sURL.substr(nHashPos, nLen);
		
					nLen = sURL.length;
	
	
					if (nLen > 1) {
	
						sId = sURL.substr(1, nLen);
	
						bInMenuAnchor = Dom.isAncestor(this.element, sId);
						
					}
					else if (nLen === 1) {
	
						bInMenuAnchor = true;
					
					}
	
				}
			
			}


	
			if (bInMenuAnchor && !oItem.cfg.getProperty("target")) {
	
				Event.preventDefault(oEvent);
				

				if (UA.webkit) {
				
					oItem.focus();
				
				}
				else {

					oItem.focusEvent.fire();
				
				}
			
			}
	
	
			if (!oSubmenu) {
	
				

				if ((UA.gecko && this.platform == "windows") && oEvent.button > 0) {
				
					return;
				
				}

				oRoot = this.getRoot();

				if (oRoot instanceof Buclo.widget.MenuBar || 
					oRoot.cfg.getProperty("position") == "static") {
	
					oRoot.clearActiveItem();
	
				}
				else {
	
					oRoot.hide();
				
				}
	
			}
			
		}
	
	}

},



_onKeyDown: function (p_sType, p_aArgs) {

  var oEvent = p_aArgs[0],
  oItem = p_aArgs[1],
  me = this,
  oSubmenu,
  oItemCfg,
  oParentItem,
  oRoot,
  oNextItem,
  oBody,
  nBodyScrollTop,
  nBodyOffsetHeight,
  aItems,
  nItems,
  nNextItemOffsetTop,
  nScrollTarget,
  oParentMenu;


  
  function stopMouseEventHandlers() {

  me._bStopMouseEventHandlers = true;
  
  window.setTimeout(function () {
  
  me._bStopMouseEventHandlers = false;
  
  }, 10);

  }


  if (oItem && !oItem.cfg.getProperty("disabled")) {

  oItemCfg = oItem.cfg;
  oParentItem = this.parent;

  switch(oEvent.keyCode) {
  
  case 38:  // Up arrow
  case 40:  // Down arrow
  
  oNextItem = (oEvent.keyCode == 38) ? 
  oItem.getPreviousEnabledSibling() : 
  oItem.getNextEnabledSibling();
  
  if (oNextItem) {

  this.clearActiveItem();

  oNextItem.cfg.setProperty("selected", true);
  oNextItem.focus();


  if (this.cfg.getProperty("maxheight") > 0) {

  oBody = this.body;
  nBodyScrollTop = oBody.scrollTop;
  nBodyOffsetHeight = oBody.offsetHeight;
  aItems = this.getItems();
  nItems = aItems.length - 1;
  nNextItemOffsetTop = oNextItem.element.offsetTop;


  if (oEvent.keyCode == 40 ) {  // Down
  
  if (nNextItemOffsetTop >= (nBodyOffsetHeight + nBodyScrollTop)) {

  oBody.scrollTop = nNextItemOffsetTop - nBodyOffsetHeight;

  }
  else if (nNextItemOffsetTop <= nBodyScrollTop) {
  
  oBody.scrollTop = 0;
  
  }


  if (oNextItem == aItems[nItems]) {

  oBody.scrollTop = oNextItem.element.offsetTop;

  }

  }
  else { // Up

  if (nNextItemOffsetTop <= nBodyScrollTop) {

  oBody.scrollTop = nNextItemOffsetTop - oNextItem.element.offsetHeight;
  
  }
  else if (nNextItemOffsetTop >= (nBodyScrollTop + nBodyOffsetHeight)) {
  
  oBody.scrollTop = nNextItemOffsetTop;
  
  }


  if (oNextItem == aItems[0]) {
  
  oBody.scrollTop = 0;
  
  }

  }


  nBodyScrollTop = oBody.scrollTop;
  nScrollTarget = oBody.scrollHeight - oBody.offsetHeight;

  if (nBodyScrollTop === 0) {

  this._disableScrollHeader();
  this._enableScrollFooter();

  }
  else if (nBodyScrollTop == nScrollTarget) {

 this._enableScrollHeader();
 this._disableScrollFooter();

  }
  else {

  this._enableScrollHeader();
  this._enableScrollFooter();

  }

  }

  }

  
  Event.preventDefault(oEvent);

  stopMouseEventHandlers();
  
  break;
  
  
  case 39:  // Right arrow
  
  oSubmenu = oItemCfg.getProperty("submenu");
  
  if (oSubmenu) {
  
  if (!oItemCfg.getProperty("selected")) {
  
  oItemCfg.setProperty("selected", true);
  
  }
  
  oSubmenu.show();
  oSubmenu.setInitialFocus();
  oSubmenu.setInitialSelection();
  
  }
  else {
  
  oRoot = this.getRoot();
  
  if (oRoot instanceof Buclo.widget.MenuBar) {
  
  oNextItem = oRoot.activeItem.getNextEnabledSibling();
  
  if (oNextItem) {
  
  oRoot.clearActiveItem();
  
  oNextItem.cfg.setProperty("selected", true);
  
  oSubmenu = oNextItem.cfg.getProperty("submenu");
  
  if (oSubmenu) {
  
  oSubmenu.show();
  
  }
  
  oNextItem.focus();
  
  }
  
  }
  
  }
  
  
  Event.preventDefault(oEvent);

  stopMouseEventHandlers();

  break;
  
  
  case 37:  // Left arrow
  
  if (oParentItem) {
  
  oParentMenu = oParentItem.parent;
  
  if (oParentMenu instanceof Buclo.widget.MenuBar) {
  
  oNextItem = 
  oParentMenu.activeItem.getPreviousEnabledSibling();
  
  if (oNextItem) {
  
  oParentMenu.clearActiveItem();
  
  oNextItem.cfg.setProperty("selected", true);
  
  oSubmenu = oNextItem.cfg.getProperty("submenu");
  
  if (oSubmenu) {
  
  oSubmenu.show();
  
  }
  
  oNextItem.focus();
  
  } 
  
  }
  else {
  
  this.hide();
  
  oParentItem.focus();
  
  }
  
  }
  
  Event.preventDefault(oEvent);

  stopMouseEventHandlers();

  break;  
  
  }


  }


  if (oEvent.keyCode == 27) { // Esc key

  if (this.cfg.getProperty("position") == "dynamic") {
  
  this.hide();

  if (this.parent) {

  this.parent.focus();
  
  }

  }
  else if (this.activeItem) {

  oSubmenu = this.activeItem.cfg.getProperty("submenu");

  if (oSubmenu && oSubmenu.cfg.getProperty("visible")) {
  
  oSubmenu.hide();
  this.activeItem.focus();
  
  }
  else {

  this.activeItem.blur();
  this.activeItem.cfg.setProperty("selected", false);
  
  }
  
  }


  Event.preventDefault(oEvent);
  
  }
  
},


_onKeyPress: function (p_sType, p_aArgs) {
  
  var oEvent = p_aArgs[0];


  if (oEvent.keyCode == 40 || oEvent.keyCode == 38) {

  Event.preventDefault(oEvent);

  }

},


_onYChange: function (p_sType, p_aArgs) {

  var oParent = this.parent,
  nScrollTop,
  oIFrame,
  nY;


  if (oParent) {

  nScrollTop = oParent.parent.body.scrollTop;


  if (nScrollTop > 0) {
  
  nY = (this.cfg.getProperty("y") - nScrollTop);
  
  Dom.setY(this.element, nY);

  oIFrame = this.iframe;  
  

  if (oIFrame) {
  
  Dom.setY(oIFrame, nY);
  
  }
  
  this.cfg.setProperty("y", nY, true);
  
  }
  
  }

},


_onScrollTargetMouseOver: function (p_oEvent, p_oMenu) {

  this._cancelHideDelay();

  var oTarget = Event.getTarget(p_oEvent),
  oBody = this.body,
  me = this,
  nScrollIncrement = this.cfg.getProperty("scrollincrement"),
  nScrollTarget,
  fnScrollFunction;


  function scrollBodyDown() {

  var nScrollTop = oBody.scrollTop;


  if (nScrollTop < nScrollTarget) {

  oBody.scrollTop = (nScrollTop + nScrollIncrement);

  me._enableScrollHeader();

  }
  else {

  oBody.scrollTop = nScrollTarget;
  
  window.clearInterval(me._nBodyScrollId);

  me._disableScrollFooter();

  }

  }


  function scrollBodyUp() {

  var nScrollTop = oBody.scrollTop;


  if (nScrollTop > 0) {

  oBody.scrollTop = (nScrollTop - nScrollIncrement);

  me._enableScrollFooter();

  }
  else {

  oBody.scrollTop = 0;
  
  window.clearInterval(me._nBodyScrollId);

  me._disableScrollHeader();

  }

  }

  
  if (Dom.hasClass(oTarget, "hd")) {

  fnScrollFunction = scrollBodyUp;
  
  }
  else {

  nScrollTarget = oBody.scrollHeight - oBody.offsetHeight;

  fnScrollFunction = scrollBodyDown;
  
  }


  this._nBodyScrollId = window.setInterval(fnScrollFunction, 10);

},


_onScrollTargetMouseOut: function (p_oEvent, p_oMenu) {

  window.clearInterval(this._nBodyScrollId);

  this._cancelHideDelay();

},





_onInit: function (p_sType, p_aArgs) {

  this.cfg.subscribeToConfigEvent("visible", this._onVisibleChange);

  var bRootMenu = !this.parent,
  bLazyLoad = this.lazyLoad;


 



  if (((bRootMenu && !bLazyLoad) || 
  (bRootMenu && (this.cfg.getProperty("visible") || 
  this.cfg.getProperty("position") == "static")) || 
  (!bRootMenu && !bLazyLoad)) && this.getItemGroups().length === 0) {

  if (this.srcElement) {

  this._initSubTree();
  
  }


  if (this.itemData) {

  this.addItems(this.itemData);

  }
  
  }
  else if (bLazyLoad) {

  this.cfg.fireQueue();
  
  }

},

_onBeforeRender: function (p_sType, p_aArgs) {

  var oEl = this.element,
  nListElements = this._aListElements.length,
  bFirstList = true,
  i = 0,
  oUL,
  oGroupTitle;

  if (nListElements > 0) {

  do {

  oUL = this._aListElements[i];

  if (oUL) {

  if (bFirstList) {
  
  Dom.addClass(oUL, "first-of-type");
  bFirstList = false;
  
  }


  if (!Dom.isAncestor(oEl, oUL)) {

  this.appendToBody(oUL);

  }


  oGroupTitle = this._aGroupTitleElements[i];

  if (oGroupTitle) {

  if (!Dom.isAncestor(oEl, oGroupTitle)) {

  oUL.parentNode.insertBefore(oGroupTitle, oUL);

  }


  Dom.addClass(oUL, "hastitle");

  }

  }

  i++;

  }
  while(i < nListElements);

  }

},


_onRender: function (p_sType, p_aArgs) {

  if (this.cfg.getProperty("position") == "dynamic") { 

  if (!this.cfg.getProperty("visible")) {

  this.positionOffScreen();

  }
  
  }

},





_onBeforeShow: function (p_sType, p_aArgs) {

  var nOptions,
  n,
  nViewportHeight,
  oRegion,
  oSrcElement;


  if (this.lazyLoad && this.getItemGroups().length === 0) {

  if (this.srcElement) {
  
  this._initSubTree();

  }


  if (this.itemData) {

  if (this.parent && this.parent.parent && 
  this.parent.parent.srcElement && 
  this.parent.parent.srcElement.tagName.toUpperCase() == 
  "SELECT") {

  nOptions = this.itemData.length;
  
  for(n=0; n<nOptions; n++) {

  if (this.itemData[n].tagName) {

  this.addItem((new this.ITEM_TYPE(this.itemData[n])));
  
  }
  
  }
  
  }
  else {

  this.addItems(this.itemData);
  
  }
  
  }


  oSrcElement = this.srcElement;

  if (oSrcElement) {

  if (oSrcElement.tagName.toUpperCase() == "SELECT") {

  if (Dom.inDocument(oSrcElement)) {

  this.render(oSrcElement.parentNode);
  
  }
  else {
  
  this.render(this.cfg.getProperty("container"));
  
  }

  }
  else {

  this.render();

  }

  }
  else {

  if (this.parent) {

  this.render(this.parent.element);  

  }
  else {

  this.render(this.cfg.getProperty("container"));

  }  

  }

  }


  var nMaxHeight = this.cfg.getProperty("maxheight"),
  nMinScrollHeight = this.cfg.getProperty("minscrollheight"),
  bDynamicPos = this.cfg.getProperty("position") == "dynamic";


  if (!this.parent && bDynamicPos) {

  this.cfg.refireEvent("xy");
  
  }


  function clearMaxHeight() {
  
  this.cfg.setProperty("maxheight", 0);
  
  this.hideEvent.unsubscribe(clearMaxHeight);
  
  }


  if (!(this instanceof Buclo.widget.MenuBar) && bDynamicPos) {


  if (nMaxHeight === 0) {

  nViewportHeight = Dom.getViewportHeight();
  
  
  if (this.parent && 
  this.parent.parent instanceof Buclo.widget.MenuBar) {
  
  oRegion = Buclo.util.Region.getRegion(this.parent.element);
  
  nViewportHeight = (nViewportHeight - oRegion.bottom);
  
  }
  
  
  if (this.element.offsetHeight >= nViewportHeight) {
  
  nMaxHeight = (nViewportHeight - (Overlay.VIEWPORT_OFFSET * 2));

  if (nMaxHeight < nMinScrollHeight) {

  nMaxHeight = nMinScrollHeight;
  
  }

  this.cfg.setProperty("maxheight", nMaxHeight);

  this.hideEvent.subscribe(clearMaxHeight);

  }
  
  }

  }

},


_onShow: function (p_sType, p_aArgs) {

  var oParent = this.parent,
  oParentMenu,
  aParentAlignment,
  aAlignment;


  function disableAutoSubmenuDisplay(p_oEvent) {

  var oTarget;

  if (p_oEvent.type == "mousedown" || (p_oEvent.type == "keydown" && 
  p_oEvent.keyCode == 27)) {

  

  oTarget = Event.getTarget(p_oEvent);

  if (oTarget != oParentMenu.element || 
  !Dom.isAncestor(oParentMenu.element, oTarget)) {

  oParentMenu.cfg.setProperty("autosubmenudisplay", false);

  Event.removeListener(document, "mousedown", 
  disableAutoSubmenuDisplay);

  Event.removeListener(document, "keydown", 
  disableAutoSubmenuDisplay);

  }
  
  }

  }


  if (oParent) {

  oParentMenu = oParent.parent;
  aParentAlignment = oParentMenu.cfg.getProperty("submenualignment");
  aAlignment = this.cfg.getProperty("submenualignment");


  if ((aParentAlignment[0] != aAlignment[0]) &&
  (aParentAlignment[1] != aAlignment[1])) {

  this.cfg.setProperty("submenualignment", 
  [aParentAlignment[0], aParentAlignment[1]]);
  
  }


  if (!oParentMenu.cfg.getProperty("autosubmenudisplay") && 
  (oParentMenu instanceof Buclo.widget.MenuBar || 
  oParentMenu.cfg.getProperty("position") == "static")) {

  oParentMenu.cfg.setProperty("autosubmenudisplay", true);

  Event.on(document, "mousedown", disableAutoSubmenuDisplay); 
  Event.on(document, "keydown", disableAutoSubmenuDisplay);

  }

  }

},



_onBeforeHide: function (p_sType, p_aArgs) {

  var oActiveItem = this.activeItem,
  oConfig,
  oSubmenu;

  if (oActiveItem) {

  oConfig = oActiveItem.cfg;

  oConfig.setProperty("selected", false);

  oSubmenu = oConfig.getProperty("submenu");

  if (oSubmenu) {

  oSubmenu.hide();

  }

  }

  if (this.getRoot() == this) {

  this.blur();
  
  }

},


_onParentMenuConfigChange: function (p_sType, p_aArgs, p_oSubmenu) {
  
  var sPropertyName = p_aArgs[0][0],
  oPropertyValue = p_aArgs[0][1];

  switch(sPropertyName) {

  case "iframe":
  case "constraintoviewport":
  case "hidedelay":
  case "showdelay":
  case "submenuhidedelay":
  case "clicktohide":
  case "effect":
  case "classname":
  case "scrollincrement":
  case "minscrollheight":

  p_oSubmenu.cfg.setProperty(sPropertyName, oPropertyValue);
  
  break;  
  
  }
  
},


_onParentMenuRender: function (p_sType, p_aArgs, p_oSubmenu) {

  var oParentCfg = p_oSubmenu.parent.parent.cfg,

  oConfig = {

  constraintoviewport: oParentCfg.getProperty("constraintoviewport"),

  xy: [0,0],

  clicktohide: oParentCfg.getProperty("clicktohide"),
  
  effect: oParentCfg.getProperty("effect"),

  showdelay: oParentCfg.getProperty("showdelay"),
  
  hidedelay: oParentCfg.getProperty("hidedelay"),

  submenuhidedelay: oParentCfg.getProperty("submenuhidedelay"),

  classname: oParentCfg.getProperty("classname"),
  
  scrollincrement: oParentCfg.getProperty("scrollincrement"),
  
  minscrollheight: oParentCfg.getProperty("minscrollheight"),
  
  iframe: oParentCfg.getProperty("iframe")

  },
  
  oLI;


  p_oSubmenu.cfg.applyConfig(oConfig);


  if (!this.lazyLoad) {

  oLI = this.parent.element;

  if (this.element.parentNode == oLI) {
  
  this.render();
  
  }
  else {

  this.render(oLI);
  
  }

  }
  
},


_onSubmenuBeforeShow: function (p_sType, p_aArgs) {

  var oParent = this.parent,
  aAlignment = oParent.parent.cfg.getProperty("submenualignment");


  if (!this.cfg.getProperty("context")) {
  
  this.cfg.setProperty("context", 
  [oParent.element, aAlignment[0], aAlignment[1]]);

  }
  else {

  this.align();
  
  }

},



_onMenuItemFocus: function (p_sType, p_aArgs) {

  this.parent.focusEvent.fire(this);

},


_onMenuItemBlur: function (p_sType, p_aArgs) {

  this.parent.blurEvent.fire(this);

},


_onMenuItemDestroy: function (p_sType, p_aArgs, p_oItem) {

  this._removeItemFromGroupByValue(p_oItem.groupIndex, p_oItem);

},


_onMenuItemConfigChange: function (p_sType, p_aArgs, p_oItem) {

  var sPropertyName = p_aArgs[0][0],
  oPropertyValue = p_aArgs[0][1],
  oSubmenu;


  switch(sPropertyName) {

  case "selected":

  if (oPropertyValue === true) {

  this.activeItem = p_oItem;
  
  }

  break;

  case "submenu":

  oSubmenu = p_aArgs[0][1];

  if (oSubmenu) {

  this._configureSubmenu(p_oItem);

  }

  break;

  }

},





enforceConstraints: function (type, args, obj) {

	Buclo.widget.Menu.superclass.enforceConstraints.apply(this, arguments);
	
	var oParent = this.parent,
		oParentMenu,
		nParentMenuX,
		nNewX,
		nX;
	
	
	if (oParent) {
	
		oParentMenu = oParent.parent;

		if (!(oParentMenu instanceof Buclo.widget.MenuBar)) {
	
			nParentMenuX = oParentMenu.cfg.getProperty("x");
			nX = this.cfg.getProperty("x");
		
	
			if (nX < (nParentMenuX + oParent.element.offsetWidth)) {

				nNewX = (nParentMenuX - this.element.offsetWidth);
			
				this.cfg.setProperty("x", nNewX, true);
				this.cfg.setProperty("xy", [nNewX, (this.cfg.getProperty("y"))], true);
			
			}
		
		}
	
	}

},



configVisible: function (p_sType, p_aArgs, p_oMenu) {

  var bVisible,
  sDisplay;

  if (this.cfg.getProperty("position") == "dynamic") {

  Menu.superclass.configVisible.call(this, p_sType, p_aArgs, p_oMenu);

  }
  else {

  bVisible = p_aArgs[0];
  sDisplay = Dom.getStyle(this.element, "display");

  Dom.setStyle(this.element, "visibility", "visible");

  if (bVisible) {

  if (sDisplay != "block") {
  this.beforeShowEvent.fire();
  Dom.setStyle(this.element, "display", "block");
  this.showEvent.fire();
  }
  
  }
  else {

			if (sDisplay == "block") {
				this.beforeHideEvent.fire();
				Dom.setStyle(this.element, "display", "none");
				this.hideEvent.fire();
			}
  
  }

  }

},



configPosition: function (p_sType, p_aArgs, p_oMenu) {

  var oElement = this.element,
  sCSSPosition = p_aArgs[0] == "static" ? "static" : "absolute",
  oCfg = this.cfg,
  nZIndex;


  Dom.setStyle(oElement, "position", sCSSPosition);


  if (sCSSPosition == "static") {

  
  Dom.setStyle(oElement, "display", "block");

  oCfg.setProperty("visible", true);

  }
  else {

  

  Dom.setStyle(oElement, "visibility", "hidden");
  
  }


  if (sCSSPosition == "absolute") {

  nZIndex = oCfg.getProperty("zindex");

  if (!nZIndex || nZIndex === 0) {

  nZIndex = this.parent ? 
  (this.parent.parent.cfg.getProperty("zindex") + 1) : 1;

  oCfg.setProperty("zindex", nZIndex);

  }

  }

},


configIframe: function (p_sType, p_aArgs, p_oMenu) {  

  if (this.cfg.getProperty("position") == "dynamic") {

  Menu.superclass.configIframe.call(this, p_sType, p_aArgs, p_oMenu);

  }

},



configHideDelay: function (p_sType, p_aArgs, p_oMenu) {

  var nHideDelay = p_aArgs[0],
  oMouseOutEvent = this.mouseOutEvent,
  oMouseOverEvent = this.mouseOverEvent,
  oKeyDownEvent = this.keyDownEvent;

  if (nHideDelay > 0) {

  

  if (!this._bHideDelayEventHandlersAssigned) {

  oMouseOutEvent.subscribe(this._execHideDelay);
  oMouseOverEvent.subscribe(this._cancelHideDelay);
  oKeyDownEvent.subscribe(this._cancelHideDelay);

  this._bHideDelayEventHandlersAssigned = true;
  
  }

  }
  else {

  oMouseOutEvent.unsubscribe(this._execHideDelay);
  oMouseOverEvent.unsubscribe(this._cancelHideDelay);
  oKeyDownEvent.unsubscribe(this._cancelHideDelay);

  this._bHideDelayEventHandlersAssigned = false;

  }

},


configContainer: function (p_sType, p_aArgs, p_oMenu) {

	var oElement = p_aArgs[0];

	if (typeof oElement == 'string') {

  this.cfg.setProperty("container", document.getElementById(oElement), 
  true);

	}

},



_setMaxHeight: function (p_sType, p_aArgs, p_nMaxHeight) {

  this.cfg.setProperty("maxheight", p_nMaxHeight);
  this.renderEvent.unsubscribe(this._setMaxHeight);

},

configMaxHeight: function (p_sType, p_aArgs, p_oMenu) {

  var nMaxHeight = p_aArgs[0],
  oElement = this.element,
  oBody = this.body,
  oHeader = this.header,
  oFooter = this.footer,
  fnMouseOver = this._onScrollTargetMouseOver,
  fnMouseOut = this._onScrollTargetMouseOut,
  nMinScrollHeight = this.cfg.getProperty("minscrollheight"),
  nHeight,
  nOffsetWidth,
  sWidth;


  if (nMaxHeight !== 0 && nMaxHeight < nMinScrollHeight) {
  
  nMaxHeight = nMinScrollHeight;
  
  }


  if (this.lazyLoad && !oBody) {

  this.renderEvent.unsubscribe(this._setMaxHeight);
  
  if (nMaxHeight > 0) {

  this.renderEvent.subscribe(this._setMaxHeight, nMaxHeight, this);

  }

  return;
  
  }


  Dom.setStyle(oBody, "height", "");
  Dom.removeClass(oBody, "yui-menu-body-scrolled");


  

	var bSetWidth = ((UA.gecko && this.parent && this.parent.parent && 
  this.parent.parent.cfg.getProperty("position") == "dynamic") || UA.ie);


  if (bSetWidth) {

		if (!this.cfg.getProperty("width")) {

			nOffsetWidth = oElement.offsetWidth;
	
			
			
			oElement.style.width = nOffsetWidth + "px";
	
			sWidth = (nOffsetWidth - (oElement.offsetWidth - nOffsetWidth)) + "px";
	
			this.cfg.setProperty("width", sWidth);
		
		}

  }


  if (!oHeader && !oFooter) {

  this.setHeader("&#32;");
  this.setFooter("&#32;");

  oHeader = this.header;
  oFooter = this.footer;

  Dom.addClass(oHeader, "topscrollbar");
  Dom.addClass(oFooter, "bottomscrollbar");
  
  oElement.insertBefore(oHeader, oBody);
  oElement.appendChild(oFooter);
  
  }


  nHeight = (nMaxHeight - (oHeader.offsetHeight + oHeader.offsetHeight));


  if (nHeight > 0 && (oBody.offsetHeight > nMaxHeight)) {

  Dom.addClass(oBody, "yui-menu-body-scrolled");
  Dom.setStyle(oBody, "height", (nHeight + "px"));

  Event.on(oHeader, "mouseover", fnMouseOver, this, true);
  Event.on(oHeader, "mouseout", fnMouseOut, this, true);
  Event.on(oFooter, "mouseover", fnMouseOver, this, true);
  Event.on(oFooter, "mouseout", fnMouseOut, this, true);

  this._disableScrollHeader();
  this._enableScrollFooter();

  }
  else if (oHeader && oFooter) {

		if (bSetWidth) {

			this.cfg.setProperty("width", "");
		
		}


  this._enableScrollHeader();
  this._enableScrollFooter();

  Event.removeListener(oHeader, "mouseover", fnMouseOver);
  Event.removeListener(oHeader, "mouseout", fnMouseOut);
  Event.removeListener(oFooter, "mouseover", fnMouseOver);
  Event.removeListener(oFooter, "mouseout", fnMouseOut);

  oElement.removeChild(oHeader);
  oElement.removeChild(oFooter);

  this.header = null;
  this.footer = null;
  
  }

  this.cfg.refireEvent("iframe");

},


configClassName: function (p_sType, p_aArgs, p_oMenu) {

  var sClassName = p_aArgs[0];

  if (this._sClassName) {

  Dom.removeClass(this.element, this._sClassName);

  }

  Dom.addClass(this.element, sClassName);
  this._sClassName = sClassName;

},


_onItemAdded: function (p_sType, p_aArgs) {

  var oItem = p_aArgs[0];
  
  if (oItem) {

  oItem.cfg.setProperty("disabled", true);
  
  }

},


configDisabled: function (p_sType, p_aArgs, p_oMenu) {

  var bDisabled = p_aArgs[0],
  aItems = this.getItems(),
  nItems,
  i;

  if (Lang.isArray(aItems)) {

  nItems = aItems.length;
  
  if (nItems > 0) {
  
  i = nItems - 1;
  
  do {
  
  aItems[i].cfg.setProperty("disabled", bDisabled);
  
  }
  while (i--);
  
  }


  if (bDisabled) {

  this.clearActiveItem(true);

  Dom.addClass(this.element, "disabled");

  this.itemAddedEvent.subscribe(this._onItemAdded);

  }
  else {

  Dom.removeClass(this.element, "disabled");

  this.itemAddedEvent.unsubscribe(this._onItemAdded);

  }
  
  }

},


onRender: function (p_sType, p_aArgs) {

  function sizeShadow() {

  var oElement = this.element,
  oShadow = this._shadow;
  
  if (oShadow && oElement) {


			if (oShadow.style.width && oShadow.style.height) {
			
				oShadow.style.width = "";
				oShadow.style.height = "";
			
			}

  oShadow.style.width = (oElement.offsetWidth + 6) + "px";
  oShadow.style.height = (oElement.offsetHeight + 1) + "px";
  
  }
  
  }


  function replaceShadow() {

  this.element.appendChild(this._shadow);

  }


  function addShadowVisibleClass() {
  
  Dom.addClass(this._shadow, "yui-menu-shadow-visible");
  
  }
  

  function removeShadowVisibleClass() {

  Dom.removeClass(this._shadow, "yui-menu-shadow-visible");
  
  }


  function createShadow() {

  var oShadow = this._shadow,
  oElement,
  me;

  if (!oShadow) {

  oElement = this.element;
  me = this;

  if (!m_oShadowTemplate) {

  m_oShadowTemplate = document.createElement("div");
  m_oShadowTemplate.className = 
  "yui-menu-shadow yui-menu-shadow-visible";
  
  }

  oShadow = m_oShadowTemplate.cloneNode(false);

  oElement.appendChild(oShadow);
  
  this._shadow = oShadow;

  this.beforeShowEvent.subscribe(addShadowVisibleClass);
  this.beforeHideEvent.subscribe(removeShadowVisibleClass);

  if (UA.ie) {
  
  
  
  window.setTimeout(function () { 
  
  sizeShadow.call(me); 
  me.syncIframe();
  
  }, 0);

  this.cfg.subscribeToConfigEvent("width", sizeShadow);
  this.cfg.subscribeToConfigEvent("height", sizeShadow);
  this.cfg.subscribeToConfigEvent("maxheight", sizeShadow);
  this.changeContentEvent.subscribe(sizeShadow);

  Module.textResizeEvent.subscribe(sizeShadow, me, true);
  
  this.destroyEvent.subscribe(function () {
  
  Module.textResizeEvent.unsubscribe(sizeShadow, me);
  
  });
  
  }

  this.cfg.subscribeToConfigEvent("maxheight", replaceShadow);

  }

  }


  function onBeforeShow() {
  
  createShadow.call(this);

  this.beforeShowEvent.unsubscribe(onBeforeShow);
  
  }


  if (this.cfg.getProperty("position") == "dynamic") {

  if (this.cfg.getProperty("visible")) {

  createShadow.call(this);
  
  }
  else {

  this.beforeShowEvent.subscribe(onBeforeShow);
  
  }
  
  }

},





initEvents: function () {

	Menu.superclass.initEvents.call(this);


  var SIGNATURE = CustomEvent.LIST;

  this.mouseOverEvent = this.createEvent(EVENT_TYPES.MOUSE_OVER);
  this.mouseOverEvent.signature = SIGNATURE;

  this.mouseOutEvent = this.createEvent(EVENT_TYPES.MOUSE_OUT);
  this.mouseOutEvent.signature = SIGNATURE;
  
  this.mouseDownEvent = this.createEvent(EVENT_TYPES.MOUSE_DOWN);
  this.mouseDownEvent.signature = SIGNATURE;

  this.mouseUpEvent = this.createEvent(EVENT_TYPES.MOUSE_UP);
  this.mouseUpEvent.signature = SIGNATURE;
  
  this.clickEvent = this.createEvent(EVENT_TYPES.CLICK);
  this.clickEvent.signature = SIGNATURE;
  
  this.keyPressEvent = this.createEvent(EVENT_TYPES.KEY_PRESS);
  this.keyPressEvent.signature = SIGNATURE;
  
  this.keyDownEvent = this.createEvent(EVENT_TYPES.KEY_DOWN);
  this.keyDownEvent.signature = SIGNATURE;
  
  this.keyUpEvent = this.createEvent(EVENT_TYPES.KEY_UP);
  this.keyUpEvent.signature = SIGNATURE;
  
  this.focusEvent = this.createEvent(EVENT_TYPES.FOCUS);
  this.focusEvent.signature = SIGNATURE;
  
  this.blurEvent = this.createEvent(EVENT_TYPES.BLUR);
  this.blurEvent.signature = SIGNATURE;
  
  this.itemAddedEvent = this.createEvent(EVENT_TYPES.ITEM_ADDED);
  this.itemAddedEvent.signature = SIGNATURE;
  
  this.itemRemovedEvent = this.createEvent(EVENT_TYPES.ITEM_REMOVED);
  this.itemRemovedEvent.signature = SIGNATURE;

},


positionOffScreen: function () {

  var oIFrame = this.iframe,
  aPos = this.OFF_SCREEN_POSITION;

  Dom.setXY(this.element, aPos);
  
  if (oIFrame) {

  Dom.setXY(oIFrame, aPos);
  
  }

},



getRoot: function () {

  var oItem = this.parent,
  oParentMenu;

  if (oItem) {

  oParentMenu = oItem.parent;

  return oParentMenu ? oParentMenu.getRoot() : this;

  }
  else {
  
  return this;
  
  }

},


toString: function () {

  var sReturnVal = "Menu",
  sId = this.id;

  if (sId) {

  sReturnVal += (" " + sId);
  
  }

  return sReturnVal;

},

setItemGroupTitle: function (p_sGroupTitle, p_nGroupIndex) {

  var nGroupIndex,
  oTitle,
  i,
  nFirstIndex;
  
  if (typeof p_sGroupTitle == "string" && p_sGroupTitle.length > 0) {

  nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0;
  oTitle = this._aGroupTitleElements[nGroupIndex];


  if (oTitle) {

  oTitle.innerHTML = p_sGroupTitle;
  
  }
  else {

  oTitle = document.createElement(this.GROUP_TITLE_TAG_NAME);
  
  oTitle.innerHTML = p_sGroupTitle;

  this._aGroupTitleElements[nGroupIndex] = oTitle;

  }


  i = this._aGroupTitleElements.length - 1;

  do {

  if (this._aGroupTitleElements[i]) {

  Dom.removeClass(this._aGroupTitleElements[i], "first-of-type");

  nFirstIndex = i;

  }

  }
  while(i--);


  if (nFirstIndex !== null) {

  Dom.addClass(this._aGroupTitleElements[nFirstIndex], 
  "first-of-type");

  }

  this.changeContentEvent.fire();

  }

},



addItem: function (p_oItem, p_nGroupIndex) {

  if (p_oItem) {

  return this._addItemToGroup(p_nGroupIndex, p_oItem);
  
  }

},


addItems: function (p_aItems, p_nGroupIndex) {

  var nItems,
  aItems,
  oItem,
  i;

  if (Lang.isArray(p_aItems)) {

  nItems = p_aItems.length;
  aItems = [];

  for(i=0; i<nItems; i++) {

  oItem = p_aItems[i];

  if (oItem) {

  if (Lang.isArray(oItem)) {
  
  aItems[aItems.length] = this.addItems(oItem, i);
  
  }
  else {
  
  aItems[aItems.length] = 
  this._addItemToGroup(p_nGroupIndex, oItem);
  
  }

  }
  
  }


  if (aItems.length) {
  
  return aItems;
  
  }

  }

},


insertItem: function (p_oItem, p_nItemIndex, p_nGroupIndex) {
  
  if (p_oItem) {

  return this._addItemToGroup(p_nGroupIndex, p_oItem, p_nItemIndex);

  }

},


removeItem: function (p_oObject, p_nGroupIndex) {

  var oItem;
  
  if (typeof p_oObject != "undefined") {

  if (p_oObject instanceof Buclo.widget.MenuItem) {

  oItem = this._removeItemFromGroupByValue(p_nGroupIndex, p_oObject);  

  }
  else if (typeof p_oObject == "number") {

  oItem = this._removeItemFromGroupByIndex(p_nGroupIndex, p_oObject);

  }

  if (oItem) {

  oItem.destroy();


  return oItem;

  }

  }

},


getItems: function () {

  var aGroups = this._aItemGroups,
  nGroups,
  aItems = [];

  if (Lang.isArray(aGroups)) {

  nGroups = aGroups.length;

  return ((nGroups == 1) ? aGroups[0] : 
  (Array.prototype.concat.apply(aItems, aGroups)));

  }

},



getItemGroups: function () {

  return this._aItemGroups;

},


getItem: function (p_nItemIndex, p_nGroupIndex) {
  
  var aGroup;
  
  if (typeof p_nItemIndex == "number") {

  aGroup = this._getItemGroup(p_nGroupIndex);

  if (aGroup) {

  return aGroup[p_nItemIndex];
  
  }

  }
  
},


getSubmenus: function () {

  var aItems = this.getItems(),
  nItems = aItems.length,
  aSubmenus,
  oSubmenu,
  oItem,
  i;


  if (nItems > 0) {
  
  aSubmenus = [];

  for(i=0; i<nItems; i++) {

  oItem = aItems[i];
  
  if (oItem) {

  oSubmenu = oItem.cfg.getProperty("submenu");
  
  if (oSubmenu) {

  aSubmenus[aSubmenus.length] = oSubmenu;

  }
  
  }
  
  }
  
  }

  return aSubmenus;

},


clearContent: function () {

  var aItems = this.getItems(),
  nItems = aItems.length,
  oElement = this.element,
  oBody = this.body,
  oHeader = this.header,
  oFooter = this.footer,
  oItem,
  oSubmenu,
  i;


  if (nItems > 0) {

  i = nItems - 1;

  do {

  oItem = aItems[i];

  if (oItem) {

  oSubmenu = oItem.cfg.getProperty("submenu");

  if (oSubmenu) {

  this.cfg.configChangedEvent.unsubscribe(
  this._onParentMenuConfigChange, oSubmenu);

  this.renderEvent.unsubscribe(this._onParentMenuRender, 
  oSubmenu);

  }
  
  this.removeItem(oItem);

  }
  
  }
  while(i--);

  }


  if (oHeader) {

  Event.purgeElement(oHeader);
  oElement.removeChild(oHeader);

  }
  

  if (oFooter) {

  Event.purgeElement(oFooter);
  oElement.removeChild(oFooter);
  }


  if (oBody) {

  Event.purgeElement(oBody);

  oBody.innerHTML = "";

  }

  this.activeItem = null;

  this._aItemGroups = [];
  this._aListElements = [];
  this._aGroupTitleElements = [];

  this.cfg.setProperty("width", null);

},


destroy: function () {


  this.clearContent();

  this._aItemGroups = null;
  this._aListElements = null;
  this._aGroupTitleElements = null;



  Menu.superclass.destroy.call(this);
  

},


setInitialFocus: function () {

  var oItem = this._getFirstEnabledItem();
  
  if (oItem) {

  oItem.focus();

  }
  
},



setInitialSelection: function () {

  var oItem = this._getFirstEnabledItem();
  
  if (oItem) {
  
  oItem.cfg.setProperty("selected", true);
  }  

},



clearActiveItem: function (p_bBlur) {

  if (this.cfg.getProperty("showdelay") > 0) {
  
  this._cancelShowDelay();
  
  }


  var oActiveItem = this.activeItem,
  oConfig,
  oSubmenu;

  if (oActiveItem) {

  oConfig = oActiveItem.cfg;

  if (p_bBlur) {

  oActiveItem.blur();
  
  }

  oConfig.setProperty("selected", false);

  oSubmenu = oConfig.getProperty("submenu");

  if (oSubmenu) {

  oSubmenu.hide();

  }

  this.activeItem = null;  

  }

},



focus: function () {

  if (!this.hasFocus()) {

  this.setInitialFocus();
  
  }

},



blur: function () {

  var oItem;

  if (this.hasFocus()) {
  
  oItem = MenuManager.getFocusedMenuItem();
  
  if (oItem) {

  oItem.blur();

  }

  }

},


hasFocus: function () {

  return (MenuManager.getFocusedMenu() == this.getRoot());

},


subscribe: function () {

  function onItemAdded(p_sType, p_aArgs, p_oObject) {

  var oItem = p_aArgs[0],
  oSubmenu = oItem.cfg.getProperty("submenu");

  if (oSubmenu) {

  oSubmenu.subscribe.apply(oSubmenu, p_oObject);

  }
  
  }


  function onSubmenuAdded(p_sType, p_aArgs, p_oObject) { 
  
  var oSubmenu = this.cfg.getProperty("submenu");
  
  if (oSubmenu) {

  oSubmenu.subscribe.apply(oSubmenu, p_oObject);
  
  }
  
  }


  Menu.superclass.subscribe.apply(this, arguments);
  Menu.superclass.subscribe.call(this, "itemAdded", onItemAdded, arguments);


  var aItems = this.getItems(),
  nItems,
  oItem,
  oSubmenu,
  i;
  

  if (aItems) {

  nItems = aItems.length;
  
  if (nItems > 0) {
  
  i = nItems - 1;
  
  do {

  oItem = aItems[i];
  
  oSubmenu = oItem.cfg.getProperty("submenu");
  
  if (oSubmenu) {
  
  oSubmenu.subscribe.apply(oSubmenu, arguments);
  
  }
  else {
  
  oItem.cfg.subscribeToConfigEvent("submenu", onSubmenuAdded, arguments);
  
  }

  }
  while (i--);
  
  }

  }

},



initDefaultConfig: function () {

  Menu.superclass.initDefaultConfig.call(this);

  var oConfig = this.cfg;



  



  
  

 



  
  oConfig.addProperty(
  DEFAULT_CONFIG.VISIBLE.key, 
  {
  handler: this.configVisible, 
  value: DEFAULT_CONFIG.VISIBLE.value, 
  validator: DEFAULT_CONFIG.VISIBLE.validator
 }
 );


  
  oConfig.addProperty(
  DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.key, 
  {
  handler: this.configConstrainToViewport, 
  value: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.value, 
  validator: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.validator, 
  supercedes: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.supercedes 
  } 
  );


 
  oConfig.addProperty(
  DEFAULT_CONFIG.POSITION.key, 
  {
  handler: this.configPosition,
  value: DEFAULT_CONFIG.POSITION.value, 
  validator: DEFAULT_CONFIG.POSITION.validator,
  supercedes: DEFAULT_CONFIG.POSITION.supercedes
  }
  );


  
  oConfig.addProperty(
  DEFAULT_CONFIG.SUBMENU_ALIGNMENT.key, 
  { 
  value: DEFAULT_CONFIG.SUBMENU_ALIGNMENT.value,
  suppressEvent: DEFAULT_CONFIG.SUBMENU_ALIGNMENT.suppressEvent
  }
  );


  
	oConfig.addProperty(
	  DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.key, 
	  { 
	  value: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.value, 
	  validator: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.validator,
	  suppressEvent: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.suppressEvent
  } 
  );


  
	oConfig.addProperty(
	  DEFAULT_CONFIG.SHOW_DELAY.key, 
	  { 
	  value: DEFAULT_CONFIG.SHOW_DELAY.value, 
	  validator: DEFAULT_CONFIG.SHOW_DELAY.validator,
	  suppressEvent: DEFAULT_CONFIG.SHOW_DELAY.suppressEvent
  } 
  );


  
	oConfig.addProperty(
	  DEFAULT_CONFIG.HIDE_DELAY.key, 
	  { 
	  handler: this.configHideDelay,
	  value: DEFAULT_CONFIG.HIDE_DELAY.value, 
	  validator: DEFAULT_CONFIG.HIDE_DELAY.validator, 
	  suppressEvent: DEFAULT_CONFIG.HIDE_DELAY.suppressEvent
  } 
  );


  
	oConfig.addProperty(
	  DEFAULT_CONFIG.SUBMENU_HIDE_DELAY.key, 
	  { 
	  value: DEFAULT_CONFIG.SUBMENU_HIDE_DELAY.value, 
	  validator: DEFAULT_CONFIG.SUBMENU_HIDE_DELAY.validator,
	  suppressEvent: DEFAULT_CONFIG.SUBMENU_HIDE_DELAY.suppressEvent
  } 
  );


  
  oConfig.addProperty(
  DEFAULT_CONFIG.CLICK_TO_HIDE.key,
  {
  value: DEFAULT_CONFIG.CLICK_TO_HIDE.value,
  validator: DEFAULT_CONFIG.CLICK_TO_HIDE.validator,
  suppressEvent: DEFAULT_CONFIG.CLICK_TO_HIDE.suppressEvent
  }
  );


	
	oConfig.addProperty(
	  DEFAULT_CONFIG.CONTAINER.key, 
	  { 
	  handler: this.configContainer,
	  value: document.body,
  suppressEvent: DEFAULT_CONFIG.CONTAINER.suppressEvent
  } 
  );


  
  oConfig.addProperty(
  DEFAULT_CONFIG.SCROLL_INCREMENT.key, 
  { 
  value: DEFAULT_CONFIG.SCROLL_INCREMENT.value, 
  validator: DEFAULT_CONFIG.SCROLL_INCREMENT.validator,
  supercedes: DEFAULT_CONFIG.SCROLL_INCREMENT.supercedes,
  suppressEvent: DEFAULT_CONFIG.SCROLL_INCREMENT.suppressEvent
  }
  );


 
  oConfig.addProperty(
  DEFAULT_CONFIG.MIN_SCROLL_HEIGHT.key, 
  { 
  value: DEFAULT_CONFIG.MIN_SCROLL_HEIGHT.value, 
  validator: DEFAULT_CONFIG.MIN_SCROLL_HEIGHT.validator,
  supercedes: DEFAULT_CONFIG.MIN_SCROLL_HEIGHT.supercedes,
  suppressEvent: DEFAULT_CONFIG.MIN_SCROLL_HEIGHT.suppressEvent
  }
  );


  
  oConfig.addProperty(
  DEFAULT_CONFIG.MAX_HEIGHT.key, 
  {
  handler: this.configMaxHeight,
  value: DEFAULT_CONFIG.MAX_HEIGHT.value,
  validator: DEFAULT_CONFIG.MAX_HEIGHT.validator,
  suppressEvent: DEFAULT_CONFIG.MAX_HEIGHT.suppressEvent,
  supercedes: DEFAULT_CONFIG.MAX_HEIGHT.supercedes  
  } 
  );


  
  oConfig.addProperty(
  DEFAULT_CONFIG.CLASS_NAME.key, 
  { 
  handler: this.configClassName,
  value: DEFAULT_CONFIG.CLASS_NAME.value, 
  validator: DEFAULT_CONFIG.CLASS_NAME.validator,
  supercedes: DEFAULT_CONFIG.CLASS_NAME.supercedes 
  }
  );


  
  oConfig.addProperty(
  DEFAULT_CONFIG.DISABLED.key, 
  { 
  handler: this.configDisabled,
  value: DEFAULT_CONFIG.DISABLED.value, 
  validator: DEFAULT_CONFIG.DISABLED.validator,
  suppressEvent: DEFAULT_CONFIG.DISABLED.suppressEvent
  }
  );

}

}); // END Buclo.lang.extend

})();



(function () {



Buclo.widget.MenuItem = function (p_oObject, p_oConfig) {

  if (p_oObject) {

  if (p_oConfig) {
  
  this.parent = p_oConfig.parent;
  this.value = p_oConfig.value;
  this.id = p_oConfig.id;

  }

  this.init(p_oObject, p_oConfig);

  }

};


var Dom = Buclo.util.Dom,
  Module = Buclo.widget.Module,
  Menu = Buclo.widget.Menu,
  MenuItem = Buclo.widget.MenuItem,
  CustomEvent = Buclo.util.CustomEvent,
  Lang = Buclo.lang,

  m_oMenuItemTemplate,

  EVENT_TYPES = {
  
  "MOUSE_OVER": "mouseover",
  "MOUSE_OUT": "mouseout",
  "MOUSE_DOWN": "mousedown",
  "MOUSE_UP": "mouseup",
  "CLICK": "click",
  "KEY_PRESS": "keypress",
  "KEY_DOWN": "keydown",
  "KEY_UP": "keyup",
  "ITEM_ADDED": "itemAdded",
  "ITEM_REMOVED": "itemRemoved",
  "FOCUS": "focus",
  "BLUR": "blur",
  "DESTROY": "destroy"
  
  },

  
  DEFAULT_CONFIG = {
  
  "TEXT": { 
  key: "text", 
  value: "", 
  validator: Lang.isString, 
  suppressEvent: true 
  }, 
  
  "HELP_TEXT": { 
  key: "helptext",
  supercedes: ["text"], 
  suppressEvent: true 
  },
  
  "URL": { 
  key: "url", 
  value: "#", 
  suppressEvent: true 
  }, 
  
  "TARGET": { 
  key: "target", 
  suppressEvent: true 
  }, 
  
  "EMPHASIS": { 
  key: "emphasis", 
  value: false, 
  validator: Lang.isBoolean, 
  suppressEvent: true, 
  supercedes: ["text"]
  }, 
  
  "STRONG_EMPHASIS": { 
  key: "strongemphasis", 
  value: false, 
  validator: Lang.isBoolean, 
  suppressEvent: true,
  supercedes: ["text"]
  },
  
  "CHECKED": { 
  key: "checked", 
  value: false, 
  validator: Lang.isBoolean, 
  suppressEvent: true, 
  supercedes: ["disabled", "selected"]
  }, 

  "SUBMENU": { 
  key: "submenu",
  suppressEvent: true,
  supercedes: ["disabled", "selected"]
  },
  
  "DISABLED": { 
  key: "disabled", 
  value: false, 
  validator: Lang.isBoolean, 
  suppressEvent: true,
  supercedes: ["text", "selected"]
  },
  
  "SELECTED": { 
  key: "selected", 
  value: false, 
  validator: Lang.isBoolean, 
  suppressEvent: true
  },
  
  "ONCLICK": { 
  key: "onclick",
  suppressEvent: true
  },
  
  "CLASS_NAME": { 
  key: "classname", 
  value: null, 
  validator: Lang.isString,
  suppressEvent: true
  }
  
  };


MenuItem.prototype = {

  
  CSS_CLASS_NAME: "yuimenuitem",


  
  CSS_LABEL_CLASS_NAME: "yuimenuitemlabel",


 
  SUBMENU_TYPE: null,



  

 
  _oAnchor: null,
  
  
  
  _oHelpTextEM: null,
  
  
  
  _oSubmenu: null,


  
  _oOnclickAttributeValue: null,


  
  _sClassName: null,





	
	constructor: MenuItem,


 
  index: null,


  
  groupIndex: null,


  
  parent: null,


  
  element: null,


  
  srcElement: null,


  
  value: null,


	
	browser: Module.prototype.browser,


  
  id: null,





  
  destroyEvent: null,


  
  mouseOverEvent: null,


  
  mouseOutEvent: null,


  
  mouseDownEvent: null,


  mouseUpEvent: null,


  
  clickEvent: null,


  
  keyPressEvent: null,


  
  keyDownEvent: null,


  
  keyUpEvent: null,


  
  focusEvent: null,


 
  blurEvent: null,


  
  init: function (p_oObject, p_oConfig) {


  if (!this.SUBMENU_TYPE) {
  
  this.SUBMENU_TYPE = Menu;
  
  }



  this.cfg = new Buclo.util.Config(this);

  this.initDefaultConfig();

  var SIGNATURE = CustomEvent.LIST,
  oConfig = this.cfg,
  sURL = "#",
  oAnchor,
  sTarget,
  sText,
  sId;


  if (Lang.isString(p_oObject)) {

  this._createRootNodeStructure();

  oConfig.queueProperty("text", p_oObject);

  }
  else if (p_oObject && p_oObject.tagName) {

  switch(p_oObject.tagName.toUpperCase()) {

  case "OPTION":

  this._createRootNodeStructure();

  oConfig.queueProperty("text", p_oObject.text);
  oConfig.queueProperty("disabled", p_oObject.disabled);

  this.value = p_oObject.value;

  this.srcElement = p_oObject;

  break;

  case "OPTGROUP":

  this._createRootNodeStructure();

  oConfig.queueProperty("text", p_oObject.label);
  oConfig.queueProperty("disabled", p_oObject.disabled);

  this.srcElement = p_oObject;

  this._initSubTree();

  break;

  case "LI":

  
  oAnchor = Dom.getFirstChild(p_oObject);



  if (oAnchor) {

  sURL = oAnchor.getAttribute("href", 2);
  sTarget = oAnchor.getAttribute("target");

  sText = oAnchor.innerHTML;

  }

  this.srcElement = p_oObject;
  this.element = p_oObject;
  this._oAnchor = oAnchor;

  

  oConfig.setProperty("text", sText, true);
  oConfig.setProperty("url", sURL, true);
  oConfig.setProperty("target", sTarget, true);

  this._initSubTree();

  break;

  }  

  }


  if (this.element) {

  sId = (this.srcElement || this.element).id;

  if (!sId) {

  sId = this.id || Dom.generateId();

  this.element.id = sId;

  }

  this.id = sId;


  Dom.addClass(this.element, this.CSS_CLASS_NAME);
  Dom.addClass(this._oAnchor, this.CSS_LABEL_CLASS_NAME);



  this.mouseOverEvent = this.createEvent(EVENT_TYPES.MOUSE_OVER);
  this.mouseOverEvent.signature = SIGNATURE;

  this.mouseOutEvent = this.createEvent(EVENT_TYPES.MOUSE_OUT);
  this.mouseOutEvent.signature = SIGNATURE;

  this.mouseDownEvent = this.createEvent(EVENT_TYPES.MOUSE_DOWN);
  this.mouseDownEvent.signature = SIGNATURE;

  this.mouseUpEvent = this.createEvent(EVENT_TYPES.MOUSE_UP);
  this.mouseUpEvent.signature = SIGNATURE;

  this.clickEvent = this.createEvent(EVENT_TYPES.CLICK);
  this.clickEvent.signature = SIGNATURE;

  this.keyPressEvent = this.createEvent(EVENT_TYPES.KEY_PRESS);
  this.keyPressEvent.signature = SIGNATURE;

  this.keyDownEvent = this.createEvent(EVENT_TYPES.KEY_DOWN);
  this.keyDownEvent.signature = SIGNATURE;

  this.keyUpEvent = this.createEvent(EVENT_TYPES.KEY_UP);
  this.keyUpEvent.signature = SIGNATURE;

  this.focusEvent = this.createEvent(EVENT_TYPES.FOCUS);
  this.focusEvent.signature = SIGNATURE;

  this.blurEvent = this.createEvent(EVENT_TYPES.BLUR);
  this.blurEvent.signature = SIGNATURE;

  this.destroyEvent = this.createEvent(EVENT_TYPES.DESTROY);
  this.destroyEvent.signature = SIGNATURE;

  if (p_oConfig) {
  
  oConfig.applyConfig(p_oConfig);
  
  }  

  oConfig.fireQueue();

  }

  },





 
  _createRootNodeStructure: function () {

  var oElement,
  oAnchor;

  if (!m_oMenuItemTemplate) {

  m_oMenuItemTemplate = document.createElement("li");
  m_oMenuItemTemplate.innerHTML = "<a href=\"#\"></a>";

  }

  oElement = m_oMenuItemTemplate.cloneNode(true);
  oElement.className = this.CSS_CLASS_NAME;

  oAnchor = oElement.firstChild;
  oAnchor.className = this.CSS_LABEL_CLASS_NAME;
  
  this.element = oElement;
  this._oAnchor = oAnchor;

  },


  
  _initSubTree: function () {

  var oSrcEl = this.srcElement,
  oConfig = this.cfg,
  oNode,
  aOptions,
  nOptions,
  oMenu,
  n;


  if (oSrcEl.childNodes.length > 0) {

  if (this.parent.lazyLoad && this.parent.srcElement && 
  this.parent.srcElement.tagName.toUpperCase() == "SELECT") {

  oConfig.setProperty(
  "submenu", 
  { id: Dom.generateId(), itemdata: oSrcEl.childNodes }
  );

  }
  else {

  oNode = oSrcEl.firstChild;
  aOptions = [];
  
  do {
  
  if (oNode && oNode.tagName) {
  
  switch(oNode.tagName.toUpperCase()) {
  
  case "DIV":
  
  oConfig.setProperty("submenu", oNode);
  
  break;
 
  case "OPTION":
  
  aOptions[aOptions.length] = oNode;
  
  break;
  
  }
  
  }
  
  }  
  while((oNode = oNode.nextSibling));
  
  
  nOptions = aOptions.length;
  
  if (nOptions > 0) {
  
  oMenu = new this.SUBMENU_TYPE(Dom.generateId());
  
  oConfig.setProperty("submenu", oMenu);
  
  for(n=0; n<nOptions; n++) {
  
  oMenu.addItem((new oMenu.ITEM_TYPE(aOptions[n])));
  
  }
  
  }
  
  }

  }

  },





  
  configText: function (p_sType, p_aArgs, p_oItem) {

  var sText = p_aArgs[0],
  oConfig = this.cfg,
  oAnchor = this._oAnchor,
  sHelpText = oConfig.getProperty("helptext"),
  sHelpTextHTML = "",
  sEmphasisStartTag = "",
  sEmphasisEndTag = "";


  if (sText) {


  if (sHelpText) {
  
  sHelpTextHTML = "<em class=\"helptext\">" + sHelpText + "</em>";
  
  }


  if (oConfig.getProperty("emphasis")) {

  sEmphasisStartTag = "<em>";
  sEmphasisEndTag = "</em>";

  }


  if (oConfig.getProperty("strongemphasis")) {

  sEmphasisStartTag = "<strong>";
  sEmphasisEndTag = "</strong>";
  
  }


  oAnchor.innerHTML = (sEmphasisStartTag + sText + 
  sEmphasisEndTag + sHelpTextHTML);

  }

  },


  
  configHelpText: function (p_sType, p_aArgs, p_oItem) {

  this.cfg.refireEvent("text");

  },


  
  configURL: function (p_sType, p_aArgs, p_oItem) {

  var sURL = p_aArgs[0];

  if (!sURL) {

  sURL = "#";

  }

  var oAnchor = this._oAnchor;

  if (Buclo.env.ua.opera) {

  oAnchor.removeAttribute("href");
  
  }

  oAnchor.setAttribute("href", sURL);

  },


  
  configTarget: function (p_sType, p_aArgs, p_oItem) {

  var sTarget = p_aArgs[0],
  oAnchor = this._oAnchor;

  if (sTarget && sTarget.length > 0) {

  oAnchor.setAttribute("target", sTarget);

  }
  else {

  oAnchor.removeAttribute("target");
  
  }

  },


  
  configEmphasis: function (p_sType, p_aArgs, p_oItem) {

  var bEmphasis = p_aArgs[0],
  oConfig = this.cfg;


  if (bEmphasis && oConfig.getProperty("strongemphasis")) {

  oConfig.setProperty("strongemphasis", false);

  }


  oConfig.refireEvent("text");

  },


 
  configStrongEmphasis: function (p_sType, p_aArgs, p_oItem) {

  var bStrongEmphasis = p_aArgs[0],
  oConfig = this.cfg;


  if (bStrongEmphasis && oConfig.getProperty("emphasis")) {

  oConfig.setProperty("emphasis", false);

  }

  oConfig.refireEvent("text");

  },


  
  configChecked: function (p_sType, p_aArgs, p_oItem) {

  var bChecked = p_aArgs[0],
  oElement = this.element,
  oAnchor = this._oAnchor,
  oConfig = this.cfg,
  sState = "-checked",
  sClassName = this.CSS_CLASS_NAME + sState,
  sLabelClassName = this.CSS_LABEL_CLASS_NAME + sState;


  if (bChecked) {

  Dom.addClass(oElement, sClassName);
  Dom.addClass(oAnchor, sLabelClassName);

  }
  else {

  Dom.removeClass(oElement, sClassName);
  Dom.removeClass(oAnchor, sLabelClassName);
  
  }


  oConfig.refireEvent("text");


  if (oConfig.getProperty("disabled")) {

  oConfig.refireEvent("disabled");

  }


  if (oConfig.getProperty("selected")) {

  oConfig.refireEvent("selected");

  }

  },



  
  configDisabled: function (p_sType, p_aArgs, p_oItem) {

  var bDisabled = p_aArgs[0],
  oConfig = this.cfg,
  oSubmenu = oConfig.getProperty("submenu"),
  bChecked = oConfig.getProperty("checked"),
  oElement = this.element,
  oAnchor = this._oAnchor,
  sState = "-disabled",
  sCheckedState = "-checked" + sState,
  sSubmenuState = "-hassubmenu" + sState,
  sClassName = this.CSS_CLASS_NAME + sState,
  sLabelClassName = this.CSS_LABEL_CLASS_NAME + sState,
  sCheckedClassName = this.CSS_CLASS_NAME + sCheckedState,
  sLabelCheckedClassName = this.CSS_LABEL_CLASS_NAME + sCheckedState,
  sSubmenuClassName = this.CSS_CLASS_NAME + sSubmenuState,
  sLabelSubmenuClassName = this.CSS_LABEL_CLASS_NAME + sSubmenuState;


  if (bDisabled) {

  if (oConfig.getProperty("selected")) {

  oConfig.setProperty("selected", false);

  }

  Dom.addClass(oElement, sClassName);
  Dom.addClass(oAnchor, sLabelClassName);


  if (oSubmenu) {

  Dom.addClass(oElement, sSubmenuClassName);
  Dom.addClass(oAnchor, sLabelSubmenuClassName);
  
  }
  

  if (bChecked) {

  Dom.addClass(oElement, sCheckedClassName);
  Dom.addClass(oAnchor, sLabelCheckedClassName);

  }

  }
  else {

  Dom.removeClass(oElement, sClassName);
  Dom.removeClass(oAnchor, sLabelClassName);


  if (oSubmenu) {

  Dom.removeClass(oElement, sSubmenuClassName);
  Dom.removeClass(oAnchor, sLabelSubmenuClassName);
  
  }
  

  if (bChecked) {

  Dom.removeClass(oElement, sCheckedClassName);
  Dom.removeClass(oAnchor, sLabelCheckedClassName);

  }

  }

  },


  
  configSelected: function (p_sType, p_aArgs, p_oItem) {

  var oConfig = this.cfg,
  bSelected = p_aArgs[0],
  oElement = this.element,
  oAnchor = this._oAnchor,
  bChecked = oConfig.getProperty("checked"),
  oSubmenu = oConfig.getProperty("submenu"),
  sState = "-selected",
  sCheckedState = "-checked" + sState,
  sSubmenuState = "-hassubmenu" + sState,
  sClassName = this.CSS_CLASS_NAME + sState,
  sLabelClassName = this.CSS_LABEL_CLASS_NAME + sState,
  sCheckedClassName = this.CSS_CLASS_NAME + sCheckedState,
  sLabelCheckedClassName = this.CSS_LABEL_CLASS_NAME + sCheckedState,
  sSubmenuClassName = this.CSS_CLASS_NAME + sSubmenuState,
  sLabelSubmenuClassName = this.CSS_LABEL_CLASS_NAME + sSubmenuState;


  if (Buclo.env.ua.opera) {

  oAnchor.blur();
  
  }


  if (bSelected && !oConfig.getProperty("disabled")) {

  Dom.addClass(oElement, sClassName);
  Dom.addClass(oAnchor, sLabelClassName);


  if (oSubmenu) {

  Dom.addClass(oElement, sSubmenuClassName);
  Dom.addClass(oAnchor, sLabelSubmenuClassName);
  
  }


  if (bChecked) {

  Dom.addClass(oElement, sCheckedClassName);
  Dom.addClass(oAnchor, sLabelCheckedClassName);

  }

  }
  else {

  Dom.removeClass(oElement, sClassName);
  Dom.removeClass(oAnchor, sLabelClassName);


  if (oSubmenu) {

  Dom.removeClass(oElement, sSubmenuClassName);
  Dom.removeClass(oAnchor, sLabelSubmenuClassName);
  
  }

  
  if (bChecked) {

  Dom.removeClass(oElement, sCheckedClassName);
  Dom.removeClass(oAnchor, sLabelCheckedClassName);

  }

  }


  if (this.hasFocus() && Buclo.env.ua.opera) {
  
  oAnchor.focus();
  
  }

  },


  
  _onSubmenuBeforeHide: function (p_sType, p_aArgs) {

  var oItem = this.parent,
  oMenu;

  function onHide() {

  oItem._oAnchor.blur();
  oMenu.beforeHideEvent.unsubscribe(onHide);
  
  }


  if (oItem.hasFocus()) {

  oMenu = oItem.parent;

  oMenu.beforeHideEvent.subscribe(onHide);
  
  }
  
  },


  
  configSubmenu: function (p_sType, p_aArgs, p_oItem) {

  var oSubmenu = p_aArgs[0],
  oConfig = this.cfg,
  oElement = this.element,
  oAnchor = this._oAnchor,
  bLazyLoad = this.parent && this.parent.lazyLoad,
  sState = "-hassubmenu",
  sClassName = this.CSS_CLASS_NAME + sState,
  sLabelClassName = this.CSS_LABEL_CLASS_NAME + sState,
  oMenu,
  sSubmenuId,
  oSubmenuConfig;


  if (oSubmenu) {

  if (oSubmenu instanceof Menu) {

  oMenu = oSubmenu;
  oMenu.parent = this;
  oMenu.lazyLoad = bLazyLoad;

  }
  else if (typeof oSubmenu == "object" && oSubmenu.id && 
  !oSubmenu.nodeType) {

  sSubmenuId = oSubmenu.id;
  oSubmenuConfig = oSubmenu;

  oSubmenuConfig.lazyload = bLazyLoad;
  oSubmenuConfig.parent = this;

  oMenu = new this.SUBMENU_TYPE(sSubmenuId, oSubmenuConfig);



  oConfig.setProperty("submenu", oMenu, true);

  }
  else {

  oMenu = new this.SUBMENU_TYPE(oSubmenu,
  { lazyload: bLazyLoad, parent: this });


  
  oConfig.setProperty("submenu", oMenu, true);

  }


  if (oMenu) {

  Dom.addClass(oElement, sClassName);
  Dom.addClass(oAnchor, sLabelClassName);

  this._oSubmenu = oMenu;

  if (Buclo.env.ua.opera) {
  
  oMenu.beforeHideEvent.subscribe(this._onSubmenuBeforeHide);  
  
  }
  
  }

  }
  else {

  Dom.removeClass(oElement, sClassName);
  Dom.removeClass(oAnchor, sLabelClassName);

  if (this._oSubmenu) {

  this._oSubmenu.destroy();

  }

  }


  if (oConfig.getProperty("disabled")) {

  oConfig.refireEvent("disabled");

  }


  if (oConfig.getProperty("selected")) {

  oConfig.refireEvent("selected");

  }

  },


  
  configOnClick: function (p_sType, p_aArgs, p_oItem) {

  var oObject = p_aArgs[0];

  

  if (this._oOnclickAttributeValue && 
  (this._oOnclickAttributeValue != oObject)) {

  this.clickEvent.unsubscribe(this._oOnclickAttributeValue.fn, 
  this._oOnclickAttributeValue.obj);

  this._oOnclickAttributeValue = null;

  }


  if (!this._oOnclickAttributeValue && typeof oObject == "object" && 
  typeof oObject.fn == "function") {
  
  this.clickEvent.subscribe(oObject.fn, 
  ((!Buclo.lang.isUndefined(oObject.obj)) ? oObject.obj : this), 
  oObject.scope);

  this._oOnclickAttributeValue = oObject;

  }
  
  },


  
  configClassName: function (p_sType, p_aArgs, p_oItem) {
  
  var sClassName = p_aArgs[0];
  
  if (this._sClassName) {
  
  Dom.removeClass(this.element, this._sClassName);
  
  }
  
  Dom.addClass(this.element, sClassName);
  this._sClassName = sClassName;
  
  },





	
	initDefaultConfig : function () {

  var oConfig = this.cfg;



  
  oConfig.addProperty(
  DEFAULT_CONFIG.TEXT.key, 
  { 
  handler: this.configText, 
  value: DEFAULT_CONFIG.TEXT.value, 
  validator: DEFAULT_CONFIG.TEXT.validator, 
  suppressEvent: DEFAULT_CONFIG.TEXT.suppressEvent 
  }
  );
  

  
  oConfig.addProperty(
  DEFAULT_CONFIG.HELP_TEXT.key,
  {
  handler: this.configHelpText, 
  supercedes: DEFAULT_CONFIG.HELP_TEXT.supercedes,
  suppressEvent: DEFAULT_CONFIG.HELP_TEXT.suppressEvent 
  }
  );


  
  oConfig.addProperty(
  DEFAULT_CONFIG.URL.key, 
  {
  handler: this.configURL, 
  value: DEFAULT_CONFIG.URL.value, 
  suppressEvent: DEFAULT_CONFIG.URL.suppressEvent
  }
  );


  
  oConfig.addProperty(
  DEFAULT_CONFIG.TARGET.key, 
  {
  handler: this.configTarget, 
  suppressEvent: DEFAULT_CONFIG.TARGET.suppressEvent
  }
  );


 
  oConfig.addProperty(
  DEFAULT_CONFIG.EMPHASIS.key, 
  { 
  handler: this.configEmphasis, 
  value: DEFAULT_CONFIG.EMPHASIS.value, 
  validator: DEFAULT_CONFIG.EMPHASIS.validator, 
  suppressEvent: DEFAULT_CONFIG.EMPHASIS.suppressEvent,
  supercedes: DEFAULT_CONFIG.EMPHASIS.supercedes
  }
  );


  
  oConfig.addProperty(
  DEFAULT_CONFIG.STRONG_EMPHASIS.key,
  {
  handler: this.configStrongEmphasis,
  value: DEFAULT_CONFIG.STRONG_EMPHASIS.value,
  validator: DEFAULT_CONFIG.STRONG_EMPHASIS.validator,
  suppressEvent: DEFAULT_CONFIG.STRONG_EMPHASIS.suppressEvent,
  supercedes: DEFAULT_CONFIG.STRONG_EMPHASIS.supercedes
  }
  );


  
  oConfig.addProperty(
  DEFAULT_CONFIG.CHECKED.key, 
  {
  handler: this.configChecked, 
  value: DEFAULT_CONFIG.CHECKED.value, 
  validator: DEFAULT_CONFIG.CHECKED.validator, 
  suppressEvent: DEFAULT_CONFIG.CHECKED.suppressEvent,
  supercedes: DEFAULT_CONFIG.CHECKED.supercedes
  } 
  );


  
  oConfig.addProperty(
  DEFAULT_CONFIG.DISABLED.key,
  {
  handler: this.configDisabled,
  value: DEFAULT_CONFIG.DISABLED.value,
  validator: DEFAULT_CONFIG.DISABLED.validator,
  suppressEvent: DEFAULT_CONFIG.DISABLED.suppressEvent
  }
  );


  
  oConfig.addProperty(
  DEFAULT_CONFIG.SELECTED.key,
  {
  handler: this.configSelected,
  value: DEFAULT_CONFIG.SELECTED.value,
  validator: DEFAULT_CONFIG.SELECTED.validator,
  suppressEvent: DEFAULT_CONFIG.SELECTED.suppressEvent
  }
  );


  
  oConfig.addProperty(
  DEFAULT_CONFIG.SUBMENU.key, 
  {
  handler: this.configSubmenu, 
  supercedes: DEFAULT_CONFIG.SUBMENU.supercedes,
  suppressEvent: DEFAULT_CONFIG.SUBMENU.suppressEvent
  }
  );


  
  oConfig.addProperty(
  DEFAULT_CONFIG.ONCLICK.key, 
  {
  handler: this.configOnClick, 
  suppressEvent: DEFAULT_CONFIG.ONCLICK.suppressEvent 
  }
  );


  
  oConfig.addProperty(
  DEFAULT_CONFIG.CLASS_NAME.key, 
  { 
  handler: this.configClassName,
  value: DEFAULT_CONFIG.CLASS_NAME.value, 
  validator: DEFAULT_CONFIG.CLASS_NAME.validator,
  suppressEvent: DEFAULT_CONFIG.CLASS_NAME.suppressEvent 
  }
  );

	},


  
  getNextEnabledSibling: function () {

  var nGroupIndex,
  aItemGroups,
  oNextItem,
  nNextGroupIndex,
  aNextGroup;

  function getNextArrayItem(p_aArray, p_nStartIndex) {

  return p_aArray[p_nStartIndex] || 
  getNextArrayItem(p_aArray, (p_nStartIndex+1));

  }

  if (this.parent instanceof Menu) {

  nGroupIndex = this.groupIndex;
  
  aItemGroups = this.parent.getItemGroups();
  
  if (this.index < (aItemGroups[nGroupIndex].length - 1)) {
  
  oNextItem = getNextArrayItem(aItemGroups[nGroupIndex], 
  (this.index+1));
  
  }
  else {
  
  if (nGroupIndex < (aItemGroups.length - 1)) {
  
  nNextGroupIndex = nGroupIndex + 1;
  
  }
  else {
  
  nNextGroupIndex = 0;
  
  }
  
  aNextGroup = getNextArrayItem(aItemGroups, nNextGroupIndex);
  
  
  oNextItem = getNextArrayItem(aNextGroup, 0);
  
  }
  
  return (oNextItem.cfg.getProperty("disabled") || 
  oNextItem.element.style.display == "none") ? 
  oNextItem.getNextEnabledSibling() : oNextItem;

  }

  },


  
  getPreviousEnabledSibling: function () {

  var nGroupIndex,
  aItemGroups,
  oPreviousItem,
  nPreviousGroupIndex,
  aPreviousGroup;

  function getPreviousArrayItem(p_aArray, p_nStartIndex) {

  return p_aArray[p_nStartIndex] || 
  getPreviousArrayItem(p_aArray, (p_nStartIndex-1));

  }

  function getFirstItemIndex(p_aArray, p_nStartIndex) {

  return p_aArray[p_nStartIndex] ? p_nStartIndex : 
  getFirstItemIndex(p_aArray, (p_nStartIndex+1));

  }

  if (this.parent instanceof Menu) {

  nGroupIndex = this.groupIndex;
  aItemGroups = this.parent.getItemGroups();

  
  if (this.index > getFirstItemIndex(aItemGroups[nGroupIndex], 0)) {
  
  oPreviousItem = getPreviousArrayItem(aItemGroups[nGroupIndex], 
  (this.index-1));
  
  }
  else {
  
  if (nGroupIndex > getFirstItemIndex(aItemGroups, 0)) {
  
  nPreviousGroupIndex = nGroupIndex - 1;
  
  }
  else {
  
  nPreviousGroupIndex = aItemGroups.length - 1;
  
  }
  
  aPreviousGroup = getPreviousArrayItem(aItemGroups, 
  nPreviousGroupIndex);
  
  oPreviousItem = getPreviousArrayItem(aPreviousGroup, 
  (aPreviousGroup.length - 1));
  
  }

  return (oPreviousItem.cfg.getProperty("disabled") || 
  oPreviousItem.element.style.display == "none") ? 
  oPreviousItem.getPreviousEnabledSibling() : oPreviousItem;

  }

  },


 
  focus: function () {

  var oParent = this.parent,
  oAnchor = this._oAnchor,
  oActiveItem = oParent.activeItem,
  me = this;


  function setFocus() {

  try {

  if (Buclo.env.ua.ie && !document.hasFocus()) {
  
  return;
  
  }

  if (oActiveItem) {
  
  oActiveItem.blurEvent.fire();
  
  }

  oAnchor.focus();
  
  me.focusEvent.fire();

  }
  catch(e) {
  
  }

  }


  if (!this.cfg.getProperty("disabled") && oParent && 
  oParent.cfg.getProperty("visible") && 
  this.element.style.display != "none") {


 

  window.setTimeout(setFocus, 0);

  }

  },


  
  blur: function () {

  var oParent = this.parent;

  if (!this.cfg.getProperty("disabled") && oParent && 
  oParent.cfg.getProperty("visible")) {


  var me = this;
  
  window.setTimeout(function () {

  try {
  
  me._oAnchor.blur();
  me.blurEvent.fire();  

  } 
  catch (e) {
  
  }
  
  }, 0);

  }

  },


  
  hasFocus: function () {
  
  return (Buclo.widget.MenuManager.getFocusedMenuItem() == this);
  
  },


	
  destroy: function () {

  var oEl = this.element,
  oSubmenu,
  oParentNode;

  if (oEl) {



  oSubmenu = this.cfg.getProperty("submenu");

  if (oSubmenu) {
  
  oSubmenu.destroy();
  
  }


  
  this.mouseOverEvent.unsubscribeAll();
  this.mouseOutEvent.unsubscribeAll();
  this.mouseDownEvent.unsubscribeAll();
  this.mouseUpEvent.unsubscribeAll();
  this.clickEvent.unsubscribeAll();
  this.keyPressEvent.unsubscribeAll();
  this.keyDownEvent.unsubscribeAll();
  this.keyUpEvent.unsubscribeAll();
  this.focusEvent.unsubscribeAll();
  this.blurEvent.unsubscribeAll();
  this.cfg.configChangedEvent.unsubscribeAll();



  oParentNode = oEl.parentNode;

  if (oParentNode) {

  oParentNode.removeChild(oEl);

  this.destroyEvent.fire();

  }

  this.destroyEvent.unsubscribeAll();

  }

  },


  
  toString: function () {

  var sReturnVal = "MenuItem",
  sId = this.id;

  if (sId) {
  
  sReturnVal += (" " + sId);
  
  }

  return sReturnVal;
  
  }

};

Lang.augmentProto(MenuItem, Buclo.util.EventProvider);

})();
(function () {


Buclo.widget.ContextMenu = function(p_oElement, p_oConfig) {

  Buclo.widget.ContextMenu.superclass.constructor.call(this, 
  p_oElement, p_oConfig);

};


var Event = Buclo.util.Event,
  ContextMenu = Buclo.widget.ContextMenu,



  
  EVENT_TYPES = {

  "TRIGGER_CONTEXT_MENU": "triggerContextMenu",
  "CONTEXT_MENU": (Buclo.env.ua.opera ? "mousedown" : "contextmenu"),
  "CLICK": "click"

  },
  
  
  
  DEFAULT_CONFIG = {
  
  "TRIGGER": { 
  key: "trigger",
  suppressEvent: true
  }
  
  };


function position(p_sType, p_aArgs, p_aPos) {

  this.cfg.setProperty("xy", p_aPos);
  
  this.beforeShowEvent.unsubscribe(position, p_aPos);

}


Buclo.lang.extend(ContextMenu, Buclo.widget.Menu, {






_oTrigger: null,


_bCancelled: false,





contextEventTarget: null,





triggerContextMenuEvent: null,



init: function(p_oElement, p_oConfig) {



  ContextMenu.superclass.init.call(this, p_oElement);


  this.beforeInitEvent.fire(ContextMenu);


  if(p_oConfig) {

  this.cfg.applyConfig(p_oConfig, true);

  }
  
  
  this.initEvent.fire(ContextMenu);
  
},



initEvents: function() {

	ContextMenu.superclass.initEvents.call(this);


  this.triggerContextMenuEvent = 
  this.createEvent(EVENT_TYPES.TRIGGER_CONTEXT_MENU);

  this.triggerContextMenuEvent.signature = Buclo.util.CustomEvent.LIST;

},


cancel: function() {

  this._bCancelled = true;

},






_removeEventHandlers: function() {

  var oTrigger = this._oTrigger;



  if (oTrigger) {

  Event.removeListener(oTrigger, EVENT_TYPES.CONTEXT_MENU, 
  this._onTriggerContextMenu);  
  
  if(Buclo.env.ua.opera) {
  
  Event.removeListener(oTrigger, EVENT_TYPES.CLICK, 
  this._onTriggerClick);
  
  }

  }

},







_onTriggerClick: function(p_oEvent, p_oMenu) {

  if(p_oEvent.ctrlKey) {
  
  Event.stopEvent(p_oEvent);

  }
  
},



_onTriggerContextMenu: function(p_oEvent, p_oMenu) {

  if (p_oEvent.type == "mousedown" && !p_oEvent.ctrlKey) {

  return;

  }


  var aXY;


  

  Event.stopEvent(p_oEvent);


  this.contextEventTarget = Event.getTarget(p_oEvent);

  this.triggerContextMenuEvent.fire(p_oEvent);



  Buclo.widget.MenuManager.hideVisible();
  


  if(!this._bCancelled) {


  aXY = Event.getXY(p_oEvent);


  if (!Buclo.util.Dom.inDocument(this.element)) {

  this.beforeShowEvent.subscribe(position, aXY);

  }
  else {

  this.cfg.setProperty("xy", aXY);
  
  }


  this.show();

  }

  this._bCancelled = false;

},






toString: function() {

  var sReturnVal = "ContextMenu",
  sId = this.id;

  if(sId) {

  sReturnVal += (" " + sId);
  
  }

  return sReturnVal;

},


initDefaultConfig: function() {

  ContextMenu.superclass.initDefaultConfig.call(this);

  
  this.cfg.addProperty(DEFAULT_CONFIG.TRIGGER.key, 
  {
  handler: this.configTrigger, 
  suppressEvent: DEFAULT_CONFIG.TRIGGER.suppressEvent 
  }
  );

},


destroy: function() {


  this._removeEventHandlers();



  ContextMenu.superclass.destroy.call(this);

},






configTrigger: function(p_sType, p_aArgs, p_oMenu) {
  
  var oTrigger = p_aArgs[0];

  if(oTrigger) {

  

  if(this._oTrigger) {
  
  this._removeEventHandlers();

  }

  this._oTrigger = oTrigger;


  
 
  Event.on(oTrigger, EVENT_TYPES.CONTEXT_MENU, 
  this._onTriggerContextMenu, this, true);


  

  if(Buclo.env.ua.opera) {
  
  Event.on(oTrigger, EVENT_TYPES.CLICK, this._onTriggerClick, 
  this, true);

  }

  }
  else {
  
  this._removeEventHandlers();
  
  }
  
}

}); // END Buclo.lang.extend

}());



Buclo.widget.ContextMenuItem = Buclo.widget.MenuItem;
(function () {


Buclo.widget.MenuBar = function(p_oElement, p_oConfig) {

  Buclo.widget.MenuBar.superclass.constructor.call(this, 
  p_oElement, p_oConfig);

};



function checkPosition(p_sPosition) {

  if (typeof p_sPosition == "string") {

  return ("dynamic,static".indexOf((p_sPosition.toLowerCase())) != -1);

  }

}


var Event = Buclo.util.Event,
  MenuBar = Buclo.widget.MenuBar,

  
  DEFAULT_CONFIG = {
  
  "POSITION": { 
  key: "position", 
  value: "static", 
  validator: checkPosition, 
  supercedes: ["visible"] 
  }, 
  
  "SUBMENU_ALIGNMENT": { 
  key: "submenualignment", 
  value: ["tl","bl"],
  suppressEvent: true 
  },
  
  "AUTO_SUBMENU_DISPLAY": { 
  key: "autosubmenudisplay", 
  value: false, 
  validator: Buclo.lang.isBoolean,
  suppressEvent: true
  }
  
  };



Buclo.lang.extend(MenuBar, Buclo.widget.Menu, {

init: function(p_oElement, p_oConfig) {

  if(!this.ITEM_TYPE) {

  this.ITEM_TYPE = Buclo.widget.MenuBarItem;

  }



  MenuBar.superclass.init.call(this, p_oElement);


  this.beforeInitEvent.fire(MenuBar);


  if(p_oConfig) {

  this.cfg.applyConfig(p_oConfig, true);

  }

  this.initEvent.fire(MenuBar);

},





CSS_CLASS_NAME: "yuimenubar",





_onKeyDown: function(p_sType, p_aArgs, p_oMenuBar) {

  var oEvent = p_aArgs[0],
  oItem = p_aArgs[1],
  oSubmenu,
  oItemCfg,
  oNextItem;


  if(oItem && !oItem.cfg.getProperty("disabled")) {

  oItemCfg = oItem.cfg;

  switch(oEvent.keyCode) {
  
  case 37:  // Left arrow
  case 39:  // Right arrow
  
  if(oItem == this.activeItem && 
  !oItemCfg.getProperty("selected")) {
  
  oItemCfg.setProperty("selected", true);
  
  }
  else {
  
  oNextItem = (oEvent.keyCode == 37) ? 
  oItem.getPreviousEnabledSibling() : 
  oItem.getNextEnabledSibling();
  
  if(oNextItem) {
  
  this.clearActiveItem();
  
  oNextItem.cfg.setProperty("selected", true);
  
  
  if(this.cfg.getProperty("autosubmenudisplay")) {
  
  oSubmenu = oNextItem.cfg.getProperty("submenu");
  
  if(oSubmenu) {
  
  oSubmenu.show();
  
  }
  
  }  
  
  oNextItem.focus();
  
  }
  
  }
  
  Event.preventDefault(oEvent);
  
  break;
  
  case 40:  // Down arrow
  
  if(this.activeItem != oItem) {
  
  this.clearActiveItem();
  
  oItemCfg.setProperty("selected", true);
  oItem.focus();
  
  }
  
  oSubmenu = oItemCfg.getProperty("submenu");
  
  if(oSubmenu) {
  
  if(oSubmenu.cfg.getProperty("visible")) {
  
  oSubmenu.setInitialSelection();
  oSubmenu.setInitialFocus();
  
  }
  else {
  
  oSubmenu.show();
  
  }
  
  }
  
  Event.preventDefault(oEvent);
  
  break;
  
  }

  }


  if(oEvent.keyCode == 27 && this.activeItem) { // Esc key

  oSubmenu = this.activeItem.cfg.getProperty("submenu");

  if(oSubmenu && oSubmenu.cfg.getProperty("visible")) {
  
  oSubmenu.hide();
  this.activeItem.focus();
  
  }
  else {

  this.activeItem.cfg.setProperty("selected", false);
  this.activeItem.blur();
  
  }

  Event.preventDefault(oEvent);
  
  }

},


_onClick: function(p_sType, p_aArgs, p_oMenuBar) {

  MenuBar.superclass._onClick.call(this, p_sType, p_aArgs, p_oMenuBar);

  var oItem = p_aArgs[1],
  oEvent,
  oTarget,
  oActiveItem,
  oConfig,
  oSubmenu;
  

  if(oItem && !oItem.cfg.getProperty("disabled")) {

  oEvent = p_aArgs[0];
  oTarget = Event.getTarget(oEvent);
  oActiveItem = this.activeItem;
  oConfig = this.cfg;


  
  if(oActiveItem && oActiveItem != oItem) {
  
  this.clearActiveItem();
  
  }

  
  oItem.cfg.setProperty("selected", true);
  

  
  oSubmenu = oItem.cfg.getProperty("submenu");


  if(oSubmenu) {
  
  if(oSubmenu.cfg.getProperty("visible")) {
  
  oSubmenu.hide();
  
  }
  else {
  
  oSubmenu.show();  
  
  }
  
  }
  
  }

},





toString: function() {

  var sReturnVal = "MenuBar",
  sId = this.id;

  if(sId) {

  sReturnVal += (" " + sId);
  
  }

  return sReturnVal;

},



initDefaultConfig: function() {

  MenuBar.superclass.initDefaultConfig.call(this);

  var oConfig = this.cfg;



  
  oConfig.addProperty(
  DEFAULT_CONFIG.POSITION.key, 
  {
  handler: this.configPosition, 
  value: DEFAULT_CONFIG.POSITION.value, 
  validator: DEFAULT_CONFIG.POSITION.validator,
  supercedes: DEFAULT_CONFIG.POSITION.supercedes
  }
  );


 
  oConfig.addProperty(
  DEFAULT_CONFIG.SUBMENU_ALIGNMENT.key, 
  {
  value: DEFAULT_CONFIG.SUBMENU_ALIGNMENT.value,
  suppressEvent: DEFAULT_CONFIG.SUBMENU_ALIGNMENT.suppressEvent
  }
  );


  
	oConfig.addProperty(
	  DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.key, 
	  {
	  value: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.value, 
	  validator: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.validator,
	  suppressEvent: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.suppressEvent
  } 
  );

}
 
}); // END Buclo.lang.extend

}());



Buclo.widget.MenuBarItem = function(p_oObject, p_oConfig) {

  Buclo.widget.MenuBarItem.superclass.constructor.call(this, 
  p_oObject, p_oConfig);

};

Buclo.lang.extend(Buclo.widget.MenuBarItem, Buclo.widget.MenuItem, {



init: function(p_oObject, p_oConfig) {

  if(!this.SUBMENU_TYPE) {

  this.SUBMENU_TYPE = Buclo.widget.Menu;

  }


  

  Buclo.widget.MenuBarItem.superclass.init.call(this, p_oObject); 


  var oConfig = this.cfg;

  if(p_oConfig) {

  oConfig.applyConfig(p_oConfig, true);

  }

  oConfig.fireQueue();

},






CSS_CLASS_NAME: "yuimenubaritem",


CSS_LABEL_CLASS_NAME: "yuimenubaritemlabel",





toString: function() {

  var sReturnVal = "MenuBarItem";

  if(this.cfg && this.cfg.getProperty("text")) {

  sReturnVal += (": " + this.cfg.getProperty("text"));

  }

  return sReturnVal;

}
  
}); // END Buclo.lang.extend
Buclo.register("menu", Buclo.widget.Menu, {version: "2.5.2", build: "1076"});


