Greasy Fork is available in English.

BvS Synchro Helper

BvS WorldKai Synchro Helper 1.3

// ==UserScript==
// @name           BvS Synchro Helper
// @namespace      rvBvS
// @description    BvS WorldKai Synchro Helper 1.3
// @include        http*://*animecubed.com/billy/bvs/worldkaiju-group.html
// @include        http*://*animecubedgaming.com/billy/bvs/worldkaiju-group.html
// @version        1.5
// @history        1.5 New domain - animecubedgaming.com - Channel28
// @history        1.4 Now https compatible (Updated by Channel28)
// @history        1.3 Made more compliant
// ==/UserScript==

const GMSTORAGE_PATH = "BvS_Synchro_";


var match;
	
var possibilities = [];
var guesses = [];
var responses = [];
var previousGuesses = [];	//guess1, guess2, guess3, guess4, correct, wrong position

var elementDisplay = ["Fire", "Lightning", "Water", "Earth", "Wind", "RNG", "Awesome", "Code", "XXXX"];
var reverseElements = {"Fire" : 0, "Lightning" : 1, "Water" : 2, "Earth" : 3, "Wind" : 4, "RNG" : 5, "Awesome" : 6, "Code" : 7, "XXXX" : 8};
var standardFirstGuess = null;
var legacyHelp;
var guess = null;

var element1;
var element2;
var element3;
var element4;

var numberofcolors;
var possibilitiesleft = null;
var allowpossibilitiesdisplay = false;
var possibilitydisplaypage = 0;

