var locked = false, currentHash = '', content_div, print_a;

function onLoad()
{
	content_div = $('content_div');
	print_a = $('print_a');

	var menu = menuSystem('link_ul', {fadeInLength:100, fadeOutLength:300, fadeQuickLength:0, fadeInDelay:0, fadeQuickDelay:0, fadeOutDelay:200, fadeInterval:10, minOpacity:0, maxOpacity:100, onSelect:onSelect}, 1);
	activateBackButton();
	activateLinks(menu);
	activateSearch(menu);
	
	function onSelect(link)
	{
		document.title = 'Milo Adventist Academy - '+link.innerHTML.replace(/<[^>]*>/g, '');
		loadPage('/load/'+link.hashStr, content_div, function() { activateLinks(menu); });
		print_a.href = '/print/'+(currentHash = window.location.hash = link.hashStr);
		return false;
	}
}

function activateBackButton()
{
	window.setInterval(run, 250); // handles the back button, doesn't work in Opera, IE7 jumps past all the hash changes
	function run()
	{
		var hash = window.location.hash.substr(1);

		if(hash && hash != currentHash && locked == false)
		{
			var links = document.getElementsByTagName('a');
			for(var n = 0; n < links.length; n++)
			{
				if(links[n].hashStr == hash)
				{
					links[n].onclick();
					return;
				}
			}	
			// enables back button to work even if the link no longer exists
//			var link = document.createElement('a'); link.hashStr = hash;
//			loadPage(link, hash);
		}
		else if(hash == '' && hash != currentHash)
			$('home_a').onclick();
	}
}


function activateLinks(menu)
{
	var hash = window.location.hash.substr(1);

	var links = content_div.getElementsByTagName('a');
	for(var n = 0; n < links.length; n++)
		if(links[n].className == 'jsLink')
			activate(links[n]);

	function activate(link)
	{
		var oldClick = link.onclick;
		link.hashStr = link.href.match(/\.(?:com|net|org|us)\/([^\?&]*)/)[1];
		link.onclick = function()
		{
			if(menu.tryLink(link) == false)
				return false;
			else if(oldClick && oldClick != activate)
				return oldClick();
		};
	}
}


function loadPage(href, content_div, handler)
{
	locked = true;
	content_div.innerHTML = 'loading...';
	httpRequest(href, onLoad, onFail);
	
	function onFail(error)
	{
		alert('error: '+error.status+' '+error.responseText);
	}
	
	function onLoad(html)
	{
		content_div.innerHTML = html;
		var match = html.match(/\<script[^>]*\>([\s\S]*?)\<\/script\>/);
		if(match)
			eval(match[1]);
		handler();
		/*
		if(navigator.userAgent.match(/AppleWebKit|MSIE/i)) // this is a hack to get <style> tags to work in Safari and Internet Explorer
		{
			var match = html.match(/\<style[^>]*\>([\s\S]*?)\<\/style\>/);
			if(match)
			{
				var link = document.createElement('link');
				link.rel = 'stylesheet';
				link.type = 'text/css';
				link.href = 'style.php?'+hash;
				document.getElementsByTagName('head')[0].appendChild(link);
			}
		}
		*/
	}
	locked = false;
	return false;
}
	

