YAHOO.namespace("newmedia");
/**
 * http://developer.yahoo.com/yui/articles/hosting/?animation&slider&yahoo-dom-event&MIN
 * 
 * <script type="text/javascript" src="http://yui.yahooapis.com/combo?2.7.0/build/yahoo-dom-event/yahoo-dom-event.js&2.7.0/build/animation/animation-min.js&2.7.0/build/dragdrop/dragdrop-min.js&2.7.0/build/slider/slider-min.js"></script>
 */
YAHOO.newmedia.YUIScrollerVertical = function(contentID) {
	
	this.thumbSize = 0;
	this.contentOffset = 0;
	this.sliderBoxHeight = 0;
	this.sliderBoxRegion = null;
	
	// ContentBox ermitteln
	this.contentID = contentID;
	this.content = YAHOO.util.Dom.get(contentID);
	
	// ScrollBox ermitteln
	this.boxID = contentID + "ScrollBox";
	this.box = YAHOO.util.Dom.get(contentID + "ScrollBox");
	
	// Scrollen mittels MouseWheel ermöglichen
	var scrollEvent = (YAHOO.env.ua.ie) ? "mousewheel" : "DOMMouseScroll";
	YAHOO.util.Event.addListener(this.box, scrollEvent, this.onMouseWheel, this, true);
	
	this.createSliderBox();
	this.resizeSliderBox();
	
	this.boxRegion = YAHOO.util.Dom.getRegion(this.box);
	this.boxHeight = this.boxRegion.height;
	
	this.contentRegion = YAHOO.util.Dom.getRegion(this.content);
	this.contentHeight = this.contentRegion.height;
	
	// Berechnet die Höhe des Inhaltes
	this.calculateContentHeight();
	
	// Maximale scrollbare Position aufgrund der Inhaltshöhe berechnen
	this.maxScrollPos = this.boxHeight - this.contentHeight;
	if (this.maxScrollPos > 0) {
		this.maxScrollPos = 0;
	}
	
	this.thumbRegion = YAHOO.util.Dom.getRegion(this.minThumb);
	this.thumbHeight = this.thumbRegion.height;
	
	this.thumbSize = Math.floor(this.sliderBoxHeight / (this.contentHeight / this.boxHeight));
	if (this.thumbSize >= this.sliderBoxHeight) {
		this.hide();
	}
	else {
		YAHOO.util.Dom.setStyle([this.sliderBox, this.upLink, this.downLink], "display", "block");
		this.show();
	}
	YAHOO.util.Dom.setStyle(this.minThumb, "height", this.thumbSize + "px");
	
	this.currentScrollPos = 0;
	this.scrollStep = Math.abs(Math.floor(this.maxScrollPos/5));
	this.sliderMaxRange = this.sliderBoxHeight-this.thumbSize;
	
	// Slider-Komponenten	
    this.slider = YAHOO.widget.Slider.getVertSlider(this.sliderBox, this.minThumb, 0, this.sliderMaxRange);
    this.slider.animate = true;
	this.slider.subscribe("change", this.onSliderChange, this, true);
	
	this.scrollTo(0);
	
}; // Ende des Konstruktors: HTMLScroller()

YAHOO.newmedia.YUIScrollerVertical.prototype.createSliderBox = function() {

	this.sliderBoxID = this.boxID + "Slider";
	this.sliderBoxThumbID = this.sliderBoxID + "Thumb";
	this.sliderBoxUpLinkID = this.sliderBoxID + "UpLink";
	this.sliderBoxDownLinkID = this.sliderBoxID + "DownLink";
	
	// Scrollbalken erzeugen
	this.sliderBox = document.createElement("div");
	this.sliderBox.id = this.sliderBoxID;
	
	YAHOO.util.Dom.addClass(this.sliderBox, "yuiscroller slider box vertical");
	
	document.body.appendChild(this.sliderBox);

	// Schieberegler für erzeugen
	this.minThumb = document.createElement("div");
	this.minThumb.id = this.sliderBoxThumbID;
	YAHOO.util.Dom.addClass(this.minThumb, "yuiscroller slider thumb vertical");
	this.sliderBox.appendChild(this.minThumb);

	// Link für nach oben
	this.upLink = document.createElement("div");
	this.upLink.id = this.sliderBoxUpLinkID;
	YAHOO.util.Dom.addClass(this.upLink, "yuiscroller slider uplink vertical");
	document.body.appendChild(this.upLink);
	YAHOO.util.Event.addListener(this.upLink, "click", function(e, args) {
		this.scroll(YAHOO.newmedia.YUIScrollerVertical.SCROLL_UP);
	}, this, true);
	
	// Link für nach unten
	this.downLink = document.createElement("div");
	this.downLink.id = this.sliderBoxDownLinkID;
	YAHOO.util.Dom.addClass(this.downLink, "yuiscroller slider downlink vertical");
	document.body.appendChild(this.downLink);
	YAHOO.util.Event.addListener(this.downLink, "click", function(e, args) {
		this.scroll(YAHOO.newmedia.YUIScrollerVertical.SCROLL_DOWN);
	}, this, true);
	
}; // Ende der Methode: createSliderBox()

/**
 * Entfernt die HTML-Elemente aus dem Dokument.
 * 
 * @return void 
 */