function load(ev) {
	try {
		var temp = document.getElementsByName("c1");
		if ((temp != null) && (temp.length > 0)) {
			element1 = temp[0];
			element2 = document.getElementsByName("c2")[0];
			element3 = document.getElementsByName("c3")[0];
			element4 = document.getElementsByName("c4")[0];

			numberofcolors = element1.options.length;

			legacyHelp = getLegacyHelp();
	
			getPreviousGuesses();

			if (previousGuesses.length <= 1) {
				if (legacyHelp == null) {
					switch (numberofcolors) {
					case 1: standardFirstGuess = [0, 0, 0, 0];	break;
					case 2: standardFirstGuess = [0, 0, 1, 1];	break;
					case 3: standardFirstGuess = [0, 0, 0, 1];	break;
					case 4: standardFirstGuess = [0, 0, 1, 2];	break;
					case 5: standardFirstGuess = [0, 0, 1, 1];	break;
					case 6: standardFirstGuess = [0, 0, 1, 1];	break;
					case 7: standardFirstGuess = [0, 1, 2, 3];	break;
					case 8: standardFirstGuess = [0, 1, 2, 3];	break;
					}
				} else {
					switch (numberofcolors) {
					case 2: standardFirstGuess = [0, 0, 0, 1];	break;
					case 3: standardFirstGuess = [1, 0, 0, 2];	break;
					case 4: standardFirstGuess = [1, 0, 1, 2];	break;
					case 5: standardFirstGuess = [1, 2, 3, 4];	break;
					case 6: standardFirstGuess = [1, 1, 2, 2];	break;
					case 7: standardFirstGuess = [1, 0, 2, 3];	break;
					case 8: standardFirstGuess = [1, 2, 3, 4];	break;
					}
	
					if (standardFirstGuess != null) {
						standardFirstGuess[0] += legacyHelp;
						standardFirstGuess[1] += legacyHelp;
						standardFirstGuess[2] += legacyHelp;
						standardFirstGuess[3] += legacyHelp;
	
						standardFirstGuess[0] %= numberofcolors;
						standardFirstGuess[1] %= numberofcolors;
						standardFirstGuess[2] %= numberofcolors;
						standardFirstGuess[3] %= numberofcolors;
					}
				}
			}
	
			if ((previousGuesses.length == 0) && (standardFirstGuess != null)) {
				guess = standardFirstGuess;
	
				if (legacyHelp == null)
					possibilitiesleft = numberofcolors * numberofcolors * numberofcolors * numberofcolors;
				else
					possibilitiesleft = (numberofcolors - 1) * numberofcolors * numberofcolors * numberofcolors;
			} else if ((previousGuesses.length == 1) && (numberofcolors >= 4) && (numberofcolors <= 8) && (compareArray(previousGuesses[0], standardFirstGuess, 4))) {
				var index = Math.floor((previousGuesses[0][4] * 11 - previousGuesses[0][4] * previousGuesses[0][4]) / 2) + previousGuesses[0][5];

				if (legacyHelp == null) {
					switch (numberofcolors) {
					case 4:
						switch (index) {
						case 0: guess = [3, 3, 3, 3];	possibilitiesleft = 1;		break;
						case 1: guess = [3, 3, 1, 3];	possibilitiesleft = 16;		break;
						case 2: guess = [3, 3, 0, 1];	possibilitiesleft = 42;		break;
						case 3: guess = [1, 3, 2, 0];	possibilitiesleft = 20;		break;
						case 4: guess = [1, 2, 0, 0];	possibilitiesleft = 2;		break;
						case 5: guess = [0, 3, 2, 3];	possibilitiesleft = 18;		break;
						case 6: guess = [0, 3, 0, 3];	possibilitiesleft = 46;		break;
						case 7: guess = [0, 1, 2, 1];	possibilitiesleft = 40;		break;
						case 8: guess = [0, 1, 2, 0];	possibilitiesleft = 4;		break;
						case 9: guess = [0, 3, 0, 3];	possibilitiesleft = 29;		break;
						case 10:guess = [0, 1, 1, 0];	possibilitiesleft = 20;		break;
						case 11:guess = [0, 1, 0, 2];	possibilitiesleft = 5;		break;
						case 12:guess = [0, 1, 1, 3];	possibilitiesleft = 12;		break;
						}
						break;
					case 5:
						switch (index) {
						case 0: guess = [2, 2, 2, 3];	possibilitiesleft = 81;		break;
						case 1: guess = [1, 2, 0, 2];	possibilitiesleft = 108;	break;
						case 2: guess = [1, 2, 0, 3];	possibilitiesleft = 54;		break;
						case 3: guess = [0, 1, 0, 2];	possibilitiesleft = 12;		break;
						case 4: guess = [1, 1, 0, 0];	possibilitiesleft = 1;		break;
						case 5: guess = [0, 2, 1, 2];	possibilitiesleft = 108;	break;
						case 6: guess = [0, 2, 0, 0];	possibilitiesleft = 120;	break;
						case 7: guess = [0, 1, 0, 2];	possibilitiesleft = 28;		break;
						case 8:	break;
						case 9: guess = [0, 2, 0, 2];	possibilitiesleft = 68;		break;
						case 10:guess = [0, 1, 1, 2];	possibilitiesleft = 24;		break;
						case 11:guess = [0, 1, 0, 2];	possibilitiesleft = 4;		break;
						case 12:guess = [0, 0, 2, 3];	possibilitiesleft = 16;		break;
						}
						break;
					case 6:
						switch (index) {
						case 0: guess = [2, 2, 3, 4];	possibilitiesleft = 256;	break;
						case 1: guess = [1, 2, 3, 3];	possibilitiesleft = 256;	break;
						case 2: guess = [1, 2, 3, 3];	possibilitiesleft = 96;		break;
						case 3: guess = [0, 1, 0, 2];	possibilitiesleft = 16;		break;
						case 4: guess = [1, 1, 0, 0];	possibilitiesleft = 1;		break;
						case 5: guess = [0, 2, 3, 3];	possibilitiesleft = 256;	break;
						case 6: guess = [0, 0, 2, 3];	possibilitiesleft = 208;	break;
						case 7: guess = [0, 1, 0, 2];	possibilitiesleft = 36;		break;
						case 8:	break;
						case 9: guess = [0, 1, 2, 3];	possibilitiesleft = 114;	break;
						case 10:guess = [0, 1, 1, 2];	possibilitiesleft = 32;		break;
						case 11:guess = [0, 1, 0, 2];	possibilitiesleft = 4;		break;
						case 12:guess = [0, 1, 1, 2];	possibilitiesleft = 20;		break;
						}
						break;
					case 7:
						switch (index) {
						case 0: guess = [4, 4, 4, 5];	possibilitiesleft = 81;		break;
						case 1: guess = [0, 4, 4, 5];	possibilitiesleft = 444;	break;
						case 2: guess = [1, 2, 4, 2];	possibilitiesleft = 582;	break;
						case 3: guess = [1, 2, 4, 2];	possibilitiesleft = 180;	break;
						case 4: guess = [0, 0, 0, 1];	possibilitiesleft = 9;		break;
						case 5: guess = [4, 4, 5, 5];	possibilitiesleft = 256;	break;
						case 6: guess = [0, 1, 4, 5];	possibilitiesleft = 432;	break;
						case 7: guess = [0, 0, 1, 1];	possibilitiesleft = 168;	break;
						case 8: guess = [0, 0, 1, 2];	possibilitiesleft = 8;		break;
						case 9: guess = [0, 2, 4, 5];	possibilitiesleft = 150;	break;
						case 10:guess = [0, 0, 1, 1];	possibilitiesleft = 60;		break;
						case 11:guess = [0, 0, 1, 1];	possibilitiesleft = 6;		break;
						case 12:guess = [0, 0, 1, 1];	possibilitiesleft = 24;		break;
						}
						break;
					case 8:
						switch (index) {
						case 0: guess = [4, 4, 5, 6];	possibilitiesleft = 256;	break;
						case 1: guess = [4, 4, 5, 5];	possibilitiesleft = 976;	break;
						case 2: guess = [1, 2, 0, 4];	possibilitiesleft = 936;	break;
						case 3: guess = [1, 2, 4, 2];	possibilitiesleft = 224;	break;
						case 4: guess = [0, 0, 0, 1];	possibilitiesleft = 9;		break;
						case 5: guess = [4, 4, 5, 5];	possibilitiesleft = 500;	break;
						case 6: guess = [0, 1, 4, 5];	possibilitiesleft = 660;	break;
						case 7: guess = [0, 0, 1, 1];	possibilitiesleft = 204;	break;
						case 8: guess = [0, 0, 1, 2];	possibilitiesleft = 8;		break;
						case 9: guess = [0, 2, 4, 5];	possibilitiesleft = 216;	break;
						case 10:guess = [0, 0, 1, 1];	possibilitiesleft = 72;		break;
						case 11:guess = [0, 0, 1, 1];	possibilitiesleft = 6;		break;
						case 12:guess = [0, 0, 1, 1];	possibilitiesleft = 28;		break;
						}
						break;
					}
				} else {
					switch(numberofcolors) {
					case 4:
						switch (index) {
						case 0: guess = [3, 3, 3, 3];	possibilitiesleft = 1;		break;
						case 1: guess = [0, 2, 2, 3];	possibilitiesleft = 12;		break;
						case 2: guess = [3, 1, 0, 3];	possibilitiesleft = 28;		break;
						case 3: guess = [3, 1, 2, 0];	possibilitiesleft = 12;		break;
						case 4: guess = [2, 1, 0, 1];	possibilitiesleft = 1;		break;
						case 5: guess = [0, 2, 3, 2];	possibilitiesleft = 14;		break;
						case 6: guess = [1, 1, 3, 3];	possibilitiesleft = 34;		break;
						case 7: guess = [1, 0, 2, 0];	possibilitiesleft = 30;		break;
						case 8: guess = [1, 1, 2, 0];	possibilitiesleft = 3;		break;
						case 9: guess = [3, 1, 1, 3];	possibilitiesleft = 24;		break;
						case 10:guess = [1, 1, 3, 2];	possibilitiesleft = 17;		break;
						case 11:guess = [2, 0, 1, 1];	possibilitiesleft = 4;		break;
						case 12:guess = [0, 0, 1, 3];	possibilitiesleft = 11;		break;
						}
						break;
					case 5:
						switch (index) {
						case 0:	break;
						case 1: guess = [0, 0, 0, 4];	possibilitiesleft = 12;		break;
						case 2: guess = [0, 0, 1, 2];	possibilitiesleft = 90;		break;
						case 3: guess = [2, 0, 2, 3];	possibilitiesleft = 81;		break;
						case 4: guess = [0, 1, 1, 2];	possibilitiesleft = 9;		break;
						case 5: guess = [0, 0, 1, 3];	possibilitiesleft = 20;		break;
						case 6: guess = [2, 0, 1, 1];	possibilitiesleft = 93;		break;
						case 7: guess = [2, 1, 0, 1];	possibilitiesleft = 87;		break;
						case 8: guess = [1, 1, 2, 3];	possibilitiesleft = 8;		break;
						case 9: guess = [1, 0, 1, 2];	possibilitiesleft = 45;		break;
						case 10:guess = [0, 1, 1, 4];	possibilitiesleft = 33;		break;
						case 11:guess = [1, 1, 2, 2];	possibilitiesleft = 6;		break;
						case 12:guess = [2, 2, 0, 1];	possibilitiesleft = 15;		break;
						}
						break;
					case 6:
						switch (index) {
						case 0: guess = [3, 0, 3, 4];	possibilitiesleft = 192;	break;
						case 1: guess = [3, 3, 1, 4];	possibilitiesleft = 208;	break;
						case 2: guess = [3, 0, 1, 3];	possibilitiesleft = 84;		break;
						case 3: guess = [2, 0, 1, 2];	possibilitiesleft = 15;		break;
						case 4: guess = [2, 2, 1, 1];	possibilitiesleft = 1;		break;
						case 5: guess = [3, 3, 2, 4];	possibilitiesleft = 208;	break;
						case 6: guess = [3, 0, 2, 2];	possibilitiesleft = 183;	break;
						case 7: guess = [1, 2, 1, 3];	possibilitiesleft = 34;		break;
						case 8:	break;
						case 9: guess = [2, 1, 0, 3];	possibilitiesleft = 101;	break;
						case 10:guess = [1, 2, 2, 3];	possibilitiesleft = 30;		break;
						case 11:guess = [0, 1, 1, 2];	possibilitiesleft = 4;		break;
						case 12:guess = [1, 0, 1, 2];	possibilitiesleft = 19;		break;
						}
						break;
					case 7:
						switch (index) {
						case 0: guess = [4, 4, 4, 5];	possibilitiesleft = 81;		break;
						case 1: guess = [4, 5, 2, 5];	possibilitiesleft = 396;	break;
						case 2: guess = [2, 4, 1, 1];	possibilitiesleft = 466;	break;
						case 3: guess = [4, 1, 1, 2];	possibilitiesleft = 131;	break;
						case 4: guess = [2, 3, 0, 1];	possibilitiesleft = 6;		break;
						case 5: guess = [1, 4, 3, 5];	possibilitiesleft = 240;	break;
						case 6: guess = [1, 0, 4, 5];	possibilitiesleft = 375;	break;
						case 7: guess = [2, 4, 1, 2];	possibilitiesleft = 135;	break;
						case 8: guess = [0, 0, 0, 2];	possibilitiesleft = 6;		break;
						case 9: guess = [2, 0, 4, 5];	possibilitiesleft = 140;	break;
						case 10:guess = [1, 2, 4, 2];	possibilitiesleft = 53;		break;
						case 11:guess = [0, 0, 0, 3];	possibilitiesleft = 5;		break;
						case 12:guess = [2, 0, 1, 4];	possibilitiesleft = 23;		break;
						}
						break;
					case 8:
						switch (index) {
						case 0: guess = [5, 0, 5, 6];	possibilitiesleft = 192;	break;
						case 1: guess = [5, 5, 6, 6];	possibilitiesleft = 807;	break;
						case 2: guess = [2, 0, 4, 5];	possibilitiesleft = 837;	break;
						case 3: guess = [2, 3, 5, 3];	possibilitiesleft = 213;	break;
						case 4: guess = [0, 1, 1, 2];	possibilitiesleft = 9;		break;
						case 5: guess = [1, 0, 5, 5];	possibilitiesleft = 425;	break;
						case 6: guess = [5, 2, 3, 6];	possibilitiesleft = 597;	break;
						case 7: guess = [1, 1, 2, 2];	possibilitiesleft = 195;	break;
						case 8: guess = [1, 1, 2, 3];	possibilitiesleft = 8;		break;
						case 9: guess = [2, 5, 3, 6];	possibilitiesleft = 198;	break;
						case 10:guess = [0, 1, 3, 5];	possibilitiesleft = 69;		break;
						case 11:guess = [1, 1, 2, 2];	possibilitiesleft = 6;		break;
						case 12:guess = [2, 1, 3, 3];	possibilitiesleft = 27;		break;
						}
						break;
					}				
	
					if (guess != null) {
						guess[0] += legacyHelp;
						guess[1] += legacyHelp;
						guess[2] += legacyHelp;
						guess[3] += legacyHelp;
	
						guess[0] %= numberofcolors;
						guess[1] %= numberofcolors;
						guess[2] %= numberofcolors;
						guess[3] %= numberofcolors;
					}
				}
			} else {
				makePossibilities();
	
				for (var i = 0; i < previousGuesses.length; i++) {
					cleanse([previousGuesses[i][4], previousGuesses[i][5]], [previousGuesses[i][0], previousGuesses[i][1], previousGuesses[i][2], previousGuesses[i][3]], true);
				}
	
				allowpossibilitiesdisplay = true;
				possibilitiesleft = possibilities.length;

				if (possibilities.length == 1) {
					guess = guesses[possibilities[0]];
				} else {
					for (var i = 0; i < 3; i++) {
						for (var j = 0; j < 5 - i; j++) {
							responses.push([i, j]);
						}
					}
					responses.push([3, 0]);

					guess = findBestGuess();
				}
			}

			element1.selectedIndex = guess[0];
			element2.selectedIndex = guess[1];
			element3.selectedIndex = guess[2];
			element4.selectedIndex = guess[3];

			if (possibilitiesleft) {
				var temp = document.evaluate("//center/table/tbody/tr/td/form", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
	
				if ((temp != null) && (temp.snapshotLength > 0)) {
					temp = temp.snapshotItem(0);
	
					var helper = document.createElement("div");
					var helperText = "<font size='+1' color='#A10000'><b>Possibilities Remaining</b></font>: " + possibilitiesleft + "<br />\n<div id='rvExpandSynchroDisplay'></div><div id='rvSynchroLinks'>";
	
					if (allowpossibilitiesdisplay)
						helperText += "<a href='javascript:;' id='rvExpandPossibilities' style='font-size: 12px; color: #a10000;' onfocus='this.blur();'><b>Expand Possibilities</b></a>";
	
					helperText += "</div>";
	
					helper.setAttribute("id", "rvMiniSynchroDisplay");
					helper.innerHTML = helperText;
	
					temp.parentNode.insertBefore(helper, temp.nextSibling);
	
					if (allowpossibilitiesdisplay)
						document.getElementById("rvExpandPossibilities").addEventListener("click", function() { ExpandPossibilities(0); }, false);
				} else {
					alert("Error:\n\nFailed to find spot to put helper");
				}
			}
		}
	} catch (e) { alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message); }
}

