/*	Global variable, e.g. used in cookie code
	(looks up to DominoWiki config. document)
*/
var HOST = 'anthonyholmes.com';
function editPage(frm)
{
	// Called by EditPage button in main form
	var subj = frm.Subject.value;
	document.location = "/wiki.nsf/Pages/" + subj + "?Edit";
}
function showLogin()
{
	open("/wiki.nsf/LoginDetails?OpenPage",
		"YourDetails","menubar=no,scrollbars=yes,width=500,height=455");
}
/*
*	Copyright (c) 1996-1997 Athenia Associates.
*	http://www.webreference.com/js/
*	License is granted if and only if this entire
*	copyright notice is included. By Tomer Shiran.
*/
function setCookie(name, value, expires, path, domain, secure)
{
	var curCookie = name + "=" + escape(value) + ((expires) ? "; expires=" +
	expires.toGMTString() : "") + ((path) ? "; path=" + path : "") +
	((domain) ? "; domain=" + domain : "") + ((secure) ? "; secure" : "");
	document.cookie = curCookie;
}
function getCookie(name)
{
	var prefix = name + '=';
	var c = document.cookie;
	var nullstring = '';
	var cookieStartIndex = c.indexOf(prefix);
	if (cookieStartIndex == -1) return nullstring;
	
	var cookieEndIndex = c.indexOf(";", cookieStartIndex + prefix.length);
	if (cookieEndIndex == -1) cookieEndIndex = c.length;
	return unescape(c.substring(cookieStartIndex + prefix.length, cookieEndIndex));
}
function deleteCookie(name, path, domain)
{
	if (getCookie(name))
	{
		document.cookie = name + "=" + ((path) ? "; path=" + 
			path : "") + ((domain) ? "; domain=" + domain : "") +
			"; expires=Thu, 01-Jan-70 00:00:01 GMT";
	}
}
function fixDate(date)
{
	var base = new Date(0);
	var skew = base.getTime();
	if (skew > 0) date.setTime(date.getTime() - skew);
}
function rememberMe(f)
{
	var now = new Date();
	fixDate(now);
	now.setTime(now.getTime() + 365 * 24 * 60 * 60 * 1000);
	setCookie('cookiename', f.CookieName.value, now, '', HOST, '');
}
function forgetMe(f)
{
	deleteCookie('cookiename', '', HOST);
	f.CookieName.value = '';
}
function removeCheck()
{
	// Removes "isMinor" flag in newly opened Wiki docs
	var frm = document._Wiki;
	frm.isMinor.checked = false;
	frm.ChangeMade.value = "";
}
function updateCookiePrefs()
{
	// Used in LoginDetails page
	rememberMe(document.CookieForm);
	msg = LANG_JS_COOKIE_SET;
	if(confirm(msg)) window.close();
}
/**
* createBlankPage()
* 
* Triggered from link in site navigation. Prompts user for
* a page title & then creates blank page in edit mode with
* that title.
* 
* Changes:
* Julian Ward 26-Oct-2006: change to accommodate spaces
*
*/
function createBlankPage()
{
	var choice = prompt(LANG_JS_NEW_PG_PROMPT, "");
	if((choice=="") || (choice==null))
	{
		return;
	}
	else
	{
		var pg = trim(choice);
		if((pg=="") || (pg==null))
		{
			return;
		}
		else
		{
			pg = pg.replace(/ /g, "_");	// Julian's change
			document.location = "/wiki.nsf/wiki?openform&page=" + pg;
		}
	}
}
function rtrim(arg)
{
	while(1)
	{
		if(arg.substring(arg.length - 1, arg.length) != " ") break;
		arg = arg.substring(0, arg.length - 1);
	}
	
	return arg;
}
function ltrim(arg)
{
	while(1)
	{
		if(arg.substring(0, 1) != " ") break;
		arg = arg.substring(1, arg.length);
	}
	return arg;
}
/**
* trim()
* 
* Trims leading spaces from a passed-in string
*
*/
function trim(arg)
{
	var tmpstr = ltrim(arg);
	return rtrim(tmpstr);
}
/**
* START: code for diff functionality introduced in v1.1
*
*/
var URLPrefix;
/*
	Parses PreviousVersions derived from UNID of page being examined
	Displays a list of each version with radio buttons for selection
*/
function buildVersions()
{
	var strHTML = "";
	strVersions = document.getElementById("PreviousVersions").value;
	if (strVersions == "null")
	{
		strHTML = LANG_DIFF_MSG_NO_PREV;
	}
	else
	{
		aVersions = strVersions.split("|||");
		strHTML = "<table width='100%'>";
		strHTML += "<tr><th>" + LANG_DIFF_DESCR + "</th><th>" + LANG_DIFF_OLD + "</th><th>" + LANG_DIFF_NEW + "</th></tr>";
		strHTML += " <tr><td id=\"td_" + document.getElementById("docid").value + "\">";
		strHTML += "<a href=\"/" + document.getElementById("dbPath").value + "/Pages/" + getURLParam("page") + "\">(" + LANG_DIFF_CURRENT + ")</a></td>";
		strHTML += "<td><input type=\"radio\" value=\"\" style=\"display: none\" /></td>";
		strHTML += "<td><input type=\"radio\" value=\"" + document.getElementById("docid").value;
		strHTML += "\" id=\"newid\" name=\"newid\" onClick=\"updateNewID(this.value)\" checked=\"checked\" style=\"display: block\" /></td></tr>";
		updateNewID(document.getElementById("docid").value);
		var checked = "checked";
		for (var i=0; i<aVersions.length; i++)
		{
			var data = aVersions[i].split("@@@");
			var strID = data[1];
			var strDesc = data[0];
			strHTML += "<tr><td id=\"td_" + strID + "\">" + strDesc + "</td>";
			
			strHTML += "<td><input type=\"radio\" value=\"" + strID + "\" id=\"oldid\" name=\"oldid\" onClick=\"updateOldID(this.value)\" ";
			if (checked != "")
			{
				strHTML += "checked=\"" + checked + "\" ";
				checked = "";
				updateOldID(strID);
			}
			strHTML += "style=\"display: block\" /></td>";
			if (i < (aVersions.length - 1))
				strHTML += "<td><input type=\"radio\" value=\"" + strID + "\" id=\"newid\" name=\"newid\" onClick=\"updateNewID(this.value)\" style=\"display: none\" /></td>";
			else
				strHTML += "<td></td>";
			strHTML += "</tr>";
		}
		strHTML += "</table>";
		document.getElementById("gobutton").style.display = "block";
	}
	document.getElementById("versions").innerHTML = strHTML;
	diffCheck();
}
/*
 * Javascript Diff Algorithm
 *  By John Resig (http://ejohn.org/)
 *  Modified by Chu Alan "sprite"
 *  Modified by Matthew White (http://11tmr.com)
 *
 * More Info:
 * http://ejohn.org/projects/javascript-diff-algorithm/
 */
