Narda534710 / RZ-Rechner

// ==UserScript==
// @name        RZ-Rechner
// @namespace   RZRechner
// @description RZ-Rechner
// @include     http://world.virtual-galopp-se.de/*
// @include     http://www.virtual-galopp-se.de/*
// @version     1
// @grant       none
// ==/UserScript==

// Funktion um alle childeNodes von DunkelT zu verbinden
function Verbinden (indexT, alleDunkelT) {
	var index2;
	var txt2 = "";
	if (typeof alleDunkelT[indexT] == "undefined") {
		return txt2;
	}
	for (index2 = 0; index2 < alleDunkelT[indexT].childNodes.length; ++index2) {
		txt2 = txt2 + alleDunkelT[indexT].childNodes[index2].nodeValue;
	}
	return txt2;
}

// alle Elemente mit Klasse Dunkel
var alleDunkel = document.getElementsByClassName("dunkel");
// falls ich mal was in den Background schreiben will (warum ich das sollte, weiß ich noch nicht)
var toBackground = {};
// Zähler für for-Schleife
var index;
// Grundgewicht ist 50 kg
var grundgewicht = 50;
// Boni für Zwei- und Dreijährige
var bonus = 0;
// Variablen für Pferdedetails
var alter;
var zeit;
var endzeit;
var sieglos3j;
var gewicht;

// Variablen für Kilogrammeinfluss
var ausgangsSteigung = 0.083333333333333333;
var steigungSteigung = 0.000247395833333333;

// Hilfsvariabeln
var temp;
var temp2;
var txt;
var i;
// Starttermin der Edition (bestimmt durch URL)
var startdatum = new Date(2006,5,9);
if (document.URL.indexOf("world")>-1) {
	startdatum = new Date(2009,7,4);
}
var startzeit = startdatum.getTime();
// heutiger Tag
var heute = new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate());
var heute2 = heute.getTime();
// wochen enthält die Differenz vom heutigen Tag bis zum letzten Jahreswechsel
var wochen = Math.floor((((heute2-startzeit)/86400000)/48-Math.floor(((heute2-startzeit)/86400000)/48))*48*86400000);
// Variablen für den Renntermin
var renndatum;
var difftage;

