Syrnia Forum Focus

By Vaer Last update Jan 28, 2009 — Installed 213 times.

There are 6 previous versions of this script.

// ==UserScript==
// @name Syrnia Forum Focus
// @author Veridis
// @namespace http://www.veridis.com/Syrnia/ForumFocus
// @description Allows the colouring of the last 30 replies and blocking of categories.
// @license Creative Commons Attribution License
// @version 1.3
// @include http://*syrnia.com/theGame/mainincludes/forum.php*
// @include http://*syrnia.com/theGame/includes2/options.php*
// @released 2009-01-17
// @updated 2009-01-24
// @compatible Greasemonkey
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js
// @require http://ajax.googleapis.com/ajax/libs/jqueryui/1.5.3/jquery-ui.min.js
// @require http://tablesorter.com/jquery.tablesorter.min.js
// ==/UserScript==

// Our Constants

const VERSION = '1.3';
const DEBUG = false;
const Q = jQuery.noConflict();
if (DEBUG) {
	unsafeWindow.Q = Q;
}
const PATH = window.location.pathname + window.location.search;
const DEFAULT_SETTINGS = {
	tableSort: true,
	styles: [{
		title: 'Links',
		selector: '.forum_category a',
		css: {
			'background': 'inherit',
			'color': 'inherit'
		}
	}, {
		title: 'Default',
		selector: '.forum_category',
		css: {
			'color': '#000000',
		}
	}, {
		title: 'Announcments',
		selector: '.forum_category_13440',
		css: {
			'background': '#f17b55'
		}
	}, {
		title: 'General',
		selector: '.forum_category_40',
		css: {
			'background': '#277dac'
		}
	}, {
		title: 'Market',
		selector: '.forum_category_39',
		css: {
			'background': '#f49f22'
		}
	}, {
		title: 'Feedback',
		selector: '.forum_category_37',
		css: {
			'background': '#556799'
		}
	}, {
		title: 'Clans',
		selector: '.forum_category_38',
		css: {
			'background': '#ce4d50'
		}
	}, {
		title: 'Help',
		selector: '.forum_category_303',
		css: {
			'background': '#edd101'
		}
	}, {
		title: 'Contests',
		selector: '.forum_category_346',
		css: {
			'background': '#74a144'
		}
	}, {
		title: 'Off Topic',
		selector: '.forum_category_41',
		css: {
			'background': '#5fa9cd'
		}
	}]
};

const OPTIONS_CSS = ''+<><![CDATA[
#options{
	margin:auto;
}
input[type="checkbox"], label{
	display:block;
	margin:auto;
}
#outer_styles {
	width:60%;
	text-align:right;
	float:left;
}
#styles {
	float:right;
	margin: 10px !important;
}
#outer_color_picker {
	width:40%;
	text-align:left;
	float:right;
}
#color_picker {
	padding: 10px !important;
	margin: 10px !important;
	border: 1px solid #AAAAAA;
	float:left;
}
#swatch, #red, #green, #blue {
	border: 1px solid #AAAAAA;
	-moz-border-radius: 4px;
}
#red, #green, #blue {
	float: left;
	width: 24px;
	margin: 6px;
}
#swatch {
	float:right;
	width: 120px;
	height: 100px;
	background:#fff;
	margin:6px;
}
#red.ui-slider { background: #ef2929; }
#red .ui-slider-handle { border-color: #ef2929; }
#green.ui-slider { background: #8ae234; }
#green .ui-slider-handle { border-color: #8ae234; }
#blue.ui-slider { background: #729fcf; }
#blue .ui-slider-handle { border-color: #729fcf; }
.ui-slider { 
	width: 24px; 
	height: 255px; 
	position: relative;
	float:left;
}
.ui-slider-handle {
	position: absolute; 
	z-index: 1; 
	height: 12px; 
	width: 28px;
	top: 0px;
	left: 0px;
	background:#fff;
	left:-2px;
	-moz-border-radius: 4px;
}
.ui-slider-handle-active {
	
}
.ui-slider-disabled .ui-slider-handle {
	opacity: 0.5;
}
.ui-slider-range {
	position: absolute;
	background: #50A029;
	opacity: 0.3;
	width: 100%; height: 100%;
}
.clear{
	clear:both;
}
]]></>;


const FORUM_CSS = ''+<><![CDATA[

]]></>;

