// ==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>: </td><td>" + elementDisplay[temp[0]] + ", </td><td>" + elementDisplay[temp[1]] + ", </td><td>" + elementDisplay[temp[2]] + ", </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);