 
   continuousZoom: (change) ->
     return if change == 0
-    @setState zooming: true
-
-    zoomNow = =>
-      @zoom(change)
-      clearTimeout @state.zoomingTimeoutId
-      @setState zoomingTimeoutId: setTimeout(zoomNow, 200)
-    
-    zoomNow()
+    @setState zooming: true, =>
+      zoomNow = =>
+        # if !@state.zooming, we don't want to continuously call setTimeout
+        return if !@state.zooming
+        @zoom(change)
+        clearTimeout @state.zoomingTimeoutId
+        @setState zoomingTimeoutId: setTimeout(zoomNow, 200)
+      
+      zoomNow()
 
   zoom: (change) ->
-    return if change == 0 || !@state.zooming
+    return if !@state.zooming
     clearTimeout @state.zoomingTimeoutId
     newNaturalWidth = @state.viewBoxDimensions.width * change
     newNaturalHeight = @state.viewBoxDimensions.height * change

              </div>
            </div>
            <div>
              <button title={"zoom out"} className={"zoom-out fa fa-minus" + if @canZoomOut() then " disabled" else "" } onMouseDown={ @continuousZoom.bind(this, 1.1 ) } />
            </div>
            <div>
              <button title={"zoom in"} className="zoom-in fa fa-plus" onMouseDown={@continuousZoom.bind(this, .9)} onMouseUp={@toggleZoom} />
            </div>
            <div>
              <button title={"rest zoom levels"} className={"reset fa fa-refresh" + if @canZoomOut() then " disabled" else ""} onClick={ this.zoomReset } ></button>

    }
    panEnabled: false
    zooming: false
    zoomingTimeoutId: null

  componentDidMount: ->
    addEventListener "keydown", @frameKeyPan
    addEventListener "mousewheel", @frameKeyPan

  componentWillUnmount: ->
    removeEventListener "keydown", @frameKeyPan
    removeEventListener "mousewheel", @frameKeyPan

  render: () ->
    subject = @props.subject
