/**
 * jQuery-Plugin "Cookie"
 */
jQuery.cookie = function(name, value, options) {
    if (typeof value != 'undefined') { // name and value given, set cookie
        options = options || {};
        if (value === null) {
            value = '';
            options.expires = -1;
        }
        var expires = '';
        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
            var date;
            if (typeof options.expires == 'number') {
                date = new Date();
                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
            } else {
                date = options.expires;
            }
            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
        }
        // CAUTION: Needed to parenthesize options.path and options.domain
        // in the following expressions, otherwise they evaluate to undefined
        // in the packed version for some reason...
        var path = options.path ? '; path=' + (options.path) : '';
        var domain = options.domain ? '; domain=' + (options.domain) : '';
        var secure = options.secure ? '; secure' : '';
        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
    } else { // only name given, get cookie
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
};

/**
 * jQuery-Plugin "pngFix" (Version: 1.2, 09.03.2009)
 */
(function($) {
	jQuery.fn.pngFix = function(settings) {
		// Settings
		settings = jQuery.extend({
			blankgif: 'blank.gif'
		}, settings);
		var ie55 = (navigator.appName == "Microsoft Internet Explorer" && parseInt(navigator.appVersion) == 4 && navigator.appVersion.indexOf("MSIE 5.5") != -1);
		var ie6 = (navigator.appName == "Microsoft Internet Explorer" && parseInt(navigator.appVersion) == 4 && navigator.appVersion.indexOf("MSIE 6.0") != -1);
		if (jQuery.browser.msie && (ie55 || ie6)) {
			//fix images with png-source
			jQuery(this).find("img[src$=.png]").each(function() {
				jQuery(this).attr('width',jQuery(this).width());
				jQuery(this).attr('height',jQuery(this).height());
				var prevStyle = '';
				var strNewHTML = '';
				var imgId = (jQuery(this).attr('id')) ? 'id="' + jQuery(this).attr('id') + '" ' : '';
				var imgClass = (jQuery(this).attr('class')) ? 'class="' + jQuery(this).attr('class') + '" ' : '';
				var imgTitle = (jQuery(this).attr('title')) ? 'title="' + jQuery(this).attr('title') + '" ' : '';
				var imgAlt = (jQuery(this).attr('alt')) ? 'alt="' + jQuery(this).attr('alt') + '" ' : '';
				var imgAlign = (jQuery(this).attr('align')) ? 'float:' + jQuery(this).attr('align') + ';' : '';
				var imgHand = (jQuery(this).parent().attr('href')) ? 'cursor:hand;' : '';
				if (this.style.border) {
					prevStyle += 'border:'+this.style.border+';';
					this.style.border = '';
				}
				if (this.style.padding) {
					prevStyle += 'padding:'+this.style.padding+';';
					this.style.padding = '';
				}
				if (this.style.margin) {
					prevStyle += 'margin:'+this.style.margin+';';
					this.style.margin = '';
				}
				var imgStyle = (this.style.cssText);
				strNewHTML += '<span '+imgId+imgClass+imgTitle+imgAlt;
				strNewHTML += 'style="position:relative;white-space:pre-line;display:inline-block;background:transparent;'+imgAlign+imgHand;
				strNewHTML += 'width:' + jQuery(this).width() + 'px;' + 'height:' + jQuery(this).height() + 'px;';
				strNewHTML += 'filter:progid:DXImageTransform.Microsoft.AlphaImageLoader' + '(src=\'' + jQuery(this).attr('src') + '\', sizingMethod=\'scale\');';
				strNewHTML += imgStyle+'"></span>';
				if (prevStyle != ''){
					strNewHTML = '<span style="position:relative;display:inline-block;'+prevStyle+imgHand+'width:' + jQuery(this).width() + 'px;' + 'height:' + jQuery(this).height() + 'px;'+'">' + strNewHTML + '</span>';
				}
				jQuery(this).hide();
				jQuery(this).after(strNewHTML);
			});
			// fix css background pngs
			jQuery(this).find("*").each(function(){
				var bgIMG = jQuery(this).css('background-image');
				if(bgIMG.indexOf(".png")!=-1){
					var iebg = bgIMG.split('url("')[1].split('")')[0];
					jQuery(this).css('background-image', 'none');
					jQuery(this).get(0).runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + iebg + "',sizingMethod='scale')";
				}
			});
			//fix input with png-source
			jQuery(this).find("input[src$=.png]").each(function() {
				var bgIMG = jQuery(this).attr('src');
				jQuery(this).get(0).runtimeStyle.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader' + '(src=\'' + bgIMG + '\', sizingMethod=\'scale\');';
			jQuery(this).attr('src', settings.blankgif)
			});
		}
		return jQuery;
	};
})(jQuery);

/**
 * jQuery-Plugin "ForNext Slideshow"
 */
(function($) {
	//wrapper method
	$.fn.fnslideshow = function(options) {

		this.each(function() {

			//setting array
			var settings = $.extend({
				speed: 1000,
				timeout: 2000,
				type: 'sequence',
				containerheight: 'auto',
				runningclass: 'fnslideshow',
				autostart: true,
				nextcontrol: null,
				prevcontrol: null,
				playcontrol: null,
				current: 1,
				last: 0,
				start: 0,
				savetohide: 0,
				lastdirection: 0,				//0: kein control  1: next   2: prev
				mode: 1,						//1: play   2: pause
				timer: null,					//globaler Timer zum Wechseln der Bilder
				callbackplaytopause: null,		//Callback Funktion: Wechsel Play -> Pause
				callbackpausetoplay: null,		//Callback Funktion: Wechsel Pause -> Play
				callbackautostart: null,		//Callback Funktion: Autostart
				callbacknoautostart: null		//Callback Funktion: no Autostart
			}, options || {});

			//Die Elemente der Slideshow (aktuell nur li, div und img möglich)
			var elements = $(this).children().filter("img, li, div");

			//Nur wenn mehr als 1 Element in der Slideshow ist, macht es ueberhaupt Sinn
			//das Slideshow-Handling anzustoßen
			if (elements.length > 1) {

				//Slideshow Modus (Play / Pause) korrigieren falls falsch uebergeben
				if ((settings.autostart == true) && (settings.mode == 2)) {
					settings.mode = 1;
				} else if ((settings.autostart == false) && (settings.mode == 1)) {
					settings.mode = 2;
				} //endif

				//CSS fuer den Container anpassen
				$(this).css('position', 'relative');
				$(this).css('height', settings.containerheight);
				$(this).addClass(settings.runningclass);

				//alle Slideshow Elemente durchgehen, z-index anpassen und verstecken
				for ( var i = 0; i < elements.length; i++ ) {
					$(elements[i]).css('z-index', String(elements.length-i)).css('position', 'absolute');
					$(elements[i]).hide();
				} //next

				//fuer den Zufallsmodus muessen wir noch ein zufälliges Startelement bestimmen
				if (settings.type != 'sequence') {
					settings.start = Math.floor(Math.random() * (elements.length));
				} //endif

				//da jetzt, unabhängig vom Modus, das erste anzuzeigende Bild feststeht, wissen wir auch
				//welches Bild als erstes wieder versteckt werden muss
				settings.savetohide = settings.start;

				//wenn Autostart aktiviert ist, starten wir die Slideshow regulär automatisch
				if (settings.autostart == true) {
					//Geordnete Reihenfolge - Start
					if (settings.type == 'sequence') {
						settings.timer = setTimeout(function() {
							$.fnslideshow.auto(elements, settings);
						}, settings.timeout);
					//Zufällige Abfolge (random) - Start
					} else {
						settings.timer = setTimeout(function() {
							do { settings.current = Math.floor(Math.random() * (elements.length)); } while (settings.current == settings.start);
							$.fnslideshow.auto(elements, settings);
						}, settings.timeout);
					} //endif
				} //endif

				//das Control zum Wechseln zum nächsten Bild wurde geklickt
				if (settings.nextcontrol != null) {
					$(settings.nextcontrol).bind('click', function() {
						$.fnslideshow.jump(elements, settings, 1);
					});
				} //endif

				//das Control zum Wechseln zum vorherigen Bild wurde geklickt
				if (settings.prevcontrol != null) {
					$(settings.prevcontrol).bind('click', function() {
						$.fnslideshow.jump(elements, settings, 2);
					});
				} //endif

				//das Play / Pause Toggle Control
				if (settings.playcontrol != null) {
					$(settings.playcontrol).bind('click', {elements:elements, settings:settings}, $.fnslideshow.bindtoggleplaypauseevent);
				} //endif

				//Autostart Callback Funktion aufrufen falls notwendig
				if ((settings.autostart == true) && (settings.callbackautostart != null) && (typeof window[settings.callbackautostart] == 'function')) {
					window[settings.callbackautostart]();
				//No Autostart Callback Funktion aufrufen falls notwendig
				} else if ((settings.autostart == false) && (settings.callbacknoautostart != null) && (typeof window[settings.callbacknoautostart] == 'function')) {
					window[settings.callbacknoautostart]();
				} //endif

				//erstes Element anzeigen
				$(elements[settings.start]).show();
			} //endif
		}); //end each
	};

	//utility function
	$.fnslideshow = function() {}

	//anonyme Funktionen helfen uns bei bind und unbind nicht weiter, deshalb hier eine "echte" Funktion
	//die das Toggeln zwischen Play und Pauses Modus uebernimmt
	$.fnslideshow.bindtoggleplaypauseevent = function (params) {
		$.fnslideshow.toggleplaypause(params.data.elements, params.data.settings);
	}

	//realisiert slideshow im herkömmlichen Sinn (automatisiert)
	$.fnslideshow.auto = function (elements, settings) {

		//alle Slideshow Elemente durchgehen
		for ( var i = 0; i < elements.length; i++ ) {
			$(elements[i]).css('z-index', 0);
		} //next

		//Animation fuer fade anwerfen
		$(elements[settings.current]).css('z-index', 1);
		$(elements[settings.current]).fadeIn(settings.speed);

		//Geordnete Reihenfolge
		if (settings.type == 'sequence') {
			//Aktuelles Element ist nicht das letzte Element
			if ((settings.current + 1) < elements.length) {
				settings.current = settings.current + 1;
				settings.last = settings.current - 1;
			//Letztes Element
			} else {
				settings.current = 0;
				settings.last = elements.length - 1;
			} //endif
		//Zufällige Abfolge (random)
		} else {
			settings.last = settings.current;
			while (settings.current == settings.last) {
				settings.current = Math.floor(Math.random() * (elements.length));
			} //while end
		} //endif

		//Timeout Funktion (vorletztes Element verstecken und nächstes Element "abfahren")
		settings.timer = setTimeout((function() {
			$(elements[settings.savetohide]).hide();
			settings.savetohide = settings.last;
			$.fnslideshow.auto(elements, settings);
		}), settings.timeout);
	};

	//springt ein Bild weiter oder zurueck
	$.fnslideshow.jump = function (elements, settings, direction) {
		//anpassen des aktuellen Elements nach Richtungswechsel (auf next)
		if ((settings.lastdirection == 2) && (direction == 1)) {
			settings.current = (settings.current + 2) % elements.length;
		} //endif

		//anpassen des aktuellen Elements nach Richtungswechsel (auf prev)
		if (((settings.lastdirection == 0) || (settings.lastdirection == 1)) && (direction == 2)) {
			settings.current = (settings.current - 2) % elements.length;
			if (settings.current < 0) {
				settings.current = settings.current + elements.length;
			} //endif
		} //endif

		//letzte Richtung speichern
		settings.lastdirection = direction;

		//z-index aller Elemente zuruecksetzen
		for ( var i = 0; i < elements.length; i++ ) {
			$(elements[i]).css('z-index', 0);
		} //next

		//das nächste Element einblenden
		$(elements[settings.current]).css('z-index', 1);
		$(elements[settings.current]).fadeIn(settings.speed);

		//Errechnung des nächsten Elements (das was im nächsten Schritt angezeigt wird)
		//Richtung: next
		if (direction == 1) {
			//aktuelles Element war nicht das letzte Element
			if ((settings.current + 1) < elements.length) {
				settings.current = settings.current + 1;
				settings.last = settings.current - 1;
			//aktuelles Element war das letzte Element
			} else {
				settings.current = 0;
				settings.last = elements.length - 1;
			} //endif
		//Richtung: prev
		} else {
			//aktuelles Element war nicht das erste Element
			if (settings.current != 0) {
				settings.current = settings.current - 1;
				settings.last = settings.current + 1;
			//aktuelles Element war das erste Element
			} else {
				settings.current = elements.length - 1;
				settings.last = 0;
			} //endif
		} //endif

		//Click-Events fuer die Controller deaktivieren
		if ($(settings.nextcontrol) != null) {
			$(settings.nextcontrol).unbind('click');
		} //endif
		if ($(settings.prevcontrol) != null) {
			$(settings.prevcontrol).unbind('click');
		} //endif
		if (settings.playcontrol != null) {
			$(settings.playcontrol).unbind('click', $.fnslideshow.bindtoggleplaypauseevent);
		} //endif
		//Timeout fuer die Zeit des Ueberblendens
		settings.timer = setTimeout((function() {
			//letztes Element (jetzt verdeckt) ausblenden
			$(elements[settings.savetohide]).hide();
			//nächstes zu versteckendes Element merken
			settings.savetohide = settings.last;
			//Click-Events der Controller wieder aktivieren
			if ($(settings.nextcontrol) != null) {
				$(settings.nextcontrol).bind('click', function() {$.fnslideshow.jump(elements, settings, 1);});
			} //endif
			if ($(settings.prevcontrol) != null) {
				$(settings.prevcontrol).bind('click', function() {$.fnslideshow.jump(elements, settings, 2);});
			} //endif
			if (settings.playcontrol != null) {
				$(settings.playcontrol).bind('click', {elements:elements, settings:settings}, $.fnslideshow.bindtoggleplaypauseevent);
			} //endif
		}), settings.speed);
	};

	//wechselt zwischen Play und Pause Modus
	$.fnslideshow.toggleplaypause = function (elements, settings) {
		//Play -> Pause
		if (settings.mode == 1) {
			//Timer zum Umstellen des Bild stoppen
			clearTimeout(settings.timer);
			//Modus auf Pause setzen
			settings.mode = 2;
			//von außen definierbare Callback Funktion aufrufen
			if ((settings.callbackplaytopause != null) && (typeof window[settings.callbackplaytopause] == 'function')) {
				window[settings.callbackplaytopause]();
			} //endif
			//Click-Events der Controller wieder aktivieren
			if (settings.nextcontrol != null) {
				$(settings.nextcontrol).bind('click', function() {$.fnslideshow.jump(elements, settings, 1);});
			} //endif
			if (settings.prevcontrol != null) {
				$(settings.prevcontrol).bind('click', function() {$.fnslideshow.jump(elements, settings, 2);});
			} //endif
			//alle Slideshow Elemente durchgehen
			for ( var i = 0; i < elements.length; i++ ) {
				//das aktuell sichbare Element (last) zeigen wir an ...
				if (i == settings.last) {
					$(elements[i]).show();
				//... alle anderen blenden wir aus
				} else {
					$(elements[i]).hide();
				} //endif
			} //next
			//settings.last setzen wir eine Position zurueck ...
			settings.last = (settings.current - 1) % elements.length;
			//... falls wir dabei die Grenze zwischen Anfang und Ende ueberschreiten, passen wir das an
			if (settings.last < 0) {
				settings.last = settings.last + elements.length;
			} //endif
			//settings.savetohide setzen wir auf das manuell angepasste letzte Bild (eins vor dem, was
			//gerade angezeigt wird)
			settings.savetohide = settings.last;
		//Pause -> Play
		} else {
			//Modus auf Play setzen
			settings.mode = 1;
			//Click-Events fuer die Controller deaktivieren
			if (settings.nextcontrol != null) {
				$(settings.nextcontrol).unbind('click');
			} //endif
			if (settings.prevcontrol != null) {
				$(settings.prevcontrol).unbind('click');
			} //endif
			//von außen definierbare Callback Funktion aufrufen
			if ((settings.callbackpausetoplay != null) && (typeof window[settings.callbackpausetoplay] == 'function')) {
				window[settings.callbackpausetoplay]();
			} //endif
			//da wir vorwärts abspielen muessen wir auch die letzte Richtung (prev und next controls nutzen
			//das) entsprechend anpassen
			settings.lastdirection = 1;
			//zur Sicherheit initialisieren wir current, last und savetohide nocheinmal neu, dann kann beim
			//Abspielen nichts schiefgehen (current natuerlich abhängig von settings.type)
			if (settings.type == 'sequence') {
				settings.current = (settings.last + 1) % elements.length;
			} else {
				settings.current = Math.floor(Math.random() * (elements.length));
			} //endif
			settings.last = (settings.current - 1) % elements.length;
			if (settings.last < 0) {
				settings.last = settings.last + elements.length;
			} //endif
			settings.savetohide = settings.last;
			//Play
			$.fnslideshow.auto(elements, settings);
		} //endif
	};
})(jQuery);

/**
 * jQuery-Plugin "dynamicVisibility"
 */
// closure for plugin
(function($) {
	//plugin
	$.fn.dynamicVisibility = function(options) {
		// Extend our default options with those provided.
		opts = $.extend({}, $.fn.dynamicVisibility.defaults, options);
		// iterate and process each matched element
		// return it to enable chaining
		return this.each(function() {
			//
			var $this = $(this);
			//input type
			var sType = $this.attr('type');
			//input name
			var sName = $this.attr('name');
			//init pData with type and data provided in data-attribute-tag
			var pData = $.extend(	{}, 
									{targets:$.parseJSON($this.attr(opts.attributeName_data))},
									{type:sType},
									{name:sName}
								);
			//if radiobutton
			if(sType === "radio") {
				//if vars.apRadioTargets has no entry for the name ...
				if(vars.apRadioTargets[sName] === undefined) {
					//... initialize it with the target of this element
					vars.apRadioTargets[sName] = $.extend({}, pData.targets);
				//... else ...
				} else {
					//... extend it
					$.extend(vars.apRadioTargets[sName], pData.targets);
				} //end if vars.apRadioTargets has no element for name
			} //end if radiobutton
			//set up event handling for matched element
			initVisibilityTrigger($this, pData);
			//init visibility on startup
			updateVisibilityByObj($this, pData);
		}); //next matched element
	}; //end plugin
	
	//private plugin function to set up event handling for matched elements
	function initVisibilityTrigger(pObj, pData) {
		vars.apData = {};
		//for each target
		$.each(pData.targets, function(iKey, pTarget) {
			//switch by current display-property
			switch($(pTarget[opts.objectName_target]).css('display')) {
				//case
				case 'none':
				case undefined: {
					//set property: visible display-property
					pTarget.sCSSDisplayTrue = 'block';
					break;
				} //end case
				//case
				default: {
					//set property by current value: visible display-property
					pTarget.sCSSDisplayTrue = $(pTarget.target).css('display');
				} //end default
			} //end switch
		}); //next target
		//plugin-weites Datenarray erweitern um diesen Datensatz
		vars.apData[vars.apData.length] = {"obj":pObj,"data":pData};
		//switch by input type
		switch(pData.type) {
			//radiobutton
			case "radio": {
				//on changing any radio with the name of the matched element updataVisibility
				$('input[name='+pObj.attr("name")+']').change(function(){updateVisibilityByObj(pObj, pData);});
				break;
			} //end case
			//checkbox
			case "checkbox": {
				//on change update visibility
				pObj.change(function(){updateVisibilityByObj(pObj, pData);});
				break;
			} //end case
			//default
			default: {
				//nichts
				break;
			} //end case
		} //end switch
	}; //end private plugin function initVisibilityTrigger
	
	//public plugin method to update visibility
	var updateVisibilityByObj = function (pObj, pData) {
		//if pData.targets exists
		if((pData !== undefined) && (pData.targets !== undefined)) {
			//if radio and no data
			if((pData.type === "radio") && (($('input[name='+pObj.attr("name")+']:checked')[0] === undefined) || ($('input[name='+pObj.attr("name")+']:checked').attr(opts.attributeName_data) === undefined))) {
				//set all affected elements visible
				resetVisibilitiesByRadioName(pData.name);
				//reset flag vars.bResetRadioTargets for next event
				vars.bResetRadioTargets = true;
			} //end if reset
			//if !radio or checked radio
			if((pData.type !== "radio") || (pObj.attr("checked") !== undefined)) {
				//if radio
				if(pData.type === "radio") {
					//reset visibility
					resetVisibilitiesByRadioName(pData.name);
				} //end if radio
				//flag: show target
				var bShowTarget = true;
				//for each target
				$.each(pData.targets, function(iKey, pTarget) {
					//set flag by targetoption and checked-state of element
					bShowTarget = pTarget.showonchecked === (pObj.attr("checked") !== undefined);
					//if target is to be displayed
					if(bShowTarget) {
						//set display-property
						$(pTarget.target).css("display", pTarget.sCSSDisplayTrue);
					} else {
						//set display-property
						$(pTarget.target).css("display", "none");
					} //end if display target
				}); //next target
				//reset falg for next event
				vars.bResetRadioTargets = true;
			} //end if !radio or checked radio
		} //end if pData.targets exists
	}; //end updateVisibilityByObj
	
	//object for overwritten options
	var opts = {};
	
	//private function to reset elements affected by radios with given name
	var resetVisibilitiesByRadioName = function (sRadioName) {
		//if last event handling for radio is finished
		if (vars.bResetRadioTargets === true) {
			//set radio-event handling in progress
			vars.bResetRadioTargets = false;
			//for each affected element
			$.each(vars.apRadioTargets[sRadioName], function() {
				//set visible
				$(this.target).css("display", this.sCSSDisplayTrue);
			}); //next affected element
		} //end if
	};
	
	//public function to update visibility of all elements
	$.fn.dynamicVisibility.updateVisibility = function() {
		//for each element
		$.each(vars.apData, function(){
			//update visibility
			updateVisibilityByObj(this.obj, this.data);
		}); //next element
	};
	
	//plugin default options
	$.fn.dynamicVisibility.defaults = {
		attributeName_data: 'dynamicVisibilityData',	// Name des Attributs in welchem benötigte Daten hinterlegt werden
		objectName_target: 'target',					//Name des Objektes in welchem der CSS-Selector eines targets hinterlegt ist
		objectName_showonchecked: 'showonchecked'		//Name des Objektes in welchem definiert wird ob das target bei checked sichtbar ist bei unchecked
	}; //end plugin default options
	
	//plugin vars
	var vars = {		
		"apRadioTargets": [],		//array for storing all targets of affected radiogruops by radionames
		"bResetRadioTargets": true,	//true: event-handling for radio in progress
		"apData": {}				//array for storing all targets
	}
	
})(jQuery); //end closure
