var FADE_TIME_MAIN_NAV = 500;
var FADE_TIME_IMP_AREA = 600;


var luerssen = {};

luerssen.contentslider = function(options)
{
	this.init(options);
};

$.extend(luerssen.contentslider.prototype, {
	
	init: function(options) {
		var defaults = {
		  nextContent: null,
		  prevContent: null,
		  currentContent: 1,
		  speed: 600,
		  headerContent: null,
		  slides: 0,
		  slideIndicator: null,
		  clickable: true,
		  autoSlide: [],
		  pauseTime: 1500,
		  autoSlideInstance: null
		};
		this.options = $.extend(defaults, options);
		
		this.options.slides = $('.approach').length;
		this.options.slideIndicator.find('ul li:eq(2) > span').text(this.options.slides);
		
		var approach = $('.approach');
		$(approach[0]).attr('style', 'display: block;');
		
		this.handleSlideNavigation();
		this.handleAutoSlideShow();
		
		var me = this;
		this.options.nextContent.click(function(e) {
			e.preventDefault();
			me.changeContent('next');
		});
		this.options.prevContent.click(function(e) {
			e.preventDefault();
			me.changeContent('prev');
		});
		
		// hide prev
		this.options.prevContent.addClass('hidden');
		
		this.options.headerContent.easySlider({
			speed: me.options.speed*2,
			nextBtn: $('#img-next'),
			prevBtn: $('#img-prev'),
			nextId: 'img-next',
			prevId: 'img-prev',
			slideItems: null
		});
		
		
	}, 
	changeContent: function(type) {
		if (this.options.clickable) {
			this.options.clickable = false;
			var me = this;
			var approach = $('.approach');
			$(approach[this.options.currentContent-1]).fadeOut(this.options.speed,
					function() {
				switch (type) {
				case 'next':
					me.options.currentContent++;
					break;
				case 'prev':
					me.options.currentContent--;
					break;
				}
				me.handleSlideNavigation();
				me.handleAutoSlideShow();
				var approach = $('.approach');
				$(approach[me.options.currentContent-1]).fadeIn(me.options.speed);
			}
			);
			
		}
		
		
	},
	handleAutoSlideShow: function() {
		var imgContainer = this.options.headerContent.find('ul li:eq('+(this.options.currentContent-1)+') > img');
		
		if (null != this.options.autoSlideInstance)
		{
			this.options.autoSlideInstance.destroy();
		}
		if ((null != this.options.autoSlide[this.options.currentContent]) && (this.options.autoSlide[this.options.currentContent].length > 1)) 
		{
			this.options.autoSlideInstance = new luerssen.impressionAreaSliderAuto({
				imageContainer: imgContainer,
				imagesObj: this.options.autoSlide[this.options.currentContent],
				pauseTime: this.options.pauseTime,
				speed: 2500
			});
		}
		
	},
	handleSlideNavigation: function() {
		// hide buttons if there is no forhter slide
		switch (this.options.currentContent) {
		case 1:
			this.options.prevContent.addClass('hidden');
			this.options.nextContent.removeClass('hidden');
			break;
		case this.options.slides:
			this.options.nextContent.addClass('hidden');
			this.options.prevContent.removeClass('hidden');
			break;
		default:
			this.options.nextContent.removeClass('hidden');
			this.options.prevContent.removeClass('hidden');
			break;
		}
		
		this.options.slideIndicator.find('ul li:eq(0) > span').text(this.options.currentContent);
		this.options.clickable = true;
	}
	
});


luerssen.mainNavigation = function(options)
{
	this.init(options);
};

$.extend(luerssen.mainNavigation.prototype, {
	
	mainNavId: null,
	// current active navigation layer
	currentActiveLayer: null,
	
	init: function(options) {
		this.mainNavId = options.mainNaviId;		
	},
	addEventHandler: function() {
		var ele = $(this.mainNavId+" > ul > li > a");
		var me = this;
		ele.each(function() {
			$(this).click(function(e){
				e.preventDefault();
				var currentLayer = $(this).parent().find('nav');
				currentLayer.fadeToggle(FADE_TIME_MAIN_NAV);
				
				me.hide(currentLayer);
				me.currentActiveLayer = currentLayer; 
				currentLayer.parent().toggleClass('active');
			});
		});
	},
	hide: function(curLayer)
	{
		if (null !== this.currentActiveLayer)
		{
			if (curLayer.parent().attr('id') != this.currentActiveLayer.parent().attr('id'))
			{
				this.currentActiveLayer.fadeOut(FADE_TIME_MAIN_NAV);
				this.currentActiveLayer.parent().removeClass('active');
			}
		}
	}
	

	
});

