Chris@0: /* redMine - project management software Chris@0: Copyright (C) 2006-2008 Jean-Philippe Lang */ Chris@0: Chris@0: var observingContextMenuClick; Chris@0: Chris@0: ContextMenu = Class.create(); Chris@0: ContextMenu.prototype = { Chris@0: initialize: function (url) { Chris@0: this.url = url; Chris@0: this.createMenu(); Chris@0: Chris@0: if (!observingContextMenuClick) { Chris@0: Event.observe(document, 'click', this.Click.bindAsEventListener(this)); Chris@0: Event.observe(document, (window.opera ? 'click' : 'contextmenu'), this.RightClick.bindAsEventListener(this)); Chris@0: observingContextMenuClick = true; Chris@0: } Chris@0: Chris@0: this.unselectAll(); Chris@0: this.lastSelected = null; Chris@0: }, Chris@0: Chris@0: RightClick: function(e) { Chris@0: this.hideMenu(); Chris@0: // do not show the context menu on links Chris@0: if (Event.element(e).tagName == 'A') { return; } Chris@0: // right-click simulated by Alt+Click with Opera Chris@0: if (window.opera && !e.altKey) { return; } Chris@0: var tr = Event.findElement(e, 'tr'); Chris@0: if (tr == document || tr == undefined || !tr.hasClassName('hascontextmenu')) { return; } Chris@0: Event.stop(e); Chris@0: if (!this.isSelected(tr)) { Chris@0: this.unselectAll(); Chris@0: this.addSelection(tr); Chris@0: this.lastSelected = tr; Chris@0: } Chris@0: this.showMenu(e); Chris@0: }, Chris@0: Chris@0: Click: function(e) { Chris@0: this.hideMenu(); Chris@0: if (Event.element(e).tagName == 'A') { return; } Chris@0: if (window.opera && e.altKey) { return; } Chris@0: if (Event.isLeftClick(e) || (navigator.appVersion.match(/\bMSIE\b/))) { Chris@0: var tr = Event.findElement(e, 'tr'); Chris@0: if (tr!=null && tr!=document && tr.hasClassName('hascontextmenu')) { Chris@0: // a row was clicked, check if the click was on checkbox Chris@0: var box = Event.findElement(e, 'input'); Chris@0: if (box!=document && box!=undefined) { Chris@0: // a checkbox may be clicked Chris@0: if (box.checked) { Chris@0: tr.addClassName('context-menu-selection'); Chris@0: } else { Chris@0: tr.removeClassName('context-menu-selection'); Chris@0: } Chris@0: } else { Chris@0: if (e.ctrlKey) { Chris@0: this.toggleSelection(tr); Chris@0: } else if (e.shiftKey) { Chris@0: if (this.lastSelected != null) { Chris@0: var toggling = false; Chris@0: var rows = $$('.hascontextmenu'); Chris@0: for (i=0; i window_width) { Chris@0: render_x -= menu_width; Chris@0: $('context-menu').addClassName('reverse-x'); Chris@0: } else { Chris@0: $('context-menu').removeClassName('reverse-x'); Chris@0: } Chris@0: if (max_height > window_height) { Chris@0: render_y -= menu_height; Chris@0: $('context-menu').addClassName('reverse-y'); Chris@0: } else { Chris@0: $('context-menu').removeClassName('reverse-y'); Chris@0: } Chris@0: if (render_x <= 0) render_x = 1; Chris@0: if (render_y <= 0) render_y = 1; Chris@0: $('context-menu').style['left'] = (render_x + 'px'); Chris@0: $('context-menu').style['top'] = (render_y + 'px'); Chris@0: Chris@0: Effect.Appear('context-menu', {duration: 0.20}); Chris@0: if (window.parseStylesheets) { window.parseStylesheets(); } // IE Chris@0: }}) Chris@0: }, Chris@0: Chris@0: hideMenu: function() { Chris@0: Element.hide('context-menu'); Chris@0: }, Chris@0: Chris@0: addSelection: function(tr) { Chris@0: tr.addClassName('context-menu-selection'); Chris@0: this.checkSelectionBox(tr, true); Chris@0: this.clearDocumentSelection(); Chris@0: }, Chris@0: Chris@0: toggleSelection: function(tr) { Chris@0: if (this.isSelected(tr)) { Chris@0: this.removeSelection(tr); Chris@0: } else { Chris@0: this.addSelection(tr); Chris@0: } Chris@0: }, Chris@0: Chris@0: removeSelection: function(tr) { Chris@0: tr.removeClassName('context-menu-selection'); Chris@0: this.checkSelectionBox(tr, false); Chris@0: }, Chris@0: Chris@0: unselectAll: function() { Chris@0: var rows = $$('.hascontextmenu'); Chris@0: for (i=0; i 0) { inputs[0].checked = checked; } Chris@0: }, Chris@0: Chris@0: isSelected: function(tr) { Chris@0: return Element.hasClassName(tr, 'context-menu-selection'); Chris@0: }, Chris@0: Chris@0: clearDocumentSelection: function() { Chris@0: if (document.selection) { Chris@0: document.selection.clear(); // IE Chris@0: } else { Chris@0: window.getSelection().removeAllRanges(); Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: function toggleIssuesSelection(el) { Chris@0: var boxes = el.getElementsBySelector('input[type=checkbox]'); Chris@0: var all_checked = true; Chris@0: for (i = 0; i < boxes.length; i++) { if (boxes[i].checked == false) { all_checked = false; } } Chris@0: for (i = 0; i < boxes.length; i++) { Chris@0: if (all_checked) { Chris@0: boxes[i].checked = false; Chris@0: boxes[i].up('tr').removeClassName('context-menu-selection'); Chris@0: } else if (boxes[i].checked == false) { Chris@0: boxes[i].checked = true; Chris@0: boxes[i].up('tr').addClassName('context-menu-selection'); Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: function window_size() { Chris@0: var w; Chris@0: var h; Chris@0: if (window.innerWidth) { Chris@0: w = window.innerWidth; Chris@0: h = window.innerHeight; Chris@0: } else if (document.documentElement) { Chris@0: w = document.documentElement.clientWidth; Chris@0: h = document.documentElement.clientHeight; Chris@0: } else { Chris@0: w = document.body.clientWidth; Chris@0: h = document.body.clientHeight; Chris@0: } Chris@0: return {width: w, height: h}; Chris@0: }