// @data: 22.06.2007
// @revision: 1

Object.extend(Event,
{
	wheel: function(element, callback)
	{
		var __onwheel = function (event)
		{
			var delta = 0;
			if (!event) event = window.event;
			if (event.wheelDelta)
			{
				delta = event.wheelDelta/120; 
				if (window.opera) delta = -delta;
			} else if (event.detail) delta = -event.detail/3;
			delta = Math.round(delta, event); //Safari Round
		
			callback(delta);
		}
	
		if(window.addEventListener)	// FF/DOM-Compliant Browsers
			$(element).addEventListener('DOMMouseScroll', __onwheel, false);
		else if(document.attachEvent) // IE
			$(element).observe('mousewheel', __onwheel);
	}
});

if (!CD3) var CD3 = {};
			
CD3.Scroller = Class.create();
CD3.Scroller.prototype =
{
	initialize: function (container, scroller, options)
	{
		// options
		var opt = this.options = Object.extend(
		{
			scrollSpeed:	1,
			scrollStep:		1,
			styleArrow:		'arrow',
			styleMoveUp:	'moveup',
			styleMoveDown:	'movedown',
			styleSlider:	'slider'
			// @todo: да се разширява в зависимост от съдържанието
		}, options || {});					
		
		// base elements
		this.container	= $(container);
		this.scroller	= $(scroller);

		// arrows
		this.scroller.getElementsByClassName(opt.styleArrow).each(function (el)
		{
			el.observe('mousedown',	this.startScroll.bind(this, el));
			el.observe('mouseup',	this.stopScroll.bind(this));
			el.observe('mouseout',	this.stopScroll.bind(this));
		}.bind(this));
		
		// set handle
		var handle = this.handle = opt.styleSlider;// this.scroller.down('.' + opt.styleSlider);
		
		this.sliderMaxHeight = handle.parentNode.offsetHeight - handle.offsetHeight;
			
		new Draggable(handle,
		{ 
			constraint: 'vertical', 
			snap: function(x, y)
			{
				return [x, this.validateTopPosition(y)];
			}.bind(this),
			change: this.traceHandlePosition.bind(this),
			onStart: this.stopScroll.bind(this)
		});

		// trackpath
		this.trackPosition = Position.cumulativeOffset(handle.parentNode);
		handle.parentNode.observe('click', function (e)
		{
			var clickedY =  Event.pointerY(e)  - this.trackPosition[1];
				clickedY = this.validateTopPosition(clickedY);
							
			new Effect.Morph(this.handle,
			{
				style:		 { top : clickedY + 'px'},
				duration:	 0.5,
				afterUpdate: this.traceHandlePosition.bind(this),
				queue:		{scope: 'scroller', limit:1}
			});
		}.bindAsEventListener(this));
					
		// wheel
		Event.wheel(this.container, this.traceMouseWheel.bind(this));
				
		// check if needed	
		this.checkIfneeded();
	},
	destroy: function()
	{
		// @todo
	},
	startScroll: function (el)
	{
		this.stopScroll();
		
		var dir = el.hasClassName(this.options.styleMoveUp) ? -1 : 1;
				
		this.interval = setInterval(function (dir) { this.scrollBy(dir); }.bind(this, dir), 3);
	},
	stopScroll: function ()
	{
		clearInterval(this.interval);
	},
	scrollBy: function (dir)
	{
		var y 					= (parseInt(this.handle.style.top) || 0) + dir;
		this.handle.style.top	= this.validateTopPosition(y) + 'px';
		this.traceHandlePosition();
	},
	setHandlePosition: function()
	{
		var container			= this.container;
		this.handle.style.top	= (this.sliderMaxHeight * (container.scrollTop / (container.scrollHeight - container.offsetHeight))) + 'px';
	},
	traceHandlePosition: function ()
	{
		var scroll		= parseInt(this.handle.getStyle('top')) || 0;
		var container	= this.container;
		this.container.scrollTop = (container.scrollHeight - container.offsetHeight) * (scroll/this.sliderMaxHeight);
	},
	validateTopPosition: function(y)
	{
		if(y <= 0) return 0;
		if(y >= this.sliderMaxHeight) return this.sliderMaxHeight;
		
		return y;
	},
	traceMouseWheel: function(delta)
	{
		this.stopScroll();
		
		if (delta != 0)
			this.scrollBy((delta > 0 ? -1 : 1) * 15);			
	},
	checkIfneeded: function()
	{
		if (this.container.scrollHeight <=this.container.offsetHeight)
			this.scroller.hide();
		else
			this.scroller.show();
	}
};
CD3.Scroller.create = function(areas)
{
	// @TODO build scroller and create new instance ot Scroller
	if (typeof areas == 'Function')
	{
		areas = areas();
	}
	
	if (!areas[0] || !areas[1]) return;
};

Event.observe(window, 'load', function()
{
	var slider = $$('.Scroller')[0];
	new CD3.Scroller($$('.ScrollingContent')[0], slider,
	{
		styleSlider: slider.down('a')
	});
});
