 
   matchHintsByKey: (hintMarkers, event) ->
     # If a shifted-character is typed, treat it as lowerase for the purposes of matching hints.
-    keyChar = KeyboardUtils.getKeyChar(event).toLowerCase()
+    keyChar = String.fromCharCode(event.charCode).toLowerCase()
 
     if (event.keyCode == keyCodes.backspace || event.keyCode == keyCodes.deleteKey)
       if (!@hintKeystrokeQueue.pop())

      if (LinkHints.hintMarkerContainingDiv)
        DomUtils.removeElement LinkHints.hintMarkerContainingDiv
      LinkHints.hintMarkerContainingDiv = null
      @hintMode.exit()
      @onExit?()
      @onExit = null
      @isActive = false

    # we invoke the deactivate() function directly instead of using setTimeout(callback, 0) so that
    # deactivateMode can be tested synchronously
    if (!delay)
      deactivate()
      callback() if (callback)
    else
      setTimeout(->
        deactivate()
        callback() if callback
      delay)

alphabetHints =
  hintKeystrokeQueue: []


  hideMarker: (linkMarker) -> linkMarker.style.display = "none"

  # If called without arguments, it executes immediately.  Othewise, it executes after 'delay' and invokes
  # 'callback' when it is finished.
  deactivateMode: (delay, callback) ->
    deactivate = =>
      if (LinkHints.getMarkerMatcher().deactivate)
