
//______/\/\____/\/\_______________________
//_____/\/\/\__/\/\__/\/\/\____/\/\__/\/\_
//___/\/\/\/\/\/\______/\/\__/\/\__/\/\_
//___/\/\__/\/\/\__/\/\/\/\____/\/\/\___
//__/\/\____/\/\__/\/\/\/\/\____/\_____

$(document).ready(function() {

	// Vars
	///////////////////////////////////////////////////////////////////////////////////////////

	var INIT_PAGE				= 0,
		AUTO_VERTICAL_PAN_ON	= true;

	var SECTIONS				= [	"intro",
									"power_of_comfort",
									"mountain_smarts",
									"proof",
									"tight_knit_relationships",
									"chatter" ];

	var HORIZ_BORDER_FUDGE_W	= 250,
		horizBorders			= [],
		horizBgXs				= [],
		isBgOn					= [];

	var horizX					= 0,
		horizLeftEdge			= 0,
		horizRightEdge			= 0;

	var SLIDE_DURATION			= 1300,
		SLIDE_EASE				= "easeInOutQuart";

	var PAN_EDGE				= 50,
		PAN_EASE_FACTOR			= 1/8,
		PAN_AMT_BACK			= 35,
		PAN_AMT_FWD				= -35,
		PAN_AMT_NONE			= 0,
		trgtHPanAmt				= 0,
		trgtVPanAmt				= 0,
		hPanAmt					= 0,
		vPanAmt					= 0,
		pausePan				= false;

	var animTimer,
		ANIM_INTERVAL_MS		= 24;

	var THREAD_ALIGNMENTS		= [ { id: "power_of_comfort",			alignToBg: 1, offsetX: 510, offsetY: 960 },
									{ id: "mountain_smarts",			alignToBg: 2, offsetX: 653, offsetY: 938 },
									{ id: "tight_knit_relationships",	alignToBg: 4, offsetX: 328, offsetY: 1004 },
									{ id: "chatter",					alignToBg: 5, offsetX: 507, offsetY: 980 } ];

	var SCROLL_PTS				= [ {	id: "power_of_comfort",
										pts: [	{ x: 700,	y: 325 },
												{ x: 700,	y: 800 },
												{ x: 675,	y: 1200 },
												{ x: 675,	y: 1700 },
												{ x: 775,	y: 1900 },
												{ x: 775,	y: 2400 } ]},

									{	id: "mountain_smarts",
										pts: [	{ x: 550,	y: 349 },
												{ x: 550,	y: 800 },
												{ x: 650,	y: 1150 },
												{ x: 650,	y: 1550 },
												{ x: 775,	y: 1900 },
												{ x: 775,	y: 2200 },
												{ x: 675,	y: 2700 },
												{ x: 675,	y: 3000 } ]},

									{	id: "tight_knit_relationships",
										pts: [	{ x: 735,	y: 300 },
												{ x: 735,	y: 670 },
												{ x: 935,	y: 970 },
												{ x: 935,	y: 1775 },
												{ x: 700,	y: 2225 },
												{ x: 700,	y: 2725 },
												{ x: 850,	y: 3065 },
												{ x: 850,	y: 4065 } ]},

									{	id: "chatter",
										pts: [	{ x: 900,	y: 0 },
												{ x: 900,	y: 350 },
												{ x: 700,	y: 700 },
												{ x: 700,	y: 900 },
												{ x: 800,	y: 1000 },
												{ x: 800,	y: 1200 },
												{ x: 700,	y: 1300 },
												{ x: 700,	y: 1500 },
												{ x: 750,	y: 1700 },
												{ x: 750,	y: 2700 } ]} ];

	var threadAlignPosById		= {},
		scrollPtsById			= {};

	var SCROLL_DURATION			= 1000,
		SCROLL_EASE				= "easeInOutQuart",
		PAGE_FADE_DURATION		= 300,
		LDR_FADE_IN_DELAY		= 200,
		PAGE_URL_PREFIX			= "/marketing/partials/",
		PAGE_URL_SUFFIX			= ".html",
		SCROLL_TOP_FUDGE_H		= 20,
		LEFT_NAV_Y_THRESHOLD	= 750;

	var verticals				= { "": $(".horWrap") };

	var curVert					= "",
		trgtVert				= "",
		trgtVertAnchor			= "",
		isVertOn				= false;

	var VERT_SLIDE_EASE_FACTOR	= 1/2,
		trgtVertLeft			= 0,
		vertLeft				= 0;

	var proofWrap,
		proofTimeout,
		isProofOn				= false;

	var isLeftNavOn				= false;

	var AUTO_LOAD_DELAY			= 2000,
		AUTO_LOADABLE_PAGES		= [1, 2, 4, 5],
		autoLoadTimer;

	var domWindow,
		domBody,
		domBgs,
		domVertWrap,
		domHorizontal,
		domHorizSections,
		domVertLoader,
		domCurVertItem;

	// Init
	///////////////////////////////////////////////////////////////////////////////////////////

	setupDOMCache();
	setupBgs();
	setupHorizSections();
	setupSeamlessWrap();
	// setupPan();                 removing! JC 1.26.12
	setupBtns();
	setupKeys();
	setupHashChange();
	setupScroll();
	setupThreadAlignments();
	setupAnimTimer();

	start();

	function start() {
		if (window.location.hash.length) {
			domWindow.trigger("hashchange");
		} else {
			horizX		= getHorizSectionTrgtX(INIT_PAGE);
			domHorizontal.stop().css("left", horizX);
		}
	}

	//______/\/\____/\/\__________________________/\/\__________________________________________/\/\__________________/\/\___
	//_____/\/\____/\/\____/\/\/\____/\/\__/\/\__________/\/\/\/\/\____/\/\/\____/\/\/\/\____/\/\/\/\/\__/\/\/\______/\/\___
	//____/\/\/\/\/\/\__/\/\__/\/\__/\/\/\/\____/\/\________/\/\____/\/\__/\/\__/\/\__/\/\____/\/\__________/\/\____/\/\___
	//___/\/\____/\/\__/\/\__/\/\__/\/\________/\/\______/\/\______/\/\__/\/\__/\/\__/\/\____/\/\______/\/\/\/\____/\/\___
	//__/\/\____/\/\____/\/\/\____/\/\________/\/\/\__/\/\/\/\/\____/\/\/\____/\/\__/\/\____/\/\/\____/\/\/\/\/\__/\/\/\_

	// Setup
	///////////////////////////////////////////////////////////////////////////////////////////

	function setupDOMCache() {
		domWindow			= $(window);

		if ($.browser.mozilla || $.browser.msie) {
			domBody			= $('html');
		} else {
			domBody			= $('body');
		}

		domBgs				= $('.horizBgs div');
		domVertWrap			= $('#verticalWrap');
		domHorizontal		= $('.horizontal');
		domHorizSections	= $('.section');
		domVertLoader		= $('#verticalLoader');
		domHorWrap			= $('.horWrap');
	}

	function setupBgs() {
		for (var len = SECTIONS.length, i = 0; i < len; i++) {
			var bg			= domBgs.eq(i);
			var left		= bg.position().left;
			var right		= left + bg.width();
			horizBgXs[i]	= { left: left, right: right };
			isBgOn[i]		= true;
		}
	}
	function setupHorizSections() {
		var sections		= getHorizSections();
		var sectionEdges	= [];

		for (var len = sections.length, i = 0; i < len; i++) {
			sectionEdges[i]	= {
				left:	sections.eq(i).position().left,
				right:	sections.eq(i).position().left + sections.eq(i).width()
			}
		}

		horizBorders[0]	= (sectionEdges[0].right + sectionEdges[1].left) / 2;
		horizBorders[1]	= (sectionEdges[1].right + sectionEdges[2].left) / 2;
		horizBorders[2]	= (sectionEdges[2].right + sectionEdges[3].left) / 2;
		horizBorders[3]	= (sectionEdges[3].right + sectionEdges[4].left) / 2;
		horizBorders[4]	= (sectionEdges[4].right + sectionEdges[5].left) / 2;
		horizBorders[5]	= horizBgXs[5].right;

		horizLeftEdge	= horizBgXs[0].left;
		horizRightEdge	= horizBgXs[horizBgXs.length - 1].right;

	}
	function setupSeamlessWrap() {
		var introTextCopy	= $("#introText").clone();
			introTextCopy.attr("id", "introTextCopy")
			introTextCopy.appendTo($(".horizontal .copyStuff"));

		var introCred1Copy	= $("#introCred1").clone(true);
			introCred1Copy.attr("id", "introCred1Copy")
			introCred1Copy.appendTo($(".horizontal .superFront"));

		var introCred2Copy	= $("#introCred2").clone(true);
			introCred2Copy.attr("id", "introCred2Copy")
			introCred2Copy.appendTo($(".horizontal .superFront"));

		var introCred3Copy	= $("#introCred3").clone(true);
			introCred3Copy.attr("id", "introCred3Copy")
			introCred3Copy.appendTo($(".horizontal .superFront"));
	}

	function setupPan() {
		$('.lPanArea').hover(panLeft, stopHPan);
		$('.rPanArea').hover(panRight, stopHPan);

		if (AUTO_VERTICAL_PAN_ON) $(document).mousemove(onMouseMove).mouseout(stopVPan);
	}

	function setupThreadAlignments() {
		for (var len = THREAD_ALIGNMENTS.length, i = 0; i < len; i++) {
			threadAlignPosById[THREAD_ALIGNMENTS[i].id] = THREAD_ALIGNMENTS[i];
		}
	}

	function setupAnimTimer() {
		animTimer = setInterval(onAnimInterval, ANIM_INTERVAL_MS);
	}
	function setupBtns() {
		$('.lBtnArea').click(goPrev);
		$('.rBtnArea').click(goNext);

		$('.lBtnArea').hover(onPrevOver, onPrevOut);
		$('.rBtnArea').hover(onNextOver, onNextOut);

		$('a.prevDef').click(onPrevDefClick);

	}

	function setupKeys() {
		$(document).keydown(onKeyDown);
	}

	// Animation Interval
	///////////////////////////////////////////////////////////////////////////////////////////

	function onAnimInterval() {
		if (!pausePan) {
			updatePan();
			maintainSeamlessWrap();
			updateHorizVisibility();
		}
		if (isVertOn) updateVertLeft();
	}

	// Auto Load
	///////////////////////////////////////////////////////////////////////////////////////////

	function startAutoLoadTimer() {
		clearTimeout(autoLoadTimer);

		if (isVertOn) return;
		if (!isAutoLoadablePage(getCurHorizIndex())) return;

		autoLoadTimer = setTimeout(autoLoadPage, AUTO_LOAD_DELAY);

	}
	function pauseAutoLoadTimer() {
		clearTimeout(autoLoadTimer);
	}
	
	function autoLoadPage() {
		if (isVertOn) return;
		if (!isAutoLoadablePage(getCurHorizIndex())) return;

		trgtVert	= SECTIONS[getCurHorizIndex()];

		if (verticals[trgtVert]) {
			showTrgtPage();

		} else {
			verticals[trgtVert] = $("<div class=\"verticalItem\" />");
			verticals[trgtVert].appendTo("#verticalWrap");
			verticals[trgtVert].hide();
			verticals[trgtVert].load(getPageURL(trgtVert), function() {
				showTrgtPage()
			});
		}

	}

	function isAutoLoadablePage(index) {
		return AUTO_LOADABLE_PAGES.indexOf(getCurHorizIndex()) > -1;
	}

	// Panning
	///////////////////////////////////////////////////////////////////////////////////////////

	function updatePan() {

		if (isProofOn) trgtVPanAmt = 0;

		hPanAmt	= lerp(hPanAmt, trgtHPanAmt, PAN_EASE_FACTOR);
		vPanAmt	= lerp(vPanAmt, trgtVPanAmt, PAN_EASE_FACTOR);

		if (Math.abs(hPanAmt) >= 1) setHorizX(horizX + hPanAmt);

		if (vPanAmt >= 1) {
			domBody.scrollTo("+=" + vPanAmt);
		} else if (vPanAmt <= -1) {
			domBody.scrollTo("-=" + Math.abs(vPanAmt));
		}
	}
	function maintainSeamlessWrap() {

		if (-horizX > horizRightEdge) {
			setHorizX(horizLeftEdge + horizRightEdge + horizX);
		} else if (-horizX < horizLeftEdge) {
			setHorizX(-horizLeftEdge - horizRightEdge - horizX);
		}
	}
	function updateHorizVisibility() {
		for (var len = horizBgXs.length, i = 0; i < len; i++) {
			if (horizBgXs[i].left > getWinRightX() || horizBgXs[i].right < getWinLeftX()) {
				if (isBgOn[i]) {
					domBgs.eq(i).hide();
					isBgOn[i] = false;
				}
			} else {
				if (!isBgOn[i]) {
					domBgs.eq(i).show();
					isBgOn[i] = true;
				}
			}
		}
	}

	function onMouseMove(e) {
		var msY	= e.pageY - domBody.scrollTop();

		if (msY < PAN_EDGE) {
			panUp();
		} else if (msY > domWindow.height() - PAN_EDGE) {
			panDown();
		} else {
			stopVPan();
		}
	}

	function panLeft() {
		scrollToTop();
		resetVert();
		trgtHPanAmt = PAN_AMT_BACK;
	}
	function panRight() {
		scrollToTop();
		resetVert();
		trgtHPanAmt = PAN_AMT_FWD;
	}
	function panUp() {
		trgtVPanAmt = PAN_AMT_FWD;
	}
	function panDown() {
		trgtVPanAmt = PAN_AMT_BACK;
	}

	function stopHPan() {
		trgtHPanAmt = PAN_AMT_NONE;
		startAutoLoadTimer();
	}
	function stopVPan() {
		trgtVPanAmt = PAN_AMT_NONE;
	}

	function clearHPan() {
		stopHPan();
		hPanAmt	= 0;
	}

	// Next/Prev
	///////////////////////////////////////////////////////////////////////////////////////////

	function goNext() {
		var cur		= getCurHorizIndex();
		var trgt	= isJustRightOfEdge() ? cur : cur + 1;
		if (trgt > SECTIONS.length - 1) trgt = 0;
		clearHPan();
		pauseAutoLoadTimer();
		scrollToTop();
		resetVert();
		slideToHorizSection(trgt);
	}
	function goPrev() {
		var cur		= getCurHorizIndex();
		var trgt	= isJustLeftOfEdge() ? cur : cur - 1;
		if (trgt < 0) trgt = SECTIONS.length - 1;
		clearHPan();
		pauseAutoLoadTimer();
		scrollToTop();
		resetVert();
		slideToHorizSection(trgt);
	}

	function slideToHorizSection(index) {

		pausePan			= true;

		var trgtX			= getHorizSectionTrgtX(index);
		var isCrossingSeam	= Math.abs(trgtX - horizX) > (domHorizontal.width() / 2);
		var isForward		= (trgtX - horizX) > 0;

		if (isCrossingSeam) {
			if (isForward) {
				crossSeamForward(index);
			} else {
				crossSeamBackward(index);
			}
		} else {
			domHorizontal.stop().animate({ left: trgtX }, {
				duration: SLIDE_DURATION,
				easing: SLIDE_EASE,
				complete: onHorizSlideComplete,
				step: onHorizSlideUpdate });
		}
	}

	function crossSeamForward(index) {
		domHorizontal.stop().animate({ left: -horizRightEdge}, {
		duration: SLIDE_DURATION / 2,
		easing: "easeInQuart",
		step: onHorizSlideUpdate,
		complete: function() {
			horizX	= parseInt(domHorizontal.css('left'), 10);
			setHorizX(horizLeftEdge + horizRightEdge + horizX);
			onHorizSlideUpdate();
			domHorizontal.animate({ left: getHorizSectionTrgtX(index) }, {
				duration: SLIDE_DURATION / 2,
				easing: "easeOutQuart",
				complete: onHorizSlideComplete,
				step: onHorizSlideUpdate });
		} });
	}
	function crossSeamBackward(index) {

		var isBasicallyOnEdge	= Math.abs(-horizLeftEdge - horizX) < 3;

		if (isBasicallyOnEdge) {
			domHorizontal.stop();
			setHorizX(-horizLeftEdge - horizRightEdge - horizX);
			horizX	= parseInt(domHorizontal.css('left'), 10);
			onHorizSlideUpdate();
			domHorizontal.animate({ left: getHorizSectionTrgtX(index) }, {
				duration: SLIDE_DURATION,
				easing: "easeInOutQuart",
				complete: onHorizSlideComplete,
				step: onHorizSlideUpdate });

		} else {
			domHorizontal.stop().animate({ left: -horizLeftEdge}, {
			duration: SLIDE_DURATION / 3,
			easing: "easeInQuart",
			step: onHorizSlideUpdate,
			complete: function() {
				horizX	= parseInt(domHorizontal.css('left'), 10);
				setHorizX(-horizLeftEdge - horizRightEdge - horizX);
				onHorizSlideUpdate();
				domHorizontal.animate({ left: getHorizSectionTrgtX(index) }, {
					duration: SLIDE_DURATION / 2,
					easing: "easeOutQuart",
					complete: onHorizSlideComplete,
					step: onHorizSlideUpdate });
			} });
		}
	}

	function onHorizSlideUpdate() {
		horizX	= parseInt(domHorizontal.css('left'), 10);
		maintainSeamlessWrap();
		updateHorizVisibility();
	}
	function onHorizSlideComplete() {
		pausePan	= false;
		startAutoLoadTimer();
	}

	function isJustLeftOfEdge() {
		var midX			= getWinMiddleX();
		var index			= getCurHorizIndex();
		var borderX			= horizBorders[index];
		if (!borderX) return false;
		var distFromBorder	= borderX - midX;
		return (distFromBorder > 0 && distFromBorder < HORIZ_BORDER_FUDGE_W);
	}
	function isJustRightOfEdge() {
		var midX			= getWinMiddleX();
		var index			= getCurHorizIndex() - 1;
		var borderX			= horizBorders[index];
		if (!borderX) return false;
		var distFromBorder	= midX - borderX;
		return (distFromBorder > 0 && distFromBorder < HORIZ_BORDER_FUDGE_W);
	}

	// Buttons
	///////////////////////////////////////////////////////////////////////////////////////////

	function onPrevDefClick(e) {
		e.preventDefault();
	}

	function onPrevOver() {
		$('.lArrow').stop().animate({ left: '20px' }, 200);
	}
	function onPrevOut() {
		$('.lArrow').stop().animate({ left: '30px' }, 200);
	}
	function onNextOver() {
		$('.rArrow').stop().animate({ right: '20px' }, 200);
	}
	function onNextOut() {
		$('.rArrow').stop().animate({ right: '30px' }, 200);
	}

	// Keys
	///////////////////////////////////////////////////////////////////////////////////////////

	function onKeyDown(e) {

		var KEY_LEFT	= 37,
			KEY_RIGHT	= 39;

		switch (e.which) {
			case KEY_LEFT:
				goPrev();
				break;
			case KEY_RIGHT:
				goNext();
				break;
		}
	}

	// Helpers
	///////////////////////////////////////////////////////////////////////////////////////////

	function getCurHorizIndex() {

		var midX	= getWinMiddleX();

		if (midX < horizBorders[0]) return 0;
		else if (midX < horizBorders[1]) return 1;
		else if (midX < horizBorders[2]) return 2;
		else if (midX < horizBorders[3]) return 3;
		else if (midX < horizBorders[4]) return 4;
		else if (midX < horizBorders[5]) return 5;
		else return 0;

	}

	function setHorizX(x) {
		horizX	= x;
		domHorizontal.css('left', x);
		resetVertX();
	}

	function getHorizSections() {
		return domHorizSections;
	}
	function getHorizSection(index) {
		return getHorizSections().eq(index);
	}
	function getHorizSectionTrgtX(index) {
		var sec			= domHorizSections.eq(index);
		var trgtX		= -(getHorizSectionX(index) - ((domWindow.width() - sec.width()) / 2));

		if (index == 0) trgtX = Math.min(trgtX, horizLeftEdge);

		return trgtX;
	}
	function getHorizSectionX(index) {
		return parseInt(getHorizSection(index).css('left'), 10);
	}
	function getHorizSectionW(index) {
		return parseInt(getHorizSection(index).css('width'), 10);
	}

	function getWinLeftX() {
		return -horizX;
	}
	function getWinRightX() {
		return getWinLeftX() + domWindow.width();
	}
	function getWinMiddleX() {
		return (getWinLeftX() + getWinRightX()) / 2;
	}

	//______/\/\____/\/\____________________________/\/\______/\/\____________________________/\/\_______________
	//_____/\/\____/\/\____/\/\/\____/\/\__/\/\__/\/\/\/\/\____________/\/\/\/\__/\/\/\______/\/\______/\/\/\/\_
	//____/\/\____/\/\__/\/\/\/\/\__/\/\/\/\______/\/\______/\/\____/\/\____________/\/\____/\/\____/\/\/\/\___
	//_____/\/\/\/\____/\/\________/\/\__________/\/\______/\/\____/\/\________/\/\/\/\____/\/\__________/\/\_
	//______/\/\________/\/\/\/\__/\/\__________/\/\/\____/\/\/\____/\/\/\/\__/\/\/\/\/\__/\/\/\__/\/\/\/\___

	// Setup
	///////////////////////////////////////////////////////////////////////////////////////////

	function setupHashChange() {
		domWindow.bind("hashchange", onHashChange);
	}
	function setupScroll() {
		domWindow.scroll(onPageScroll)
		domBody.bind('scroll mousedown DOMMouseScroll mousewheel', onManualScroll);

		for (var len = SCROLL_PTS.length, i = 0; i < len; i++) {
			scrollPtsById[SCROLL_PTS[i].id] = SCROLL_PTS[i].pts;
		}

	}

	// Hash
	///////////////////////////////////////////////////////////////////////////////////////////

	function onHashChange(e) {

		clearTimeout(proofTimeout);

		if (isProofOn) {
			closeProofPage();
			proofTimeout = setTimeout(function() { onHashChange(e) }, 1000);
			return;
		}

		trgtVert		= getHashPage(e.fragment);
		trgtVertAnchor	= getHashSection(e.fragment);

		if (trgtVert != curVert) {

			if (trgtVert == "proof") {
				journeyToProofPage();
			} else {
				journeyToNewPage();
			}

		} else {
			scrollToAnchor(trgtVertAnchor);
		}

	}

	function clearHash() {
		window.location.hash	= "#";
	}

	// Swapping pages
	///////////////////////////////////////////////////////////////////////////////////////////

	function journeyToNewPage() {

		domBody.stop(true);

		if (isCloseEnough(domBody.scrollTop(), 1, 25)) {
			slideToTrgtPage();
		} else {
			domBody.scrollTo(1, SCROLL_DURATION, { easing: SCROLL_EASE, onAfter: slideToTrgtPage });
		}

	}
	function slideToTrgtPage() {
		var index = SECTIONS.indexOf(trgtVert);
		if (index == -1) return;

		hideVerticals();

		var trgtX	= getHorizSectionTrgtX(index);

		if (isCloseEnough(horizX, trgtX, 100)) {
			setTimeout(loadTrgtPage, 10);
		} else {
			slideToHorizSection(index);
			setTimeout(loadTrgtPage, SLIDE_DURATION);
		}
	}

	function loadTrgtPage() {

		if (verticals[trgtVert]) {
			showTrgtPage();
			scrollToAnchor(trgtVertAnchor);

		} else {
			domVertLoader.stop(true).delay(LDR_FADE_IN_DELAY).fadeIn(PAGE_FADE_DURATION);

			verticals[trgtVert] = $("<div class=\"verticalItem\" />");
			verticals[trgtVert].appendTo("#verticalWrap");
			verticals[trgtVert].hide();
			verticals[trgtVert].load(getPageURL(trgtVert), function() {
				domVertLoader.stop(true).fadeOut(PAGE_FADE_DURATION);
				showTrgtPage();
				scrollToAnchor(trgtVertAnchor);
			});
		}
	}
	function showTrgtPage() {

		curVert			= trgtVert;

		isLeftNavOn		= false;
		$('.leftNav').css("left", "-250px");

		resetVertY();
		resetVertX();

		verticals[curVert].fadeIn(PAGE_FADE_DURATION);

		domCurVertItem	= $(".verticalItem:visible");
		isVertOn		= true;

		updateVertHeight();
	}

	function resetVertY() {
		var pos			= threadAlignPosById[curVert];
		var bgY			= $(".horizBgs").position().top;
		var trgtY		= pos.offsetY + bgY;
		domVertWrap.css("top", trgtY);
	}
	function resetVertX() {
		trgtVertLeft	= getTopVertLeftPos(curVert);
	}

	function resetVert() {
		pauseAutoLoadTimer();
		hideVerticals();
		updateVertHeight();
		clearHash();
		curVert = null;
	}
	function updateVertHeight() {

		var h	= 0;

		if (isVertOn) {
			h	= $(".verticalItem:visible .vertical .theThread").height();
		}

		setVertHeight(h);
	}
	function setVertHeight(h) {
		domVertWrap.height(h);
	}
	function hideVerticals() {
		if (isVertOn) {
			domCurVertItem.hide();
			isVertOn	= false;
		}
	}

	// Proof Page
	///////////////////////////////////////////////////////////////////////////////////////////

	function journeyToProofPage() {
		domBody.stop(true);

		if (isCloseEnough(domBody.scrollTop(), 1, 25)) {
			slideToProofPage();
		} else {
			domBody.scrollTo(1, SCROLL_DURATION, { easing: SCROLL_EASE, onAfter: slideToProofPage });
		}
	}
	function slideToProofPage() {
		var index = SECTIONS.indexOf(trgtVert);
		if (index == -1) return;

		hideVerticals();

		var trgtX	= getHorizSectionTrgtX(index);

		if (isCloseEnough(horizX, trgtX, 100)) {
			setTimeout(loadTrgtProofPage, 10);
		} else {
			slideToHorizSection(index);
			setTimeout(loadTrgtProofPage, SLIDE_DURATION);
		}
	}

	function loadTrgtProofPage() {

		if (!trgtVertAnchor || !trgtVertAnchor.length) return;

		isProofOn	= true;

		proofWrap = $("<div id=\"proofWrap\" />");
		proofWrap.appendTo("body");

		$(".lPanArea, .rPanArea").hide();
		$(".lBtnArea, .rBtnArea").fadeOut();

		proofWrap.load(getPageURL(trgtVertAnchor), onProofPageLoad);
	}
	function onProofPageLoad() {
		$(".fullCon").css("top", "100%");
		domHorWrap.stop().animate({ top: "-100%" }, 800, "easeInOutQuad", function() {
			domHorWrap.hide();
			domVertWrap.hide();
		});
		$(".fullCon").stop().animate({ top: "0%" }, 700, "easeInOutQuad");
		$("#backToMain").click(killProofPage);
		$(".leftNavProof").click(killProofPage);
	}

	function killProofPage() {
		closeProofPage();
		clearHash();
	}

	function closeProofPage() {

		isProofOn	= false;
		domVertWrap.show();

		$(".fullCon").stop().animate({ top: "100%" }, 800, "easeInOutQuad", function() {
			$("#proofWrap").remove();
			$(".lPanArea, .rPanArea").show();
			$(".lBtnArea, .rBtnArea").fadeIn();

		});
		domHorWrap.show();
		domHorWrap.css("top", "-100%");
		domHorWrap.stop().animate({ top: "0%" }, 700, "easeInOutQuad");

		$("#backToMain").unbind("click", killProofPage);
		$(".leftNavProof").unbind("click", killProofPage);

	}

	// Scrolling
	///////////////////////////////////////////////////////////////////////////////////////////

	function onPageScroll(e) {
		if (isVertOn) slideScrollVert();
		positionLeftNav();
	}

	function slideScrollVert() {

		var scrollY	= domBody.scrollTop();
		var pts		= scrollPtsById[curVert];
		var pos		= threadAlignPosById[curVert];
		var y		= scrollY - pos.offsetY;

		var lowerX,
			lowerY,
			upperX,
			upperY;

		if (y > 0) {
			if (y < pts[0].y) {
				lowerX	= (domWindow.width() / 2) - getTopVertLeftPos(curVert);
				lowerY	= 0;
				upperX	= pts[0].x;
				upperY	= pts[0].y;

			} else {
				for (var i = pts.length - 2; i >= 0; i--) {
					if (y > pts[i].y) {
						lowerX	= pts[i].x;
						lowerY	= pts[i].y;
						upperX	= pts[i + 1].x;
						upperY	= pts[i + 1].y;
						break;
					}
				}
			}

			var amt			= norm(y, lowerY, upperY);
			var left		= (domWindow.width() / 2) - lerp(lowerX, upperX, amt);
			trgtVertLeft	= left;

		} else {
			resetVertX();

		}

	}

	function updateVertLeft() {
		var lastVertLeft	= vertLeft;
		vertLeft			= lerp(vertLeft, trgtVertLeft, VERT_SLIDE_EASE_FACTOR);

		if (Math.abs(lastVertLeft - vertLeft) > 1) {
			domCurVertItem.css("left", vertLeft);
		}
	}

	function scrollToTop() {
		domBody.stop(true).scrollTo(0, SCROLL_DURATION);
	}

	function scrollToAnchor(anchor) {

		if (!anchor) return;

		var element		= $(".verticalItem:visible #" + anchor);

		if (!element.length) {
			return;
		}

		var elementY	= element.offset().top;
		var trgtY		= elementY - 150;

		domBody.stop(true).scrollTo(trgtY, SCROLL_DURATION, { easing: SCROLL_EASE });

	}
	function onManualScroll(e) {
		if (e.which > 0 || e.type == "mousedown" || e.type == "mousewheel") domBody.stop();
	}

	function positionLeftNav() {

		var scrollY	= domBody.scrollTop();

		if (!isLeftNavOn && scrollY > LEFT_NAV_Y_THRESHOLD) {
			isLeftNavOn = true;
			$('.leftNav').stop().animate({left: "0px"}, 300);

		} else if (isLeftNavOn && scrollY <= LEFT_NAV_Y_THRESHOLD) {
			isLeftNavOn = false;
			$('.leftNav').stop().animate({left: "-250px"}, 600);
		}
	}

	// Helpers
	///////////////////////////////////////////////////////////////////////////////////////////

	function isAtTop() {
		return domBody.scrollTop() == 0;
	}

	function isCloseEnough(val1, val2, allowedDiff) {
		return Math.abs(val1 - val2) < allowedDiff;
	}

	function getHashPage(hash) {
		var parts = hash.split("/");
		return parts[0];
	}
	function getHashSection(hash) {
		var parts = hash.split("/");
		return (parts.length > 1) ? parts[1] : "";
	}
	function getPageURL(page) {
		return PAGE_URL_PREFIX + page + PAGE_URL_SUFFIX;
	}

	function getTopVertLeftPos(page) {
		var pos			= threadAlignPosById[page];

		if (!pos || !pos.alignToBg) return -1;

		var horX		= domHorizontal.position().left;
		var bgX			= horizBgXs[pos.alignToBg].left;
		var left		= pos.offsetX + bgX + horX;
		return left;
	}
	
	// exposing a few functions for Omniture =D
    self.getCurHorizIndex = getCurHorizIndex;
    self.getDomBody = function(){ return domBody; };


});



