(function() {
	/* moved from history.js */
	var origin = {
	history : {		
		pageActions : {
			// hash (string) : actions { load(), unload(), reload() }			
			/* 
				- load() is called when the page is requested and it 
					is not the currently displayed page
				- unload() is called when someone "navigates away" from
					this page.
				- reload() is called when someone reclicks the same page
			*/
		},
		
		defaultAction : "",
				
		load : function(hash, callback) { 
			var act = this.pageActions[hash];
			if(act && act.load) {
				act.load(function() {
					if(callback) { callback(); }
				});
			}
		},		
		
		unload : function(hash, callback) { 
			var act = this.pageActions[hash];
			if(act && act.unload) {
				act.unload(callback);			
			}
		},		
		
		reload : function(hash, callback) { 
			var act = this.pageActions[hash];
			if(act && act.reload) {
				act.reload(callback);			
			}
		},
		
		parsePageName : function(uri) {
			uri = uri || window.location;
			var anchor = parseUri(uri).anchor;
			var parsed = anchor ? anchor : parseUri(uri).file.replace(".aspx", "");	
			// TODO: remove suck from above line
			return (this.pageActions[parsed]) ? parsed : "";
		}	
	}
}

	/* jquery extensions */
	jQuery.fn.makeInvisible = function() {
		return $(this).css({visibility:"hidden", display:"block"});
	}
	
	jQuery.fn.slideToHeight	= function(hgt, duration, callback, easing) {
		return jQuery(this).animate({ height:hgt }, duration, "", callback);//, easing, callback);
	}
	jQuery.fn.isVisible = function() {
		return jQuery(this).is(":visible");
	}
	//$.log = function() { }
	
	/* History */
	var history = origin.history; // alias for site-wide history maintenance	
	/* End History */
	var previousHash = "";
	
	function parsePageOrDefault(uri, def) {
		return history.parsePageName(uri) || (def || history.defaultAction);
	}
	

	$(document).ready(function() {
		history.defaultAction = "default";		
		setupHistoryActions();
		historyCallback(parsePageOrDefault());
	});
	
	function setupHistoryActions() {
		history.pageActions = $.extend({
			"default" : {
				load : function(callback) {
					loadHomepage(callback);
				},
				unload : function(callback) {
					unloadHomepage(callback);
				},
				reload : function(callback) {
					setupHomepageData(callback);
				}
			},
			"partners" : {
				load : function(callback) {
					loadPartnersPage(callback);
				},
				unload : function(callback) {
					unloadPartnersPage(callback);					
				},
				reload : function(callback) {
					doCallback(callback);
				}
			}
		}, history.pageActions);
		previousHash = parsePageOrDefault();
	}
	
	
	function historyCallback(hash) {
		hash = hash || history.defaultAction;
		if(hash) {	
			history.load(hash);
		}
	}
	
	function doCallback(callback) {
		if(callback) { callback(); }
	}
	
	function loadHomepage(callback) {
		fadeInDataSection(function() {
			setupHomepageData(callback);
		});
	}	
	
	function fadeInDataSection(callback) {
		$(".dataSection").css({opacity:0, visibility:"visible"}).animate({ opacity:1 }, 1000, "", function() {
			doCallback(callback);
		});
	}
	
	function unloadHomepage(callback) {
		fadeOut(function() {
			fadeOutMainImage(function() {
				doCallback(callback);
			});
		});
	}
	
	function setupHomepageData(callback) {
		loadTestimonials();
		setupPodHovers();
		doCallback(callback);
	}
	
	function loadPartnersPage(callback) {
		fadeInDataSection(function() {
			setupPodHovers();
		});
	}
	
	function unloadPartnersPage(callback) {
		fadeOut(function() {
			contractContentNode(callback);
		});
	}
	
	
	function setupPodHovers() {
		var overClass = "over";
		var pods = $(".pod");
		$(".pod").hover(function() {
			$(this).addClass(overClass);
		}, function() {
			$(this).removeClass(overClass);
		});
	}
	
	function fadeOut(callback) {
		var pods = $(".pod");
		var cnt = pods.size();
		var timeout = 500;
		recursiveFade(pods, 0, timeout, fadeOutSingle, callback);		
	}
		
	function recursiveFade(pods, i, timeout, fadeMethod, callback) {
		if(i >= pods.length) {
			if(callback){
				callback();}
			return;
		}
		var curr = $(pods.get(i));
		
		fadeMethod(curr);
		
		setTimeout(function() {
			recursiveFade(pods, i+1, timeout, fadeMethod, callback);
		}, timeout);
	}
	
	function fadeOutSingle(node) {					
		node.fadeOut(1000,function(){
			$(this).makeInvisible();
		});
	}
	
	function fadeInSingle(node) {
		node.fadeIn(1000, function() {
			
		});
	}
	
	function ajaxGet(url, options, callback) {
		options = $.extend(options, {
			"IsAjax":true
		});
		
		$.get(url, options, function(data, status) {
			if(callback) { 
				callback(data, status);
			}
		});
	}
	
	function loadTestimonials() {
		ajaxGet("testimonials.aspx", { }, function(data, status) {
			$(".testimonials .list").append(data).find("ol").cycle({
				fx:"fade", speed:800, timeout:10000
			});
		});
	}
})()