var A = Ext.lib.Anim;
Ext.override(Ext.Element, {
	scrollTo : function(left, top, animate, from){
		if(typeof left != 'number'){
			if(left.toLowerCase() == 'left'){
				left = top;
				top = this.dom.scrollTop;
			}else{
				left = this.dom.scrollLeft;
			}
		}
		if(!animate || !A){
			this.dom.scrollLeft = left;
			this.dom.scrollTop = top;
		}else{
			this.anim({scroll: {'from': from, 'to': [left, top]}}, this.preanim(arguments, 2), 'scroll');
		}
		return this;
	},
	scrollIntoView : function(container, hscroll, animate){
        var cscrollTop, cscrollLeft;
        var c = Ext.getDom(container);
        if(!c)
        {
            c=Ext.getDom(Ext.getBody());
            scrollxy=this.getScrollXY();
            cscrollTop=scrollxy[1];
            cscrollLeft=scrollxy[0];
        }
        else
        {
            cscrollTop=c.scrollTop;
            cscrollLeft=c.scrollLeft;
        }

        var el = this.dom,
            o = this.getOffsetsTo(c),
            l = o[0] + cscrollLeft,
            t = o[1] + cscrollTop,
            b = t + el.offsetHeight,
            r = l + el.offsetWidth,
            ch = c.clientHeight,
            ct = parseInt(cscrollTop, 10),
            cl = parseInt(cscrollLeft, 10),
            cb = ct + ch,
            cr = cl + c.clientWidth;

        var ctop=parseInt(o[1]);
        if (el.offsetHeight > ch || t < ct) {
            ctop = t;
        } else if (b > cb){
            ctop = b-ch;
        }

        var cleft=o[0];
        if(hscroll !== false){
            if(el.offsetWidth > c.clientWidth || l < cl){
                cleft = l;
            }else if(r > cr){
                cleft = r - c.clientWidth;
            }
        }
        return Ext.get(c).scrollTo(cleft, ctop, animate, [cscrollLeft,cscrollTop]);
	},
	scrollChildIntoView : function(child, hscroll, animate){
		Ext.fly(child, '_scrollChildIntoView').scrollIntoView(this, hscroll, animate);
	},	
	getScrollXY: function()
	{
	    var scrOfX = 0, scrOfY = 0;
	    if( typeof( window.pageYOffset ) == 'number' )
	    {
	        //Netscape compliant
	        scrOfY = window.pageYOffset;
	        scrOfX = window.pageXOffset;
	    }
	    else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) )
	    {
	        //DOM compliant
	        scrOfY = document.body.scrollTop;
		scrOfX = document.body.scrollLeft;
	    } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
	        //IE6 standards compliant mode
	        scrOfY = document.documentElement.scrollTop;
	        scrOfX = document.documentElement.scrollLeft;
	    }
	    return [ scrOfX, scrOfY ];
	}
});

