/*******************************
 * (C) Stephen Rees
 * DTAG-JUE Javascript
 *
 * JUE script for DTAG
 * 
 * SVN tags
 * $Author: valorin $
 * $Revision: 649 $
 * $Date: 2008-02-15 10:55:33 +1100 (Fri, 15 Feb 2008) $
 *******************************/ 

var urlroot = "/";
var pagenumbers = new Array();
var timeoutLength = 5000; // Default request timeout :)
var openpages = 10;
var gearsEnabled = false;
var debug = true;
var showDebug = false;

var pagenum = 1;
var startnum = 1;
var pageanchors = new Array();
var pageid = 1;
var pageids = new Array();
var overrideFirst = false;

var remember = new Array();
    remember['pageinfo'] = "";
    remember['userinfo'] = "";

function dtagJueStart(){

	if (window.dtagGearsStart){
		dtagGearsStart();
	}
	
	pagenum = getLoadPage();
	setCurrentPage(pagenum);
	
	turnInitialPage(pagenum);
	
	parseJueLinks("gblmenu", 0);
	
	addRegoFunctions();
	
	specialLinkParse();
}


function getLoadPage(){

	// Get the page URL
	var anchor = document.location.hash.substr(1);
	var pagenum = 1;
	if (anchor == "resetpage1"){
		addDebug("Resetting Page to 1");
	}else if (anchor == "resetpage2"){
		addDebug("Resetting Page to 2");
		pagenum = 2;
	}else if (anchor.length > 0){
	
		if (anchor.substring(0,4) == "page"){
			parts = anchor.substring(4, anchor.length);
			
			parts = parts.split("-");

			pagenum = parts[0];
		}
	}else if (gearsEnabled){
		addDebug("Going to the 'lastpage': "+gearsSettings['lastpage']);
		pagenum = gearsSettings['lastpage'];
	}
	
	if (pagenum == 1){

		var urlpagenum = getPageNumUrl(document.location.pathname);
		if (urlpagenum > 0){
			pagenum = urlpagenum;
		}
	}

	return pagenum;
}


function getPageNumUrl(checkUrl){

	var base = urlroot + "page/";
	return parseInt(checkUrl.substring(base.length, checkUrl.length));
}


function setCurrentPage(pagenum){

	document.location = "#page" + pagenum;
}


function turnInitialPage(pagenum){

	if (document.location.toString().indexOf("?edit") > -1){
		
		addDebug("We were sent an edit page!");
	}else{

		addDebug("Turning initial page: "+pagenum);
		pagenumbers[0] = 1;
		turnNewPage(pagenum, 0);
	}
}


function turnNewPage(pagenum, pid){

	turnBackPages(pid);
	
	var pagediv = makeNewPage(pagenum, pagenumbers.length);
	pagenumbers[pagenumbers.length] = pagenum;

	addDebug("Turn new page"+pagenum+pagediv);
	getNewPage(pagenum, pagediv);
	if (pid == 0) document.getElementById(pagediv).setAttribute("class", "");
	
	if (gearsEnabled) saveGearsLastPage(pagenum);
}


function turnBackPages(pid){

	var numdivs = pagenumbers.length;
	
	while (pid < numdivs){
	
		var divname = "page"+pagenumbers[numdivs-1]+"-"+numdivs;
		removeDiv(divname);
		numdivs--;
		pagenumbers.splice(numdivs, 1);
	}
}


function makeNewPage(pagenum, pid){
	
	pid++;
	var nextpage = document.getElementById("nextpage");
	var newDiv = document.createElement("div");
	newDiv.setAttribute("id", "page"+pagenum+"-"+pid);
	newDiv.setAttribute("class", "newpages");
	
	var parent = nextpage.parentNode;
	parent.insertBefore(newDiv, nextpage)
	newDiv.innerHTML = "<span class='jueloader'></span>";

	if (pid > openpages) {
		var removeId = pid - openpages;
		removeDiv("page"+pagenumbers[removeId-1]+"-"+removeId);
	}
	
	return "page"+pagenum+"-"+pid;
}


