var cartElem = document.getElementById('cart');

function findPosY(obj)
  {
    var curtop = 0;
    if(obj.offsetParent)
        while(1)
        {
          curtop += obj.offsetTop;
          if(!obj.offsetParent)
            break;
          obj = obj.offsetParent;
        }
    else if(obj.y)
        curtop += obj.y;
    return curtop;
  }

function getViewportHeight() {
 var viewportheight;
 
 // the more standards compliant browsers (mozilla/netscape/opera/IE7) use window.innerWidth and window.innerHeight
 
 if (typeof window.innerWidth != 'undefined')
 {
      viewportheight = window.innerHeight;
 }
 
// IE6 in standards compliant mode (i.e. with a valid doctype as the first line in the document)

 else if (typeof document.documentElement != 'undefined'
     && typeof document.documentElement.clientWidth !=
     'undefined' && document.documentElement.clientWidth != 0)
 {
       viewportheight = document.documentElement.clientHeight;
 }
 
 // older versions of IE
 
 else
 {
       viewportheight = document.getElementsByTagName('body')[0].clientHeight;
 }	
 return viewportheight;
}

if(cartElem) {
	var origPos = findPosY(cartElem);
	var scroller = null;
	
	Effect.Transitions.EaseTo = function(pos) {
    return Math.pow(pos,0.25);
};

	
	function scheduleScroll() {
		if(scroller) return;
		var yPos = findPosY(cartElem);
		if(document.documentElement.scrollTop > yPos || yPos + cartElem.offsetHeight > getViewportHeight()) doScroll = setTimeout('startScroll()', 300);
	}
	
	function finishCartFloat(obj) {
		scroller = null;	
	}
	
	function startScroll() {
		if(scroller) return;
		var cartTop = findPosY(cartElem); // top of cart element
		var cartBottom = cartTop + cartElem.offsetHeight; // bottom of cart element
		var screenBottom = getViewportHeight() + document.documentElement.scrollTop; // bottom of viewport
		var screenTop = document.documentElement.scrollTop; // top of viewport
		if(cartTop < origPos) {
			scroller = new Effect.Move(cartElem, {x: cartElem.offsetLeft, y: origPos - cartTop, mode: 'absolute', transition: Effect.Transitions.EaseTo, afterFinish: finishCartFloat});
		} else if(cartBottom > screenBottom || cartTop > screenBottom)  { // is the bottom of the cart not currently visible?
			if(cartTop > origPos) { // is the top of the cart scrolled down from its original position?
				var newCartBottom = cartBottom - screenBottom;
				if(newCartBottom >= 0) {
					newCartBottom = newCartBottom * -1; // we want to move up by this many pixels
					if(cartTop + newCartBottom >= origPos) {
						scroller = new Effect.Move(cartElem, {x: cartElem.offsetLeft, y: newCartBottom, mode: 'relative', transition: Effect.Transitions.EaseTo, afterFinish: finishCartFloat});
					}
				}
			}
		} else if(cartTop < screenTop) {
			var newCartTop = screenTop - origPos;
			if(newCartTop > 0 && newCartTop + cartElem.offsetHeight <= screenBottom) {
				scroller = new Effect.Move(cartElem, {x: cartElem.offsetLeft, y: newCartTop, mode: 'absolute', transition: Effect.Transitions.EaseTo, afterFinish: finishCartFloat});
			}
		}
	}
	
	//window.onscroll = scheduleScroll;
	//setInterval('startScroll()', 200);
}