var XHTMLNS = "http://www.w3.org/1999/xhtml";

var ie = false;

function createElement(element) {
	if(typeof document.createElementNS != 'undefined') {
		return document.createElementNS(XHTMLNS, element)
	}
	else if (typeof document.createElement != 'undefined') {
		return document.createElement(element)
	}
	else {
		return false;
	}
}

function addLoadEvent(func) {
	var oldonload = window.onload
	
	if(typeof window.onload != 'function') {
		window.onload = func
	}
	else {
		if(typeof func == 'function') {
			window.onload = function() {
				func()
				oldonload()
			}
		}
		else {
			window.onload = function() {
				eval(func)
				oldonload()
			}
		}
	}
}

function cancelDefault(e) {
	if(e.cancelable) {
		e.preventDefault()
	}
	else if(document.all) {
		event.returnValue = false
	}
	else {
		alert('not cancelable')
	}
}

function getTarget(e) {
	if(window.event && window.event.srcElement) {
		r = window.event.srcElement
	}
	else if (e && e.target) {
		r = e.target
	}

	return r
}

function addEvent(obj,evType,fn) {
	if (obj.addEventListener) {
		obj.addEventListener(evType,fn,false)
		return true
	}
	else if (obj.attachEvent) {
		var r = obj.attachEvent('on'+evType, fn)
		
		ie = true;
		
		if(!r) {
			alert('cannot add event!');
		}
		
		return r
	}
	else {
		alert('cannot add event!')
		return false
	}
}

function removeEvent(obj,evType,fn) {
	if (obj.removeEventListener) {
		obj.removeEventListener(evType,fn,false)
		return true
	}
	else if (obj.detachEvent) {
		var r = obj.detachEvent('on'+evType, fn)
		return r
	}
	else {
		return false
	}
}

document.getElementsByClassName = function(class_name) {
	var all_obj, ret_obj = new Array(), j = 0, strict = 0, a = 1

	if (document.getElementsByClassName.arguments.length > 1)
		strict = ( document.getElementsByClassName.arguments[1] ? 1 : 0 )

	if (document.all) {
		all_obj = document.all
	}
	else if (document.getElementsByTagName && !document.all) {
		all_obj = document.getElementsByTagName("*")
	}

	for (i = 0; i < all_obj.length; i++) {
		if (
			(' ' + all_obj[i].className + ' ').toLowerCase().match(
				new RegExp (( strict ? '^ ' + class_name + ' $' : '^.* ' + class_name + ' .*$').toLowerCase(),'g' )
			)
		 ) {
			ret_obj[j++] = all_obj[i]
		}
	}

	return ret_obj
}

function getParent(el, pTagName) {
	if(el == null) {
        	return null;
	}
	else if (el.nodeType == 1 && elementCompare(el.tagName,pTagName)) {
		return el;
	}
	else {
		return getParent(el.parentNode, pTagName);
	}
}

function elementCompare(a,b) {
	a = a.toLowerCase() // Gecko bug, supposed to be uppercase
	b = b.toLowerCase()

	if((a == b) || (a == "html:" + b)) { // opera has html: in front of elements
		return true
	}
	else {
		return false
	}
}

function openExternal(e) {
	cancelDefault(e);
	
	triggerer = getTarget(e);
	
	triggerer = getParent(triggerer, 'a');
	
	locationToOpen = triggerer.getAttribute('href');
	
	window.open(locationToOpen, 'externalLink');
}

function createExternals() {
	externalLinks = document.getElementsByClassName('external');
	
	if(externalLinks.length > 0) {
		for(n = 0; n < externalLinks.length; n++) {
			addEvent(externalLinks[n], 'click', openExternal);
		}
	}
}

domReady(createExternals);

var bounceItems = 0;

var bounceOpen = null;

var bounceItemHeights = [];
var bounceHeadingHeights = [];

var bounceSpaceAbove = [];

var maxHeight;

function openBounce(e) {
	target = getTarget(e);
	
	target = getParent(target, 'h3');
	
	if(elementCompare(target.nextSibling.tagName, 'div') && target.nextSibling.className == 'blurb') {
		re = /bounce_heading_([0-9]+)/
		
		res = target.getAttribute('id').match(re)
		
		bounceId = res[1]
		
		//alert(bounceId + '@' + bounceItemHeights[bounceId]);
		
		if(bounceOpen != bounceId) {
			//bounceOpen = 
			startBounce(bounceId)
		}
	}
}

var holdAction = false;

