1 Rico.Menu = Class.create();
3 Rico.Menu.prototype = {
5 initialize: function(options) {
6 Object.extend(this, new Rico.Popup());
7 Object.extend(this.options, {
9 margin : 6 // account for shadow
11 if (typeof options=='string')
12 this.options.width=options;
14 Object.extend(this.options, options || {});
16 this.highlightElem=null;
17 new Image().src = Rico.imgDir+'left.gif';
18 new Image().src = Rico.imgDir+'right.gif';
21 createDiv: function(parentNode) {
23 this.div = document.createElement('div');
24 this.div.className = Prototype.Browser.WebKit ? 'ricoMenuSafari' : 'ricoMenu';
25 this.div.style.position="absolute";
26 this.div.style.width=this.options.width;
27 if (!parentNode) parentNode = document.getElementsByTagName("body")[0];
28 parentNode.appendChild(this.div);
29 this.width=this.div.offsetWidth
30 this.setDiv(this.div,this.cancelmenu.bindAsEventListener(this));
31 this.direction=Element.getStyle(this.div,'direction') || 'ltr';
32 this.direction=this.direction.toLowerCase(); // ltr or rtl
37 showmenu: function(e,hideFunc){
39 this.hideFunc=hideFunc;
40 if (this.div.childNodes.length==0) {
44 this.openmenu(e.clientX,e.clientY,0,0);
47 openmenu: function(x,y,clickItemWi,clickItemHt) {
48 var newLeft=RicoUtil.docScrollLeft()+x;
49 //window.status='openmenu: newLeft='+newLeft+' width='+this.width+' windowWi='+RicoUtil.windowWidth();
50 if (this.direction == 'rtl') {
51 if (newLeft > this.width+clickItemWi) newLeft-=this.width+clickItemWi;
53 if (x+this.width+this.options.margin > RicoUtil.windowWidth()) newLeft-=this.width+clickItemWi;
55 var newTop=RicoUtil.docScrollTop()+y;
56 this.div.style.visibility="hidden";
57 this.div.style.display="block";
58 var contentHt=this.div.offsetHeight;
59 if (y+contentHt+this.options.margin > RicoUtil.windowHeight())
60 newTop=Math.max(newTop-contentHt+clickItemHt,0);
61 this.openPopup(newLeft,newTop);
62 this.div.style.visibility ="visible";
66 clearMenu: function() {
67 this.div.innerHTML="";
68 this.defaultAction=null;
72 addMenuHeading: function(hdg,translate) {
73 var el=document.createElement('div')
74 el.innerHTML =(translate==null || translate==true) ? RicoTranslate.getPhrase(hdg) : hdg;
75 el.className='ricoMenuHeading';
76 this.div.appendChild(el);
79 addMenuBreak: function() {
80 var brk=document.createElement('div');
81 brk.className="ricoMenuBreak";
82 this.div.appendChild(brk);
85 addSubMenuItem: function(menutext, submenu, translate) {
86 var dir=this.direction=='rtl' ? 'left' : 'right';
87 var a=this.addMenuItem(menutext,null,true,null,translate);
88 a.className='ricoSubMenu';
89 a.style.backgroundImage='url('+Rico.imgDir+dir+'.gif)';
90 a.style.backgroundRepeat='no-repeat';
91 a.style.backgroundPosition=dir;
92 a.onmouseover=this.showSubMenu.bind(this,a,submenu);
93 a.onmouseout=this.subMenuOut.bindAsEventListener(this);
96 showSubMenu: function(a,submenu) {
97 if (this.openSubMenu) this.hideSubMenu();
98 this.openSubMenu=submenu;
99 this.openMenuAnchor=a;
100 var pos=Position.page(a);
101 if (a.className=='ricoSubMenu') a.className='ricoSubMenuOpen';
102 submenu.openmenu(pos[0]+a.offsetWidth, pos[1], a.offsetWidth-2, a.offsetHeight+2);
105 subMenuOut: function(e) {
106 if (!this.openSubMenu) return;
108 var elem=Event.element(e);
109 var reltg = (e.relatedTarget) ? e.relatedTarget : e.toElement;
111 while (reltg != null && reltg != this.openSubMenu.div)
112 reltg=reltg.parentNode;
114 if (reltg == this.openSubMenu.div) return;
118 hideSubMenu: function() {
119 if (this.openMenuAnchor) {
120 this.openMenuAnchor.className='ricoSubMenu';
121 this.openMenuAnchor=null;
123 if (this.openSubMenu) {
124 this.openSubMenu.hidemenu();
125 this.openSubMenu=null;
129 addMenuItem: function(menutext,action,enabled,title,translate,target) {
131 if (translate==null) translate=true;
132 var a = document.createElement(typeof action=='string' ? 'a' : 'div');
133 if ( arguments.length < 3 || enabled ) {
134 switch (typeof action) {
140 if (target) a.target = target;
143 a.className = 'enabled';
144 if (this.defaultAction==null) this.defaultAction=action;
147 a.className = 'disabled';
149 a.innerHTML = translate ? RicoTranslate.getPhrase(menutext) : menutext;
150 if (typeof title=='string')
151 a.title = translate ? RicoTranslate.getPhrase(title) : title;
152 a=this.div.appendChild(a);
153 Event.observe(a,"mouseover", this.mouseOver.bindAsEventListener(this));
154 Event.observe(a,"mouseout", this.mouseOut.bindAsEventListener(this));
158 mouseOver: function(e) {
159 if (this.highlightElem && this.highlightElem.className=='enabled-hover') {
160 // required for Safari
161 this.highlightElem.className='enabled';
162 this.highlightElem=null;
164 var elem=Event.element(e);
165 if (this.openMenuAnchor && this.openMenuAnchor!=elem)
167 if (elem.className=='enabled') {
168 elem.className='enabled-hover';
169 this.highlightElem=elem;
173 mouseOut: function(e) {
174 var elem=Event.element(e);
175 if (elem.className=='enabled-hover') elem.className='enabled';
176 if (this.highlightElem==elem) this.highlightElem=null;
179 isVisible: function() {
180 return this.div && Element.visible(this.div);
183 cancelmenu: function() {
184 if (this.hideFunc) this.hideFunc();
189 hidemenu: function() {
190 if (!this.div) return;
191 if (this.openSubMenu) this.openSubMenu.hidemenu();
197 Rico.includeLoaded('ricoMenu.js');