/**
 * Run through my own forum, looking for things to change, based on cookies etc
 * 
 * @author	Paul Clarke <paulypopex+php@gmail.com>
 * @date	Wed Aug 12 07:44:28 BST 2009 Cleaning this mess up!
 */

var user;
var gbbsUpdater = { 
	boardScript : '/cgi-bin/b66.cgi',
	adminScript : '/cgi-bin/admin.cgi',
	ajaxScript : '/cgi-bin/ajax.cgi',
	earliestYear : 2000,
	securityLevelToAdd : 3,
	securityLevelToEdit : 3,
	securityLevelToDelete : 3,
	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,
	sections : [ "folkestonegerald.com/folkestone", "property", "history", "/venue", "/map", "clarkeology.com/blog", "/restaurants" ],
	attachBehaviour: function() {
		user = $.cookie ? parseInt($.cookie('lN')) : 0;
		var self = this;
		$('#main a[href]').each( function () {
			self.externalLink( this );
		} );
		$(':input:enabled.[class*=maxlen]').each( function () {
			if ( /length(\d+)/.test( $(this).attr('class'))) {
				var len = RegExp.$1;
				var showCharCount = function() {
					var l = $(this).val().length;
					var r = len - l;
					var c = '#' + r.toString( 16 ) + r.toString( 16 ) + r.toString( 16 );
					c = r < 1 || c.length < 7 ? '#f00' : c;
					if (	l >= len ) {
						$(this).addClass( 'error' ).next('.kC').css( { color: c } ).html( r + ' - max length is ' + len + '!' );
					}
					else {	$(this).removeClass( 'error' ).next('.kC').css( { color: c } ).html( r + ' chars remaining' );
					}
					return false;
				};
				$(this).after('<abbr title="Chars remaining" class="kC">' + len + '</abbr>').bind( 'keyup change', showCharCount ).each( showCharCount );
			}
		} );

		var doneDate = new Array;
		var dn = new Date();
		var one_day = 1000 * 60 * 60 * 24;
		var DA = new String("JanFebMarAprMayJunJulAugSepOctNovDec");
		var i;
		var doneExpansion = new Array;
		var doneAdmin = new Array;
		$('div.gbbs a').each( function () {
			var div = $(this).parents('div').eq(0);
			var c = $(this).attr('class');
			var h = $(this).attr('href');

			if ( gbbsUpdater.replyTest.test($(this).attr('rel')) == true ) {
				var table = RegExp.$1 || 'message';
				var id = RegExp.$2;
				if ( ! doneAdmin[id] ) doneAdmin[id] = 0;
				if ( ! doneAdmin[id] ++ ) {
					var mLink = new Array;
					var punter = RegExp.$3;
					var board = RegExp.$4 || 3;
					var adminSpan = $('<ul id="admin' + id + '" class="admin"></ul>');
					if ( boardAdmin[user] >= gbbsUpdater.securityLevelToEdit ) {
						adminSpan.append( gbbsUpdater.adminLi( gbbsUpdater.adminScript + '?table=' + table + '&mode=edit&key=' + id + '&b=' + board + '&confirm=1', 'Rebuild', '', 'Rebuild, in case of 404 etc', id, "r" ));
					}
					if ( boardAdmin[user] >= gbbsUpdater.securityLevelToAdd ) {
						adminSpan.append( gbbsUpdater.adminLi( gbbsUpdater.adminScript + '?table=' + table + '&mode=add&' + table + 'CloneOf=' + id + '&b=' + board + '&confirm=1', 'Alt', '', 'Add an alternative name', id, "a" ));
					}
					if ( user == punter || boardAdmin[user] >= gbbsUpdater.securityLevelToDelete ) {
						adminSpan.append( gbbsUpdater.adminLi( gbbsUpdater.boardScript + '?table=' + table + '&mode=delete&key=' + id + '&b=' + board, 'Delete', '', 'Delete this ' + table + '?', id, "delete" ));
					}
					if ( boardAdmin[user] >= gbbsUpdater.securityLevelToEdit ) {
						adminSpan.append( gbbsUpdater.adminLi( gbbsUpdater.boardScript + '?table=' + table + '&mode=edit&key=' + id + '&b=' + board + '&mParent=0&mThread=0&confirm=1', 'Detach', '', 'Detach this ' + table + ', take it out of the current structure', id, 'dt' ));
						adminSpan.append( gbbsUpdater.adminLi( '/php/wiki.php?table=' + table + '&preview=1&debug=1&' + table + 'ID=' + id, 'Debug', '', 'Debug / preview', id, 'dt' ));
					}
					if ( boardAdmin[user] >= gbbsUpdater.securityLevelToEdit ) {
						adminSpan.append( gbbsUpdater.adminLi( gbbsUpdater.boardScript + '?table=' + table + '&mode=move&key=' + id + '&b=' + board, 'Move', "", "Move to another board, or attach to another thread", id, "mv" ));
					}
					if ( user == punter || boardAdmin[user] >= gbbsUpdater.securityLevelToEdit ) {
						adminSpan.append( gbbsUpdater.adminLi( gbbsUpdater.adminScript + '?table=' + table + '&mode=edit&key=' + id + '&b=' + board, 'Edit', '', 'Edit this ' + table + '', id, "e" ));
					}
					if ( adminSpan.text( )) {
						mLink.push(gbbsUpdater.adminLi( '', 'Admin', 'toggle', 'toggle' + table + '' + id, 'toggle'  ));
						$(div).attr('id', table + id );
					}
					var l = '/tweet/' + table.charAt( 0 ) + id;
					mLink.push( gbbsUpdater.adminLi( l, 'Twitter', '', 'Reply to this ' + table + ' on twitter?', id, 'twitter' ));

					$(this).before(adminSpan);
					var displayAdminUl = '<ul id="adminDisplay' + id + '" class="adminDisplay">';
					for ( var l = 0; l < mLink.length; l ++ ) {
						displayAdminUl += mLink[l];
					}
					displayAdminUl += '</ul>';
					$(this).before(displayAdminUl);
				}
			}
		} );
		$('input.ajaxPopUp').each( function () {
			var name = $(this).attr('name');
			$(this).attr('name', '_' + name).after('<input type="hidden" id="_hidden_' + name + '" name="' + name + '" value="' + $(this).val( ) + '" />').autocomplete( '/php/xml.php?mode=pipe&table=' + $(this).attr('rel')).result( function ( e, item ) {
				$(':input#' + name ).val( item[0].replace( /\s*\(.+\)/g, '' ).replace( /\s*<\/?[^>]+(>|$)/g, '' ));
				$(':input#_hidden_' + name ).val( item[1] );
			} );
		} );
		$('.toggle a').click( function () {
			$('ul.admin', $(this).parents('.gbbs').eq(0)).show();
			return false;
		} );
		$('h6').each( function () {
			if ( gbbsUpdater.ratingTest.test($(this).attr('class')) == true ) {
				var table = RegExp.$1 || 'message';
				var id = RegExp.$2;
				$(this).attr('id','rate:' + table + ':' + id );
				var score = RegExp.$4;
				$(this).html(gbbsUpdater.stars(table,id,score));
			}
		} );
		if ( $(':input#latitude').length && $(':input#longitude').length ) {
			$(':input#latitude').parent().append('<div id="gmapWrapper"><div id="inlineMap" class="map">Initialising map...</div></div>');
			window.myGmap && myGmap.init( $('#inlineMap')[0], $('#latitude')[0], $('#longitude')[0] );
		}
	},
	stars : function ( table, id, score ) {
		id = Math.floor( id );
		score = Math.floor( score );
		var stars = '<ol class="stars">';
		for ( var s = 1; s <= 10; s ++ ) {
			stars += '<li><a class="star' + s;
			if ( score === s ) {
				stars += ' lit lit' + s + ' star' + s;
			}
			stars += '" title="Rate this ' + table + ' ' + s + ' out of 10" ';
			stars += 'href="javascript:void(gbbsUpdater.aR(\'' + table + '\',' + id + ',' + s + '));" />';
			stars += '</li>';
		}
		stars += '</ol>';
		return stars;
	},
	eF : function ( anchor, table, id, mode, c ) {
		var parent = anchor.parentNode;
		var url = gbbsUpdater.ajaxScript + '?table=' + table + '&mode=' + mode + '&key=' + id;
		if ( c ) {
			url += '&confirm = ' + c;
		}
		if ( document.getElementById ) {
			$(anchor).addClass('loading').html( mode + ' ' + table + ' ' + id +', please wait...' );
			$.get( url, {}, function ( response ) {
				$( parent ).html( response );
				gbbsUpdater.attachBehaviour();
				findAjaxPopUps( anchor );
				$(anchor).removeClass('loading');
			} );
			$('.e').DroppableDestroy();
		}
		else {	location.href = url;
		}
	},
	tw : function ( id ) {
		$('#tw' + id).parents('div:first').append('<form action="http://twitter.com/status/update" method="post"><a href="http://twitter.com">Twitter</a> #m' + id + ' and I will pick it up and attach it here. Everyone has Twitter!<br /><input type="hidden" value="<a href=&quot;http://www.clarkeology.com/blog/&quot;>clarkeology</a>" /><input name="status" value="@pauly #m' + id + ' " /><input type="submit" value="post to twitter" /></form>' ).find('input[name=status]').focus();
	},
	dR : function ( anchor, table, id, mode ) {

		d( 'dR(' + table + ',' + id + ',' + mode + ')' );
		var url = gbbsUpdater.boardScript + '?table=' + table + '&mode=' + mode + '&key=' + id;
		if (	document.getElementById ) {
			var callerDivId = table + ':' + id;
			d( "looking for is " + callerDivId );
			var callerDiv = document.getElementById(callerDivId);
			d( "callerDiv is " + callerDiv );
			if (	! callerDiv ) {
				var toggler = document.getElementById('toggle' + table + '' + id);
				d( "toggler is " + toggler );
				callerDiv = toggler.parentNode;
				d( "callerDiv is now " + callerDiv );
			}
			var oColor;
			try {
				oColor = callerDiv.style.backgroundColor;
				callerDiv.style.backgroundColor = "#fcc";
				callerDiv.href = "#";
				callerDiv.onclick = null;
			}
			catch ( e ) {
				d( "Couldn't update callerDiv or anchor; " + e );
			}
			if (	confirm( "Really " + mode + " " + table + " " + id + "?" )) {
				try {
					$( anchor ).html( "Deleting, hold tight..." );
					anchor.href = "#";
					anchor.onclick = null;
				}
				catch ( e ) {
					d( "Couldn't update anchor; " + e );
				}
				url = url + '&confirm=1';
				d( "Calling " + url );
				$.get/( url, {}, function ( response ) {
					d( "Called " + url + ", and deleted..." );
					$(callerDiv).empty().hide('slow');
				} );
			}
			else {	d( "Not really deleting, clean up..." );
				callerDiv.style.backgroundColor = oColor;
			}
		}
		else {	location.href = url;
		}
	},
	externalLink : function ( anchor ) {
	
		var url = anchor.href;
		if ( ! $(anchor).parents('.cal').length && ! $(anchor).is('.updated') ) {
			var r = anchor.rel;
			if ( url ) {
				if ( r == "tag" ) {
					anchor.title = anchor.title ? anchor.title + "<br />" : "";
					if ( url.indexOf('http://www.folkestonegerald.com/wiki/' ) == 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( location.host ) == -1 ) {
					$(anchor).addClass( "external" );
				}
				for ( var i = 0; i < gbbsUpdater.sections.length; i ++ ) {
					if ( location.href.indexOf( gbbsUpdater.sections[i] ) != -1 && url.indexOf( gbbsUpdater.sections[i] ) != -1 ) {
						$(anchor).addClass( "highlight" );
					}
				}
			}
		}
	},
	aM : function ( m ) {
		var url = gbbsUpdater.boardScript + '?table=message&mode=approve&key=' + m;
		if ( document.getElementById ) {
			var message = document.getElementById("message" + m);
			var oColor = message.style.backgroundColor;
			message.style.backgroundColor = "#cfc";
			var approve = document.getElementById("approve" + m);
			$( approve ).html( "Rating, hold tight..." );
			approve.href = "#";
			approve.onclick = null;
			url += '&confirm=1';
			d( "Calling " + url );
			$.get( url, {}, function ( r ) {
				d( "Called " + url + ", and approved..." );
				$( approve ).html( "Approved" );
			} );
		}
		else {	location.href = url;
		}
	},
	aR : function ( table, id, score ) {
		var url = gbbsUpdater.boardScript + '?table=' + table + '&mode=approve&key=' + id;
		if ( score ) {
			url += '&actionScore=' + score;
		}
		if ( document.getElementById ) {
			var callerDivID = 'rate:' + table + ':' + id;
			var callerDiv = document.getElementById( callerDivID );
			var oColor;
			try {
				oColor = callerDiv.style.backgroundColor;
				callerDiv.style.backgroundColor = "#cfc";
				callerDiv.href = "#";
				callerDiv.onclick = null;
			}
			catch ( e ) {
			}
			try {
				$( callerDiv ).html( "Approving, hold tight..." );
			}
			catch ( e ) {
				d( "Couldn't display text in callerDiv; " + e );
			}
			$.get( url, {}, function ( request ) {
				try {	
					$( callerDiv ).html( 'Thanks, rated that ' + table + ' ' + score );
					callerDiv.style.backgroundColor = oColor;
					callerDivID = callerDivID.replace(/:/g,'\\\\:');
					var cmd = "$('#" + callerDivID + "').html( gbbsUpdater.stars( '" + table + "', " + id + ", " + score + " ))";
					setTimeout( cmd, 1000 );
				}
				catch ( e ) {
				}
			} );
		}
		else {	location.href = url;
		}
	},
	cM : function ( m ) {
		var url = gbbsUpdater.boardScript + '?table=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);
				$( cLink ).html( "Closing, hold tight..." );
				cLink.href = "#";
				cLink.onclick = null;
				url += '&confirm=1';
				$.get/( url, {}, function ( request ) {
					$( cLink ).html( "Closed" );
				} );
			}
			else {
				message.style.backgroundColor = oColor;
			}
		}
		else {	location.href = url;
		}
	},
	rM : function ( m ) {
		var url = gbbsUpdater.boardScript + '?table=message&mode=report&key=' + m;
		if ( document.getElementById ) {
			var message = document.getElementById("message" + m);
			var oColor = message.style.backgroundColor;
			message.style.backgroundColor = "#fcc";
			if ( confirm( "Really report message " + m + " as spam?" )) {
				var rLink = $('#report' + m);
				rLink.attr('href','#').unbind('click').html( "Reporting and deleting, hold tight..." );
				url = url + '&confirm=1';
				$.get/( url, {}, function ( request ) {
					rLink.html( "Reported and deleted" );
					message.style.display = "none";
				} );
			}
			else {
				d( "Not really reporting, clean up..." );
				message.style.backgroundColor = oColor;
			}
		}
		else {
			location.href = url;
		}
	},
	dM : function ( m ) {
		var url = gbbsUpdater.boardScript + '?table=message&mode=delete&key=' + m;
		if ( document.getElementById ) {
			var message = document.getElementById("message" + m);
			var oColor = message.style.backgroundColor;
			message.style.backgroundColor = "#fcc";
			if (	confirm( "Really delete message " + m + "?" )) {
				$('#delete' + m).empty().append("Deleting, hold tight...");
				url = url + '&confirm=1';
				d( "Calling " + url );
				$.get/( url, {}, function ( response ) {
					d( "Called " + url + ", and deleted..." );
					$('#delete' + m).empty().append("Deleted").hide("slow");
					$(message).empty().hide("slow");
				}, url );
			}
			else {	d( "Not really deleting, clean up..." );
				message.style.backgroundColor = oColor;
			}
		}
		else {	
			location.href = url;
		}
	},
	adminLi : function ( h, l, c, t, i, m ) {
		return '<li title="' + t + '" id="' + m + i + '" class="' + c + '"><a href="' + h + '">' + l + '</a></li>';
	}
};
$( function () {
	gbbsUpdater.attachBehaviour();
} );


