



// this allows us to load multiple functions at window.onload without conflicts
// http://www.sitepoint.com/blogs/2004/05/26/closures-and-executing-javascript-on-page-load/
function addLoadEvent(func) { 
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	} else {
		window.onload = function() {
			oldonload();
			func();
		}
	}
} 

addLoadEvent(screens);
addLoadEvent(homeSlide);
addLoadEvent(zoom);



// screens()
	
allScreens = new Array;
allScreens.index = 0;

screenGroups = new Array();
screenGroups.index = 0;

function screens() {
	
	navs = new Array;
	navs.index = 0;
	uls = document.getElementsByTagName('ul');
	for (i=0; i<uls.length; i++) {
		if (uls[i].className.match(/(^|\s)screensNav/)) {
			navs[navs.index] = uls[i];
			navs.index++;
		}
	}
	for (var i=0; i<navs.length; i++) {
		
		group = new Object;
		
		
		group.screens = new Array()
		links = navs[i].getElementsByTagName('a');
		for (l=0; l<links.length; l++) {
			group.screens[l] = new Object;
			group.screens[l].index = l;
			group.screens[l].id = links[l].href.replace(/.*#(.+)/,'$1');
			group.screens[group.screens[l].id] = group.screens[l];
			group.screens[l].element = document.getElementById(group.screens[l].id);
			group.screens[l].group = group;
			
			group.screens[l].navLink = links[l];
			group.screens[l].navLink.id = group.screens[l].id;
			group.screens[l].navLink.href = '#s=' + group.screens[l].id;
			group.screens[l].navLink.screens = group.screens;
			group.screens[l].navLink.onclick = function() {
				if (this.screens.trans == false || this.screens.trans == undefined) {
					screens_show(this.id);
					if (typeof(slideObserve) != 'undefined') {
						slideObserve.stop();
						hashObserve = new PeriodicalExecuter(homeSlide_hash,.25);
					}
				}
				else {
					return false;
				}
			}
			
			allScreens[group.screens[l].id] = group.screens[l];
		}
		
		values = parseQuery();
		
		if (values['s']) {
			group.current = allScreens[values['s']];
			screens_show(values['s']);
		}
		else {
			group.current = group.screens[0];
			screens_show(group.screens[0].id);
		}
		
		
		screenGroups[screenGroups.index] = group;
		if (navs[i].id) {
			screenGroups[navs[i].id] = group;
		}
		screenGroups.index++;
		
	}
	
}

function screens_show(id) {
	
	target = allScreens[id];
	group = target.group;
	current = group.current;
	screens = group.screens;
	
	if (screens.trans == undefined) {	
		for (i=0; i<screens.length; i++) {
			el = screens[i].element;
			if (el != null && el.id == id) {
				screens[i].navLink.className += ' screens_selected';
			}
			else {
				new Effect.Opacity(el,{
					duration: .1,
					to: 0,
					beforeStart: function() {
						el.style.display = 'none';
					}
				});
			}
		}
		screens.trans = false;
	}
	
	else if (screens.trans == false && target != current) {
		screens.trans = true;
		
		target.navLink.className += ' screens_selected';
		new Effect.Opacity(target.element,{
			duration: 1,
			from: 0,
			to: 1,
			beforeStart: function() {
				target.element.style.display = 'block';
				if (target.element.originalPosition != undefined) {
					target.element.style.position = target.element.originalPosition;
				}
			},
			afterFinish: function() {
				screens.trans = false;
				group.current = target;
			}
		});
		
		current.navLink.className = current.navLink.className.replace(/(^| )screens_selected/gi,'');
		new Effect.Opacity(current.element,{
			duration: .75,
			from: 1,
			to: 0,
			beforeStart: function(i) {
				current.element.originalPosition = getStyle(current.element,'position');
				current.element.style.position = 'absolute';
			},
			afterFinish: function(i) {
				current.element.style.display = 'none';
			}
		});
	}
}




function homeSlide() {
	
	if (document.getElementById('homeSlideNav')) {
		
		slideObserve = new PeriodicalExecuter(homeSlide_advance,6);
		
		group = screenGroups['homeSlideNav'];
		
	}
	
	else {
		
		hashObserve = new PeriodicalExecuter(homeSlide_hash,.25);
		
	}
	
}

function homeSlide_advance() {
	if (group.screens.trans == false) {
		
		if (group.screens[group.current.index+1] != undefined) {
			screens_show(group.screens[group.current.index+1].id);
		}
		else {
			screens_show(group.screens[0].id);
		}
		
	}
}

function homeSlide_hash() {
	if (screenGroups.length > 0 && group.screens.trans == false) {
		values = parseQuery();
		s = values['s'];
		if (s != undefined) {
			screens_show(s);
		}
		else {
			for (s = 0; s<screenGroups.length; s++) {
				s = screenGroups[s].screens[0].id;
				screens_show(s);
			}
		}
	}
}





// zoom

zoomers = new Array;

function zoom() {
	
	var wrapper = document.getElementById('wrapper');
	// target opacity of wrapper
	wrapper.o = .15
	
	// duration of effects
	// check for ie6, which doesn't handle effects well
	if (document.all && typeof document.body.style.maxHeight == 'undefined') {
		var ie6 = true;
		d = 0;
	}
	else {
		d = .25;
	}
	
	
	for (i=0; i<document.links.length; i++) {
		if (document.links[i].className.match(/(^| )zoom( |$)/) && document.links[i].href.match(/\.(jpg|png|gif|svg)$/)) {
			
			l = document.links[i];
			l.index = i;
			zoomers[zoomers.length] = l;
			
			l.outer = document.createElement('div');
			l.outer.l = l;
			l.outer.className = 'overlay_outer';
			if (l.id) {
				l.outer.id = l.id + '_outer';
			}
			else {
				l.outer.id = 'zoomer' + zoomers.length + '_outer';
			}
			
			l.inner = document.createElement('div');
			l.inner.className = 'overlay_inner';
			
			l.content = document.createElement('div');
			l.content.className = 'overlay_content';
			
			l.img = document.createElement('img');
			l.img.src = l.href;
			l.img.l = l;
			
			l.shadow = new Array();
			shadow = new Array('t','b','l','r','tl','tr','bl','br');
			for (s=0; s<shadow.length; s++) {
				suf = shadow[s];
				l.shadow[suf] = document.createElement('div');
				l.shadow[suf].className = 'overlay_' + suf;
				l.content.appendChild(l.shadow[suf]);
			}
			
			l.content.appendChild(l.img);
			l.inner.appendChild(l.content);
			l.outer.appendChild(l.inner);
			document.getElementsByTagName('body')[0].appendChild(l.outer);
			
			l.outer.display = getStyle(l.outer,'display');
			l.outer.style.display = 'none';
			new Effect.Opacity(l.outer,{
				duration: 0,
				to: 0
			});
			
			
			l.close = document.createElement('a');
			l.close.className = 'close';
			l.close.href = document.location;
			l.close.l = l;
			l.close.appendChild(document.createTextNode('Close'));
			
			l.p = document.createElement('p');
			l.p.appendChild(l.close);
			l.content.appendChild(l.p);
			
			l.close.onclick = function() {
				
				zoom_close(this);
				
				return false;
				
			}
			
			
			l.onclick = function() {
				
				o = getStyle(wrapper,'opacity');
				f = getStyle(wrapper,'filter');
				
				if ((o == 1 || o == undefined) && (f == '' || f == 'none')) {
					
					var outer = this.outer;
					
					new Effect.Opacity(wrapper,{
						duration: d,
						from: 1,
						to: wrapper.o
					});
					
					new Effect.Opacity(outer,{
						beforeStart: function() {
							outer.style.display = outer.display;
							outer.l.content.style.width = outer.l.img.width + 'px';
						},
						duration: d,
						from: 0,
						to: 1
					});
				}
				
				return false;
				
			}
			
		}
	}
	
	if (zoomers.length > 1) {
		
		for (i=0; i<zoomers.length; i++) {
			
			l = zoomers[i];
			
			l.prev = document.createElement('a');
			l.prev.className = 'prev';
			l.prev.l = l;
			if (i == 0) {
				l.prev.index = zoomers.length-1;
			}
			else {
				l.prev.index = i-1;
			}
			l.prev.href = zoomers[l.prev.index].href;
			
			l.next = document.createElement('a');
			l.next.className = 'next';
			l.next.l = l;
			if (i == zoomers.length-1) {
				l.next.index = 0;
			}
			else {
				l.next.index = i+1;
			}
			l.next.href = zoomers[l.next.index].href;
			
			
			l.prev.appendChild(document.createTextNode('Previous'));
			l.p.appendChild(l.prev);
			l.next.appendChild(document.createTextNode('Next'));
			l.p.appendChild(l.next);
			
			l.prev.onclick = function() {
				
				zoom_prev(this);
				
				return false;
			}
			
			l.next.onclick = function() {
				
				zoom_next(this);
				
				return false;
			}
			
			l.img.onclick = function() {
				
				zoom_next(this.l.next);
				
				return false;
			}
			
		}
		
	}
	
}


function zoom_close(closeLink) {
	
	var outer = closeLink.l.outer;
	var wrapper = document.getElementById('wrapper');
	
	new Effect.Opacity(wrapper,{
		duration: d,
		from: wrapper.o,
		to: 1
	});
	
	new Effect.Opacity(outer,{
		duration: d,
		from: 1,
		to: 0,
		afterFinish: function() {
			outer.style.display = 'none';
		}
	});
}


function zoom_prev(prevLink) {
	current = prevLink.l.outer;
	
	new Effect.Opacity(current,{
		duration: d,
		from: 1,
		to: 0,
		afterFinish: function() {
			current.style.display = 'none';
		}
	});
	
	target = zoomers[prevLink.l.prev.index].outer;
	
	new Effect.Opacity(target,{
		beforeStart: function() {
			target.style.display = target.display;
			target.l.content.style.width = target.l.img.width + 'px';
		},
		duration: d,
		from: 0,
		to: 1
	});
}


function zoom_next(nextLink) {
	current = nextLink.l.outer;
	
	new Effect.Opacity(current,{
		duration: d,
		from: 1,
		to: 0,
		afterFinish: function() {
			current.style.display = 'none';
		}
	});
	
	target = zoomers[nextLink.l.next.index].outer;
	
	new Effect.Opacity(target,{
		beforeStart: function() {
			target.style.display = target.display;
			target.l.content.style.width = target.l.img.width + 'px';
		},
		duration: d,
		from: 0,
		to: 1
	});
}








// parseQuery returns an assocaitive array of the name=value pairs in a query string (or a hash formatted as a query) of a URL
// if no string is passed, it uses the current has of the url
function parseQuery(query) {
	
	if (!query) {
		query = window.location.hash;
	}
	
	query = query.replace(/.*(#|\?)(.+)/,'$2');
	
	values = new Array();
	
	params = query.split('&');
	
	for (var q=0; q<params.length; q++) {
		var pos = params[q].indexOf('=');
		name = params[q].substring(0,pos);
		value = params[q].substring(pos+1);
		
		values[name] = value;
		
	}
	
	return values;
	
}


// returns value of a rendered style attribute of an element
// http://www.robertnyman.com/2006/04/24/get-the-rendered-style-of-an-element/
function getStyle(oElm, strCssRule){
	var strValue = "";
	if(document.defaultView && document.defaultView.getComputedStyle){
		strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
	}
	else if(oElm.currentStyle){
		strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){
			return p1.toUpperCase();
		});
		strValue = oElm.currentStyle[strCssRule];
	}
	return strValue;
}