luerssen.history = function(options)
{
	this.init(options);
};

$.extend(luerssen.history.prototype, {
	
	json: null,
	next: null,
	prev: null,
	image: null,
	nav: null,
	
	startGen: null,
	startYear: null,
	
	currentGen: null,
	currentYear: null,
	currentImage: 0,
	
	// save first- and last year of current
	// generation
	gFirstYear: null,
	gLastYear: null,
	
	hdlYear: null,
	subline: null,
	info: null,
	lang: "EN",
	
	format: "portrait",
	
	init: function(options) {
		this.json = options.json;
		this.next = options.next;
		this.prev = options.prev;
		this.image = options.image;
		this.nav = options.navi;
		
		this.startGen = options.startGen;
		this.startYear = options.startYear;
		
		// calculate last gen
		this.lastGen = options.lastGen;
		this.lastYear = this.json.generations[this.lastGen].gLastYear;
		
		this.currentGen = this.startGen;
		this.currentYear = this.startYear;
	
		this.lang = undefined != options.lang ? options.lang : "EN",
		this.hdlYear = options.hdlYear;
		this.subline = options.subline;
		this.info = options.info;
		
		this.initNavigation();
		this.setBoundaries();
		this.setImageByGenAndIndex();
		var me = this;
		this.next.click(function(e) {
			e.preventDefault();
			me.nextImage();
			me.prev.removeClass('hidden');
		});
		
		this.prev.click(function(e) {
			e.preventDefault();
			me.prevImage();
			me.next.removeClass('hidden');
		});
		this.next.addClass('hidden');
		
	},
	initNavigation: function()
	{
		var me = this;
		this.nav.find('a').each(function(){
			$(this).click(function(e) {
				e.preventDefault();
				me.setByGen($(this).attr('id'));
			});
		});
	},
	setByGen: function(gen)
	{
		this.removeNaviHighlight();
		this.currentGen = gen;
		this.currentImage = 0;
		this.currentYear = this.json.generations[this.currentGen].gFirstYear;
		this.setBoundaries();
		
		this.setImageByGenAndIndex();
		this.prev.removeClass('hidden');
		this.next.removeClass('hidden');

		if (this.currentGen == this.startGen) {
			this.next.addClass('hidden');
		}
	},
	removeNaviHighlight: function()
	{
		this.nav.find('a#'+this.currentGen).removeClass('active');
		$('#wrapper').removeClass(this.currentGen);
		$('#history-wrapper').removeClass(this.currentGen);
	},
	setNaviHighlight: function()
	{
		this.nav.find('a#'+this.currentGen).addClass('active');
		$('#wrapper').addClass(this.currentGen);
		$('#history-wrapper').addClass(this.currentGen);
	},
	setBoundaries: function()
	{
		this.gFirstYear = this.json.generations[this.currentGen].gFirstYear;
		this.gLastYear = this.json.generations[this.currentGen].gLastYear;
	},
	nextImage: function()
	{
		// see this.prevImage() for further information
		this.currentImage--;
		
		if (!this.imageExists())
		{
			
			if (this.getGen(this.currentYear, "increase"))
			{
				this.setNextAvailableYear(this.currentYear, "increase");	
			}
			// set image to last image in year. not to first!
			this.currentImage = this.json.generations[this.currentGen].Year[this.currentYear].length - 1;
		}
		
		this.setImageByGenAndIndex();
		
		if (this.currentYear == this.startYear && this.currentImage == 0)
		{
			this.next.addClass('hidden');
		}
	},
	prevImage: function()
	{
		// increase currentImage by 1.
		this.currentImage++;
		
		// and check, if currentImage is valid.
		// if not, set to 0 and increase year in current Generation
		if (!this.imageExists())
		{
			this.currentImage = 0;
			// if current year is NOT the last year
			// in current generation, get next available year
			if (this.getGen(this.currentYear, "decrease"))
			{
				this.setNextAvailableYear(this.currentYear, "decrease");
			}
			// otherwise, getGen perform a check for next/previous generation
			// if no further generation exists, all values for year, gen and image
			// are reset to initial values.
		} 
		// then, set image by current generation, year and index
		this.setImageByGenAndIndex();
		
		if (this.currentYear == this.lastYear) {
			this.prev.addClass('hidden');
		}
		
	},
	setNextAvailableYear: function(year, direction)
	{
		// set checkYear
		var checkYear;
		var yearAsInt = parseInt(year.slice(1, year.length));
		
		switch(direction)
		{
			case "decrease":
				yearAsInt--;
				checkYear = "y"+yearAsInt;
			break;
			case "increase":
				yearAsInt++;
				checkYear = "y"+yearAsInt;
			break;
		}
		if (undefined == this.json.generations[this.currentGen].Year[checkYear])
		{
			this.setNextAvailableYear(checkYear, direction);
		} else {
			this.currentYear =  checkYear;
		}
	},
	imageExists: function()
	{
		return undefined == this.json.generations[this.currentGen].Year[this.currentYear][this.currentImage] ? false : true;
	},
	getGen: function(year, direction)
	{
		var checkYear;
		var checkGen;
		var genAsInt = parseInt(this.currentGen.slice(1, this.currentGen.length));
		
		// if decreased, set currentYear to gFirstYear from JSON
		// if increased, set currentYear to gLastYear from JSON
		var newCurrentYear;
		// switch over direction, and set checkYear 
		// and checkGen
		switch (direction)
		{
			case "decrease":
				checkYear = this.gLastYear;
				
				genAsInt--;
				checkGen = "g"+genAsInt;
				newCurrentYear = "gFirstYear";
			break;
			case "increase":
				checkYear = this.gFirstYear;

				genAsInt++;
				checkGen = "g"+genAsInt;
				newCurrentYear = "gLastYear";
			break;
		}
		
		// check if there is a next year in current generation
		// if not, increase generation
		if (year == checkYear)
		{
			this.removeNaviHighlight();
			if (undefined == this.json.generations[checkGen])
			{
				this.currentGen = direction == "increase" ? this.lastGen : this.startGen;
				this.currentYear = direction == "increase" ? this.lastYear : this.startYear;
				//return false;
			} else {
				this.currentGen = checkGen;
				this.currentYear = this.json.generations[checkGen][newCurrentYear]; 
			}
			this.currentImage = 0;
			this.setBoundaries();
		} else {
			return true;
		}
	},
	getImageByGenAndIndex: function(gen, idx)
	{
		if (undefined != this.json.generations[gen].Year[this.currentYear][idx].format)
		{
			this.format = this.json.generations[gen].Year[this.currentYear][idx].format;
		}
		return this.json.generations[gen].Year[this.currentYear][idx].imageID;
	},
	setImageByGenAndIndex: function()
	{
		this.image.ImageSwitch({NewImage:this.getImageByGenAndIndex(this.currentGen, this.currentImage), Speed: FADE_TIME_IMP_AREA}, {method: this.setPortraitOrLandscape, scope: this});
		this.setHeadline("year");
		this.setHeadline("subline");
		this.setHeadline("info");
		
		this.setNaviHighlight();
	},
	setPortraitOrLandscape: function()
	{
		switch (this.format)
		{
		case "portrait":
			
			$('#image').removeClass('landscape').addClass('portrait');
			
			$('#content-background-portrait').fadeIn(600);
			$('#content-background-landscape').fadeOut(600);
			break;
		case "landscape":
			$('#image').removeClass('portrait').addClass('landscape');
			
			$('#content-background-landscape').fadeIn(600);
			$('#content-background-portrait').fadeOut(600);
			break;
		}
	},
	setHeadline: function(hdl)
	{
		// get current lang-specific node
		var node = this.json.generations[this.currentGen].Year[this.currentYear][this.currentImage].lang[this.lang];
		
		switch (hdl)
		{
			case "year":
				this.hdlYear.html(this.currentYear.slice(1, this.currentYear.length));
				break;
			case "subline":
				this.subline.html(node.text);
				break;
			case "info":
				this.info.html(node.info);
				break;
		}
	}
	
});


