var KEYCODE_SHIFT = 16;
var KEYCODE_CTRL  = 17;
var KEYCODE_ALT   = 18;
var KEYCODE_0_KEY = 48;
var KEYCODE_9_KEY = 57;
var KEYCODE_A_KEY = 65;
var KEYCODE_Z_KEY = 90;
function registerKeyboardEvents(targetWnd)
{
if (typeof(targetWnd) == "undefined" || targetWnd == null)
{
targetWnd = getTopLevelWnd();
}
var bodyTarget = wdk.events.getEventTarget(targetWnd.document);
bodyTarget.addEventListener("keyup", onKeyUpEventHandler, false);
bodyTarget.addEventListener("keydown", onKeyDownEventHandler, false);
}
var m_hotkeysRegistry;
function registerHotKeyHandler(hotkey, hotkeyHandler, elementName)
{
if (typeof hotkey == "undefined" || typeof hotkeyHandler == "undefined")
{
return;
}
if (typeof m_hotkeysRegistry == "undefined")
{
m_hotkeysRegistry = new Object();
}
// (note: if duplicate hot key's are assigned, the one registered later will overwrite the earlier one)
m_hotkeysRegistry[hotkey] = {hotkey: hotkey, hotkeyHandler: hotkeyHandler, elementName: elementName};
}
function loadHotKeysRegistryToTopLevel()
{
if (typeof m_hotkeysRegistry == "undefined")
{
return;
}
if (typeof(getTopLevelWnd().g_hotkeysRegistry) == "undefined")
{
getTopLevelWnd().g_hotkeysRegistry = new Object();
}
var topHotKeysRegistry = getTopLevelWnd().g_hotkeysRegistry;
for (var i in m_hotkeysRegistry)
{
var hotkey = m_hotkeysRegistry[i].hotkey;
var hotkeyHandler = m_hotkeysRegistry[i].hotkeyHandler;
var elementName = m_hotkeysRegistry[i].elementName;
topHotKeysRegistry[hotkey] = {hotkey: hotkey, hotkeyHandler: hotkeyHandler, elementName: elementName, refWnd: window};
}
}
function setHotKeyTestId(testId)
{
document.hkFormTestId = testId;
}
function onKeyUpEventHandler(evt)
{
var targ = getEventTarget(evt);
if (targ != null && typeof(targ.type) != "undefined")
{
var targType = targ.type.toLowerCase();
if (targType.indexOf('text') != -1 || targType == 'password' || targType.indexOf('select') != -1)
{
return true;
}
}
var upKey = getKey(evt.keyCode);
if (upKey == "")
{
return true;
}
var controlKeys = getControlKeys(evt);
var keyboardCmd = (controlKeys == "") ? upKey : controlKeys + "+" + upKey;;
var hotkeysRegistry = getTopLevelWnd().g_hotkeysRegistry;
if (typeof(hotkeysRegistry) == "undefined" || hotkeysRegistry == null )
{
return true;
}
var hotkeyEntry = hotkeysRegistry[keyboardCmd];
if (typeof(hotkeyEntry) == "undefined" || hotkeyEntry == null )
{
return true;
}
try
{
if (typeof(recordClientEvent) != "undefined")
{
recordKeyUpEvent(evt);
}
var refWnd = hotkeyEntry.refWnd;
var elementName = hotkeyEntry.elementName;
if (elementName != null && elementName != "")
{
if (refWnd["isActionControlExecutable"] && refWnd["isActionControlExecutable"].call)
{
if (!refWnd.isActionControlExecutable(elementName))
{
return true;
}
}
}
refWnd.eval(hotkeyEntry.hotkeyHandler);
return false;
}
catch (e)
{
//hotkeys_trace('Error message: ' + e.message);
}
return true;
}
function recordKeyUpEvent(evt)
{
var keyCode = evt.keyCode;
if (keyCode == KEYCODE_CTRL || keyCode == KEYCODE_SHIFT || keyCode == KEYCODE_ALT)
{
return;  // no need to record when the up key is "Ctrl", "Shift", or "Alt";
// also, no keyup event for the "Meta" key by itself on Mac's Mozilla Firefox and Safari browsers
}
var eventArgs = "";
if (evt.ctrlKey)
{
eventArgs += "ctrlKey;";
}
else if (evt.metaKey)
{
eventArgs += "metaKey;"; // MAC's Command key
}
if (evt.shiftKey)
{
eventArgs += "shiftKey;";
}
if (evt.altKey)
{
eventArgs += "altKey;";
}
eventArgs += "keyCode:"+keyCode;
recordClientEvent(document.hkFormTestId, "keyup", eventArgs);
if (window.startRecordingTransaction) startRecordingTransaction('ignoreControlEvent');
}
function onKeyDownEventHandler(evt)
{
if (evt.keyCode == wdk.events.keycodes.ESC)
{
var targ = getEventTarget(evt);
if (targ != null && typeof(targ.type) != "undefined")
{
var targType = targ.type.toLowerCase();
if (targType.indexOf('text') != -1 || targType == 'password' || targType.indexOf('select') != -1)
{
targ.blur();
evt.preventDefault();
}
}
}
}
function initializeKeysLookup()
{
var topWnd = getTopLevelWnd();
if (typeof(topWnd.g_keyLookupTbl) == "undefined")
{
var keyLookupTbl = topWnd.g_keyLookupTbl = new Object();
keyLookupTbl["8"]   = { keycode:  8, key: "BACKSPACE"};
keyLookupTbl["9"]   = { keycode:  9, key: "TAB"};
keyLookupTbl["13"]  = { keycode: 13, key: "ENTER"};
keyLookupTbl["27"]  = { keycode: 27, key: "ESC"};
keyLookupTbl["32"]  = { keycode: 32, key: "SPACEBAR"};
keyLookupTbl["33"]  = { keycode: 33, key: "PAGEUP"};
keyLookupTbl["34"]  = { keycode: 34, key: "PAGEDOWN"};
keyLookupTbl["35"]  = { keycode: 35, key: "END"};
keyLookupTbl["36"]  = { keycode: 36, key: "HOME"};
keyLookupTbl["45"]  = { keycode: 45, key: "INSERT"};
keyLookupTbl["46"]  = { keycode: 46, key: "DELETE"};
keyLookupTbl["112"] = {keycode: 112, key: "F1"};
keyLookupTbl["113"] = {keycode: 113, key: "F2"};
keyLookupTbl["114"] = {keycode: 114, key: "F3"};
keyLookupTbl["115"] = {keycode: 115, key: "F4"};
keyLookupTbl["116"] = {keycode: 116, key: "F5"};
keyLookupTbl["117"] = {keycode: 117, key: "F6"};
keyLookupTbl["118"] = {keycode: 118, key: "F7"};
keyLookupTbl["119"] = {keycode: 119, key: "F8"};
keyLookupTbl["120"] = {keycode: 120, key: "F9"};
keyLookupTbl["121"] = {keycode: 121, key: "F10"};
keyLookupTbl["122"] = {keycode: 122, key: "F11"};
keyLookupTbl["123"] = {keycode: 123, key: "F12"};
keyLookupTbl["186"] = {keycode: 186, key: ";"};
keyLookupTbl["187"] = {keycode: 187, key: "="};
keyLookupTbl["188"] = {keycode: 188, key: ","};
keyLookupTbl["189"] = {keycode: 189, key: "-"};
keyLookupTbl["190"] = {keycode: 190, key: "."};
keyLookupTbl["191"] = {keycode: 191, key: "/"};
keyLookupTbl["192"] = {keycode: 192, key: "`"};
keyLookupTbl["219"] = {keycode: 219, key: "["};
keyLookupTbl["220"] = {keycode: 220, key: "\\"};
keyLookupTbl["221"] = {keycode: 221, key: "]"};
keyLookupTbl["222"] = {keycode: 222, key: "'"};
}
}
function getEventTarget(evt)
{
var targ = evt.srcElement;
if (!targ && evt.target)
{
targ = evt.target;
}
if (targ && targ.nodeType == 3)
{
targ = targ.parentNode;
}
return targ;
}
function getKey(keyCode)
{
var sKey = "";
if ((keyCode >= KEYCODE_0_KEY && keyCode <= KEYCODE_9_KEY) ||
(keyCode >= KEYCODE_A_KEY && keyCode <= KEYCODE_Z_KEY))
{
sKey = String.fromCharCode(keyCode);
}
else
{
var hotkeyEntry = getTopLevelWnd().g_keyLookupTbl[""+keyCode];
if (typeof hotkeyEntry != "undefined" && hotkeyEntry != null)
{
sKey = hotkeyEntry.key;
}
}
return sKey;
}
function getControlKeys(evt)
{
var controlKeys = "";
if (evt.ctrlKey)
{
controlKeys = "CTRL";
}
else if (evt.metaKey)
{
controlKeys = "CMD";
}
if (evt.shiftKey)
{
controlKeys = (controlKeys == "") ? "SHIFT" : controlKeys + "+SHIFT";
}
if (evt.altKey)
{
controlKeys = (controlKeys == "") ? "ALT" : controlKeys + "+ALT";
}
return controlKeys;
}
function hotkeys_trace(strMsg)
{
Trace_CLIENTEVENTS = true;
Trace_println("hotkeys: " + strMsg);
Trace_CLIENTEVENTS = false;
}

