1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
/**
* Accesskeys javascript file.
*
* @author Michael Slusarz <slusarz@horde.org>
* @copyright 2014 Horde LLC
* @license LGPL-2.1 (http://www.horde.org/licenses/lgpl21)
*/
var AccessKeys = {
macos: navigator.appVersion.indexOf("Mac") !=- 1,
keydownHandler: function(e)
{
var elt, elts, evt, key, href;
if ((this.macos && e.ctrlKey) ||
(!this.macos && e.altKey && !e.ctrlKey)) {
// Need to search for both upper and lowercase value
key = String.fromCharCode(e.keyCode || e.charCode).sub('"', '\\"');
elts = $$('[accesskey="' + key.toUpperCase() + '"]');
if (key.toUpperCase() != key.toLowerCase()) {
elts = elts.concat($$('[accesskey="' + key.toLowerCase() + '"]'));
}
if ((elt = elts.first())) {
// Remove duplicate accesskeys
if (elts.size() > 1) {
elts.slice(1).invoke('writeAttribute', 'accesskey', null);
}
e.stop();
if (Prototype.Browser.Opera && elt.tagName == 'LABEL') {
elt = $(elt.readAttribute('for'));
if (!elt) {
return;
}
}
try {
elt.focus();
} catch (ex) {}
if (navigator.userAgent.indexOf('Chrome/') > -1 && !this.macos &&
elt.tagName == 'A') {
return;
}
// Trigger a mouse event on the accesskey element.
if (elt.tagName == 'INPUT') {
// NOOP
} else if (elt.match('A') && elt.onclick) {
elt.onclick();
} else if (elt.match('A') && Prototype.Browser.IE &&
(href = elt.readAttribute('href')) &&
href.substr(0, 1) != '#') {
if (href.indexOf('javascript:') === 0) {
eval(href.substr(11));
} else {
window.open(href);
}
} else if (document.createEvent) {
evt = document.createEvent('MouseEvents');
evt.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
elt.dispatchEvent(evt);
} else {
evt = document.createEventObject();
elt.fireEvent('onclick', evt);
}
}
}
}
};
document.observe('keydown', AccessKeys.keydownHandler.bindAsEventListener(AccessKeys));
|