// 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 = '#content,article:first,.article:first,.post:first',
			$content = $(contentSelector).filter(':first'),
			contentNode = $content.get(0),
			$menu = $('.menu-main-menu-container ul li.menu-colorbox a, ul.sub-menu a').filter(':first'),
			activeClass = 'active selected current youarehere',
			activeSelector = '.active,.selected,.current,.youarehere',
			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)([\s\>])/gi,'<div class="document-$1"$2')
				.replace(/<\/(html|head|body|title|meta|script)\>/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;
				
				// Stop if not a page
				if ($this.parent().hasClass("no-open")) { 
					event.preventDefault();
					return false; 
				}
				// 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');

			// 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);
			
			// Break Out?
			
			// Ajax Request the Traditional Page
			// colorbox?
			if(url != (rootUrl)) {
				$.colorbox({ 
					width: '860px',
					height: '500px',
					maxWidth: '860px',
					maxHeight: '500px',
					innerWidth: '860px',
					innerHeight: '500px',
					initialWidth: '816px',
					initialHeight: '416px',
					opacity: 0.6,
					top: '105px',
					onComplete: function() {var settings = {showArrows: true};$('#cboxLoadedContent').jScrollPane(settings);},
					onClosed: function() { History.pushState(null, "TCB Group", "http://www.tcbgroup.co.uk/"); },
					onLoad: function() {
					
						$.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;
								
								// Fetch the scripts
								$scripts = $dataContent.find('.document-script');
								if ( $scripts.length ) {
									$scripts.detach();
								}
			
								// Fetch the content
								contentHtml = $dataContent.html()||$data.html();
								if ( !contentHtml && url != (rootUrl) ) {
									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 the content
								// $content.stop(true,true);
								// $content.html(contentHtml).ajaxify().css('opacity',100).show(); /* you could fade in here if you'd like */
								
								$.colorbox({ 
									width: '860px',
									height: '500px',
									maxWidth: '860px',
									maxHeight: '500px',
									innerWidth: '860px',
									innerHeight: '500px',
									initialWidth: '816px',
									initialHeight: '416px',
									opacity: 0.6,
									top: '105px',
									onComplete: function() {var settings = {showArrows: true};$('#cboxLoadedContent').jScrollPane(settings);},
									onClosed: function() { History.pushState(null, "TCB Group", "http://www.tcbgroup.co.uk/"); },
									html: contentHtml 
								});
									
			
								// 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);
								});
								
							},
							error: function(jqXHR, textStatus, errorThrown){
								document.location.href = url;
								return false;
							}

						}); // end ajax
						
					}
					
				}); // end colorbox
				
			}; // end if

		}); // end onStateChange

	}); // end onDomLoad

})(window); // end closure