YAHOO.newmedia.YUIScrollerVertical.prototype.remove = function() {
	
	this.hide();
	
	this.sliderBox.removeChild(this.minThumb);
	this.sliderBox.parentNode.removeChild(this.sliderBox);
	this.upLink.parentNode.removeChild(this.upLink);
	this.downLink.parentNode.removeChild(this.downLink);
	
}; // Ende der Methode: deleteSliderBox()

/**
 * Versteckt die Steuerelemente.
 * 
 * @return void
 */
YAHOO.newmedia.YUIScrollerVertical.prototype.hide = function() {
	YAHOO.util.Dom.setStyle([this.sliderBox, this.upLink, this.downLink], "display", "none");
}; // Ende der Methode: hide()

/**
 * Zeigt die Steuerelemente an.
 * 
 * @return void
 */
YAHOO.newmedia.YUIScrollerVertical.prototype.show = function() {
	YAHOO.util.Dom.setStyle([this.sliderBox, this.upLink, this.downLink], "display", "block");
}; // Ende der Methode: show()

YAHOO.newmedia.YUIScrollerVertical.prototype.calculateContentHeight = function() {
	
	var contentRegion = YAHOO.util.Dom.getRegion(this.content);
	
	var contentChildren = YAHOO.util.Dom.getChildren(this.content);
	var contentHeight = 0;
	
	var positionOffset = 0;
	var lastMarginBottom = 0;
	
	YAHOO.util.Dom.batch(contentChildren, function(el) {
		
		if ((el.nodeType != 1) || ((contentHeight++)>0)) {
			return;
		} else {
			positionOffset = el.offsetHeight;
		}
	});
	
	this.contentOffset = positionOffset;
	this.contentHeight+=positionOffset;
	
}; // Ende der Methode: calculateContentHeight()

YAHOO.newmedia.YUIScrollerVertical.prototype.resizeSliderBox = function() {
	
	this.boxRegion = YAHOO.util.Dom.getRegion(this.box);
	this.boxHeight = this.boxRegion.height;
	
	var sliderBoxLeft = this.boxRegion.right-16;
	
	// Uplink Positionieren
	var uplinkRegion = YAHOO.util.Dom.getRegion(this.upLink);
	YAHOO.util.Dom.setStyle(this.upLink, "position", "absolute");
	YAHOO.util.Dom.setStyle(this.upLink, "top", this.boxRegion.top + "px");
	YAHOO.util.Dom.setStyle(this.upLink, "left", sliderBoxLeft + "px");
	
	// Downlink Positionieren
	var downRegion = YAHOO.util.Dom.getRegion(this.downLink);
	YAHOO.util.Dom.setStyle(this.downLink, "position", "absolute");
	YAHOO.util.Dom.setStyle(this.downLink, "top", this.boxRegion.bottom - uplinkRegion.height + "px");
	YAHOO.util.Dom.setStyle(this.downLink, "left", sliderBoxLeft + "px");
	
	var sliderBoxTop = this.boxRegion.top + uplinkRegion.height;
	
	this.sliderBoxHeight = this.boxRegion.height - (uplinkRegion.height + uplinkRegion.height);
	
	// Anpassung der Grösse mit Hilfe aufgrund der Rahmen der SliderBox
	var varDiff = parseInt(YAHOO.util.Dom.getStyle(this.sliderBox, "border-top-width"));
	varDiff+= parseInt(YAHOO.util.Dom.getStyle(this.sliderBox, "border-bottom-width"));
	
	if(YAHOO.lang.isNumber(varDiff)) {
		this.sliderBoxHeight-=varDiff;
	}
	
	YAHOO.util.Dom.setStyle(this.sliderBox, "position", "absolute");
	YAHOO.util.Dom.setStyle(this.sliderBox, "height", this.sliderBoxHeight + "px");
	YAHOO.util.Dom.setStyle(this.sliderBox, "top",  sliderBoxTop + "px");
	YAHOO.util.Dom.setStyle(this.sliderBox, "left",  sliderBoxLeft + "px");
	
	this.sliderBoxRegion = YAHOO.util.Dom.getRegion(this.sliderBox);
		
}; // Ende der Methode: resize()

YAHOO.newmedia.YUIScrollerVertical.prototype.onSliderChange = function(newValue) {
	
	var scrollPos = Math.ceil((newValue/this.sliderMaxRange)*this.maxScrollPos);
	this.scrollTo(scrollPos, true);
	
}; // Ende der Methode: onSliderChange()

YAHOO.newmedia.YUIScrollerVertical.prototype.onMouseWheel = function(e) {
	
	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.newmedia.YUIScrollerVertical.SCROLL_UP = -1;
YAHOO.newmedia.YUIScrollerVertical.SCROLL_UP_MAX = -2;
YAHOO.newmedia.YUIScrollerVertical.SCROLL_DOWN = 1;
YAHOO.newmedia.YUIScrollerVertical.SCROLL_DOWN_MAX = 2;

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

YAHOO.newmedia.YUIScrollerVertical.prototype.scrollTo = function(position, silent) {

	if (position>0) {
		position = 0;
	}
	
	// var positionDelta = (YAHOO.env.ua.ie) ? YAHOO.util.Dom.getY(this.box) : 0;
	var positionDelta = YAHOO.util.Dom.getY(this.box) + Math.floor(this.contentOffset/2);
	
	YAHOO.util.Dom.setY(this.content, position + positionDelta);
	
	this.currentScrollPos = position;
	
	// Nur ausfuehren 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()