ETI Color Scheme Randomizer

Randomly generates a new color scheme every page load

// ==UserScript==
// @name           ETI Color Scheme Randomizer
// @namespace      pendevin
// @description    Randomly generates a new color scheme every page load
// @include        http://endoftheinter.net*
// @include        http://boards.endoftheinter.net*
// @include        http://images.endoftheinter.net*
// @include        http://archives.endoftheinter.net*
// @include        https://endoftheinter.net*
// @include        https://boards.endoftheinter.net*
// @include        https://images.endoftheinter.net*
// @include        https://archives.endoftheinter.net*
// @exclude        http://endoftheinter.net/?r=*
// @exclude        http://images.endoftheinter.net/img/*
// @exclude        https://endoftheinter.net/?r=*
// @exclude        https://images.endoftheinter.net/img/*
// @version        1.1
// @require        http://code.jquery.com/jquery-2.1.3.min.js
// ==/UserScript==

//
//  **BEGIN USER SETTINGS**
//

//When true, the script automatically changes the color scheme after a set amount of time as well as each page load
const TIMER=true;

//User defined values
//when Timer is true, defines the interval between color scheme changes
const MINUTES=0;
const SECONDS=.1;

//When true, the script changes the color scheme whenever the 'R' key is pressed
const RRRR=true;

//
//	**END USER SETTINGS**
//

//ll breaks without noconflict jquery
this.$=this.jQuery=jQuery.noConflict(true);

//adds a style to a document and returns the style object *JQUERY
//css is a string, id is an optional string that determines the object's id
function addStyle(css, id) {
	//create a style
	var style = $('<style type="text/css">');
	//add the css data to it
	style.html(css);
	if (id) {
		//remove any style that has our id
		$('#' + id).remove();
		//give our style the id after removing the other stuff. idk if it matters, but i'm too lazy to find out
		style.attr('id', id);
	}
	//add the style into the head
	$('head').append(style);
	//we're outta here
	return style;
}

//Converts an RGB color value to HSV. Conversion formula
//adapted from http://en.wikipedia.org/wiki/HSV_color_space.
//Assumes r, g, and b are contained in the set [0, 255] and
//returns hin the set [0, 360] and, s and v in the set [0, 1].
function rgbToHsl(r,g,b){
	r/=255, g/=255, b/=255;
	var max=Math.max(r,g,b), min=Math.min(r,g,b);
	var h, s, l=(max+min)/2;
	if(max==min)
		h=s=0; // achromatic
	else{
		var d=max-min;
		s=l>0.5?d/(2-max-min):d/(max+min);
		if(max==r)
			h=(g-b)/d+(g<b?6:0);
		else if(max==g)
			h=(b-r)/d+2;
		else if(max==b)
			h=(r-g)/d+4;
		h/=6;
	}
	return [Math.round(h*360), Math.round(s*100), Math.round(l*100)];
}

//takes a color <decimal rgb> and returns a contrasting color
//99% guaranteed readable, 50% guaranteed ugly
function complement(color){
	var hsl=rgbToHsl(color[0],color[1],color[2]);
	hsl[0]=(hsl[0]+180)%360;

	if(hsl[1]<=40)
		hsl[1]=hsl[1]+60;
	else if(hsl[1]<=50)
		hsl[1]=100;
	else if(hsl[1]>=60)
		hsl[1]=hsl[1]-60;
	else if(hsl[1]>50)
		hsl[1]=0;

	if(hsl[2]<=40)
		hsl[2]=hsl[2]+60;
	else if(hsl[2]<50)
		hsl[2]=100;
	else if(hsl[2]>=60)
		hsl[2]=hsl[2]-60;
	else if(hsl[2]>=50)
		hsl[2]=0;
	return hsl;
}

//takes a number and changes it to a random number in a range centered on the input, weighted towards the center
//(input number <0-1>, acceptable range of output <fraction of 1>)
function fudge(input,range){
	var output=range*Math.tan(Math.PI*(Math.random()/2-.25))/2+input;
	if(output>1)
		output=output+range/2;
	else if(output<0)
		output=output-range/2;
	return output;
}

//takes a number and returns a number sort of near it, weighted toward the center
function fudger(color){
	return [Math.round(fudge(color[0]/360,.3)*360),Math.round(fudge(color[1]/100,.2)*100),Math.round(fudge(color[2]/100,.2)*100)];
}