function activateSearch(menu)
{
	var results_div = $('content_div'); //document.createElement('div'); results_div.id = 'search_div';
	var template = 
	'<p>This page is currently under development and may not generate accurate search results.  Please use the menu system to explore the site</p>'+
	'<h2 class="query">Search Results for "{query}"</h2>'+
	'<div id="searchResults">'+
	'	{result}<div><a href="{url}">{title}</a><p>{text}</p></div>{/result}'+
	'</div>'+
	'<div id="searchPages">'+
	'	<span>Displaying {current} of {count}</span>'+
	'	<ul>{page}<li><a href="search.php?offset={offset}">{number}</a></li>{/page}</ul>'+
	'</div>';
	
	var form = $('search');
	form.onsubmit = function()
	{
//		window.location.hash = '';
		results_div.innerHTML = 'loading...';
		jsonRequest('/search.php?query='+encodeURI(form.q.value), onSuccess, onFail);
		return false;
	}

	function onSuccess(obj)
	{
		var offset = parseInt(obj.offset);
		var html = template;
		html = html.replace(/\{result\}(.*?)\{\/result\}/, replaceResults);
		html = html.replace(/\{page\}(.*?)\{\/page\}/, replacePage);
		html = html.replace(/\{current\}/g, (offset < obj.count ? offset + 1 : obj.count)+' to '+(offset + 8 < obj.count ? offset + 8 : obj.count));
		html = html.replace(/\{([^\}]*)\}/g, function(_, key) { return obj[key]; });
		results_div.innerHTML = html;
		
		var links = $('searchResults').getElementsByTagName('a');
		for(var n = 0; n < links.length; n++)
			activateResult(links[n]);
		
		function activateResult(link)
		{
			//link.hashStr = link.href.match(/\.(?:com|net|org|us)\/([^\?&]*)/)[1];
//			var oldClick = link.onclick;
			if(link.href.match(/\.pdf$/))
			{
				var span = document.createElement('span'); span.className = 'pdf'; link.parentNode.replaceChild(span, link);
				var img = document.createElement('img'); img.src = '/images/pdf.jpg'; span.appendChild(img);
				span.appendChild(link);
			}
			var str = link.href = link.href.replace(/^.*?\.(net|org|com)/, '');
			link.onclick = function()
			{
				if(menu.tryLink(link) == false)
					return false;
				else return true;
				
				window.location.hash = this.href.replace(/^.*?\.(net|org|com)\//, '');
				return false;
			}
		}

		var links = $('searchPages').getElementsByTagName('a');
		for(var n = 0; n < links.length; n++)
		{
			links[n].onclick = function()
			{
				results_div.innerHTML = 'loading...';
				jsonRequest(this.href, onSuccess, onFail);
				return false;
			}
		}
		
		function replaceResults(_, str)
		{
			var strs = [];
			if(obj.results)
				for(var n = 0; n < obj.results.length; n++)
					strs.push(str.replace(/\{([^\}]*)\}/g, function(_, key) { return obj.results[n][key]; }));
			return strs.join('\n');
		}
		
		function replacePage(_, str)
		{
//			var start = offset > 8 * 5 ? (offset / 8) - 5 : 0; // should show 5 pages before
//			for(var n = start; n < start + 10 && (start + n) * 8 < obj.count; n++)
			var strs = [];
			for(var n = 0; n * 8 < obj.count; n++)
				strs.push(str.replace(/\{offset\}/g, n * 8).replace(/\{number\}/, n + 1));
			return strs.join('\n');
		}
	}
	
	function onFail(obj)
	{
		alert('search failed: '+obj.responseText+'\n'+obj.responseStatus);
	}
}


function activateAlumniPhotos(id)
{
	var content_div = document.body;
	var photos_div = $(id);
	var links = photos_div.getElementsByTagName('a');
	for(var n = 0; n < links.length; n++)
		activate(links[n], n);

	function activate(link, index)
	{
		link.onclick = function()
		{
			var back_div = document.createElement('div'); back_div.className = 'winBackground'; content_div.appendChild(back_div);
			var fore_div = document.createElement('div'); fore_div.className = 'winForeground'; content_div.appendChild(fore_div);
			var nav_div  = document.createElement('div'); nav_div.className  = 'nav';        fore_div.appendChild(nav_div);
			
			var prev_a   = document.createElement('a'); prev_a.href  = 'javascript:;'; prev_a.innerHTML = '<- prev'; prev_a.className  = 'prev_a';  prev_a.onclick  = prev;  nav_div.appendChild(prev_a);
			var close_a  = document.createElement('a'); close_a.href = 'javascript:;'; close_a.innerHTML = 'close';  close_a.className = 'close_a'; close_a.onclick = close; nav_div.appendChild(close_a);
			var next_a   = document.createElement('a'); next_a.href  = 'javascript:;'; next_a.innerHTML = 'next ->'; next_a.className  = 'next_a';  next_a.onclick  = next;  nav_div.appendChild(next_a);
			
			var match = link.href.match(/year=(\d+)&class=(\d+)/);
			var h2 = document.createElement('h2'); h2.className = 'title'; fore_div.appendChild(h2);
			var img = document.createElement('img'); img.src = link.firstChild.src.replace(/t\.jpg$/, '.jpg'); fore_div.appendChild(img);
			var div = document.createElement('div'); fore_div.appendChild(div);
			
			var title   = 'The Class of '+match[2]+'<div>Celebrating '+(match[1] - match[2])+' years of Friendship</div>';
			var caption = '';
			httpRequest(img.src.replace(/\.\w+$/, '.txt'), onLoad, onFail);
//			window.location.hash = link.href.match(/\?(.*)/)[1];
			
			function onLoad(text)
			{
				var tokens = text.split(/\n/);
				h2.innerHTML  = tokens[0] || title;
				div.innerHTML = tokens[1] || caption;
			}
			
			function onFail()
			{
				h2.innerHTML  = title 
				div.innerHTML = caption;
			}
			
			var img2 = new Image(); img2.src = links[(index + 1) % links.length].firstChild.src.replace(/t\.jpg$/, '.jpg'); // cache next image
			document.onkeydown = function(e)
			{
				var code = e ? e.keyCode : event.keyCode;
				switch(code)
				{
					case 39: next(); break;
					case 37: prev(); break;
					case 27: close(); break;
				}			
			}
			return false;

			function prev()  { close(); links[(index > 0 ? index : links.length) - 1].onclick(); }
			function next()  { close(); links[(index + 1) % links.length].onclick(); }
			function close() { content_div.removeChild(back_div); content_div.removeChild(fore_div); document.onkeydown = null; }
		};
	}
}

