////////////////////////////////////////////////////////////////////////////////
//
//  Licensed to the Apache Software Foundation (ASF) under one or more
//  contributor license agreements.  See the NOTICE file distributed with
//  this work for additional information regarding copyright ownership.
//  The ASF licenses this file to You under the Apache License, Version 2.0
//  (the "License"); you may not use this file except in compliance with
//  the License.  You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS,
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//  See the License for the specific language governing permissions and
//  limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////

package mx.controls.scrollClasses
{

import flash.events.MouseEvent;
import flash.geom.Point;
import mx.controls.Button;
import mx.core.mx_internal;
import mx.events.ScrollEventDetail;
import mx.managers.ISystemManager;

use namespace mx_internal;

/**
 *  The ScrollThumb class defines the thumb of a ScrollBar control. 
 *
 *  @see mx.controls.scrollClasses.ScrollBar
 *  @see mx.controls.HScrollBar
 *  @see mx.controls.VScrollBar
 *  
 *  @langversion 3.0
 *  @playerversion Flash 9
 *  @playerversion AIR 1.1
 *  @productversion Flex 3
 */
public class ScrollThumb extends Button
{
	include "../../core/Version.as";

	//--------------------------------------------------------------------------
	//
	//  Constructor
	//
	//--------------------------------------------------------------------------

	/**
	 *  Constructor.
	 *  
	 *  @langversion 3.0
	 *  @playerversion Flash 9
	 *  @playerversion AIR 1.1
	 *  @productversion Flex 3
	 */
	public function ScrollThumb()
	{
		super();
				
		explicitMinHeight = 10;

		stickyHighlighting = true;
	}
	
	//--------------------------------------------------------------------------
	//
	//  Variables
	//
	//--------------------------------------------------------------------------

	/**
	 *  @private
	 */
	private var ymin:Number;

	/**
	 *  @private
	 */
	private var ymax:Number;

	/**
	 *  @private
	 */
	private var datamin:Number;

	/**
	 *  @private
	 */
	private var datamax:Number;
	
	/**
	 *  @private
	 *  Last position of the thumb.
	 */
	private var lastY:Number;
	
	//--------------------------------------------------------------------------
	//
	//  Overridden methods: Button
	//
	//--------------------------------------------------------------------------

	/**
	 *  @private
	 */
	override mx_internal function buttonReleased():void
	{
		super.buttonReleased();

		stopDragThumb();
	}
	
	//--------------------------------------------------------------------------
	//
	//  Methods
	//
	//--------------------------------------------------------------------------

	/**
	 *  @private
	 *  Set the range of motion for the thumb:
	 *  how far it can move and what data values that covers.
	 */
	mx_internal function setRange(ymin:Number, ymax:Number,
								  datamin:Number, datamax:Number):void
	{
		this.ymin = ymin;
		this.ymax = ymax;
		
		this.datamin = datamin;
		this.datamax = datamax;
	}

	/**
	 *  @private
	 *  Stop dragging the thumb around.
	 */
	private function stopDragThumb():void
	{
		var scrollBar:ScrollBar = ScrollBar(parent);
		
		scrollBar.isScrolling = false;
		
		scrollBar.dispatchScrollEvent(scrollBar.oldPosition, 
                                      ScrollEventDetail.THUMB_POSITION);
        
		scrollBar.oldPosition = NaN;
		
		systemManager.getSandboxRoot().removeEventListener(
			MouseEvent.MOUSE_MOVE, mouseMoveHandler, true);

	}
	
	//--------------------------------------------------------------------------
	//
	//  Overridden event handlers: Button
	//
	//--------------------------------------------------------------------------

	/**
	 *  @private
	 *  User pressed on the thumb, so start tracking in case they drag it.
	 */
 	override protected function mouseDownHandler(event:MouseEvent):void
	{
		super.mouseDownHandler(event);

		var scrollBar:ScrollBar = ScrollBar(parent);
        scrollBar.oldPosition = scrollBar.scrollPosition;
		
		lastY = event.localY;
		
		systemManager.getSandboxRoot().addEventListener(
			MouseEvent.MOUSE_MOVE, mouseMoveHandler, true);

	}

	//--------------------------------------------------------------------------
	//
	//  Event handlers
	//
	//--------------------------------------------------------------------------

	/**
	 *  @private
	 *  Drag the thumb around and update the scroll bar accordingly.
	 */
	private function mouseMoveHandler(event:MouseEvent):void
	{
		if (ymin == ymax)
			return;

		var pt:Point = new Point(event.stageX, event.stageY);
		pt = globalToLocal(pt);
		
		var scrollMove:Number = pt.y - lastY;
		scrollMove += y;
		
		if (scrollMove < ymin)
			scrollMove = ymin;
		else if (scrollMove > ymax)
			scrollMove = ymax;

		var scrollBar:ScrollBar = ScrollBar(parent);
		
		scrollBar.isScrolling = true;
		
		$y = scrollMove;

		// In an ideal world, this would probably dispatch an event,
		// however this object is rather hardwired into a scroll bar
		// so we'll just have it tell the scroll bar to change its position.
        var oldPosition:Number = scrollBar.scrollPosition;
		var pos:Number = Math.round(
			(datamax - datamin) * (y - ymin) / (ymax - ymin)) + datamin;
		scrollBar.scrollPosition = pos;
		scrollBar.dispatchScrollEvent(oldPosition,
									  ScrollEventDetail.THUMB_TRACK);
		event.updateAfterEvent();									  
	}

}

}