//generates a random rgb color
function randomColor(){
	return [Math.round(Math.random()*255),Math.round(Math.random()*255),Math.round(Math.random()*255)];
}

//make a random color scheme
function randomize(){
	//menubar etc
	var bg1=randomColor()
	var color1=complement(bg1);
	var color11=fudger(color1);
	var color12=fudger(color1);

	//userbar, poll, graph, quickpost, etc
	var bg2=randomColor();
	var color2=complement(bg2);
	var color21=fudger(color2);
	var color22=fudger(color2);

	//infobar, tables, etc
	var bg3=randomColor();
	var color3=complement(bg3);
	var color31=fudger(color3);
	var color32=fudger(color3);

	//body etc
	var bg4=randomColor();
	var color4=complement(bg4);
	var color41=fudger(color4);
	var color42=fudger(color4);

	//message, search, etc
	var bg5=randomColor();
	var color5=complement(bg5);
	var color51=fudger(color5);
	var color52=fudger(color5);

	//message-top etc
	var bg6=randomColor();
	var color6=complement(bg6);
	var color61=fudger(color6);
	var color62=fudger(color6);

	var css="\
		div.menubar, table.classic tr th, table.classic tr th.title, div.stats{\
			background-color:rgb("+bg1[0]+","+bg1[1]+","+bg1[2]+");\
			color:hsl("+color1[0]+","+color1[1]+"%,"+color1[2]+"%);\
		}\
		div.menubar a, table.classic tr th a, div.menubar a:visited, table.classic tr th a:visited, div.stats a, div.stats a:visited{\
			color:hsl("+color1[0]+","+color1[1]+"%,"+color1[2]+"%);\
		}\
		div.menubar a:hover, table.classic tr th a:hover, div.stats a:hover{\
			color:hsl("+color11[0]+","+color11[1]+"%,"+color11[2]+"%);\
		}\
		div.menubar a:active, table.classic tr th a:active, div.stats a:active{\
			color:hsl("+color12[0]+","+color12[1]+"%,"+color12[2]+"%);\
		}\
		\
		div.userbar{\
			background-color:rgb("+bg2[0]+","+bg2[1]+","+bg2[2]+");\
			color:hsl("+color2[0]+","+color2[1]+"%,"+color2[2]+"%);\
		}\
		div.userbar a, div.userbar a:visited{\
			color:hsl("+color2[0]+","+color2[1]+"%,"+color2[2]+"%);\
		}\
		div.userbar a:hover{\
			color:hsl("+color21[0]+","+color21[1]+"%,"+color21[2]+"%);\
		}\
		div.userbar a:active{\
			color:hsl("+color22[0]+","+color22[1]+"%,"+color22[2]+"%);\
		}\
		table.poll div{\
			background-color:rgb("+bg2[0]+","+bg2[1]+","+bg2[2]+");\
		}\
		div.graph{\
			background-color:rgb("+bg2[0]+","+bg2[1]+","+bg2[2]+");\
			border-color:hsl("+color4[0]+","+color4[1]+"%,"+color4[2]+"%);\
		}\
		.quickpost-expanded .quickpost{\
			border-top-color:rgb("+bg2[0]+","+bg2[1]+","+bg2[2]+");\
		}\
		\
		div.infobar, table.grid tr th, div.pager{\
			background-color:rgb("+bg3[0]+","+bg3[1]+","+bg3[2]+");\
			color:hsl("+color3[0]+","+color3[1]+"%,"+color3[2]+"%);\
		}\
		div.infobar a, table.grid tr th a, div.infobar a:visited, table.grid tr th a:visited, div.pager a, div.pager a:visited{\
			background-color:rgb("+bg3[0]+","+bg3[1]+","+bg3[2]+");\
			color:hsl("+color3[0]+","+color3[1]+"%,"+color3[2]+"%);\
		}\
		div.infobar a:hover, table.grid tr th a:hover, div.pager a:hover{\
			color:hsl("+color31[0]+","+color31[1]+"%,"+color31[2]+"%);\
		}\
		div.infobar a:active, table.grid tr th a:active, div.pager a:active{\
			color:hsl("+color32[0]+","+color32[1]+"%,"+color32[2]+"%);\
		}\
		.quoter-button{\
			background-color:rgb("+bg3[0]+","+bg3[1]+","+bg3[2]+");\
			color:hsl("+color3[0]+","+color3[1]+"%,"+color3[2]+"%);\
			border-color:rgb("+bg2[0]+","+bg2[1]+","+bg2[2]+");\
		}\
		a.quoter-button:visited{\
			color:hsl("+color3[0]+","+color3[1]+"%,"+color3[2]+"%);\
		}\
		\
		body{\
			background:rgb("+bg4[0]+","+bg4[1]+","+bg4[2]+");\
			color:hsl("+color4[0]+","+color4[1]+"%,"+color4[2]+"%);\
		}\
		textarea.locked, .quickpost{\
			background-color:rgb("+bg4[0]+","+bg4[1]+","+bg4[2]+");\
		}\
		.imagemap{\
			background-color:rgb("+bg4[0]+","+bg4[1]+","+bg4[2]+");\
			border-color:rgb("+bg2[0]+","+bg2[1]+","+bg2[2]+");\
		}\
		a{\
			color:hsl("+color41[0]+","+color41[1]+"%,"+color41[2]+"%);\
		}\
		a:visited{\
			color:hsl("+color42[0]+","+color42[1]+"%,"+color42[2]+"%);\
		}\
		a span.m{\
			border-bottom-color:hsl("+color41[0]+","+color41[1]+"%,"+color41[2]+"%);\
		}\
		a:visited span.m{\
			border-bottom-color:hsl("+color42[0]+","+color42[1]+"%,"+color42[2]+"%);\
		}\
		table.grid tr td, table.grid tr th{\
			border-color:rgb("+bg4[0]+","+bg4[1]+","+bg4[2]+");\
		}\
		\
		table.search th, table.search tr td, div.graph span, table.message-body tr td.message, div.message, table.message-body tr td.userpic, table.grid tr td,\
		.image_grid .grid_block .block_desc,.quoted-message .message-top{\
			background-color:rgb("+bg5[0]+","+bg5[1]+","+bg5[2]+");\
			color:hsl("+color5[0]+","+color5[1]+"%,"+color5[2]+"%);\
		}\
		table.message-body tr td.message a, div.message a, table.grid tr td a, .image_grid .grid_block .block_desc a, .quoted-message a,\
		.quoted-message .message-top a{\
			color:hsl("+color51[0]+","+color51[1]+"%,"+color51[2]+"%);\
		}\
		table.message-body tr td.message a:visited, div.message a:visited, table.grid tr td a:visited, .image_grid .grid_block .block_desc a:visited,\
		.quoted-message a:visited, .quoted-message .message-top a:visited{\
			color:hsl("+color52[0]+","+color52[1]+"%,"+color52[2]+"%);\
		}\
		.quoted-message{\
			background-color:rgb("+bg5[0]+","+bg5[1]+","+bg5[2]+");\
			color:hsl("+color5[0]+","+color5[1]+"%,"+color5[2]+"%);\
			border-left-color:rgb("+bg6[0]+","+bg6[1]+","+bg6[2]+");\
		}\
		.quickpost .quickpost-nub{\
			background-color:rgb("+bg5[0]+","+bg5[1]+","+bg5[2]+");\
			color:hsl("+color5[0]+","+color5[1]+"%,"+color5[2]+"%);\
			border-color:rgb("+bg2[0]+","+bg2[1]+","+bg2[2]+");\
		}\
		\
		div.message-top{\
			background-color:rgb("+bg6[0]+","+bg6[1]+","+bg6[2]+");\
			color:hsl("+color6[0]+","+color6[1]+"%,"+color6[2]+"%);\
		}\
		div.message-top a{\
			color:hsl("+color61[0]+","+color61[1]+"%,"+color61[2]+"%);\
		}\
		div.message-top a:visited{\
			color:hsl("+color62[0]+","+color62[1]+"%,"+color62[2]+"%);\
		}\
		\
		span.window-header-title{\
			color:#000000;\
		}\
	";

	//oh man if you don't let the styles build up, then there's hardly any lag
	if(document.getElementById('Random_Colors'))
		document.head.removeChild(document.getElementById('Random_Colors'));
	addStyle(css,'Random_Colors');
}

randomize();
if(TIMER)
	window.setInterval(randomize,MINUTES*60000+SECONDS*1000);
if(RRRR)
	document.addEventListener('keypress',function(e){if(e.charCode==114)randomize();},false);
GM_registerMenuCommand("Randomize Color Scheme",randomize,"R");