(function () {
  var ns = $.namespace("pskl.service");

  ns.KeyboardEventService = function () {};

  /**
   * @private
   */
  ns.KeyboardEventService.prototype.KeyboardActions_ = {

    "ctrl" : {
      "z" : Events.UNDO,
      "y" : Events.REDO,
      "x" : Events.CUT,
      "c" : Events.COPY,
      "v" : Events.PASTE
    }
  };

  /**
   * @private
   */
  ns.KeyboardEventService.prototype.CharCodeToKeyCodeMap_ = {

    90 : "z",
    89 : "y",
    88 : "x",
    67 : "c",
    86 : "v"
  };

  /**
   * @private
   */
  ns.KeyboardEventService.prototype.onKeyUp_ = function(evt) {
    var isMac = false;
    if (navigator.appVersion.indexOf("Mac")!=-1) {
      // Welcome in mac world where vowels are consons and meta used instead of ctrl:
      isMac = true;
    }
    
    if (isMac ? evt.metaKey : evt.ctrlKey) {
      // Get key pressed:
      var letter = this.CharCodeToKeyCodeMap_[evt.which];
      if(letter) {
        var eventToTrigger = this.KeyboardActions_.ctrl[letter];
        if(eventToTrigger) {
          $.publish(eventToTrigger);

          evt.preventDefault();
          return false;
        }
      }
    }
  };

  /**
   * @public
   */
  ns.KeyboardEventService.prototype.init = function() {
    $(document.body).keydown($.proxy(this.onKeyUp_, this));
  };
  
})();