var mooScroller = new Class({
	Implements: [Events, Options, Chain],
	options: {
		resizeScrollButton: true,
		wheelStep: 16
	},
	
	initialize: function(selector, options){		
		this.setOptions(options);
		this.initScroller(selector);
	},
	
	initScroller: function(selector){
		if ($type(selector) != "array") {
			return;
		}
		
		// create scroller
		var fn = this;	
		selector.each(function(el){
			fn.setupScroller(el);
		});
	},
	
	setupScroller: function(el){
		var fn = this;
		
		// create scroller bar
		var bar = new Element("div", {
			"class": "scrollerStyle smScroller",
			"html": "<p class=\"smScrollUp\">"+
								"<a href=\"javascript:void(0);\"><span>&nbsp;</span></a>"+
							"</p>"+
							"<p class=\"smScrollDx\">"+
								"<a href=\"javascript:void(0);\"><span>&nbsp;</span></a>"+
							"</p>"+
							"<p class=\"smScrollDn\">"+
								"<a href=\"javascript:void(0);\"><span>&nbsp;</span></a>"+
							"</p>"
		}).inject(el, "after");
		if(bar.getNext('div.scrollerStyle')){
			bar.getNext('div.scrollerStyle').dispose();
		}
		// get elements
		var scroller = bar.getChildren();
		var upBtn = scroller[0].getFirst();
		var scrollBar = scroller[1];
		var scrollBtn = scroller[1].getFirst();
		var dnBtn = scroller[2].getFirst();
		
		// set height				
		var elHeight = 0;
		/*console.log(el.getScrollSize().y);
		if(el.hasClass('contResult') && el.getScrollSize().y > 456){
			elHeight = 455;
			el.setStyle('height', elHeight);
		}else{*/
			elHeight = el.getCoordinates().height;
		//}
		bar.set("styles", {"height": elHeight});		
		scrollBar.set("styles", {"height": elHeight - upBtn.getCoordinates().height - dnBtn.getCoordinates().height});
		
		// calculate size		
		var containerHeight = elHeight;
		var availableScroll = el.getScrollSize().y;		
		var scrollBarHeight = elHeight - upBtn.getCoordinates().height - dnBtn.getCoordinates().height;
		var scale = scrollBarHeight / availableScroll;		
		var maxScroll = availableScroll - containerHeight;
		var totalStep = Math.round(maxScroll / this.options.wheelStep);
		
		// store value to reset scroller
		el.store("maxScroll", maxScroll);
		el.store("currentPos", 0);
		
		// resize scroll button
		if (this.options.resizeScrollButton == true) {
			scrollBtn.set("styles", {"height": scrollBarHeight * scale});
		}
		
		// if have scroll
		var hasScroll = ((availableScroll - elHeight) > 0);		
		scrollBtn.set("styles", {
			"display": (!hasScroll) ? "none" : "block"
		});
		bar.set("styles", {
			"display": (!hasScroll) ? "none" : ""
		});
		if(!hasScroll){
			el.setStyle('height', 'auto');			
			if(el.hasClass('contResult')){
				el.setStyle('width', '973px');
				if(el.getElements('dl').length){
					el.getElements('dl').each(function(dlTag){
						dlTag.setStyle('width', 'auto');
					});
				}
			}
			
		}
		bar.set("opacity", (!hasScroll) ? 0 : 1);		
		// add slider (scroller behaviors)
		el.store("slider", new Slider(scrollBar, scrollBtn, {
			onChange: function(pos){
				el.scrollTo(0, el.retrieve("maxScroll") * pos / totalStep);
				el.store("currentPos", pos);
			},
			mode: "vertical",
			range: [0, totalStep]
		}).set(0));
		
		// element wheel
		if(hasScroll){
			el.scrollTo(0, 0).addEvents({
				"mousewheel": function(e){
					e.stop();
					el.retrieve("slider").set(el.retrieve("currentPos") - e.wheel);				
				}
			});
		}
		
		var scrolInterval = null;
		// up button
		upBtn.addEvents({
			"mousedown": function(e){
				scrolInterval = setInterval(function(){
					el.retrieve("slider").set(el.retrieve("currentPos") - 1);
				}, 20);
			},
			"mouseup": function(e){
				clearInterval(scrolInterval);
			},
			"mouseout": function(e){
				clearInterval(scrolInterval);
			}
		});
		
		// down button
		dnBtn.addEvents({
			"mousedown": function(e){
				scrolInterval = setInterval(function(){
					el.retrieve("slider").set(el.retrieve("currentPos") + 1);
				}, 20);
			},
			"mouseup": function(e){
				clearInterval(scrolInterval);
			},
			"mouseout": function(e){
				clearInterval(scrolInterval);
			}
		});
	},
	
	resetScroller: function(el) {
		var scrollBar = el.getNext().getElement("p.smScrollDx");
		var scrollBtn = scrollBar.getFirst();
		var containerHeight = el.getSize().y;
		var availableScroll = el.getScrollSize().y;
		var scrollBarHeight = scrollBar.getCoordinates().height;
		var scale = scrollBarHeight / availableScroll;
		var maxScroll = availableScroll - containerHeight;
		var totalStep = Math.round(maxScroll / this.options.wheelStep);
		
		// store value to reset scroller
		el.store("maxScroll", maxScroll);
		
		// resize scroll button
		if (this.options.resizeScrollButton == true) {
			scrollBtn.set("styles", {"height": scrollBarHeight * scale});
		}
		
		// re create new slider
		el.store("slider", new Slider(scrollBar, scrollBtn, {
			onChange: function(pos){
				el.scrollTo(0, el.retrieve("maxScroll") * pos / totalStep);
				el.store("currentPos", pos);
		    },
			mode: "vertical",
			range: [0, totalStep]
		}).set(el.retrieve("currentPos")));
	}
});

window.addEvent('domready', function(){	
	new mooScroller($$(".smScrollContent"));
});