/*
 
Free for non-commercial use.
Copyright 2006 Positive BLue, LLC <info@positiveblue.com>
 
Example:
import sScroll;
 
target_text_txt.multiline = true;
target_text_txt.autoSize = true;
 
var ssc = new sScroll();
ssc.__horizontal = true;
ssc.__hideable = true;
ssc.__useTween = true;
ssc.__tweenFrames = 10;
ssc.__target = target_text_txt;
ssc.__mask = mask_mc;
ssc.__scroller = scroller_mc;
ssc.__dragger = scroller_mc.dragger_mc;
 
ssc.initScroller();
 
*/
 
import mx.transitions.Tween;
import mx.transitions.easing.*;
 
class sScroll
{
        // horizontal - true; vertical - false
        public var isHorizontal:Boolean = false;
 
        public var mask_mc:Object;
        public var target_mc:Object;
        public var scroller_mc:Object;
        public var dragger_mc:Object;
 
        // mask position and size
        public var maskHeight:Number;
        public var maskPositionTop:Number;
 
        public var maskWidth:Number;
        public var maskPositionLeft:Number;
 
        // scroller position and size
        public var scrollerTop:Number;
        public var scrollerLeft:Number;
 
        public var scrollerHeight:Number;
        public var scrollerWidth:Number;
 
        public var draggerMinSize:Number = 30; // 30 pixels minimum dragger size
        public var draggerMaxSize:Number = 70; // 70 pixels maximum dragger size
 
        public var hideable:Boolean = false;
 
        public var useTween:Boolean = false;
        public var tweenTime:Number = 0;
        public var tweenFrames:Number = 0;
        public var tweenType:Object = Strong.easeOut;
 
 
 
        public function set __horizontal(h:Boolean):Void
        {
                isHorizontal = h;
        };
 
        public function set __target(target:Object):Void
        {
                target_mc = target;
        };
 
        public function set __mask(mask:Object):Void
        {
                mask_mc = mask;
        };
 
        public function set __scroller(scroller:Object):Void
        {
                scroller_mc = scroller;
        };
 
        public function set __dragger(dragger:Object):Void
        {
                dragger_mc = dragger;
        };
 
        public function set __maskY(y:Number):Void
        {
                maskPositionTop = y;
        };
 
        public function set __maskX(x:Number):Void
        {
                maskPositionLeft = x;
        };
 
        public function set __scrollerY(y:Number):Void
        {
                scrollerTop = y;
        };
 
        public function set __scrollerX(x:Number):Void
        {
                scrollerLeft = x;
        };
 
        public function set __draggerMinSize(s:Number):Void
        {
                draggerMinSize = s;
        };
 
        public function set __draggerMaxSize(s:Number):Void
        {
                draggerMaxSize = s;
        };
 
        public function set __hideable(s:Boolean):Void
        {
                hideable = s;
        };
 
        public function set __useTween(s:Boolean):Void
        {
                useTween = s;
        };
 
        public function set __tweenTime(s:Number):Void
        {
                tweenTime = s;
        };
 
        public function set __tweenFrames(s:Number):Void
        {
                tweenFrames = s;
        };
 
        public function set __tweenType(s:Object):Void
        {
                tweenType = s;
        };
 
 
 