//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//                                           !
//
//
//
//
//
//                                               !
//
//
//                                      !
//
//
//                                          !
//
//                                             !
//                                           !
//
//
//
//                                       !        !
//
//                                          !
//
//                                        !       !
//
//                                             !
//                                                .
//                                       !r`````!  '
//                                      *.X-`!  !   >
//                                      !   :  /%   X~`:
//                                      ! !   <  h~    f
//                                     ! <    !`!`:-"`  X
//                                     X/     ! > \....!
//                                     X>     ~'   `    !
//                                     !     ! '     !`/
//                                    !     X  <     !
//                                    ?      > >     >
//                                    ?      4       >
//                                    !       X      !
//                                    !   .:   !`^-. !
//                                    !  ~      >    '
//                                    !         !    '
//                                    '         f    '
//                                    ~>       !     !
//                                     >             >
//                                    '      f  '!  !
//                                    X             ~
//                                   '        -     >
//                                   !         :    h
//                                   f         -    !
//                                   !         '    !
//                                   !          :    L
//                                   !>         !    '
//                                    !         '     `
//                                    '       '> !     h.::::.
//                                    '>      '> '     `      :
//                                     L-     '   ~           '
//                                 .-`                f  .:-   >
//                               /           >   .<.:!>~  '>   >
//                               ~          .!..~-^`  '.    !   >
//                             >     .-`    f     /XM%SMx  "   >
//                            !     ~      !   :HHMMMMMMHMX    !
//                           '    :        !  XMMM*X(tM!X?MX!!(~
//                           f   :         !MXMMX?XXXS?HX?MXX
//                         :     L         X'MMM?XMX.!SMHHMMM
//                        :      '         '?MMHMMM%XM?#MM!MM
//                       ' ! !: !!          `MMXXMMXXMMMXXMMf
//                         :<4' "            4MX?MMM!MMhMMX!
//                            `~              4MSHMMMHMMM!
//                                              `"??MS*"
//
//
//
//

