var DraggableScroll = Class.create(Draggable,{
	initialize : function(element) {
		var options = {
			zindex :1000,
			revert :false,
			quiet :false,
			scroll :false,
			scrollSensitivity :20,
			scrollSpeed :15,
			snap :false,
			delay :0,
			constraint: 'vertical',
			elementHeight: 81,
			maxScrollTopPosition: 0,
			onStart: function(o){
				o.element.is_drag = true;
			},
			onEnd: function(o){
				o.element.is_drag = false;
			},
			onDrag: function(o){
				var el = $(o.element.content_id);
				if (el.tagName.toUpperCase()=='TEXTAREA'){
					el.scrollTop = Math.round(((parseInt(o.element.style.top)-22)/(o.options.elementHeight-22))*((el.scrollHeight-el.clientHeight)));
				}else{
					el.scrollTop = Math.round((parseInt(o.element.style.top)/o.options.elementHeight)*(el.options_count*20));
				}
			}
		};
		this.options = Object.extend(options, arguments[1] || {});
		this.element = $(element);
		this.handle = this.element;
		this.dragging = false;
		this.eventMouseDown = this.initDrag.bindAsEventListener(this);
		Event.observe(this.handle, "mousedown",this.eventMouseDown);
		Draggables.register(this);
	},
	draw: function(point) {
		var pos = Position.cumulativeOffset(this.element);
		if(this.options.ghosting) {
			var r   = Position.realOffset(this.element);
			pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
		}
		var d = this.currentDelta();
		pos[0] -= d[0]; pos[1] -= d[1];
		var p = [0,1].map(function(i){ return (point[i]-pos[i]-this.offset[i]); }.bind(this));
		if(this.options.snap) {
			if(Object.isFunction(this.options.snap)) {
				p = this.options.snap(p[0],p[1],this);
			} else {
				if(Object.isArray(this.options.snap)) {
					p = p.map( function(v, i) { return (v/this.options.snap[i]).round()*this.options.snap[i]; }.bind(this));
				} else {
					p = p.map( function(v) {
						return (v/this.options.snap).round()*this.options.snap; }.bind(this));
				}
			}
		}
		var style = this.element.style;
		if((!this.options.constraint) || (this.options.constraint=='horizontal'))
			style.left = p[0] + "px";
		if((!this.options.constraint) || (this.options.constraint=='vertical'&&p[1]<=(this.options.elementHeight+2)&&p[1]>=(this.options.maxScrollTopPosition-2)))
			style.top  = p[1] + "px";
		if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
	}
});