
/*
 * implement persistent state manager utilizing local storage or cookies as fallback
 */

var stateManager = (new function()
{
	var that = this;

	this.state = { ok : 1, offset : 0 };

	this.read = function()
	{
		var strState = window.localStorage ? window.localStorage.getItem("gsap.de-state") : Cookie.read("gsap.de-state");
		if ( strState )
		{
			var objState = JSON.decode( strState );
			if ( objState && objState.ok )
				that.state = objState;
		}
	};

	window.addEvent("unload",function()
	{
		var state = Object.append( Object.clone( that.state ), { ok : 1 } );
		state = JSON.encode( state );

		if ( window.localStorage )
			window.localStorage.setItem("gsap.de-state",state)
		else
			Cookie.write("gsap.de-state",state);
	});

	this.read();
});



/*
 * animate night sky in background
 */

// prevent flickering by instantly processing previous state of animation
var bgOffset = stateManager.state.offset;
if ( bgOffset )
	document.write( '<style type="text/css">body{background-position:' + bgOffset + 'px ' + bgOffset + 'px;}</style>' );

// implement animator for sky background
window.addEvent("domready",function(){
	if ( !Browser.Platform.ios && !Browser.Platform.android && !Browser.Platform.webos && !Browser.ie && ( !Browser.firefox || Browser.version >= 7 ) )
		var bgAnimator = (new function(){
				var bodyStyle = $$("body")[0].style;
				var state = stateManager.state;
	
				window.addEvent("load",function(){
					window.setInterval( function(){
						var sOffset = String( state.offset-- );
						bodyStyle.backgroundPosition = sOffset + "px " + sOffset + "px";
					}, 50 );
				});
			});
});


/*
 * manage tall pages
 */

window.addEvent("domready",function()
{
	var scrollManager = (new function()
	{
		var domView = $$("body")[0];
		var domBG   = $("wrapper");

		var onscroll = function()
		{
			var scroll = domView.getScroll();
			if ( scroll.y > 200 )
				domBG.setStyles({"background-attachment":"fixed","background-position":"center -200px"});
			else
				domBG.setStyles({"background-attachment":"scroll","background-position":"center 0"});
		};

		window.addEvent("scroll",onscroll);
		window.addEvent("load",onscroll);
	});
});


/*
 * have completely clickable teaser areas on homepage
 */

window.addEvent("domready",function()
{
	$$(".article-teaser > div").each( function( e )
	{
		var link = e.getChildren("a").getLast();

		e.addEvents( {
			click : function()
					{
						location.href = link.get( "href" );
			
						return false;
					},
			mouseenter : function() { $(this).addClass( "hover" ); },
			mouseleave : function() { $(this).removeClass( "hover" ); }
			} );

		link.setStyle("display","none");
		e.set( "title", link.get( "title" ) );
	});
});


/*
 * convert sidebar news list into ticker ribbon
 */

