|  |  | 
 |  |  | function touchHandler(event) | 
 |  |  | {    | 
 |  |  |      | 
 |  |  | { | 
 |  |  |  | 
 |  |  |     var touches = event.changedTouches, | 
 |  |  |         first = touches[0], | 
 |  |  |         type = ""; | 
 |  |  |          switch(event.type) | 
 |  |  |     { | 
 |  |  |         case "touchstart": type="mousedown"; break; | 
 |  |  |         case "touchmove":  type="mousemove"; break;         | 
 |  |  |         case "touchmove":  type="mousemove"; break; | 
 |  |  |         case "touchend":   type="mouseup"; break; | 
 |  |  |         default: return; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |              //initMouseEvent(type, canBubble, cancelable, view, clickCount,  | 
 |  |  |     //           screenX, screenY, clientX, clientY, ctrlKey,  | 
 |  |  |              //initMouseEvent(type, canBubble, cancelable, view, clickCount, | 
 |  |  |     //           screenX, screenY, clientX, clientY, ctrlKey, | 
 |  |  |     //           altKey, shiftKey, metaKey, button, relatedTarget); | 
 |  |  |      | 
 |  |  |  | 
 |  |  |     var simulatedEvent = document.createEvent("MouseEvent"); | 
 |  |  |     simulatedEvent.initMouseEvent(type, true, true, window, 1,  | 
 |  |  |                               first.screenX, first.screenY,  | 
 |  |  |                               first.clientX, first.clientY, false,  | 
 |  |  |     simulatedEvent.initMouseEvent(type, true, true, window, 1, | 
 |  |  |                               first.screenX, first.screenY, | 
 |  |  |                               first.clientX, first.clientY, false, | 
 |  |  |                               false, false, false, 0/*left*/, null); | 
 |  |  |     if(touches.length < 2) { | 
 |  |  |       first.target.dispatchEvent(simulatedEvent); |