        public function initScroller():Void
        {
                maskPositionLeft = mask_mc._x;
                maskPositionTop = mask_mc._y;
 
                target_mc._x = maskPositionLeft;
                target_mc._y = maskPositionTop;
 
                maskHeight = mask_mc._height;
                maskWidth = mask_mc._width;
 
                scrollerHeight = scroller_mc._height;
                scrollerWidth = scroller_mc._width;
 
                if (isHorizontal)
                {
                        dragger_mc._x = 0;
 
                        dragger_mc._width = scrollerWidth;
                        dragger_mc._width *= target_mc._width / maskWidth;
                        if (dragger_mc._width < draggerMinSize)
                        {
                                dragger_mc._width = draggerMinSize;
                        } else if (dragger_mc._width > draggerMaxSize) {
                                dragger_mc._width = draggerMaxSize;
                        }
 
                        var shouldHide:Boolean = target_mc._width / maskWidth <= 1;
 
                        dragger_mc.myY = dragger_mc._y;
                        dragger_mc.myLeft = dragger_mc._x;
                        dragger_mc.myRight = Math.round((dragger_mc._x + scrollerWidth) - dragger_mc._width);
                } else {
                        dragger_mc._y = 0;
 
                        dragger_mc._height = scrollerHeight;
 
                        dragger_mc._height *= maskHeight / target_mc._height;
                        if (dragger_mc._height < draggerMinSize)
                        {
                                dragger_mc._height = draggerMinSize;
                        } else if (dragger_mc._height > draggerMaxSize) {
                                dragger_mc._height = draggerMaxSize;
                        }
 
                        var shouldHide:Boolean = target_mc._height / maskHeight <= 1;
 
                        dragger_mc.myX = dragger_mc._x;
                        dragger_mc.myTop = dragger_mc._y;
                        dragger_mc.myBottom = Math.round((dragger_mc._y + scrollerHeight) - dragger_mc._height);
                }
 
                if (hideable && shouldHide)
                {
                        scroller_mc._visible = false;
                } else {
                        scroller_mc._visible = true;
                        dragger_mc.ssc = this;
 
                        dragger_mc.onMouseDown = function():Void
                        {
                                this.dragging = true;
                                if (this.ssc.isHorizontal)
                                {
                                        this.startDrag(false, this.myLeft, this.myY, this.myRight, this.myY);
                                } else {
                                        this.startDrag(false, this.myX, this.myTop, this.myX, this.myBottom);
                                }
                        };
 
                        dragger_mc.onMouseUp = function():Void
                        {
                                this.dragging = false;
                                this.stopDrag();
                        };
 
                        dragger_mc.onMouseMove = function():Void
                        {
                                if (this.dragging)
                                {
                                        if (this.ssc.isHorizontal)
                                        {
                                                var onePerc:Number = (this.ssc.target_mc._width - this.ssc.maskWidth) / 100 + .1;
 
                                                var vWidth:Number = this.ssc.scrollerWidth - this._width;
                                                var percPos:Number = Math.round(this._x / vWidth * 100);
 
                                                var rPos:Number = onePerc * percPos;
 
                                                if (this.ssc.useTween)
                                                {
                                                        var t:Number = this.ssc.tweenTime > 0 ? this.ssc.tweenTime : this.ssc.tweenFrames;
                                                        new Tween(this.ssc.target_mc, '_x', this.ssc.tweenType, this.ssc.target_mc._x, this.ssc.maskPositionLeft - rPos, t, this.ssc.tweenTime > 0);
                                                } else {
                                                        this.ssc.target_mc._x = this.ssc.maskPositionLeft - rPos;
                                                }
                                        } else {
                                                var onePerc:Number = (this.ssc.target_mc._height - this.ssc.maskHeight) / 100 + .1;
 
                                                var vHeight:Number = this.ssc.scrollerHeight - this._height;
                                                var percPos:Number = Math.round(this._y / vHeight * 100);
 
                                                var rPos:Number = onePerc * percPos;
 
                                                if (this.ssc.useTween)
                                                {
                                                        var t:Number = this.ssc.tweenTime > 0 ? this.ssc.tweenTime : this.ssc.tweenFrames;
                                                        new Tween(this.ssc.target_mc, '_y', this.ssc.tweenType, this.ssc.target_mc._y, this.ssc.maskPositionTop - rPos, t, this.ssc.tweenTime > 0);
                                                } else {
                                                        this.ssc.target_mc._y = this.ssc.maskPositionTop - rPos;
                                                }
                                        }
                                }
                        };
                }
        };
}