window.addEvent("domready",function()
{
	var domNewsList = $$("#right .mod_newslist").pick();
	if ( domNewsList )
	{
		var arrNewsItems = domNewsList.getChildren("div");
		if ( arrNewsItems.length )
		{
			// hide existing news list on site
			domNewsList.hide();
			domNewsList.getPrevious("h2").hide();

			var domTicker, domTickerRibbon, domFirstItem, intFirstItemOffset = 0;

			var ticker = (function( intDelayMS, domContainer, arrItems )
			{
				if ( !( arrItems instanceof Array ) || ( arrItems.length <= 0 ) )
					return null;


				var isVisible = true;

				var showTicker = function( blnVisible )
				{
					domTicker.setStyle("visibility",blnVisible?"visible":"hidden");
					isVisible = blnVisible;
				}

				/*
				 * creates ticker DOM
				 */

				var createTicker = function()
				{
					// create ticker container ...
					domTicker = new Element( "div", { 
										"class" : "ticker", 
										styles : { 
												overflow : "hidden", 
												position : "relative"
												}
										} );

					// ... containing single ribbon of items ...
					domTickerRibbon = new Element( "div", { styles : { position : "relative", "white-space" : "nowrap" } } ).inject( domTicker );

					// ... and populate the latter with all provided items
					domTickerRibbon.adopt.call( domTickerRibbon, arrItems.map( function( objItem )
							{
								var domText = new Element( objItem.link ? "a" : "span" )
													.adopt(
														new Element( "strong", {text : objItem.title + ( objItem.message.length > 0 ? ": " : "" )} ),
														new Element( "span", {text : objItem.message} )
														);
			
								if ( objItem.link )
									// clickable item requires click target
									domText.set( "href", objItem.link );
			
								var domItem = new Element( "span", {styles : {"white-space" : "nowrap", display: "inline", position: "relative", overflow: "hidden" }} )
													.adopt(
														new Element( "label", {text : "+++"} ), domText
														);
			
								return domItem;
							}) );


					// finally add ticker to requested container on page
					$$(domContainer).grab( domTicker, "top" );

					// measure dimensions of ticker
					domTicker.width  = domTicker.measure( function() {return this.getWidth();} );
					domTicker.height = domTickerRibbon.measure( function() {return this.getSize().y;} );
				};

				/*
				 * caches width of every item in item
				 */

				var getItemWidths = function()
				{
					var measure = isVisible ? function(n) { n.width = n.getSize().x; } 
											: function(n) { n.width = n.measure( function() { return this.getCoordinates().width; } ); };

					domTickerRibbon.getChildren().each( measure );
				};

				/*
				 * moves first item of ribbon to end of ribbon
				 */

				var wrapAroundItem = function( domFirst )
				{
					if ( !domFirst )
						domFirst = domTickerRibbon.getFirst();

					domFirst.dispose().inject( domTickerRibbon, "bottom" );

					return domTickerRibbon.getFirst();
				};

				/*
				 * appends clones of all provided ribbon items to ribbon
				 */			

				var multiplyItems = function( items )
				{
					items.each( function( n )
					{
						// get clone of next available item
						var cloned = n.clone();

						// copy any previously cached item width
						cloned.width = n.width;

						// append cloned item to end of ribbon
						cloned.inject( domTickerRibbon );
					} );
				};
				
				var resetState = function()
				{
					// cache reference on DOM of currently first ticker item
					domFirstItem = domTickerRibbon.getFirst();

					// initialize ribbon so first item is out of view to the right
					domTickerRibbon.itemOffset = domTicker.width;
					domTickerRibbon.setStyle( "left", domTickerRibbon.itemOffset + "px" );

					resetState = function(){};
				};

				var restoreState = function()
				{
					if ( "first" in stateManager.state )
					{
						intFirstItemOffset = stateManager.state.first;
	
						if ( !stateManager.state.first )
							domFirstItem = domTickerRibbon.getFirst();
						else
							while ( stateManager.state.first-- > 0 )
								domFirstItem = wrapAroundItem();

						domTickerRibbon.itemOffset = stateManager.state.shift;
						domTickerRibbon.setStyle( "left", stateManager.state.shift );
					}

					restoreState = function(){};
				};

				var tryWrapAround = function()
				{
					if ( domTickerRibbon.itemOffset + domFirstItem.width <= 0 )
					{
						// move first item to end of ribbon
						domTickerRibbon.itemOffset += domFirstItem.width;

						domFirstItem = wrapAroundItem( domFirstItem );

						intFirstItemOffset++;

						return true;
					}

					return false;
				}

				var step = function()
				{
					domTickerRibbon.itemOffset -= 2;

					tryWrapAround();

					domTickerRibbon.style.left = domTickerRibbon.itemOffset + "px";

					stateManager.state.first = intFirstItemOffset;
					stateManager.state.shift = domTickerRibbon.itemOffset;
				};

				var getMetrics = function( items )
				{
					var result = { longest : null, shortest : null, fullWidth : 0 };

					items.each( function( n ) {
						result.fullWidth += n.width;
						if ( !result.shortest || n.width < result.shortest.width ) result.shortest = n; 
						if ( !result.longest  || n.width > result.longest.width  ) result.longest  = n; 
					} );
					
					return result;
				};
				
				var getCombinedWidth = function( item )
				{
					var width = item.width;

					if ( item.previousSibling )
						width += item.previousSibling.width;

					if ( item.nextSibling )
						width += item.nextSibling.width;

					return width;
				};

				var start = function()
				{
					showTicker( true );

					getItemWidths();

					var items = domTickerRibbon.getChildren();

					// extend ticker by repeating items so ribbon is always 
					// completely covered by ticker items
					var tailWidth = 0;
					for ( var i = items.length - 1; i >= 0; i-- )
					{
						tailWidth += items[i].width;
						if ( tailWidth > domTicker.width )
						{
							tailWidth -= items[i].width;
							break;
						}
					}

					if ( tailWidth < domTicker.width )
					{
						// there is a tail not covering full ribbon width
						// --> extend ticker
						var metrics = getMetrics( items );
						var factor = Math.ceil( ( domTicker.width - tailWidth ) / metrics.fullWidth );
						if ( metrics.fullWidth < domTicker.width )
							factor++;

						for ( ; factor > 0; factor-- )
							multiplyItems( items );
					}

					// fix initial dislocations
					while ( tryWrapAround() );

					// start ticker
					var objTickerTimer = window.setInterval( step, intDelayMS );
				};



				createTicker();

				showTicker(false);

				resetState();
				restoreState();


//				window.setTimeout( start, 50 );

				window.addEvent( "load", function()
				{
					start();
				} );
			});

			window.ticker = new ticker( 55, "#container", arrNewsItems.map( function( domItem )
			{
				return {
						title   : domItem.getElement("h2").get("text"),
						message : domItem.getElements(".teaser").get("text").pick(),
						link    : domItem.getElements(".more a").get("href").pick()
						};
			}) );
		}
	}
});


