YAHOO.namespace("cywalk.HTMLScroller");

/**
 * Javascript-Scrollbalken
 *
 * Diese Komponente benötigt die Yahoo User Interface Library
 */
YAHOO.cywalk.HTMLScroller = function(scrollBox, scrollContent, scrollBar, height) {
	
	this.box = YAHOO.util.Dom.get(scrollBox);
	this.sliderBox = YAHOO.util.Dom.get("sliderbg");
	this.upBox = YAHOO.util.Dom.get("uplink");
	this.downBox = YAHOO.util.Dom.get("downlink");
	this.scrollBar = YAHOO.util.Dom.get(scrollBar);
	this.isScrollable = true;
	
	// Scrollen mittels MouseWheel ermöglichen
	var scrollEvent = (YAHOO.env.ua.ie) ? "mousewheel" : "DOMMouseScroll";
	YAHOO.util.Event.addListener(this.box, scrollEvent, this.onMouseWheel, this, true);
	
	YAHOO.util.Dom.setStyle(this.box, "height", height + "px");
	YAHOO.util.Dom.setStyle(this.sliderBox, "height", (height - 22) + "px");
	YAHOO.util.Dom.setStyle(this.downBox, "top", (height - 11) + "px");
	
	this.boxRegion = YAHOO.util.Dom.getRegion(this.box);
	this.boxHeight = this.boxRegion.bottom - this.boxRegion.top;
	
	this.content = YAHOO.util.Dom.get(scrollContent);
	this.contentRegion = YAHOO.util.Dom.getRegion(this.content);
	this.contentHeight = this.contentRegion.bottom - this.contentRegion.top;
	
	// Maximale Scrollposition berechnen
	this.maxScrollPos = this.boxHeight - this.contentHeight;
	
	// Ist ein Scrollen möglich?
	if (this.maxScrollPos > 0) {
		
		// NEIN: Scrollen deaktivieren
		this.maxScrollPos = 0;
		
		// Steuerelement heller darstellen
		YAHOO.util.Dom.setStyle([
			this.sliderBox,
			this.upBox,
			this.downBox
		], "opacity", "0.25");
		
		// Scrollbalken ausblenden
		YAHOO.util.Dom.setStyle(this.scrollBar, "display", "none");
		
		this.isScrollable = false;
	}
	
	this.currentScrollPos = 0;
	this.scrollStep = Math.abs(Math.ceil(this.maxScrollPos/5));
	this.sliderMaxRange = height-22-161;
	
	// Slider-Komponenten
	if (this.isScrollable) {
		this.slider = YAHOO.widget.Slider.getVertSlider(this.sliderBox, this.scrollBar, 0, this.sliderMaxRange);
		this.slider.subscribe("change", this.onSliderChange, this, true);
	}
	
	this.scrollTo(0);
	
} // Ende des Konstruktors: HTMLScroller()

YAHOO.cywalk.HTMLScroller.prototype.onSliderChange = function(newValue) {
	
	if (!this.isScrollable) {
		return;
	}
	
	var scrollPos = Math.ceil((newValue/this.sliderMaxRange)*this.maxScrollPos);
	this.scrollTo(scrollPos, true);
	
} // Ende der Methode: onSliderChange()

YAHOO.cywalk.HTMLScroller.prototype.onMouseWheel = function(e) {
	
	if (!this.isScrollable) {
		return;
	}
	
	var e = e ? e : window.event;
  	var wheelData = e.detail ? e.detail *-40 : e.wheelDelta;
	
	if (wheelData > 0) {
		if (this.currentScrollPos < 0) {
			this.scrollTo(this.currentScrollPos + wheelData);
		}
		else if (this.currentScrollPos > 0) {
			this.scrollTo(0);
		}
	}
	else if (wheelData < 0) {
		if (this.currentScrollPos > this.maxScrollPos) {
			this.scrollTo(this.currentScrollPos + wheelData);
		}
		else if (this.currentScrollPos < this.maxScrollPos) {
			this.scrollTo(this.maxScrollPos);
		}
	}

	// Der Event soll nicht weiter gegeben werden.
	YAHOO.util.Event.stopEvent(e);

} // Ende der Methode: onMouseWheel()

YAHOO.cywalk.HTMLScroller.SCROLL_UP = -1;
YAHOO.cywalk.HTMLScroller.SCROLL_UP_MAX = -2;
YAHOO.cywalk.HTMLScroller.SCROLL_DOWN = 1;
YAHOO.cywalk.HTMLScroller.SCROLL_DOWN_MAX = 2;

YAHOO.cywalk.HTMLScroller.prototype.scroll = function(direction) {
	
	if (!this.isScrollable) {
		return;
	}
	
	var scrollStart = this.currentScrollPos;
	var scrollEnd = scrollStart;
	
	switch(direction) {
		case YAHOO.cywalk.HTMLScroller.SCROLL_DOWN:
			if ((scrollStart - this.scrollStep) > this.maxScrollPos) {
				scrollEnd = scrollStart-=this.scrollStep;
			}
			else {
				scrollEnd = this.maxScrollPos;
			}
			break;
			
		case YAHOO.cywalk.HTMLScroller.SCROLL_DOWN_MAX:
			scrollEnd = this.maxScrollPos;
			break;
			
		case YAHOO.cywalk.HTMLScroller.SCROLL_UP:
			if ((scrollStart + this.scrollStep) < 0) {
				scrollEnd = scrollStart+=this.scrollStep;
			}
			else {
				scrollEnd = 0;
			}
			break;
			
		case YAHOO.cywalk.HTMLScroller.SCROLL_UP_MAX:
			scrollEnd = 0;
			break;
			
		default:
			return;
	}
	
	this.scrollTo(Math.ceil(scrollEnd));
	
} // Ende der Methode: scroll()

YAHOO.cywalk.HTMLScroller.prototype.scrollTo = function(position, silent) {
	
	if (!this.isScrollable) {
		return;
	}
	
	var positionDelta = (YAHOO.env.ua.ie || YAHOO.env.ua.webkit) ? YAHOO.util.Dom.getY(this.box) : YAHOO.util.Dom.getY(this.box);
	
	YAHOO.util.Dom.setY(this.content, position + positionDelta);
	
	this.currentScrollPos = position;
	
	// Nur ausführen wenn das Silent-Flag nicht gesetzt wurde
	if (YAHOO.lang.isUndefined(silent) || (silent === false)) {
		this.slider.setValue((position/this.maxScrollPos)*this.sliderMaxRange, false, true, true);
	}
} // Ende der Methode: scrollTo