const COLORS = {
	'f0f8ff':'aliceblue',
	'faebd7':'antiquewhite',
	'00ffff':'aqua',
	'7fffd4':'aquamarine',
	'f0ffff':'azure',
	'f5f5dc':'beige',
	'ffe4c4':'bisque',
	'000000':'black',
	'ffebcd':'blanchedalmond',
	'0000ff':'blue',
	'8a2be2':'blueviolet',
	'a52a2a':'brown',
	'deb887':'burlywood',
	'5f9ea0':'cadetblue',
	'7fff00':'chartreuse',
	'd2691e':'chocolate',
	'ff7f50':'coral',
	'6495ed':'cornflowerblue',
	'fff8dc':'cornsilk',
	'dc143c':'crimson',
	'00ffff':'cyan',
	'00008b':'darkblue',
	'008b8b':'darkcyan',
	'b8860b':'darkgoldenrod',
	'a9a9a9':'darkgray',
	'006400':'darkgreen',
	'a9a9a9':'darkgrey',
	'bdb76b':'darkkhaki',
	'8b008b':'darkmagenta',
	'556b2f':'darkolivegreen',
	'ff8c00':'darkorange',
	'9932cc':'darkorchid',
	'8b0000':'darkred',
	'e9967a':'darksalmon',
	'8fbc8f':'darkseagreen',
	'483d8b':'darkslateblue',
	'2f4f4f':'darkslategray',
	'2f4f4f':'darkslategrey',
	'00ced1':'darkturquoise',
	'9400d3':'darkviolet',
	'ff1493':'deeppink',
	'00bfff':'deepskyblue',
	'696969':'dimgray',
	'696969':'dimgrey',
	'1e90ff':'dodgerblue',
	'b22222':'firebrick',
	'fffaf0':'floralwhite',
	'228b22':'forestgreen',
	'ff00ff':'fuchsia',
	'dcdcdc':'gainsboro',
	'f8f8ff':'ghostwhite',
	'ffd700':'gold',
	'daa520':'goldenrod',
	'808080':'gray',
	'008000':'green',
	'adff2f':'greenyellow',
	'808080':'grey',
	'f0fff0':'honeydew',
	'ff69b4':'hotpink',
	'cd5c5c':'indianred',
	'4b0082':'indigo',
	'fffff0':'ivory',
	'f0e68c':'khaki',
	'e6e6fa':'lavender',
	'fff0f5':'lavenderblush',
	'7cfc00':'lawngreen',
	'fffacd':'lemonchiffon',
	'add8e6':'lightblue',
	'f08080':'lightcoral',
	'e0ffff':'lightcyan',
	'fafad2':'lightgoldenrodyellow',
	'd3d3d3':'lightgray',
	'90ee90':'lightgreen',
	'd3d3d3':'lightgrey',
	'ffb6c1':'lightpink',
	'ffa07a':'lightsalmon',
	'20b2aa':'lightseagreen',
	'87cefa':'lightskyblue',
	'778899':'lightslategray',
	'778899':'lightslategrey',
	'b0c4de':'lightsteelblue',
	'ffffe0':'lightyellow',
	'00ff00':'lime',
	'32cd32':'limegreen',
	'faf0e6':'linen',
	'ff00ff':'magenta',
	'800000':'maroon',
	'66cdaa':'mediumaquamarine',
	'0000cd':'mediumblue',
	'ba55d3':'mediumorchid',
	'9370db':'mediumpurple',
	'3cb371':'mediumseagreen',
	'7b68ee':'mediumslateblue',
	'00fa9a':'mediumspringgreen',
	'48d1cc':'mediumturquoise',
	'c71585':'mediumvioletred',
	'191970':'midnightblue',
	'f5fffa':'mintcream',
	'ffe4e1':'mistyrose',
	'ffe4b5':'moccasin',
	'ffdead':'navajowhite',
	'000080':'navy',
	'fdf5e6':'oldlace',
	'808000':'olive',
	'6b8e23':'olivedrab',
	'ffa500':'orange',
	'ff4500':'orangered',
	'da70d6':'orchid',
	'eee8aa':'palegoldenrod',
	'98fb98':'palegreen',
	'afeeee':'paleturquoise',
	'db7093':'palevioletred',
	'ffefd5':'papayawhip',
	'ffdab9':'peachpuff',
	'cd853f':'peru',
	'ffc0cb':'pink',
	'dda0dd':'plum',
	'b0e0e6':'powderblue',
	'800080':'purple',
	'ff0000':'red',
	'bc8f8f':'rosybrown',
	'4169e1':'royalblue',
	'8b4513':'saddlebrown',
	'fa8072':'salmon',
	'f4a460':'sandybrown',
	'2e8b57':'seagreen',
	'fff5ee':'seashell',
	'a0522d':'sienna',
	'c0c0c0':'silver',
	'87ceeb':'skyblue',
	'6a5acd':'slateblue',
	'708090':'slategray',
	'fffafa':'snow',
	'00ff7f':'springgreen',
	'4682b4':'steelblue',
	'd2b48c':'tan',
	'008080':'teal',
	'd8bfd8':'thistle',
	'ff6347':'tomato',
	'40e0d0':'turquoise',
	'ee82ee':'violet',
	'f5deb3':'wheat',
	'ffffff':'white',
	'f5f5f5':'whitesmoke',
	'ffff00':'yellow',
	'9acd32':'yellowgreen'
};

