//"use strict";

var LibraryRWebInput = {
   $RI__deps: ['$Browser'],
   $RI: {
      temp: null,
      contexts: [],
      stateX: 0,
      stateY: 0,
      currentX: 0,
      currentY: 0,

      canvasEventHandler: function(event) {
         switch (event.type) {
            case 'mouseup':
            case 'mousedown':
               var value;
               var offset;
               if (event.button === 0) offset = 40;
               else if (event.button === 2) offset = 41;
               else break;
               if (event.type === 'mouseup') value = 0;
               else value = 1;
               for (var i = 0; i < RI.contexts.length; i++) {
                  {{{ makeSetValue('RI.contexts[i].state', 'offset', 'value', 'i8') }}};
               }
               break;
         }
      },

      eventHandler: function(event) {
         var i;
         switch (event.type) {
            case 'mousemove':
               var x = 0;
               var y = 0;

               var newX = event['clientX'] - Module.canvas.offsetLeft;
               var newY = event['clientY'] - Module.canvas.offsetTop;

               if (newX < 0) {
                  newX = 0;
                  x    = -Module.canvas.offsetWidth;
               } else if (newX > Module.canvas.offsetWidth) {
                  newX = Module.canvas.offsetWidth;
                  x    = Module.canvas.offsetWidth;
               } else {
                  x = newX - RI.currentX;
               }

               if (newY < 0) {
                  newY = 0;
                  y    = -Module.canvas.offsetHeight;
               } else if (newY > Module.canvas.offsetHeight) {
                  newY = Module.canvas.offsetHeight;
                  y    = Module.canvas.offsetHeight;
               } else {
                  y = newY - RI.currentY;
               }

               RI.currentX = newX;
               RI.currentY = newY;

               for (i = 0; i < RI.contexts.length; i++) {
                  {{{ makeSetValue('RI.contexts[i].state', '32', 'x', 'i32') }}};
                  {{{ makeSetValue('RI.contexts[i].state', '36', 'y', 'i32') }}};
               }

               break;

            case 'keyup':
            case 'keydown':
               var key = event.keyCode;
               var offset = key >> 3;
               var bit = 1 << (key & 7);
               if (offset >= 32) throw 'key code error! bad code: ' + key;
               for (i = 0; i < RI.contexts.length; i++) {
                  var value = {{{ makeGetValue('RI.contexts[i].state', 'offset', 'i8') }}};
                  if (event.type === 'keyup') value &= ~bit;
                  else value |= bit;
                  {{{ makeSetValue('RI.contexts[i].state', 'offset', 'value', 'i8') }}};
               }
               event.preventDefault();
               break;

            case 'blur':
            case 'visibilitychange':
               for (i = 0; i < RI.contexts.length; i++) {
                  _memset(RI.contexts[i].state, 0, 42);
               }
               break;
         }
      }
   },

   RWebInputInit: function() {
      if (RI.contexts.length === 0) {
         document.addEventListener('keyup', RI.eventHandler, false);
         document.addEventListener('keydown', RI.eventHandler, false);
         document.addEventListener('mousemove', RI.eventHandler, false);
         Module.canvas.addEventListener('mouseup', RI.canvasEventHandler, false);
         Module.canvas.addEventListener('mousedown', RI.canvasEventHandler, false);
         document.addEventListener('blur', RI.eventHandler, false);
         document.addEventListener('onvisbilitychange', RI.eventHandler, false);
      }
      if (RI.temp === null) RI.temp = _malloc(42);

      var s = _malloc(42);
      _memset(s, 0, 42);
      RI.contexts.push({
         state: s
      });
      return RI.contexts.length;
   },
   
   RWebInputPoll: function(context) {
      context -= 1;
      var state = RI.contexts[context].state;
      _memcpy(RI.temp, state, 42);
      // reset mouse movements
      {{{ makeSetValue('RI.contexts[context].state', '32', '0', 'i32') }}};
      {{{ makeSetValue('RI.contexts[context].state', '36', '0', 'i32') }}};
      return RI.temp;
   },

   RWebInputDestroy: function (context) {
      if (context === RI.contexts.length) {
         RI.contexts.pop();
         if (RI.contexts.length === 0) {
            document.removeEventListener('keyup', RI.eventHandler, false);
            document.removeEventListener('keydown', RI.eventHandler, false);
            document.removeEventListener('mousemove', RI.eventHandler, false);
            Module.canvas.removeEventListener('mouseup', RI.canvasEventHandler, false);
            Module.canvas.removeEventListener('mousedown', RI.canvasEventHandler, false);
            document.removeEventListener('blur', RI.eventHandler, false);
            document.removeEventListener('onvisbilitychange', RI.eventHandler, false);
         }
      }
   }
};

autoAddDeps(LibraryRWebInput, '$RI');
mergeInto(LibraryManager.library, LibraryRWebInput);