Array.prototype.remove = function(from, to) {
  var rest = this.slice((to || from) + 1 || this.length);
  this.length = from < 0 ? this.length + from : from;
  return this.push.apply(this, rest);
};

function ArrayRemove(array, from, to) {
	var rest = array.slice((to || from) + 1 || array.length);
	array.length = from < 0 ? array.length + from : from;
	array.push.apply(array, rest);

	return array;
}

function compareArray(arr1, arr2, maxColumn) {
	if ((maxColumn == null) || (maxColumn == undefined)) maxColumn = arr1.length;

	for (var i = 0; i < maxColumn; i++) {
		if (arr1[i] != arr2[i]) return false;
	}

	return true;
}

function getLegacyHelp() {
	var snap = document.evaluate("//form/center/font/b", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);

	if ((snap == null) && (snap.snapshotLength == 0))
		return null;

	for (var i = 0; temp = snap.snapshotItem(i); i++) {
		if (match = temp.textContent.match("Legacy Hint\\: You have a strong feeling that the first Chakra isn't (.*)\\.\\.")) {
			return reverseElements[match[1]];
		}
	}

	return null;
}

function getPreviousGuesses() {
	var snap = document.evaluate("//center/table/tbody/tr/td/center/table/tbody/tr/td/table/tbody/tr", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);

	if ((snap == null) && (snap.snapshotLength == 0))
		return;

	for (var i = 0; temp = snap.snapshotItem(i); i++) {
		temp = temp.childNodes;
		previousGuesses[i] = [];

		for (var j = 0; j < 4; j++) {
			previousGuesses[i][j] = reverseElements[temp[j].textContent];
		}

		if (match = temp[4].textContent.match("(\\d+) / (\\d+)")) {
			previousGuesses[i][4] = (parseInt(match[1]) || 0);
			previousGuesses[i][5] = (parseInt(match[2]) || 0);
		}
	}
}

