var mooScroller = new Class({
	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;
		//if has smScroller then return true;
		
		// create scroller
		var bar = new Element("div", {
			"class": "smScroller",
			"html": "<p class=\"smScrollUp\"  style=\"display:none;\"><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\"  style=\"display:none;\"><a href=\"javascript:void(0);\"><span>&nbsp;</span></a></p>"
		}).inject(el, "after");
		
		// 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 = el.getCoordinates().height;		
		bar.set("styles", {"height": elHeight});
		scrollBar.set("styles", {"height": elHeight - upBtn.getCoordinates().height - dnBtn.getCoordinates().height});
		
		// calculate size
		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);
		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-10 > 0);
		/*
		scrollBtn.set("styles", {
			"display": (!hasScroll) ? "none" : "block"
		});
		*/
		bar.set("opacity", (!hasScroll) ? 0.5 : 1);
		
		if(!hasScroll) {
			return true;	
		}
		// 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 + 1)]
		}).set(0));
		
		// element wheel
		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);
			}
		});
		
	
	return true;
	},
	
	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")));
	}
});

mooScroller.implement(new Events, new Options, new Chain);

var scroller;
window.addEvent("load" ,  function(){		
	setTimeout(function(){
		scroller = new mooScroller($$(".smScrollContent"), {});
	}, 500);
	if($$('.tabContent').length > 0) {
	}
});
