/**
 * jQuery-Plugin "pngFix"
 * Version: 1.1, 11.09.2007
 * by Andreas Eberhard, andreas.eberhard@gmail.com
 *                      http://jquery.andreaseberhard.de/
 *
 * Copyright (c) 2007 Andreas Eberhard
 * Licensed under GPL (http://www.opensource.org/licenses/gpl-license.php)
 */
(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);


(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 überhaupt Sinn
			//das Slideshow-Handling anzustoßen
			if (elements.length > 1) {

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

				//CSS für 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

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

				//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 übernimmt
	$.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 für 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 zurück
	$.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 zurücksetzen
		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 für 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 für die Zeit des Überblendens
		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 zurück ...
			settings.last = (settings.current - 1) % elements.length;
			//... falls wir dabei die Grenze zwischen Anfang und Ende überschreiten, 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 für 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 müssen 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 natürlich 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);