// Initalization

var init = function(){
	
	//If it's a new install, upgrade or downgrade
	if ((VERSION !== GM_getValue('version')) && !GM_getValue('disabled')) {
		install();
	}
	
	//If it's disabled
	if (GM_getValue('disabled') === true) {
		return;
	}
	
	settings = eval(GM_getValue('settings'));
	
	//Decide what to do
	
	if (/includes2\/options\.php/.test(PATH)) {
		optionsMenu();
	}
	
	if (PATH === '/theGame/includes2/options.php?p=forum') {
		options();
	}
	else if (PATH === '/theGame/mainincludes/forum.php?pop=yes') {
		addClasses();
		addStyle();
		lastPost();
	}
	else if (/action=viewcat&cat=/.test(PATH)) {
		addClasses();
		addStyle();
		lastPost();
	}
	else if ( /&lastpost=true/.test(PATH) ) {
		goToLastPage();
	}
	else if ( /&scroll=true/.test(PATH) ) {
		scrollDown();
	}
};

var install = function(){
	currentVersion = GM_getValue('version');
	
	//new Install
	if (!currentVersion) {
		GM_setValue('settings', uneval(DEFAULT_SETTINGS));
		GM_setValue('disabled', false);
		alert('Installed. Default settings applied.')
	}
	//upgrade
	else if (currentVersion < VERSION) {
		Q.extend(DEFAULT_SETTINGS, eval(GM_getValue('settings')));
		GM_setValue('settings', uneval(DEFAULT_SETTINGS));
		GM_setValue('disabled', false);
		alert('Script upgraded.');
	}
	//downgrade
	else if (currentVersion > VERSION) {
		alert("please don't downgrade. Script disabled.");
		GM_setValue('disabled', true);
		return;
	}
	
	GM_setValue('version', VERSION)
}

var addClasses = function(){
	Q('table:last tr').each(
		function(i) {
			var href = Q('a',this).attr('href');
			var category = /cat=(\d+)/.exec(href);
			
			if (!category) {
				return;
			}
			
			Q(this)
				.addClass('forum_category')
				.addClass('forum_category_' + category[1]);
		}
	);
}

var lastPost = function(){
	
	Q('.forum_category').each(
		function(i){
			var link = Q('a',this);
			newLink = <span><a href={link.attr('href') + '&lastpost=true'} class="last_post">last post</a></span>;
			link.after(''+newLink);
		}
	);
}

var goToLastPage = function(){

	var newURL = Q('font[color=white]')
		.parent('b')
		.children('a:last')
		.attr('href');
		
	newURL ? location.replace('http://www.syrnia.com/theGame/mainincludes/' + newURL + '&scroll=true' ) : scrollDown();
}

var scrollDown = function(){
	window.scroll(0, 9999);
}