// Stall nur ermitteln, wenn man nicht zu schnell geklickt hat
if (document.body.innerText!="So schnell wie du klickst, kannst du garnicht lesen.") {
	// Rennstall ermitteln
	var stall = $("td")[6].childNodes[0].nodeValue;
}
// Berechnung der RZ im Rennprofil eines eigenen Pferdes
if (document.URL.indexOf("pferdprofil")>-1) {
	// alle Elemente mit Klasse Dunkel2 
	var alleDunkel2 = document.getElementsByClassName("dunkel2");
	// falls auf der Seite in zweiten Element mit KLasse Dunkel2 "Leistung" steht
	if (alleDunkel2[1] = "Leistung") {
		// Durchwandern aller Elemente mit Klasse Dunkel
		for (index = 0; index <= alleDunkel.length; ++index) {
			// enthält Inhalt von Dunkel
			txt = Verbinden (index, alleDunkel);
			// liest das Geschlecht aus und ändert das Grundgewicht, so nötig
			if (txt.indexOf("Stute")>-1) {
				grundgewicht = 48;
			}
			// liest das aktuelle Alter aus
			if (txt.indexOf("j.")>-1) {
				alter = parseFloat(txt.substr(txt.indexOf("j.")-2,2));
			}	
			// wertet die Rennen aus (Erkennung, wenn es das Wort "Starter" enthält)
			if (txt.indexOf("Starter")>-1) {
				/* mehrere Zeilen */
				// aktueller Renntermin
				renndatum = new Date(txt.substr(14,4),parseFloat(txt.substr(11,2)-1), txt.substr(8,2));
				// Differenz in Jahren vom Renntermin bis zum aktuellen Alter (wochen wird abgezogen um das Geburtsdatum auf den Jahreswechsel zu legen)
				diffjahre = Math.floor((((renndatum.getTime()-(heute2-wochen))/86400000)/48));
				// Errechnung des Rennalters (diffjahre ist ein negativer Wert, deshalb Addition)
				rennalter = alter + diffjahre;
				// wenn das Rennalter 2 oder 3 ist, wird der Bonus entsprechend festgeschrieben
				if (rennalter == 2) {
					bonus = 2;
				} else if (rennalter == 3) {
					bonus = 0.5;
				} else {
					bonus = 0;
				}
				// nächste Zelle
				++index;
				txt = Verbinden (index, alleDunkel);
				// Wenn es das Wort Dotation enthält, kann ausgelesen werden, ob es sich um ein Sieglosenrennen für 3-jährige handelt = Bug im Spiel umgehen)
				if (txt.indexOf("Dotation")>-1) {
					sieglos3j = alleDunkel[index].childNodes[0].childNodes[0].childNodes[0].nodeValue.indexOf("Sieglose 3j.");
				}
				// übernächste Zelle auswählen
				index = index + 2;
				// Auslesen der Zelle
				txt = Verbinden (index, alleDunkel);
				// Das Gewicht auslesen
				gewicht = parseFloat(txt.substr(txt.indexOf("kg")-4, 4));
				// nächste Zelle
				++index;
				txt = Verbinden (index, alleDunkel);
				// Falls das Pferd dis war, wird das Rennen ignoriert und zum nächsten gesprungen
				// Since NaN is the only JavaScript value that is treated as unequal to itself, you can always test if a value is NaN by checking it for equality to itself:
				// ermittelt die Rennzeit pro 1000m (nur die Sekunden)			
				zeit = parseFloat(txt.substr(txt.indexOf("(")+3, 5).replace(",","."));
				if (isNaN(zeit)) {
					continue;
				}
				// vorsichtshalber wird die Endzeit auf 0 gesetzt
				endzeit = 0;
				// Wenn es ein Sieglosenrennen für 3-jährige ist, wird der Bonus ignoriert
				if (sieglos3j>-1) {
					endzeit = zeit - ((gewicht - grundgewicht)/0.5)*(ausgangsSteigung-((gewicht - grundgewicht)/0.5)*steigungSteigung);
				} else {
					// Bei der Berechnnug wird berücksichtigt, dass sich die Steigung scheinbar ändert, je mehr Gewicht das Pferd trägt (steigungSteigung)
					endzeit = zeit - ((gewicht - grundgewicht)/0.5)*(ausgangsSteigung-((gewicht - grundgewicht)/0.5)*steigungSteigung)-bonus;
				}
				// Runden der endzeit auf zwei Kommastellen
				endzeit = Math.round(endzeit*100)/100;
				// Eintragen der Endzeit in roter Farbe
				temp = ": </b><b style ='color:#DD0000'> 1:";
				if (endzeit < 10) {
					temp = temp + "0" + endzeit.toString();
				} else {
					temp = temp + endzeit.toString();
				}
				if (endzeit == Math.floor(endzeit)) {
					temp = temp + ",00";
				} else if (endzeit*10 == Math.floor(endzeit*10)) {
					temp = temp + "0";
				}
				temp = temp + "/km";
				// Punkt durch Komma ersetzen
				temp = temp.replace(".",",");
				// temp2 enthält die aktuelle Zelle und davon das erste Kindelement (erste Zeile = Platzierung)
				temp2 = $("td.dunkel")[index].childNodes[0];
				// Eintragen der RZ hinter die Platzierung
				$(temp2).append(temp);
			}
		}	
	}
} else if (document.URL.indexOf("rennprofil")>-1) { // falls ein Rennen betrachtet wird, wird die RZ für jedes Pferd im Rennen berechnet
	// alle Elemente mit Klasse Kalender
	//var re = new RegExp('kalender?[2]');
	var alleKalender = document.querySelectorAll(".kalender, .kalender2"); // "kalender kalender2");
	// Variablen fürs Rennen
	var gelaufen;
	var distanz;
	var erster;
	var laengen = 0.47;
	var laenge = 0.32;
	var halb = 0.16;
	var viertel = 0.13;
	var hals = 0.1;
	var kopf = 0.07;
	var kurz = 0.04;
	var nase = 0;
	var art;
	var abstando;
	var abstandu;
	var endzeito;
	var endzeitu;
	var cName;
	var index1 = -1;
	var index2 = -1;
	var tempIndex;
	var indexDunkel = 0;
	var bool = false;
	var farbe;
	var platzierung;
	// Minutengenaue Uhrzeit
	var heuteGenau = new Date().getTime();
	if (alleDunkel.length === 0) {
		alleDunkel = document.getElementsByClassName("dunkel2sponsor");
		indexDunkel = 1;
	}
	txt = alleDunkel[indexDunkel].childNodes[3].nodeValue;
	if (txt.indexOf("Renntermin")>-1) {
		// Renntermin bestimmen
		renndatum = new Date(txt.substr(txt.indexOf("Renntermin")+17,4),parseFloat(txt.substr(txt.indexOf("Renntermin")+14,2)-1),txt.substr(txt.indexOf("Renntermin")+11,2),txt.substr(txt.indexOf("Renntermin")+22,2), txt.substr(txt.indexOf("Renntermin")+25,2));
		// wenn das Rennen bereits seit zwei Minuten vorbei ist werden die Zeiten errechnet
		gelaufen = (renndatum.getTime() + 120000 < heuteGenau) ? true : false;
		if (gelaufen) {
			// Wenn es das Wort Dotation enthält, kann ausgelesen werden, ob es sich um ein Sieglosenrennen für 3-jährige handelt = Bug im Spiel umgehen)´
			if (alleDunkel[indexDunkel+1].childNodes[2].nodeValue.indexOf("Dotation")>-1) {
				sieglos3j = alleDunkel[indexDunkel+1].childNodes[1].childNodes[0].nodeValue.indexOf("Sieglose 3j.");
				maiden = alleDunkel[indexDunkel+1].childNodes[1].childNodes[0].nodeValue.indexOf("2j.");
			}
			// Renndistanz ermitteln
			txt = alleDunkel[indexDunkel+2].childNodes[0].nodeValue;
			distanz = parseFloat(txt.substr(txt.indexOf("Distanz")+8,4))/1000;
			// alle Kalenderelemente durchlaufen
			for (index = 0; index < alleKalender.length; index = index + 6) {
				// falls das Pferd distanziert ist, wird es ausgelassen
				txt = alleKalender[index].childNodes[1].childNodes[0].nodeValue;
				if (txt.indexOf("dis.")>-1) {
					continue;
				} else {
					platzierung = txt;
				}
				// Zelle mit Pferddetails
				txt = Verbinden(index + 1,alleKalender);
				// anderes Mindestgewicht bei Stuten
				if (txt.indexOf("Stute")>-1) {
					grundgewicht = 48;
				} else {
					grundgewicht = 50;
				}
				// Alter ermitteln
				alter = parseFloat(txt.substr(txt.indexOf("j.")-2,2));
				// Differenz in Jahren vom Renntermin bis zum aktuellen Alter (wochen wird abgezogen um das Geburtsdatum auf den Jahreswechsel zu legen)
				diffjahre = Math.floor((((renndatum.getTime()-(heute2-wochen))/86400000)/48));
				// Errechnung des Rennalters (diffjahre ist ein negativer Wert, deshalb Addition)
				rennalter = alter + diffjahre;
				if (!rennalter && !bool) {
					$(alleDunkel[indexDunkel+1]).append("<br><b style ='color:#DD0000'>Rennzeiten werden eventuell falsch berechnet, weil Pferde tot sind.</b>");
					bool = true;
				}
				// wenn das Rennalter 2 oder 3 ist, wird der Bonus entsprechend festgeschrieben
				if (rennalter == 2 || maiden>-1) {
					bonus = 2;
				} else if (rennalter == 3) {
					bonus = 0.5;
				} else {
					bonus = 0;
				}
				// Das Gewicht auslesen
				gewicht = parseFloat(alleKalender[index + 1].childNodes[3].childNodes[0].childNodes[0].nodeValue);
				// Zelle mit Rennzeit
				txt = Verbinden(index + 5,alleKalender);
					// Abstand ist standardmäßig 0
				abstando = 0;
				abstandu = 0;
				// beim ersten Pferd die Rennzeit auslesen
				if (index === 0) {
				zeit = parseFloat(txt.substr(txt.indexOf(":")-1,1))*60+parseFloat(txt.substr(txt.indexOf(":")+1,5).replace(",","."));
				oben = zeit;
				unten = zeit;
				} else { // bei allen anderen, den Abstand ermitteln
					if (txt.indexOf("Längen")>-1) {	// bei mehreren Längen Unterschied
						abstandu = laengen+0.01+((parseFloat(txt.substr(txt.indexOf("Längen")-3,2))-2)*laengen);
						abstando = abstandu+laengen-0.01;
					} else if (txt.indexOf("Länge")>-1) { // bei einer oder weniger als einer Länge Unterschied
						// Art der Länge ermitteln (1, 1/2, 1/4)
						art = parseFloat(txt.substr(txt.indexOf("Länge")-2,1));
						switch (art) {
							case 1:
								abstandu = laenge;
								abstando = laengen;
								break;
							case 2:
								abstandu = halb;
								abstando = laenge-0.01;
								break;
							case 4:
								abstandu = viertel;
								abstando = halb-0.01;
								break;
						}							
					} else if (txt.indexOf("Hals")>-1) { // bei einem Hals Unterschied
						abstandu = hals;
						abstando = viertel-0.01;
					} else if (txt.indexOf("kurzer Kopf")>-1) { // beim kurzem Kopf
						abstandu = kurz;
						abstando = kopf-0.01;
					} else if (txt.indexOf("Kopf")>-1) { // bei einem Kopf
						abstandu = kopf;
						abstando = hals-0.01;
					} else if (txt.indexOf("Nase")>-1) { // bei einer Nasenlänge
						abstandu = nase;
						abstando = kurz-0.01;
					}
				}
				oben = oben + abstando;
				unten = unten + abstandu;
				// vorsichtshalber wird die Endzeit auf 0 gesetzt
				endzeito = 0;
				endzeitu = 0;
				// Wenn es ein Sieglosenrennen für 3-jährige ist, wird der Bonus ignoriert
				if (sieglos3j>-1) {
					endzeito = (oben/distanz-60) - ((gewicht - grundgewicht)/0.5)*(ausgangsSteigung-((gewicht - grundgewicht)/0.5)*steigungSteigung);
					endzeitu = (unten/distanz-60) - ((gewicht - grundgewicht)/0.5)*(ausgangsSteigung-((gewicht - grundgewicht)/0.5)*steigungSteigung);
				}
				else {
					// Bei der Berechnnug wird berücksichtigt, dass sich die Steigung scheinbar ändert, je mehr Gewicht das Pferd trägt (steigungSteigung)
					endzeito = (oben/distanz-60) - ((gewicht - grundgewicht)/0.5)*(ausgangsSteigung-((gewicht - grundgewicht)/0.5)*steigungSteigung)-bonus;
					endzeitu = (unten/distanz-60) - ((gewicht - grundgewicht)/0.5)*(ausgangsSteigung-((gewicht - grundgewicht)/0.5)*steigungSteigung)-bonus;
				}
				endzeito = Math.round(endzeito*100)/100;
				endzeitu = Math.round(endzeitu*100)/100;
				// Eintragen der Endzeit
				farbe = (!rennalter) ? "; color:#DD0000" : "";
				temp = "<br></b><b style ='font-size: 12px" + farbe + "'> 1:";
				if (endzeitu < 10) {
					temp = temp + "0" + endzeitu.toString();
				} else {
					temp = temp + endzeitu.toString();
				}
				if (endzeitu == Math.floor(endzeitu)) {
					temp = temp + ",00";
				} else if (endzeitu*10 == Math.floor(endzeitu*10)) {
					temp = temp + "0";
				}
				// temp = temp.replace(".",",");
				if (endzeitu != endzeito) {
					temp = temp + "/km -<br>1:";
					if (endzeito < 10) {
						temp = temp + "0" + endzeito.toString();
					} else {
						temp = temp + endzeito.toString();
					}
					if (endzeito == Math.floor(endzeito)) {
						temp = temp + ",00";
					} else if (endzeito*10 == Math.floor(endzeito*10)) {
						temp = temp + "0";
					}
				}
				temp = temp + "/km";
				// Punkte durch Kommas ersetzen
				temp = temp.replace(/\./g,",");
				// temp2 enthält die aktuelle Zelle und davon das erste Kindelement (erste Zeile = Platzierung)
				cName = (alleKalender[index].className === "kalender") ? "kalender" : "kalender2";
				tempIndex = (alleKalender[index].className === "kalender") ? index1=index1+6 : index2=index2+6;
				temp2 = $("td." + cName)[tempIndex];
				// Eintragen der RZ hinter die Platzierung
				$(temp2).append(temp);
				// eigene Pferde einfärben;
				if (stall.indexOf(alleKalender[index+3].childNodes[5].childNodes[0].nodeValue)>-1) {
					for (i = tempIndex-5; i <= tempIndex; ++i) { 
						temp2 = $("td." + cName)[i];
						$(temp2).css("backgroundColor", "#FFFFFF");
					}
				}
			}			
		}
	}
}
// alle Elemente mit Klasse Dunkel
var alleDunkel = document.getElementsByClassName("dunkel");
// falls ich mal was in den Background schreiben will (warum ich das sollte, weiß ich noch nicht)
var toBackground = {};
// Zähler für for-Schleife
var index;

