/**********************************************************/
/*  digiWrapper: Flexible "Accordion"					  */ 
/*	Copyright DIGIPETS 2009								  */
/*	Version 0.9  										  */
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

$(document).ready(function() {
	
	jQuery.fn.digiWrapper = function(o) {
		o = $.extend({ 
	        element: '.wrapperElement', //Element, das geöffnet/geschlossen werden soll (muss im HTML auf gleicher Ebene liegen). Beim Modus "mouseoverOneElement" wird dieser Wert nicht gebraucht.
			toggler: '.wrapperToggler', //Element das das öffnen/schließen auslöst. Beim Modus "mouseoverOneElement" muss dieser genauso lauten wie das Element
			wrapperGroup: '.tx-digipetsWrapper-pi1', //Übergeordnetes Element, das alle Wrapper gruppiert, wenn leergelassen wird, gibt es keine Gruppierung
			textAllTogglerOpen: 'Alle &ouml;ffnen', //Text für den "Alle öffnen" Button (vor allem für Sprachversionen)
			textAllTogglerClose: 'Alle schlie&szlig;en', //Text für den "Alle öffnen" Button (vor allem für Sprachversionen)
			classAllToggler: '.wrapperOpenAll', //Klasse des "alles öffnen Buttons"
			classAllTogglerOpen: 'stateAllOpen', //Klasse für den "alles öffnen" Button, nachdem alle Wrapper geöffnet wurden
			classAllTogglerClose: 'stateAllClose', //Klasse für den "alles öffnen" Button, nachdem alle Wrapper geöffnet wurden
			classOpen: 'STYLE_wrapperOpen', //Klasse für einen geöffneten Wrapper
			classClose: 'STYLE_wrapperClose', //Klasse für einen geschlossenen Wrapper
			mode: 'click', //Setzt den Modus für das Öffnen. Verfügbare Modi: click (öffnen durch Klick), clickCloseOthers (öffnen durch Klick, andere geöffneten Wrapper in Gruppe schließen), mouseover (öffnen bei Mouseover, anderere geöffnete Wrapper in Gruppe schließen), mouseoverOneElement (öffnen bei Mouseover, es gibt nur Toggler und Element sind das selbe)
			togglerHeight: 0, //Höhe des Togglers (für den Hover benötigt)
			closedHeight: 79, //Höhe des geschlossenen Elements (Nur für Modus "mouseoverOneElement")
			openMinHeight: 150, //Mindesthöhe für geöffnetes Element (nur für Modus "mouseoverOneElement")
			speed: 300 //Geschwindigkeit der Öffnen/Schließen Animation
			}, o || {});

		//Definiert Grundvariablen
		if (o.wrapperGroup!='') {
			var wrapperGroup = $(this).closest(o.wrapperGroup);
		} else {
			var wrapperGroup = $("body");
		}
		
		//Definiert das globale "This"
		var globalThis = $(this);
		
		//Definiert den "Alles öffnen/schließen"
		wrapperGroup.find(o.classAllToggler).html(o.textAllTogglerOpen);
		wrapperGroup.find(o.classAllToggler).addClass(o.classAllTogglerClose);
				
		//"alle öffnen" Toggler Funktionen
		function toggleOpenAll(toggler) {
			clickToggler = true;
			wrapperGroup.find(o.element).slideDown(o.speed);
			toggler.removeClass(o.classClose);
			toggler.addClass(o.classOpen);
			toggler.html(o.textAllTogglerClose);
			return false;
		}
		
		function toggleCloseAll(toggler) {
			clickToggler = false;
			wrapperGroup.find(o.element).slideUp(o.speed);
			toggler.removeClass(o.classOpen);
			toggler.addClass(o.classClose);
			toggler.html(o.textAllTogglerClose);
			// resetToggle(toggler);
			return false;
		}
		
		//Toggler Funktionen aufrufen/togglen
		wrapperGroup.find(o.openAllToggler).toggle(
			function(){
				toggleOpenAll($(this));
				wrapperGroup.find(o.toggler).each(function() {
			    	this.lastToggle = 1;
				});
				$(this).addClass(o.stateAllOpen);
			},
			function(){
				toggleCloseAll($(this));
				
				wrapperGroup.find(o.toggler).each(function() {
			    	this.lastToggle = undefined;
				});
				$(this).addClass(o.stateAllClose);
		});	
	
		$(this).each(function(i){
		
			var clickToggler = false,
				oldHeight = $(this).find(o.element).height(), //liest die alte Höhe des Elements aus 
				openOnStartToggler = false; //Toggler zum einmaligen Öffnen des ersten "openOnStart" Elements, wenn closeOnOpen aktiv ist
								
			$(this).find(o.element).slideUp(0);	
			
			
			
			
			
			function resetToggle(selector) {
				selector.each(function() {
			    	this.lastToggle = undefined;
				});
			}
			
			
			//TogglerFunktionen
			
			function toggleOpen(element,toggler,speed) {
				if (speed == 'undefined') { speed = o.speed; } 
				clickToggler = true;
				element.slideDown(speed);
								
				if (toggler != 'undefined') {
					
					toggler.removeClass(o.classClose);
					toggler.addClass(o.classOpen);
				}
				return false;
			}
			
			function toggleClose(element,toggler,speed) {
				if (speed == 'undefined') { speed = o.speed; } 
				clickToggler = false;
				element.slideUp(speed);
				if (toggler != 'undefined') {
					toggler.removeClass(o.classOpen);
					toggler.addClass(o.classClose);
					resetToggle(toggler);
				}
				return false;
			}
			
			if (o.mode == "click" || o.mode == "clickCloseOthers") {
				//Klick auf die Toggler
				var thisElement = $(this); //Speichert das gesamte Objekt in eine Variable, um das Element beim Klick aufrufen zu können
				
				$(this).find(o.toggler).toggle(
					//öffnen
					function () {
						if (o.mode == 'clickCloseOthers') {
							toggleClose(wrapperGroup.find(o.toggler).not($(this)));
							globalThis.trigger("wrapperCloseOthers", [$(this), o]); //Hook für das Schließen der anderen Elemente per Klick - END
						}
						toggleOpen(thisElement.find(o.element),$(this));
						globalThis.trigger("wrapperOpen", [$(this), o]); //Hook für das Öffnen der Wrapper per Klick

					//schließen
				},	function () {
					toggleClose(thisElement.find(o.element),$(this));
					globalThis.trigger("wrapperClose", [$(this), o]); //Hook für das Schließen der Wrapper per Klick
					
				});
			}
			
			if (o.mode == "mouseover") {
				//Mouseover auf die Toggler
				$(this).find(o.toggler).mouseenter(function(){
					toggleClose(wrapperGroup.find(o.element).not($(this)),wrapperGroup.find(o.toggler).not($(this)));
					//toggleOpen($(this).find(o.element),$(this).finde(o.toggler));
					globalThis.trigger("wrapperOpen", [$(this), o]); //Hook für das Öffnen der Wrapper per mouseover - END
				});
			}
			
			if (o.mode == "mouseoverOneElement") {
				function elementResize(element,elementheight,speed) {
					element.stop().animate({height: elementheight},speed);
				}
				
				var originalElementHeight = $(this).find(o.element).height();
				if (originalElementHeight < o.openMinHeight) {
					originalElementHeight = o.openMinHeight;
				}
				$(this).css("overflow","hidden");
				$(this).find(o.element).css("overflow","hidden");
				elementResize($(this).find(o.element),o.closedHeight,0);
				$(this).find(o.element).mouseenter(function(){
					
					elementResize($(this),originalElementHeight,o.speed);
					elementResize(wrapperGroup.find(o.element).not($(this)),o.closedHeight,o.speed);
					globalThis.trigger("wrapperCloseOthers", [wrapperGroup.find(o.element).not($(this)), o]);
					globalThis.trigger("wrapperOpen", [$(this), o]); //Hook für das Öffnen der Wrapper per mouseover - END
				});
			}
			
			if (o.mode == "clickCloseOthers" || o.mode == "mouseover") {
				
				wrapperGroup.find(".wrapperOpenOnStart:first").trigger('click');
				
				/*toggleOpen(wrapperGroup.find(".wrapperOpenOnStart:first").parent().find(o.element), wrapperGroup.find(".wrapperOpenOnStart:first"), 0);
				wrapperGroup.find(".wrapperOpenOnStart:first").each(function() {
					this.lastToggle = 1;
				});*/
			} else if (o.mode == "click") {
				if (wrapperGroup.find(".wrapperOpenOnStart").html() != null) {
					wrapperGroup.find(".wrapperOpenOnStart").each(function() {
						$(this).trigger('click');
					});
					
					/*toggleOpen(wrapperGroup.find(".wrapperOpenOnStart").parent().find(o.element), wrapperGroup.find(".wrapperOpenOnStart"), 0);
					wrapperGroup.find(".wrapperOpenOnStart").each(function() {
						this.lastToggle = 1;
					});*/
				}
			}
			
		
		});
					
	}
	
	//Hooks
	jQuery.fn.digiWrapper.hookOpen = function(hookFunction) {
		$(this).bind("wrapperOpen", hookFunction);
	}
	
	jQuery.fn.digiWrapper.hookClose = function(hookFunction){
		$(this).bind("wrapperClose", hookFunction);
	}
	
	jQuery.fn.digiWrapper.hookCloseOthers = function(hookFunction){
		$(this).bind("wrapperCloseOthers", hookFunction);
	}
	
});