BvS Synchro Helper

BvS WorldKai Synchro Helper 1.3

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 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);