8db1be4b9acebd6e44bd208e63eb7aecdac4a2eb
[rails.git] / app / assets / javascripts / menu.js
1 /*
2  * Open a menu.
3  */
4 function openMenu(anchor, menu, align) {
5   var anchorPosition = anchor.offset();
6   var offset;
7
8   if (align == "left") {
9     offset = 0;
10   } else if (align == "right") {
11     offset = menu.outerWidth() - anchor.outerWidth();
12   }
13
14   menu.show();
15
16   menu.offset({
17     top: anchorPosition.top + anchor.outerHeight(),
18     left: anchorPosition.left - offset
19   });
20 }
21
22 /*
23  * Close a menu.
24  */
25 function closeMenu(menu) {
26   clearTimeout(menu.timer);
27   menu.hide();
28 }
29
30 /*
31  * Callback called when the mouse enters a menu anchor.
32  */
33 function enterMenuAnchor(event, anchor, menu, delay, align) {
34   if (!anchor.hasClass("disabled")) {
35     clearTimeout(menu.timer);
36
37     if (delay > 0) {
38       menu.timer = setTimeout(function () { openMenu(anchor, menu, align) }, delay);
39     } else {
40       openMenu(event, menu, align);
41     }
42   }
43 }
44
45 /*
46  * Callback called when the mouse leaves a menu anchor.
47  */
48 function leaveMenuAnchor(event, anchor, menu) {
49   var to = event.relatedTarget;
50
51   if (!menu.is(to) && menu.has(to).length == 0) {
52     menu.hide();
53   }
54
55   clearTimeout(menu.timer);
56 }
57
58 /*
59  * Callback called when the mouse leaves a menu.
60  */
61 function leaveMenu(event, anchor, menu) {
62   var to = event.relatedTarget;
63
64   if (!anchor.is(to) && menu.has(to).length == 0) {
65     menu.hide();
66   }
67
68   clearTimeout(menu.timer);
69 }
70
71 /*
72  * Setup a menu, triggered by hovering over an anchor for a given time.
73  */
74 function createMenu(anchorid, menuid, delay, align) {
75   var anchor = $("#" + anchorid);
76   var menu = $("#" + menuid);
77
78   anchor.mouseup(function (event) { closeMenu(menu) });
79   anchor.mouseover(function (event) { enterMenuAnchor(anchor, anchor, menu, delay, align) });
80   anchor.mouseout(function (event) { leaveMenuAnchor(event, anchor, menu) });
81   menu.mouseup(function (event) { closeMenu(menu) });
82   menu.mouseout(function (event) { leaveMenu(event, anchor, menu) });
83 }