/**
 * SRH-Hochschulen: Funktionalität für FCE Home Slide
 *  
 * Zu Empfehlen ist nach Änderungen ein Überprüfen der Javascript-Syntax über
 * das Tool JSlint (http://jslint.com/). 
 * 
 * @author Chris Müller <mueller@cyperfection.de> 
 * @version $Id: fce_home_slide.js 687 2010-01-26 15:50:16Z christian $
 * @package srh_hs  
 */ 

/*jslint
	bitwise: true,
	browser: true,
	eqeqeq: true,
	immed: true,
	newcap: true,
	nomen: true,
	onevar: true,
	plusplus: true,
	regexp: true,
	undef: true
*/
/*global
	$,
	Effect,
	Template
*/


/***** Konstanten *************************************************************/

var FceHomeSlideConfig = {
	// Selektor-ID der Spalte
	colId: 'fce-home-3cols-col',

	// Selektor-ID des gesammten FCE
	fceId: 'fce-home-slide',

	// Selektor-ID des Inhaltselements-Containers
	containerId: 'fce-home-slide-inner',

	// Selektor-ID des Inhaltselements
	contentId: 'fce-home-slide-inner2',

	// Selektor-Id für Aktionselemente (hoch-/runterscrollen)
	actionId: 'fce-home-slide-action',

	// Faktor für die Höhe des FCE, der mit der ermittelten max. Höhe
	// multipliziert wird
	heightFactor: 0.65,

	// Bild für das Herunterscrollen
	imgDown: 'fileadmin/templates/media/images/shared/slide-down.gif',

	// Selektor-ID für Aktion "Herunterscrollen"
	imgDownId: 'fce-home-slide-down',

	// Bild für das Hochscrollen
	imgUp: 'fileadmin/templates/media/images/shared/slide-up.gif',

	// Selektor-ID für Aktion "Hochcrollen"
	imgUpId: 'fce-home-slide-up',

	// Bildbreite
	imgWidth: 20,

	// Bildhöhe
	imgHeight: 25,

	// Offset für Scrolling
	scrollOffset: 80
};



/***** Verarbeitung ***********************************************************/

