function initCombined() { 
	Overlay.initialize();
	Tooltip.initialize();
	Keyboard.initialize();
	Sound.initialize();
}
//Event.observe(window, 'load', initCombined, false);


// -----------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------

var Tooltip = {
	
	currentTip: null,
	x: 0,
	y: 0,
	
	initialize: function() {
		if (!document.getElementsByTagName) { return; }

		var targets = document.getElementsByTagName('span');
		for (var i=0; i<targets.length; i++) {
			var target = targets[i];
			var relAttribute = String(target.getAttribute('rel'));
			if (relAttribute.toLowerCase().match('tooltip')) {
				Tooltip.register(target, target.getAttribute('name'));
			}
		}
		
		document.onmousemove = Tooltip.trackMove;
	},

	register: function(target, tip) {
		target.onmouseover = function() { Tooltip.show(tip); return false; }
		target.onmouseout = function() { Tooltip.hide(); return false; }
	},

	show: function(tip) {
		if (Tooltip.currentTip == tip) {
			return;
		}
		
		if (Tooltip.currentTip != null) {
			Tooltip.hide();
		}
		
		Tooltip.currentTip = tip;
		var mytip = $(tip);
		mytip.style.left = "" + (Tooltip.x + 4) + "px";
		mytip.style.top = "" + (Tooltip.y + 4) + "px";

		setTimeout("Tooltip.appear('" + tip + "')", 500);
	},
	
	appear: function(tip) {
		if (Tooltip.currentTip == tip) {
			Effect.Appear(tip, { duration: 0.2 });
		}
	},
	
	hide: function() {
		new Effect.Fade(Tooltip.currentTip, { duration: 0.2 });
		Tooltip.currentTip = null;
	},
	
	trackMove: function(ev) {
		ev = ev || window.event;

		if (document.layers) {
			Tooltip.x = ev.pageX;
			Tooltip.y = ev.pageY;
		}
		else {
			Tooltip.x = ev.clientX;
			Tooltip.y = ev.clientY;
		}
		
		if (Tooltip.currentTip != null) {
			var mytip = $(Tooltip.currentTip);
			mytip.style.left = "" + (Tooltip.x + 4) + "px";
			mytip.style.top = "" + (Tooltip.y + 4) + "px";
		}
	}

}


// -----------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------


var Sound = {
	current: null,
	mapping: {},
	
	initialize: function() {
		if (!document.getElementsByTagName) { return; }

		var anchors = document.getElementsByTagName('a');
		for (var i=0; i<anchors.length; i++) {
			var anchor = anchors[i];
			var relAttribute = String(anchor.getAttribute('rel'));
			if (relAttribute.toLowerCase().match('sound')) {
				Sound.mapping[anchor.getAttribute('name')] = anchor.innerHTML;
			}
		}
	},
	
	play: function(what) {
		Sound.stop();

		Sound.current = document.createElement("embed");
		Sound.current.setAttribute("src", Sound.mapping[what]);
		Sound.current.setAttribute("hidden", true);
		Sound.current.setAttribute("autostart", true);
		document.body.appendChild(Sound.current);
	},
	
	stop: function() {
		if (Sound.current) {
			document.body.removeChild(Sound.current);
			Sound.current = null;
		}
	}

}


// -----------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------


