(function(window,undefined){

	// Prepare our Variables
	var
		History = window.History,
		$ = window.jQuery,
		document = window.document;

	// Check to see if History.js is enabled for our Browser
	if ( !History.enabled ) {return false;}

	// Wait for Document
	$(function(){
		// Prepare Variables
		var
			/* Application Specific Variables */
			contentSelector = '#content',
			$content = $(contentSelector).filter(':first'),
			contentNode = $content.get(0),
			$menu = $('.menu').filter(':first'),
			activeClass = 'navLevel1Active',
			activeSubNavClass = 'navLevel2Active',
			activeSelector = '.navLevel1Active',
			activeSubNavSelector = '.navLevel2Active',
			menuChildrenSelector = '> li a,> ul > li a',
			subMenuChildrenSelector = '> li > ul > li > a',
			/* Application Generic Variables */
			$body = $(document.body),
			rootUrl = History.getRootUrl(),
			absoluteUrl = HTTPLANG;

		// Ensure Content
		if ( $content.length === 0 ) {$content = $body;}

		// Ajaxify Helper
		$.fn.ajaxify = function(){
			// Prepare
			var $this = $(this);

			// Ajaxify all proper links
			$this.find('a.ajaxy').click(function(event){
				// Prepare
				var
					$this = $(this),
					url = $this.attr('href'),
					title = $this.attr('title')||null;

				// Continue as normal for cmd clicks etc
				if ( event.which == 2 || event.metaKey ) { return true; }

				// Ajaxify this link
				History.pushState(null,title,url);
				event.preventDefault();
				return false;
			});

			// Chain
			return $this;
		};

		// Ajaxify our Internal Links
		$body.ajaxify();

		// Hook into State Changes
		$(window).bind('statechange',function(){
			// Prepare Variables
			var
				State = History.getState(),
				url = State.url,
				relativeUrl = url.replace(rootUrl,'');
				absoluteCleanUrl = url.replace(absoluteUrl,'');

			// Set Loading
			$body.addClass('loading');

			// Start Fade Out
			// Animating to opacity to 0 still keeps the element's height intact
			// Which prevents that annoying pop bang issue when loading in new content
            $content.animate({opacity:0},800);

            //Stop StartseitenSlideshow
			presentationCycle.stop();

			// Ajax Request the Traditional Page
			$.ajax({
			    type: "GET",
				url: url,
				dataType: "json",
				success: function(data, textStatus, jqXHR){

					// Prepare Vars
					var $dataContent = data.content;
					var $dataTitle = data.title;
					var	$menuChildren;
					var contentHtml;


					// Fetch the content and redirect if non proper Content is returned
					contentHtml = $dataContent;
					if ( !contentHtml ) {
						document.location.href = url;
						return false;
					}

					// Update the title
                    if ( $dataTitle ) document.title = $dataTitle;


					// Update the Mainmenu
					$menuChildren = $menu.find(menuChildrenSelector);
					$menuChildren.filter(activeSelector).removeClass(activeClass);
					var checkUrlArray = absoluteCleanUrl.split( '/' );
                    var checkUrl = absoluteUrl+checkUrlArray[0]+'/';
					$menuChildren = $menuChildren.filter("[href^='"+checkUrl+"']");
					if ( $menuChildren.length === 1 ) { $menuChildren.addClass(activeClass); }

					// Update the Submenu
                    $subMenuChildren = $menu.find(subMenuChildrenSelector);
                    $subMenuChildren.filter(activeSubNavSelector).removeClass(activeSubNavClass);
                    var checkSubUrlArray = absoluteCleanUrl.split( '/' );
                    var checkSubUrl = absoluteUrl+checkSubUrlArray[0]+'/'+checkSubUrlArray[1]+'/';
                    $subMenuChildren = $subMenuChildren.filter("[href^='"+checkSubUrl+"']");
                    if ( $subMenuChildren.length === 1 ) { $subMenuChildren.addClass(activeSubNavClass); }


					// Update the content
					$content.stop(true,true);
					$content.html(contentHtml).ajaxify().animate({opacity:1},800);

	                //HIDE ALL THAT SHOULD BE HIDDEN
                    $(".hidden").hide();

					$body.removeClass('loading');

					// Inform Google Analytics of the change
					try {
                        var pageTracker = _gat._getTracker("UA-1737729-2");
                        pageTracker._trackPageview(relativeUrl);
                    } catch(err) {}

				},
				error: function(jqXHR, textStatus, errorThrown){
					document.location.href = url;
					return false;
				}
			}); // end ajax

		}); // end onStateChange

	}); // end onDomLoad

})(window); // end closure
