// 
// UPDATE THE TEMPLATE! This is regenerated from a template, your changes will be lost

var aUser = 47;

var msie = navigator.userAgent.toLowerCase().indexOf("msie") < 0 ? 0 : 1;

function d( phrase, force ) {
	if (	phrase && document.cookie && document.cookie.indexOf( "pauly" ) != -1 ) {
		if (	document && document.body ) {	
			var newDiv = document.createElement('div');
			newDiv.appendChild( document.createTextNode( phrase ));
			document.body.appendChild(newDiv);
		}
		// else {	alert( phrase );
		// }
	}
}

function killObject ( obj ) {
	obj.style.display = "none";
	obj.style.visibilty = "hidden";
}

function fadeObject ( obj, o ) {
	// o for opacity...
	var passed = parseInt( o );
	var newO = parseInt( passed + 10 );
	if (	newO < 80 ) {
		obj.style.opacity = '.' + newO;
		obj.style.filter = "alpha(opacity:" + newO + ")";
		// opacityID = window.setTimeout("sweetTitles.tipFade('" + newO + "')",20); // really a global?
	}
	else {	obj.style.opacity = '.80';
		obj.style.filter = "alpha(opacity:80)";
	}
}

function myInnerHtml ( target, content ) {
	// d( "myInnerHtml()" );
	if (	target && content ) {
		removeChildNodes( target );
		try {	target.appendChild( content );
		}
		catch ( e ) {
			// d( "myInnerHtml failed first time; " + e );
			try {	var body = content.getElementsByTagName('body')[0];
				target.appendChild( body );
				d( "Got body out of html" );
			}
			catch ( e ) {
				// d( "myInnerHtml still failed... resorting to innerHTML; " + e );
				target.innerHTML = content; // bah content not valid
			}
		}
	}
}

function removeChildNodes ( node ) {
	try {	var len = node.childNodes.length;
		// d( len + " child nodes" );
		for (	var i = len - 1; i >= 0; i -- ) {
			// d( "removing node " + i );
			node.removeChild( node.childNodes[i] );
		}
	}
	catch ( e ) {
		d( "Couldn't remove childnodes; " + e );
	}
}

function ajaxLoading ( ) {
	var ajaxLoadingImage = '';
	if (	ajaxLoadingImage == '' || ajaxLoadingImage.indexOf( "<" ) == 0 ) {
		ajaxLoadingImage = "/board/img/ajaxLoading.gif";
	}
	var img = document.createElement("img");
	img.src = ajaxLoadingImage;
	img.alt = "Loading results, please wait...";
	return img;
}

function explain ( elm ) {
	if (	elm && elm.attributes ) {
		for (	var i = 0; i < elm.attributes.length; i ++ ) {
			d( "attribute " + i + " is " + elm.attributes[i].name + ": " + elm.attributes[i].value );
			explain( elm.attributes[i] );
		}
	}
	// else {	d( elm + " has no attributes" );
	// }
}

function getHttpObject() {
	// d( "getHttpObject()" );
	var xmlhttp;
	/*@cc_on
	@if ( @_jscript_version >= 5 )
		try {
			xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (E) {
				xmlhttp = false;
			}
		}
	@else
		xmlhttp = false;
	@end @*/
	if (	! xmlhttp && typeof XMLHttpRequest != 'undefined' ) {
		try {	xmlhttp = new XMLHttpRequest();
		} catch (e) {
			xmlhttp = false;
		}
	}
	return xmlhttp;
}

function loadPage ( cBack, url ) {
	// var request = GXmlHttp.create();
	var request = getHttpObject();
	d( "url: " + url );
	request.open( "GET", url, true );
	request.onreadystatechange = function() {
		if (	request.readyState && request.readyState == 4 ) {
			if (	request.status && request.status == 200 ) {
				cBack( request );
			}
			// else {	d( "status is " + request.status );
			// }
		}
		// else {	d( "readyState is " + request.readyState );
		// }
	}
	request.send(null);
}

function loadPageIntoElement ( url, elem ) {
	// d( "Want to load " + url + " into " + elem.innerHTML );
	// loadPage( function ( request ) { elem.innerHTML = request.responseText }, url );
	loadPage( function ( request ) { myInnerHtml( elem, request.responseText ) }, url );
}


function randomNumber( max ) {
	// thanks to www.coolnerds.com for this
	var rNum = NaN;
	while ( isNaN( rNum )) {
		rNum = Math.floor( Math.random() * ( max ));
	}
	return rNum;
}