/*
 * convert selected sidebar lists into popups providing extended information
 */

window.addEvent("domready",function()
{
	var domTrigger = $$("#right section.mod_calendar"); 
	var domEventLister = $$("#right section.mod_eventlist");

	
	var popoverController = (function( domContent, domTrigger, domPosition, intDelay, boolBottom )
	{
		if ( domContent && domTrigger )
		{
			var domRange = domPosition ? domTrigger.getElement( domPosition ) : domTrigger;
			var pos = domRange.getPosition( domTrigger );
			var size = domRange.getSize();

			if ( domContent == domTrigger )
				domContent = domTrigger.clone().inject( domTrigger );

			domContent = new Element("div")
								.wraps( domContent )
								.dispose()
								.set("tween",{duration:0})
								.fade("out")
								.set("class","popover")
								.inject( domTrigger );
	
			window.addEvent( "load", function()
			{
				var sizeContent = domContent.getSize();

				domContent
					.set("tween",{duration:(intDelay?intDelay:250)})
					.setStyles({
						position: "absolute",
						left: pos.x - sizeContent.x,
						top: boolBottom ? pos.y + size.y - sizeContent.y : pos.y 
					});
	
				var domBackground = $("main");
	
				domTrigger.addEvent( "mouseenter", function() { domBackground.fade(0.3); domContent.fade("in"); } );
				domTrigger.addEvent( "mouseleave", function() { domBackground.fade(1); domContent.fade("out"); } );
			});
		}
	});

	var eventsPopover = new popoverController( $$("#right section.mod_eventlist")[0], $$("#right section.mod_calendar")[0] );
	if ( $$("#right .mod_cataloglist div.item").length > 0 )
		var lunchPopover  = new popoverController( $$("#right .mod_cataloglist")[0], $$("#right .mod_cataloglist")[0], false, 250, true );
});



/*
 * ensure all tables' rows have proper classes for styling odd and even rows differently
 */

window.addEvent("domready",function()
{
	$$("#main table").each( function( domTable )
	{
		domTable.getElements( "tbody tr" ).each( function( domRow, index ) {
			domRow.addClass( index & 1 ? "odd" : "even" );
		});
	});
});



/*
 * have partner logo slide show in header
 */

