// $(function(){
	// jQuery while loading …
// });

jQuery(window).load(function(){
	// jQuery after loading …
	
	// generic variables
	var $ = jQuery,
		debug = false,
		currentSlide = -1;
	
	// timing config
	var slideFadeInSpeed = 750
		slideTransitionSpeed = 750,
		slideTransitionDelayInit = 10000,
		slideTransitionDelayReturn = 1000,
		slideTransitionDelay = slideTransitionDelayInit,
		returnToAutoDelay = 2500,
		controlsTransitionSpeed = 200;
	
	// handles
	var autoSlideHandle = 0,
		restartAutoSlideHandle = 0;
	
	// jQuery DOM-objects
	var $sliderViewport = $('#sliderViewport'),
		$sliderNext = $('#sliderNext'),
		$sliderPrev = $('#sliderPrev');
	
	// jQuery DOM-objectdata
		$sliderViewport.data('isAuto', true);
	
	// fetch data
	var sliderContent = slider_getContent(),
		sliderCount = slider_getContent({'type':'count'}),
		sliderBackgrounds = slider_getBackgrounds(),
		sliderAreaLink = $('#sliderAreaBg a').attr('href'),
		sliderAreaLinkTarget = $('#sliderAreaBg a').attr('target');
		
	
	/************************************************
	* FUNCTIONS										*
	************************************************/
	
	/**
	 *	GET CONTENT
	 *	Zitate und Autoren aus sliderData filtern und als Objekt zurückgeben
	 */
	function slider_getContent (config) {
		
		var options = { 'type': 'data' },
			options = $.extend(options, config)
			objReturnContent = new Object(),
			objReturnCount = 0;
		
		$('#sliderCitationList li')
		.each(function(index){
			
			objReturnContent[index] = new Object();
			objReturnContent[index]['author'] = $(this).children('.sliderAuthor').html();
			objReturnContent[index]['citation'] = $(this).children('.sliderCitation').html();
			objReturnContent[index]['link'] = $(this).children('.sliderLink').html();
			
			objReturnCount++;
			
		});
		
		return options.type == 'data' ? objReturnContent : options.type == 'count' ? objReturnCount : false;
		
	}
	
	
	/**
	 *	GET BACKGROUNDS
	 *	Hintergrundbilder aus sliderData filtern und als Objekt zurückgeben
	 */
	function slider_getBackgrounds () {
		
		var objReturnImages = {
				'area': $('#sliderAreaBg img').attr('src'),
				'cite': $('#sliderCiteBg img').attr('src')
			};
		
		return objReturnImages;
		
	}
	
	
	/**
	 *	CREATE SLIDE
	 *	Füge Hintergrundbild und Zitat zusammen und gib es zurück
	 */
	function slider_createSlide (config) {
		
		var options = { 'id': '', 'mode': 'start', 'background': '' }
			options = $.extend(options, config),
			slideUniqueId = options.id != '' ? ' id="' + options.id + '"' : '',
			slideStartingPoint = options.mode == 'next' ? ' right' : options.mode == 'prev' ? ' left' : ' start'
			slideBackgroundStyle = options.background != '' ? ' style="background-image:url(' + options.background + ');"' : '';
		
		if (options.content != '' && options.content != undefined) {
			// Hintergrundbild mit Zitat
			
			var slideCitation = options.content.citation != null ? '<span class="sliderCitation">' + options.content.citation + '</span>' : '',
				slideAuthor = options.content.author != null ? '<span class="sliderAuthor">' + options.content.author + '</span>' : '',
				slideLink = options.content.link != null ? '<span class="sliderLink">' + options.content.link + '</span>' : '',
				slideContent = slideCitation + slideAuthor + slideLink;
			
			return ('<div' + slideUniqueId + ' class="sliderContent cite' + slideStartingPoint + '"' + slideBackgroundStyle + '>' + slideContent +'</div>');
		}
		else {
			// Nur Hintergrundbild ohne Inhalt (Bereichsbild)
			
			var slideLinkTarget = sliderAreaLinkTarget != null ? ' target="' + sliderAreaLinkTarget + '"' : '',
				slideLink = sliderAreaLink != null ? '<span class="sliderLink"><a href="' + sliderAreaLink + '"' + slideLinkTarget + '><span class="hidden">' + sliderAreaLink + '</span></a></span>' : '<!-- empty -->';
			
			return ('<div' + slideUniqueId + ' class="sliderContent area' + slideStartingPoint + '"' + slideBackgroundStyle + '>' + slideLink + '</div>');
		}
		
	}
	
	
	/**
	 *	ANIMATE SLIDE
	 *	animiere Slide von links nach rechts / von rechts nach links
	 */
	function slider_animateSlide (options) {
		
		$sliderNext.unbind('click', slider_nextCiteSlide);
		$sliderPrev.unbind('click', slider_prevCiteSlide);
		
		// fetch new Backgrounds
		sliderBackgrounds = slider_getBackgrounds();
		
		if (options.mode == 'next') {
			// nächstes Slide
			
			$sliderViewport
			.append(slider_createSlide(options))
				.children()
					.last()
					.stop()
					.animate(
						{ 'left': '0%' },
						slideTransitionSpeed,
						'swing',
						function(){ $(this).removeClass('right'); }
					)
				.end()
					.first()
					.stop()
					.animate(
						{ 'left': '-100%' },
						slideTransitionSpeed,
						'swing',
						function(){
							$(this).remove();
							
							$sliderNext.click(slider_nextCiteSlide);
							$sliderPrev.click(slider_prevCiteSlide);
						}
					);
			
		}
		else if (options.mode == 'prev') {
			// vorheriges Slide
			
			$sliderViewport
			.prepend(slider_createSlide(options))
				.children()
					.first()
					.stop()
					.animate(
						{ 'left': '0%' },
						slideTransitionSpeed,
						'swing',
						function(){ $(this).removeClass('right'); }
					)
				.end()
					.last()
					.stop()
					.animate(
						{ 'left': '100%' },
						slideTransitionSpeed,
						'swing',
						function(){
							$(this).remove();
							
							$sliderNext.click(slider_nextCiteSlide);
							$sliderPrev.click(slider_prevCiteSlide);
						}
					);
			
		}
		else {
			// fallback
			
			$sliderViewport
				.children()
				.remove()
			.end()
			.append(slider_createSlide(options))
			.children()
			.css({ 'display': 'none' })
			.stop()
			.fadeIn(
				slideFadeInSpeed,
				function(){			
					$sliderNext.click(slider_nextCiteSlide);
					$sliderPrev.click(slider_prevCiteSlide);
				}
			);
			
		}
		
	}
	
	
	/**
	 *	NEXT CITATION SLIDE
	 *	Nächstes Slide mit Zitat aufrufen
	 */
	function slider_nextCiteSlide () {
		
		currentSlide = currentSlide < sliderCount - 1 ? currentSlide + 1 : 0;
		slider_animateSlide({'mode':'next', 'type':'cite', 'content': sliderContent[currentSlide], 'background': sliderBackgrounds.cite});
		$sliderViewport.data('type', 'area');
		
	}
	
	
	/**
	 *	PREV CITATION SLIDE
	 *	Vorheriges Slide mit Zitat aufrufen
	 */
	function slider_prevCiteSlide () {
		
		currentSlide = currentSlide > 0 ? currentSlide - 1 : sliderCount - 1;
		slider_animateSlide({'mode':'prev', 'type':'cite', 'content': sliderContent[currentSlide], 'background': sliderBackgrounds.cite});
		$sliderViewport.data('type', 'area');
		
	}
	
	
	/**
	 *	NEXT AREA SLIDE
	 *	Slide mit Bereichshintergrundbild anzeigen
	 */
	function slider_areaSlide (config) {
		
		var options = { 'mode':'next' },
			options = $.extend(options, config);
		
		slider_animateSlide({'mode':options.mode, 'type':'area', 'background': sliderBackgrounds.area});
		
	}
	
	
	/**
	 *	AUTOMATIC SLIDING
	 *	Abfolge der Slides im "Auto"-Modus
	 */
	function slider_autoSlide () {
		
		if (slideTransitionDelay == slideTransitionDelayReturn) {
			
			slideTransitionDelay = slideTransitionDelayInit;
			
			window.clearInterval(autoSlideHandle);
			autoSlideHandle = window.setInterval(slider_autoSlide, slideTransitionDelay);
			
		}
		
		if ($sliderViewport.data('isAuto')) {
			
			if (typeof($sliderViewport.data('type')) == 'undefined' || $sliderViewport.data('type') == 'cite') {
				
				slider_nextCiteSlide();
				$sliderViewport.data('type', 'area');
				
			}
			else {
				
				slider_areaSlide();
				$sliderViewport.data('type', 'cite');
				
			}
			
		}
		
	}
	
	/**
	 *	START AUTOMATIC SLIDING
	 *	Startet die Abfolge der Slides im "Auto"-Modus
	 */
	function slider_startAutoSlide () {
		
		$('#sliderTypeIndicator')
		.removeAttr('class')
		.addClass('auto')
		.stop(true, true)
		.fadeTo(250, .85)
		.delay(500)
		.fadeOut(250);
		
		autoSlideHandle = window.setInterval(slider_autoSlide, slideTransitionDelay);
		
	}
	
		
	/************************************************
	* INIT SLIDER									*
	************************************************/
	slider_animateSlide({'mode':'start', 'type':'area', 'background': sliderBackgrounds.area});	
	slider_startAutoSlide();
	
	
	/************************************************
	* INTERACTION									*
	************************************************/
	$('#sliderWrapper')
	.hover(
		function(){
			
			window.clearInterval(autoSlideHandle);
			window.clearTimeout(restartAutoSlideHandle);
			
			$('#sliderTypeIndicator')
			.removeAttr('class')
			.addClass('manual')
			.stop(true, true)
			.fadeTo(250, .85)
			.delay(1000)
			.fadeOut(250);
			
		},
		function(){
			
			slideTransitionDelay = slideTransitionDelayReturn;
			restartAutoSlideHandle = window.setTimeout(slider_startAutoSlide, returnToAutoDelay);
			
			$('#sliderTypeIndicator')
			.removeAttr('class')
			.addClass('waiting')
			.stop(true, true)
			.fadeTo(250, .85);
			
		}
	);
	
	
	/************************************************
	* ANIMATION										*
	************************************************/
	$sliderNext
	.hover(
		function(){ $(this).stop().animate( { 'right': '0px' }, controlsTransitionSpeed); },
		function(){ $(this).stop().animate( { 'right': '-10px' }, controlsTransitionSpeed); }
	);
	
	$sliderPrev
	.hover(
		function(){ $(this).stop().animate( { 'left': '0px' }, controlsTransitionSpeed); },
		function(){ $(this).stop().animate( { 'left': '-10px' }, controlsTransitionSpeed); }
	);
	
	
	/************************************************
	* DEBUG											*
	************************************************/
	if (debug) {
		console.log(sliderContent);
		console.log(sliderBackgrounds);
	}
});