function removeDiv(divname){

	addDebug("Remove Div: "+divname);
	var parent = document.getElementById(divname).parentNode;
	parent.removeChild(document.getElementById(divname));

}


function getNewPage(pagenum, pagediv){

	if (gearsEnabled){
		if (gears['loading']) {
			addDebug("Waiting for Gears to finish loading");
			setTimeout("getNewPage(\""+pagenum+"\", \""+pagediv+"\")", 500);
			return;
		}
		if (isOffline){
			
			addDebug("Offline page load");
			loadOfflinePage(pagenum, pagediv);
		}else{
		
			jueRequestPass(urlroot+"?jue&page="+pagenum, "", getNewPageGearsResponse, pagediv);
		}
	}else{
		
		jueRequestPass(urlroot+"?jue&page="+pagenum, "", getNewPageResponse, pagediv);
	}

}


function getNewPageResponse(response, pagediv){

	addDebug("Got the response back");
	var pagedata = JSON.parse(response);
	
	pagedata['bookmark'] = "";
	pagedata['gblmenu'] = document.getElementById("gblmenu").innerHTML;
	
	outputPageData(pagedata, pagediv);
}


function getNewPageGearsResponse(response, pagediv){

	addDebug("Got the response back");
	var pagedata = JSON.parse(response);
	
	pagedata['bookmark'] = "";
	pagedata['gblmenu'] = document.getElementById("gblmenu").innerHTML;
	
	outputPageData(pagedata, pagediv);
	savePage(pagedata);
}


function outputPageData(pagedata, pagediv){

	addDebug("Should be outputting stuff!!");
	document.getElementById(pagediv).innerHTML = pagedata['source'];
	document.getElementById("pageinfo").innerHTML = pagedata['pageinfo'];
	document.getElementById("userinfo").innerHTML = pagedata['userinfo'];
	document.getElementById("bookmark").innerHTML = pagedata['bookmark'];
	//document.getElementById("gblmenu").innerHTML = pagedata['gblmenu'];
	remember['userinfo'] = pagedata['userinfo'];
	remember['pageinfo'] = pagedata['pageinfo'];
	document.title = "DTAG :: "+pagedata['title'];
	
	if (pagenumbers.length > 1) document.location = "#"+pagediv;
	parseJueLinks(pagediv, pagenumbers.length);
}


function parseJueLinks(checkthis, pid){

	addDebug("Pasing links:"+checkthis+"("+pid+")");
	//Get PageURLs
	var anchors = document.getElementById(checkthis).getElementsByTagName("a");
	for (var i = 0; i < anchors.length; i++){
		if (anchors[i].className == "pagechoice"){
			anchors[i].className = "pid"+pid;
			anchors[i].addEventListener("click", clickTurnPage, true);
		}
	}
	
}


function clickTurnPage(event){

	if (typeof event == 'undefined'){
		event = window.event;
	}

	removeChoiceBold(this);
	var pid = this.className.substring(3, this.className.length);
	var pagenum = getPageNumUrl(this.pathname);
	
	addDebug(pagenum+"-"+pid);
	turnNewPage(pagenum, pid);

	setChoiceBold(this);
	stopDefaultAction(event);

	return false;
}


function removeChoiceBold(node){

	var checkNode = node;
	while (checkNode.parentNode.nodeName != "DIV"){
		checkNode = checkNode.parentNode;
	}
	var carrier = checkNode.parentNode.getElementsByTagName("a");
	for (var i = 0; i < carrier.length; i++){
		if (carrier[i].className.indexOf("pagechoicebold") > -1){
			carrier[i].setAttribute("class", carrier[i].className.substr(0, carrier[i].className.indexOf("pagechoicebold")));
		}
	}
}

function setChoiceBold(node){
	
	node.setAttribute("class", node.className + " pagechoicebold");
}


function stopDefaultAction(event) {
	event.returnValue = false;

	if (typeof event.preventDefault != "undefined") {
		event.preventDefault();
	}

	return true; 
}


