/*
 ***** Mosaiq-Media jQuery Slider Plugin *****
 ***** Author: Philipp Schweinbenz *****
 */

//Closure, um Konflikte mit andere Frameworks zu vermeiden
;(function($) {
	$.fn.mmSlider = function(arg, callback) {

		//Standardwerte des Plugins
		var defaults = {
			sliderID: '#slider',
			sliderSpeed: '7000',
			animationSpeed: 1200,
			useController: 0,
			controller: '.controller',
			controllerContainer: '.controller ul',
			controllerTag: 'li',
			controllerOpenedMargin: '527'
		};

		//Sofern Argumente übergeben werden, werden die Standardwerte entspr. überschrieben
		var options = $.extend(
			{},
			defaults,
			arg,
			{callback: callback}
		);

		//Sicherstellung, dass weitere Methoden an diese Methode angehängt werden können
		return this.each(function() {
			//Definition der zu slidenden Elemente
			var elements = $(options.sliderID).children();

			//Die controller der verschiedenen Elemente laden
			var controller = $(options.controller);

			//sofern ein controller eingesetzt wird, wird die Variable digit definiert, ansonsten wird der Controller ausgeblendet
			if(options.useController == 1 && elements.length > 1) {
				var digit = '01';
			}
			else {
				controller.hide();
			}

			//Die Slideshow wird erst gestartet, wenn alle Bilder geladen wurden.
			//Verwendung des Plugins imagesLoaded
			$(options.sliderID + ' img').imagesLoaded(function() {
				slideShow(options, elements, controller, digit);
			}, true);
		});

		//Aufruf einer Callback Funktion, sofern übergeben
		function callFn(callback) {
			if($.isFunction(callback)) {
				callback.call(this);
			}
		}

		//Funktionalität des Plugins
		function slideShow(opts, elements, controller, digit) {
			//Falls nur ein Element oder weniger vorhanden sind, slider nicht starten
			if(elements.length <= 1) {
				return;
			}

			//index beinhaltet den aktuellen Stand des sliders
			var index = 1;
			//slider beinhaltet die Funktionalität des Sliders (Timeout)
			var slider;
			//boolToggleMenu steuert die Klickfunktion des controllers
			var boolToggleMenu = true;

			//die Variable fn dient zur Steuerung des Sliders
			var fn = {
				blend: function() {
					// Klickcontroller von allen Einträgen entfernen
					boolToggleMenu = false;

					//Aktuelles Element ausfaden und austauschen
					var current = elements.filter('.current').fadeOut(opts.animationSpeed).removeClass('current');
					if(current.next().length) {
						current = current.next();
						index = index + 1;
					}
					else {
						current = elements.first();
						index = 1;
					}

					//Sofern ein Controller verwendet wird, wird die angezeigte Zahl entsprechend angepasst
					if(opts.useController == 1) {
						digit = index;
						if(index < 10) {
							digit = '0' + index;
						}
						current.find(controllerContainer).html('<'+opts.controllerTag+' class="active">' + digit + '</'+opts.controllerTag+'>');
					}

					//neues Element einfaden, Klickcontroller aktivieren und Slider erneut starten
					current.fadeIn(opts.animationSpeed, function (){
						boolToggleMenu = true;
						slider = setTimeout(fn.blend, opts.sliderSpeed);
					}).addClass('current');

					//Sofern eine Callback Funktion übergeben wurde, wird sie an dieser Stelle ausgeführt
					callFn(opts.callback);
				},
				stop: function() {
					//Slider stoppen
					clearTimeout(slider);
				}
			}

			//Erstes Element anzeigen und slider starten
			elements.first().show(function() {
				slider = setTimeout(fn.blend, opts.sliderSpeed);
			}).addClass('current');

			//Funktionalität des Controllers
			if(opts.useController == 1) {

				var controllerContainer = $(opts.controllerContainer);
				var controllerContentMargin = controllerContainer.css('margin-left');

				//Controller auf Klick abwechselnd öffnen und schließen
				//Sofern gerade geslidet wird, Funktionalität aufheben und über trigger Reihenfolge beibehalten
				controller.toggle(
					function() {
						if (boolToggleMenu) {
							openControl($(this));
						} else {
							$(this).trigger('toggle');
						}
					},
					function() {
						if (boolToggleMenu) {
							closeControl();
						} else {
							$(this).trigger('toggle');
						}
					}
				);
			}

			//Funktion zum Öffnen des Controllers
			function openControl(obj) {
				var activeDigit;
				var positionLeft;

				//slider stoppen
				fn.stop();
				elements.stop(true, true);
				//beim aktuellen Element controller öffnen
				obj.removeClass('closed').addClass('opened');
				
				//Inhalt des Controllers löschen und je nach Anzahl an Elementen entsprechende Auswahl integrieren
				controllerContainer.html('');
				for(var i = 0; i < elements.length; i++) {
					activeDigit = '';
					digit = i + 1;
					if(digit == index) {
						activeDigit = ' class="active"';
					}
					if(digit < 10) {
						digit = '0' + digit;
					}
					controllerContainer.append('<'+opts.controllerTag + activeDigit + '>' + digit + '</'+opts.controllerTag+'>');
				}

				//Neuer Inhalt des Controllers entsprechend positionieren
				var dgCnt =  controllerContainer.find($(opts.controllerTag));
				positionLeft = opts.controllerOpenedMargin - (index * (parseInt(dgCnt.css('padding-left')) + parseInt(dgCnt.css('padding-right')) + parseInt(dgCnt.css('width'))));
				controllerContainer.css('margin-left', positionLeft + 'px');

				//Auf Inhalte des Controllers hover Effekt legen
				controllerContainer.children().hover(
					function() {
						if(index != $(this).index() + 1) {
							$(this).addClass('active');
						}
					},
					function() {
						if(index != $(this).index() + 1) {
							$(this).removeClass('active');
						}
					}
				);

				//Auf Inhalte des Controllers Klickfunktion legen, um die Sliderelemente auszutauschen
				controllerContainer.children().click(function() {
					//Element nur austauschen, wenn es sich nicht um das aktuelle handelt
					if(index != $(this).index() + 1) {
						index = $(this).index() + 1;
						
						// Klickcontroller von allen Einträgen entfernen
						boolToggleMenu = false;

						//aktuelles Element ausfaden, neues Element einfaden, Klickfunktion des Controllers aktivieren und slider starten
						elements.filter('.current').fadeOut(opts.animationSpeed).removeClass('current');
						elements.eq($(this).index()).fadeIn(opts.animationSpeed, function (){
							boolToggleMenu = true;
							slider = setTimeout(fn.blend, opts.sliderSpeed);
						}).addClass('current');

						//Controller schließen
						closeControl();
					}
				});
			}

			//Funktion zum Schließen des Controllers, Austausch und Positionierung des Inhalts
			function closeControl() {
				controllerContainer.html('');
				controllerContainer.css('margin-left', controllerContentMargin);
				controller.removeClass('opened');
				controller.addClass('closed');
				digit = index;
				if(index < 10) {
					digit = '0' + index;
				}
				controllerContainer.html('<'+opts.controllerTag+' class="active">' + digit + '</'+opts.controllerTag+'>');
			}
		}	
	};
})(jQuery);

