(function($) {
	// Private data
	var $footer;
	var $prevSibling;
	var $siteMap;
	var $toggleButton;
	var toggleButtonHeight;
	var interacted = false;

	function init() {
		$footer = $("#footer").wrap("<div />").parent();
		$prevSibling = $footer.prev();
		$siteMap = $("#site-map").wrap("<div />").parent();

		$footer.css("width", "100%");

		if ($.browser.msie && (parseInt($.browser.version) < 9)) {
			$footer.css("zIndex", $footer.children().last().css("zIndex"));
		}

		// FIXME: develop jquery preferences plugin
		{
			var prefsStr = $.cookie("preferences");

			if (null != prefsStr) {
				var prefs = JSON.parse(prefsStr);

				if (prefs["hideSiteMap"]) {
					$siteMap.hide();
				}
			}
		}

		var paddingBottom =
			parseInt($prevSibling.css("paddingBottom").replace(/px$/, "")) + $footer.height();

		$prevSibling.css("paddingBottom", paddingBottom + "px");
		$footer.css("bottom", "0").css("position", "fixed");

		$toggleButton = $("<div id='footerToggle'><div class='closed'>&nbsp;</div></div>").prependTo($footer);
		toggleButtonHeight = $toggleButton.innerHeight();

		if ($siteMap.is(":visible")) {
			$toggleButton.find(".closed").hide();

			// FIXME: develop jquery preferences plugin
			if (null == $.cookie("preferences")) {
				window.setTimeout(function() {
					if (!$.cciFooter.isUserInteracted()) {
						$.cciFooter.toggle();
					}
				}, 3000);
			}
		}

		if ($.browser.msie && (parseInt($.browser.version) < 9)) {
			$toggleButton.dropShadow({left: -1, top: -1, blur: 4, color: "#222222", opacity: 1});
		}

		$toggleButton.click(function() {
			interacted = true;
			toggleFooter();
		});
	}

	function toggleFooter() {
		$siteMap.animate(
			{"height": "toggle"},
			{
				"duration": "slow",
				  "easing": "swing",
				    "step":
							function(now, fx) {
								var val = now + "px";

								$(fx.elem).css(fx.prop, val);
								$prevSibling.css("paddingBottom", $footer.outerHeight() - toggleButtonHeight);
							},
				"complete":
							function(){
								// FIXME: develop jquery preferences plugin
								var prefsStr = $.cookie("preferences");
								var prefs = {};

								if (null != prefsStr) {
									prefs = JSON.parse(prefsStr);
								}

								if ($(this).is(":visible")) {
									$toggleButton.find(".closed").hide();
									prefs["hideSiteMap"] = false;
								} else {
									$toggleButton.find(".closed").show();
									prefs["hideSiteMap"] = true;
								}

								$.cookie(
									"preferences",
									JSON.stringify(prefs),
									{
										path: '/'
									}
								);
							}
			}
		);
	}

	$.extend({
		cciFooter: {
			"init": init,
			"toggle": toggleFooter,
			"isUserInteracted": function() { return interacted; }
		}
	});
})(jQuery);

if (! $.browser.webkitMobile) {
	$(document).ready(function() {
		$.cciFooter.init();
	});
}
