// Written by Ian Henderson in 2005.  Copy and modify freely, as long as this line is present and unmodified.

function smoothInterpolate(progress)
{
	return(1-((Math.cos(progress * Math.PI)+1)/2));
}

function slideIn(obj, percent)
{
	var pixels = (smoothInterpolate(1.0 - percent) * -1.0 * obj.offsetHeight);
	obj.style.top = pixels + "px";
	obj.style.marginBottom = pixels + "px";
}
function slideOut(obj, percent)
{
	slideIn(obj, 1 - percent);
}
function slideLeft(obj, percent)
{
	obj.style.left = smoothInterpolate(percent) * -1 * (obj.offsetWidth + 20) + "px";
}
function slideRight(obj, percent)
{
	obj.style.left = smoothInterpolate(percent) * (obj.offsetWidth + 20) + "px";
}

function fadeIn(obj, percent)
{
	var opacity = smoothInterpolate(percent);
	if (opacity == 1) {
		opacity = 0.999;
	}
	obj.style.filter = "alpha(opacity:" + opacity * 100 + ")";
	obj.style.KhtmlOpacity = opacity;
	obj.style.MozOpacity = opacity;
	obj.style.opacity = opacity;
}

function fadeOut(obj, percent)
{
	fadeIn(obj, 1 - percent);
}

function slideAndFadeIn(obj, percent)
{
	slideAndFadeOut(obj, 1 - percent);
}

function slideAndFadeOut(obj, percent)
{
	fadeOut(obj, percent);
	var pixels = (smoothInterpolate(percent) * -1.0 * obj.offsetHeight);
	obj.style.marginBottom = pixels + "px";
	//obj.style.top = (-0.1 * pixels) + "px";
	obj.style.top = (pixels) + "px";
}

function removeNode(node)
{
	if (node.parentNode) {
		node.parentNode.removeChild(node);
	}
}

function correctDrawer(drawer)
{
	var pixels = -1.0 * drawer.offsetHeight;
	drawer.style.marginBottom = pixels + "px";
}

function convertJavaScriptLinks()
{
	var jslinks = document.getElementsByName("_jslink");
	var i;
	for (i=0; i<jslinks.length; i++) {
		jslinks[i].setAttribute("href", '#');
	}
}


var _canUseXMLHttp;

var oldXmlHttpRequestPage = xmlHttpRequestPage;

xmlHttpRequestPage = function(a,b,c,d,e) { loadingAnimation(); oldXmlHttpRequestPage(a,b,c,d,e) }

function init()
{
	if ((document.cookie.indexOf("js=no") != -1) || !createXMLHttpRequest()) {
		_canUseXMLHttp = false;
		return;
	}
	
	_canUseXMLHttp = true;
	var drawer = document.createElement("div");
	drawer.id = "drawer";
	addChild(document.getElementById("content"), drawer, true);
	correctDrawer(drawer);
	window.setInterval("checkSearch()", 1000);
	convertJavaScriptLinks();
	scaleImages();
}

function shouldSubmitNormally()
{
	return !_canUseXMLHttp;
}

var drawerText = "";
var drawerOpen = false;

var closeDrawerText = '<div id="closedrawer"><a onclick="closeDrawer()" href="#">^ close drawer ^</a></div>';

function finishReplaceDrawer(drawer)
{
	drawer.innerHTML = drawerText + closeDrawerText;
	correctDrawer(drawer);
	drawer.style.visibility = "visible";
	animate(drawer, slideIn, 500, false);
	drawerOpen = true;
	convertJavaScriptLinks();
	scaleImages();
}

function replaceDrawer(text)
{
	window.scrollTo(0, 0);
	drawerText = text;
	var drawer = document.getElementById("drawer");
	if (drawerOpen) {
		animate(drawer, slideOut, 500, 'finishReplaceDrawer(document.getElementById("drawer"))');
	} else {
		finishReplaceDrawer(drawer);
	}
}

function addChild(parent, child, before)
{
	if (before && parent.hasChildNodes()) {
		parent.insertBefore(child, parent.firstChild);
	} else {
		parent.appendChild(child);
	}
}

function replaceContentWithText(text, page)
{
	var contentElement = document.getElementById("content");
	while (contentElement.childNodes.length > 1) {
		contentElement.removeChild(contentElement.childNodes[1]);
	}
	var innerDiv = document.createElement("div");
	innerDiv.innerHTML = text;
	addChild(contentElement, innerDiv, false);
	convertJavaScriptLinks();
	scaleImages();
	setCurrentPage(page);
}


function closeDrawer()
{
	var drawer = document.getElementById("drawer");
	if (drawer && drawerOpen) {
		animate(drawer, slideOut, 500, 'document.getElementById("drawer").style.visibility="hidden";');
		drawerOpen = false;
	}
}

function loadPage(page, callback)
{
	xmlHttpRequestPage("page.php", page, "GET", callback, page);
}

function drawerContent(page)
{
	loadPage(page, "replaceDrawer");
}

function replaceContent(page)
{
	loadPage(page, "replaceContentWithText");
}

function loadingAnimate(obj, curr)
{
	fadeIn(obj, Math.abs(500.0 - (curr % 1000))/500.0);
}

function loadingAnimation()
{
	animateUntil(document.getElementById('giantcyborg'), loadingAnimate, "!loading()", "fadeIn(document.getElementById('giantcyborg'),1)");
}

function pageToSource(page)
{
	var source = "{";
	var first = true;
	for (i in page) {
		if (first) {
			first = false;
		} else {
			source += ",";
		}
		source += i + ":'" + page[i] + "'";
	}
	source += "}";
	return source;
}