function FceHomeSlide() {

	/***** Methoden ***********************************************************/


	/**
	 * Höhe des Containers anpassen
	 *
	 * Dazu bestimmen wir die max. Höhe der anderen Spalten und
	 * multiplizieren diese mit einem Faktor.
	 *
	 * @param void
	 * @return {Boolean} true, falls Container verkleinert wurde	 
	 * @private
	 */
	function changeHeight() {
		/**
		 * Geschwisterknoten
		 * @type Element
		 */
		var siblings,

		/**
		 * Höhe der entsprechenden "Geschwister"-Spalte
		 * @type Number
		 */
		height = 0,

		/**
		 * Höhe der aktuellen Spalte (mit FCE Home Slide)
		 * @type Number
		 */
		fceColHeight,

		/**
		 * Neue berechnete Höhe für FCE Home Slide-Inhalt
		 * @type Number
		 */
		newHeight,

		/**
		 * Hilfsvariablen für Schleife
		 * @typs Number
		 */
		i, len;

		// Bestimmen wir die Höhe der aktuellen Spalte
		fceColHeight = $(FceHomeSlideConfig.contentId).up('.' + FceHomeSlideConfig.colId).getHeight();

		// Ermitteln der Höhe der Geschwisterspalten
		//   <div class="fce-home-3cols-col"> = colId
		//     <div id="fce-home-slide">
		siblings = $(FceHomeSlideConfig.fceId).up('.' + FceHomeSlideConfig.colId).siblings();

		len = siblings.length;
		if (len === 0) {
			// Keine Geschwisterspalten gefunden
			return false;
		}

		for (i = 0; i < len; i += 1) {
			if (siblings[i].getHeight() > height) {
				height = siblings[i].getHeight();
			}
		}

		newHeight = parseInt(height * FceHomeSlideConfig.heightFactor, 10);

		if (newHeight < fceColHeight) {
			$(FceHomeSlideConfig.containerId).setStyle({height: newHeight + 'px', overflow: 'hidden'});
			return true;
		}

		return false;
	}



	/**
	 * Callback-Funktion beim Klick auf Scrollbild
	 * @param {Event}
	 * @private
	 */
	function click(e) {
		/**
		 * ID des geklickten Elements
		 * @type String
		 */
		var id,

		/**
		 * Höhe des Container-Elements
		 * = angepasste Höhe		 
		 * @type Number
		 */
		heightContainer,

		/**
		 * Höhe des Content-Elements
		 * = reale Höhe des Inhalts		 
		 * @type Number
		 */
		heightContent,

		/**
		 * Aktuelle Position des Contents
		 * @type Number		 
		 */
		pos;




		// Standard-Verarbeitung stoppen
		e.stop();

		// Element identifizieren
		id = e.element().identify();

		// Höhen bestimmen
		heightContainer = $(FceHomeSlideConfig.containerId).getHeight();
		heightContent   = $(FceHomeSlideConfig.contentId).getHeight();

		// Aktuelle Position ermitteln
		pos = $(FceHomeSlideConfig.contentId).getStyle('top');
		if (pos === null) {
			// nicht definiert
			pos = 0;
		} else {
			// 'px' am Ende wegschneiden und positiv machen
			pos = parseInt(pos, 10);
		}


		// Herunterscrollen
		if (id === FceHomeSlideConfig.imgDownId) {
			pos = Math.abs(pos);

			if ((heightContent - heightContainer) > pos) {
				(new Effect.Move(
					$(FceHomeSlideConfig.contentId),
					{x: 0, y: -FceHomeSlideConfig.scrollOffset}
				));
			}
		} else if (id === FceHomeSlideConfig.imgUpId) {
			if (pos >= 0) {
				// Hier wird nichts gemacht: wir sind bereits ganz oben
			} else {
				pos = Math.abs(pos);
				if (pos < FceHomeSlideConfig.scrollOffset) {
					// Wir sind fast ganz oben: Wir bewegen uns nun nur noch
					// die fehlenden Pixel hinauf
					(new Effect.Move(
						$(FceHomeSlideConfig.contentId),
						{x: 0, y: pos}
					));
				} else {
					// Standardfall
					(new Effect.Move(
						$(FceHomeSlideConfig.contentId),
						{x: 0, y: FceHomeSlideConfig.scrollOffset}
					));
				}
			}
		}

	}



	/**
	 * Aktionen setzen (hoch-/runterscrollen)
	 * @param void
	 * @private
	 */
	function setActions() {
		/**
		 * HTML-Vorlage für Bilderdarstellung
		 * @type Template
		 */
		var template = new Template(
			'<img id="#{id}" src="#{src}" width="#{width}" height="#{height}" alt="" />'
		),

		/**
		 * Einzusetzende Werte für Template
		 * @type Object
		 */
		values;



		/* Herunterscrollen */
		values = {
			id:     FceHomeSlideConfig.imgDownId,
			src:    FceHomeSlideConfig.imgDown,
			width:  FceHomeSlideConfig.imgWidth,
			height: FceHomeSlideConfig.imgHeight
		};
		$(FceHomeSlideConfig.actionId).insert(template.evaluate(values));
		$(FceHomeSlideConfig.imgDownId).observe('click', click);

		/* Hochscrollen */
		values = {
			id:     FceHomeSlideConfig.imgUpId,
			src:    FceHomeSlideConfig.imgUp,
			width:  FceHomeSlideConfig.imgWidth,
			height: FceHomeSlideConfig.imgHeight
		};
		$(FceHomeSlideConfig.actionId).insert(template.evaluate(values));
		$(FceHomeSlideConfig.imgUpId).observe('click', click);
	}



	/**
	 * Hauptmethode
	 * @param void
	 * @private
	 */
	function main() {
		if (changeHeight() === true) {
			// Container wurde verkleinert: jetzt geht's los ...
			setActions();
		}
	}




	/***** Initialisierung ****************************************************/

	/**
	 * Initialisierung
	 * Diese Funktion wird aufgerufen, sobald die HTML-Seite fertig geladen ist
	 * @public
	 */
	this.init = function () {
		/* FCE Home Slide existiert auf der Seite? */
		if ($(FceHomeSlideConfig.fceId)) {
			main();
		}
	};
}




/***** Verarbeitung starten ***************************************************/
document.observe('dom:loaded', function() {
	var fceHomeSlide = new FceHomeSlide();
	fceHomeSlide.init();
});