function addRegoFunctions(){

	if (document.getElementById("registrationBox")){
	
		document.getElementById("username").onblur = checkRegoUser;
		document.getElementById("password").onblur = checkRegoPass;
		document.getElementById("ckpassword").onblur = checkRegoPass;
		document.getElementById("email").onblur = checkRegoEmail;
	}
}


function checkRegoUser(){

	if (document.getElementById("username").value != "") {
		jueRequest(urlroot+"?jue&regocheck", "username="+document.getElementById("username").value, checkRegoUserResponse);
	}else{
		document.getElementById("usernameError").innerHTML = "";
	}
}

function checkRegoUserResponse(response){

	document.getElementById("usernameError").innerHTML = response;
}

function checkRegoPass(){

	var pass = document.getElementById("password").value;
	var ckpass = document.getElementById("ckpassword").value;
	if (pass != "" && ckpass != "" && pass != ckpass){
		document.getElementById("passwordError").innerHTML = "Passwords do not match!";
	}else{
		document.getElementById("passwordError").innerHTML = "";
	}
}

function checkRegoEmail(){

	if (document.getElementById("email").value != "") {
		jueRequest(urlroot+"?jue&regocheck", "email="+document.getElementById("email").value, checkRegoEmailResponse);
	}else{
		document.getElementById("emailError").innerHTML = "";
	}
}

function checkRegoEmailResponse(response){

	document.getElementById("emailError").innerHTML = response;
}


function specialLinkParse(){

	document.getElementById("homepage").onclick = goToHome;
	document.getElementById("instructions").onclick = goToInstructions;
	document.getElementById("jumptohead").onclick = jumpToTop;
}


function goToHome(event){

	document.location.href = urlroot+"#page1";
	var startdiv = pagenumbers.length - openpages;
	var baseDiv = (startdiv < 0) ? 0 : startdiv;
	turnNewPage(1, baseDiv);
	document.location.href = "#header";
	//document.location.reload();

	stopDefaultAction(event);
}
 
function goToInstructions(event){

	document.location.href = urlroot+"#page2";
        var startdiv = pagenumbers.length - openpages;
        var baseDiv = (startdiv < 0) ? 0 : startdiv;
	turnNewPage(2, baseDiv);
	document.location.href = "#header";
	//document.location.reload();

	stopDefaultAction(event);
}

function jumpToTop(event){

	document.location.href = "#header";
	
	stopDefaultAction(event);
}










function gearsTurnPage(pageid, pagenum){

	addDebug("Requested PageID: "+pageid);
	if (isOffline){
		// Do offline stuff here!!
	}else{
		xmlhttpPost(urlroot+"?jue&page="+pageid, "", "page"+pagenum+"-"+pageid, true);
	}
}


function gearsOutputPageData(pagedata) {

	var result = db.execute("SELECT pageid FROM dtag_pages");
	var rows = 0;
	while (result.isValidRow()){
		rows++;
		result.next();
	}
	addDebug("Total Database Rows: "+rows);
	result.close();
	savePage(pagedata);
	
}




