BvS Synchro Helper

BvS WorldKai Synchro Helper 1.3

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==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);