jQuery(document).ready(function($) {
	getNavbarOffset = function() {
		return $("#banner").height();
	};

	$("#navbar").affix({
		offset: { top: getNavbarOffset }
	});

	$(window).resize(function() {
		$("#navbar").affix("checkPosition");
	});
});

// Fix anchor links in light of fixed navbar
// http://jsfiddle.net/ianclark001/rkocah23/

(function(document, history, location) {
	var HISTORY_SUPPORT = !!(history && history.pushState);

	var anchorScrolls = {
		ANCHOR_REGEX: /^#[^ ]+$/,
		OFFSET_HEIGHT_PX: 60,

		/**
     * Establish events, and fix initial scroll position if a hash is provided.
     */
		init: function() {
			this.scrollToCurrent();
			$(window).on("hashchange", $.proxy(this, "scrollToCurrent"));
			$("body").on("click", "a", $.proxy(this, "delegateAnchors"));
		},

		/**
     * Return the offset amount to deduct from the normal scroll position.
     * Modify as appropriate to allow for dynamic calculations
     */
		getFixedOffset: function() {
			return this.OFFSET_HEIGHT_PX;
		},

		/**
     * If the provided href is an anchor which resolves to an element on the
     * page, scroll to it.
     * @param  {String} href
     * @return {Boolean} - Was the href an anchor.
     */
		scrollIfAnchor: function(href, pushToHistory) {
			var match, anchorOffset;

			if (!this.ANCHOR_REGEX.test(href)) {
				return false;
			}

			match = document.getElementById(href.slice(1));

			if (match) {
				anchorOffset = $(match).offset().top - this.getFixedOffset();
				$("html, body").animate({ scrollTop: anchorOffset });

				// Add the state to history as-per normal anchor links
				if (HISTORY_SUPPORT && pushToHistory) {
					history.pushState({}, document.title, location.pathname + href);
				}
			}

			return !!match;
		},

		/**
     * Attempt to scroll to the current location's hash.
     */
		scrollToCurrent: function(e) {
			if (this.scrollIfAnchor(window.location.hash) && e) {
				e.preventDefault();
			}
		},

		/**
     * If the click event's target was an anchor, fix the scroll position.
     */
		delegateAnchors: function(e) {
			var elem = e.target;

			if (this.scrollIfAnchor(elem.getAttribute("href"), true)) {
				e.preventDefault();
			}
		}
	};

	$(document).ready($.proxy(anchorScrolls, "init"));
})(window.document, window.history, window.location);