function startBounce(bounceId) {
	if(bounceOpen != bounceId && !holdAction) {
		if(bounceOpen !== null) {
			holdAction = true;
			
			if(bounceOpen > bounceId) {
				// open something higher, bounce
				
				document.getElementById('bounce_blurb_' + bounceId).style.overflow = 'hidden';
				document.getElementById('bounce_blurb_' + bounceId).style.height = '7.5px';
				document.getElementById('bounce_blurb_' + bounceId).style.display = 'block';
				
				slideSwitchBounce(bounceOpen, bounceId, 1);
				
				bounceOpen = bounceId
			}
			else {
				// open something lower, no bounce
				
				document.getElementById('bounce_blurb_' + bounceId).style.overflow = 'hidden';
				document.getElementById('bounce_blurb_' + bounceId).style.height = '7.5px';
				document.getElementById('bounce_blurb_' + bounceId).style.display = 'block';
				
				slideSwitch(bounceOpen, bounceId, 1);
				
				bounceOpen = bounceId
			}
		}
		else {
			// nothing open, slide any children down - no bounce
			
			//if(bounceId == (bounceItems - 1)) {
				//alert('last');// last item
				document.getElementById('bounce_blurb_' + bounceId).style.overflow = 'hidden';
				document.getElementById('bounce_blurb_' + bounceId).style.height = '7.5px';
				document.getElementById('bounce_blurb_' + bounceId).style.display = 'block';
				//setTimeout('slideDown('+bounceId+')', 1);
				slideDown(bounceId, 1);
				bounceOpen = bounceId
			//}
			//else {
				// other item
			//}
		}
		
		
	}
}

function slideSwitch(up, down, n) {
	up = parseInt(up);
	down = parseInt(down);
	
	upHeight = parseFloat(document.getElementById('bounce_blurb_' + up).style.height);
	downHeight = parseFloat(document.getElementById('bounce_blurb_' + down).style.height);
	
	if(downHeight < maxHeight) {
		if(maxHeight - downHeight < Math.pow(1.5, n)) {
			document.getElementById('bounce_blurb_' + down).style.height = maxHeight + 'px';
			document.getElementById('bounce_blurb_' + up).style.display = 'none';
			document.getElementById('bounce_blurb_' + up).style.height = 0;
			
			document.getElementById('bounce_blurb_' + down).style.top = bounceSpaceAbove[down] + bounceHeadingHeights[down] + 10 + 'px';
			
			interactiveListChildHeadings = document.getElementById('interactive_list').getElementsByTagName('h3');
			
			for(n = up + 1; n < down + 1; n++) {
				interactiveListChildHeadings[n].style.top = bounceSpaceAbove[n] + 'px';
			}
			
			holdAction = false;
		}
		else {
			offset = (n === 1) ? 7.5 : 0;
			
			document.getElementById('bounce_blurb_' + down).style.height = (offset + downHeight + Math.pow(1.5, n)) + 'px';
			document.getElementById('bounce_blurb_' + up).style.height = (maxHeight + 7.5 - (downHeight + Math.pow(1.5, n))) + 'px';
			
			document.getElementById('bounce_blurb_' + down).style.top = bounceSpaceAbove[down] + bounceHeadingHeights[down] + 10 + (maxHeight - (downHeight + Math.pow(1.5, n))) + 'px';
			
			interactiveListChildHeadings = document.getElementById('interactive_list').getElementsByTagName('h3');
			
			for(n = up + 1; n < down + 1; n++) {
				interactiveListChildHeadings[n].style.top = bounceSpaceAbove[n] + (maxHeight - (downHeight + Math.pow(1.5, n))) + 'px';
			}
		}
		
		setTimeout('slideSwitch(' + up + ', ' + down + ', ' + (n + 1) + ')', 1);
	}
}