function diffString(o, n)
{
	o = o.replace(/\s+$/, '');
	n = n.replace(/\s+$/, '');
	var out = diff(o == "" ? [] : o.split(/\s+/), n == "" ? [] : n.split(/\s+/) );
	var oSpace = o.match(/\s+/g);
	if (oSpace == null) {
		oSpace = ["\n"];
	} else {
		oSpace.push("\n");
	}
	var nSpace = n.match(/\s+/g);
	if (nSpace == null) {
		nSpace = ["\n"];
	} else {
		nSpace.push("\n");
	}
	var os = "";
	var colors = new Array();
	for (var i = 0; i < out.o.length; i++) {
		colors[i] = "rgb(\"100%, 100%, 100%\")";
		if (out.o[i].text != null) {
			os += escape(out.o[i].text) + oSpace[i];
		} else {
			os += "<del>" + escape(out.o[i]) + oSpace[i] + "</del>";
		}
	}
	var ns = "";
	for (var i = 0; i < out.n.length; i++) {
		if (out.n[i].text != null) {
			ns += escape(out.n[i].text) + nSpace[i];
		} else {
			ns += "<ins>" + escape(out.n[i]) + nSpace[i] + "</ins>";
		}
	}
	var strReturn = new Array(os, ns);
	return strReturn;
}
function diff(o, n)
{
  var ns = new Object();
  var os = new Object();
  
  for ( var i = 0; i < n.length; i++ ) {
    if ( ns[ n[i] ] == null )
      ns[ n[i] ] = { rows: new Array(), o: null };
    ns[ n[i] ].rows.push( i );
  }
  
  for ( var i = 0; i < o.length; i++ ) {
    if ( os[ o[i] ] == null )
      os[ o[i] ] = { rows: new Array(), n: null };
    os[ o[i] ].rows.push( i );
  }
  
  for ( var i in ns ) {
    if ( ns[i].rows.length == 1 && typeof(os[i]) != "undefined" && os[i].rows.length == 1 ) {
      n[ ns[i].rows[0] ] = { text: n[ ns[i].rows[0] ], row: os[i].rows[0] };
      o[ os[i].rows[0] ] = { text: o[ os[i].rows[0] ], row: ns[i].rows[0] };
    }
  }
  
  for ( var i = 0; i < n.length - 1; i++ ) {
    if ( n[i].text != null && n[i+1].text == null && n[i].row + 1 < o.length && o[ n[i].row + 1 ].text == null && 
         n[i+1] == o[ n[i].row + 1 ] ) {
      n[i+1] = { text: n[i+1], row: n[i].row + 1 };
      o[n[i].row+1] = { text: o[n[i].row+1], row: i + 1 };
    }
  }
  
  for ( var i = n.length - 1; i > 0; i-- ) {
    if ( n[i].text != null && n[i-1].text == null && n[i].row > 0 && o[ n[i].row - 1 ].text == null && 
         n[i-1] == o[ n[i].row - 1 ] ) {
      n[i-1] = { text: n[i-1], row: n[i].row - 1 };
      o[n[i].row-1] = { text: o[n[i].row-1], row: i - 1 };
    }
  }
  
  return { o: o, n: n };
}
/*
	loadXML
	Builds URL to request different versions of docs, submits request
*/
function loadXML()
{
	var urlArray = document.location.href.split("/");
	URLPrefix = urlArray[0] + "//" + urlArray[2];
	var oldid = document.getElementById("OldDoc").value;
	var newid = document.getElementById("NewDoc").value;
	
	var strURL = URLPrefix + "/" + document.getElementById("dbPath").value + "/diff?openagent&oldid=" + oldid + "&newid=" + newid;
	doXMLHTTPGet(strURL);
}
/*
	displayData
	Given XML from Ajax request, parses it and displays to user
*/
function displayData(xmlDoc)
{
	try
	{
		var root = xmlDoc.documentElement;
		var oldvalue = root.getElementsByTagName("oldvalue")[0];
		outputFields(oldvalue.getElementsByTagName("line"), "oldstring");
		var newvalue = root.getElementsByTagName("newvalue")[0];
		outputFields(newvalue.getElementsByTagName("line"), "newstring");
		
		var strOld = editReplace(document.getElementById("oldstring").value, "\n", "@@@");
		var strNew = editReplace(document.getElementById("newstring").value, "\n", "@@@");
		strOld = editReplace(outputText(oldvalue.getElementsByTagName("line")), "\n", "@@@");
		strNew = editReplace(outputText(newvalue.getElementsByTagName("line")), "\n", "@@@");
		var strOldDesc = document.getElementById("td_" + document.getElementById("OldDoc").value).innerHTML;
strOldDesc = strOldDesc + " <a href=\"#\" onclick=\"promote('" + document.getElementById("OldDoc").value + "');\">" + LANG_DIFF_PROMOTE_OPT + "</a>";
		var strNewDesc = document.getElementById("td_" + document.getElementById("NewDoc").value).innerHTML;
		var returnarray = diffString(strOld, strNew);
		
		strOld = editReplace(returnarray[0], "@@@", "<br />");
		strNew = editReplace(returnarray[1], "@@@", "<br />");
		
		var strHTML = "<table width='100%'><tr><th>" + strOldDesc + "</th><th>" + strNewDesc + "</th></tr>";
		strHTML += "<tr><td valign=\"top\" width=\"50%\" cellpadding=\"0\" cellspacing=\"0\">" + strOld + "</td><td valign=\"top\" width=\"50%\" cellpadding=\"0\" cellspacing=\"0\">" + strNew + "</td></tr></table>";
		document.getElementById("diff").innerHTML = strHTML;
		document.getElementById("gobutton").style.display = "none";
		document.getElementById("versions").style.display = "none";
		document.getElementById("backbutton").style.display = "block";
	}
	catch (e)
	{
		alert(e. message + " (" + e.name + ")");
	}
}
/*
	outputFields
	Gets all content from an array of XMLDOM nodes and appends together
*/
function outputFields(nodelist, fieldName)
{
	var strText = "";
	for (i=0; i<nodelist.length; i++)
	{
		strText += unescape(getInnerText(nodelist[i])) + "\n";
	}
	document.getElementById(fieldName).value = strText;
}
function outputText(nodelist)
{
	var strText = "";
	for (i=0; i<nodelist.length; i++)
	{
		strText += unescape(getInnerText(nodelist[i])) + "\n";
	}
	return strText;
}
/*
	doXMLHTTPGet
	Performs XMLHTTPRequest back to server (diff agent) to get
	the two different versions of document which we are comparing
*/
function doXMLHTTPGet(vurl)
{
	var returnData = null;
	if (window.XMLHttpRequest)
	{
		// Sane browser
		httpObj=new XMLHttpRequest()
	}
	else if (window.ActiveXObject)
	{
		// IE/Win
		httpObj=new ActiveXObject("Microsoft.XMLHTTP")
	}
	// Return the XML document when it has finished loading
	httpObj.onreadystatechange= function()
		{
			if (httpObj.readyState==4)
			{
				if (httpObj.status==200)
				{
					displayData(httpObj.responseXML);
				}
				else
				{
					alert(LANG_JS_XML_RETRIEVAL + httpObj.statusText)
				}
			}
		}
	// Request the XML document
	httpObj.open("GET",vurl,true)
	httpObj.send(null)
}
/*
	getInnerText function courtesy of Martin Honnen
	http://www.thescripts.com/forum/threadedpost582930.html
*/
function getInnerText (node)
{
	if (typeof node.textContent != 'undefined')
	{
		return node.textContent;
	}
	else if (typeof node.innerText != 'undefined')
	{
		return node.innerText;
	}
	else if (typeof node.text != 'undefined')
	{
		return node.text;
	}
	else
	{
		switch (node.nodeType)
		{
			case 3:
			case 4:
				return node.nodeValue;
				break;
			case 1:
			case 11:
				var innerText = '';
				for (var i = 0; i < node.childNodes.length; i++)
				{
					innerText += getInnerText(node.childNodes[i]);
				}
				return innerText;
				break;
			default:
				return '';
		}
	}
}
/*
	updateOldID
	Called whenever one of the left hand column of radio buttons is clicked
	Registers the selected document and refreshes the radio button display
*/
function updateOldID(strID)
{
	diffCheck();
	document.getElementById("OldDoc").value = strID;
	displayGoButton();
}
/*
	updateNewID
	Called whenever one of the right hand column of radio buttons is clicked
	Registers the selected document and refreshes the radio button display
*/
function updateNewID(strID)
{
	diffCheck();
	document.getElementById("NewDoc").value = strID;
	displayGoButton();
}
/*
	diffCheck
	Works out which radio buttons to allow the user to select
*/
function diffCheck()
{
	var dli = false; // the li where the diff radio is checked
	var oli = false; // the li where the oldid radio is checked
	hf = document.getElementById('versions');
	if (!hf)
		return;
	lis = hf.getElementsByTagName('tr');
	for (i=0;i<lis.length;i++) {
		inputs = lis[i].getElementsByTagName('input');
		if (inputs[1] && inputs[0]) {
			if (inputs[1].checked || inputs[0].checked) { // this row has a checked radio button
				if (inputs[1].checked && inputs[0].checked && inputs[0].value == inputs[1].value)
					return false;
				if (oli) { // it's the second checked radio
					if (inputs[1].checked) {
						oli.className = "selected";
						return false 
					}
				} else if (inputs[0].checked) {
					return false;
				}
				if (inputs[0].checked)
					dli = lis[i];
				if (!oli)
					inputs[0].style.display = 'none';
				if (dli)
					inputs[1].style.display = 'none';
				lis[i].className = "selected";
				oli = lis[i];
			}  else { // no radio is checked in this row
				if (!oli)
					inputs[0].style.display = 'none';
				else
					inputs[0].style.display = 'block';
				if (dli)
					inputs[1].style.display = 'none';
				else
					inputs[1].style.display = 'block';
				lis[i].className = "";
			}
		}
	}
}
/*
	displayGoButton
	Only enable the Go button when two radio buttons are selected
*/
function displayGoButton()
{
	if (document.getElementById("NewDoc").value != "" && document.getElementById("OldDoc").value != "")
	{
		document.getElementById("gobutton").disabled = false;
	}
}
/*
	getURLParam
	Gets a URL Parameter from href
*/
function getURLParam(strParamName)
{
	var strReturn = "";
	var strHref = window.location.href;
	if ( strHref.indexOf("?") > -1 )
	{
		var strQueryString = strHref.substr(strHref.indexOf("?")).toLowerCase();
		var aQueryString = strQueryString.split("&");
		for ( var iParam = 0; iParam < aQueryString.length; iParam++ ){
			if (aQueryString[iParam].indexOf(strParamName + "=") > -1 )
			{
				var aParam = aQueryString[iParam].split("=");
				strReturn = aParam[1];
				break;
			}
		}
	}
	return strReturn;
}
/*
	editReplace
	equivalent to @ReplaceSubstring using regex
*/
function editReplace(strTest, strFrom, strTo)
{
  var re = new RegExp(strFrom, "gim");
  if ( ! re.exec(strTest) )
  {
    return strTest;
  }
  return strTest.replace(re,strTo);
}
/*
	escape
	XML Encode a string
*/
function escape(s)
{
    var n = s;
    n = n.replace(/&/g, "&amp;");
    n = n.replace(/</g, "&lt;");
    n = n.replace(/>/g, "&gt;");
    n = n.replace(/"/g, "&quot;");
    return n;
}
/*
	unescape
	Decode an XML string
*/
function unescape(s)
{
	var n = s;
	n = n.replace(/&lt;/g, "<");
	n = n.replace(/&gt;/g, ">");
	n = n.replace(/&quot;/g, "\"");
	n = n.replace(/&amp;/g, "&");
	
	return n;
}
/*
	Given a UNID, promotes this version document to become
	the main wiki page for that content
*/
function promote(id)
{
	location.href="promote?openagent&unid=" + id;
}
/**
* END: code for diff functionality introduced in v1.1
*
*/
