// https://gist.github.com/854622
(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 = 'div.two article',
			$content = $(contentSelector).filter(':first'),
			contentNode = $content.get(0),
			$menu = $('#footernav,#mainnnav,#sidenav,nav').filter(':first'),
			activeClass = 'active',
			activeSelector = '.active',
			menuChildrenSelector = '> li, ul > li',
			/* Application Generic Variables */
			$body = $(document.body),
			rootUrl = History.getRootUrl(),
			scrollOptions = {
				duration: 800,
				easing:'swing'
			};
		
		// Ensure Content
		if ( $content.length === 0 ) {
			$content = $body;
		}
		
		// Internal Helper
		$.expr[':'].internal = function(obj, index, meta, stack){
			// Prepare
			var
				$this = $(obj),
				url = $this.attr('href')||'',
				isInternalLink;
			
			// Check link
			isInternalLink = url.substring(0,rootUrl.length) === rootUrl || url.indexOf(':') === -1;
			
			// Ignore or Keep
			return isInternalLink;
		};
		
		// HTML Helper
		var documentHtml = function(html){
			// Prepare
			var result = String(html)
				.replace(/<\!DOCTYPE[^>]*>/i, '')
				.replace(/<(html|head|body|title|meta|script|link)([\s\>])/gi,'<div class="document-$1"$2')
				.replace(/<\/(html|head|body|title|meta|script|link)\>/gi,'</div>')
			;
			
			// Return
			return result;
		};
		
		// Ajaxify Helper
		$.fn.ajaxify = function(){
			// Prepare
			var $this = $(this);
			
			// Ajaxify
			$this.find('a:internal:not(.no-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,'');

			// Set Loading
			$body.addClass('loading');
			$.blockUI({ message: '<img src="img/ajax-loader.gif" style="margin:34px;"/>', css: { backgroundColor: '#FFFFFF', color: '#7d7d7d', border: 'none', opacity: .2, borderRadius: '6px', width:'100px', height: '100px', left: ($(window).width() - 100) /2 + 'px', top:  ($(window).height() - 100) /2 + 'px' } });


			// 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);
			
			// Ajax Request the Traditional Page
			$.ajax({
				url: url,
				success: function(data, textStatus, jqXHR){
					// Prepare
					var
						$data = $(documentHtml(data)),
						$dataBody = $data.find('.document-body:first'),
						$dataContent = $dataBody.find(contentSelector).filter(':first'),
						$menuChildren, contentHtml, $scripts;
						
					console.log(documentHtml(data));	
					
					// Fetch the scripts
					$scripts = $dataContent.find('.document-script');
					if ( $scripts.length ) {
						$scripts.detach();
					}

					// Fetch the canonical-Link
					$linkscanonExists = 0;
					$linkscanon = $data.find('[rel=canonical]');
					if ( $linkscanon.length ) {
						$linkscanon.detach();
						$linkscanonExists = 1;
					}
console.log($linkscanon.attr("href"));


					// Fetch the content
					contentHtml = $dataContent.html()||$data.html();
					if ( !contentHtml ) {
						document.location.href = url;
						
						return false;
					}

					// Update the menu
					
					$menuChildren = $menu.find(menuChildrenSelector);
					$menuChildren.filter(activeSelector).removeClass(activeClass);
					$menuChildren = $menuChildren.has('a[href^="'+relativeUrl+'"],a[href^="/'+relativeUrl+'"],a[href^="'+url+'"]');
					if ( $menuChildren.length >= 1 ) { $menuChildren.addClass(activeClass); }

					//Update SuperBGImage
					
					$newImage = $data.find('#superbgimage > img').attr('src');
					
					$body.find('#superbgimage').fadeOut(100, function() {
						$('<img />')
							.attr('src', $newImage)
							.load(function(){
								$body.find('#superbgimage > img').attr('src', $newImage);
								$body.find('#superbgimage').fadeIn(150);
							});
					});

					// Update the content
					
					$content.stop(true,true);
					$content.html(contentHtml).ajaxify().delay(200).animate({opacity:1},800); // you could fade in here if you'd like
					$.unblockUI();
					$("a[rel^='lightbox']").slimbox({ counterText: 'Bild {x} von {y}' });



					// Update the title
					document.title = $data.find('.document-title:first').text();
					try {
						document.getElementsByTagName('title')[0].innerHTML = document.title.replace('<','&lt;').replace('>','&gt;').replace(' & ',' &amp; ');
					}
					catch ( Exception ) { }
					
					// Add the scripts
					$scripts.each(function(){
						var $script = $(this), scriptText = $script.html(), scriptNode = document.createElement('script');
						scriptNode.appendChild(document.createTextNode(scriptText));
						contentNode.appendChild(scriptNode);
					});

					// Add the canonical
/*					$linkscanon.each(function(){
						var $linkcanon = $(this), linkcanonText = $linkcanon.html(), linkcanonNode = document.createElement('link');
						linkcanonNode.appendChild(document.createTextNode(linkcanonText));
						contentNode.appendChild(linkcanonNode);
					});*/
					if ($linkscanonExists == 1) {
						$('head').prepend('<link href="http://www.stsgmbh.com/" rel="canonical">');	
					} else {
						$('head').find('link[rel=canonical]').detach();	
					}

					// Complete the change
					if ( $body.ScrollTo||false ) { $body.ScrollTo(scrollOptions); } // http://balupton.com/projects/jquery-scrollto
					$body.removeClass('loading');
	
					// Inform Google Analytics of the change
					if ( typeof window.pageTracker !== 'undefined' ) {
						window.pageTracker._trackPageview(relativeUrl);
					}

					// Inform ReInvigorate of a state change
					if ( typeof window.reinvigorate !== 'undefined' && typeof window.reinvigorate.ajax_track !== 'undefined' ) {
						reinvigorate.ajax_track(url);
						// ^ we use the full url here as that is what reinvigorate supports
					}
				},
				error: function(jqXHR, textStatus, errorThrown){
					document.location.href = url;
					return false;
				}
			}); // end ajax

		}); // end onStateChange

	}); // end onDomLoad

})(window); // end closure
