function PopupMenu(id, zIndex, dxShadow) { var _this = this; this.menu_id = id; this.controlDiv = null; this.zIndex = 100; this.dxShadow = 3; this.menuItems = null; this.submenus = []; this.bDoHide = false; this.parentItem = null; this.parentMenu = null; this.submenuIndex = null; this.bHasSubmenus = false; this.OnClose = null; if(!isNaN(zIndex)) this.zIndex = zIndex; if(!isNaN(dxShadow)) this.dxShadow = dxShadow; this.Create = function(zIndex, dxShadow) { if(!isNaN(zIndex)) this.zIndex = zIndex; if(!isNaN(dxShadow)) this.dxShadow = dxShadow; var div = document.createElement("DIV"); div.id = this.menu_id; div.className = "bx-popup-menu"; div.style.position = 'absolute'; div.style.zIndex = this.zIndex; div.style.left = '-1000px'; div.style.top = '-1000px'; div.style.visibility = 'hidden'; div.onclick = _this.PreventDefault; document.body.appendChild(div); div.innerHTML = ''+ ''+ '
'+ ''+ ''+ '
'+ '
'; } this.ClearItemsStyle = function() { var tbl = document.getElementById(this.menu_id+'_items'); for(var i=0; i= posLeft && x <= posRight && y >= posTop && y <= posBottom) return false; if(_this.controlDiv) { var pos = jsUtils.GetRealPos(_this.controlDiv); if(x >= pos['left'] && x <= pos['right'] && y >= pos['top'] && y <= pos['bottom']) return false; } _this.PopupHide(); return true; } this.OnKeyPress = function(e) { if(!e) e = window.event if(!e) return; if(e.keyCode == 27) _this.PopupHide(); } this.PreventDefault = function(e) { if(!e) e = window.event; if(e.stopPropagation) { e.preventDefault(); e.stopPropagation(); } else { e.cancelBubble = true; e.returnValue = false; } return false; } this.GetItemIndex = function(item) { var item_id = _this.menu_id+'_item_'; var item_index = parseInt(item.id.substr(item_id.length)); return item_index; } this.ShowSubmenu = function(item, bMouseOver, bDontShow) { if(!item) item = this; var item_index = _this.GetItemIndex(item); if(bMouseOver == true) { if(!_this.menuItems[item_index]["__time"]) return; var dxTime = (new Date()).valueOf() - _this.menuItems[item_index]["__time"]; if(dxTime < 500) return; } var menu; if(!_this.submenus[item_index]) { menu = new PopupMenu(_this.menu_id+'_sub_'+item_index); menu.Create(_this.zIndex+10, _this.dxShadow); menu.SetItems(_this.menuItems[item_index].MENU); menu.BuildItems(); menu.parentItem = document.getElementById(_this.menu_id+'_item_'+item_index); menu.parentMenu = _this; menu.OnClose = function() { jsUtils.addEvent(document, "keypress", _this.OnKeyPress); } _this.submenus[item_index] = menu; if(_this.menuItems[item_index].ONMENUPOPUP) eval(_this.menuItems[item_index].ONMENUPOPUP); } else menu = _this.submenus[item_index]; _this.submenuIndex = item_index; if(menu.IsVisible() || bDontShow == true) return; var item_pos = jsUtils.GetRealPos(item); var menu_pos = jsUtils.GetRealPos(document.getElementById(_this.menu_id)); var pos = {'left': menu_pos["right"]-1, 'right': menu_pos["left"]+1, 'top': item_pos["bottom"]+1, 'bottom': item_pos["top"]}; jsUtils.removeEvent(document, "keypress", _this.OnKeyPress); menu.controlDiv = item; menu.PopupShow(pos); } this.OnSubmenuMouseOver = function() { _this.OnItemMouseOver(this); var item_index = _this.GetItemIndex(this); if(!_this.menuItems[item_index]["__time"]) _this.menuItems[item_index]["__time"] = (new Date()).valueOf(); var div = this; setTimeout(function(){_this.ShowSubmenu(div, true)}, 550); } this.OnItemMouseOver = function(item) { if(_this.bHasSubmenus) _this.ClearItemsStyle(); var div = (item? item:this); div.className="popupitem popupitemover"; if(_this.parentItem) { _this.bDoHide = false; if(_this.parentItem.className != "popupitem popupitemover") { _this.parentMenu.ClearItemsStyle(); _this.parentItem.className = "popupitem popupitemover"; } } if(_this.submenuIndex != null) { var item_index = _this.GetItemIndex(div); if(_this.submenuIndex != item_index && _this.submenus[_this.submenuIndex]) { _this.submenus[_this.submenuIndex].bDoHide = true; setTimeout(function(){_this.HideSubmenu()}, 500); } } } this.OnSubmenuMouseOut = function() { var item_index = _this.GetItemIndex(this); _this.menuItems[item_index]["__time"] = null; } this.OnItemMouseOut = function() { this.className="popupitem"; } this.HideSubmenu = function() { if(_this.submenuIndex == null) return; if(_this.submenus[_this.submenuIndex].bDoHide != true) return; _this.submenus[_this.submenuIndex].PopupHide(); } this.SetItems = function(items) { this.menuItems = items; this.submenus = []; } this.SetItemIcon = function(item_id, icon) { if(typeof(item_id) == 'string' || item_id instanceof String) { for(var i in this.menuItems) { if(this.menuItems[i].ID && this.menuItems[i].ID == item_id) { this.menuItems[i].ICONCLASS = icon; var item_td = document.getElementById(item_id); if(item_td) { var div = jsUtils.FindChildObject(item_td, "div"); if(div) div.className = "icon "+icon; } break; } } } else { var div = jsUtils.FindChildObject(jsUtils.FindChildObject(item_id, "td", "gutter", true), "div"); if(div) { this.menuItems[this.GetItemIndex(item_id)].ICONCLASS = icon; div.className = "icon "+icon; } } } this.SetAllItemsIcon = function(icon) { for(var i=0, n=this.menuItems.length; i < n; i++) { var item = document.getElementById(this.menu_id+'_item_'+i); var div = jsUtils.FindChildObject(jsUtils.FindChildObject(item, "td", "gutter", true), "div"); if(div) { this.menuItems[i].ICONCLASS = icon; div.className = "icon "+icon; } } } this.BuildItems = function() { var items = this.menuItems; if(!items || items.length == 0) return; var div = document.getElementById(this.menu_id); if(!div) { this.Create(); div = document.getElementById(this.menu_id); } div.style.left='-1000px'; div.style.top='-1000px'; div.style.width='auto'; this.bHasSubmenus = false; var tbl = document.getElementById(this.menu_id+'_items'); while(tbl.rows.length>0) tbl.deleteRow(0); var n = items.length; for(var i=0; i'+ '
'+ ' '+ ' '+ ' '; if(items[i]['MENU']) s += ''; s += ' '+ '
'+items[i]['TEXT']+'
'; cell.innerHTML = s; if(items[i]['DISABLED']!=true) { var item_div = jsUtils.FindChildObject(cell, "div"); if(items[i]['MENU']) { item_div.onclick = function(){_this.ShowSubmenu(this)}; item_div.onmouseover = _this.OnSubmenuMouseOver; item_div.onmouseout = _this.OnSubmenuMouseOut; this.bHasSubmenus = true; } else { item_div.onmouseover = function(){_this.OnItemMouseOver(this)}; item_div.onmouseout = _this.OnItemMouseOut; if(items[i]['ONCLICK'] && (items[i]['AUTOHIDE'] == null || items[i]['AUTOHIDE'] == true)) jsUtils.addEvent(item_div, "click", function(){_this.PopupHide();}); } } items[i]['__id'] = this.menu_id+'_item_'+i; } } div.style.width = tbl.parentNode.offsetWidth; } this.GetItemInfo = function(item) { var td = jsUtils.FindChildObject(item, "td", "item", true); if(td) { var icon = ''; var icon_div = jsUtils.FindChildObject(jsUtils.FindChildObject(item, "td", "gutter", true), "div"); //
if(icon_div.className.length > 5) icon = icon_div.className.substr(5); return {'TEXT': td.innerHTML, 'TITLE':td.title, 'ICON':icon}; } return null; } this.GetMenuByItemId = function(item_id) { for(var i = 0, length = this.menuItems.length; i < length; i++) if(this.menuItems[i]['__id'] && this.menuItems[i]['__id'] == item_id) return this; var menu; for(var i = 0, length = this.submenus.length; i < length; i++) if(this.submenus[i] && (menu = this.submenus[i].GetMenuByItemId(item_id)) != false) return menu; return false; } this.IsVisible = function() { var div = document.getElementById(this.menu_id); if(div) return (div.style.visibility != 'hidden'); return false; } this.ShowMenu = function(control, items, bFixed, dPos, userFunc) { if(this.controlDiv == control) { this.PopupHide(); } else { if(this.IsVisible()) this.PopupHide(); if(items) { this.SetItems(items); this.BuildItems(); } control.className += ' pressed bx-pressed'; var pos = window.BX ? BX.pos(control) : jsUtils.GetRealPos(control); if(dPos) { pos["left"] += dPos["left"]; pos["right"] += dPos["right"]; pos["top"] += dPos["top"]; pos["bottom"] += dPos["bottom"]; } else pos["bottom"]+= 2; if(bFixed == true && !jsUtils.IsIE()) { var arScroll = jsUtils.GetWindowScrollPos(); pos["top"] += arScroll.scrollTop; pos["bottom"] += arScroll.scrollTop; pos["left"] += arScroll.scrollLeft; pos["right"] += arScroll.scrollLeft; } this.controlDiv = control; this.OnClose = function() { control.className = control.className.replace(/\s*pressed bx-pressed/ig, ""); if(userFunc) userFunc(); } this.PopupShow(pos); } } }