function activateStaff(id)
{
	var content_div = document.body; //$('content_div');
	var staff_div = $(id);
	var imgs = staff_div.getElementsByTagName('img');
	for(var n = 0; n < imgs.length; n++)
		activate(imgs[n], n);

	function activate(img, index)
	{
		img.style.cursor = 'pointer';
		img.onclick = function()
		{
			var back_div = document.createElement('div'); back_div.className = 'winBackground'; content_div.appendChild(back_div);
			var fore_div = document.createElement('div'); fore_div.className = 'winForeground'; content_div.appendChild(fore_div);
			var nav_div  = document.createElement('div'); nav_div.className  = 'nav';        fore_div.appendChild(nav_div);
			
			var prev_a   = document.createElement('a'); prev_a.href  = 'javascript:;'; prev_a.innerHTML = '<- prev'; prev_a.className  = 'prev_a';  prev_a.onclick  = prev;  nav_div.appendChild(prev_a);
			var close_a  = document.createElement('a'); close_a.href = 'javascript:;'; close_a.innerHTML = 'close';  close_a.className = 'close_a'; close_a.onclick = close; nav_div.appendChild(close_a);
			var next_a   = document.createElement('a'); next_a.href  = 'javascript:;'; next_a.innerHTML = 'next ->'; next_a.className  = 'next_a';  next_a.onclick  = next;  nav_div.appendChild(next_a);
			
			var current = img;
			while(current.parentNode != staff_div)
				current = current.parentNode;
			fore_div.appendChild(current.cloneNode(true));
			
			document.onkeydown = function(e)
			{
				var code = e ? e.keyCode : event.keyCode;
				switch(code)
				{
					case 39: next(); break;
					case 37: prev(); break;
					case 27: close(); break;
				}				
			}

			function prev()  { close(); imgs[(index > 1 ? index : imgs.length) - 1].onclick(); }
			function next()  { close(); imgs[(index + 1) % imgs.length].onclick(); }
			function close() { content_div.removeChild(back_div); content_div.removeChild(fore_div); document.onkeydown = null; }
		};
	}
}

/*
function positionContact()
{
	var link_div = $('link_div');
	var contact_div = $('contact_div');
	
	contact_div.style.marginTop = '50px';
	var diff = link_div.scrollHeight - contact_div.offsetHeight;
	var style = (contact_div.currentStyle) ? contact_div.currentStyle : getComputedStyle(contact_div, null);
	var margin = diff - contact_div.offsetTop - parseInt(style.marginBottom);
	if(margin > 0)
		contact_div.style.marginTop = (margin + 50)+'px';
}
*/


////  General scripts  ////
function $(id)
{
	return document.getElementById(id);
}

function dump(obj)
{
	var str = '';
	for(var key in obj)
		str += '['+key+'] => '+obj[key]+'\n';
	alert(str);
}

function httpRequest(url, onSuccess, onFail)
{
	if(window.XMLHttpRequest || window.ActiveXObject)
	{
		var request = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
		request.onreadystatechange = onStateChange;
		request.open('GET', url, true);
		request.send('');
	}
	else alert('XML request not supported, get a new browser!!!');
	
	function onStateChange()
	{
		if(request.readyState == 4) // 4 means done loading
		{
			if(request.status == 200)
				onSuccess(request.responseText);
			else if(onFail)
				onFail(request)
			else alert('Load Failed: status: '+request.status+": "+request.responseText);
		}
	}
}

function jsonRequest(url, onSuccess, onFail)
{
	httpRequest(url, convert, onFail);
	
	function convert(str)
	{
		var obj = eval('('+str+')');
		onSuccess(obj);
	}
}