    Ext.define('Ext.scroll.scroller.ScrollPosition', {
        extend: 'Ext.scroll.scroller.CssPosition',

        config: {
            stretcherCls: 'x-scroll-stretcher'
        },

        constructor: function() {
            this.stretchSize = { x: 0, y: 0 };

            return this.callParent(arguments);
        },

        getStretcher: function() {
            var stretcher = this.stretcher,
                element;

            if (!stretcher) {
                element = this.getElement();

                if (element) {
                    this.stretcher = stretcher = Ext.Element.create({
                        className: this.getStretcherCls()
                    });
                    stretcher.insertBefore(element);
                }
            }

            return stretcher;
        },

        stretch: function(x, y) {
            var strechSize = this.stretchSize,
                stretcher = this.getStretcher(),
                element = this.getElement();

            strechSize.x = x;
            strechSize.y = y;

            stretcher.setWidth(x * 3);
            stretcher.setHeight(y * 3);

            element.setLeft(x);
            element.setTop(y);

            return this;
        },

        shrink: function() {
            var stretcher = this.getStretcher(),
                element = this.getElement();

            stretcher.setWidth(0);
            stretcher.setHeight(0);

            element.setLeft(0);
            element.setTop(0);
        },

        doScrollTo: function(x, y) {
            var containerDom = this.getContainer().dom,
                stretchSize = this.stretchSize;

            if (x !== null) {
                containerDom.scrollLeft = x + stretchSize.x;
            }

            if (y !== null) {
                containerDom.scrollTop = y + stretchSize.y;
            }
        },

        determinePosition: function() {
            var containerDom = this.getContainer().dom,
                stretchSize = this.stretchSize;

            return {
                x: containerDom.scrollLeft - stretchSize.x,
                y: containerDom.scrollTop - stretchSize.y
            };
        },

        onTouchStart: function() {
            var position = this.determinePosition();

            this.scrollTo(position.x, position.y);

            this.callParent(arguments);
        },

        onAfterInitialized: function() {
            this.callParent(arguments);

            this.refreshStretch();
        },

        refresh: function() {
            this.callParent(arguments);

            this.refreshStretch();
        },

        refreshStretch: function() {
            var position = this.position,
                size,
                containerSize,
                stretchX, stretchY;

            this.shrink();

            size = this.getSize();
            containerSize = this.getContainerSize();

            stretchX = Math.max(size.x, containerSize.x);
            stretchY = Math.max(size.y, containerSize.y);

            this.stretch(stretchX, stretchY);

            this.doScrollTo(position.x, position.y);
        },

        destroy: function() {
            var element = this.getElement();

            if (element) {
                this.getStretcher().destroy();
                element.setLeft(null);
                element.setTop(null);
            }

            this.callParent(arguments);
        }
    });