var Keyboard = {
	
	mappings: new Array(),
	specials: {esc:27, del:127, bs:8, left:37, right:39, up:38, down:40},
	ctrl:0,
	shift:0,
	alt:0,
	command:0,
	active:1,
	
	
	initialize: function() {
		if (!document.getElementsByTagName) { return; }

		var anchors = document.getElementsByTagName('a');
		for (var i=0; i<anchors.length; i++) {
			var anchor = anchors[i];
			var relAttribute = String(anchor.getAttribute('rel'));
			if (relAttribute.toLowerCase().match('key')) {
				key = anchor.innerHTML;
				modifiers = anchor.getAttribute('modifiers');
				Keyboard.register(anchor.getAttribute('href'), key, modifiers);
			}
		}

		Keyboard.ignore("input");
		Keyboard.ignore("select");
		Keyboard.ignore("textarea");

		//document.onkeydown = Keyboard.keyDown;
		//document.onkeyup = Keyboard.keyUp;
		document.onkeypress = Keyboard.keyPress;
	},

	ignore: function(tagName) {
		var trouble = document.getElementsByTagName(tagName);
		for (var i=0; i<trouble.length; i++) {
			var item = trouble[i];
			item.onfocus = function() { Keyboard.stop(); return false; }
			item.onblur = function() { Keyboard.start(); return false; }
		}
	},
	
	stop: function() {
		Keyboard.active = 0;
	},
	
	start: function() {
		Keyboard.active = 1;
	},
	
	keyPress: function(ev) {
		if (!Keyboard.active)
			return;
		
		ev = ev || window.event;
		keycode = ev.keyCode || ev.which;
		
		Keyboard.shift = ev.shiftKey;
		Keyboard.ctrl = ev.ctrlKey;
		Keyboard.alt = ev.altKey;

		keycode = String.fromCharCode(keycode).toLowerCase().charCodeAt(0);
		Keyboard.dispatch(keycode);
	},

	keyDown: function(ev) {
		if (!Keyboard.active)
			return;

		ev = ev || window.event;
		keycode = ev.keyCode || ev.which;
		
		switch (keycode) {
		case 224:
			Keyboard.command = 1; 
			break;
		case 18:
			Keyboard.alt = 1; 
			break;
		case 17:
			Keyboard.ctrl = 1; 
			break;
		case 16:
			Keyboard.shift = 1; 
			break;
		default:
			keycode = String.fromCharCode(keycode).toLowerCase().charCodeAt(0);
			Keyboard.dispatch(keycode);
		}
	},
	
	keyUp: function(ev) {
		if (!Keyboard.active)
			return;

		ev = ev || window.event;
		keycode = ev.keyCode || ev.which;

		switch (keycode) {
		case 224:
			Keyboard.command = 0; 
			break;
		case 18:
			Keyboard.alt = 0; 
			break;
		case 17:
			Keyboard.ctrl = 0; 
			break;
		case 16:
			Keyboard.shift = 0; 
			break;
		}
	},

	register: function(action, key, modifiers) {
		optionsArray = {ctrl:0, shift:0, alt:0, command:0};
	
		selected = String(modifiers).split(",");
		for (i = 0; i < selected.length; i++) {
			optionsArray[selected[i]] = 1;
		}
		
		if (key.length == 1) {
			if (key.toLowerCase() != key) {
				optionsArray['shift'] = 1;
			}
			key = key.toLowerCase();
			keycode = key.charCodeAt(0);
		}
		else {
			keycode = Keyboard.specials[key.toLowerCase()];
		}
		
		index = Keyboard.mappings.length;
		Keyboard.mappings[index] = new Array(keycode, optionsArray, action);	
	},
	
	dispatch: function(keycode) {
		for (i = 0; i < Keyboard.mappings.length; i++) {
			entry = Keyboard.mappings[i];
			if (entry[0] == keycode) {
				if (entry[1]['ctrl'] == Keyboard.ctrl
				&& entry[1]['shift'] == Keyboard.shift
				&& entry[1]['alt'] == Keyboard.alt
				&& entry[1]['command'] == Keyboard.command) {
					action = entry[2];
					if (String(action).indexOf("javascript:") >= 0)
						eval(action);
					else
						document.location.href = action;
					return false;
				}
			}
		}
	}	

}


// -----------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------