function slideSwitchBounce(up, down, n) {
	up = parseInt(up);
	down = parseInt(down);
	
	upHeight = parseFloat(document.getElementById('bounce_blurb_' + up).style.height);
	downHeight = parseFloat(document.getElementById('bounce_blurb_' + down).style.height);
	
	if(downHeight < maxHeight) {
		if(maxHeight - downHeight < Math.pow(1.25, n)) {
			document.getElementById('bounce_blurb_' + down).style.height = maxHeight + 'px';
			document.getElementById('bounce_blurb_' + up).style.display = 'none';
			document.getElementById('bounce_blurb_' + up).style.height = 0;
			
			document.getElementById('bounce_blurb_' + up).style.top = bounceSpaceAbove[up] + bounceHeadingHeights[up] + 10 + 'px';
			
			interactiveListChildHeadings = document.getElementById('interactive_list').getElementsByTagName('h3');
			
			for(n = down + 1; n < up + 1; n++) {
				interactiveListChildHeadings[n].style.top = bounceSpaceAbove[n] + maxHeight + 'px';
			}
			
			setTimeout('slideSwitchBounceDo(' + up + ', ' + down + ', 1, 1)', 1);
		}
		else {
			offset = (n === 1) ? 7.5 : 0;
			
			document.getElementById('bounce_blurb_' + down).style.height = (offset + downHeight + Math.pow(1.25, n)) + 'px';
			document.getElementById('bounce_blurb_' + up).style.height = (maxHeight + 7.5 - (downHeight + Math.pow(1.25, n))) + 'px';
			
			document.getElementById('bounce_blurb_' + up).style.top = bounceSpaceAbove[up] + bounceHeadingHeights[up] + 10 + ((downHeight + Math.pow(1.25, n))) + 'px';
			
			interactiveListChildHeadings = document.getElementById('interactive_list').getElementsByTagName('h3');
			
			for(n = down + 1; n < up + 1; n++) {
				interactiveListChildHeadings[n].style.top = bounceSpaceAbove[n] + ((downHeight + Math.pow(1.25, n))) + 'px';
			}
			
			setTimeout('slideSwitchBounce(' + up + ', ' + down + ', ' + (n + 1) + ')', 1);
		}
	}
}
function slideSwitchBounceDo(up, down, n, round) {
	up = parseInt(up);
	down = parseInt(down);
	
	upHeight = parseFloat(document.getElementById('bounce_blurb_' + up).style.height);
	downHeight = parseFloat(document.getElementById('bounce_blurb_' + down).style.height);
	
	switch(n) {
		case 1:
			switch(round) {
				case 1: offset = -2; n = 1; round = 2; break;
				case 2: offset = -5; n = 1; round = 3; break;
				case 3: offset = -8; n = 1; round = 4; break;
				case 4: offset = -12; n = 1; round = 5; break;
				case 5: offset = -15; n = 1; round = 6; break;
				case 6: offset = -15; n = 1; round = 7; break;
				case 7: offset = -12; n = 1; round = 8; break;
				case 8: offset = -8; n = 1; round = 9; break;
				case 9: offset = -5; n = 1; round = 10; break;
				case 10: offset = -2; n = 1; round = 11; break;
				case 11: offset = 0; n = 2; round = 1; break;
			}
			
			break;
			
		case 2:
			switch(round) {
				case 1: offset = -2; n = 2; round = 2; break;
				case 2: offset = -5; n = 2; round = 3; break;
				case 3: offset = -5; n = 2; round = 4; break;
				case 4: offset = -2; n = 2; round = 5; break;
				case 5: offset = 0; n = 3; round = 1; break;
			}
			
			break;
	}
	
	//document.getElementById('bounce_blurb_' + down).style.height = maxHeight + offset + 'px';
	document.getElementById('bounce_blurb_' + up).style.height = (-1 * offset + 7.5) + 'px';
	
	document.getElementById('bounce_blurb_' + up).style.top = bounceSpaceAbove[up] + bounceHeadingHeights[up] + 10 + offset + 'px';
	
	interactiveListChildHeadings = document.getElementById('interactive_list').getElementsByTagName('h3');
	
	for(i = down + 1; i < up + 1; i++) {
		interactiveListChildHeadings[i].style.top = bounceSpaceAbove[i] + maxHeight + offset + 'px';
	}
	
	if(n < 3) {
		setTimeout('slideSwitchBounceDo(' + up + ', ' + down + ', ' + n + ', ' + round + ')', 30);
	}
	else {
		holdAction = false;
	}
}

function slideDown(bounceId, n) {
	currentHeight = parseFloat(document.getElementById('bounce_blurb_' + bounceId).style.height);
	
	if(currentHeight < maxHeight) {
		if(maxHeight - currentHeight < Math.pow(1.25, n)) {
			document.getElementById('bounce_blurb_' + bounceId).style.height = maxHeight + 'px';
			holdAction = false;
		}
		else {
			offset = (n === 1) ? 7.5 : 0;
			
			document.getElementById('bounce_blurb_' + bounceId).style.height = (offset + currentHeight + Math.pow(1.25, n)) + 'px';
			
			bounceId = parseInt(bounceId);
			
			if((bounceId + 1) < bounceItems) {
				interactiveListChildHeadings = document.getElementById('interactive_list').getElementsByTagName('h3');
				
				for(n = bounceId + 1; n < bounceItems; n++) {
					interactiveListChildHeadings[n].style.top = bounceSpaceAbove[n] + currentHeight + Math.pow(1.25, n) + 'px';
				}
			}
		}
		
		setTimeout('slideDown('+bounceId+', ' + (n + 1) + ')', 1);
	}
}