var options = function(){
	var table = <table id="styles">
		<thead>
			<tr>
				<th>Category</th>
				<th>Colour</th>
				<th>Background</th>
				<th>Hidden</th>
			</tr>
		</thead>
		<tbody/>
	</table>;
	var colorPicker = <div id="color_picker">
			<div id="swatch"></div>
			<div id="red"></div>
			<div id="green"></div>
			<div id="blue"></div>
			<div class="clear"></div>
		</div>;

	for (s in settings.styles) if (settings.styles.hasOwnProperty(s)) {

		//log('title: ' + settings.styles[s].title);
		
		var color = settings.styles[s].css.color || '';
		var background = settings.styles[s].css.background || '';
		var checked = settings.styles[s].css.display === 'none' ? true : false;
		var title = settings.styles[s].title;
		
		
		var tr = 
		<tr id={s} class="style">
			<td id={s+'_title'}>{title}</td>
			<td>
				<input id={s+'_color'} name={s+'_color'} value={color} />
			</td>
			<td>
				<input id={s+'_background'} name={s+'_background'} value={background} />
			</td>
			<td>
				<label for={s+'_display'}>
					{checked ? <input type="checkbox" id={s+'_display'} name={s+'_display'} checked="checked" value="none" />:<input type="checkbox" id={s+'_display'} name={s+'_display'} value="none" />}
				</label>
			</td>
		</tr>;
		
		table.tbody = tr + table.tbody;
	}
	div = Q(''+<div id="options"><div id="outer_color_picker">{colorPicker}</div> <div id="outer_styles">{table}</div><div class="clear" /></div>);
	
	Q('input', div).bind('change', optionsColouring);
	Q('input', div).bind('focus', colorSwatch);
	
	Q(Q('table')[1]).after(div);
	
	optionsColouring();

	sliders = Q('#red, #green, #blue').slider({
    	axis: 'vertical',
		max: 255,
		slide: refreshSwatch,
		change:	refreshSwatch
	});
	
	GM_addStyle(OPTIONS_CSS);
	
	if (window.outerWidth < 800) {
		window.resizeTo(800, window.outerHeight)
	}
};

var optionsMenu = function(){

	var optionNavigation = Q('ul')[0]
	Q(optionNavigation).append('<li><a href="options.php?p=forum">Forum Options</a><br/></li>');
	
};

var optionsColouring = function(){
	Q('#styles tbody tr').each(function(){

		var id = this.id
		var color = Q('#' + id + '_color').val();
		var background = Q('#' + id + '_background').val();
		var display = Q('#' + id + '_display:checked').val();
		
		settings.styles[id].css.color = color;
		settings.styles[id].css.background = background;
		settings.styles[id].css.display = display;
		
		Q(this).css(settings.styles[id].css);
		
		Q(this).css({
			'display': 'table-row',
			'opacity': (display === 'none' ? '0.3' : '1')
		});
	});
	
	GM_setValue('settings', uneval(settings));
};

var addStyle = function(){

	var CSS = '';
	
	for (s in settings.styles) 
		if (settings.styles.hasOwnProperty(s)) {
			CSS += settings.styles[s].selector + ' { '
			
			for (p in settings.styles[s].css) if (settings.styles[s].css.hasOwnProperty(p)) {
				CSS += p + ':' + settings.styles[s].css[p] + ' !important;'
			}
			
			CSS += '}';
		}
	GM_addStyle(FORUM_CSS);
	GM_addStyle(CSS);
};

var log = function(msg){
	if (DEBUG !== true) {
		return;
	}
	(unsafeWindow.console && unsafeWindow.console.log(msg)) || alert(msg);
	(unsafeWindow.msgs && unsafeWindow.msgs.push(msg)) || (unsafeWindow.msgs = [msg]);
};

var colorFromRGB = function(r, g, b) {
	var hex = [
		r.toString(16),
		g.toString(16),
		b.toString(16)
	];
	Q.each(hex, function (nr, val) {
		if (val.length == 1) {
			hex[nr] = '0' + val;
		}
	});
	
	
	hex = hex.join('');
	
	return COLORS[hex] || '#'+hex.toUpperCase();
}

var RGBFromColor = function(color) {
	if (color.indexOf('#') != -1) {
		hex = color.substr(1);
		return rgb = [
			parseInt(hex.substr(0,2),16),
			parseInt(hex.substr(2,2),16),
			parseInt(hex.substr(4,2),16)
		];
	}
	for (c in COLORS) if (COLORS[c] === color) {
		return RGBFromColor('#'+c);
	}
}

var refreshSwatch = function(e, ui) {
	var red = 255 - Q(sliders[0]).slider("value"),
		green = 255 - Q(sliders[1]).slider("value"),
		blue = 255 - Q(sliders[2]).slider("value"),
		color = colorFromRGB(red, green, blue);
	
	var swatch = Q('#swatch');
	swatch.css('background-color', color);
	Q('#'+swatch.attr('for')).val(color);
	optionsColouring();
}

var colorSwatch = function(e) {
	var color = e.target.value;
	var input = e.target.id;
	var rgb = RGBFromColor(color);
	
	Q('#swatch').attr('for',input);
	
	Q(sliders[0]).slider('moveTo', 255 - rgb[0]);
	Q(sliders[1]).slider('moveTo', 255 - rgb[1]);
	Q(sliders[2]).slider('moveTo', 255 - rgb[2]);
}

init();