var Overlay = {

	resizeDuration: 0.2,
	borderSize: 0,
	loadingImage: "images/loading.gif",
	anchor: null,
	isSafari: false,
	
	
	initialize: function() {	
		if (!document.getElementsByTagName) { return; }
		
		Overlay.isSafari = (navigator.userAgent.toString().toLowerCase().indexOf('safari')+1);

		// loop through all anchor tags
		var anchors = document.getElementsByTagName('a');
		for (var i=0; i<anchors.length; i++) {
			var anchor = anchors[i];
			var relAttribute = String(anchor.getAttribute('rel'));
			if (relAttribute.toLowerCase().match('overlay')) {
				anchor.onclick = function () { Overlay.start(this); return false; }
			}
		}

		var objBody = document.getElementsByTagName("body").item(0);
		
		var objBackdrop = document.createElement("div");
		objBackdrop.setAttribute('id', 'backdrop');
		objBackdrop.style.display = 'none';
		objBackdrop.onclick = function() { Overlay.end(); return false; }
		objBody.appendChild(objBackdrop);

		var objWrapper = document.createElement("div");
		objWrapper.setAttribute('id', 'overlayWrapper');
		objWrapper.style.display = 'none';
		objBody.appendChild(objWrapper);
		
		var objOverlay = document.createElement("div");
		objOverlay.setAttribute('id', 'overlay');
		objOverlay.style.display = 'none';
		objWrapper.appendChild(objOverlay);
	
		var objOverlayBody = document.createElement("div");
		objOverlayBody.setAttribute('id','overlayBody');
		objOverlayBody.style.display = 'none';
		objOverlay.appendChild(objOverlayBody);
	
		var objLoading = document.createElement("div");
		objLoading.setAttribute('id','loading');
		objOverlay.appendChild(objLoading);
	
		var objLoadingLink = document.createElement("a");
		objLoadingLink.setAttribute('id','loadingLink');
		objLoadingLink.setAttribute('href','#');
		//objLoadingLink.onclick = function() { Overlay.end(); return false; }
		objLoading.appendChild(objLoadingLink);
	
		var objLoadingImage = document.createElement("img");
		objLoadingImage.setAttribute('src', Overlay.loadingImage);
		objLoadingLink.appendChild(objLoadingImage);
	},
	
	start: function(anchor) {
		if (!anchor.innerHTML) {
			anchor = $(anchor);
		}
		
		var whereTo = anchor.getAttribute('href');			
		if (!whereTo) { return; }
		
		hideSelectBoxes();
		if (Overlay.isSafari) {
			Tooltip.hide();
		}

		// stretch overlay to fill page and fade in
		var arrayPageSize = getPageSize();
		Element.setHeight('backdrop', arrayPageSize[1]);
		new Effect.Appear('backdrop', { duration: 0.2, from: 0.0, to: 0.8 });
		Element.show('overlayWrapper');

		// calculate top offset for the overlay and display 
		var arrayPageScroll = getPageScroll();
		Element.setTop('overlayWrapper', arrayPageScroll[1] + (arrayPageSize[3] / 10) ); // /15

		Element.show('overlay');
		Element.show('loading');

		Overlay.anchor = anchor;
		var myAjax = new Ajax.Updater('overlayBody', whereTo, 
			{ method: 'get',  evalScripts: true, onComplete: Overlay.show });
	},

	show: function() {
		currentWidth = Element.getWidth('overlay');
		currentHeight = Element.getHeight('overlay');

		dimensions = String(Overlay.anchor.getAttribute('size') || "500,400").split(',');
		newWidth = parseInt(dimensions[0]);
		newHeight = parseInt(dimensions[1]);
		
		// scalars based on change from old to new
		xScale = newWidth / currentWidth * 100;
		yScale = newHeight / currentHeight * 100;
		
		// calculate size difference between new and old overlay, and resize if necessary
		wDiff = (currentWidth - (Overlay.borderSize * 2)) - newWidth;
		hDiff = (currentHeight - (Overlay.borderSize * 2)) - newHeight;

		if(!( hDiff == 0)){ new Effect.Scale('overlay', yScale, 
			{scaleX: false, duration: Overlay.resizeDuration}); }
		if(!( wDiff == 0)){ new Effect.Scale('overlay', xScale, 
			{scaleY: false, delay: Overlay.resizeDuration, duration: Overlay.resizeDuration}); }

		// if new and old image are same size and no scaling transition is necessary, 
		// do a quick pause to prevent image flicker.
		if((hDiff == 0) && (wDiff == 0)){
			if (navigator.appVersion.indexOf("MSIE")!=-1){ pause(250); } else { pause(100);} 
		}

		Element.hide('loading');
		new Effect.Appear('overlayBody', { duration: 0.5, queue: 'end' });
	},
	
	end: function() {
		if ($('overlay').style.display != "hidden") {
			Element.hide('overlay');
			Element.hide('overlayWrapper');
			Element.hide('overlayBody');
			new Effect.Fade('backdrop', { duration: 0.2});
			showSelectBoxes();
		}
	}
}


