/**
 * @author boesherz
 */


// alle JS-Inhalte werden genamespaced
var dSire = function(){

	// Es folgen eine Menge vorerst privater Variablen und Funktionen.
	// Diese sind von außen nicht erreichbar (auch nicht über z.B. dSire.initFunctions).
	// Die Verfügbarkeit nach außen wird am Ende des Namespaces hinterlegt.


	document.observe('dom:loaded', function(){
	
		$(document.body).addClassName('js');
		
		$$('.switcher').each(function(elm){
			new Clickbox(elm);
		});
		
		$$('.newsbox').each(function(elm){
			new Newsbox(elm);
		});
		
		
		// Bugfix, um absolut positioniertes Element im IE6 neu zu zeichnen
		positionIE6();
		
		addAriaSupport();
		
	});
	
	
	var Clickbox = Class.create({
		initialize: function(element){
			this.element = element;
			this.items = this.element.childElements();
			this.animating = false;
			
			// walk through each list-element
			this.items.each(function(li){
				var content = li.down(".content"); // cache content-div for faster DOM-manipulation
				var height = content.getHeight();
				
				if (isIE6()) height += 10; // Fix fuer falsche Hoehenberechnung im IE6 
				
				// mach alle content-Elemente erstmal unsichtbar
				content.setStyle("height:0px;");
				li.addClassName('active');
				
				// entziehe unsichtbaren Links den tabindex
				content.select('a').each(function(elm) {
					elm.writeAttribute('tabindex', -1);
				});
				
				// definiere Verhalten für Klick auf Ueberschrift
				li.down("h4").observe("click", function(){
					if (!this.animating) { // only do something if not already doing something
						this.animating = true;
						
						// pruefen, ob bereits ein element aktiv/geoeffnet ist
						var active = this.element.childElements().find(function(elm) {
							if (!elm.hasClassName("active")) {
								return elm;
							}
						})
						
						// wenn noch zu, mach Inhalt sichtbar
						if (li.hasClassName('active')) {
							
							// wenn schon eins offen war, mach das zu
							if (active) {
								new Effect.Morph(active.down(".content"), {
									style: 'height:0px;',
									duration: 0.6,
									transition: Effect.Transitions.sinoidal,
									afterFinish: function(){
										this.animating = false;
									}.bind(this)
								});
								active.addClassName("active");
								
								// entziehe nicht mehr sichtbaren Links den tabindex
								active.down(".content").select('a').each(function(elm) {
									elm.writeAttribute('tabindex', -1);
								});
							}

							new Effect.Morph(content, {
								style: 'height:' + height + 'px;',
								duration: 0.6,
								transition: Effect.Transitions.sinoidal,
								afterFinish: function(){
									this.animating = false;
								}.bind(this)
							});
							
							// gib jetzt sichtbaren Links den natuerlichen tabindex zurueck
							li.removeClassName('active');
							content.select('a').each(function(elm) {
								elm.writeAttribute('tabindex', 0);
							});
							
							
						}
						// wenn schon offen, verstecke Inhalt
						else {
							new Effect.Morph(content, {
								style: 'height:0px;',
								duration: 0.6,
								transition: Effect.Transitions.sinoidal,
								afterFinish: function(){
									this.animating = false;
								}.bind(this)
							});
							
							li.addClassName('active');
							
							// entziehe nicht mehr sichtbaren Links den tabindex
							content.select('a').each(function(elm) {
								elm.writeAttribute('tabindex', -1);
							});
						}
						
						//lg('lc='+escape(tracking.nt_prefix+'startseite/'+li.down("h4 a").innerHTML));
						if (tracking && tracking.nettracker) {
							ntptEventTag('lc='+escape(tracking.nt_prefix+'startseite/'+li.down("h4 a").innerHTML));
						}
					}
				}.bindAsEventListener(this));
			}.bind(this))
		}
	});
	
	
	var Newsbox = Class.create({
		initialize: function(element){
			this.element = element;
			this.threshold = 2;
			this.hasbeenclickedwithactualmouse = false;
			
			// hol alle <p>-Elemente des Containers
			this.items = this.element.childElements().findAll(function(elm){
				return (elm.tagName.toLowerCase() == "p")
			});
			
			this.heights = [];
			this.margins = []
			this.animating = false;
			
			// walk through each list-element
			this.items.each(function(li, i){
			
				// speichere die Original-Höhen weg
				this.heights.push(li.getHeight());
				this.margins.push(li.getStyle("marginBottom"));
				
				// wenn wir beim dritten Element oder mehr sind, mach es unsichtbar
				if (i >= this.threshold) {
					li.setStyle({
						height: "0px",
						marginBottom: 0
					});
					li.select('a').each(function(elm) {
						elm.writeAttribute('tabindex', -1);
					});
				}
			}.bind(this));
			
			if (this.items.length > this.threshold) {
			
				// Füge den Link hinzu, mit dem man die versteckten Elemente anzeigen lassen kann
				var trigger;
				this.element.insert(trigger = new Element('a', {
					className: "special",
					href: "javascript:void(0);"
				}));
				
				this.opened = false;
				
				// hier wird eine variable gesetzt, die verrät, ob auf den link mit der maus geklickt 
				// oder er über die tastatur angewählt wurde
				trigger.observe("mousedown", function(event){
					this.hasbeenclickedwithactualmouse = true;
				}
				.bind(this));
				
				// Füge Verhalten zum Link hinzu
				trigger.observe("click", function(event){
					if (!this.animating) { // only do something if not already doing something
						this.animating = true;
						
						//lg('lc='+escape(tracking.nt_prefix+'rss/'+trigger.innerHTML))
						if (tracking && tracking.nettracker && trigger) {
							ntptEventTag('lc=' + escape(tracking.nt_prefix + 'startseite/' + trigger.innerHTML));
						}						
						
						if (!this.opened) {
						
							// gehe wieder durch die <p>-Elemente
							this.items.each(function(li, i){
							
								if (i >= this.threshold) {
									// weise jedem Element seine ursprüngliche Höhe wieder zu
									new Effect.Morph(li, {
										style: {
											height: this.heights[i] + 'px',
											marginBottom: this.margins[i]
										},
										duration: 0.6,
										transition: Effect.Transitions.sinoidal,
										afterFinish: function(){
											this.animating = false;
										}
										.bind(this),
										afterUpdate: function(){
											// Bugfix, um absolut positioniertes Element im IE6 neu zu zeichnen
											positionIE6();
										}
									});
									
									// weise jedem Link innerhalb des Elements wieder seinen natürlichen Tabindex zu
									li.select('a').each(function(elm){
										elm.writeAttribute('tabindex', 0);
									});
									
									// wenn der "Weitere News"-Link mit der Tastatur angewählt wurde, wir beim ersten
									// versteckten Listenelement sind und ein Link innerhalb dieses Listenelements
									// existiert, dann wähle jetzt statt des verschwindenden News-Links diesen an
									if (!this.hasbeenclickedwithactualmouse && i == this.threshold && li.down('a')) {
										li.down('a').focus();
									}
								}
							}
							.bind(this));
							
							this.hasbeenclickedwithactualmouse = false;
							this.opened = true;
							trigger.update("Weitere News ausblenden")
							
						} else {

							this.items.each(function(li, i){
							
								if (i >= this.threshold) {
									// weise jedem Element Höhe 0 zu
									new Effect.Morph(li, {
										style: {
											height: '0px',
											marginBottom: "0px"
										},
										duration: 0.6,
										transition: Effect.Transitions.sinoidal,
										afterFinish: function(){
											this.animating = false;
										}
										.bind(this),
										afterUpdate: function(){
											// Bugfix, um absolut positioniertes Element im IE6 neu zu zeichnen
											positionIE6();
										}
									});
									
									// entziehe jedem Link innerhalb des Elements wieder seinen natürlichen Tabindex
									li.select('a').each(function(elm){
										elm.writeAttribute('tabindex', -1);
									});
								}
								
							}
							.bind(this));
							
							this.hasbeenclickedwithactualmouse = false;
							this.opened = false;
							trigger.update("Weitere News anzeigen")
						}
					}
					return false;
				}
				.bindAsEventListener(this)).innerHTML = 'Weitere News anzeigen';
			}
		}
	});
	
	
	function positionIE6(){
		if (isIE6()) {
			// Bugfix, um falsch positioniertes GAKC-Logo zu korrigieren
			$('logo-gakc').setStyle({
				position: "relative"
			}).setStyle({
				position: "absolute"
			});
		}
	}
	
	/**
	 * Stellt Debug-Messages für Firefox, IE8, Opera, Safari, Chrome (Konsole) und IE<8 (alert) zur Verfügung.
	 * @param string text
	 */
	function lg(text){
		if (typeof(opera) != "undefined" && opera != null) {
			opera.postError(text);
			return;
		}
		else 
			if (typeof(console) != "undefined" && console != null) {
				console.log(text);
				return;
			}
			else {
				alert(text);
			}
	}
	
	
	function isIE6(){
		var agt = navigator.userAgent.toLowerCase();
		var is_major = parseInt(navigator.appVersion);
		var is_minor = parseFloat(navigator.appVersion);
		var is_ie = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
		return (is_ie && (is_major == 4) && (agt.search(/msie [56]\./) != -1));
	}

	/* prototype-version */
	addAriaSupport = function () {
		var ariaIdent = "aria";
		var ariaPrefx = "aria-";
		var ariaNoPfx = ["role"];
		$$("."+ariaIdent).collect(function(e) {
			e.classNames().toArray().collect(function(c) {
				var aAtt = c.split(/--/);
				if (aAtt[1]) e.writeAttribute((ariaNoPfx.indexOf(aAtt[0])>=0?"":ariaPrefx)+aAtt[0], aAtt[1]);
			});
		});
	}

	// Es folgen die public Variablen und Funktionen bzw. das Übergeben von privaten Funktionen an die "Öffentlichkeit".
	// Diese sind von außen über z.B. dSire.lg() verfügbar und müssen in Objektschreibweise notiert werden.

	return {
		lg:lg,
		isIE6:isIE6,
		addAriaSupport:addAriaSupport
	}
	
}();

