/* _________ HASH CHANGE _____________ */

/**
 *  jQuery.observeHashChange (Version: 1.0)
 *  http://finnlabs.github.com/jquery.observehashchange/
 *  Copyright (c) 2009, Gregor Schmidt, Finn GmbH
 *
 **/
(function($){$.fn.hashchange=function(fn){$(window).bind("jQuery.hashchange",fn);return this;};$.observeHashChange=function(options){var opts=$.extend({},$.observeHashChange.defaults,options);if(isHashChangeEventSupported()){nativeVersion();}
else{setIntervalVersion(opts);}};var locationHash=null;var functionStore=null;var interval=0;$.observeHashChange.defaults={interval:500};function isHashChangeEventSupported(){return typeof window.onhashchange!=='undefined';}
function nativeVersion(){locationHash=document.location.hash;window.onhashchange=onhashchangeHandler;}
function onhashchangeHandler(e,data){var oldHash=locationHash;locationHash=document.location.hash;$(window).trigger("jQuery.hashchange",{before:oldHash,after:locationHash});}
function setIntervalVersion(opts){if(locationHash==null){locationHash=document.location.hash;}
if(functionStore!=null){clearInterval(functionStore);}
if(interval!=opts.interval){functionStore=setInterval(checkLocationHash,opts.interval);interval=opts.interval;}}
function checkLocationHash(){if(locationHash!=document.location.hash){var oldHash=locationHash;locationHash=document.location.hash;$(window).trigger("jQuery.hashchange",{before:oldHash,after:locationHash});}}
$.observeHashChange();})(jQuery);




/* _________ FRAMEWORK _____________ */


var scrollOnLoad = "";

$(document).ready(function(){
	init();
	noFetch = 0;
	newHash = "";
});
function init() {
	$(document).ajaxError(function(e, xhr, settings, exception) {
		if (cType == 0) {
			setLinks();
			$('#loader').css('display', 'none');
			$('#err').css('display', 'block');
			noFetch = 0; // restore hashchange event listener for back/forward button clicks
		} else if (cType == 1) {
			// no css
			getJS(pageName);
		} else if (cType == 2) {
			// no js
			showPage();
		}
	});

	/* first page load */
	if (window.location.hash) {
		// on page reload, redirect to the page

		var lnk = window.location.hash.substr(1);
		var args = "";
		var qmark = lnk.indexOf('?');
		if (qmark != -1) {
			args = lnk.substr(qmark + 1);
			lnk = lnk.substr(0, qmark);
		}

		window.location = lnk + "?" + args;

	} else {
		// home page
		setLinks();
		$('#loader').css('display', 'none');
		// fetchPage('index');
	}
}
// 2 methods to fetch page are used b/c changing on click is a little faster than the (possible) setInterval poller in hashchange
jQuery(function($) {
	function updateHash() {

		if (!noFetch && window.location.hash != $('#hash').text()) { // hash does not match current page

			if (window.location.hash == "") {
				var lnk = window.location.href.substr(baseURL.length - 1);
			} else {
				var lnk = window.location.hash.substr(1);
			}
			var args = "";
			var qmark = lnk.indexOf('?');
			if (qmark != -1) {
				args = lnk.substr(qmark + 1);
				lnk = lnk.substr(0, qmark);
			}
			newHash = '#' + lnk + '?' + args;

			if ($('#hash').text() != newHash) {
				fetchPage(lnk, args);
			}
		}

	};
	$(window).hashchange(updateHash);
	updateHash();
});
function showPage() {
	$('#loader').css('display', 'none');
	$('#content').css('visibility', 'visible');

	setLinks();
	noFetch = 0; // restore hashchange event listener for back/forward button clicks
}
function fetchPage($page, $args) {

	cType = 0;
	pageName = $page;

	$('#hash').text(newHash); // identify the page, stops hashchange from firing
	window.location.hash = newHash;

	clearPage();

	pageURL = $page + $args;
	var ext = "?_p=1&" + $args ; // _p=1 is partial load
	unsetLinks();

	try {
		_gaq.push(['_trackPageview', pageURL]);
	} catch (err) { ; }

	$('#err').css('display', 'none');
	$('#loader').css('display', 'block');
	$('#content').css('visibility', 'hidden'); // hide then show after js loaded so we don't see unstyled HTML on page

	$.get($page + ext, function(data) {
		// fetch HTML - model

		pageData = data;
		$('#content').html(pageData);

		document.title = $('#title').text();
		$('#m_title').attr('content', $('#title').text());
		$('#m_url').attr('content', baseURL + "/" + pageURL);

		var cssArraySize = 0;
		var cssArray = $('#css').text().split(',');
		if ($('#css').text().length > 0)
			cssArraySize = cssArray.length;
		var cssShownSize = 0;
		var css = "";

		var jsArraySize = 0;
		var jsArray = $('#js').text().split(',');
		if ($('#js').text().length > 0)
			jsArraySize = jsArray.length;

		cType = 1;
		if (cssArraySize)
			for (styleName in cssArray) {

				var myStylesLocation = '/' + cssArray[styleName] + '.css';
				$.get(myStylesLocation, function(data)
				{
					// fetch CSS - view
					css += data + "\n";

					if (++cssShownSize == cssArraySize) {
						$("#pageStyle").html('<style type="text/css">' + css + '</style>');
						css = "";
						cType = 2;
						if (jsArraySize)
							getJS(jsArray, jsArraySize);
						else
							showPage();
					}
				});
			}
		else {
			if (jsArraySize)
				getJS(jsArray);
			else
				showPage();
		}
	});
}
function getJS($js, $jsArraySize) {

	var jsShownSize = 0;
	for (jsName in $js) {

		var jsLocation = '/js/' + $js[jsName] + '.js';
		$.getScript(jsLocation, function() {

			if (++jsShownSize == $jsArraySize)
				showPage();
		});
	}

}
function setLinks() {
	$('.lnk').click(function(event){
		noFetch = 1; // do not allow hashchange event to trigger this page fetch b/c it was a click
		event.preventDefault();
		var lnk = $(this).attr('href');
		var args = "";
		var qmark = lnk.indexOf('?');
		if (qmark != -1) {
			args = lnk.substr(qmark + 1);
			lnk = lnk.substr(0, qmark);
		}
		newHash = '#' + lnk + '?' + args;

		if ( $('#hash').text() != newHash )
			fetchPage(lnk, args);
	});
	$('.trk').click(function(event){
		try {
			_gaq.push(['_trackPageview', $(this).attr('href')]);
		} catch (err) { ; }
	});
}
function unsetLinks() {
	$('.lnk').unbind();
	$('.trk').unbind();
}
function clearPage() {
	$('.stylesheet').remove(); // link tag CSS
	$('#pageCSS').remove(); // in-page CSS
	$('#content').html('');
	$("#pageStyle").html('');
}