// Hilfsvariabeln
var temp;
var temp2;
var txt;
var i;

// Stall nur ermitteln, wenn man nicht zu schnell geklickt hat
if (document.body.innerText!="So schnell wie du klickst, kannst du garnicht lesen.") {
	// Rennstall ermitteln
	var stall = $("td")[6].childNodes[0].nodeValue;
}

if (document.URL.indexOf("ranking")>-1) { // falls das Ranking betrachtet wird
	var anfang = 1;
	var ende = 4;
	i = (document.URL.indexOf("p2=pferde")>-1) ? 1 : 3;
	for (index = i; index <= alleDunkel.length; ++index) {
		// enthält Inhalt von Dunkel
		if (typeof alleDunkel[index] == "undefined") {
			continue;
		}
		txt = (!alleDunkel[index].childNodes[0].nodeValue) ? alleDunkel[index].childNodes[0].childNodes[0].nodeValue : "";
		if (document.URL.indexOf("p2=pferde")==-1) { // wenn es nicht das Pferderanking ist
			if (txt != "" && stall.indexOf(txt)>-1) { // wenn txt der Stallname ist
				if (document.URL.indexOf("personal")>-1) { // wenn es das Personal-Ranking ist
					anfang = 3; // fange beim dritten Element an
					ende = (document.URL.indexOf("reiter")>-1) ? 2 : 1; // Ende entweder 2 später (Reitersieg/-platz) oder 1 später (Jockey/ Trainer)
				} else if (document.URL.indexOf("gestuet")>-1) { // fürs Gestütsranking
					ende = 1;
					if (document.URL.indexOf("pferdewert")>-1 || document.URL.indexOf("wertdurch")>-1) { // falls es nicht die Zuchtwertung ist
						ende = 2;
					}
				} else if (document.URL.indexOf("p2=spieler&liga=1")>-1) { // für die Jahreswertung
					ende = 5;
				}
				temp = index;
				for (index = index-anfang; index <= temp+ende; index++) { // durchlaufen aller Dunkel-Elmente der Zeile und verdunkeln, wenn es der Stall ist
					temp2 = $("td.dunkel")[index];
					$(temp2).css("backgroundColor", "#F1E6C7");
				}
			}
		} else { // wenn es das Pferderanking ist
			if (!(alleDunkel[index].childNodes[3]==null)) {
				besitzer = (!(alleDunkel[index].childNodes[14]==null)) ? alleDunkel[index].childNodes[14].text : ""; // besitzer festlegen, wenn nicht unbekannt
				züchter = (!(alleDunkel[index].childNodes[18]==null)) ? alleDunkel[index].childNodes[18].text : ""; // züchter festlegen, wenn nicht unbekannt
				temp = index;
				for (index = index-anfang; index <= temp; index++) { // dunkel-Elemente durchlaufen
					temp2 = $("td.dunkel")[index];
					if (stall.indexOf(besitzer)>-1 && besitzer!=="") { // falls man der Besitzer ist verdunkeln
						$(temp2).css("backgroundColor", "#F1E6C7");
					} else if (stall.indexOf(züchter)>-1 && züchter!=="") { // falls man der Züchter ist verdunkeln
						$(temp2).css("backgroundColor", "#F1E6C7");
					}
				}
			}
		}
	}
}
// Variablen definieren
var i;
var j;
var txt;
var color;
var bool=false;
var anzahlGebaeude = 0;
var maschinen = 0;
var hausmeister;
var aGehalt;
var loyalität;
var gehalt;
if (document.URL.indexOf("gebaeude")>-1) { 
	// alle Bilder auswerten
	var alleBilder = $("img").map(function() {  
		return $(this).attr("src");
	});
	// alle Bilder checken, ob sie gebaute Gebäude sind
	for (i=0; i<alleBilder.length; i++) {
		if (alleBilder[i].indexOf("voll")>-1) {
			anzahlGebaeude++;
		}
	}
	// alle tds auswerten
	var alleTds = $("td").map(function() {  
		return $(this).attr("align");
	});
	// checken ob ts das Attribut center hat
	for (i=0; i<alleTds.length; i++) {
		if (alleTds[i]=="center") {
			// Linktext der Gebäudekategorie rausschreiben, wenn nicht undefiniert
			linktext = (!($("td")[i].childNodes[1]==null)) ? $("td")[i].childNodes[1].text : ""; 
			// Wenn es Kategorie Maschinen ist
			if (linktext=="Maschinen") {
				// alle drei möglichen Maschinen durchlaufen
				for (j=0; j<3; j++) {
					// Wenn gebaut, dann maschinen hochzählen
					if ($("td:eq("+i+") img").eq(0).attr("src").indexOf("voll")>-1) {
						maschinen++;
					}
				}
			}
		}			
	}
	// Anzahl benötigter Hausmeister errechnen
	hausmeister = Math.ceil(anzahlGebaeude/10)-maschinen*2
	// benötigte Anzahl reinschreiben
	$("tbody:eq(5)").append("<tr align='center'><td colspan='4' style='font-size: 10pt; text-align: center;'><br>Du benötigst <u><b>"+hausmeister+" Hausmeister</b></u> um keine Renovierungskosten zu haben.</td></tr><tr><td><br></td></tr>");

} else if (document.URL.indexOf("personalprofil")>-1) { // Gehalt des Personals errechnen
	// alle Elemente mit Klasse Dunkel
	var alleDunkel = document.getElementsByClassName("dunkel");
	// alle tds bezüglich Attribut Weite auswerten
	var alleTds = $("td").map(function() { 
		return $(this).attr("width");
	});
	// alle td-Elemente durchlaufen
	for (i=0; i<alleTds.length; i++) {
		// alle td-Elemente, die eine Weite von 10% haben
		if (alleTds[i]=="10%"&&!bool) {
			// Loyalität ermitteln, wenn vorhanden
			loyalität = (!($("td")[i].childNodes[0]==null)) ? parseFloat($("td")[i].childNodes[0].nodeValue) : ""; 
			// Spalte mit Personalinformationen auswerten (Alter, Dabei seit/ Arbeitgeber, Lohn)
			aGehalt = Verbinden(1,alleDunkel);
			// falls es kein eigener Jockey ist, wird die Schleife beendet
			if (aGehalt.indexOf("Arbeitgeber")>-1) {
				break;
			}
			// Gehalt aus dem Text ermitteln (beachten, dass der Punkt bei mehr als 1.000 Gehalt ersetzt werden muss - zur Sicherheit auch das Komma durch einen Punkt => JS ist englisch)
			aGehalt = parseFloat(aGehalt.substring(aGehalt.indexOf("Lohn")+5,aGehalt.length-7).replace(".","").replace(",","."));
			// optimales Gehalt errechnen
			gehalt = Math.ceil(aGehalt/loyalität*100);
			// Farbe des Textes festlegen
			if (aGehalt<gehalt) {
				// Rot, falls zu wenig Gehalt
				color="#DD0000";
			} else if (aGehalt==gehalt) {
				// Schwarz für perfekt
				color="#000000";
			} else if (aGehalt>gehalt) {
				// Grün, wenn zu viel
				color="#228B22";
			}
			// eintragen des Textes in die Zelle für Personalinformationen
			txt = "<br><b style='color:"+color+"'>Das optimale Gehalt beträgt "+gehalt+"€.</b>"
			$(alleDunkel[1]).append(txt);
			// verhindern, dass weitere TDs ausgewertet werden
			bool=true;
		}
	}
}