function GetCookie ( name ) {
	var dc = unescape( document.cookie );
	var v = null;
	d( "cookie is " + dc, 1 ); // failing when cookie has too much rogue stuff in it!
	var packedCookieName = 'gbbsEnv';
	if (	packedCookieName == "" || packedCookieName.indexOf( "<" ) == 0 ) {
		packedCookieName = "gbbsEnv";
	}
	var begin = dc.indexOf( packedCookieName + "=" )
	if (	begin != -1 ) {
		d( "begin is " + begin + ", we found " + packedCookieName );
		// var end = document.cookie.indexOf( ";", begin );
		// d( "end is " + end );
		// if (	end == -1 ) {
			end = dc.length;
			d( "found no ';', going right to the end" );
		// }
		var gbbsEnv = dc.substring( begin + packedCookieName.length + 1, end );
		d( packedCookieName + " is " + gbbsEnv );
		var gbbsArray = gbbsEnv.split( "&" );
		// d( "gbbsArray is " + gbbsArray );
		for (	var i = 0; i < gbbsArray.length; i ++ ) {
			if (	gbbsArray[i] == name ) {
				i ++;
				v = gbbsArray[i];
				d( "Got " + name + ", it's " + gbbsArray[i] );
			}
		}
	}
	// alert( "After gbbsArray, v is " + v );
	if (	v == null ) {
		var begin = dc.indexOf( "; " + name );
		if (	begin == -1 ) {
			d( "didn't find '; " + name + "=" + "' so looking at the beginning instead" );
			begin = dc.indexOf( name + "=" );
			if (	begin != 0 ) {
				d( "didn't find " + name + "=" + " at the beginning either" );
				begin = dc.indexOf( "&" + name + "&" );
				if (	begin != -1 ) {
					begin += 1;
				}
				else {	// d( "didn't find &" + name + "& either" );
					begin = dc.indexOf( name + "&" );
					if (	begin != 0 ) {
						d( "didn't find " + name + "& at the beginning either" );
						return null;
					}
				}
			}
		}
		else {	begin += 2;
			d( "found a cookie called " + name );
		}
		// d( "begin is " + begin + ", starting from point " );
		var end = document.cookie.indexOf( ";", begin );
		var endAmp = document.cookie.indexOf( "&", begin );
		// d( "end is " + end + " and endAmp is " + endAmp );
		if ((	end > 0 && endAmp > 0 && endAmp < end ) || ( end == -1 && endAmp > end )) {
			end = endAmp;
			// d( "now end is " + end );
		}
		if (	end == -1 ) {
			end = dc.length;
			d( "found no '; or &', going right to the end" );
		}
		// d( "again, dc is " + dc );
		v = dc.substring( begin + name.length + 1, end );
	}
	if (	! v.length ) {
		// d( "We got no value..." );
	}
	d( "Returning " + v );
	return v;
}
// From http://developer.apple.com/internet/safari/faq.html#anchor6
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 toggleElement( elementID ) {
	if (	document.getElementById ) {
		var element = document.getElementById( elementID );
		element.style.visibility = ( element.style.display != "inline" ) ? "visible" : "hidden";
		element.style.display = ( element.style.display != "inline" ) ? "inline" : "none";
	}
}

function toggleAdmin( message ) {
	toggleElement( "admin" + message );
}

function thisDomain( ) {
	// Get domain from location if pos
	var h = location.hostname;

	if (	! h || h == "" ) {
		h = 'http://www.clarkeology.com';
	}

	return h;
}





function addEvent( obj, type, fn ) {
	if (	obj.addEventListener ) {
		obj.addEventListener( type, fn, false );
		EventCache.add(obj, type, fn);
	}
	else if (	obj.attachEvent ) {
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
		EventCache.add(obj, type, fn);
	}
	else {	obj["on"+type] = obj["e"+type+fn];
	}
}

Array.prototype.inArray = function ( value ) {
	var i;
	for (	i=0; i < this.length; i++ ) {
		if (	this[i] === value ) {
			return true;
		}
	}
	return false;
};
	
var EventCache = function(){
	var listEvents = [];
	return {
		listEvents : listEvents,
		add : function(node, sEventName, fHandler){
			listEvents.push(arguments);
		},
		flush : function(){
			var i, item;
			for(i = listEvents.length - 1; i >= 0; i = i - 1){
				item = listEvents[i];
				if(item[0].removeEventListener){
					item[0].removeEventListener(item[1], item[2], item[3]);
				};
				if(item[1].substring(0, 2) != "on"){
					item[1] = "on" + item[1];
				};
				if(item[0].detachEvent){
					item[0].detachEvent(item[1], item[2]);
				};
				item[0][item[1]] = null;
			};
		}
	};
}();
addEvent(window,'unload',EventCache.flush);

