anchor.diff:          moveSub = elt.onMouseMove.listen(drag);
         }
       });
  -    
  -    elt.onMouseUp.listen((e) => stopDragging());   
  -    elt.onMouseOut.listen((e) => stopDragging());      
  +
  +    elt.onMouseUp.listen((e) => stopDragging());
  +    elt.onMouseOut.listen((e) => stopDragging());
       query("body").onMouseUp.listen((e) => stopDragging());
  +
  +    elt.onTouchStart.listen((TouchEvent e) {
  +      print("onTouchStart");
  +      e.preventDefault();
  +      if (touchId != null) {
  +        return; // ignore touches after the first
  +      }
  +      Touch t = e.changedTouches[0];
  +      player.playing = false;
  +      player.velocity = 0;
  +      if (touchMoveSub == null) {
  +        touchId = t.identifier;
  +        lastTouchTime = window.performance.now() / 1000.0;
  +        lastTouchY = t.page.y;
  +        print("lastTouchY: ${lastTouchY}");
  +        touchMoveSub = elt.onTouchMove.listen(touchDrag);
  +      }
  +    });
  +
  +    elt.onTouchEnd.listen((TouchEvent e) {
  +      if (e.touches.isEmpty) {
  +        print("onTouchEnd empty");
  +        stopDragging();
  +      }
  +    });
     }
   
     void drag(MouseEvent e) {
  
positive.code:   final Size size;
    final Player player;
    final int height = HEIGHT + SPACER;
    
    StreamSubscription moveSub;
    num lastTime;
    num lastY;
    
    StripView(this.elt, this.size, this.player) {
      elt.width = WIDTH + SPACER * 2;
      elt.height = HEIGHT * LARGE.pixelsize;
      elt.style.backgroundColor = "#000000";
      
      elt.onMouseDown.listen((e) {
        e.preventDefault();
        player.playing = false;
  
negative.code:     lastTime = now;
      lastY = e.client.y;
    }
  
    void touchDrag(TouchEvent e) {
      for (Touch t in e.changedTouches) {
        if (t.identifier == touchId) {
          num now = window.performance.now() / 1000.0;
          num deltaY = t.page.y - lastTouchY;
          num deltaPos = -deltaY / height;
          num deltaT = now - lastTouchTime;
          player.drag(deltaPos, deltaT);
          lastTouchTime = now;
          lastTouchY = t.page.y;
        }
      }
    }
  
    void stopDragging() {
      player.playing = true;
      if (moveSub != null) {
        moveSub.cancel();
        moveSub = null;
      }
      if (touchMoveSub != null) {
        touchMoveSub.cancel();
        touchMoveSub = null;
      }
      touchId = null;
    }
  
    void render(num moviePosition) {
      var movie = player.movie;
      elt.width = elt.width;
  