/**
 * @author Zach
 */

Object.extend(Event, {
	wheel: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;	}
		return Math.round(delta); //Safari Round
	}
});

Event.observe = Event.observe.wrap(
function(proceed , element , eventName , handler) 
{
	if(Prototype.Browser.Gecko && eventName == 'mouseWheel')
		eventName = 'DOMMouseScroll';
		
	return proceed(element , eventName , handler);
});

var ScrollBar = new Class.create({

initialize: function(track , container , direction)
{
	this.track = $(track);
	this.handle = track.select('div')[0];
	this.container = $(container);
	if(direction == 'vertical')
		this.mover = $$('#' + container.id + " > div")[0];
	else
		this.mover = $$('#' + container.id + " > div > div")[0];
	this.bottomHandler = function(){};
	this.scrollHandler = function(){};
	this.loading = false;
	this.effect = true;
	
	this.track.setStyle({'display' : 'block'});
	//this.container.setStyle({'overflow' : 'hidden'});
	
	
	if(direction == 'vertical')
	{
		var slideHandler = this.vSliderSlide.bind(this);
		var changeHandler = this.vSliderChange.bind(this);
	}
	if(direction == 'horizontal')
	{
		var slideHandler = this.hSliderSlide.bind(this);
		var changeHandler = this.hSliderChange.bind(this);
	}
	
	this.scroller = new Control.Slider( this.handle, this.track, {
		axis: direction,
		onSlide:slideHandler,
		onChange:changeHandler
	});
	
	
	Event.observe(window , 'mouseWheel' , this.scrollResults.bindAsEventListener(this));
},

scrollResults: function(event)
{	
	event.stop();
	var change = Event.wheel(event);
	var contentHeight = this.mover.getHeight();
    var holderHeight = this.container.getHeight();
	
    var top = this.mover.getStyle('top').sub('px' , '');
	
	var position =  -((this.mover.getStyle('top').sub('px' , '')-(50 * -change)) / (contentHeight - holderHeight));

	if(position > 1) 
		position = 1;
	if(position < 0) 
		position = 0;
	this.effect = false;
    this.scroller.setValue(position);
	this.effect = true;


},


        
hSliderSlide: function(value) {
    var contentWidth = this.container.getWidth();
    var holderWidth = this.mover.getWidth();

    Element.setStyle(this.mover, {
        left: ((contentWidth - holderWidth) * value) + "px"
    });
    
},
    
hSliderChange: function(value) {
    var contentWidth = this.mover.getWidth();
    var holderWidth = this.container.getWidth();
    
    new Effect.Move(this.mover, {
        x: (-Math.ceil((contentWidth - holderWidth) * value)),
        mode: 'absolute',
        duration: .3
    });
},

vSliderSlide: function(value)
{	
    var contentHeight = this.container.getHeight();
	var holderHeight = this.mover.getHeight();

    Element.setStyle(this.mover, {
        top: ((contentHeight - holderHeight) * value) + "px"
    });
	
	if (Math.abs(Number(contentHeight - holderHeight) - Number(this.mover.getStyle('top').sub('px', ''))) < 30) 
		this.bottomHandler();
	
	this.scrollHandler((contentHeight - holderHeight) * value);
},
    
vSliderChange: function(value) {
    var contentHeight = this.mover.getHeight();
    var holderHeight = this.container.getHeight();
    
	
	
	if (this.effect == true) 
	{
		new Effect.Move(this.mover, {
			y: (-Math.ceil((contentHeight - holderHeight) * value)),
			mode: 'absolute',
			duration: .3
		});
	}
	else
	{
		Element.setStyle(this.mover, {
        	top: ((holderHeight - contentHeight) * value) + "px"
    	});
	}
	if (this.mover.getStyle('top') && Math.abs(Number(holderHeight - contentHeight) - Number(this.mover.getStyle('top').sub('px', ''))) < 30) {
		this.bottomHandler();
	}
	
	this.scrollHandler((holderHeight - contentHeight) * value);
},

resetPosition: function(value) {
    var contentHeight = this.mover.getHeight();
    var holderHeight = this.container.getHeight();
    var top = this.mover.getStyle('top').sub('px' , '');
	if(top != 0)
		var position =  -(this.mover.getStyle('top').sub('px' , '') / (contentHeight - holderHeight));
	else 
		position = 0;

    this.scroller.setValue(position);
}
		
});