// Copyright 2007 Type Supply / Tal Leming.
// Not for redistribution.

// Safari < 3.0 requires some special behavior
var haveSafariUnderVersion3 = false;
var userAgent = navigator.userAgent.toLowerCase();
if (userAgent.indexOf("applewebkit/") != -1) {
	var webKitVersion = userAgent.split("applewebkit/")[1].split(" ")[0].split(".")[0];
	if (webKitVersion < 500) {
		haveSafariUnderVersion3 = true;
	}
	delete webKitVersion;
}
delete userAgent;


var maxMembers = 10;

//
// Member Buttons
//

// Set a button to the hover state.
function memberButtonMouseEnter(buttonIndex) {
	var button = getElement("memberButton" + buttonIndex);
	if (button != null) {
		addElementClass(button, "hover");
	} 
}

// Set a button to the non-hover state.
function memberButtonMouseLeave(buttonIndex) {
	var button = getElement("memberButton" + buttonIndex);
	if (button != null) {
		removeElementClass(button, "hover");
	} 
}

// Set a button to the selected state.
function selectMemberButton(buttonIndex) {
	// turn off the previously selected button
	var existingButtonIndex = findSelectedMemberButton();
	if (existingButtonIndex != null) {
		removeElementClass("memberButton" + existingButtonIndex, "selected");
	}
	// select the button
	var button = getElement("memberButton" + buttonIndex);
	if (button != null) {
		addElementClass(button, "selected");
	}

}

// Find the index of the selected button.
function findSelectedMemberButton() {
	for (i = 1; i <= maxMembers; i++) {
		var elementID = "memberButton" + i;
		var element = getElement(elementID);
		// element doesn't exist.
		if (element == null) {
			break;
		}
		// found. return the index.
		if (hasElementClass(element, "selected")) {
			return i;
		}
	}
	return null;
}

//
// Images
//

// Show a member image.
function showMemberImage(imageIndex) {
	var visibleImageIndex = findVisibleMemberImage();
	var visibleImageID = "memberImage" + visibleImageIndex;
	var selectedImageID = "memberImage" + imageIndex;
	// already selected
	if (visibleImageID == selectedImageID) {
		return;
	}
	// fade between the two
	fade(visibleImageID, {"duration" : .3, "queue" : "end"});
	appear(selectedImageID, {"duration" : .3, "queue" : "end"});
	// handle the buttons
	selectMemberButton(imageIndex)
}

// Find the index of the visible image.
function findVisibleMemberImage() {
	for (i = 1; i <= maxMembers; i++) {
		var elementID = "memberImage" + i;
		var element = getElement(elementID);
		// element doesn't exist
		if (element == null) {
			break;
		}
		// found. return the index.
		if (element.style.display == "block") {
			return i;
		}
	}
}

//
// LetterSetter
//

var lsContainerToLayout = new Array();

// Make the UI
function makeLSInterface(layouts) {
	var superContainer = getElement("lsSuperContainer");
	for (var layoutIndex = 1; layoutIndex <= layouts.length; layoutIndex++) {
		var containerID = "lsContainer" + layoutIndex;
		var layoutData = layouts[layoutIndex-1];
		var result = makeLetterSetterInterface(layoutData);
		var element = result[0];
		var connections = result[1];
		if (layoutIndex != 1) {
			element.style.display = "none";
		} else {
			element.style.display = "block";
		}
		element.id = containerID;
		superContainer.appendChild(element);
		lsContainerToLayout[containerID] = layoutData.layoutName;
		for (var index in connections) {
			var connection = connections[index];
			var elementID = connection[0];
			var event = connection[1];
			var functID = connection[2];
			if (functID == "toggleGroup") {
				connect(elementID, event, toggleLSFeatureGroup);
			} else if (functID == "updateImage") {
				connect(elementID, event, updateLSImageFromEvent);
			}
		}
	}
}

// Toggle group visibility.
function toggleLSFeatureGroup(event) {
	var headID = event.src().id;
	var groupID = getElement(headID).linkedGroup;
	toggle(groupID, "blind", {"duration" : .1})
	if (hasElementClass(headID, "closed")) {
		swapElementClass(headID, "closed", "open");
	} else {
		swapElementClass(headID, "open", "closed");
	}
}

// Show a member LS.
function showMemberLetterSetter(lsIndex) {
	var visibleLSIndex = findVisibleMemberLetterSetter();
	var visibleLSID = "lsContainer" + visibleLSIndex;
	var selectedImageID = "lsContainer" + lsIndex;
	// already selected
	if (visibleLSID == selectedImageID) {
		return;
	}
	// Safari < 3.0 botches the display of the UI
	// if the fade between is used. So, detect the
	// browser and version and do a simple swap
	// if it is needed.
	var needTransition = true;
	if (haveSafariUnderVersion3) {
		getElement(visibleLSID).style.display = "none";
		getElement(selectedImageID).style.display = "block";
		needTransition = false;
	}
	// fade between the two
	if (needTransition) {
		fade(visibleLSID, {"duration" : .3, "queue" : "end"});
		appear(selectedImageID, {"duration" : .3, "queue" : "end"});
	}
	// handle the buttons
	selectMemberButton(lsIndex);
}

// Find the index of the visible image.
function findVisibleMemberLetterSetter() {
	for (i = 1; i <= maxMembers; i++) {
		var elementID = "lsContainer" + i;
		var element = getElement(elementID);
		// element doesn't exist
		if (element == null) {
			break;
		}
		// found. return the index.
		if (element.style.display == "block") {
			return i;
		}
	}
}

// Function for event based image updates.
function updateLSImageFromEvent(event) {
	updateLetterSetterImage(event.src().layoutName);
}

// Key Up Event
var lsKeyUpExpirations = new Array();
var lsKeyUpTimeoutIDs = new Array();
var lsKeyUpDelay = 1000;
var lsKeyUpTimeout = 1000;

function lsKeyUpCallback() {
	var visibleLSIndex = findVisibleMemberLetterSetter();
	if (visibleLSIndex != null) {
		var layoutName = lsContainerToLayout["lsContainer" + visibleLSIndex];
		// tag the expiration date.
		lsKeyUpExpirations[layoutName] = new Date().getTime();
		// kill any existing timer for this layout.
		if (lsKeyUpTimeoutIDs[layoutName]) {
			clearTimeout(lsKeyUpTimeoutIDs[layoutName]);
			delete lsKeyUpTimeoutIDs[layoutName];
		}
		// start the timer.
		lsKeyUpTimeoutIDs[layoutName] = setTimeout("executeLSKeyUpUpdate('" + layoutName + "')", lsKeyUpTimeout)
	}
}

function executeLSKeyUpUpdate(layoutName) {
	var rightNow = new Date().getTime();
	if (lsKeyUpExpirations[layoutName] + lsKeyUpDelay <= rightNow) {
		// expiration date has passed. update image.
		delete lsKeyUpExpirations[layoutName];
		delete lsKeyUpTimeoutIDs[layoutName];
		updateLetterSetterImage(layoutName);
	} else if (lsKeyUpExpirations[layoutName] != null) {
		// expiration date has not passed. delay.
		lsKeyUpTimeoutIDs[layoutName] = setTimeout("executeLSKeyUpUpdate('" + layoutName + "')", lsKeyUpTimeout);
	}
}
