/**
 usage:
var kh = new KeyHandler();
kh.onKeyDown = function(e)  // e is a KeyPressEvent object
{
    if ( e.eventElement == document.getElementById("textbox1") && e.keyCode == 45 )
        return false; //cancel the press
 
    //more information available from e
    e.eventHandler     //the event handler
    e.eventElement      //the element that caused the event
    e.elementTag         //the html tag that caused the event
    e.elementID          //the id of the element
    e.element           //the actual element
    e.keyCode             //the keycode to capture

    return true;
}

kh.onKeyUp = function()
{
   //do nothing
   return true;
}
*/

var Keys = {
     BACKSPACE: 8,          TAB: 9,               ENTER: 13,          SHIFT: 16,
     CTRL: 17,               ALT: 18,          PAUSE: 19,          CAPS: 20,
     ESC: 27,                PAGEUP: 33,      PAGEDN: 34,      END: 35,
     HOME: 36,               LEFT: 37,           UP: 38,           RIGHT: 39,
     DOWN: 40,               INSERT: 45,      DELETE: 46,      
     n0: 48,     n1: 49, n2: 50, n3: 51, n4: 52,
     n5: 53, n6: 54,     n7: 55,     n8: 56,     n9: 57,
     A:65, B:66, C:67, D:68, E:68, F:70, G:71, H:72, I:73, J:74, K:75,
     L:76, M:77, N:78, O:79, P:80, Q:81, R:82, S:83, T:84, U:85, V:86,
     W:87, X:88, Y:89, Z:90,
     WINLEFT: 91,           WINRIGHT: 92,     SELECT: 93,      NUM0: 96,
     NUM1: 97,                NUM2: 98,           NUM3: 99,           NUM4: 100,
     NUM5: 101,                NUM6: 102,           NUM7: 103,           NUM8: 104,
     NUM9: 105,                MULTIPLY: 106,      ADD: 107,           SUBTRACT: 109,
     DECIMAL: 110,           DIVIDE: 111,      F1: 112,           F2: 113,
     F3: 114,                F4: 115,          F5: 116,           F6: 117,
     F7: 118,                F8: 119,           F9: 120,           F10: 121,
     F11: 122,                F12: 123,           NUMLOCK: 144,      SCROLLLOCK: 145,
     SEMICOLON: 186,      EQUAL: 187,      COMMA: 188,      DASH: 189,
     PERIOD: 190,           FORWARDSLASH: 191,                     GRAVEACCENT: 192,
     OPENBRACKET: 219,      BACKSLASH: 220,                         CLOSEBRACKET: 221,
     QUOTE: 222
};

function KeyPressEvent(eventObj)
{
     this.eventHandler = null;     //the event handler
     this.eventElement = null;     //the element that caused the event
     this.elementTag = "";         //the html tag that caused the event
     this.elementID = "";          //the id of the element
     this.element = null;          //the actual element
     this.keyCode = 0;             //the keycode to capture
     
     if( document.all )
     {
          // IE
          this.eventHandler = eventObj;
          this.eventElement = eventObj.srcElement;
          this.elementTag = eventObj.srcElement.tagName;
          this.elementID = eventObj.srcElement.name;
          this.element = eventObj.srcElement;
          this.keyCode = eventObj.keyCode;
     }
     else
     {
          // Not IE
          this.eventHandler = eventObj;
          this.eventElement = eventObj.target.srcElement;
          this.elementTag = eventObj.target.tagName;
          this.elementID = eventObj.target.name;
          this.element = eventObj.target;
          this.keyCode = eventObj.which;
          
          // Safari bug workaround
          if (this.element.nodeType == 3)
               targ = targ.parentNode;
     }
}

function KeyHandler()
{
     //register for the event
     if ( document.addEventListener )
          document.addEventListener("keydown", this.keyDown.bind(this), false);
     else if ( document.attachEvent )
          document.attachEvent("onkeydown", this.keyDown.bind(this));
     else
          document.onkeydown = this.keyDown.bind(this);
          
     if (document.layers) document.captureEvents(Event.KEYDOWN);
     
     if ( document.addEventListener )
          document.addEventListener("keyup", this.keyUp.bind(this), false);
     else if ( document.attachEvent )
          document.attachEvent("onkeyup", this.keyUp.bind(this));
     else
          document.onkeyup = this.keyUp.bind(this);
          
     if (document.layers) document.captureEvents(Event.KEYUP);
}

KeyHandler.prototype.keyDown = function(e)
{     
     if ( typeof(this.onKeyDown) != "undefined" )
     {
          if ( !e ) e = window.event;
          var r = this.onKeyDown( new KeyPressEvent(e) );
          
          if ( r == false )
          {
               if ( window.event ) window.event.cancelBubble = true;
             if ( window.event ) window.event.returnValue = false;
               if ( e.preventDefault ) e.preventDefault();
             return false;
          }
          else
          {
               if ( window.event ) window.event.cancelBubble = false;
             if ( window.event ) window.event.returnValue = true;
               return true;
          }
     }
     else
     {
          alert("No Key Press Event Handler Found!");
     }
};

KeyHandler.prototype.keyUp = function(e)
{     
     if ( typeof(this.onKeyUp) != "undefined" )
     {
          if ( !e ) e = window.event;
          var r = this.onKeyUp( new KeyPressEvent(e) );
          
          if ( r == false )
          {
               if ( window.event ) window.event.cancelBubble = true;
             if ( window.event ) window.event.returnValue = false;
               if ( e.preventDefault ) e.preventDefault();
               if ( e.stopPropagation ) e.stopPropagation();
             return false;
          }
          else
          {
               if ( window.event ) window.event.cancelBubble = false;
             if ( window.event ) window.event.returnValue = true;
               return true;
          }
     }
     else
     {
          alert("No Key Press Event Handler Found!");
     }
};