function replaceMenu(text)
{
	var menu = document.getElementById("header");
	menu.innerHTML = text;
	animate(menu, slideIn, 500, "refreshPage()");
	convertJavaScriptLinks();
	scaleImages();
}

function refreshMenu()
{
	var menu = document.getElementById("header");
	animate(menu, slideOut, 500, 'loadPage({what: "Menu"}, "replaceMenu", false)');
	closeDrawer();
}

function finishLogin(page)
{
	if (page == "ok") {
		refreshMenu();
	} else {
		alert("Incorrect username or password.  Please try entering them again.");
	}
}

function finishLogout(page)
{
	refreshMenu();
}

function logIn(username, password, stay)
{
	if (!_canUseXMLHttp) {
		return true;
	}
	if (stay) {
		stay = "yes";
	} else {
		stay = "";
	}
	xmlHttpRequestPage("login.php", {username:username, password:password, stay:stay, xmlhttprequest:"yes"}, "POST", "finishLogin", false);
	return false;
}

function logOut()
{
	if (!_canUseXMLHttp) {
		window.location = "logout.php?xmlhttprequest=no";
		return;
	}
	xmlHttpRequestPage("logout.php", {xmlhttprequest:"yes"}, "GET", "finishLogout", false);
}

var ready = new Array();
var currentId = 0;

function readyId()
{
	currentId++;
	return currentId;
}

function dataReady(text, id)
{
	ready[id] = {error: false, text:text};
}

function dataError(id)
{
	ready[id] = {error: true};
}

function _runWhenReadyTimeout(id, string, code, notCode, timeout)
{
	if (ready[id]) {
		if (ready[id].error) {
			eval(notCode);
		} else {
			var replacedCode = code;
			if (string != false && string != '') {
				var re = new RegExp(string, 'g');
				replacedCode = replacedCode.replace(re, ready[id].text);
			}
			eval(replacedCode);
		}
		ready[id] = null;
	} else if (timeout > 0) {
		if (!string) {
			string = '';
		}
		var re = new RegExp("'", 'gi');
		window.setTimeout("_runWhenReadyTimeout('" + id + "', '" + string + "', '" + code.replace(re, "\\'") +  "', '" + notCode.replace(re, "\\'") +  "', " + (timeout - 100) + ")", 100);
	} else {
		eval(notCode);
	}
}

function runWhenReady(id, string, code, notCode)
{
	_runWhenReadyTimeout(id, string, code, notCode, 30000);
}

function postResponse(text)
{
	if (text && text.charAt(0) == '!') {
		alert("An error occurred: " + text.substring(1));
		return false;
	}
	return true;
}

function requestFinished(text, id)
{
	if (postResponse(text)) {
		dataReady(text, id.id);
	} else {
		dataError(id.id);
	}
}

function createObject(className, attribs)
{
	var id = readyId();
	attribs["__class"] = className;
	attribs["__xmlhttprequest"] = "yes";
	xmlHttpRequestPage("create.php", attribs, "POST", "requestFinished", {id:id});
	return id; // you can find the result with runWhenReady
}

function sendInvite(email, message)
{
	var id = readyId();
	xmlHttpRequestPage("invite.php", {email:email, message:message, "__xmlhttprequest":"yes"}, "POST", "requestFinished", {id:id})
	return id;
}

function editObject(className, objId, attribs)
{
	var rid = readyId();
	attribs["__class"] = className;
	attribs["id"] = objId;
	attribs["__xmlhttprequest"] = "yes";
	xmlHttpRequestPage("edit.php", attribs, "POST", "requestFinished", {id:rid});
	return rid; // you can find the result with runWhenReady
}

function deleteObject(className, objId)
{
	var really = confirm("Are you sure you want to delete this " + className + "?  You cannot undo this action.");
	if (!really) {
		return;
	}
	var attribs = {"__class":className, "id":objId, "__xmlhttprequest":"yes"};
	var rid = readyId();
	xmlHttpRequestPage("delete.php", attribs, "POST", "requestFinished", {id:rid});
	return rid; // you can find the result with runWhenReady
}

function deleteObjectAndRefresh(className, objId)
{
	runWhenReady(deleteObject(className, objId), false, "refreshPage()", "");
}

var _currentPage = false;

function setCurrentPage(page)
{
	_currentPage = page;
}

function currentPage()
{
	return _currentPage;
}

function currentThread()
{
	if (!_currentPage) {
		return '0';
	}
	if (_currentPage.what == 'Thread') {
		return '' + _currentPage.which;
	}
	return '0';
}

function frontPage()
{
	replaceContent({what:'FrontPage'})
}

function refreshPage()
{
	if (!currentPage()) {
		frontPage();
	} else {
		replaceContent(currentPage());
	}
}

function frontPageWhenReady(handle)
{
	runWhenReady(handle, "------", 'frontPage()', 'replaceContent({what:"Error",which:"An error ocurred, and I\'m not entirely sure why.  Sorry about that.  Hopefully it wasn\'t bad or something."})');
}

function objectOfEvent(event) // only works when click or dblclick or keypress
{
	if (event.currentTarget) {
		return event.currentTarget;
	} else if (event.srcElement) {
		var object = event.srcElement;
		while (object != null && !object.onmouseclicked && !object.ondblclick && !object.onkeyup && !object.onkeydown) {
			object = object.parentNode;
		}
		return object;
	} else {
		return false;
	}
}
