jxson
3/18/2011 - 5:50 PM

From: http://www.20thingsilearned.com/js/twentythings.history.js

/**
 * The history class is in charge of the browser
 * history and URL's.
 */
TT.history = {};

/** */
TT.history.TABLE_OF_CONTENTS = 'table-of-things';
TT.history.HOME = 'home';
TT.history.FOREWORD = 'foreword';
TT.history.THEEND = 'theend';
TT.history.CREDITS = 'credits';

TT.history.previousHash = '';
TT.history.hashCheckInterval = -1;

TT.history.stack = [];

/**
 * 
 */
TT.history.initialize = function() {
	if( TT.history.supportsHistoryPushState() ) {
		$( window ).bind( "popstate", TT.history.onHistoryChanged );
	}
	else {
		TT.history.hashCheckInterval = setInterval( TT.history.onCheckHash, 200 );
	}
}

/**
 * Check for history.pushState support.
 */
TT.history.supportsHistoryPushState = function() {
	return ('pushState' in window.history) && window.history['pushState'] !== null;
}

/**
 * Called at an interval for browsers that do not support
 * the history API. Checks if the hash has changed and issues 
 * a navigation if so.
 */
TT.history.onCheckHash = function() {
	if( document.location.hash !== TT.history.previousHash ) {
		TT.history.navigateToPath( document.location.hash.slice( 1 ) );
		
		TT.history.previousHash = document.location.hash;
	}
}

/**
 * 
 */
TT.history.pushState = function( url ) {
	if ( TT.history.supportsHistoryPushState() ) {
		window.history.pushState('', '', url);
	}
	else {
		TT.history.previousHash = '#' + url;
		document.location.hash = url;
	}
	
	// Google Analytics tracking
	TT.track( url );
	
	TT.history.stack.push( url );
}

/**
 * 
 */
TT.history.onHistoryChanged = function( event ) {
	if ( TT.history.supportsHistoryPushState() ) {
		TT.history.navigateToPath( document.location.pathname );
	}
}

/**
 * 
 */
TT.history.navigateToPath = function( pathname ) {
	TT.navigation.hideTableOfContents();
	
	// Extract the path name parts
	var part1 = pathname.split("/")[1]; // The article ID or home/credits
	var part2 = pathname.split("/")[2]; // The page number
	
	if( !part1 || part1 == TT.history.HOME ) {
		TT.navigation.goToHome( true );
	}
	else if( part1 == TT.history.CREDITS ) {
		TT.navigation.goToCredits( true );
	}
	else if( part1 == TT.history.TABLE_OF_CONTENTS ) {
		TT.navigation.showTableOfContents( true );
	}
	else {
		if( part1 ) {
			if( part2 ) {
				TT.navigation.goToPage( part1, part2, true );
			}
			else {
				TT.navigation.goToPage( part1, "1", true );
			}
		}
	}
}