2010-07-19 Marek Habersack <mhabersack@novell.com>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / Menu.js
1
2 function Menu_OverItem (menuId, itemId, parentId) {
3         var menu = getMenu (menuId);
4         if (menu == null)
5             return;
6         var subm = getSubMenu (menuId, itemId);
7         if (subm.parentMenu == null && parentId != null)
8                 subm.parentMenu = getSubMenu (menuId, parentId);
9
10         if (parentId != null && menu.dynamicHover != null)
11                 Menu_HilighItem (menuId, itemId, menu.dynamicHover, menu.dynamicLinkHover);
12         else if (parentId == null && menu.staticHover != null)
13                 Menu_HilighItem (menuId, itemId, menu.staticHover, menu.staticLinkHover);
14         
15         if (subm.firstShown != true) {          
16                 var item = getMenuItem (menuId, itemId);
17                 var offx = 0;
18                 var offy = 0;
19                 
20                 if (menu.dho != null) offx += menu.dho;
21                 if (menu.dvo != null) offy += menu.dvo;
22                 
23                 if (menu.vertical || parentId != null)
24                         Menu_Reposition (menu, item, subm, item.offsetWidth + offx, offy);
25                 else
26                         Menu_Reposition (menu, item, subm, offx, item.offsetHeight + offy);
27                         
28                 subm.initialLeft = subm.style.left;
29                 subm.initialTop = subm.style.top;
30                 subm.initialContentHeight = getMenuScrollBox (menuId, itemId, "b").offsetHeight;
31                 subm.scrollButtonsHeight = subm.offsetHeight - subm.initialContentHeight;
32                 var submMargin = subm.offsetHeight - subm.clientHeight;
33                 subm.initialOffsetHeight = subm.offsetHeight - subm.scrollButtonsHeight + submMargin;
34                 subm.firstShown = true;
35                 
36         }
37         
38         Menu_SetActive (menu, subm);
39         Menu_ShowMenu (subm);
40         Menu_Resize (subm, menuId, itemId);
41 }
42
43 function Menu_OverDynamicLeafItem (menuId, itemId, parentId) {
44         var menu = getMenu (menuId);
45         if (menu == null)
46             return;
47         var subm = getSubMenu (menuId, parentId);
48         Menu_SetActive (menu, subm);
49         Menu_ShowMenu (subm);
50         if (menu.dynamicHover != null)
51                 Menu_HilighItem (menuId, itemId, menu.dynamicHover, menu.dynamicLinkHover);
52 }
53
54 function Menu_OverStaticLeafItem (menuId, itemId) {
55         var menu = getMenu (menuId);
56         if (menu == null)
57             return;
58         Menu_SetActive (menu, null);
59         if (menu.dynamicHover != null)
60                 Menu_HilighItem (menuId, itemId, menu.staticHover, menu.staticLinkHover);
61 }
62
63 function Menu_HilighItem (menuId, itemId, hoverClass, hoverLinkClass)
64 {
65         var item = getMenuItem (menuId, itemId);
66         if (item.normalClass == null)
67                 item.normalClass = item.className;
68         item.className = item.normalClass + " " + hoverClass;
69
70         var itemLink = getMenuItemLink (menuId, itemId);
71         if (itemLink.normalClass == null)
72                 itemLink.normalClass = itemLink.className;
73         itemLink.className = itemLink.normalClass + " " + hoverLinkClass;
74 }
75
76 function Menu_OutItem (menuId, itemId, parentId) {
77         var menu = getMenu (menuId);
78         if (menu == null)
79             return;
80         var subm = getSubMenu (menuId, itemId);
81         if (subm == null && parentId != null)
82                 subm = getSubMenu (menuId, parentId);
83         if (subm != null)
84                 Menu_HideMenu (menu, subm, menu.disappearAfter);
85         var item = getMenuItem (menuId, itemId);
86         if (item != null && item.normalClass != null)
87                 item.className = item.normalClass;
88         var itemLink = getMenuItemLink (menuId, itemId);
89         if (itemLink != null && itemLink.normalClass != null)
90                 itemLink.className = itemLink.normalClass;
91 }
92
93 function Menu_OverScrollBtn (menuId, parentId, updown) {
94         var menu = getMenu (menuId);
95         if (menu == null)
96             return;
97         var subm = getSubMenu (menuId, parentId);
98         Menu_SetActive (menu, subm);
99         Menu_ShowMenu (subm);
100         if (subm.scrollThread != null)
101                 clearInterval (subm.scrollThread);
102         var box = getMenuScrollBox (menuId, parentId, "b");
103         subm.scrollThread = setInterval ("Menu_ScrollMenu ('" + box.id + "','" + updown + "')", 60);
104 }
105
106 function Menu_OutScrollBtn (menuId, parentId, updown) {
107         var menu = getMenu (menuId);
108         if (menu == null)
109             return;
110         var subm = getSubMenu (menuId, parentId);
111         if (subm.scrollThread != null)
112                 clearInterval (subm.scrollThread);
113         Menu_HideMenu (menu, subm, menu.disappearAfter);
114 }
115
116 function Menu_ScrollMenu (boxId, updown) {
117         var box = document.getElementById (boxId);
118         if (updown == "u") box.scrollTop -= 5;
119         else box.scrollTop += 5;
120 }
121
122
123 function Menu_SetActive (menu, subm) {
124         if (menu.active != null && subm != menu.active)
125                 Menu_HideMenu (menu, menu.active, 0);
126         menu.active = subm;
127 }
128
129 function Menu_HideMenu (menu, subm, time)
130 {
131         if (subm.timer != null) clearTimeout (subm.timer);
132         if (time > 0) subm.timer = setTimeout ("Menu_HideMenuCallback ('" + subm.id + "')", time);
133         else Menu_HideMenuCallback (subm.id);
134         
135         if (subm.parentMenu != null)
136                 Menu_HideMenu (menu, subm.parentMenu, time);
137 }
138
139 function Menu_HideMenuCallback (spanId)
140 {
141         var subm = document.getElementById (spanId);
142         subm.style.visibility = "hidden";
143 }
144
145 function Menu_ShowMenu (subm)
146 {
147         if (subm.timer != null)
148                 clearTimeout (subm.timer);
149                 
150         subm.style.visibility = "visible";
151
152         if (subm.parentMenu != null)
153                 Menu_ShowMenu (subm.parentMenu);
154 }
155
156 function Menu_Reposition (menu, it, elem, offx, offy)
157 {
158         var itPos = menu.webForm.WebForm_GetElementPosition(it);
159         var elemPos = menu.webForm.WebForm_GetElementPosition(elem);
160         elem.style.left = (elem.offsetLeft - elemPos.x + itPos.x + offx) + "px";
161         elem.style.top = (elem.offsetTop - elemPos.y + itPos.y + offy) + "px";
162 }
163
164 function Menu_Resize (subm, menuId, itemId)
165 {
166         var parent = subm.offsetParent;
167         var box = getMenuScrollBox (menuId, itemId, "b");
168         box.scrollTop = 0;
169         var bottom = subm.offsetTop + subm.initialOffsetHeight - parent.scrollTop;
170         var displayScroll;
171
172         /*
173          * This is a workaround for an IE bug. IE recalculates the box offsetWidth when
174          * the box _height_ is set below - which in case of boxes with overflowing content
175          * results in a value that's just slightly smaller than the client window width.
176          * In effect, a long submenu will also be very wide, which isn't desirable.
177          */
178         var newWidth = box.offsetWidth;
179         
180         if (bottom > parent.clientHeight /* && parent.scrollHeight > parent.clientHeight*/) {
181                 var overflow = bottom - parent.clientHeight;
182                 var freeTop = subm.offsetTop - parent.scrollTop;
183                 if (overflow <= freeTop) {
184                         subm.style.top = (subm.offsetTop - overflow) + "px";
185                         displayScroll = "none";
186                         box.style.height = subm.initialContentHeight + "px";
187                 } else {
188                         subm.style.top = (subm.offsetTop - freeTop) + "px";
189                         var bh = (parent.clientHeight - subm.offsetTop + parent.scrollTop) - subm.scrollButtonsHeight;
190                         box.style.overflow = "hidden";
191                         box.style.height = bh + "px";
192                         displayScroll = "block";
193                         
194                 }
195         } else {
196                 displayScroll = "none";
197                 box.style.height = subm.initialContentHeight + "px";
198         }
199         subm.style.width = newWidth + "px";
200
201         var btn = getMenuScrollBox (menuId, itemId, "u");
202         btn.style.display = displayScroll;
203         btn = getMenuScrollBox (menuId, itemId, "d");
204         btn.style.display = displayScroll;
205 }
206
207 function getMenu (menuId) { try { return eval (menuId + "_data"); } catch(e) { return null; } }
208 function getSubMenu (menuId, itemId) { return document.getElementById (menuId + "_" + itemId + "s"); }
209 function getMenuItem (menuId, itemId) { return document.getElementById (menuId + "_" + itemId + "i"); }
210 function getMenuItemLink (menuId, itemId) { return document.getElementById (menuId + "_" + itemId + "l"); }
211 function getMenuScrollBox (menuId, itemId, btn) { return document.getElementById (menuId + "_" + itemId + "c" + btn); }
212