/**
* jQuery hashchange 1.0.0
* 
* (based on jquery.history)
*
* Copyright (c) 2008 Chris Leishman (chrisleishman.com)
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*/
(function($) {

$.fn.extend({
	hashchange: function(callback) { this.bind('hashchange', callback) },
	openOnClick: function(href) {
		if (href === undefined || href.length == 0)
			href = '#';
		return this.click(function(ev) {
			if (href && href.charAt(0) == '#') {
				// execute load in separate call stack
				window.setTimeout(function() { $.locationHash(href) }, 0);
			} else {
				window.location(href);
			}
			ev.stopPropagation();
			return false;
		});
	}
});

// IE 8 introduces the hashchange event natively - so nothing more to do
if ($.browser.msie && document.documentMode && document.documentMode >= 8) {
	$.extend({
		locationHash: function(hash) {
			if (!hash) hash = '#';
			else if (hash.charAt(0) != '#') hash = '#' + hash;
			location.hash = hash;
		}
	});
	return;
}

var curHash;
// hidden iframe for IE (earlier than 8)
var iframe;

$.extend({
	locationHash: function(hash) {
		if (curHash === undefined) return;

		if (!hash) hash = '#';
		else if (hash.charAt(0) != '#') hash = '#' + hash;
		
		location.hash = hash;
		
		if (curHash == hash) return;
		curHash = hash;
		
		if ($.browser.msie) updateIEFrame(hash);
		$.event.trigger('hashchange');
	}
});

$(document).ready(function() {
	curHash = location.hash;
	if ($.browser.msie) {
		// stop the callback firing twice during init if no hash present
		if (curHash == '') curHash = '#';
		// add hidden iframe for IE
		iframe = $('<iframe />').hide().get(0);
		$('body').prepend(iframe);
		updateIEFrame(location.hash);
		setInterval(checkHashIE, 100);
	} else {
		setInterval(checkHash, 100);
	}
});
$(window).unload(function() { iframe = null });

function checkHash() {
	var hash = location.hash;
	if (hash != curHash) {
		curHash = hash;
		$.event.trigger('hashchange');
	}
}

if ($.browser.msie) {
	// Attach a live handler for any anchor links
	$('a[href^=#]').live('click', function() {
		var hash = $(this).attr('href');
		// Don't intercept the click if there is an existing anchor on the page
		// that matches this hash
		if ($(hash).length == 0 && $('a[name='+hash.slice(1)+']').length == 0) {
			$.locationHash(hash);
			return false;
		}
	});
}

function checkHashIE() {
	// On IE, check for location.hash of iframe
	var idoc = iframe.contentDocument || iframe.contentWindow.document;
	var hash = idoc.location.hash;
	if (hash == '') hash = '#';

	if (hash != curHash) {
		if (location.hash != hash) location.hash = hash;
		curHash = hash;
		$.event.trigger('hashchange');
	}
}

function updateIEFrame(hash) {
	if (hash == '#') hash = '';
	var idoc = iframe.contentWindow.document;
	idoc.open();
	idoc.close();
	if (idoc.location.hash != hash) idoc.location.hash = hash;
}

})(jQuery);

