// Code cready by and copyright Panic. Inc.// Please don't add us to your wall of shame.  // Scroll: Setup Scrolling Stuffvar currentSection = "about_pane"; // The default loaded section on the pagevar tabTag = "_tab";var paneTag = "_page";// Scroll the page manually to the position of element "link", passed to us.function ScrollSection(link, scrollArea, offset){	// Store the last section, and update the current section	// if (currentSection == link) {	// 		return;	// 	}	// 	lastSection = currentSection;	// 	currentSection = link;			// Change the section highlight.	// Extract the root section name, and use that to change the background image to 'top', revealing the alt. state	// if(link!='about_pane'){	//     	sectionTab = currentSection.split("_")[0] + tabTag;	//     	document.getElementById(sectionTab).className = "active";	// }	// if (lastSection && lastSection != 'about_pane') {	//   lastTab = lastSection.split("_")[0] + tabTag;	//   document.getElementById(lastTab).className = "";	// }    	// Get the element we want to scroll, get the position of the element to scroll to		theScroll = document.getElementById(scrollArea);	position = findElementPos(document.getElementById(link));	// Get the position of the offset div -- the div at the far left.	// This is the amount we compensate for when scrolling		if (offset != "") {		offsetPos = findElementPos(document.getElementById(offset));		position[0] = position[0] - offsetPos[0];	}	scrollStart(theScroll, theScroll.scrollLeft, position[0], "horiz");	// return false;	//Find the height of the new element	//alert(link);	lheight = document.getElementById(link).offsetHeight;	divid='frame';	document.getElementById(divid).style.height = lheight+"px";		//alert('changed');}// Scroll the page using the arrows//// Animated Scroll Functions// Scrolls are synchronous -- only one at a time.//var scrollanim = {time:0, begin:0, change:0.0, duration:0.0, element:null, timer:null};function scrollStart(elem, start, end, direction){	//console.log("scrollStart from "+start+" to "+end+" in direction "+direction);		if (scrollanim.timer != null) {		clearInterval(scrollanim.timer);		scrollanim.timer = null;	}	scrollanim.time = 0;	scrollanim.begin = start;	scrollanim.change = end - start;	scrollanim.duration = 25;	scrollanim.element = elem;		if (direction == "horiz") {		scrollanim.timer = setInterval("scrollHorizAnim();", 15);	}	else {		scrollanim.timer = setInterval("scrollVertAnim();", 15);	}}function scrollVertAnim(){	if (scrollanim.time > scrollanim.duration) {		clearInterval(scrollanim.timer);		scrollanim.timer = null;	}	else {		move = sineInOut(scrollanim.time, scrollanim.begin, scrollanim.change, scrollanim.duration);		scrollanim.element.scrollTop = move; 		scrollanim.time++;	}}function scrollHorizAnim(){	if (scrollanim.time > scrollanim.duration) {		clearInterval(scrollanim.timer);		scrollanim.timer = null;	}	else {		move = sineInOut(scrollanim.time, scrollanim.begin, scrollanim.change, scrollanim.duration);		scrollanim.element.scrollLeft = move;		scrollanim.time++;	}}//// LARGE POPUP: Full-Screen Pop-up Functions//function showLargePopup(elem) {    var popFullscreen = document.getElementById('fullscreen');    var popLarge = document.getElementById('largepopup');	// Put the correct content in the pop-up	//if (navigator.platform.indexOf('Mac') != -1) {	//	document.getElementById('start-download').className = 'show';	//	document.getElementById('wrong-os').className = 'hide';	//} else {	//	document.getElementById('start-download').className = 'hide';	//	document.getElementById('wrong-os').className = 'show';	//}  	document.getElementById('start-download').className = 'show';	// document.getElementById('wrong-os').className = 'hide';        // Make fullscreen thing really full screen, and show it    getSize();    popFullscreen.style.height = myScrollHeight + 'px';    popFullscreen.style.display = 'block';	    // Position pop-up    popLarge.style.left = ((myWidth - popLarge.offsetWidth) / 2) + 'px';    popLarge.style.top = (((myHeight - popLarge.offsetHeight) / 2) + myScroll) + 'px';    popLarge.style.visibility = 'visible';        refreshTimer = setTimeout("setLocation('"+elem.getAttribute("href")+"')", 1500);}function setLocation(loc) {	window.location = loc;}function hideLargePopup() {    var popFullscreen = document.getElementById('fullscreen');    var popLarge = document.getElementById('largepopup');        popLarge.style.visibility = 'hidden';    popFullscreen.style.display = 'none';}//// DOWNLOAD SMALL POPUP: Download Hint Pop-up Functions//// An advantage of using a timer to do a hide is that we can ignore// any spurious mouseOut events that have bubbled up, into <td>'s, etc.var dpopTimer = "";function showDownloadPopup(e) {	var popDownload = document.getElementById('dpop');	var btnDownload = document.getElementById('download');	if (moveanim.timer != null) {		clearInterval(moveanim.timer);		moveanim.timer = null;	}	// Determine where we should pop up in relation to the download button	position = findElementPos(btnDownload);	popDownload.style.top = (position[1] - (popDownload.offsetHeight - 40)) +"px";	popDownload.style.left = "5" + "px";	// If already trigger a rollover, cancel it because we're back in	if (dpopTimer != "")	{		clearTimeout(dpopTimer);		dpopTimer = "";	} else {		setOpacity(0, 'dpop');		popDownload.style.visibility = 'visible';		moveStart(popDownload, parseInt(popDownload.style.left), parseInt(popDownload.style.left), parseInt(popDownload.style.top) + 10, parseInt(popDownload.style.top), 15);		fadeElementSetup('dpop', 0, 100, 13);	}}function hideDownloadPopup() {	// Start timer to hide the pop-up and the overlay	dpopTimer = setTimeout("actuallyHide()", 500);}function actuallyHide() {	var popDownload = document.getElementById('dpop');	if (dpopTimer != "")	{		dpopTimer = "";		moveStart(popDownload, parseInt(popDownload.style.left), parseInt(popDownload.style.left), parseInt(popDownload.style.top), parseInt(popDownload.style.top) - 10, 15);				fadeElementSetup('dpop', 100, 0, 13, 1);	}}//// MOVE: Animate the move of an element.//// Move is also synchronous. One at a time, please.//var moveanim = {time:0, beginX:0, changeX:0.0, beginY:0, changeY:0, duration:0.0, element:null, timer:null};function moveStart(elem, startX, endX, startY, endY, duration){	if (moveanim.timer != null) {		clearInterval(moveanim.timer);		moveanim.timer = null;	}	moveanim.time = 0;	moveanim.beginX = startX;	moveanim.changeX = endX - startX;	moveanim.beginY = startY;	moveanim.changeY = endY - startY;	moveanim.duration = duration;	moveanim.element = elem;	moveanim.timer = setInterval("moveAnimDo();", 15);}function moveAnimDo(){	if (moveanim.time > moveanim.duration) {		clearInterval(moveanim.timer);		moveanim.timer = null;	}	else {		moveX = cubicOut(moveanim.time, moveanim.beginX, moveanim.changeX, moveanim.duration);		moveY = cubicOut(moveanim.time, moveanim.beginY, moveanim.changeY, moveanim.duration);		moveanim.element.style.left = moveX + "px";		moveanim.element.style.top = moveY + "px";		moveanim.time++;	}}//console.log("Initialized");function findElementPos(elemFind){	var elemX = 0;	var elemY = 0;	do {		elemX += elemFind.offsetLeft;		elemY += elemFind.offsetTop;	} while ( elemFind = elemFind.offsetParent )	//console.log("Found element "+elemFind+" at "+elemY+"/"+elemX);	return Array(elemX, elemY);}function sineInOut(t, b, c, d){	//alert('sine');	return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;}