/*
**	Simple scrollarea Javascript class
**
**	(c) 2011 Mikoon Webservices
*/

/*
**	Example Usage:
**
**	var my_scroller = new ns_scroller('container', 'scrollbar', 'scrollhandle', {has_scrollbar: true, has_updown: true});
**
*/

var scrollarea = new Class({
	
	Implements: Options,
	
	//	options
	options: {
		wheelsensitivity: 30,
		scrollinterval: 20,
		scrollstep: 3,
		has_scrolbar: true,
		has_updown: true
	},
	
	//	variables set through class initialization call
	element: {},
	scrollbar: {},
	scrollhandle: {},
	slider: {},
	
	//	internal variables
	steps: 0,	
	interval: 0,
			
	initialize: function(in_element, in_scrollbar, in_scrollhandle, options){
		
		//	set options
		this.setOptions(options);
		
		//	initialize elements
		this.element = $(in_element);
		this.scrollbar = $(in_scrollbar);
		this.scrollhandle = $(in_scrollhandle);

		//	get scrollabla area
		this.steps = (this.element.getScrollSize().y - this.element.getSize().y);

		if(this.steps > 0){
			//	setup events
			this.setup();
		}
		
	},
	
	setup: function(){
		
		//	remove current events
		$$(this.scrollbar, this.scrollhandle).removeEvents();
		
		//	add slider
		this.slider = new Slider(this.scrollbar, this.scrollhandle, {	
			steps: this.steps,
			mode: 'vertical',
			onChange: (function(step){
				this.element.scrollTo(0,step);
			}).bind(this)
		}).set(0);
		
		//	add mouswheel
		$$(this.element, this.scrollbar).removeEvents('mousewheel');
		
		$$(this.element, this.scrollbar).addEvent('mousewheel', (function(e){	
			e = new Event(e).stop();
			var new_step = this.slider.step - e.wheel * this.options.wheelsensitivity;	
			this.slider.set(new_step);					
		}).bind(this));
		
		//	setup up/down buttons
		this.element.getParent().getElements('.up').removeEvents('mousedown');this.element.getParent().getElements('.up').removeEvents('mouseup');this.element.getParent().getElements('.up').removeEvents('mouseleave');
		this.element.getParent().getElements('.up').addEvent('mousedown', 	(function(){ this.scroll(1); this.interval = this.scroll.periodical(this.options.scrollinterval, this, 1); }).bind(this));
		this.element.getParent().getElements('.up').addEvent('mouseup', 	(function(){ clearInterval(this.interval); }).bind(this));
		this.element.getParent().getElements('.up').addEvent('mouseleave', 	(function(){ clearInterval(this.interval); }).bind(this));
		
		this.element.getParent().getElements('.down').removeEvents('mousedown');this.element.getParent().getElements('.down').removeEvents('mouseup');this.element.getParent().getElements('.down').removeEvents('mouseleave');
		this.element.getParent().getElements('.down').addEvent('mousedown', (function(){ this.scroll(-1); this.interval = this.scroll.periodical(this.options.scrollinterval, this, -1); }).bind(this));
		this.element.getParent().getElements('.down').addEvent('mouseup', 	(function(){ clearInterval(this.interval); }).bind(this));
		this.element.getParent().getElements('.down').addEvent('mouseleave', (function(){ clearInterval(this.interval); }).bind(this));
		
	},
	
	scroll: function(in_direction){
		var new_step = this.slider.step - this.options.scrollstep * in_direction;	
		if(new_step > -10){
			this.slider.set(new_step);	
		}
	}
	
});
