 			applyValue();
 		}
 		
-		protected function closestTickMarkValueToValue(val:Number):Number
-		{
-			var diff:Number = (m_maxValue - m_minValue) / (m_numTickMarks - 1);
-			var index:int = Math.floor(val / diff);
-			if (val % diff > diff / 2) index++;
-			return index * diff;
-		}
-		
-		
-		
-		/***************************************************************************
-		*									events								   *
-		***************************************************************************/
+		protected function addFrameListener():void
+		{
+			if (m_frameListenerActive) return;
+
+			addEventListener(Event.ENTER_FRAME, self_enterFrame);
+			m_frameListenerActive = true;
+		}
+		
+		protected function removeFrameListener():void
+		{
+			if (!m_frameListenerActive) return;
+			var animationActive:Boolean = m_thumb.left != valueToPosition(m_value, m_minValue, 
+				m_maxValue);
+			if (animationActive || m_isDragging) return;
+			removeEventListener(Event.ENTER_FRAME, self_enterFrame);
+			m_frameListenerActive = false;
+		}
+		
+		
+		
+		//*****************************************************************************************
+		//*                                         Events                                        *
+		//*****************************************************************************************
 		protected function thumb_click(e:MouseEvent):void
 		{
 			m_dragStartThumbPosition = m_thumb.left;
 			m_dragStartMousePosition = m_track.mouseX;
 			m_isDragging = true;
-			addEventListener(Event.ENTER_FRAME, self_enterFrame);
+			addFrameListener();
 		}
 		
 		protected function stage_mouseUp(e:MouseEvent):void

			addListeners();
		}
		
		protected function createTrack():void
		{
			m_track = addComponent('track');

			{
				return;
			}
			m_isDragging = false;
			removeFrameListener();
			applyCurrentDragValue();
			dispatchEvent(new Event(Event.CHANGE));
		}
		
		protected function track_mouseDown(e:MouseEvent):void
		{
			setValue(positionToValue(mouseX - m_thumb.width / 2));
			dispatchEvent(new Event(Event.CHANGE));