/* ImpressionsArea-Auto-Slider */
luerssen.impressionAreaSliderAuto = function(options)
{
	this.init(options);
};
$.extend(luerssen.impressionAreaSliderAuto.prototype, {
	imageContainer: null,
	currentImage: 0,
	countImages: 0,
	
	init: function(options) {
		var me = this;
		this.imageContainer = options.imageContainer;
		this.imagesObj = options.imagesObj;
		this.countImages = this.imagesObj.length;
		
		this.pauseTime = options.pauseTime;
		this.speed = options.speed;
		
		this.interval = setInterval(
				function() { me.setImage(me); }
			
		, this.pauseTime);
	},
	destroy: function()
	{
		clearInterval(this.interval);
	},
	setImage: function(scope)
	{
		scope.imageContainer.ImageSwitch({NewImage:scope.imagesObj[scope.currentImage], Speed: scope.speed});
		
		if (scope.countImages-1 == scope.currentImage)
		{
			scope.currentImage = 0;
		} else {
			scope.currentImage++;
			
		}
	}
});

/* ImpressionsArea-Slider */
luerssen.impressionAreaSlider = function(options) 
{
	this.init(options);
};

$.extend(luerssen.impressionAreaSlider.prototype, {
	
	imageContainer: null,
	imageControls:  null,
	// reference to current active link
	activeTrigger: null,
	nextImageControl: null,
	prevImageControl: null,
	useControls: false,
	speed: 2500,
	
	init: function(options) {
		
		var me = this;
		this.imageContainer = options.imageContainer;
		this.imageControls = options.imageControls;
		this.nextImageControl = options.nextImageControl;
		this.prevImageControl = options.prevImageControl;
		this.useControls = options.useControls;
		this.speed = options.speed;
		if(this.useControls==false) {
			$(this.imageControls).parents("ul").hide();
		}
		// in init, save reference to first item-link as
		// current active trigger
		this.activeTrigger = $(this.imageControls[0]);
		
		// hide prev image link
		this.showOrHideControl('prev');
		
		// set click to event to "next" and "previous" control
		this.nextImageControl.click(function(e) {
			e.preventDefault();
			me.activeTrigger.parent().next().find('a').trigger('click');

			me.showOrHideControl('next');
			me.showOrHideControl('prev');
		});

		this.prevImageControl.click(function(e) {
			e.preventDefault();
			me.activeTrigger.parent().prev().find('a').trigger('click');
			
			me.showOrHideControl('next');				
			me.showOrHideControl('prev');
		});
		
		this.imageControls.each(function() {
			$(this).click(function(e) {
				// remove active class from current activeTrigger
				me.activeTrigger.removeClass('active');
				me.activeTrigger = $(this);
				me.activeTrigger.addClass('active');
				me.imageContainer.ImageSwitch({NewImage:this.href, Speed: me.speed});
				me.showOrHideControl('prev');
				me.showOrHideControl('next');
				e.preventDefault();
			});
		});
	},
	hasNext: function(currentElement)
	{
		return 0 != currentElement.next().length ? true : false;
	},
	hasPrev: function(currentElement)
	{
		return 0 != currentElement.prev().length ? true : false;
	},
	showOrHideControl: function(item)
	{
		switch (item)
		{
		  case "prev":
			  if (this.hasPrev(this.activeTrigger.parent()))
			  {
				  this.prevImageControl.removeClass('hidden');  
			  } else {
				  this.prevImageControl.addClass('hidden');
			  }
		  break;
		  case "next":
			  if (this.hasNext(this.activeTrigger.parent()))
			  {
				  this.nextImageControl.removeClass('hidden');  
			  } else {
				  this.nextImageControl.addClass('hidden');  
			  }
		  break;
		}
	}
});