// -----------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------


// -----------------------------------------------------------------------------------

//
//	Additional methods for Element added by SU, Couloir
//	- further additions by Lokesh Dhakar (huddletogether.com)
//
Object.extend(Element, {
	getWidth: function(element) {
	   	element = $(element);
	   	return element.offsetWidth; 
	},
	getHeight: function(element) {
	   	element = $(element);
	   	return element.offsetHeight; 
	},
	setWidth: function(element,w) {
	   	element = $(element);
    	element.style.width = w +"px";
	},
	setHeight: function(element,h) {
   		element = $(element);
    	element.style.height = h +"px";
	},
	setTop: function(element,t) {
	   	element = $(element);
    	element.style.top = t +"px";
	},
	setBottom: function(element,t) {
	   	element = $(element);
    	element.style.bottom = t +"px";
	},
	setLeft: function(element,t) {
	   	element = $(element);
    	element.style.left = t +"px";
	},
	setRight: function(element,t) {
	   	element = $(element);
    	element.style.right = t +"px";
	},
	setSrc: function(element,src) {
    	element = $(element);
    	element.src = src; 
	},
	setHref: function(element,href) {
    	element = $(element);
    	element.href = href; 
	},
	setInnerHTML: function(element,content) {
		element = $(element);
		element.innerHTML = content;
	}
});


// -----------------------------------------------------------------------------------

//
// getPageScroll()
// Returns array with x,y page scroll values.
// Core code from - quirksmode.org
//
function getPageScroll() {
	var yScroll;

	if (self.pageYOffset) {
		yScroll = self.pageYOffset;
	} else if (document.documentElement && document.documentElement.scrollTop){	 // Explorer 6 Strict
		yScroll = document.documentElement.scrollTop;
	} else if (document.body) {	// all other Explorers
		yScroll = document.body.scrollTop;
	}

	arrayPageScroll = new Array('',yScroll) 
	return arrayPageScroll;
}

//
// getPageSize()
// Returns array with page width, height and window width, height
// Core code from - quirksmode.org
// Edit for Firefox by pHaez
//
function getPageSize() {
	var xScroll, yScroll;
	
	if (window.innerHeight && window.scrollMaxY) {	
		xScroll = document.body.scrollWidth;
		yScroll = window.innerHeight + window.scrollMaxY;
	} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
		xScroll = document.body.scrollWidth;
		yScroll = document.body.scrollHeight;
	} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
		xScroll = document.body.offsetWidth;
		yScroll = document.body.offsetHeight;
	}
	
	var windowWidth, windowHeight;
	if (self.innerHeight) {	// all except Explorer
		windowWidth = self.innerWidth;
		windowHeight = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	} else if (document.body) { // other Explorers
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}	
	
	// for small pages with total height less then height of the viewport
	if(yScroll < windowHeight){
		pageHeight = windowHeight;
	} else { 
		pageHeight = yScroll;
	}

	// for small pages with total width less then width of the viewport
	if(xScroll < windowWidth){	
		pageWidth = windowWidth;
	} else {
		pageWidth = xScroll;
	}

	arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) 
	return arrayPageSize;
}


// -----------------------------------------------------------------------------------

function showSelectBoxes() {
	selects = document.getElementsByTagName("select");
	for (i = 0; i != selects.length; i++) {
		selects[i].style.visibility = "visible";
	}
}

function hideSelectBoxes() {
	selects = document.getElementsByTagName("select");
	for (i = 0; i != selects.length; i++) {
		selects[i].style.visibility = "hidden";
	}
}

function pause(numberMillis) {
	var now = new Date();
	var exitTime = now.getTime() + numberMillis;
	while (true) {
		now = new Date();
		if (now.getTime() > exitTime)
			return;
	}
}