function createBounce() {
	if(document.getElementById('interactive_list')) {
		interactiveList = document.getElementById('interactive_list');
		
		interactiveList.style.position = 'relative';
		interactiveList.style.marginTop = '-12.5px';
		
		interactiveListChildHeadings = interactiveList.getElementsByTagName('h3');
		interactiveListChildBodies = interactiveList.getElementsByTagName('div');
		
		bounceItems = interactiveListChildHeadings.length;
		
		space = 0;
		
		if(interactiveListChildHeadings.length > 0) {
			for(i = 0; i < interactiveListChildHeadings.length; i++) {
				addEvent(interactiveListChildHeadings[i], 'mouseover', openBounce);
				
				if(i > 0) {
					bounceSpaceAbove[i] = bounceSpaceAbove[i - 1] + space;
				}
				else {
					bounceSpaceAbove[i] = 0;
				}
				
				bounceHeadingHeights[i] = interactiveListChildHeadings[i].offsetHeight;
				
				bounceItemHeights[i] = interactiveListChildBodies[i].offsetHeight + 7.5;
				
				space = bounceHeadingHeights[i] + 10;
				
				if(i > 0) {
					if(bounceItemHeights[i] > maxHeight) {
						maxHeight = bounceItemHeights[i];
					}
				}
				else {
					maxHeight = bounceItemHeights[i];
				}
				
				interactiveListChildBodies[i].style.display = 'none';
				
				interactiveListChildHeadings[i].style.position = 'absolute';
				interactiveListChildHeadings[i].style.top = bounceSpaceAbove[i] + 'px';
				
				interactiveListChildBodies[i].style.position = 'absolute';
				interactiveListChildBodies[i].style.top = bounceSpaceAbove[i] + bounceHeadingHeights[i] + 10 + 'px';
			}
			
			//alert(bounceItemHeights + maxHeight);
		}
	}
}

domReady(createBounce);

var currentProject = 0;
var totalProjects;

var currentItem = 0;
var totalItems;

function closeProject(e) {
	//alert('cls');
	
	if(currentProject > 0) {
		//document.getElementById('project_' + currentProject).className = 'project hide';
		//document.getElementById('projects').className = 'show';
		
		if(currentItem > 1) {
			document.getElementById('project_' + currentProject).getElementsByTagName('li')[currentItem - 1].className = 'item_' + currentItem + ' hide';
			document.getElementById('project_' + currentProject).getElementsByTagName('li')[0].className = 'item_1 show';
			
			currentItem = 1;
			
			setButtons();
		}
		
		currentProject = 0;
		currentItem = 0;
		totalItems = 0;
		
		hs.close(getTarget(e));
		cancelDefault(e);
	}
}

function openProject(e) {
	cancelDefault(e);
	
	if(currentProject === 0) {
		target = getTarget(e);
		
		caller = getParent(target, 'a');
		
		re = /\?view=([0-9]+)/
		
		res = caller.href.match(re)
		
		currentProject = res[1];
		currentItem = 1;
		totalItems = document.getElementById('project_' + currentProject).getElementsByTagName('li').length;
		
		hs.htmlExpand(getTarget(e), { contentId: 'project_' + currentProject, width: 590, height: 540, targetX: 'display', targetY: 'display' })
		
		//document.getElementById('project_' + currentProject).className = 'project show';
		//document.getElementById('projects').className = 'hide';
	}
}