function makePossibilities() {
	for (var i = 0; i < numberofcolors; i++) {
		for (var j = 0; j < numberofcolors; j++) {
			for (var k = 0; k < numberofcolors; k++) {
				for (var l = 0; l < numberofcolors; l++) {

					if (i != legacyHelp)
						possibilities.push(guesses.length);
					guesses.push([i, j, k, l]);
				}
			}
		}
	}
}

function guessResult(currentguess, solution) {
	var inplace = 0;
	var exist = 0;
	var tempcurrentguess = currentguess.slice(0);
	var tempsolution = solution.slice(0);

	/*for (var i = 0; i < 4; i++) {
		if (tempcurrentguess[i] == tempsolution[i]) {
			inplace++;
			tempcurrentguess[i] = "?";
			tempsolution[i] = "!";
			continue;
		}

		for (var j = 0; j < 4; j++) {
			if (tempcurrentguess[i] == tempsolution[j]) {
				exist++;
				tempcurrentguess[i] = "?";
				tempsolution[j] = "!";
				break;
			}
		}
	}*/

	for (var i = 0; i < 4; i++) {
		if (tempcurrentguess[i] == tempsolution[i]) {
			inplace++;
			tempcurrentguess[i] = "?";
			tempsolution[i] = "!";
		}
	}

	for (var i = 0; i < 4; i++) {
		for (var j = 0; j < 4; j++) {
			if (tempcurrentguess[i] == tempsolution[j]) {
				exist++;
				tempcurrentguess[i] = "?";
				tempsolution[j] = "!";
				break;
			}
		}
	}

	return [inplace, exist];
}

