

var contentSlider = Class.create({

	/*
	 ***************************************
	 * CONSTRUCTOR
	 ***************************************
	 */

	initialize : function(base) {
		this.base = base;
		this.setOptions();
		this.setDomElements();
		this.setProperties();
		this.setSliderNav();
		this.setElmNavEvents();
		this.disableScrolling();
	},

	/*
	 ***************************************
	 * INITIALIZATION METHODS
	 ***************************************
	 */

	setOptions : function() {
		this.options = {
			axis : 'horizontal',
			viewportSelector : '',
			holderSelector : '',
			panelSelector : '',
			sliderGripSelector : '',
			sliderTrackSelector : '',
			navPrevSelector : '',
			navNextSelector : '',
			navHoverClass : '',
			navDisabledClass : ''
		};
		for (var x in this.options) { this.options[x] = this.base.readAttribute(x) || this.options[x]; }
	},

	setDomElements : function() {
		this.viewport = this.base.select(this.options.viewportSelector)[0];
		this.holder = this.base.select(this.options.holderSelector)[0];
		this.sliderGrip = this.base.select(this.options.sliderGripSelector)[0];
		this.sliderTrack = this.base.select(this.options.sliderTrackSelector)[0];
		this.navPrev = this.base.select(this.options.navPrevSelector)[0] || null;
		this.navNext = this.base.select(this.options.navNextSelector)[0] || null;
		this.panels = this.base.select(this.options.panelSelector);
	},

	setProperties : function() { 
		this.timer = null;
		this.totalWidth=0; this.totalHeight=0;
		for(var x=0;x<this.panels.length;++x){this.totalWidth+=this.getWidthPlusMargin(this.panels[x]); this.totalHeight+=this.panels[x].getHeight()}
		if (this.options.axis=='horizontal') {
			this.holder.setStyle({width:this.totalWidth+'px'});
			this.moveBy = (this.viewport.offsetWidth/this.totalWidth)*.1;
		} else if (this.options.axis=='vertical') {
			this.moveBy = this.viewport.getHeight()/this.viewport.scrollHeight;
		}
	},

	setSliderNav : function() {
		if (this.options.axis=='horizontal') {
			this.sliderNav = new Control.Slider(this.sliderGrip, this.sliderTrack, {
				axis:this.options.axis,
				onChange:this.scrollHorizontal.bind(this),
				onSlide:this.scrollHorizontal.bind(this)
			});
		} else if (this.options.axis=='vertical') {
			this.sliderNav = new Control.Slider(this.sliderGrip, this.sliderTrack, {
				axis:this.options.axis,
				onChange:this.scrollVertical.bind(this),
				onSlide:this.scrollVertical.bind(this)
			});
		}
	},

	setElmNavEvents : function() {
		if (!this.navPrev || !this.navNext) return;
		this.navPrev.observe('mouseover',  function(){this.navPrev.addClassName(this.options.navHoverClass)}.bind(this));
		this.navNext.observe('mouseover',  function(){this.navNext.addClassName(this.options.navHoverClass)}.bind(this));
		this.navPrev.observe('mouseout',   function(){this.navPrev.removeClassName(this.options.navHoverClass);this.stopTimer()}.bind(this));
		this.navNext.observe('mouseout',   function(){this.navNext.removeClassName(this.options.navHoverClass);this.stopTimer()}.bind(this));
		this.navPrev.observe('mousedown',  function(){this.timer = new PeriodicalExecuter(function(){this.scrollFromNav(-1)}.bind(this), .05)}.bind(this));
		this.navNext.observe('mousedown',  function(){this.timer = new PeriodicalExecuter(function(){this.scrollFromNav(1)}.bind(this), .05)}.bind(this));
		this.navPrev.observe('mouseup',    function(){this.stopTimer()}.bind(this));
		this.navNext.observe('mouseup',    function(){this.stopTimer()}.bind(this));
	},

	/*
	 ***************************************
	 * HELPERS
	 ***************************************
	 */

	getWidthPlusMargin : function(t){
		var w = t.getWidth();
		var l = t.getStyle('marginLeft');
		var r = t.getStyle('marginRight');

		if (l.indexOf('%')>-1) {
			l = $(t.parentElement).getWidth() * parseInt(l,10) / 100;
		} else {
			l = parseInt(l,10) || 0;
		}

		if (r.indexOf('%')>-1) {
			r = $(t.parentElement).getWidth() * parseInt(r,10) / 100;
		} else {
			r = parseInt(r,10) || 0;
		}

		return w + l + r;
	},

	disableScrolling : function() {
		var hide = (
				(this.options.axis == 'horizontal') && (this.viewport.scrollWidth <= this.viewport.offsetWidth)
			) || (
				(this.options.axis == 'vertical') && (this.viewport.scrollHeight <= this.viewport.offsetHeight)
			);

		if (hide) {
			this.sliderNav.setDisabled();	
			this.sliderTrack.hide();
			if (this.navPrev && this.navNext) {
				this.navPrev.hide();
				this.navNext.hide();
			}
		}
	},

	/*
	 ***************************************
	 * EVENT METHODS
	 ***************************************
	 */

	stopTimer : function() {
		if (this.timer) { this.timer.stop(); }
		this.timer = null;
	},

	scrollFromNav : function(dir) {
		this.sliderNav.setValue(this.sliderNav.value + (this.moveBy * dir));
		this.scrollHorizontal();
	},

	scrollHorizontal : function() {
		this.viewport.scrollLeft = Math.round(this.sliderNav.value/this.sliderNav.maximum*(this.viewport.scrollWidth-this.viewport.offsetWidth));
	},

	scrollVertical : function() {
		this.viewport.scrollTop = Math.round(this.sliderNav.value/this.sliderNav.maximum*(this.viewport.scrollHeight-this.viewport.offsetHeight));
	}

})

NBAUtil.Events.addDomLoadedHandler(function() { $$('.sliderModule').each(function(i) { new contentSlider(i); }); });