docs: function(element, type, handler) {
          var touches = this._msTouches;
  
          var cb = function(e) {
  
              var alreadyInArray = false;
              for (var i=0, ii=touches.length; i<ii; ++i) {
                  if (touches[i].pointerId == e.pointerId) {
                      alreadyInArray = true;
                      break;
                  }
              }
              if (!alreadyInArray) {
                  touches.push(e);
              }
  
              e.touches = touches.slice();
              handler(e);
          };
  
          OpenLayers.Event.observe(element, 'MSPointerDown', cb);
  
          // Need to also listen for end events to keep the _msTouches list
          // accurate
          var internalCb = function(e) {
              for (var i=0, ii=touches.length; i<ii; ++i) {
                  if (touches[i].pointerId == e.pointerId) {
                      touches.splice(i, 1);
                      break;
                  }
              }
          };
          OpenLayers.Event.observe(element, 'MSPointerUp', internalCb);
      }