function cleanse(comparison, theguess, apply) {
	var count = 0;

	for (var i = possibilities.length - 1; i >= 0; i--) {
		var lessee = guessResult(theguess, guesses[possibilities[i]]);

		if ((lessee[0] != comparison[0]) || (lessee[1] != comparison[1])) {
			count++;
			if (apply)
				ArrayRemove(possibilities, i);
		}
	}

	return count;
}

function guessScore(guess) {
	var thisguessscore = 99999;

	for (var j = 0; j < responses.length; j++) {
		thisguessscore = Math.min(thisguessscore, cleanse(responses[j], guess, false));
	}

	return thisguessscore;
}

function findBestGuess() {
	var bestguessscore = 0;
	var possible = false;
	var thisguessscore;
	var bestguess;

	for (var i = 0; i < guesses.length; i++) {
		thisguessscore = guessScore(guesses[i]);

		if (thisguessscore > bestguessscore) {
			bestguessscore = thisguessscore;
			bestguess = guesses[i];
			possible = (possibilities.indexOf(i) != -1);
		} else if ((thisguessscore == bestguessscore) && (!possible) && (possibilities.indexOf(i) != -1)) {
			bestguess = guesses[i];
			possible = true;
		}
	}

	return bestguess;
}

function ExpandPossibilities(pagescroll) {
	try {
		var helperText = "";

		possibilitydisplaypage += pagescroll;

		helperText += "<table border='0' cellspacing='0' cellpadding='0'>";

		var temp;
		var i;
		var j;
		for (i = 0; i < 10; i++) {
			j = i + possibilitydisplaypage*10;
			if (j >= possibilitiesleft)
				break;

			temp = guesses[possibilities[j]];
			helperText += ("<tr><td><b>Possibility #" + j + "</b>:&nbsp;</td><td>" + elementDisplay[temp[0]] + ",&nbsp;</td><td>" + elementDisplay[temp[1]] + ",&nbsp;</td><td>" + elementDisplay[temp[2]] + ",&nbsp;</td><td>" + elementDisplay[temp[3]] + "</td></tr>\n");
		}

		helperText += "</table>";

		document.getElementById("rvExpandSynchroDisplay").innerHTML = helperText;

		if (pagescroll == 0) {
			helperText = "<a href='javascript:;' id='rvNextSet' style='display: inline; font-size: 12px; color: #a10000;' onfocus='this.blur();'><b>Next 10</b></a>";
			helperText += " <a href='javascript:;' id='rvPreviousSet' style='display: inline; font-size: 12px; color: #a10000;' onfocus='this.blur();'><b>Previous 10</b></a>";

			document.getElementById("rvSynchroLinks").innerHTML = helperText;

			document.getElementById("rvNextSet").addEventListener("click", function() { ExpandPossibilities(+1); }, false);
			document.getElementById("rvPreviousSet").addEventListener("click", function() { ExpandPossibilities(-1); }, false);
		}

		if ((i == 10) && (j < possibilitiesleft-1))
			document.getElementById("rvNextSet").style.display = 'block';
		else
			document.getElementById("rvNextSet").style.display = 'none';

		if (possibilitydisplaypage > 0)
			document.getElementById("rvPreviousSet").style.display = 'block';
		else
			document.getElementById("rvPreviousSet").style.display = 'none';
	} catch (e) { alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message); }
}