function turnPage(event) {

	if (typeof event == 'undefined'){
		event = window.event;
	}

	var thispagenum = pagenum;
	var i = pagenum;
	while (i > 0){
		var nodeck = this;
		while (nodeck.getAttribute("id") != "pagebody"){
			if (nodeck.getAttribute("id") == "page"+i+"-"+pageids[i]){
				thispagenum = i;
			}else if (nodeck.getAttribute("id") == "page"+i){
	                        thispagenum = i;
			}
			nodeck = nodeck.parentNode;
		}
		i--;
	}
	
	var str = this.getAttribute("href").match(/page\/(\d+)\//i);
	pageid = str[1];
	
	for (var i = 0; i < pageanchors[thispagenum].length; i++){
		pageanchors[thispagenum][i].setAttribute("class", "pagechoice");
	}	
	this.setAttribute("class", "pagechoicebold");

	turnBackPage(thispagenum);
	turnPageOutput(pageid);
		
	stopDefaultAction(event);

	return false;
}


function turnPageOutput(pageid){

	if (pagenum - startnum > 10){
		if (document.getElementById("page"+startnum+"-"+pageids[startnum])){
			var parent = document.getElementById("page"+startnum+"-"+pageids[startnum]).parentNode;
			parent.removeChild(document.getElementById("page"+startnum+"-"+pageids[startnum]));
		}else if (document.getElementById("page"+startnum)){
			var parent = document.getElementById("page"+startnum).parentNode;
			parent.removeChild(document.getElementById("page"+startnum));
		}
		startnum++;
	}
	pagenum++;
	pageids[pagenum] = pageid;
	var nextpage = document.getElementById("nextpage");
	var newDiv = document.createElement("div");
	newDiv.setAttribute("id", "page"+pagenum+"-"+pageid);
	if (!overrideFirst) newDiv.setAttribute("class", "newpages");
	
	var parent = nextpage.parentNode;
	parent.insertBefore(newDiv, nextpage)
	newDiv.innerHTML = "<span class='jueloader'></span>";
	
	doTurnPage(pageid, pagenum);
}


function doTurnPage(pageid, pagenum) {

	if (gearsEnabled){
	
		gearsTurnPage(pageid, pagenum);
	
	}else{
		xmlhttpPost(urlroot+"?jue&page="+pageid, "", "page"+pagenum+"-"+pageid, true);
	}
}

function zzturnBackPage(curpagenum){

	if (pagenum > curpagenum){
		for (var i = pagenum; pagenum > curpagenum; i--){
			if (document.getElementById("page"+i+"-"+pageids[i])){
				var parent = document.getElementById("page"+i+"-"+pageids[i]).parentNode;
				parent.removeChild(document.getElementById("page"+i+"-"+pageids[i]));
			}else if (document.getElementById("page"+i)){
				var parent = document.getElementById("page"+i).parentNode;
				parent.removeChild(document.getElementById("page"+i));
			}
			pagenum--;
		}
	}
}

function xmlhttpPost(strURL, query, updateID, pageturn) {

	var xmlHttpReq = false;
	var self = this;
	// Mozilla/Safari
	if (window.XMLHttpRequest) {
		self.xmlHttpReq = new XMLHttpRequest();
	}
	// IE
	else if (window.ActiveXObject) {
		self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
	}
	self.xmlHttpReq.open('POST', strURL, true);
	self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	self.xmlHttpReq.onreadystatechange = function() {
		if (self.xmlHttpReq.readyState == 4) {
			if (pageturn){
				outputPageData(self.xmlHttpReq.responseText, updateID);
			}else{
				document.getElementById(updateID).innerHTML = self.xmlHttpReq.responseText;
			}
		}
	}
	self.xmlHttpReq.send("q="+query);
}

function dddoutputPageData(response, updateID){

	var pagedata = JSON.parse(response);
	if (gearsEnabled){
		gearsOutputPageData(pagedata);
	}
	document.getElementById(updateID).innerHTML = pagedata['source'];
	document.getElementById("pageinfo").innerHTML = pagedata['pageinfo'];
	document.getElementById("userinfo").innerHTML = pagedata['userinfo'];
	document.title = "DTAG :: "+pagedata['title'];
	
	document.location = "#"+updateID;
	parsePageLinks(document.getElementById(updateID));
}


function parsePageLinks(checkthis){

	//Get PageURLs
	var anchors = checkthis.getElementsByTagName("a");
	var theanchors = new Array();
	for (var i = 0; i < anchors.length; i++){
		if (anchors[i].className == "pagechoice"){
			anchors[i].addEventListener("click", turnPage, true);
			theanchors.push(anchors[i]);
		}
	}
	pageanchors[pagenum] = theanchors;

	/*
	if (document.getElementById("savenewpage")){
		document.getElementById("savenewpage").addEventListener("click", saveNewPage, true);
		document.getElementById("savenewpage").setAttribute("type", "button");
		document.getElementById("cancelnewpage").addEventListener("click", cancelNewPage, true);
		document.getElementById("cancelnewpage").setAttribute("type", "button");
	}  */
}

/*
function cancelNewPage(event){

	if (typeof event == 'undefined'){
		event = window.event;
	}
	turnBackPage(pagenum-1);
	stopDefaultAction(event);
}

function saveNewPage(event){

	if (typeof event == 'undefined'){
		event = window.event;
	}
	
	var pagequery = "&linkwith="+document.getElementById("lockpage").value+";
	pagedata["pagesource"] = document.getElementById("pagesource").innerHTML;
	pagedata["linkwith"] = document.getElementById("linkwith").value;
	pagedata["lockpage"] = document.getElementById("lockpage").value;
	
	
	xmlhttpPost(urlroot+"?jue&savepage="+pageid, pagequery, "page"+pagenum, false);
	stopDefaultAction(event);
}
*/

















function jueRequest(url, query, fnaction){
	
	var request = setupJueRequest(url, true);
	request.onreadystatechange = function() {
		try {
			if (request.readyState == 4 && request.status == 200) {
				clearTimeout(reqTimeout);
				fnaction(request.responseText);
			}
		}catch (error){
			clearTimeout(reqTimeout)
		}
	}
	
	request.send(query);
	var reqTimeout = setTimeout(function() {  request.abort();  }, timeoutLength);
}

function jueRequestPass(url, query, fnaction, passthrough){

	var request = setupJueRequest(url, true);
	request.onreadystatechange = function() {
		try {
			if (request.readyState == 4 && request.status == 200) {
				clearTimeout(reqTimeout);
				fnaction(request.responseText, passthrough);
			}
		}catch (error){
			clearTimeout(reqTimeout)
		}
	}
	
	request.send(query);
	var reqTimeout = setTimeout(function() {  request.abort();  }, timeoutLength);
}

function jueRequestWait(url, query, fnaction){
	
	var request = setupJueRequest(url, false);
	request.onreadystatechange = function() {
		try {
			if (request.readyState == 4 && request.status == 200) {
				clearTimeout(reqTimeout);
				fnaction(request.responseText);
			}
		}catch (error){
			clearTimeout(reqTimeout)
		}
	}
	
	request.send(query);
	var reqTimeout = setTimeout(function() {  request.abort();  }, timeoutLength);
}

function jueRequestAbort(url, query, fnaction, fnabort){
	
	var aborted = false;
	var request = setupJueRequest(url, true);
	request.onreadystatechange = function() {
		if (aborted){  return;  }
		try {
			if (request.readyState == 4 && request.status == 200) {
				clearTimeout(reqTimeout);
				fnaction(request.responseText);
			}
		}catch (error){
			aborted = true;
			request.abort();
			clearTimeout(reqTimeout);
			fnabort();
		}
	}
	
	var reqTimeout = setTimeout(function() {  
		aborted = true;
		request.abort();
		fnabort();
		}, timeoutLength);
	request.send(query);
}

function setupJueRequest(url, async){

	var request = false;
	// Mozilla/Safari
	if (window.XMLHttpRequest) {
		request = new XMLHttpRequest();
	}
	// IE
	else if (window.ActiveXObject) {
		request = new ActiveXObject("Microsoft.XMLHTTP");
	}else {
		return false;
	}
	request.open('POST', url, async);
	request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	
	return request;
}


function toggleDebug(){

	if (showDebug){
		document.getElementById("gearsDebug").style.display = "none";
		document.getElementById("toggledebug").innerHTML = "Enable Debug Log";
		showDebug = false;
	}else{
		document.getElementById("gearsDebug").style.display = "inline";
		document.getElementById("toggledebug").innerHTML = "Disable Debug Log";
		showDebug = true;
	}
}




function addDebug(line){

    if (debug) {
        document.getElementById("gearsDebug").innerHTML+= line+"<br />";
    }
}


// Finally, set the onload script
window.onload = dtagJueStart;
