      *  @private
      *  Helper function to determine whether the viewport scrolls horizontally
      */
-    mx_internal function get shouldScrollHorizontally():Boolean
-    {
-        var viewportUIC:IUIComponent = viewport as IUIComponent;
-        var explicitViewportW:Number = viewportUIC ? viewportUIC.explicitWidth : NaN;
-        var viewportW:Number = isNaN(explicitViewportW) ? (viewport.width - (minViewportInset * 2)) : explicitViewportW;
-        
-        return viewport.contentWidth >= (viewportW + SDT);
+    mx_internal function get canScrollHorizontally():Boolean
+    {
+        if (getStyle("horizontalScrollPolicy") == ScrollPolicy.ON)
+            return true;
+        
+        if (getStyle("horizontalScrollPolicy") == ScrollPolicy.AUTO)
+        {
+            var viewportUIC:IUIComponent = viewport as IUIComponent;
+            var explicitViewportW:Number = viewportUIC ? viewportUIC.explicitWidth : NaN;
+            var viewportW:Number = isNaN(explicitViewportW) ? (viewport.width - (minViewportInset * 2)) : explicitViewportW;
+            
+            return viewport.contentWidth >= (viewportW + SDT);
+        }
+        
+        return false;
     }
     
     /**
      *  @private
      *  Helper function to determine whether the viewport scrolls vertically
      */
-    mx_internal function get shouldScrollVertically():Boolean
-    {
-        var viewportUIC:IUIComponent = viewport as IUIComponent;
-        var explicitViewportH:Number = viewportUIC ? viewportUIC.explicitHeight : NaN;
-        var viewportH:Number = isNaN(explicitViewportH) ? (viewport.height - (minViewportInset * 2)) : explicitViewportH;
-        
-        return viewport.contentHeight >= (viewportH + SDT);
+    mx_internal function get canScrollVertically():Boolean
+    {
+        if (getStyle("verticalScrollPolicy") == ScrollPolicy.ON)
+            return true;
+        
+        if (getStyle("verticalScrollPolicy") == ScrollPolicy.AUTO)
+        {
+            var viewportUIC:IUIComponent = viewport as IUIComponent;
+            var explicitViewportH:Number = viewportUIC ? viewportUIC.explicitHeight : NaN;
+            var viewportH:Number = isNaN(explicitViewportH) ? (viewport.height - (minViewportInset * 2)) : explicitViewportH;
+            
+            return viewport.contentHeight >= (viewportH + SDT);
+        }
+        
+        return false;
     }
     
     /**

     *  If we are scrolling, this is used to dispatch TouchScrollEvent.TOUCH_SCROLL_DRAG
     *  events and to determine how far the user has scrolled.
     */
    protected function sbRoot_mouseMoveHandler(event:MouseEvent):void
    {
        var mouseDownedDifference:Point = addMouseEventHistory(event);
        

            finalVSP = viewport.verticalScrollPosition - (velocityY * THROW_EFFECT_TIME) + (.5 * decelerationRateY * THROW_EFFECT_TIME * THROW_EFFECT_TIME);
        }
        
        // maybe use motion paths with more keyframes for the bounce effect??
        
        var throwEffectMotionPaths:Vector.<MotionPath> = new Vector.<MotionPath>();
        
        // set up a simple motion path for the animation from our current hsp/vsp to
        // the final hsp/vsp.
        var timeToReachHSP:Number = 0;
        var timeToReachVSP:Number = 0;
        
        if (canScrollHorizontally)
        {
            var horizontalMP:MotionPath = new SimpleMotionPath("horizontalScrollPosition", hsp, finalHSP);
            var hspToUse:Number = Math.min(Math.max(finalHSP,0), maxWidth);
            
            // see formula in VSP section.
            if (finalHSP == hspToUse)
                timeToReachHSP = THROW_EFFECT_TIME;
            else
                timeToReachHSP = THROW_EFFECT_TIME*(1-(Math.pow(1-((hspToUse-hsp)/(finalHSP-hsp)),.25)));
            
            horizontalMP.keyframes = Vector.<Keyframe>([new Keyframe(0, null), new Keyframe(timeToReachHSP, hspToUse)]);
            throwEffectMotionPaths.push(horizontalMP);
            scrollingHorizontally = true;
        }