var gvar = new Object();

function GM_ApiBrowserCheck() {
	if (typeof(unsafeWindow) == 'undefined') { unsafeWindow=window; }
	if (typeof(GM_log) == 'undefined') { GM_log = function(msg) { try { unsafeWindow.console.log('GM_log: ' + msg); } catch(e) {} }; }
	GM_clog = function(msg) { if (arguments.callee.counter) { arguments.callee.counter++; } else { arguments.callee.counter=1; } GM_log('('+arguments.callee.counter+') '+msg); }
	GM_addGlobalStyle = function(css) {
		var sel = document.createElement('style');
		sel.setAttribute('type','text/css');
		sel.appendChild(document.createTextNode(css));
		var hel = document.documentElement.firstChild;
		while (hel && hel.nodeName != 'HEAD') { hel=hel.nextSibling; }
		if (hel && hel.nodeName == 'HEAD') { hel.appendChild(sel); } else { document.body.insertBefore(sel,document.body.firstChild); }
		return sel;
	}
	
	var needApiUpgrade=false;

	if(window.navigator.appName.match(/^opera/i) && typeof(window.opera) != 'undefined') {
		needApiUpgrade=true; gvar.isOpera=true; GM_log=window.opera.postError; GM_log('Opera detected...');
	}

	if(typeof(GM_setValue) != 'undefined') {
		try {
			var gsv=GM_setValue.toString();
			if (gsv.indexOf('staticArgs') > 0) { gvar.isGreaseMonkey = true; GM_log('GreaseMonkey Api detected...'); }
			else if (gsv.match(/not\s+supported/)) { needApiUpgrade = true; gvar.isBuggedChrome = true; GM_log('Bugged Chrome GM Api detected...'); }
		} catch(e) {
			gvar.isGreaseMonkey = (typeof(GM_setValue) == 'function');
			if (gvar.isGreaseMonkey)
				GM_log('GreaseMonkey Api is assumed because of exception...');
			else
				needApiUpgrade = true;
		}
	} else {
		needApiUpgrade=true; GM_log('No GM Api detected...');
	}

	if(needApiUpgrade) {
		GM_log('Try to recreate needed GM Api...');
 		var ws = null;
		try { ws=typeof(unsafeWindow.localStorage); unsafeWindow.localStorage.length; } catch(e) { ws=null; } // Catch Security error

		if (ws=='object') {
			GM_log('Using localStorage for GM Api.');
			GM_getValue=function(name,defValue) { var value=unsafeWindow.localStorage.getItem(GMSTORAGE_PATH+name); if(value==null) { return defValue; } else { switch(value.substr(0,2)) { case 'S]': return value.substr(2); case 'N]': return parseInt(value.substr(2)); case 'B]': return value.substr(2)=='true'; } } return value; }
			GM_setValue=function(name,value) { switch (typeof(value)) { case 'string': unsafeWindow.localStorage.setItem(GMSTORAGE_PATH+name,'S]'+value); break; case 'number': if(value.toString().indexOf('.')<0) { unsafeWindow.localStorage.setItem(GMSTORAGE_PATH+name,'N]'+value); } break; case 'boolean': unsafeWindow.localStorage.setItem(GMSTORAGE_PATH+name,'B]'+value); break; } }
			GM_deleteValue=function(name) { unsafeWindow.localStorage.removeItem(GMSTORAGE_PATH+name); }
		} else if(!gvar.isOpera || typeof(GM_setValue)=='undefined') {
			GM_log('Using temporarilyStorage for GM Api.'); gvar.temporarilyStorage=new Array();
			GM_getValue=function(name,defValue) { if(typeof(gvar.temporarilyStorage[GMSTORAGE_PATH+name])=='undefined') { return defValue; } else { return gvar.temporarilyStorage[GMSTORAGE_PATH+name]; } }
			GM_setValue=function(name,value) { switch (typeof(value)) { case "string": case "boolean": case "number": gvar.temporarilyStorage[GMSTORAGE_PATH+name]=value; } }
			GM_deleteValue=function(name) { delete gvar.temporarilyStorage[GMSTORAGE_PATH+name]; };
		}
		
		if(typeof(GM_addStyle)=='undefined') { GM_addStyle=function(css) { var heads = document.getElementsByTagName("head"); if (heads.length > 0) { var node = document.createElement("style"); node.type = "text/css"; node.appendChild(document.createTextNode(css)); heads[0].appendChild(node); } } }
		if(typeof(GM_openInTab)=='undefined') { GM_openInTab=function(url) { unsafeWindow.open(url,""); } }
		if(typeof(GM_registerMenuCommand)=='undefined') { GM_registerMenuCommand=function(name,cmd) { GM_log("Notice: GM_registerMenuCommand is not supported."); } } // Dummy
		if(!gvar.isOpera || typeof(GM_xmlhttpRequest)=='undefined') {
			GM_log('Using XMLHttpRequest for GM Api.');
			GM_xmlhttpRequest=function(obj) {
				var request=new XMLHttpRequest();
				request.onreadystatechange=function() { if(obj.onreadystatechange) { obj.onreadystatechange(request); }; if(request.readyState==4 && obj.onload) { obj.onload(request); } }
				request.onerror=function() { if(obj.onerror) { obj.onerror(request); } }
				try { request.open(obj.method,obj.url,true); } catch(e) { if(obj.onerror) { obj.onerror( {readyState:4,responseHeaders:'',responseText:'',responseXML:'',status:403,statusText:'Forbidden'} ); }; return; }
				if(obj.headers) { for(name in obj.headers) { request.setRequestHeader(name,obj.headers[name]); } }
				request.send(obj.data); return request;
			}
		}
	}
}

function waitForReady(callback) {
	var docState;
	
	try { docState = unsafeWindow.document.readyState; } catch(e) { docState = null; }
	if(docState) {
		if ((docState != 'complete') && (docState != 'interactive')) {
			window.setTimeout(waitForReady, 150, callback);
			return;
		}
	}
	
	callback();
}

GM_ApiBrowserCheck();
waitForReady(load);