(function($) {
/**
 * jQuery.ScrollTo - Easy element scrolling using jQuery.
 * Copyright (c) 2007-2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
 * Dual licensed under MIT and GPL.
 * Date: 9/11/2008
 * @author Ariel Flesler
 * @version 1.4
 *
 * http://flesler.blogspot.com/2007/10/jqueryscrollto.html
 */
;(function(h){var m=h.scrollTo=function(b,c,g){h(window).scrollTo(b,c,g)};m.defaults={axis:'y',duration:1};m.window=function(b){return h(window).scrollable()};h.fn.scrollable=function(){return this.map(function(){var b=this.parentWindow||this.defaultView,c=this.nodeName=='#document'?b.frameElement||b:this,g=c.contentDocument||(c.contentWindow||c).document,i=c.setInterval;return c.nodeName=='IFRAME'||i&&h.browser.safari?g.body:i?g.documentElement:this})};h.fn.scrollTo=function(r,j,a){if(typeof j=='object'){a=j;j=0}if(typeof a=='function')a={onAfter:a};a=h.extend({},m.defaults,a);j=j||a.speed||a.duration;a.queue=a.queue&&a.axis.length>1;if(a.queue)j/=2;a.offset=n(a.offset);a.over=n(a.over);return this.scrollable().each(function(){var k=this,o=h(k),d=r,l,e={},p=o.is('html,body');switch(typeof d){case'number':case'string':if(/^([+-]=)?\d+(px)?$/.test(d)){d=n(d);break}d=h(d,this);case'object':if(d.is||d.style)l=(d=h(d)).offset()}h.each(a.axis.split(''),function(b,c){var g=c=='x'?'Left':'Top',i=g.toLowerCase(),f='scroll'+g,s=k[f],t=c=='x'?'Width':'Height',v=t.toLowerCase();if(l){e[f]=l[i]+(p?0:s-o.offset()[i]);if(a.margin){e[f]-=parseInt(d.css('margin'+g))||0;e[f]-=parseInt(d.css('border'+g+'Width'))||0}e[f]+=a.offset[i]||0;if(a.over[i])e[f]+=d[v]()*a.over[i]}else e[f]=d[i];if(/^\d+$/.test(e[f]))e[f]=e[f]<=0?0:Math.min(e[f],u(t));if(!b&&a.queue){if(s!=e[f])q(a.onAfterFirst);delete e[f]}});q(a.onAfter);function q(b){o.animate(e,j,a.easing,b&&function(){b.call(this,r,a)})};function u(b){var c='scroll'+b,g=k.ownerDocument;return p?Math.max(g.documentElement[c],g.body[c]):k[c]}}).end()};function n(b){return typeof b=='object'?b:{top:b,left:b}}})(jQuery);

	var preparedOnce = false, prepareLinks = function() {
		$('a:not(.ajax-tab)').each(function(i, link) {
			link = $(link);
			if(link.attr('href').match(/[\?#]tab=/)) {
				link.addClass('ajax-tab').attr('href', link.attr('href').replace('?', '#'));
				if(preparedOnce) {
					var correspondingTab;
					for(var i = 0; i < availableTabs.length; i++) {
						if(link[0].href == availableTabs[i].href) {
							correspondingTab = $(availableTabs[i]);
							link.click(function(e) {
								locationChange(correspondingTab);
							});
							break;
						}
					}
				}
			}
		});
		preparedOnce = true;
	};
	prepareLinks();

	// Scroll to tab box selected at page load time
	if(window.location.hash.match(/^\#?tab=/)) {
		$('.tab-box a.ajax-tab').each(function(i, link) {
			if($(link).attr('href') == window.location.pathname + window.location.hash.replace('#', '?')) {
				$(window).scrollTo($(link).parents('.tab-box'), 200);
			}
		});
	}

	// For history management
	var ajax,
		availableTabs = $('.tab-box .tabs li a'),
		locationChange = function(tab) {
			if(tab.parents('li:first').is('.active')) {
				return;
			}
			if(ajax) {
				ajax.abort();
			}
			var historyKey = tab.attr('href').replace(/^.*\#/, ''),
				tabContainer = tab.parents('.tab-box'),
				subhead = tabContainer.find('.tab-subhead');
			historyStorage.put(historyKey, {tab: availableTabs.index(tab) });
			tabs[historyKey] = tab;
			var href = tab.attr('href').replace(/^.*?(\/[^\/].*)$/, '$1').replace(/\#tab=/, '');
			tab.parents('ul:first').find('li.active').removeClass('active');
			tab.parents('li:first').addClass('active');
			var tabBox = tabContainer.find('.tab-content-body').fadeTo(250, 0.125);
			tabContainer.find('.tab-content-loading').fadeIn(150);
			if(subhead.length > 0) {
				var subheadClasses = subhead.attr('class').split(/\s+/);
				$(subheadClasses).each(function(i, subheadClass) {
					if(subheadClass.match(/^tab-current-/)) {
						subhead.removeClass(subheadClass);
						return false;
					}
				});
				subhead.addClass('tab-current-' + historyKey.replace(/^tab=/, ''));
			}
			ajax = $.get(href,
				function(data) {
					tabData[historyKey] = data;
					$(window).scrollTo($(tabBox).parents('.tab-box'), 200);
					tabBox.html(data).fadeTo(125, 1, function() {
						// IE anti-aliasing/PNG fix
						$(this).css({
							opacity: '',
							zoom: ''
						});
					});
					ajax = null;
					tabContainer.find('.tab-content-loading').fadeOut(75);
					prepareLinks();
				}
			);
		},
		tabs = {},
		tabData = {},

		onHistory = function(newLocation, historyData) {
			try {
				if(newLocation == '') {
					newLocation = $('.tab-box li a').attr('href').replace(/^.*\#/, '');
				}
				if(tabData[newLocation] === undefined) {
					locationChange($(availableTabs[historyData.tab]));
					return;
				}
				var tab = tabs[newLocation],
					tabBox = tab.parents('.tab-box').find('.tab-content-body').html(tabData[newLocation]);
				tab.parents('ul:first').find('li.active').removeClass('active');
				tab.parents('li:first').addClass('active');

				var subhead = tabBox.parents('.tab-box').find('.tab-subhead');
				if(subhead.length > 0) {
					var subheadClasses = subhead.attr('class').split(/\s+/);
					$(subheadClasses).each(function(i, subheadClass) {
						if(subheadClass.match(/^tab-current-/)) {
							subhead.removeClass(subheadClass);
							return false;
						}
					});
					subhead.addClass('tab-current-' + newLocation.replace(/^tab=/, ''));
				}
			} catch(err) {
				// console.log('history event failure', err);
			}
		},

		onHistoryNoTabs = function() {};

	window.dhtmlHistory.create({
		toJSON: function(o) {
			return JSON.stringify(o);
		},
		fromJSON: function(s) {
			return JSON.parse(s);
		}
	});

	$(window).load(function(e) {
		dhtmlHistory.initialize();
		if(availableTabs.length == 0) {
			dhtmlHistory.addListener(onHistoryNoTabs);
			return;
		}
		dhtmlHistory.addListener(onHistory);

		// #anchor
		if(!location.hash) {
			if(window.location.search.match(/\?tab=/)) {
				return;
			}
			var currentTab = $(availableTabs[0]),
				currentHref = currentTab.attr('href').replace(/^.*\#/, '');
			tabs[currentHref] = currentTab;
			tabData[currentHref] = currentTab.parents('.tab-box').find('.tab-content-body').html();
			historyStorage.put(currentHref, {tab: availableTabs.index(currentTab) });
			locationChange(currentTab);
		} else {
			var hash = location.hash.replace(/^\#/, ''), tab;
			for(var i = 0; i < availableTabs.length; i++) {
				tab = $(availableTabs[i]);
				if(tab.attr('href').replace(/^.*[\#\?]/, '') == hash) {
					tabs[hash] = tab;
					locationChange(tab);
					break;
				}
			}
		}
	});

	var menuTabQueue = [];
	$('.ajax-tab').each(function(i, tab) {
		tab = $(tab);
		tab.attr('href', tab.attr('href').replace(/\?/, '#'));
		if(tab.parents('.tabs').length > 0) {
			if(tab.parents('li:first').is('.active')) {
				tabs[0] = tab;
				tabData[0] = tab.parents('.tab-box').find('.tab-content-body').html();
			}
			tab.click(function(e) {
				locationChange(tab);
			});
		} else {
			menuTabQueue.push(tab);
		}
	});
	$(menuTabQueue).each(function(i, tab) {
		var correspondingTab;
		for(var i = 0; i < availableTabs.length; i++) {
			if(tab[0].href == availableTabs[i].href) {
				correspondingTab = $(availableTabs[i]);
				tab.click(function(e) {
					locationChange(correspondingTab);
				});
				break;
			}
		}
	});
})(jQuery);