function getEventSrc( e ) {
	if (!e) e = window.event;
	if (	e.originalTarget )
		return e.originalTarget;
	else if (	e.srcElement )
		return e.srcElement;
}
function findPosX( obj ) {
	var curleft = 0;
	if (	obj.offsetParent ) {
		while (	obj.offsetParent ) {
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if ( obj.x ) {
		curleft += obj.x;
	}
	return curleft;
}

function findPosY( obj ) {
	var curtop = 0;
	if (	obj.offsetParent ) {
		while (	obj.offsetParent ) {
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if ( obj.y ) {
		curtop += obj.y;
	}
	return curtop;
}

function getFromXml( obj, tag ) {
	try {
		// namespaces are handled by spec in moz, not in ie
		if (	msie || tag.indexOf(":") == - 1 ) {
			// d( "We're in IE or " + tag + " is a standard element..." );
			return obj.getElementsByTagName(tag)[0].firstChild.nodeValue;
		} 
		else {	// d( "We're not in IE and tag is " + tag );
			var schema;
			// d( "First part of tag is " + tag.substr( 0, tag.indexOf( ":" )));
			// Look up schema instead, duh
			switch ( tag.substr( 0, tag.indexOf( ":" ))) {
				case "geo":
					schema = "http://www.w3.org/2003/01/geo/wgs84_pos#";
					break;
				default:
					schema = "http://www.folkestonegerald.com/misc/fg.rdf";
					// d( "Defaulting to " + schema );
					break;
			}
			tag = tag.substr( tag.indexOf( ":" ) + 1 );
			// d( "Getting " + schema + ", " + tag );
			return obj.getElementsByTagNameNS(schema,tag)[0].firstChild.nodeValue;
		}
	}
	catch ( e ) {
		// d( e );
	}
}
// Make this an object not a function! Bit grubby, unfished, sorry...
// Ideally need to not crash out if we have two fields on the same page with the same name
// so not rely so much on getElementById

function ajaxPopUp( v, lastSearch ) {
	v.style.display = "none";
	var vname = v.id;
	var key = v.rel;
	var alt = v.alt;
	var c = v.className;
	var http = getHttpObject();
	var timeOut = null;
	var typingFlag = false;
	var delay = 2000;
	var script;
	if (	key == "amazon" ) {
		script = "/cgi-bin/jsInsert.cgi?mode=rss&";
	}
	else {	script = "/php/xml.php?mode=rss&";
	}
	var url = script + "table=" + key + "&v=";
	var amazonTest = /\/ASIN\/(\w+)/i;
	// d( "vname is " + vname );
	// d( "class is " + c );
	// var v = document.getElementById(vname); // v is obj, get rid of this
	var textField = document.getElementById(vname + 'Text');
	if (	! textField ) {
		// d( "didn't find textField, creating it" );
		textField = document.createElement("input");
		v.parentNode.appendChild(textField);
		textField.name = textField.id = vname + 'Text';
		// textField.value = alt;
		// textField.style.display = "inline";
	}
	var multiField = document.getElementById(vname + 'Multi');
	if (	! multiField ) {
		// d( "didn't find multiField, creating it" );
		multiField = document.createElement("select");
		v.parentNode.appendChild(multiField);
		multiField.name = multiField.id = vname + 'Multi';
		multiField.style.display = "none";
		addEvent( multiField, "change", multiSelect );
	}
	var im = document.getElementById(vname + 'Image');
	if (	! im ) {
		// d( "didn't find im, creating it" );
		var a = document.createElement("a");
		// addEvent( a, "click", "window.open('" + script + "?table=" + key + "','pop','width=400,height=400,scrolling=auto')" );
		a.href = script + "table=" + key;
		// d( "href is now " + a.href );
		a.target = "_new";
		v.parentNode.appendChild(a);
		// d( "Attached " + a + " to " + v.parentNode );
		im = document.createElement("img");
		a.appendChild(im);
		im.name = im.id = vname + "Image";
		im.style.verticalAlign = "bottom";
		im.style.border = "0";
		im.className = "gbbsPopUpIcon";
		im.alt = alt;
	}
	im.src = "/board/img/questionMark.gif";
	var infoSpan = document.getElementById(vname + 'Info');
	if (	! infoSpan ) {
		// d( "didn't find infoSpan, creating it" );
		infoSpan = document.createElement("span");
		v.parentNode.appendChild(infoSpan);
		infoSpan.name = infoSpan.id = vname + 'Info';
	}

	if (	v.value && v.value != 0 ) {
		// d( "Now we're ready to go, we have a value already so go straight to the pulldown" );
		textField.style.display = "none";
		multiField.style.visibility = "visible";
		multiField.style.display = "inline";
		multiField.options.length = 0;
		multiField.options[0] = new Option( alt, v.value );
		multiField.options[multiField.options.length] = new Option( "Let me type that again...", 0 );
		updateInfo();
		im.src = "/board/img/thumbsup.gif";
		multiField.options[0].selected = "true";
	}

	addEvent( textField, "focus", getReady );
	addEvent( textField, "keyDown", typing );
	addEvent( textField, "blur", doneTyping );
	addEvent( textField, "change", update );
	this.typing = typing;
	this.doneTyping = doneTyping;
	this.multiSelect = multiSelect;
	this.getReady = getReady;
	this.update = update; // not finished yet, doh!
	getReady();
	function updateInfo( someText ) {
		d( someText );
		if (	infoSpan ) {
			if (	! someText ) {
				someText = "";
			}
			// infoSpan.innerHTML = someText;
			myInnerHtml( infoSpan, someText );
		}
	}
	function getReady() {
		// d( "getReady(), delay is " + delay );
		timeOut = setTimeout( update, delay );
	}
	function multiSelect() {
		d( "multiSelect()" );
		if (	multiField.options[multiField.selectedIndex].value == 0 ) {
			d( "resetting inputs" );
			reset();
		}
		else {	
			d( "Set to " + multiField.options[multiField.selectedIndex].text );
			updateInfo();
			v.value = multiField.options[multiField.selectedIndex].value;
			im.src = "/board/img/thumbsup.gif";
		}
	}
	function reset() {
		d( "reset()" );
		multiField.style.display = "none";
		textField.style.display = "inline";
		v.value = 0;
		textField.value = "";
		textField.focus();
		updateInfo();
		im.src = "/board/img/questionMark.gif";
	}
	function handle( request ) {
		var items = request.responseXML.documentElement.getElementsByTagName("item");
		d( "Got " + items.length + " items in the rss" );
		if (	items.length ) {
			textField.style.display = "none";
			multiField.style.visibility = "visible";
			multiField.style.display = "inline";
			multiField.options.length = 0;
			for (	var i = 0; i < items.length; i ++ ) {
				// d( i );
				var t = getFromXml( items[i], 'title' );
				var id = getFromXml( items[i], 'guid' );
				multiField.options[i] = new Option( t + ' (' + id + ')', id );
			}
			multiField.options[multiField.options.length] = new Option( "Let me type that again...", 0 );
			v.value = multiField.options[0].value;
			d( "set to " + v.value );
			updateInfo();
			im.src = "/board/img/thumbsup.gif";
			multiField.options[0].selected = "true";
		}
		else {	v.value = 0;
			im.src = "/board/img/thumbsdown.gif";
			updateInfo( "Found nothing" ); // (" + request.responseText + ")";
		}
	}
	function doneTyping() {
		d( "doneTyping()" );
		typingFlag = false;
	}
	function typing() {
		d( "typing()" );
		typingFlag = true;
		// document.getElementById('mVenueImage').src = "/board/img/questionMark.gif";
		d( "Waiting while you type" );
		timeOut = setTimeout( doneTyping, delay );
		// Don't get this one yet, lifted direct from http://www.francisshanahan.com/zuggest.aspx
		if (	window.event ) {
			if (	event.keyCode == 13 ) {
				event.cancelBubble = true;
				event.returnValue = false;
			}
		}
	}
	function update( phrase ) {
		// d( "update(" + phrase + "), delay is " + delay );
		timeOut = setTimeout( getReady, delay );
		if (	typingFlag ) {
			// d( "Still waiting while you type" );
			return;
		}
		// if (	! phrase ) {
		// 	phrase = textField.value;
		// }
		var phrase = textField.value;
		if (	phrase == lastSearch ) {
			// d( "phrase is still " + phrase + ", returning" );
			return;
		}
		// else {	d( "phrase is not " + lastSearch + ", searching again" );
		// }
		if (	phrase == "" ) {
			// d( "phrase is blank " + phrase + ", returning" );
			return;
		}
		updateInfo( "Searching for " + phrase );
		im.src = "/board/img/ajaxLoading.gif";

		loadPage( handle, url + escape( phrase ) );

		lastSearch = phrase;
	}
}
function findAjaxPopUps ( obj ) {
	d( "findAjaxPopUps, obj is " + obj );
	if (	! obj || obj == undefined ) {
		obj = document;
	}
	if (	obj.getElementsByTagName ) {
		if (	inputs = document.getElementsByTagName("input")) {
			// d( "Got " + inputs.length + " inputs" );
			for (	var i = 0; i < inputs.length; i ++ ) {
				var c = inputs[i].className;
				if (	c && c.indexOf('ajaxPopUp') != -1 ) {
					// d( "new ajax popup: " + inputs[i] );
					var p = new ajaxPopUp( inputs[i], inputs[i].value );
					// d( "p is " + p );
				}
			}
		}
	}
}
// addEvent( window, "load", function () { findAjaxPopUps( document ) } );

var alreadyPutCounter = 0;
var boardAdmin = new Array();

boardAdmin[2] = 1;
boardAdmin[3] = 1;
boardAdmin[44] = 1;
boardAdmin[39] = 1;
boardAdmin[47] = 1;
boardAdmin[376] = 1;
boardAdmin[624] = 1;
boardAdmin[1037] = 1;
boardAdmin[1187] = 1;
boardAdmin[1730] = 1;


var s = new Array();
s[15807] = 9.08;
s[34643] = 8.41;
s[50703] = 8.74;
s[52005] = 8.41;
s[53233] = 9.08;
s[55157] = 8.41;
s[57377] = 8.08;
s[60123] = 8.41;
s[61085] = 9.08;
s[64178] = 7.74;
s[66391] = 8.41;
s[67601] = 8.08;
s[69458] = 9.08;
s[80763] = 6.74;
s[82994] = 8.41;
s[83920] = 8.41;
s[88851] = 8.41;
s[93492] = 8.41;
s[94783] = 9.08;
s[95398] = 6.74;
s[96034] = 8.31;
s[99081] = 8.74;
s[99364] = 8.08;
s[99458] = 8.08;
s[99472] = 8.41;
s[99532] = 8.08;
s[99565] = 6.08;
s[99566] = 6.08;
s[99568] = 6.08;
s[99585] = 9.06;
s[99586] = 8.74;
s[99603] = 9.31;
s[99607] = 8.41;
s[99608] = 8.81;
s[99617] = 8.74;
s[99618] = 8.74;
s[99623] = 8.74;
s[99625] = 8.74;
s[99637] = 8.74;
s[99639] = 8.74;
s[99641] = 8.81;
s[99644] = 8.74;
s[99660] = 8.41;
s[99661] = 8.41;
s[99662] = 9.06;
s[99666] = 8.41;
s[99669] = 8.74;
s[99676] = 8.74;
s[99679] = 8.74;
s[99680] = 8.74;
s[99681] = 8.74;
s[99696] = 9.08;
s[99697] = 9.08;
s[99698] = 8.41;
s[99699] = 9.08;
s[99700] = 8.74;


var user = parseInt(GetCookie('lN'));
// d( "user is " + user );
var baseDomain = thisDomain();

// Run through my own forum, looking for things to change, based on cookies etc
// requires http://www.clarkeology.com/js/library.js

var gbbsUpdater = { 
	boardScript : '/cgi-bin/board.cgi',
	ajaxScript : '/cgi-bin/ajax.cgi',
	tableVar : 'table',
	bidVar : 'b',
	earliestYear : 2000,
	securityLevelToEdit : 1,
	securityLevelToDelete : 1,
	securityLevelToReport : 1,
	replyTest : /reply:([a-z]*):?([0-9]+):([0-9]*):([0-9]*)/i,
	// mSubjectTest : /mSubject:([0-9]+):([0-9]+)/i,
	// mDateTest : /mDate:([0-9]+)/i,
	ratingTest : /rate:([a-x]+):([0-9]+):?([0-9]+)*/i,
	attachBehaviour: function() {

		var a = document.getElementsByTagName('a');
		if (	a.length ) {
			d( 'Got ' + a.length + ' a' );
			for (	var i = 0; i < a.length; i ++ ) {
				gbbsUpdater.externalLink( a[i] );
			}
		}
		var divs = document.getElementsByTagName('h6');
		var doneDate = new Array;
		var dn = new Date();
		var one_day = 1000 * 60 * 60 * 24;
		var DA = new String("JanFebMarAprMayJunJulAugSepOctNovDec");
		if (	divs.length ) {
			var i;
			d( 'Got ' + divs.length + ' divs' );
			var doneExpansion = new Array;
			var doneAdmin = new Array;
			for (	i = 0; i < divs.length; i ++ ) {
				// var c = divs[i].className;
				// if (	c && c.indexOf( 'gbbs' ) != -1 ) {
					// d( 'c is  ' + c );
					var links = divs[i].getElementsByTagName('a');
					// if (	links.length >= 2 ) {
						// d( 'Got ' + links.length + ' links' );
						var k;
						for (	k = 0; k < links.length; k ++ ) {
							var c = links[k].className;
							var h = links[k].href;
							var r = links[k].rel;
							if (	gbbsUpdater.replyTest.test(r) == true ) {
								var table = RegExp.$1 || 'message';
								var id = RegExp.$2;
								// links[i].id = "reply: " . table . ":" . id;
								if (	! doneAdmin[id] ) doneAdmin[id] = 0;
								if (	! doneAdmin[id] ++ ) {
									var mLink = new Array;
									var punter = RegExp.$3;
									var board = RegExp.$4;
									var adminSpan = document.createElement('ul');
									adminSpan.id = 'admin' + id;
									adminSpan.className = 'admin boardAdminLinks';
									adminSpan.style.visibility = 'hidden';
									adminSpan.style.display = 'none';
									adminSpan.style.padding = '1em';
									if (	boardAdmin[user] >= gbbsUpdater.securityLevelToEdit ) {
										adminSpan.appendChild( gbbsUpdater.adminLi( gbbsUpdater.boardScript + '?' + gbbsUpdater.tableVar + '=' + table + '&mode=edit&key=' + id + '&' + gbbsUpdater.bidVar + '=' + board + '&confirm=1', 'Rebuild', '', 'Rebuild, in case of 404 etc', id, "r" ));
									}
									if (	user == punter || boardAdmin[user] >= gbbsUpdater.securityLevelToDelete ) {
										adminSpan.appendChild( gbbsUpdater.adminLi( 'javascript:void(gbbsUpdater.dM(' + id + '));', 'Delete', '', 'Delete this ' + table + '?', id, "delete" ));
									}
									if (	boardAdmin[user] >= gbbsUpdater.securityLevelToEdit ) {
										adminSpan.appendChild( gbbsUpdater.adminLi( gbbsUpdater.boardScript + '?' + gbbsUpdater.tableVar + '=' + table + '&mode=move&key=' + id + '&' + gbbsUpdater.bidVar + '=' + board, 'Move', "", "Move to another board, or attach to another thread", id, "mv" ));
									}
									if (	user == punter || boardAdmin[user] >= gbbsUpdater.securityLevelToEdit ) {
										adminSpan.appendChild( gbbsUpdater.adminLi( gbbsUpdater.boardScript + '?' + gbbsUpdater.tableVar + '=' + table + '&mode=edit&key=' + id + '&' + gbbsUpdater.bidVar + '=' + board, 'Edit', '', 'Edit this ' + table + '', id, "e" ));
										// adminSpan.appendChild( gbbsUpdater.adminLi( 'javascript:void(gbbsUpdater.eM(' + id + '));', 'Edit', '', 'Edit this ' + table + '', id, "e" ));
										
									}
									if (	boardAdmin[user] >= gbbsUpdater.securityLevelToEdit ) {
										adminSpan.appendChild( gbbsUpdater.adminLi( gbbsUpdater.boardScript + '?' + gbbsUpdater.tableVar + '=' + table + '&mode=edit&mApproved=1&confirm=1&key=' + id + '&' + gbbsUpdater.bidVar + '=' + board, 'HoF', '', 'Move this ' + table + ' to the hall of fame', id, "h" ));
										// adminSpan.appendChild( gbbsUpdater.adminLi( 'javascript:void(gbbsUpdater.eM(' + id + '));', 'Edit', '', 'Edit this ' + table + '', id, "e" ));
										
									}
									// mLink.push( adminSpan );
									var toggler = document.createElement('a');
									toggler.id = 'toggler' + id;
									toggler.title = 'Click here for admin options, edit, delete, etc...';
									
									// hide the admin link if there's nothing behind it...
									// d( "adminSpan has " + adminSpan.childNodes.length + " child nodes" );
									if (	adminSpan.childNodes.length >= 1 ) {
	
										// addEvent(toggler,'click','toggleAdmin('+ id+')'); // suspect!
										// addEvent(toggler,'click', function() { toggleAdmin(id) } ); // doesn't expand the admin options, does the last one on the page
										// need to pass a GLOBAL into that function for it to work
										// or write the number into the href as below:
										toggler.href = 'javascript:toggleAdmin(' + id + ')';
										toggler.appendChild( document.createTextNode( 'Admin' ));
										mLink.push( toggler );
										// links[k].parentNode.appendChild(toggler);
									}
	
									var parent = links[k].parentNode;
									// d( 'parent is ' + parent );
									var l;
									// d( 'Got ' + parent.childNodes.length + ' child nodes' );
									// for (	l = 0; l < parent.childNodes.length; l ++ ) {
									// 	d( 'child ' + l + ' is ' + parent.childNodes[l] );
									// }
									// parent.appendChild(adminSpan);
									parent.insertBefore( adminSpan, links[k] ); // replyTest
									var displayAdminUl = document.createElement('ul');
									displayAdminUl.id = 'adminDisplay' + id;
									displayAdminUl.className = 'adminDisplay';
									// displayAdminUl.className = 'adminDisplay'; // doesn't work in firefox...
									// parent.appendChild(displayAdminUl);
									parent.insertBefore( displayAdminUl, adminSpan ); // replyTest
									// d( 'Adding ' + mLink.length + ' links' );
									for (	l = 0; l < mLink.length; l ++ ) {
										// d( 'insertBefore(' + mLink[l] + ',' + links[k] + '); // insertBefore makes my browser crash!' );
										// parent.insertBefore(mLink[l], parent.childNodes[4]);
										// parent.appendChild(mLink[l]);
										var li = document.createElement('li');
										li.appendChild( mLink[l] );
										displayAdminUl.appendChild(li);
									}
									try {
										if (	s[id] ) {
											var scoreInfo = document.createElement('span');
											scoreInfo.innerHTML = 'Average score ' + s[id] + ' :: ';
											parent.insertBefore( scoreInfo, displayAdminUl );
										}
									}
									catch ( e ) {
										d( 'no score for ' + id + '; ' + e );
									}
								
								}
							}
						}
					// }
				// }
			}
		}
		var divs = document.getElementsByTagName('h5');
		var len = divs.length;
		if (	len ) {
			for (	i = 0; i < len; i ++ ) {
				var c = divs[i].className;
				if (	c != null && gbbsUpdater.ratingTest.test(c) == true ) {
					var table = RegExp.$1 || 'message';
					var id = RegExp.$2;
					divs[i].id = "rate:" + table + ":" + id;
					var score = RegExp.$3;
					removeChildNodes( divs[i] );
					divs[i].appendChild( document.createTextNode( "Rate this:" ));
					divs[i].appendChild( gbbsUpdater.stars( table, id, score ));
				}
			}
		}
	},
	stars : function ( table, id, score ) {
		id = Math.floor( id );
                score = parseInt( score );
		try {	score = parseInt( score || s[id] );
		}
		catch ( e ) {
			d( 'no star score for ' + id + '; ' + e );
		}
		// d( 'stars ' + table + ' ' + ' ' + id + ' ' + score );
		var stars = document.createElement('ol');
		stars.className = 'stars';
		for (	var ns = 1; ns <= 10; ns ++ ) {
			var li = document.createElement('li');
			var newStar = document.createElement('a');
			newStar.className = 'star' + ns;
			if (	score === ns ) {
                        	// d( score + " === " + ns );
                        	newStar.className = 'lit lit' + ns + ' ' + newStar.className;
                        }
			newStar.rel = '' + ns;
			newStar.title = 'Rate this ' + table + ' ' + ns + ' out of 10';
			newStar.href = 'javascript:void(gbbsUpdater.aR(\'' + table + '\',' + id + ',' + ns + '));';
			li.appendChild( newStar );
			stars.appendChild(li);
		}
		return stars;
	},
	
	dR : function ( anchor, table, id, mode ) {
		var url = gbbsUpdater.boardScript + '?' + gbbsUpdater.tableVar + '=' + table + '&mode=' + mode + '&key=' + id;
		var parent = anchor.parentNode;
		if (	document.getElementById ) { // getHttpObject is not a good test...
			// var message = document.getElementById("message:" + id);
			var oColor = parent.style.backgroundColor;
			parent.style.backgroundColor = "#fcc";
			if (	confirm( "Really " + mode + " " + table + " " + id + "?" )) {
				// d( "Really ajax it..." );
				// d( "Got delete, innerHTML is " + anchor.innerHTML );
				myInnerHtml( anchor, "Deleting, hold tight..." );
				anchor.href = "#";
				anchor.onclick = null;
				// url = url + '&confirm=1';
				d( "Calling " + url );
				loadPage( function ( request ) {
					d( "Called " + url + ", and deleted..." );
					parent.style.display = "none";
					parent.style.visibility = "hidden";
				}, url );
			}
			else {	d( "Not really deleting, clean up..." );
				parent.style.backgroundColor = oColor;
			}
		}
		else {	location.href = url;
		}
	},
	externalLink : function ( anchor ) {
		// Originally from http://www.sitepoint.com/article/1041
		// hacked and whacked and cracked by me to do more specific things
		// Rewrites standards compliant HTML to reinsert target=_blank
		// Modified 22/06/05 to put in some onClicks
	
		var url = anchor.href;
		if (	url ) {
			var r = anchor.rel;
			var external = 0;
			
			if (	r == "tag" ) {
				anchor.title = anchor.title ? anchor.title + "<br />" : "";
				if (	url.indexOf('http://www.folkestonegerald.com' + gbbsUpdater.boardScript) == 0 ) {
					anchor.title = anchor.title + "Search Folkestone Gerald (news, reviews and comments) for further mentions of <strong>" + anchor.innerHTML + "</strong>";
				}
				else {	anchor.title = anchor.title + "Search this site for <strong>" + anchor.innerHTML + "</strong>";
				}
			}
			if (	 url.indexOf('http://') == -1 ) {
				// Definitely internal. Or broken.
			}
			else {	// d( "Found " + url );
				if (	location.href.indexOf( baseDomain ) != -1 ) {
					if (	 location.href.indexOf( baseDomain ) != -1 && url.indexOf( baseDomain ) == -1 ) {
						// d( "External" );
						external = 1;
					}
				}
				// else {	
				// 	d( location.href + " is not baseDomain anyway" );
				// 	if (	r.indexOf("external") != -1 ) {{
				// 		d( "rel is external" );
				// 		external = 1;
				// 	}
				// }
			}
			var c = anchor.className;
			if (	external ) {
				anchor.className = c + " external";
				// Use CSS to highlight off site links, with something like http://www.clarkeology.com/icons/link.gif
				// 
			}
		}
	},
	// eM : function ( m ) {
	// 	var url = gbbsUpdater.ajaxScript + '?' + gbbsUpdater.tableVar + '=message&mode=edit&key=' + m;
	// 	if (	document.getElementById ) { // getHttpObject is not a good test...
	// 		var message = document.getElementById("message:" + m);
	// 		d( url );
	// 		myInnerHtml( message, "Loading the form to edit this message, please wait..." );
	// 		loadPage( function ( request ) {
	// 			myInnerHtml( message, request.responseText );
	// 			gbbsUpdater.attachBehaviour();
	// 		}, url );
	// 	}
	// 	else {	location.href = url;
	// 	}
	// },
	mM : function ( m, b ) {
		var url = gbbsUpdater.boardScript + '?' + gbbsUpdater.tableVar + '=message&mode=approve&key=' + m;
		if (	m && b && document.getElementById ) { // getHttpObject is not a good test...
			var message = document.getElementById("message:" + m);
			var oColor = message.style.backgroundColor;
			message.style.backgroundColor = "#cfc";
			if (	confirm( "Really move message " + m + " to board " + b + "?" )) {
				url += '&confirm=1';
				d( "Calling " + url );
				var mLink = document.getElementById("move" + m);
				mLink.href = "#";
				mLink.onclick = null;
				loadPage( function ( request ) {
					d( "Called " + url + ", and moved..." );
					d( "Got mLink, innerHTML is " + mLink.innerHTML );
					myInnerHtml( mLink, "Approved" );
				}, url );
			}
			else {	d( "Not really moving, clean up..." );
				message.style.backgroundColor = oColor;
			}
		}
		else {	location.href = url;
		}
	},
	aM : function ( m ) {
		var url = gbbsUpdater.boardScript + '?' + gbbsUpdater.tableVar + '=message&mode=approve&key=' + m;
		if (	document.getElementById ) { // getHttpObject is not a good test...
			var message = document.getElementById("message:" + m);
			var oColor = message.style.backgroundColor;
			message.style.backgroundColor = "#cfc";
			// if (	confirm( "Really approve message " + m + "?" )) {
				var approve = document.getElementById("approve" + m);
				d( "Got approve, innerHTML is " + approve.innerHTML );
				myInnerHtml( approve, "Approving..." );
				approve.href = "#";
				approve.onclick = null;
				url += '&confirm=1';
				d( "Calling " + url );
				loadPage( function ( request ) {
					d( "Called " + url + ", and approved..." );
					myInnerHtml( approve, "Approved" );
				}, url );
			// }
			// else {	d( "Not really approving, clean up..." );
			// 	message.style.backgroundColor = oColor;
			// }
		}
		else {	location.href = url;
		}
	},
	aR : function ( t, id, score ) {
		d( "aR : function ( " + t + ", " + id + ", " + score + " )" );
		var url = gbbsUpdater.boardScript + '?' + gbbsUpdater.tableVar + '=' + t + '&mode=approve&key=' + id;
		if (	score ) {
			url += '&actionScore=' + score;
		}
		if (	document.getElementById ) { // getHttpObject is not a good test...
			var callerDivID = 'rate:' + t + ':' + id;
			var callerDiv = document.getElementById(callerDivID);
			try {
				var oColor = callerDiv.style.backgroundColor;
				// callerDiv.style.backgroundColor = "#ccf";
				callerDiv.href = "#";
				callerDiv.onclick = null;
				d( "Got callerDiv, innerHTML is " + callerDiv.innerHTML );
			}
			catch ( e ) {
				d( "Couldn't update callerDiv; " + e );
			}
			try {
				myInnerHtml( callerDiv, "Approving, hold tight..." ); // textNode
				if (	ajaxLoading ) {
					callerDiv.appendChild( ajaxLoading( ));
				}
			}
			catch ( e ) {
				d( "Couldn't update callerDiv; " + e );
			}
			// url += '&confirm=1';
			d( "Calling " + url );
			loadPage( function ( request ) {
				d( "Called " + url + ", and approved..." );
				myInnerHtml( callerDiv, "Thanks" );
				try {	callerDiv.style.backgroundColor = oColor;
				}
				catch ( e ) {
					d( "Couldn't set colour back; " + e );
				}
				var cmd = "myInnerHtml( document.getElementById('" + callerDivID + "'), gbbsUpdater.stars( '" + t + "', " + id + ", " + score + " ))";
				try {	d( "setting timeout to execute " + cmd );
					setTimeout( cmd, 1000 );
				}
				catch ( e ) {
					d( cmd + " failed; " + e );
				}

			}, url );
		}
		else {	location.href = url;
		}
	},
	cM : function ( m ) {
		var url = gbbsUpdater.boardScript + '?' + gbbsUpdater.tableVar + '=message&mode=edit&key=' + m + '&threadClosed=1';
		if (	document.getElementById ) {
			var message = document.getElementById("message:" + m);
			var oColor = message.style.backgroundColor;
			message.style.backgroundColor = "#fcc";
			if (	confirm( "Really close message " + m + "?" )) {
				var cLink = document.getElementById("close" + m);
				d( "Got cLink, innerHTML is " + cLink.innerHTML );
				myInnerHtml( cLink, "Closing, hold tight..." );
				cLink.href = "#";
				cLink.onclick = null;
				url += '&confirm=1';
				d( "Calling " + url );
				loadPage( function ( request ) {
					d( "Called " + url + ", and closed..." );
					myInnerHtml( cLink, "Closed" );
				}, url );
			}
			else {	d( "Not really closing, clean up..." );
				message.style.backgroundColor = oColor;
			}
		}
		else {	location.href = url;
		}
	},
	rM : function ( m ) {
		var url = gbbsUpdater.boardScript + '?' + gbbsUpdater.tableVar + '=message&mode=report&key=' + m;
		if (	document.getElementById ) { // getHttpObject is not a good test...
			var message = document.getElementById("message:" + m);
			var oColor = message.style.backgroundColor;
			message.style.backgroundColor = "#fcc";
			if (	confirm( "Really report message " + m + " as spam?" )) {
				// d( "Really ajax it..." );
				var rLink = document.getElementById("report" + m);
				if (	rLink ) {
					d( "Got report, innerHTML is " + rLink.innerHTML );
					myInnerHtml( rLink, "Reporting and deleting, hold tight..." );
					rLink.href = "#";
					rLink.onclick = null;
				}
				url = url + '&confirm=1';
				d( "Calling " + url );
				loadPage( function ( request ) {
					d( "Called " + url + ", and reported..." );
					if (	rLink ) {
						myInnerHtml( rLink, "Reported and deleted" );
					}
					message.style.display = "none";
					message.style.visibility = "hidden";
				}, url );
			}
			else {	d( "Not really reporting, clean up..." );
				message.style.backgroundColor = oColor;
			}
		}
		else {	location.href = url;
		}
	},
	dM : function ( m ) {
		var url = gbbsUpdater.boardScript + '?' + gbbsUpdater.tableVar + '=message&mode=delete&key=' + m;
		if (	document.getElementById ) { // getHttpObject is not a good test...
			var message = document.getElementById("message:" + m);
			var oColor = message.style.backgroundColor;
			message.style.backgroundColor = "#fcc";
			if (	confirm( "Really delete message " + m + "?" )) {
				// d( "Really ajax it..." );
				var dLink = document.getElementById("delete" + m);
				if (	dLink ) {
					d( "Got delete, innerHTML is " + dLink.innerHTML );
					myInnerHtml( dLink, "Deleting, hold tight..." );
					dLink.href = "#";
					dLink.onclick = null;
				}
				url = url + '&confirm=1';
				d( "Calling " + url );
				loadPage( function ( request ) {
					d( "Called " + url + ", and deleted..." );
					myInnerHtml( dLink, "Deleted" );
					message.style.display = "none";
					message.style.visibility = "hidden";
				}, url );
			}
			else {	d( "Not really deleting, clean up..." );
				message.style.backgroundColor = oColor;
			}
		}
		else {	location.href = url;
		}
	},
	updateCount: function ( textarea, cTag, max ) {
		// d( 'updateCount( ' + textarea + ', ' + cTag + ', ' + max + ')' );
		if (	textarea && textarea.value ) {
			var l = parseInt( max - textarea.value.length );
			myInnerHtml( cTag, parseInt( max - textarea.value.length ));
			if (	l >= max ) {
				textarea.value = textarea.value.substring( 0, max );
			}
		}
	},
	// 
	adminLi : function ( h, l, c, t, i, m ) {
		// d( "adminLi( " + h + ", " + l + ", " + c + ", " + i + " )" );
		// Takes an href and returns a link in an li
		var rLink = document.createElement('a');
		rLink.title = t;
		rLink.id = m + i;
		rLink.href = h;
		myInnerHtml( rLink, l );
		var li = document.createElement('li');
		li.className = 'c';
		li.id = 'li' + i;
		li.appendChild(rLink);
		return li;
	},
	testVar : 'remember, no comma after this last element'
};
addEvent( window, 'load', gbbsUpdater.attachBehaviour );

// 

/*
Sweet Titles (c) Creative Commons 2005
http://creativecommons.org/licenses/by-sa/2.5/
Author: Dustin Diaz | http://www.dustindiaz.com
*/
var sweetTitles = { 
	xCord : 0,				// @Number: x pixel value of current cursor position
	yCord : 0,				// @Number: y pixel value of current cursor position
	tipElements : ['a','abbr','acronym'],	// @Array: Allowable elements that can have the toolTip
	obj : Object,				// @Element: That of which you're hovering over
	tip : Object,				// @Element: The actual toolTip itself
	active : 0,				// @Number: 0: Not Active || 1: Active
	init : function() {
		if (	! document.getElementById ||
			! document.createElement ||
			! document.getElementsByTagName ) {
			return;
		}
		var i,j;
		this.tip = document.createElement('div');
		this.tip.id = 'toolTip';
		document.getElementsByTagName('body')[0].appendChild(this.tip);
		this.tip.style.top = '0';
		this.tip.style.visibility = 'hidden';
		var tipLen = this.tipElements.length;
		for (	i=0; i<tipLen; i++ ) {
			var c = document.getElementsByTagName(this.tipElements[i]);
			var curLen = c.length;
			for (	j=0; j < curLen; j++ ) {
				// if (	c[j].href && c[j].href.toString().indexOf( baseDomain ) != -1 ) {
				// 	c[j].setAttribute('iox','internal');
				// }
				if (	c[j].title || ( c[j].href && ( c[j].href.toString().indexOf( baseDomain ) == -1 || c[j].href.toString().indexOf("javascript")))) {
					addEvent(c[j],'mouseover',this.tipOver,false);
					addEvent(c[j],'mouseout',this.tipOut,false);
					// also disappear on a click, handy for more of my JS
					addEvent(c[j],'click',this.tipOut,false);
					c[j].setAttribute('tip',c[j].title);
					c[j].removeAttribute('title');
				}
			}
		}
	},
	updateXY : function(e) {
		if (	document.captureEvents ) {
			sweetTitles.xCord = e.pageX;
			sweetTitles.yCord = e.pageY;
		} else if ( window.event.clientX ) {
			sweetTitles.xCord = window.event.clientX+document.documentElement.scrollLeft;
			sweetTitles.yCord = window.event.clientY+document.documentElement.scrollTop;
		}
	},
	tipOut: function() {
		if ( window.tID ) {
			clearTimeout(tID);
		}
		if ( window.opacityID ) {
			clearTimeout(opacityID);
		}
		sweetTitles.tip.style.visibility = 'hidden';
	},
	checkNode : function() {
		var trueObj = this.obj;
		if ( this.tipElements.inArray(trueObj.nodeName.toLowerCase()) ) {
			return trueObj;
		} else {
			return trueObj.parentNode;
		}
	},
	tipOver : function(e) {
		sweetTitles.obj = this;
		tID = window.setTimeout("sweetTitles.tipShow()",500);
		sweetTitles.updateXY(e);
	},
	tipShow : function() {		
		var scrX = Number(this.xCord);
		var scrY = Number(this.yCord);
		var tp = parseInt(scrY+15);
		var lt = parseInt(scrX+10);
		var anch = this.checkNode();
		var addy = '';
		var access = '';
		if (	anch.nodeName.toLowerCase() == 'a' ) {

			var h = anch.href.toString();
			h = ( h.indexOf('http://') == 0 ? h.substring( 7, h.length ) : h ); // hard code len for efficiency
			h = ( h.indexOf('www.') == 0 ? h.substring( 4, h.length ) : h ); // hard code len for efficiency
			// now back to the original code!

			addy = ( h.length > 35 ? h.toString().substring(0,35)+"..." : h );
			var access = ( anch.accessKey ? ' <span>['+anch.accessKey+']</span> ' : '' );
		} else {
			addy = anch.firstChild.nodeValue;
		}
		this.tip.innerHTML = "<p>"+anch.getAttribute('tip')+"<em>"+access+addy+"</em></p>";
		if (	parseInt(document.documentElement.clientWidth+document.documentElement.scrollLeft) < parseInt(this.tip.offsetWidth+lt) ) {
			this.tip.style.left = parseInt(lt-(this.tip.offsetWidth+10))+'px';
		} else {
			this.tip.style.left = lt+'px';
		}
		if (	parseInt(document.documentElement.clientHeight+document.documentElement.scrollTop) < parseInt(this.tip.offsetHeight+tp) ) {
			this.tip.style.top = parseInt(tp-(this.tip.offsetHeight+10))+'px';
		} else {
			this.tip.style.top = tp+'px';
		}
		this.tip.style.visibility = 'visible';
		this.tip.style.opacity = '.1';
		this.tipFade(10);
	},
	tipFade: function(opac) {
		var passed = parseInt(opac);
		var newOpac = parseInt(passed+10);
		if (	newOpac < 80 ) {
			this.tip.style.opacity = '.'+newOpac;
			this.tip.style.filter = "alpha(opacity:"+newOpac+")";
			opacityID = window.setTimeout("sweetTitles.tipFade('"+newOpac+"')",20);
		}
		else { 
			this.tip.style.opacity = '.80';
			this.tip.style.filter = "alpha(opacity:80)";
		}
	}
};
function pageLoader() {
	sweetTitles.init();
}
// addEvent( window,'load',pageLoader );



