]> git.openstreetmap.org Git - rails.git/blobdiff - app/assets/javascripts/menu.js
Upgrade to rails 3.1.0
[rails.git] / app / assets / javascripts / menu.js
diff --git a/app/assets/javascripts/menu.js b/app/assets/javascripts/menu.js
new file mode 100644 (file)
index 0000000..2615177
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Open a menu.
+ */
+function openMenu(anchor, menu, align) {
+  var offset;
+
+  if (align == "left") {
+    offset = 0;
+  } else if (align == "right") {
+    offset = anchor.getWidth() - menu.getWidth();
+  }
+
+  menu.clonePosition(anchor, {
+    setLeft: true, setTop: true, setWidth: false, setHeight: false,
+    offsetLeft: offset, offsetTop: anchor.getHeight()
+  });
+
+  menu.style.display = "block";
+}
+
+/*
+ * Close a menu.
+ */
+function closeMenu(menu) {
+  clearTimeout(menu.timer);
+  menu.style.display = "none";
+}
+
+/*
+ * Callback called when the mouse enters a menu anchor.
+ */
+function enterMenuAnchor(event, anchor, menu, delay, align) {
+  if (!anchor.hasClassName("disabled")) {
+    clearTimeout(menu.timer);
+
+    if (delay > 0) {
+      menu.timer = setTimeout(function () { openMenu(anchor, menu, align) }, delay);
+    } else {
+      openMenu(event, menu, align);
+    }
+  }
+}
+
+/*
+ * Callback called when the mouse leaves a menu anchor.
+ */
+function leaveMenuAnchor(event, anchor, menu) {
+  var to = event.relatedTarget;
+
+  if (to != menu && !to.descendantOf(menu)) {
+    menu.style.display = "none";
+  }
+
+  clearTimeout(menu.timer);
+}
+
+/*
+ * Callback called when the mouse leaves a menu.
+ */
+function leaveMenu(event, anchor, menu) {
+  var to = event.relatedTarget;
+
+  if (to != anchor && !to.descendantOf(menu)) {
+    menu.style.display = "none";
+  }
+
+  clearTimeout(menu.timer);
+}
+
+/*
+ * Setup a menu, triggered by hovering over an anchor for a given time.
+ */
+function createMenu(anchorid, menuid, delay, align) {
+  var anchor = $(anchorid);
+  var menu = $(menuid);
+
+  anchor.observe("mouseup", function (event) { closeMenu(menu) });
+  anchor.observe("mouseover", function (event) { enterMenuAnchor(anchor, anchor, menu, delay, align) });
+  anchor.observe("mouseout", function (event) { leaveMenuAnchor(event, anchor, menu) });
+  menu.observe("mouseup", function (event) { closeMenu(menu) });
+  menu.observe("mouseout", function (event) { leaveMenu(event, anchor, menu) });
+}