window.addEvent("domready",function()
{
	var domView = $$("#partner-logos");
	if ( domView && domView.length )
	{
		domView = domView[0];

		var domFader = new Element( "div", { "class" : "slider-bg" } ).inject( domView );

		var domSlides = domView.getChildren("section.ce_image");

		if ( domSlides && domSlides.length && domSlides.length > 0 )
		{
			function SlideShow( intStepDelay )
			{
				var self = this;

				// insert ribbon layer in DOM for proper slide show movements
				var domRibbon = new Element( "div", { "class": "ribbon" } ).adopt( domSlides ).inject( domView );

				domRibbon.set( "tween", { duration: 1000, transition: "sine" });

				// create initial state
				var objState = {
							blnForward : true,
							intCurrent : 0
							};

				var intCount = domSlides.length;

				// optionally overload initial state by restored previous state
				var strState = Cookie.read( "gsapSlides" );
				if ( strState && strState.length )
				{
					objState = JSON.decode( strState );
				}

				objState.intCurrent = Math.min( objState.intCurrent, intCount - 1 );


				var updateFader = function()
				{
					if ( domSlides[objState.intCurrent].getElement( "a" ) )
						domFader.addClass( "clickable" );
					else
						domFader.removeClass( "clickable" );
				};

				this.step = function()
				{
					if ( domSlides.length <= 1 )
						return;

					// detect and of ribbon situations
					if ( objState.blnForward && ( objState.intCurrent >= intCount - 1 ) )
						objState.blnForward = false;
					else if ( !objState.blnForward && ( objState.intCurrent <= 0 ) )
						objState.blnForward = true;

					objState.intCurrent += objState.blnForward ? 1 : -1;

					// move ribbon to show next slide
					domRibbon.tween("left",String( objState.intCurrent * -domView.size.width ) + "px");

					updateFader();
				};

				this.prepare = function()
				{
					// get size of slideshow view
					domView.size = domView.getCoordinates();

					// move ribbon to show recently visible slide again
					domRibbon.setStyles({
						left: String(objState.intCurrent * -domView.size.width)+"px",
						width: String(intCount * domView.size.width)+"px",
						position: "absolute"
					});

					// make all slide perfectly fit in view with content centered
					domSlides.each( function( domSlide )
					{
						var domImage = domSlide.getElement("img");
						var sizeImage = domImage.measure( function() { return this.getCoordinates(); } );

						domSlide.setStyles({
							"float": "left",
							position: "relative",
							overflow: "hidden",
							width: domView.size.width+"px",
							height: domView.size.height+"px"
						});
						domImage.setStyles({
							position: "absolute",
							left: String( (domView.size.width-sizeImage.width)/2 )+"px",
							top: String( (domView.size.height-sizeImage.height)/2 )+"px"
						});
					});
				};

				this.start = function()
				{
					self.prepare();

					domRibbon.show();
					updateFader();

					window.setInterval( self.step, intStepDelay );
				};

				domRibbon.hide();

				window.addEvent( "load", this.start );
				window.addEvent( "unload", function() { Cookie.write( "gsapSlides", JSON.encode( objState ) ); } );


				domFader.addEvent( "click", function() 
				{
					var anchor = domSlides[objState.intCurrent].getElement("a");
					if ( anchor && anchor.href )
						location.href = anchor.href; 
				} );
			}

			var slider = new SlideShow( 5000 );
		}
	}
});


/**
 * fix occurrences of date/time information
 */

window.addEvent("domready",function()
{
	return;
	var preg = /^(\d\d\d\d)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)[+-]\d\d:\d\d$/i;

	$$("time").each( function( e )
	{
		var elem = $(e);
		var date = elem.get("datetime");
		if ( preg.exec( date ) )
		{
			date = new Date( RegExp.$1, RegExp.$2, RegExp.$3, RegExp.$4, RegExp.$5, RegExp.$6 );
			elem.set("text",elem.getParents(".mod_newslist,.mod_newsreader").length>0?date.toLocaleDateString():date.toLocaleString());
		}
	});
});


/**
 * fix missing highlights on trail-menu elements without submenu
 */

window.addEvent("domready",function()
{
	$$(".mod_navigation li.trail").each( function( e )
	{
		var elem = $(e);
		if ( elem.getElements("ul").length == 0 )
			elem.addClass("no-active");
		else if ( elem.getElements("ul > li.trail, ul > li.active, ul.no-active").length == 0 )
		{
			elem.getElement('a').addClass("no-active");
			elem.getParents(".no-active").addClass("invisible");
		}
	});
});