function setButtons() {
	next = (currentItem === totalItems) ? false : true;
	
	previous = (currentItem === 1) ? false : true;
	
	pid = 'project_' + currentProject;
	
	if(document.getElementById(pid + '_next')) {
		if(!next) {
			document.getElementById(pid + '_right_actions').removeChild(document.getElementById(pid + '_next'));
		}
	}
	else if(next) {
		nextItem = createElement('a');
		nextItem.className = 'next';
		nextItem.setAttribute('title', 'Next');
		nextItem.setAttribute('id', pid + '_next');
		nextItem.setAttribute('href', '/?view' + currentProject + '&amp;item=' + currentItem - 1);
		
		addEvent(nextItem, 'click', nextProjectItem);
		
		document.getElementById(pid + '_right_actions').appendChild(nextItem);
	}
	
	if(document.getElementById(pid + '_previous')) {
		if(!previous) {
			document.getElementById(pid + '_left_actions').removeChild(document.getElementById(pid + '_previous'))
		}
	}
	else if(previous) {
		previousItem = createElement('a');
		previousItem.className = 'previous';
		previousItem.setAttribute('title', 'Previous');
		previousItem.setAttribute('id', pid + '_previous');
		previousItem.setAttribute('href', '/?view' + currentProject + '&amp;item=' + currentItem - 1);
		
		addEvent(previousItem, 'click', previousProjectItem);
		
		document.getElementById(pid + '_left_actions').appendChild(previousItem);
	}
}

function nextProjectItem(e) {
	cancelDefault(e);
	
	if(currentItem < totalItems) {
		document.getElementById('project_' + currentProject).getElementsByTagName('li')[currentItem - 1].className = 'item_' + currentItem + ' hide';
		
		currentItem = currentItem + 1
		
		document.getElementById('project_' + currentProject).getElementsByTagName('li')[currentItem - 1].className = 'item_' + currentItem + ' show';
		
		setButtons();
	}
}

function previousProjectItem(e) {
	cancelDefault(e);
	
	if(currentItem > 1) {
		document.getElementById('project_' + currentProject).getElementsByTagName('li')[currentItem - 1].className = 'item_' + currentItem + ' hide';
		
		currentItem = currentItem - 1
		
		document.getElementById('project_' + currentProject).getElementsByTagName('li')[currentItem - 1].className = 'item_' + currentItem + ' show';
		
		setButtons();
	}
}

/*function closeProject2(e) {
	alert('cls');
	hs.close(getTarget(e));
	cancelDefault(e);
}*/

function createDisplay() {
	/*if(document.getElementById('display')) {
		displayBase = document.getElementById('display');
		
		if(!document.getElementById('projects')) {
			return;
		}
		
		projectListing = document.getElementById('projects').getElementsByTagName('li');
		
		
		totalProjects = projectListing.length;
		
		for(n = 0; n < totalProjects; n++) {
			imgs = projectListing[n].getElementsByTagName('img')
			
			for(i = 1; i < imgs.length; i++) {
				alert(n + '+' + i);
				addEvent(imgs[i], 'click', closeProject2);
			}
		}
	}*/
	
	return;
	if(document.getElementById('display')) {
		displayBase = document.getElementById('display');
		
		if(!document.getElementById('projects')) {
			return;
		}
		
		projectListing = document.getElementById('projects').getElementsByTagName('li');
		
		totalProjects = projectListing.length;
		
		for(n = 0; n < totalProjects; n++) {
			if(document.getElementById('project_' + (n + 1))) {
				project = document.getElementById('project_' + (n + 1));
				
				addEvent(projectListing[n].getElementsByTagName('a')[0], 'click', openProject);
				
				addEvent(document.getElementById('project_' + (n + 1) + '_close'), 'click', closeProject);
				
				if(document.getElementById('project_' + (n + 1) + '_next')) {
					addEvent(document.getElementById('project_' + (n + 1) + '_next'), 'click', nextProjectItem);
				}
				
				if(document.getElementById('project_' + (n + 1) + '_previous')) {
					addEvent(document.getElementById('project_' + (n + 1) + '_previous'), 'click', previousProjectItem);
				}
				
				items = project.getElementsByTagName('img');
				
				for(i = 0; i < items.length; i++) {
					items[i].className = 'minimise';
					addEvent(items[i], 'click', closeProject);
				}
			}
		}
		
		if(document.getElementById('projects').className === 'show') {
			currentProject = 0;
			currentItem = 0;
			totalItems = 0;
		}
		else {
			for(n = 0; n < totalProjects; n++) {
				if(document.getElementById('project_' + (n + 1))) {
					project = document.getElementById('project_' + (n + 1));
					
					if(project.className === 'project show') {
						currentProject = n + 1;
						
						items = project.getElementsByTagName('li');
						
						totalItems = items.length;
						
						for(i = 0; i < totalItems; i++) {
							if(items[i].className === 'item_' + (i + 1) + ' show') {
								currentItem = i + 1;
								
								break;
							}
						}
						
						break;
					}
				}
			}
		}
	}
}


//addLoadEvent(createDisplay);
