Greasy Fork is available in English.

TACS (Tiberium Alliances Combat Simulator)

Allows you to simulate combat before actually attacking.

// ==UserScript==
// @name           TACS (Tiberium Alliances Combat Simulator)
// @description    Allows you to simulate combat before actually attacking.
// @namespace      https://*.alliances.commandandconquer.com/*/index.aspx*
// @include        https://*.alliances.commandandconquer.com/*/index.aspx*
// @version        3.53b
// @author         KRS_L | Contributions/Updates by WildKatana, CodeEcho, PythEch, Matthias Fuchs, Enceladus, TheLuminary, Panavia2, Da Xue, MrHIDEn, TheStriker, JDuarteDJ, null, g3gg0.de
// @translator     TR: PythEch | DE: Matthias Fuchs, Leafy & sebb912 | PT: JDuarteDJ & Contosbarbudos | IT: Hellcco | NL: SkeeterPan | HU: Mancika | FR: Pyroa & NgXAlex | FI: jipx | RO: MoshicVargur
// @grant none
// ==/UserScript==
window.TACS_version = GM_info.script.version;
(function () {
	'use strict';
	var TASuite_mainFunction = function () {
		console.log("TACS: Simulator loaded");

		/* not used
		function compare(a, b) {
		return a - b;
		}

		function sort_and_unique(my_array) {
		my_array.sort(compare);
		for (var i = 1; i < my_array.length; i++) {
		if (my_array[i] === my_array[i - 1]) {
		my_array.splice(i--, 1);
		}
		}
		return my_array;
		}*/

		var locale = null;
		var languages = ["tr_TR", "de_DE", "pt_PT", "it_IT", "nl_NL", "hu_HU", "fr_FR", "fi_FI", "ro_RO"]; //en is default
		var translations = {
			"Stats": ["İstatistik", "Statistik", "Estatística", "Statistiche", "Statistieken", "Statisztika", "Statistiques", "Tiedot", "Statistici"],
			"Enemy Base:": ["Düşman Üssü:", "Feindliche Basis:", "Base Inimiga:", "Base Nemica:", "Vijandelijke Basis:", "Ellenséges bázis:", "Base Ennemie:", "Vihollisen tukikohta:", "Baza inamică"],
			"Defences:": ["Savunma Üniteleri:", "Verteidigung:", "Defesas:", "Difesa:", "Verdediging:", "Védelem:", "Défenses:", "Puolustus:", "Apărare"],
			"Buildings:": ["Binalar:", "Gebäude:", "Edifícios:", "Strutture:", "Gebouwen:", "Épületek:", "Bâtiments:", "Rakennelmat:", "Clădiri"],
			"Construction Yard:": ["Şantiye:", "Bauhof:", "Estaleiro:", "Cantiere:", "Bouwplaats:", "Központ:", "Chantier De Construction:", "Rakennustukikohta:", "Șantierul de construcții"],
			"Defense Facility:": ["Savunma Tesisi:", "Verteidigungseinrichtung:", "Instalações de Defesa:", "Stazione di Difesa:", "Defensiefaciliteit:", "Védelmi Bázis:", "Complexe De Défense:", "Puolustuslaitos:", "Unitate de apărare"],
			"Command Center:": ["Komuta Merkezi:", "Kommandozentrale:", "Centro de Comando:", "Centro di Comando:", "Commandocentrum:", "Parancsnoki központ:", "Centre De Commandement:", "Komentokeskus:", "Centrul de comandă"],
			"Available Repair:": ["Mevcut Onarım:", "Verfügbare Reparaturen", "", "", "", "", "", "Korjausaikaa jäljellä:", "Timp de reparare disponibil"],
			"Available Attacks:": ["Mevcut Saldırılar:", "Verfügbare Angriffe", "", "", "", "", "", "Hyökkäyksiä:", "Atacuri disponibile"],
			"Overall:": ["Tüm Birlikler:", "Gesamt:", "Geral:", "Totale:", "Totaal:", "Áttekintés:", "Total:", "Yhteensä:", "Ansamblu"],
			"Infantry:": ["Piyadeler:", "Infanterie:", "Infantaria:", "Fanteria:", "Infanterie:", "Gyalogság:", "Infanterie:", "Jalkaväki:", "Infanterie"],
			"Vehicle:": ["Motorlu Birlikler:", "Fahrzeuge:", "Veículos:", "Veicoli:", "Voertuigen:", "Jármu:", "Véhicules:", "Ajoneuvot:", "Vehicule"],
			"Aircraft:": ["Hava Araçları:", "Flugzeuge:", "Aviões:", "Velivoli:", "Vliegtuigen:", "Légiero:", "Avions:", "Lentokoneet:", "Aviație"],
			"Outcome:": ["Sonuç:", "Ergebnis:", "Resultado:", "Esito:", "Uitkomst:", "Eredmény:", "Résultat:", "Lopputulos:", "Rezultat"],
			"Unknown": ["Bilinmiyor", "Unbekannt", "Desconhecido", "Sconosciuto", "Onbekend", "Ismeretlen", "Inconnu", "Tuntematon", "Necunoscut"],
			"Battle Time:": ["Savaş Süresi:", "Kampfdauer:", "Tempo de Batalha:", "Tempo di Battaglia:", "Gevechtsduur:", "Csata ideje:", "Durée Du Combat:", "Taistelun kesto:", "Timp de atac"],
			"Layouts": ["Diziliş", "Layouts", "Formações", "Formazione", "Indelingen", "Elrendezés", "Dispositions", "Asetelmat", "Scheme"],
			"Load": ["Yükle", "Laden", "Carregar", "Carica", "Laad", "Töltés", "Charger", "Lataa", "Încarcă"],
			"Load this saved layout.": ["Kayıtlı dizilişi yükle.", "Gespeichertes Layout laden.", "Carregar esta formação guardada.", "Carica questa formazione salvata.", "Laad deze opgeslagen indeling.", "Töltsd be ezt az elmentett elrendezést.", "Charger Cette Disposition.", "Lataa valittu asetelma.", "Încarcă acest formație salvată."],
			"Delete": ["Sil", "Löschen", "Apagar", "Cancella", "Verwijder", "Törlés", "Effacer", "Poista", "Șterge"],
			"Name: ": ["İsim: ", "Name: ", "Nome: ", "Nome: ", "Naam: ", "Név: ", "Nom: ", "Nimi: ", "Nume: "],
			"Delete this saved layout.": ["Kayıtlı dizilişi sil.", "Gewähltes Layout löschen.", "Apagar esta formação guardada.", "Cancella questa formazione salvata.", "Verwijder deze opgeslagen indeling.", "Töröld ezt az elmentett elrendezést.", "Effacer Cette Disposition.", "Poista valittu asetelma.", "Șterge acest formație salvat."],
			"Save": ["Kaydet", "Speichern", "Guardar", "Salva", "Opslaan", "Mentés", "Sauvegarder", "Tallenna", "Salvează"],
			"Save this layout.": ["Bu dizilişi kaydet.", "Layout speichern.", "Guardar esta formação.", "Salva questa formazione.", "Deze indeling opslaan.", "Mentsd el ezt az elrendezést.", "Sauvegarder Cette Disposition.", "Tallenna nykyinen asetelma.", "Salvează acest formație "],
			"Info": ["Bilgi", "Info", "Info", "Info", "Info", "Info", "Infos", "Tietoa", "Info"],
			"Forums": ["Forum", "Forum", "Fóruns", "Forum", "Forums", "Fórum", "Forums", "Keskustelupalsta", "Forum"],
			"Spoils": ["Ganimetler", "Rohstoffausbeute", "Espólios", "Bottino", "Opbrengst", "Zsákmény", "Butin", "Sotasaalis", "Pradă"],
			"Options": ["Seçenekler", "Optionen", "Opções:", "Opzioni:", "Opties:", "Opciók:", "Options:", "Asetukset", "Opțiuni"],
			"TACS Options": ["TACS Seçenekleri", "TACS Optionen", "", "", "", "", "", "", "Opțiuni TACS: "],
			"Auto display stats": ["İstatistik penceresini otomatik olarak göster", "Dieses Fenster automatisch öffnen", "Mostrar esta caixa automaticamente", "Apri automaticamente la finestra Strumenti", "Dit venster automatisch weergeven", "Ezen ablak autómatikus megjelenítése", "Affich. Auto. de cette Fenêtre", "Näytä simuloinnin tiedot automaattisesti", "Afișează automat statisticile"], // need to change translations
			"Show shift buttons": ["Kaydırma tuşlarını göster", "Bewegungstasten anzeigen", "Mostrar botões de deslocamento", "Mostra i pulsanti di spostamento", "Verschuifknoppen weergeven", "Eltoló gombok megjelenítése", "Affich. Auto. Boutons de Déplacement", "Näytä armeijan siirtopainikkeet", "Afișează butoanele de deplasare"],
			"Warning!": ["Uyarı!", "Warnung!", "Aviso!", "Attenzione!", "Waarschuwing!", "Figyelem!", "Attention!", "Varoitus!", "Atenție!"],
			"Simulate": ["Simule et", "Simulieren", "Simular", "Simula", "Simuleer", "Szimuláció", "Simuler", "Simuloi", "Simulează"],
			"Start Combat Simulation": ["Savaş Simulasyonunu Başlat", "Kampfsimulation starten", "Começar a simalação de combate", "Avvia simulazione", "Start Gevechtssimulatie", "Csata szimuláció elindítása", "Démarrer La Simulation Du Combat", "Aloita taistelun simulaatio", "Începe simularea luptei"],
			"Setup": ["Düzen", "Aufstellung", "Configuração", "Setup", "Opzet", "Elrendezés", "Organisation", "Takaisin", "Pregătire"],
			"Return to Combat Setup": ["Ordu düzenini göster", "Zurück zur Einheitenaufstellung", "Voltar à configuração de combate", "Ritorna alla configurazione", "Keer terug naar Gevechtsopzet", "Vissza az egységek elrendezéséhez", "Retourner à l'Organisation Des Troupes", "Return to Combat Setup", "Întoarcere la ecranul pentru pregătirea luptei"],
			"Unlock": ["Kilidi aç", "Freigabe", "Desbloquear", "Sblocca", "Ontgrendel", "Felold", "Debloquer", "Avaa", "Descuie"],
			//"Tools" : ["Araçlar", "Extras", "Ferramentas", "Strumenti", "Gereedschap", "Eszközök", "Outils", "Työkalut"],
			"Open Simulator Tools": ["Simulatör Araçlarını Göster", "Extras öffnen", "Abrir as ferramentas do simulador", "Apri strumenti", "Open Simulator Gereedschap", "Megnyitja a szimulátor információs ablakát", "Ouvrir Les Réglages Du Simulateur", "Avaa simulaattorin työkalut", "Deschide opțiunile simulatorului"],
			"Shift units left": ["Birlikleri sola kaydır", "Einheiten nach links bewegen", "Deslocar as unidades para a esquerda", "Spostare le unità a sinistra", "Verschuif eenheden links", "Egységek eltolása balra", "Déplacer Les Unités Vers La Gauche", "Siirtää yksikköjä vasemmalle", "Deplasează unitățile la stânga"],
			"Shift units right": ["Birlikleri sağa kaydır", "Einheiten nach rechts bewegen", "Deslocar as unidades para a direita", "Spostare le unità a destra", "Verschuif eenheden rechts", "Egységek eltolása jobbra", "Déplacer Les Unités Vers La Droite", "Siirtää yksikköjä oikealle", "Deplasează unitățile la dreapta"],
			"Shift units up": ["Birlikleri yukarı kaydır", "Einheiten nach oben bewegen", "Deslocar as unidades para cima", "Spostare le unità in alto", "Verschuif eenheden omhoog", "Egységek eltolása fel", "Déplacer Les Unités Vers Le Haut", "Siirtää yksikköjä ylös", "Deplasează unitățile mai sus"],
			"Shift units down": ["Birlikleri aşağı kaydır", "Einheiten nach unten bewegen", "Deslocar as unidades para baixo", "Spostare le unità in basso", "Verschuif eenheden omlaag", "Egységek eltolása le", "Déplacer Les Unités Vers Le Bas", "Siirtää yksikköjä alas", "Deplasează unitățile mai jos"],
			//"Battle Simulator" : ["Savaş Simulatörü", "Kampfsimulator", "Simulador de Combate", "Simulatore", "Gevechtssimulator", "Csata szimulátor", "Simulateur De Combat", "Taistelusimulaattori"],
			"Total Victory": ["Mutlak Zafer", "Gesamtsieg", "Vitória Total", "Vittoria Totale", "Totale Overwinning", "Teljes gyozelem", "Victoire Totale", "Totaalinen Voitto", "Victorie totală"],
			"Victory": ["Zafer", "Sieg", "Vitória", "Vittoria", "Overwinning", "Gyozelem", "Victoire", "Voitto", "Victorie"],
			"Total Defeat": ["Mutlak Yenilgi", "Totale Niederlage", "Derrota total", "Sconfitta Totale", "Totale Nederlaag", "Teljes vereség", "Défaite Totale", "Total Tappio", "Înfrângere totală"],
			"Support lvl ": ["Takviye seviyesi ", "Stufe Supportwaffe ", "Nível do Suporte ", "Supporto lvl ", "Ondersteuningsniveau ", '"Support" épület szintje ', "Lvl. Du Support ", "Tukitykistön taso ", "Nivelul suportului "],
			"Refresh": ["Yenile", "Erfrischen", "Actualizar", "Rinfrescare", "Verversen", "Felfrissít", "Actualiser", "Päivitä", "Împrospătează"], //google translate non-PT langs
			"Refresh Stats": ["İstatistikleri Yenile", "Erfrischen Statistik", "Estatística", "Rinfrescare Statistiche", "Verversen Statistieken", "Frissítés Stats", "Actualiser Les Stats", "Päivitä tiedot", "Împrospătează statisticile"], //google translate non-PT langs 'refresh' + statistics label
			"Side:": ["Taraf:", "Seite", "Lado:", "", "Zijde", "", "Côté", "Sijainti:", "Lateral"],
			"Left": ["Sol", "Links", "Esquerda", "", "Links", "", "Gauche", "Vasen", "Stânga"],
			"Right": ["Sağ", "Rechts", "Direita", "", "Rechts", "", "Droite", "Oikea", "Dreapta"],
			"Locks:": ["Kilitler:", "Freigabe", "Bloquear:", "", "Vergrendelingen:", "", "Vérouiller:", "Varmistimet:", "Blochează:"],
			"Attack": ["Saldırı", "Angriff", "Atacar", "", "Aanvallen", "", "Attaquer", "Hyökkäys", "Atacă "],
			"Repair": ["Onarım", "Reparatur", "Reparar", "", "Repareren", "", "Réparer", "Korjaus", "Reparare"],
			"Reset": ["Sıfırla", "Zurücksetzen", "", "", "", "", "", "Palauta", "Resetare"],
			"Simulation will be based on most recently refreshed stats!": ["Simulasyon en son güncellenen istatistiklere göre yapılacaktır!", "Die Simulation basiert auf den zuletzt aktualisierten Stand", "A simulação vai ser baseada na mais recente data!", "", "Simulatie zal gebaseerd worden op meest recentelijke ververste statistieken!", "", "La Simulation sera basée en fonction des dernières stats actualisées !", "Simulaatio suoritetaan viimeisimmän päivityksen tiedoilla!", "Simularea se va baza pe cele mai recente statistici!"],
			"Unlock Attack Button": ["Saldırı Düğmesinin Kilidini Aç", "Angriffsbutton freigeben", "Desbloquear o botão de ataque", "Sblocca pulsante d'attacco", "Ontgrendel Aanvalsknop", "a Támadás gomb feloldása", "Débloquer Le Bouton d'Attaque", "Poista hyökkäusnapin lukitus", "Descuie butonul de atac"],
			"Unlock Repair Button": ["Onarım Düğmesinin Kilidini Aç", "Reparaturbutton freigeben", "Desbloquear botão de reparação", "", "Ontgrendel Repareerknop", "", "Débloquer Le Bouton de Réparation", "Poista korjausnapin lukitus", "Descuie butonul de reparare"],
			"Unlock Reset Button": ["Sıfırlama Düğmesinin Kilidini Aç", "", "", "", "", "", "", "Avaa Tyhjennä nappi", "Descuie butonul de resetare"],
			"SKIP": ["ATLA", "Überspringen", "", "", "", "", "", "", ""],
			"Skip to end": ["Simulasyonu atla", "Zum Ende Vorspringen", "", "", "", "", "", "Mene loppuun", "Sari la final"],
			"Reset Formation": ["Dizilişi Sıfırla", "Formation zurücksetzen", "", "", "", "", "", "Palauta armeijan oletusasetelma", "Resetează formația"],
			"Flip Horizontal": ["Yatay Çevir", "Horizontal Spiegeln", "", "", "", "", "", "Käännä vaakasuunnassa", "Întoarce orizontal"],
			"Flip Vertical": ["Dikey Çevir", "Vertikal Spiegeln", "", "", "", "", "", "Käännä pystysuunnassa", "Întoarce vertical"],
			"Activate All": ["Hepsini Aktifleştir", "Alle Aktivieren", "", "", "", "", "", "Aktivoi kaikki", "Activează totul"],
			"Deactivate All": ["Hepsini Deaktifleştir", "Alle Deaktivieren", "", "", "", "", "", "Poista kaikki käytöstä", "Dezactivează totul"],
			"Activate Infantry": ["Piyadeleri Aktifleştir", "Infanterie Aktivieren", "", "", "", "", "", "Aktivoi jalkaväki", "Activează infanteria"],
			"Deactivate Infantry": ["Piyadeleri Deaktifleştir", "Infanterie Deaktivieren", "", "", "", "", "", "Poista jalkaväki käytöstä", "Dezactivează infanteria"],
			"Activate Vehicles": ["Motorlu Birlikleri Aktifleştir", "Fahrzeuge Aktivieren", "", "", "", "", "", "Aktivoi ajoneuvot", "Activează vehiculele"],
			"Deactivate Vehicles": ["Motorlu Birlikleri Deaktifleştir", "Fahrzeuge Deaktivieren", "", "", "", "", "", "Poista ajoneuvot käytöstä", "Dezactivează vehiculele"],
			"Activate Air": ["Hava Araçlarını Aktifleştir", "Flugzeuge Aktivieren", "", "", "", "", "", "Aktivoi lentokoneet", "Activează avioanele"],
			"Deactivate Air": ["Hava Araçlarını Deaktifleştir", "Flugzeuge Deaktivieren", "", "", "", "", "", "Poista lentokoneet käytöstä", "Dezactivează avioanele"],
			"Activate Repair Mode": ["Onarım Modunu Aç", "Reparatur Modus Aktivieren", "", "", "", "", "", "Aktivoi korjaustila", "Activează modul de reparare"],
			"Deactivate Repair Mode": ["Onarım Modunu Kapat", "Reparatur Modus Deaktivieren", "", "", "", "", "", "Poista korjaustila käytöstä", "Dezactivează modul de reparare"],
			"Version: ": ["Sürüm: ", "", "", "", "", "", "", "Versio: ", "Versiunea: "],
			"Mark saved targets on region map": ["Kaydedilmiş hedefleri haritada işaretle", "Gespeicherte Ziele auf der Karte Markieren", "", "", "", "", "", "Merkitse tallennetut kohteet alue kartalle", "Marchează țintele salvate pe harta regiunii"], // region view
			"Enable 'Double-click to (De)activate units'": ["Çift-tıklama ile birlikleri (de)aktifleştirmeyi etkinleştir", "Doppel-Klick zum Einheiten (De)-Aktivieren ", "", "", "", "", "", "Tuplaklikkaus aktivoi/deaktivoi yksiköt", "Activează \"Dublu click pentru a (De)activa unitățile\""],
			"Show Loot Summary": ["", "Zeige Beute-Zusammenfassung", "", "", "", "", "", "", "Afișează rezumatul prăzii"],
			"Show Resource Layout Window": ["", "", "", "", "", "", "", "", "Afișează fereastra cu schema resurselor"],
			"Show Stats During Attack": ["İstatistikleri saldırı sırasında göster", "Zeige Statistik während des Angriffs", "", "", "", "", "", "Näytä tiedot -ikkuna hyökkäyksen aikana", "Afișează statisticile în timpul atacului"],
			"Show Stats During Simulation": ["İstatistikleri simulasyondayken göster", "Zeige Statistik während der Simulation", "", "", "", "", "", "Näytä tiedot -ikkuna simuloinnin aikana", "Afișează statisticile în timpul simulării"],
			"Skip Victory-Popup After Battle": ["Savaş Bitiminde Zafer Bildirimini Atla", "Siegesbildschirm überspringen", "", "", "", "", "", "Ohita taistelun jälkeinen voittoruutu", "Sari peste popup-ul victoriei după luptă"],
			"Stats Window Opacity": ["İstatistik Penceresi Saydamlığı", "Transparenz des Statistik-Fenster", "", "", "", "", "", "Tiedot -ikkunan läpinäkyvyys", "Opacitatea ferestrei de statistici"],
			"Disable Unit Tooltips In Army Formation Manager": ["Ordu Dizilişi Yöneticisinde Birlik İpuçlarını Gizle", "", "", "", "", "", "", "Poista käytöstä yksiköiden työkaluvihjeet armeijan muodostamisikkunassa", "Dezactivează tooltip-urile unităților în managerul formației armatei"],
			"Disable Tooltips In Attack Preparation View": ["Saldırı Hazırlık Görünümünde İpuçlarını Gizle", "", "", "", "", "", "", "Poista työkaluvihjeet käytöstä hyökkäyksen valmisteluikkunassa", "Dezactivează tooltip-urile unităților în ecranul preparării armatei"],
			"Undo": ["Geri Al", "", "", "", "", "", "", "Kumoa", "Anulează"],
			"Redo": ["İleri Al", "", "", "", "", "", "", "Tee uudelleen", "Refă"],
			"Open Stats Window": ["İstatistik Penceresini Aç", "Statistik öffnen", "", "", "", "", "", "Avaa tiedot -ikkuna", "Deschide fereastra de statistici"]
		};

		function lang(text) {
			try {
				if (languages.indexOf(locale) > -1) {
					var translated = translations[text][languages.indexOf(locale)];
					if (translated !== "") {
						return translated;
					} else {
						return text;
					}
				} else {
					return text;
				}
			} catch (e) {
				console.log(e);
				//console.log("Text is undefined: "+text);
				return text;
			}
		}

		function CreateTweak() {
			var TASuite = {};
			qx.Class.define("TACS", {
				type: "singleton",
				extend: qx.core.Object,
				members: {
					// Default settings
					saveObj: {
						// section.option
						section: {
							option: "foo"
						},
						bounds: {
							battleResultsBoxLeft: 125,
							battleResultsBoxTop: 125,
							resourceLayoutWindowLeft: 125,
							resourceLayoutWindowTop: 550
						},
						checkbox: {
							showLootSummary: true,
							showResourceLayoutWindow: true,
							showStatsDuringAttack: true,
							showStatsDuringSimulation: true,
							skipVictoryPopup: false,
							disableArmyFormationManagerTooltips: false,
							disableAttackPreparationTooltips: false
						},
						audio: {
							playRepairSound: true
						},
						slider: {
							statsOpacity: 100
						}
					},
					buttons: {
						attack: {
							layout: {
								save: null, // buttonLayoutSave
								load: null // buttonLayoutLoad
							},
							simulate: null, // buttonSimulateCombat
							unlock: null, // buttonUnlockAttack
							repair: null, // buttonUnlockRepair
							unlockReset: null, // buttonUnlockReset
							tools: null, // buttonTools
							refreshStats: null, // buttonRefreshStats
							formationReset: null, // buttonResetFormation
							flipVertical: null, // buttonFlipVertical
							flipHorizontal: null, // buttonFlipHorizontal
							activateInfantry: null, // buttonActivateInfantry
							activateVehicles: null, // buttonActivateVehicles
							activateAir: null, // buttonActivateAir
							activateAll: null, // buttonActivateAll
							repairMode: null, // buttonToggleRepairMode
							toolbarRefreshStats: null, // buttontoolbarRefreshStats
							toolbarShowStats: null,
							toolbarUndo: null,
							toolbarRedo: null,
							options: null // buttonOptions
						},
						simulate: {
							back: null, // buttonReturnSetup
							skip: null // buttonSkipSimulation
						},
						shiftFormationUp: null,
						shiftFormationDown: null,
						shiftFormationLeft: null,
						shiftFormationRight: null,
						optionStats: null
					},
					stats: {
						spoils: {
							tiberium: null, // tiberiumSpoils
							crystal: null, // crystalSpoils
							credit: null, // creditSpoils
							research: null // researchSpoils
						},
						health: {
							infantry: null, // lastInfantryPercentage
							vehicle: null, // lastVehiclePercentage
							aircraft: null, // lastAirPercentage
							overall: null // lastPercentage
						},
						repair: {
							infantry: null, // lastInfantryRepairTime
							vehicle: null, // lastVehicleRepairTime
							aircraft: null, // lastAircraftRepairTime
							overall: null, // lastRepairTime
							available: null, // storedRepairTime
							max: null // maxRepairCharges
						},
						attacks: {
							availableCP: null,
							attackCost: null,
							availableAttacksCP: null,
							availableAttacksAtFullStrength: null,
							availableAttacksWithCurrentRepairCharges: null
						},
						damage: {
							units: {
								overall: null // lastEnemyUnitsPercentage
							},
							structures: {
								construction: null, // lastCYPercentage
								defense: null, // lastDFPercentage
								command: null, // lastCCPercentage
								support: null,
								overall: null // lastEnemyBuildingsPercentage
							},
							overall: null // lastEnemyPercentage
						},
						resourcesummary: {
							research: null,
							credits: null,
							crystal: null,
							tiberium: null
						},
						time: null,
						supportLevel: null
					},
					labels: {
						health: {
							infantry: null, // infantryTroopStrengthLabel
							vehicle: null, // vehicleTroopStrengthLabel
							aircraft: null, // airTroopStrengthLabel
							overall: null // simTroopDamageLabel
						},
						repair: {
							available: null
						},
						repairinfos: {
							infantry: null,
							vehicle: null,
							aircraft: null,
							available: null
						},
						attacks: {
							available: null
						},
						damage: {
							units: {
								overall: null // enemyUnitsStrengthLabel
							},
							structures: {
								construction: null, // CYTroopStrengthLabel
								defense: null, // DFTroopStrengthLabel
								command: null, // CCTroopStrengthLabel
								support: null, // enemySupportStrengthLabel
								overall: null // enemyBuildingsStrengthLabel
							},
							overall: null, // enemyTroopStrengthLabel
							outcome: null // simVictoryLabel
						},
						resourcesummary: {
							research: null,
							credits: null,
							crystal: null,
							tiberium: null
						},
						time: null, // simTimeLabel
						supportLevel: null, // enemySupportLevelLabel
						countDown: null // countDownLabel
					},
					view: {
						playerCity: null,
						playerCityDefenseBonus: null,
						ownCity: null,
						ownCityId: null,
						targetCityId: null,
						lastUnits: null,
						lastUnitList: null
					},
					layouts: {
						label: null,
						list: null,
						all: null,
						current: null,
						restore: null
					},
					options: {
						autoDisplayStats: null,
						showShift: null,
						sideLabel: null,
						locksLabel: null,
						leftSide: null,
						rightSide: null,
						attackLock: null,
						repairLock: null,
						markSavedTargets: null,
						dblClick2DeActivate: null,
						showLootSummary: null,
						showResourceLayoutWindow: null,
						showStatsDuringAttack: null,
						showStatsDuringSimulation: null,
						skipVictoryPopup: null,
						statsOpacityLabel: null,
						statsOpacity: null,
						statsOpacityOutput: null,
						disableArmyFormationManagerTooltips: null,
						disableAttackPreparationTooltips: null
					},
					audio: {
						soundRepairImpact: null,
						soundRepairReload: null
					},

					_Application: null,
					_MainData: null,
					_Cities: null,
					_VisMain: null,
					_ActiveView: null,
					_PlayArea: null,
					_armyBarContainer: null,
					_armyBar: null,
					attacker_modules: null,
					defender_modules: null,
					resourceSummaryVerticalBox: null,
					battleResultsBox: null,
					optionsWindow: null,
					resourceLayoutWindow: null,
					statsPage: null,
					lastSimulation: null,
					count: null,
					counter: null,
					statsOnly: null,
					simulationWarning: null,
					warningIcon: null,
					userInterface: null,
					infantryActivated: null,
					vehiclesActivated: null,
					airActivated: null,
					allActivated: null,
					toolBar: null,
					toolBarParent: null,
					TOOL_BAR_LOW: 113, // hidden
					TOOL_BAR_HIGH: 155, // popped-up
					TOOL_BAR_WIDTH: 740,
					resourceLayout: null,
					repairInfo: null,
					repairButtons: [],
					repairButtonsRedrawTimer: null,
					armybarClickCount: null,
					armybarClearnClickCounter: null,
					repairModeTimer: null,
					curPAVM: null,
					curViewMode: null,
					DEFAULTS: null,
					undoCache: [],
					ts1: null, //timestamps
					ts2: null,
					attackUnitsLoaded: null,

					loadData: function () {
						var str = localStorage.getItem("TACS");
						var temp;
						// this needs to be thoroughly checked
						if (str != null) {
							//previous options found
							temp = JSON.parse(str);
							for (var i in this.saveObj) {
								if (typeof temp[i] == "object") {
									for (var j in this.saveObj[i]) {
										if (typeof temp[i][j] == "object") {
											//recurse deeper?
										} else if (typeof temp[i][j] == "undefined") {
											// create missing option
											console.log("Creating missing save option: " + i + "." + j);
											temp[i][j] = this.saveObj[i][j];
										}
									}
								} else if (typeof temp[i] == "undefined") {
									// create missing option section
									console.log("Creating missing option section: " + i);
									temp[i] = this.saveObj[i];
								}
							}
							this.saveObj = temp;
							this.saveData();
						}
					},
					saveData: function () {
						var obj = this.saveObj || window.TACS.getInstance().saveObj;
						var str = JSON.stringify(obj);
						localStorage.setItem("TACS", str);
					},
					initialize: function () {
						try {
							this.loadData();
							locale = ClientLib.Config.Main.GetInstance().GetConfig(ClientLib.Config.Main.CONFIG_LANGUAGE);
							this.targetCityId = "0";

							// Store references
							this._Application = qx.core.Init.getApplication();
							this._MainData = ClientLib.Data.MainData.GetInstance();
							this._VisMain = ClientLib.Vis.VisMain.GetInstance();
							this._ActiveView = this._VisMain.GetActiveView();
							this._PlayArea = this._Application.getPlayArea();
							this._armyBarContainer = this._Application.getArmySetupAttackBar();
							this._armyBar = this._Application.getUIItem(ClientLib.Data.Missions.PATH.BAR_ATTACKSETUP);

							if (PerforceChangelist >= 443425) { // 16.1 patch
								for (var i in this._armyBarContainer) {
									if (typeof this._armyBarContainer[i] == "object" && this._armyBarContainer[i] != null) {
										if (this._armyBarContainer[i].objid == "btn_disable") {
											console.log(this._armyBarContainer[i].objid);
											var nativeSimBarDisableButton = this._armyBarContainer[i];
										}
										if (this._armyBarContainer[i].objid == "cnt_controls" || this._armyBarContainer[i].objid == "btn_toggle") {
											this._armyBarContainer[i].setVisibility("excluded");
										}
									}
								}
								var armyBarChildren = this._armyBar.getChildren();
								for (var i in armyBarChildren) {
									if (armyBarChildren[i].$$user_decorator == "pane-armysetup-right") {
										console.log(armyBarChildren[i].$$user_decorator)
										var armySetupRight = armyBarChildren[i];
										armySetupRight.removeAt(1);
										armySetupRight.addAt(nativeSimBarDisableButton, 1);
										break;
									}
								}
							}

							// Fix Defense Bonus Rounding
							for (var key in ClientLib.Data.City.prototype) {
								if (typeof ClientLib.Data.City.prototype[key] === 'function') {
									var strFunction = ClientLib.Data.City.prototype[key].toString();
									if (strFunction.indexOf("Math.floor(a.adb)") > -1) {
										ClientLib.Data.City.prototype[key] = this.fixBonusRounding(ClientLib.Data.City.prototype[key], "a");
										break;
									}
								}
							}

							// Event Handlers
							webfrontend.phe.cnc.Util.attachNetEvent(ClientLib.API.Battleground.GetInstance(), "OnSimulateBattleFinished", ClientLib.API.OnSimulateBattleFinished, this, this.onSimulateBattleFinishedEvent);
							webfrontend.phe.cnc.Util.attachNetEvent(ClientLib.API.Battleground.GetInstance(), "OnSimulateCombatReport", ClientLib.API.OnSimulateCombatReport, this, this.OnSimulateCombatReportEvent);
							webfrontend.phe.cnc.Util.attachNetEvent(this._VisMain, "ViewModeChange", ClientLib.Vis.ViewModeChange, this, this.viewChangeHandler);
							webfrontend.phe.cnc.Util.attachNetEvent(this._MainData.get_Cities(), "CurrentOwnChange", ClientLib.Data.CurrentOwnCityChange, this, this.ownCityChangeHandler);

							// Setup Button
							this.buttons.simulate.back = new qx.ui.form.Button(lang("Setup"));
							this.buttons.simulate.back.set({
								width: 80,
								height: 24,
								appearance: "button-addpoints",
								toolTipText: lang("Return to Combat Setup")
							});
							this.buttons.simulate.back.addListener("click", this.returnSetup, this);

							// Skip to end Button
							this.buttons.simulate.skip = new qx.ui.form.Button();
							this.buttons.simulate.skip.set({
								width: 35,
								height: 24,
								appearance: "button-addpoints",
								icon: "FactionUI/icons/icon_replay_skip.png",
								toolTipText: lang("Skip to end")
							});
							this.buttons.simulate.skip.addListener("click", this.skipSimulation, this);

							var replayBar = this._Application.getReportReplayOverlay();
							replayBar.add(this.buttons.simulate.back, {
								top: 21,
								left: 185
							});
							if (typeof(CCTAWrapper_IsInstalled) != 'undefined' && CCTAWrapper_IsInstalled) {
								replayBar.add(this.buttons.simulate.skip, {
									top: 21,
									left: 435
								});
							}

							// Unlock Button
							this.buttons.attack.unlock = new qx.ui.form.Button(lang("Unlock"));
							this.buttons.attack.unlock.set({
								width: 54,
								height: 37,
								padding: 0,
								appearance: "button-text-small",
								toolTipText: lang("Unlock Attack Button")
							});
							this.buttons.attack.unlock.addListener("click", this.unlockAttacks, this);
							this.buttons.attack.unlock.setOpacity(0.5);
							var temp = localStorage.ta_sim_attackLock;
							if (temp) {
								temp = JSON.parse(localStorage.ta_sim_attackLock);
							} else {
								temp = true;
							}
							if (temp) {
								this._armyBar.add(this.buttons.attack.unlock, {
									top: 108,
									right: 10
								});
							}

							// Unlock Repair
							this.buttons.attack.repair = new qx.ui.form.Button(lang("Unlock"));
							this.buttons.attack.repair.set({
								width: 54,
								height: 44,
								padding: 0,
								appearance: "button-text-small",
								toolTipText: lang("Unlock Repair Button")
							});
							this.buttons.attack.repair.addListener("click", this.unlockRepairs, this);
							this.buttons.attack.repair.setOpacity(0.5);
							var temp = localStorage.ta_sim_repairLock;
							if (temp) {
								temp = JSON.parse(localStorage.ta_sim_repairLock);
							} else {
								temp = true;
							}
							if (temp) {
								this._armyBar.add(this.buttons.attack.repair, {
									top: 23,
									right: 10
								});
							}

							var battleUnitData = ClientLib.Data.CityPreArmyUnit.prototype;
							if (!battleUnitData.set_Enabled_Original) {
								battleUnitData.set_Enabled_Original = battleUnitData.set_Enabled;
							}
							battleUnitData.set_Enabled = function (a) {
								this.set_Enabled_Original(a);
								window.TACS.getInstance().formationChangeHandler();
							};
							if (!battleUnitData.MoveBattleUnit_Original) {
								battleUnitData.MoveBattleUnit_Original = battleUnitData.MoveBattleUnit;
							}
							battleUnitData.MoveBattleUnit = function (a, b) {
								var _this = window.TACS.getInstance();
								if (_this.options.dblClick2DeActivate.getValue()) {
									if (_this.armybarClickCount >= 2) {
										if (this.get_CoordX() === a && this.get_CoordY() === b) {
											var enabledState = this.get_Enabled();
											enabledState ^= true;
											this.set_Enabled_Original(enabledState);
										}
									}
								}
								this.MoveBattleUnit_Original(a, b);
								_this.formationChangeHandler();
								_this.armybarClickCount = 0;
								clearInterval(_this.armybarClearnClickCounter);
							};

							this.loadLayouts();

							// The Options Window
							this.optionsWindow = new qx.ui.window.Window(lang("Options"), "FactionUI/icons/icon_forum_properties.png").set({
								contentPaddingTop: 1,
								contentPaddingBottom: 8,
								contentPaddingRight: 8,
								contentPaddingLeft: 8,
								//width : 400,
								height: 400,
								showMaximize: false,
								showMinimize: false,
								allowMaximize: false,
								allowMinimize: false,
								resizable: false
							});
							this.optionsWindow.getChildControl("icon").set({
								scale: true,
								width: 25,
								height: 25
							});
							this.optionsWindow.setLayout(new qx.ui.layout.VBox());
							var optionsWindowTop = localStorage.ta_sim_options_top;
							if (optionsWindowTop) {
								optionsWindowTop = JSON.parse(localStorage.ta_sim_options_top);
								var optionsWindowLeft = JSON.parse(localStorage.ta_sim_options_left);
								this.optionsWindow.moveTo(optionsWindowLeft, optionsWindowTop);
							} else {
								this.optionsWindow.center();
							}
							this.optionsWindow.addListener("close", function () {
								localStorage.ta_sim_options_top = JSON.stringify(this.optionsWindow.getLayoutProperties().top);
								localStorage.ta_sim_options_left = JSON.stringify(this.optionsWindow.getLayoutProperties().left);
								this.saveData();
							}, this);

							// Resource Layout Window
							this.resourceLayoutWindow = new qx.ui.window.Window().set({
								contentPaddingTop: 1,
								contentPaddingBottom: 8,
								contentPaddingRight: 8,
								contentPaddingLeft: 8,
								width: 185,
								showMaximize: false,
								showMinimize: false,
								allowMaximize: false,
								allowMinimize: false,
								resizable: false
							});
							/*this.resourceLayoutWindow.getChildControl("icon").set({
							scale : true,
							width : 25,
							height : 25
							});*/
							this.resourceLayoutWindow.setLayout(new qx.ui.layout.HBox());
							this.resourceLayoutWindow.moveTo(this.saveObj.bounds.resourceLayoutWindowLeft, this.saveObj.bounds.resourceLayoutWindowTop);
							this.resourceLayoutWindow.addListener("move", function () {
								this.saveObj.bounds.resourceLayoutWindowLeft = this.resourceLayoutWindow.getBounds().left;
								this.saveObj.bounds.resourceLayoutWindowTop = this.resourceLayoutWindow.getBounds().top;
								this.saveData();
							}, this);
							this.resourceLayoutWindow.addListener("close", function () {
								localStorage.ta_sim_layout_top = JSON.stringify(this.resourceLayoutWindow.getLayoutProperties().top);
								localStorage.ta_sim_layout_left = JSON.stringify(this.resourceLayoutWindow.getLayoutProperties().left);
							}, this);

							// The Battle Simulator box
							this.battleResultsBox = new qx.ui.window.Window("TACS", "FactionUI/icons/icon_res_plinfo_command_points.png").set({
								contentPaddingTop: 0,
								contentPaddingBottom: 2,
								contentPaddingRight: 2,
								contentPaddingLeft: 6,
								showMaximize: false,
								showMinimize: false,
								allowMaximize: false,
								allowMinimize: false,
								resizable: false
							});
							this.battleResultsBox.getChildControl("icon").set({
								scale: true,
								width: 20,
								height: 20,
								alignY: "middle"
							});
							this.battleResultsBox.setLayout(new qx.ui.layout.HBox());
							this.battleResultsBox.moveTo(this.saveObj.bounds.battleResultsBoxLeft, this.saveObj.bounds.battleResultsBoxTop);
							this.battleResultsBox.addListener("move", function () {
								this.saveObj.bounds.battleResultsBoxLeft = this.battleResultsBox.getBounds().left;
								this.saveObj.bounds.battleResultsBoxTop = this.battleResultsBox.getBounds().top;
								this.saveData();
							}, this);
							this.battleResultsBox.addListener("appear", function () {
								this.battleResultsBox.setOpacity(this.saveObj.slider.statsOpacity / 100);
							}, this);
							var tabView = new qx.ui.tabview.TabView().set({
								contentPaddingTop: 3,
								contentPaddingBottom: 6,
								contentPaddingRight: 7,
								contentPaddingLeft: 3
							});
							this.battleResultsBox.add(tabView);
							this.initializeStats(tabView);
							this.initializeLayout(tabView);
							this.initializeInfo(tabView);
							this.initializeOptions();
							this.setupInterface();
							this.createHasAttackFormationFunction();
							this.createBasePlateFunction(ClientLib.Vis.Region.RegionNPCCamp);
							this.createBasePlateFunction(ClientLib.Vis.Region.RegionNPCBase);
							this.createBasePlateFunction(ClientLib.Vis.Region.RegionCity);

							// Fix armyBar container divs, the mouse has a horrible offset in the armybar when this is enabled
							// if this worked it would essentially fix a layout bug, shame... using zIndex instead
							// Abort, Retry, Fail?
							/*
							this._armyBar.getLayoutParent().getContentElement().getParent().setStyles({
							height : "155px"
							});
							this._armyBar.getLayoutParent().getContentElement().setStyles({
							height : "155px"
							});
							this._armyBar.getLayoutParent().setLayoutProperties({
							bottom : 0
							});
							this._armyBar.getLayoutParent().setHeight(155);
							this._armyBar.setLayoutProperties({
							top : -5
							});
							 */
							// putting overlays in front so we have 19 layers to work with behind them
							// zIndex 5 is reserved for Shiva
							this.gameOverlaysToFront();
						} catch (e) {
							console.log(e);
						}
					},
					fixBonusRounding: function (bonus, data) {
						try {
							if (data == null)
								data = "";
							var strFunction = bonus.toString();
							strFunction = strFunction.replace("floor", "round");
							var functionBody = strFunction.substring(strFunction.indexOf("{") + 1, strFunction.lastIndexOf("}"));
							var fn = Function(data, functionBody);
							return fn;
						} catch (e) {
							console.log("fixBonusRounding error: ", e);
						}
					},
					initializeStats: function (tabView) {
						try {
							////////////////// Stats ////////////////////
							this.statsPage = new qx.ui.tabview.Page(lang("Stats"));
							this.statsPage.setLayout(new qx.ui.layout.VBox(1));
							tabView.add(this.statsPage);

							// Refresh Vertical Box
							var container = new qx.ui.container.Composite();
							var layout = new qx.ui.layout.Grid();
							layout.setColumnAlign(0, "left", "middle");
							layout.setColumnAlign(1, "right", "middle");
							layout.setColumnFlex(0, 1);
							layout.setRowHeight(0, 15);
							container.setLayout(layout);
							container.setThemedFont("bold");
							container.setThemedBackgroundColor("#eef");
							this.statsPage.add(container);

							// Countdown for next refresh
							this.labels.countDown = new qx.ui.basic.Label("");
							this.labels.countDown.set({
								width: 0,
								height: 10,
								marginLeft: 5,
								backgroundColor: "#B40404"
							});
							container.add(this.labels.countDown, {
								row: 0,
								column: 0
							});

							this.buttons.attack.refreshStats = new qx.ui.form.Button(lang("Refresh"));
							this.buttons.attack.refreshStats.set({
								width: 58,
								appearance: "button-text-small",
								toolTipText: lang("Refresh Stats")
							});
							this.buttons.attack.refreshStats.addListener("click", this.refreshStatistics, this);
							container.add(this.buttons.attack.refreshStats, {
								row: 0,
								column: 1
							});

							// The Enemy Vertical Box
							var container = new qx.ui.container.Composite();
							var layout = new qx.ui.layout.Grid();
							layout.setColumnAlign(1, "right", "middle");
							layout.setColumnFlex(0, 1);
							container.setLayout(layout);
							container.setThemedFont("bold");
							container.setThemedBackgroundColor("#eef");
							this.statsPage.add(container);

							// The Enemy Troop Strength Label
							container.add(new qx.ui.basic.Label(lang("Enemy Base:")), {
								row: 0,
								column: 0
							});
							this.labels.damage.overall = new qx.ui.basic.Label("100");
							container.add(this.labels.damage.overall, {
								row: 0,
								column: 1
							});

							// Units
							container.add(new qx.ui.basic.Label(lang("Defences:")), {
								row: 1,
								column: 0
							});
							this.labels.damage.units.overall = new qx.ui.basic.Label("100");
							container.add(this.labels.damage.units.overall, {
								row: 1,
								column: 1
							});

							// Buildings
							container.add(new qx.ui.basic.Label(lang("Buildings:")), {
								row: 2,
								column: 0
							});
							this.labels.damage.structures.overall = new qx.ui.basic.Label("100");
							container.add(this.labels.damage.structures.overall, {
								row: 2,
								column: 1
							});

							// Command Center
							container.add(new qx.ui.basic.Label(lang("Construction Yard:")), {
								row: 3,
								column: 0
							});
							this.labels.damage.structures.construction = new qx.ui.basic.Label("100");
							container.add(this.labels.damage.structures.construction, {
								row: 3,
								column: 1
							});

							// Defense Facility
							container.add(new qx.ui.basic.Label(lang("Defense Facility:")), {
								row: 4,
								column: 0
							});
							this.labels.damage.structures.defense = new qx.ui.basic.Label("100");
							container.add(this.labels.damage.structures.defense, {
								row: 4,
								column: 1
							});

							// Command Center
							container.add(new qx.ui.basic.Label(lang("Command Center:")), {
								row: 5,
								column: 0
							});
							this.labels.damage.structures.command = new qx.ui.basic.Label("100");
							container.add(this.labels.damage.structures.command, {
								row: 5,
								column: 1
							});

							// The Support Horizontal Box
							this.labels.supportLevel = new qx.ui.basic.Label("");
							container.add(this.labels.supportLevel, {
								row: 6,
								column: 0
							});
							this.labels.damage.structures.support = new qx.ui.basic.Label("");
							container.add(this.labels.damage.structures.support, {
								row: 6,
								column: 1
							});

							// The Troops Vertical Box
							container = new qx.ui.container.Composite();
							layout = new qx.ui.layout.Grid();
							layout.setColumnAlign(1, "right", "middle");
							layout.setColumnFlex(0, 1);
							container.setLayout(layout);
							container.setThemedFont("bold");
							container.setThemedBackgroundColor("#eef");
							this.statsPage.add(container);

							// The Troop Strength Label
							container.add(new qx.ui.basic.Label(lang("Overall:")), {
								row: 0,
								column: 0
							});
							this.labels.health.overall = new qx.ui.basic.Label("100");
							container.add(this.labels.health.overall, {
								row: 0,
								column: 1
							});

							// The Infantry Troop Strength Label
							container.add(new qx.ui.basic.Label(lang("Infantry:")), {
								row: 1,
								column: 0
							});
							this.labels.health.infantry = new qx.ui.basic.Label("100");
							container.add(this.labels.health.infantry, {
								row: 1,
								column: 1
							});

							// The Vehicle Troop Strength Label
							container.add(new qx.ui.basic.Label(lang("Vehicle:")), {
								row: 2,
								column: 0
							});
							this.labels.health.vehicle = new qx.ui.basic.Label("100");
							container.add(this.labels.health.vehicle, {
								row: 2,
								column: 1
							});

							// The Air Troop Strength Label
							container.add(new qx.ui.basic.Label(lang("Aircraft:")), {
								row: 3,
								column: 0
							});
							this.labels.health.aircraft = new qx.ui.basic.Label("100");
							container.add(this.labels.health.aircraft, {
								row: 3,
								column: 1
							});

							// The inner Vertical Box
							container = new qx.ui.container.Composite();
							layout = new qx.ui.layout.Grid();
							layout.setColumnAlign(1, "right", "middle");
							layout.setColumnFlex(0, 1);
							container.setLayout(layout);
							container.setThemedFont("bold");
							container.setThemedBackgroundColor("#eef");
							this.statsPage.add(container);

							// The Victory Label
							container.add(new qx.ui.basic.Label(lang("Outcome:")), {
								row: 0,
								column: 0
							});
							this.labels.damage.outcome = new qx.ui.basic.Label(lang("Unknown"));
							container.add(this.labels.damage.outcome, {
								row: 0,
								column: 1
							});

							// The Battle Time Label
							container.add(new qx.ui.basic.Label(lang("Battle Time:")), {
								row: 1,
								column: 0
							});
							this.labels.time = new qx.ui.basic.Label("120");
							container.add(this.labels.time, {
								row: 1,
								column: 1
							});

							// Available RT/Attacks Vertical Box
							container = new qx.ui.container.Composite();
							layout = new qx.ui.layout.Grid();
							layout.setColumnAlign(1, "right", "middle");
							layout.setColumnFlex(0, 1);
							container.setLayout(layout);
							container.setThemedFont("bold");
							container.setThemedBackgroundColor("#eef");
							this.statsPage.add(container);

							// Available Repair Time Label
							container.add(new qx.ui.basic.Label(lang("Available Repair:")), {
								row: 0,
								column: 0
							});
							this.labels.repair.available = new qx.ui.basic.Label("00:00:00");
							container.add(this.labels.repair.available, {
								row: 0,
								column: 1
							});

							// Available Attacks Label
							container.add(new qx.ui.basic.Label(lang("Available Attacks:")), {
								row: 1,
								column: 0
							});
							this.labels.attacks.available = new qx.ui.basic.Label("CP:- / FR:- / CFR:-");
							container.add(this.labels.attacks.available, {
								row: 1,
								column: 1
							});

							// Resource Summary Vertical Box
							this.resourceSummaryVerticalBox = new qx.ui.container.Composite();
							var layout = new qx.ui.layout.Grid();
							layout.setColumnAlign(1, "right", "middle");
							layout.setColumnWidth(0, 90);
							this.resourceSummaryVerticalBox.setLayout(layout);
							this.resourceSummaryVerticalBox.setThemedFont("bold");
							this.resourceSummaryVerticalBox.setThemedBackgroundColor("#eef");
							if (this.saveObj.checkbox.showLootSummary) {
								this.statsPage.add(this.resourceSummaryVerticalBox);
							}

							// Research Icon/Label
							this.labels.resourcesummary.research = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_research_mission.png");
							this.resourceSummaryVerticalBox.add(this.labels.resourcesummary.research, {
								row: 0,
								column: 0
							});
							// Tiberium Icon/Label
							this.labels.resourcesummary.tiberium = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_tiberium.png");
							this.resourceSummaryVerticalBox.add(this.labels.resourcesummary.tiberium, {
								row: 0,
								column: 1
							});
							// Credits Icon/Label
							this.labels.resourcesummary.credits = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_dollar.png");
							this.resourceSummaryVerticalBox.add(this.labels.resourcesummary.credits, {
								row: 1,
								column: 0
							});
							// Crystal Icon/Label
							this.labels.resourcesummary.crystal = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_chrystal.png");
							this.resourceSummaryVerticalBox.add(this.labels.resourcesummary.crystal, {
								row: 1,
								column: 1
							});
						} catch (e) {
							console.log(e);
						}
					},
					initializeLayout: function (tabView) {
						try {
							////////////////// Layouts ////////////////////
							var layoutPage = new qx.ui.tabview.Page(lang("Layouts"));
							layoutPage.setLayout(new qx.ui.layout.VBox());
							tabView.add(layoutPage);

							this.layouts.list = new qx.ui.form.List();
							this.layouts.list.set({
								height: 174,
								selectionMode: "one"
							});
							layoutPage.add(this.layouts.list);

							// Add the two buttons for save and load
							var layHBox = new qx.ui.container.Composite();
							layHBox.setLayout(new qx.ui.layout.HBox(5));

							// Load button
							this.buttons.attack.layout.load = new qx.ui.form.Button(lang("Load"));
							this.buttons.attack.layout.load.set({
								width: 80,
								appearance: "button-text-small",
								toolTipText: lang("Load this saved layout.")
							});
							this.buttons.attack.layout.load.addListener("click", this.loadCityLayout, this);
							layHBox.add(this.buttons.attack.layout.load);

							// Delete button
							this.buttonLayoutDelete = new qx.ui.form.Button(lang("Delete"));
							this.buttonLayoutDelete.set({
								width: 80,
								appearance: "button-text-small",
								toolTipText: lang("Delete this saved layout.")
							});
							this.buttonLayoutDelete.addListener("click", this.deleteCityLayout, this);
							layHBox.add(this.buttonLayoutDelete);
							layoutPage.add(layHBox);

							var layVBox = new qx.ui.container.Composite();
							layVBox.setLayout(new qx.ui.layout.VBox(1));
							layVBox.setThemedFont("bold");
							layVBox.setThemedPadding(2);
							layVBox.setThemedBackgroundColor("#eef");

							// The Label Textbox
							var layHBox2 = new qx.ui.container.Composite();
							layHBox2.setLayout(new qx.ui.layout.HBox(5));
							layHBox2.add(new qx.ui.basic.Label(lang("Name: ")));
							this.layouts.label = new qx.ui.form.TextField();
							this.layouts.label.setValue("");
							layHBox2.add(this.layouts.label);
							layVBox.add(layHBox2);

							// Save Button
							this.buttons.attack.layout.save = new qx.ui.form.Button(lang("Save"));
							this.buttons.attack.layout.save.set({
								width: 80,
								appearance: "button-text-small",
								toolTipText: lang("Save this layout.")
							});
							this.buttons.attack.layout.save.addListener("click", this.saveCityLayout, this);
							layVBox.add(this.buttons.attack.layout.save);
							layoutPage.add(layVBox);
						} catch (e) {
							console.log(e);
						}
					},
					initializeInfo: function (tabView) {
						try {
							////////////////// Info ////////////////////
							var infoPage = new qx.ui.tabview.Page(lang("Info"));
							infoPage.setLayout(new qx.ui.layout.VBox(1));
							tabView.add(infoPage);

							// The Help Vertical Box
							var pVBox = new qx.ui.container.Composite();
							pVBox.setLayout(new qx.ui.layout.VBox(1));
							pVBox.setThemedFont("bold");
							pVBox.setThemedPadding(2);
							pVBox.setThemedBackgroundColor("#eef");
							infoPage.add(pVBox);
							var proHelpBar = new qx.ui.basic.Label().set({
								value: "<a target='_blank' href='http://cncscripts.com/'>cncscripts.com</a>",
								rich: true
							});
							pVBox.add(proHelpBar);

							// The Spoils
							var psVBox = new qx.ui.container.Composite();
							psVBox.setLayout(new qx.ui.layout.VBox(1));
							psVBox.setThemedFont("bold");
							psVBox.setThemedPadding(2);
							psVBox.setThemedBackgroundColor("#eef");
							infoPage.add(psVBox);
							psVBox.add(new qx.ui.basic.Label(lang("Spoils")));
							// Tiberium
							this.stats.spoils.tiberium = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_tiberium.png");
							psVBox.add(this.stats.spoils.tiberium);
							// Crystal
							this.stats.spoils.crystal = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_chrystal.png");
							psVBox.add(this.stats.spoils.crystal);
							// Credits
							this.stats.spoils.credit = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_dollar.png");
							psVBox.add(this.stats.spoils.credit);
							// Research
							this.stats.spoils.research = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_research_mission.png");
							psVBox.add(this.stats.spoils.research);

							// Options Page
							var pssVBox = new qx.ui.container.Composite();
							var layout = new qx.ui.layout.Grid();
							//layout.setColumnFlex(2, 1);
							pssVBox.setLayout(layout);
							pssVBox.setThemedFont("bold");
							pssVBox.setThemedBackgroundColor("#eef");
							infoPage.add(pssVBox);

							this.buttons.optionStats = new qx.ui.form.Button().set({
								height: 25,
								width: 160,
								margin: 15,
								alignX: "center",
								label: lang("Options"),
								appearance: "button-text-small",
								icon: "FactionUI/icons/icon_forum_properties.png",
								toolTipText: lang("TACS Options")
							});
							this.buttons.optionStats.addListener("click", this.toggleOptionsWindow, this);
							pssVBox.add(this.buttons.optionStats, {
								row: 0,
								column: 0
							});

							/*
							// Popup Checkbox
							this.options.autoDisplayStats = new qx.ui.form.CheckBox(lang("Auto display this box"));
							var temp = localStorage.ta_sim_autoDisplayStats;
							if (temp) {
							temp = JSON.parse(localStorage.ta_sim_autoDisplayStats);
							this.options.autoDisplayStats.setValue(temp);
							} else {
							this.options.autoDisplayStats.setValue(true);
							}
							this.options.autoDisplayStats.addListener("click", this.optionPopup, this);
							pssVBox.add(this.options.autoDisplayStats, {
							row: 1,
							column: 0,
							colSpan: 3
							});

							// showShift Checkbox
							this.options.showShift = new qx.ui.form.CheckBox(lang("Show shift buttons"));
							var temp = localStorage.ta_sim_showShift;
							if (temp) {
							temp = JSON.parse(localStorage.ta_sim_showShift);
							this.options.showShift.setValue(temp);
							} else {
							this.options.showShift.setValue(true);
							}
							this.options.showShift.addListener("click", this.optionShowShift, this);
							pssVBox.add(this.options.showShift, {
							row: 3,
							column: 0,
							colSpan: 3
							});

							// side RadioButtons
							this.options.sideLabel = new qx.ui.basic.Label(lang("Side:"));
							this.options.leftSide = new qx.ui.form.RadioButton(lang("Left"));
							this.options.rightSide = new qx.ui.form.RadioButton(lang("Right"));
							var sideRadioGroup = new qx.ui.form.RadioGroup();
							sideRadioGroup.add(this.options.leftSide, this.options.rightSide);
							var temp = localStorage.ta_sim_side;
							if (temp) {
							temp = JSON.parse(localStorage.ta_sim_side);
							this.options.rightSide.setValue(temp);
							} else {
							this.options.rightSide.setValue(true);
							}
							sideRadioGroup.addListener("changeSelection", this.setupInterface, this);
							pssVBox.add(this.options.sideLabel, {
							row: 4,
							column: 0
							});
							pssVBox.add(this.options.leftSide, {
							row: 4,
							column: 1
							});
							pssVBox.add(this.options.rightSide, {
							row: 4,
							column: 2
							});

							// locks Checkboxes
							this.options.locksLabel = new qx.ui.basic.Label(lang("Locks:"));
							this.options.attackLock = new qx.ui.form.CheckBox(lang("Attack"));
							var temp = localStorage.ta_sim_attackLock;
							if (temp) {
							temp = JSON.parse(localStorage.ta_sim_attackLock);
							this.options.attackLock.setValue(temp);
							} else {
							this.options.attackLock.setValue(true);
							}
							this.options.repairLock = new qx.ui.form.CheckBox(lang("Repair"));
							var temp = localStorage.ta_sim_repairLock;
							if (temp) {
							temp = JSON.parse(localStorage.ta_sim_repairLock);
							this.options.repairLock.setValue(temp);
							} else {
							this.options.repairLock.setValue(true);
							}
							this.options.attackLock.addListener("click", this.optionAttackLock, this);
							this.options.repairLock.addListener("click", this.optionRepairLock, this);
							pssVBox.add(this.options.locksLabel, {
							row: 5,
							column: 0
							});
							pssVBox.add(this.options.attackLock, {
							row: 5,
							column: 1
							});
							pssVBox.add(this.options.repairLock, {
							row: 5,
							column: 2
							});*/

							this.battleResultsBox.add(tabView);
						} catch (e) {
							console.log(e);
						}
					},
					initializeOptions: function () {
						try {
							var options = new qx.ui.container.Composite(); //hello
							options.setLayout(new qx.ui.layout.VBox(1)); //hey
							options.setThemedPadding(10);
							options.setThemedBackgroundColor("#eef");
							this.optionsWindow.add(options);

							// Options Page
							var pssVBox = new qx.ui.container.Composite();
							var layout = new qx.ui.layout.Grid(5, 5);
							layout.setColumnFlex(2, 1);
							pssVBox.setLayout(layout);
							pssVBox.setThemedFont("bold");
							pssVBox.setThemedBackgroundColor("#eef");
							options.add(pssVBox);
							pssVBox.add(new qx.ui.basic.Label(lang("Version: ") + window.TACS_version), {
								row: 0,
								column: 0,
								colSpan: 3
							});

							// Popup Checkbox
							this.options.autoDisplayStats = new qx.ui.form.CheckBox(lang("Auto display stats"));
							var temp = localStorage.ta_sim_popup;
							if (temp) {
								temp = JSON.parse(localStorage.ta_sim_popup);
								this.options.autoDisplayStats.setValue(temp);
							} else {
								this.options.autoDisplayStats.setValue(true);
							}
							this.options.autoDisplayStats.addListener("click", this.optionPopup, this);
							pssVBox.add(this.options.autoDisplayStats, {
								row: 1,
								column: 0,
								colSpan: 3
							});

							// Mark Saved Targets Checkbox
							this.options.markSavedTargets = new qx.ui.form.CheckBox(lang("Mark saved targets on region map"));
							var temp = localStorage.ta_sim_marksavedtargets;
							if (temp) {
								temp = JSON.parse(localStorage.ta_sim_marksavedtargets);
								this.options.markSavedTargets.setValue(temp);
							} else {
								this.options.markSavedTargets.setValue(true);
							}
							this.options.markSavedTargets.addListener("click", function () {
								localStorage.ta_sim_marksavedtargets = JSON.stringify(this.options.markSavedTargets.getValue());
							}, this);
							pssVBox.add(this.options.markSavedTargets, {
								row: 2,
								column: 0,
								colSpan: 3
							});

							// Double-click to (De)activate Checkbox
							this.options.dblClick2DeActivate = new qx.ui.form.CheckBox(lang("Enable 'Double-click to (De)activate units'"));
							var temp = localStorage.ta_sim_dblClick2DeActivate;
							if (temp) {
								temp = JSON.parse(localStorage.ta_sim_dblClick2DeActivate);
								this.options.dblClick2DeActivate.setValue(temp);
							} else {
								this.options.dblClick2DeActivate.setValue(true);
							}
							this.options.dblClick2DeActivate.addListener("click", function () {
								localStorage.ta_sim_dblClick2DeActivate = JSON.stringify(this.options.dblClick2DeActivate.getValue());
							}, this);
							pssVBox.add(this.options.dblClick2DeActivate, {
								row: 3,
								column: 0,
								colSpan: 3
							});

							// showShift Checkbox
							this.options.showShift = new qx.ui.form.CheckBox(lang("Show shift buttons"));
							var temp = localStorage.ta_sim_showShift;
							if (temp) {
								temp = JSON.parse(localStorage.ta_sim_showShift);
								this.options.showShift.setValue(temp);
							} else {
								this.options.showShift.setValue(true);
							}
							this.options.showShift.addListener("click", this.optionShowShift, this);
							pssVBox.add(this.options.showShift, {
								row: 4,
								column: 0,
								colSpan: 3
							});

							// side RadioButtons
							this.options.sideLabel = new qx.ui.basic.Label(lang("Side:"));
							this.options.leftSide = new qx.ui.form.RadioButton(lang("Left"));
							this.options.rightSide = new qx.ui.form.RadioButton(lang("Right"));
							var sideRadioGroup = new qx.ui.form.RadioGroup();
							sideRadioGroup.add(this.options.leftSide, this.options.rightSide);
							var temp = localStorage.ta_sim_side;
							if (temp) {
								temp = JSON.parse(localStorage.ta_sim_side);
								this.options.rightSide.setValue(temp);
							} else {
								this.options.rightSide.setValue(true);
							}
							sideRadioGroup.addListener("changeSelection", this.setupInterface, this);
							pssVBox.add(this.options.sideLabel, {
								row: 5,
								column: 0
							});
							pssVBox.add(this.options.leftSide, {
								row: 5,
								column: 1
							});
							pssVBox.add(this.options.rightSide, {
								row: 5,
								column: 2
							});

							// locks Checkboxes
							this.options.locksLabel = new qx.ui.basic.Label(lang("Locks:"));
							this.options.attackLock = new qx.ui.form.CheckBox(lang("Attack"));
							var temp = localStorage.ta_sim_attackLock;
							if (temp) {
								temp = JSON.parse(localStorage.ta_sim_attackLock);
								this.options.attackLock.setValue(temp);
							} else {
								this.options.attackLock.setValue(true);
							}
							this.options.repairLock = new qx.ui.form.CheckBox(lang("Repair"));
							var temp = localStorage.ta_sim_repairLock;
							if (temp) {
								temp = JSON.parse(localStorage.ta_sim_repairLock);
								this.options.repairLock.setValue(temp);
							} else {
								this.options.repairLock.setValue(true);
							}
							this.options.attackLock.addListener("click", this.optionAttackLock, this);
							this.options.repairLock.addListener("click", this.optionRepairLock, this);
							pssVBox.add(this.options.locksLabel, {
								row: 6,
								column: 0
							});
							pssVBox.add(this.options.attackLock, {
								row: 6,
								column: 1
							});
							pssVBox.add(this.options.repairLock, {
								row: 6,
								column: 2
							});

							// showLootSummary Checkbox
							this.options.showLootSummary = new qx.ui.form.CheckBox(lang("Show Loot Summary"));
							this.options.showLootSummary.saveLocation = "showLootSummary";
							this.options.showLootSummary.setValue(this.saveObj.checkbox.showLootSummary);
							this.options.showLootSummary.addListener("click", this.toggleCheckboxOption, this);
							pssVBox.add(this.options.showLootSummary, {
								row: 7,
								column: 0,
								colSpan: 3
							});

							// showResourceLayoutWindow Checkbox
							this.options.showResourceLayoutWindow = new qx.ui.form.CheckBox(lang("Show Resource Layout Window"));
							this.options.showResourceLayoutWindow.saveLocation = "showResourceLayoutWindow";
							this.options.showResourceLayoutWindow.setValue(this.saveObj.checkbox.showResourceLayoutWindow);
							this.options.showResourceLayoutWindow.addListener("click", this.toggleCheckboxOption, this);
							pssVBox.add(this.options.showResourceLayoutWindow, {
								row: 8,
								column: 0,
								colSpan: 3
							});

							// showStatsDuringAttack Checkbox
							this.options.showStatsDuringAttack = new qx.ui.form.CheckBox(lang("Show Stats During Attack"));
							this.options.showStatsDuringAttack.saveLocation = "showStatsDuringAttack";
							this.options.showStatsDuringAttack.setValue(this.saveObj.checkbox.showStatsDuringAttack);
							this.options.showStatsDuringAttack.addListener("click", this.toggleCheckboxOption, this);
							pssVBox.add(this.options.showStatsDuringAttack, {
								row: 9,
								column: 0,
								colSpan: 3
							});

							// showStatsDuringSimulation Checkbox
							this.options.showStatsDuringSimulation = new qx.ui.form.CheckBox(lang("Show Stats During Simulation"));
							this.options.showStatsDuringSimulation.saveLocation = "showStatsDuringSimulation";
							this.options.showStatsDuringSimulation.setValue(this.saveObj.checkbox.showStatsDuringSimulation);
							this.options.showStatsDuringSimulation.addListener("click", this.toggleCheckboxOption, this);
							pssVBox.add(this.options.showStatsDuringSimulation, {
								row: 10,
								column: 0,
								colSpan: 3
							});

							// skipVictoryPopup Checkbox
							this.options.skipVictoryPopup = new qx.ui.form.CheckBox(lang("Skip Victory-Popup After Battle"));
							this.options.skipVictoryPopup.saveLocation = "skipVictoryPopup";
							this.options.skipVictoryPopup.setValue(this.saveObj.checkbox.skipVictoryPopup);
							this.options.skipVictoryPopup.addListener("click", this.toggleCheckboxOption, this);
							pssVBox.add(this.options.skipVictoryPopup, {
								row: 11,
								column: 0,
								colSpan: 3
							});
							webfrontend.gui.reports.CombatVictoryPopup.getInstance().addListener("appear", function () {
								/*if (this.toolBar.isVisible()) {
								this.toolBar.hide();
								}
								if (this.toolBarMouse.isVisible()) {
								this.toolBarMouse.hide();
								}*/
								if (this.saveObj.checkbox.skipVictoryPopup) {
									webfrontend.gui.reports.CombatVictoryPopup.getInstance()._onBtnClose();
								}
							}, this);

							// disableTooltipsInAttackPreparationView Checkbox
							this.options.disableAttackPreparationTooltips = new qx.ui.form.CheckBox(lang("Disable Tooltips In Attack Preparation View"));
							this.options.disableAttackPreparationTooltips.saveLocation = "disableAttackPreparationTooltips";
							this.options.disableAttackPreparationTooltips.setValue(this.saveObj.checkbox.disableAttackPreparationTooltips);
							this.options.disableAttackPreparationTooltips.addListener("click", this.toggleCheckboxOption, this);
							pssVBox.add(this.options.disableAttackPreparationTooltips, {
								row: 12,
								column: 0,
								colSpan: 3
							});

							// disableArmyFormationManagerTooltips Checkbox
							this.options.disableArmyFormationManagerTooltips = new qx.ui.form.CheckBox(lang("Disable Unit Tooltips In Army Formation Manager"));
							this.options.disableArmyFormationManagerTooltips.saveLocation = "disableArmyFormationManagerTooltips";
							this.options.disableArmyFormationManagerTooltips.setValue(this.saveObj.checkbox.disableArmyFormationManagerTooltips);
							this.options.disableArmyFormationManagerTooltips.addListener("click", this.toggleCheckboxOption, this);
							pssVBox.add(this.options.disableArmyFormationManagerTooltips, {
								row: 13,
								column: 0,
								colSpan: 3
							});

							this.options.statsOpacityLabel = new qx.ui.basic.Label(lang("Stats Window Opacity"));
							this.options.statsOpacityLabel.setMarginTop(10);
							pssVBox.add(this.options.statsOpacityLabel, {
								row: 14,
								column: 0,
								colSpan: 3
							});

							this.options.statsOpacity = new qx.ui.form.Slider();
							pssVBox.add(this.options.statsOpacity, {
								row: 15,
								column: 1,
								colSpan: 2
							});
							this.options.statsOpacity.setValue(this.saveObj.slider.statsOpacity);

							this.options.statsOpacityOutput = new qx.ui.basic.Label(String(this.saveObj.slider.statsOpacity));
							pssVBox.add(this.options.statsOpacityOutput, {
								row: 16,
								column: 0
							});

							this.options.statsOpacity.addListener("changeValue", function () {
								var val = this.options.statsOpacity.getValue();
								this.battleResultsBox.setOpacity(val / 100);
								this.options.statsOpacityOutput.setValue(String(val) + "%");
								this.saveObj.slider.statsOpacity = val;
							}, this);

							// The Help Vertical Box
							var pVBox = new qx.ui.container.Composite();
							pVBox.setLayout(new qx.ui.layout.VBox(1));
							pVBox.setThemedFont("bold");
							pVBox.setThemedPadding(10);
							//pVBox.setThemedMargin(3);
							pVBox.setThemedBackgroundColor("#eef");
							options.add(pVBox);
							var proHelpBar = new qx.ui.basic.Label().set({
								value: "<a target='_blank' href='http://cncscripts.com/'>cncscripts.com</a>",
								rich: true
							});
							pVBox.add(proHelpBar);

						} catch (e) {
							console.log(e);
						}
					},
					toggleCheckboxOption: function (evt) {
						var tgt = evt.getTarget();
						var val = tgt.getValue();
						this.saveObj.checkbox[tgt.saveLocation] = val;
						//console.log("this.saveObj.checkbox[\"" + tgt.saveLocation + "\"] = " + this.saveObj.checkbox[tgt.saveLocation]);
						//console.log("val = " + val);
						if (tgt == this.options.showLootSummary) {
							if (this.saveObj.checkbox.showLootSummary) {
								this.statsPage.add(this.resourceSummaryVerticalBox);
							} else {
								this.statsPage.remove(this.resourceSummaryVerticalBox);
							}
						}
						if (tgt == this.options.showResourceLayoutWindow) {
							if (this.saveObj.checkbox.showResourceLayoutWindow) {
								this.resourceLayoutWindow.open();
							} else {
								this.resourceLayoutWindow.close();
							}
						}
						this.saveData();
					},
					createHasAttackFormationFunction: function () {
						try {
							ClientLib.Data.City.prototype.HasAttackFormation = function (targetCity) {
								var $createHelper;
								var ownCity = this.get_Id();
								if (TACS.getInstance().layouts.all.hasOwnProperty(targetCity)) {
									if (TACS.getInstance().layouts.all[targetCity].hasOwnProperty(ownCity)) {
										var count = 0;
										for (var key in TACS.getInstance().layouts.all[targetCity][ownCity]) {
											if (TACS.getInstance().layouts.all[targetCity][ownCity].hasOwnProperty(key)) {
												count++;
											}
										}
										if (count > 0)
											return true;
									} else {
										return false;
									}
								}
							}
						} catch (e) {
							console.log(e);
						}
					},
					createBasePlateFunction: function (r) {
						try {
							var regionObject = r.prototype;
							for (var key in regionObject) {
								if (typeof regionObject[key] === 'function') {
									var strFunction = regionObject[key].toString();
									if (strFunction.indexOf("Blue") > -1 && strFunction.indexOf("Black") > -1) {
										if (r == ClientLib.Vis.Region.RegionNPCCamp || r == ClientLib.Vis.Region.RegionNPCBase) {
											regionObject[key] = function () {
												var $createHelper;
												var basePlateColor = ClientLib.Vis.EBackgroundPlateColor.Black;
												if ((ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity() != null) && ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity().HasAttackFormation(this.get_Id())) {
													var playerFaction = ClientLib.Data.MainData.GetInstance().get_Player().get_Faction();
													basePlateColor = ((this.get_PlayerFaction() == 1) ? ClientLib.Vis.EBackgroundPlateColor.Orange : ClientLib.Vis.EBackgroundPlateColor.Cyan);
												}
												return basePlateColor;
											}
											break;
										} else {
											regionObject[key] = function () {
												var $createHelper;
												var basePlateColor = ClientLib.Vis.EBackgroundPlateColor.Black;
												if (this.get_Type() == ClientLib.Vis.Region.RegionCity.ERegionCityType.Own) {
													basePlateColor = ((this.get_PlayerFaction() == 1) ? ClientLib.Vis.EBackgroundPlateColor.Cyan : ClientLib.Vis.EBackgroundPlateColor.Orange);
												} else {
													basePlateColor = ClientLib.Vis.EBackgroundPlateColor.Black;
												}
												if (((this.get_Type() != ClientLib.Vis.Region.RegionCity.ERegionCityType.Own) && (ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity() != null)) && ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity().HasAttackFormation(this.get_Id())) {
													basePlateColor = ((this.get_PlayerFaction() == 1) ? ClientLib.Vis.EBackgroundPlateColor.Orange : ClientLib.Vis.EBackgroundPlateColor.Cyan);
												}
												return basePlateColor;
											}
											break;
										}
									}
								}
							}
						} catch (e) {
							console.log(e);
						}
					},
					initToolBarListeners: function () {
						try {
							var playAreaBounds = this._PlayArea.getLayoutParent().getBounds();
							var playAreaWidth = this._PlayArea.getLayoutParent().getBounds().width;
							this._PlayArea.addListener("mouseover", function () {
								//this.toolBar.setOpacity(0);
								if (this.toolBar.isVisible()) {
									this.toolBarMouse.show();
									this.toolBar.setLayoutProperties({
										bottom: this.TOOL_BAR_LOW
									});
									this.toolBar.setZIndex(1);
								}
							}, this);

							this._armyBarContainer.addListener("appear", function () {
								//console.log("_armyBarContainer appeared");
								this._armyBarContainer.setZIndex(3);
								this.toolBar.show();
								this.toolBarMouse.show();
							}, this);

							this._armyBarContainer.addListener("changeVisibility", function () {
								if (!this._armyBarContainer.isVisible()) {
									//console.log("changeVisibility: _armyBarContainer hidden");
									this.toolBar.hide();
									this.toolBarMouse.hide();
								} else {
									//console.log("changeVisibility: armybar is visible");
									this.toolBar.show();
									this.toolBarMouse.show();
								}
							}, this);

							this.toolBarMouse.addListener("mouseover", function () {
								var paw = playAreaBounds.width;
								if (playAreaWidth !== paw) {
									playAreaWidth = paw;

									//need to do this on maximize as well
									var armyBarBounds = this._armyBarContainer.getBounds();
									if (armyBarBounds) {
										this.toolBar.setDomLeft(armyBarBounds.left + ((armyBarBounds.width - this.TOOL_BAR_WIDTH) / 2));
										this.toolBarMouse.setDomLeft(armyBarBounds.left + ((armyBarBounds.width - this.TOOL_BAR_WIDTH) / 2));
									}
								}
								this.toolBarMouse.hide();
								this.toolBar.setZIndex(11);
								this.toolBar.setLayoutProperties({
									bottom: this.TOOL_BAR_HIGH
								});
							}, this);

							this.toolBar.addListener("appear", function () {
								this.toolBar.setZIndex(1);
							}, this);

							this._armyBar.addListener("mouseover", function () {
								//this.toolBar.setOpacity(0);
								this.toolBarMouse.show();
								this.toolBar.setZIndex(1);
								this.toolBar.setLayoutProperties({
									bottom: this.TOOL_BAR_LOW
								});
							}, this);

							this._armyBar.addListener("click", function () {
								this.armybarClickCount += 1;
								if (this.armybarClickCount == 1) {
									this.armybarClearnClickCounter = setInterval(this.resetDblClick, 500);
								}
							}, this);
						} catch (err) {
							console.log(err);
						}
					},
					setupInterface: function () {
						try {
							////////////////// Interface Side ////////////////////
							localStorage.ta_sim_side = JSON.stringify(this.options.rightSide.getValue());

							// qx.core.Init.getApplication().getPlayArea()
							// might need to use this instead, mouseovers are not being registered during attacks

							var playArea = this._Application.getUIItem(ClientLib.Data.Missions.PATH.OVL_PLAYAREA);
							var playAreaWidth = this._Application.getUIItem(ClientLib.Data.Missions.PATH.OVL_PLAYAREA).getLayoutParent().getLayoutParent().getBounds().width;
							this.armybarClickCount = 0;
							var playerFaction = this._MainData.get_Player().get_Faction();
							var statsIcon = "data:image/png;base64,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";
							var undoIcon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAzdJREFUeNq8ll2ITGEYx+edj901i2UNaaiVyFdK3PgohUJSyo3ykVsXeyFy7+NOElfkjpBy5Yoil5S4EclolfK5YwfL7JwzX8f/af5Hj9eZs2P3nD3165yZc877/N//857nfUwi5PA8T05GLo0xiTiO5DjBe8BaMIDfZsoEMHg32Akug00gNZUOSLD14CQYAu9BMw4B6YDZi9WrwGnQC56A161bf9Lg6Xcmsz7SAcHz4BTIge+gClaA5QxcBqO8Fn7hvTGcXVAXp/5HkLHyPhucAdvAGAV2B6RHjmGKk+c+gLfgKd0qiiAI8ToSwOAzwVFwGPxgzvUAnvXbv29IimI/g0fgNiiAWpgjvgB5eR+tL9PKoOA2TXXWgqZxnEvgrrjUTkRSnXO03Jtg8AaFO2CEv0+AI6CPLrcVUANXwXUwS+XZn1FSYRSJABH+ucy1sB8MyrhBIuxF2AeOgUOgRCEVDtYMcKeXC1dm/ZPP1pUbDcYQd2+BG/KMTkdaf8sQIYvvPBfTHg58H9zkqrfFT6eIzWALWMxZV5UI4RPYC16Bx7qope2CQhEXafdusJIDD+F+3aobJV6+AXfALnCA/5WUAIfjyb0C3iv6LvxTinlDPqULnL0UoNWg386hPEvqfEecOsfUZRi8Rke+ggUsaiZ0L2ABEdvOsrAsA9nQgtISLjN9CK6BebS6RiEVitwIutruBVoEDhFxnIvoy3gllimUkvwAbOf4dTpQowuLWPSKof0AB5QZvAPPcF3pqLa3REqge3StpigzPTk/nclOBpzAbifCn6sU+OvAUXtMZwImcVSt4FXumA47LRO6BiJqdhpW8Cq38mzcDhh+OQ4Du0pIimlIxOlAF+vHNxXcVRWy4pf0yB3g6s6z4Iyo4C7XQ4bOxJYCcXUDv/+yCu6oDW20bSmOYPZSbreym66o4C5TM0ZhsTggu+gOBhu2gksq5qr/oxWA2SfZzq8DLzlLx7J/DrfkRqQCaP18cBB8ZDvvWg7MkBaeW7cXtQOG3ZTMrB+sAUs5Y/9TXwJe6AX4V0sWUQqy7CnlMxwAC/lfhuKu2LuqiakO+I1sD3vGPHvGAoI39PO/BRgAhgJgQiBnZrUAAAAASUVORK5CYII=";
							var redoIcon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAx9JREFUeNq8l8uPDFEUxvtWV8/o7hmPTCeeC4bJYIhHIhZYiNjZ2CEidlYWHrEwEyxn7x+wtbSxFqyJiEeEeGS0kU4YY3qobt3lO/HdOK6q6mrd5Sa/VLoe93zn3HPuPZ3LZTTCMDSg43teRsZ9XDaD1SLkvwvAKIFT4DqoJEUiKwFN8A5sB+fB0jgRXo+hdjEMeQM8BE/BCXAWlKNE+N0mFi55UABLwDAY4GO5N8LnOT6vglFwEnwBNzDHgjG/08Kk8ZKREmMbwU4wAVaBNfKKhBgsA21i5/0BAjoqeXEJ3JZ7VoRJ4bFMvgMcB7s5mUzccpbSOE7puQ0jJblxDtyHgHaiABiXUG4CZ8B+ehIog54ybK9RaBFFUAPHwKxEwU8wLnV8lWGuMdR5tcba+3ZCQmsRErUyGIxNQhiXibayfIbAR06Sj5nYJEQiR+F2Cb6CKUlOmwN+xJqvBRcZrk807DtrOcTnkvnv6ZlxRA3QW8OKmGc5PoLxVlwEilyfYRr3nVAv57274A54xYkbEdHZA06DbUy+C67xPwTQ+w1gnyQIQxcq4yvAGzANXjMhf2WyqmuWrZTkGPNInLoCHrjG3QjIi0fo0aIT9gpFXZaQY6Kww/myBexisk2y9htRL/tK9Up+NMM6t6PMj6eZPJ3OWBGwHoyDa+CW3njiIuDxAzG0oDLecN1vgud28+gwWsyRl+BJknEtwOem8wF8V/v7IH/fiwvhX0Vv5DwKq7rUkoavDo5KREbLDJ/lfprJlIjU71oBeWZ0nSWTU5tILa33/zJ8Z+0CJwHrjE4hKwGe8jSkp4G6LvI0LKZpMHsR0KTnniOizjIcS9M79CKgwUOnwKy3R+837vUHuFFlJqBFASUVgYBiZtgJjXZqsXvNgSrXu+VEYZ4cUvtDJgJmmQcF5b1dhhc81db1Oxk9tXHMsZevOEsQ8JnkwlFZpn6K8Jw/E4/ZgrWdZQjUH42D3bbzqQTwlHvGtmmEZVeioAl2xHW24/l+CTAR/eBecFhtvxL+t2xGava86Ga/70aA/WM5TsNz3A2bUd1PP8ZPAQYA6tkaX3nBq4MAAAAASUVORK5CYII=";
							var resetIcon = "data:image/png;base64,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";
							switch (playerFaction) {
							case ClientLib.Base.EFactionType.GDIFaction:
								var iconFlipHorizontal = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAFTElEQVR4XtWVW28bRRTHz5nZ9Xrt2IlzKUlanJReiEhLpUpFPAQJBIUH4K1IXEQf+AZIfIE+9oXPgAChPlb0DVGFXlBBlFJoaakobVVCkxbiJI7ttdfeOfwnySo18UXIlRBnd+X1zP/8/mfO7tj0v4lvStKDtseYfVAiGxeCBt8Q8a5Hkj67JGkRYVyEe/2LwSWioNnMeZRx4so1vhLK0Km7xbdO3Fw6fnYpOvr+ye9e/uDzi4NnlqIdGJvC3PjVUNzPfrr66IzP/ylk47pI4tTc6psnbi3/cPmvslxalZPvfjz74dFPZnfj/hDGXsPcc9CMQ8txbrdQ3QQzI0xn7ghXyjRKrJ59aiA5dWAoRa6mEWau4zKOogTGGHN90OTKZUoix+b2XoCNTJ7U/EppplKrHx7w9BpViEwsEHsiMEfQDC+slHLZCbK63gs4VxGqBpR3tDs9PZDMu0p7QSTEQg34xhCxY5jT0PjQZoMK+cjtvQAlolbLwcFSJTjiOUosUta5EW2GyEYboCFox5CTVdJDAefLGy5GdpLwwcmsNzzqu5mFqgi3aK4ds3PQuNC6yBlAbipm/esCZtJMXwfiSGSmqtXakX7PcSuRkOKmZysPf7Nz0Ai0jJwx5PaBwWC1L6DT6o0x+XK5drg/6aZ3pt3MPaxQNbOEpKkAshpoE8jRyB0Bw+/UBdVu9ecC8VzhPVFkXnoy6w0CTA63fLObyFYDrezFY0DuMBhpsFS7Lqh2q1ck4w8Kq28orf3RpPYLoV09dzS3YTVWO5bUWuEEY1yxeO26oNqs3nci3stKP/3CY37+Rqnl6hmXMG2tymptDnJTYGScBveBqVt1QbVavato273F4juseMDX7IRGhLllC0Vo616zWpuDXAbDAWs7mIlWXVAPm9sKz1clFVWjfVrrna+O+buvFI1YDrWLNjM2x+aCkQbLMjNg2y5Yr60FxO3xFA09WCkf6XPV9lq0JmhvTiw4AGj7hrNlgJUEcxRsN/ZqKiCu6EJd/GKx9oyQmnx+JDnxa5m4w+LbGDc/CssAywczBXYOHk2eKq5oVoQSQsOlIHwxn3KmCnWK93wnfxZEpyZZBlgEZh/YQ/BIfIWUuAsqriRDlLi/WJlBy/ZP9bu5Qkga7G5L7NYiEgRYDGaiZigLj0F4cdwFZSs5EwhTSKPG0MHpfndfsaHcxrp15/6LqG41ItiywOTprJuBR7/UKAlPst6KEP1JUvOLpZnVavhKznPcSEgZibdepxCbz93eA8sCk8FmeIzMF0o5eK7Blf3PrlQo7ypnen8u+YSjdHqlLtQdvEZXpKxF12DLBNuBRwpeGXj61lu5ZHi5WDqwVCy/5zqarLVsPr8tV/xzO7e6QMaIE0WRvbdjHXNiLjwYXnl4ZuBNjkTAsdufz8jg4/gXu1sWSur2azIb7/z2vlGl+LpmxHhm1Nqzp7jjzlkKiSbSrrOYSVCRXRfeKEAMaUUVY/Q1T1FmV4al1QYXEaqbBtrowFL05T/uBJGIz4T7udvRrt0TtR0+SWjqktAuKVbUIthhotW6UZETrRXrOKwkCMKb399d+PTcbxpANoKTpPnXFmAuBMs84GVVKHWZm1vZI0LfGkO10xfnwt+Xq/MeJ6hQXZbh1CAldOIf6+D1A67LK8X05LahYHIkRSygHPvicvbSrfn9IiYkhDAsTfMLp5hZ44hMxICwh4epFF+AYAgML6xHYsDSrMTeIVr8d8oGT6m940P3j79+qM7UY7z90WlX4i2LE9a0vrvtZ1wEPuNvwsQs9OPte42fjx3t2bzH/C/pP4+/ARzr/zZI4lPKAAAAAElFTkSuQmCC";
								var iconFlipVertical = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEz0lEQVR4XsWX3W8U5RfHz3lmd2Z2drftdinQjRhKE02MV7SIhZYLSUyIMcZ45wVeatQ/4BfwlxiF+A8Yb8WXC68QiBFjIEYwigQiYFEoFVBCX3ZL931nd555zvFkQnphu11Td/VMJvMkm8l8crLn+/0ehDXqXIkxbhECKgBFPOFZDD2qNQHOl2hbzff3C4BWSHOZAe8axqG4SyH9OwBF8xo16h8YpsZik34eSLnHLQsvZwfcKy2G6h4bdW8Blun/kxl850HAXPB1I+8HQSHg722Fl/tT7lkvFZtuGqhNuRj0qAN0eKIfjtyoAmx1EUKikNno6VKwXCe4CGRubR3sO6kcmBGQ8j4XdVcBzhXDQ3v71dHpKgMCsKsQXQsgabG2kfmbRf8uI94Ephu5bPp4GIM7oYLCVAypSx3Qh/f0W0euC4CFCMwMDMC2gCAAbEtAyMz01YJ/ywKetxRcHMqkvtAIdycTON8FgFAA1ArAw4pApFg4UMnh8TTwckD++ULzLhhT8pz4l17K/pZR3Z5KqrnuAayula4kY4gjHsLtmi7PVIOlZissD6QTn7IFP9m2fXMyifPdAmgLEjLwsIu42UG4WgqWykHYKjSCxcE+7xNN5peBVOJqTEFhzEH6WwBf52uH929KCgCtAHQqYgbNwKOewoQFcL3SetDShv+o6dk+zzkFQFeGB7xLTR2UdqcdvS7Ah7dnDx3cPnp0NUDnMsxADDySVMhyXvB1pdQM+Z5vrsYVXEi59ulMyrk05mGtLcDpxcpbzw6l371WEQCEDZVhAAWRjsgZmMjo36pBuFAPvsumvbf7U/aFXR7ymgCn8oX/PT+06T3fMKBcLNdGixkgrkBuBJLzmXvlkOLuwcG089nudBuA1z+/8NFLUzseybpZKDZLvNkbjF6W6tQPbjNpFiPEhAPqmu+0CD4GwDP7Mm0AXj529jlLwQEEDAkgVIgEzAaiJ0YDiIgMUa10EVfuiAPVWgNHRM7EEzvef2PX9lmQagfwmGUBICtiBFaoonlDRGCIvg+IEXvEg5FiI0a/yTGCih6re0GG1eSTo3Ov7ny00RbgzZM/7nxx74iddbKw3CzBluQgELfrdscpiXjlRkvOtZD9gODevoxaagtwYiE//sKWoZxvmHvwJzQUd64cyCXm1hvDcRnDYRlD7uIYsowhyRgWN6W9mf2bneJ6QjT2yshobloAuiBEWoQIRIgq0oViyo3nRYjKIkRmPSkeFykeFiXkDUoxihS3RIpBpLguUrwIQGWR4rJIsRYp5k5mNC55YDVAZzNCMaOWmBGJGbXEjO5rMhUxo+ruBLZWUW8IoL0da7HjQOw4FDu+zxaUxI7rYscrH94YQOdAQhJIGmBMKIEkL4FkiVH5Ekia/ySSCUAsAmgTyYiZQSJZ3QJuWgpKEsnyGqExKa3uRigdk1Cak1DKfwmlZCODhNIGI9aBqSahdCGMQX3CxqCbsVw6AMO/VoEfxnJiNiyxPKgTlIFMTWL5onKhLhOmJZZzV2P5D2Uee7oPcrKYUMHXRhYTKgRcikurJV4tJdOxqh+CmXKRerKYHLs+/8xoJulqIpLVrCqr2bxlYVlWs0qLIZTVjHu6mp34vbLFcWLxyA+RmrKcVp5yUPdmO/6P609VRf8/TUkZ4wAAAABJRU5ErkJggg%3D%3D";
								var iconRefresh = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAFfUlEQVR4Xu2Va2wUVRTHz9zZme6zpbQVSgxU21r64hUSUIkPFFPhCx/kFTEkkhYwNYX4ICFRoTFEKomhIajBICRNSgSifrBWHpaAChUhPFtqIVKUAm63y86+ZmfmzvXcnWWxBaoy+9Gb/DJ7956Z//+ee8+9AmSw1XZpIj5kxIm4EAcSRFTE2F4hs+ECjgwJ84lISDZSgIxF8lJGTiA3EQW5ywDJkLicEizLl4QXnxvt2Lx4rNTycqG0c4pPrAEALyIWVMyuwHiSQshUBkQkBymp9pJl1V5xGRHufJdZ5kh77ZIlotNZ2/F2/SfPNm39hi8LmkjYN2AJjBnvJLMn+8TlfCCo0f7j3b8NXLr4q6fwmTlHTzY3VRBJXpUzplAun1T93sU9LdkTFyzlJvwE7LcCpBRn/yrv9EfUa1t27o1917qbXDi0Xzm+bYt7sLdn/ahHSzwL65ZPWNNQV/rEtOrGKwfalgLAQ5kwMAGpzJWE8bzT0nZE0CJhoKp6XvL41gd6uqpyi0u7Zy94Kf78jCl5PGburOn5MyZXLASAYttl+OWf5kH+odGSUGSYptnddz2e7XGrntxR7e0DxjoeU+Uli3Ezbhou0BszP7Zt4LNrdFupm6waPnA6TNeej5i7eacm37ExGrxVo0RjzvIJhS4HIWRQZ1cA4LLtJegM0b0HzvSe+fvAV8fP/rzz/Y3lh9asmN/Z1Dhlw1vviJ+27At+e+JCiIvzmLYBYwfSSMB+u9x5puuLth9+GeCdg52nA9/v2esKXu4tzyurOK9Hw+ux/Kpkrw+Wzn2KJatEZ1fxcQHpu28ZzmrY+kokFn/XZOye40QQwOdxr8bOsaI5c1t+2tMS7Dl5ak332XNhdTCg5U2s3DDztYbY9cMHsksmPhadWf6IO1cWx3GBcxFzB98CiP++e+Dx+uZmg9LXix8eCyIR0meogBjUhJ6+a+B2OddVrlyx6fb5j4fMvEj/Hysll2t7zfbWw3guLMLybIJUMxkY5yJ0FxrYhd0eZHCkJUgwlG2smw9b3lgEH622aH5zEaxdNg9ww3MzGl4wJo9FFDzhWrH8VqB4K9fj4wyAGgwS1xPs1P6AsRbFPweAS0gIof94EiaoCQkDI00rBxRldWoOibFuuXSSuhCCRLAS2pFA6jbkzxuIH1EQnb83ogHG0DoKq5RBSh+owE0xPjbiq0gU6UeOIAYSTxnhWaP/5jpGFbRpchOQTDlLvkBAH1E8nRE9RXikWMcIsxe4gzhlIFGTG0hffSr2UxmwTdrA1NoPO4NKeOrtfr/fL1aWFMPur4+C5CDgcTuhZs4McDqz0kuAZM5AQtcLqkqKpKenlQH/bpYkgRdFCZjQdzOEBCGiUaAiTe4Jg1IQBCGYMQOMMeoQCZ5W0yGVbS4AWRjRceoqXOoPWKlH+LMwPw8CIaVhWt3mGr5chAhElqTOY1sbmh7UQHKd/RFrvbk4b7JMIKzqIACDmGECReI6hXEFeZCb7ZoUjcUn8YyFonEIhpTpAPBgBtBB8oQLaUa65DhZKK1Syk2lDagYQCmD+oUvQFlRLuBrUP9BKyjRuGZnCcBAkcEEHRIgA4GYbmUlblAwdAoqAgxjUe9GGE2Z1p5gGGPLAEWRIDcgDDUQRWF2x0A6IyGNgj9h/Tas0rRngM8ipNMhH5KYgBmwRPixTBENAezfQgMyN8D/t8rSfgYUfehMHGCCapjJDKi6AQ4igpYyxPcLiRupDFD7BpjJQIkl+O90GRIUi6MwRQxNTwKSAxivCkaAmAIwhJo2M2AyJuuJBBxp3Tc8xtpcKPB7ekxIbpOb+ztAlCQMADSm8UzID2wgx+vtCITCT95rFoKVjruNKeEhMTk+34//Uf9/4C/OeihXxgLfsQAAAABJRU5ErkJggg%3D%3D";
								var leftBG = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAACgCAMAAAC7f4tPAAABklBMVEUAAAD///8bfqbc3Nyhop/T09PZ2dnY2Njx8fHy8vLz8/Oen5t2d3XW1tZyc3C5ubnJycnLy8ugoZ6hoZ7X19bX19eKioiXmJTa2tqXmJXg4ODh4eHi4uLr6+ucnZmcnZqdnpr09PTR0dHS0tLV1dV0dXPj4+Pq6uqen52LjIrK09eMjIvOzs3Q0NC3t7e4uLiRko9qa2iWl5NtbmsbfqZ0dHK9vr3b29t2dnTf39/IyMifoJygoZ3CwsLo6Ojp6enDw8Pu7u7w8PCGh4OIiYewsLC0tLR1dnRnoblsbWqpqairq6irrKmsrKutrq2ur6xub22zs7OHiISHiIW4uLZub26Jioi5uri6urq7vLtvb22Ki4dvb27FxcVra2nIz9KNjoqOjouQkY5zc3HOzs7O1djPz8+Sk4+TlJCVlpNpamd0dXJubmyYmJaZmpeam5ibm5l1dnNqpbxubm2enptub2x4eXd6enh8fXuCgoGEhYKEhYOioqHt7e2io6Hv7++jo6OkpaKlpaOlpqOmp6Wnp6Um7BAdAAAAA3RSTlMAAH5Ny5jlAAACu0lEQVR4Xu3b1Y/bQBDA4Wtm1+wgM8MhMzOUmZmZmfH/rtc5K6kq9SGbac/qjnSv38NPymmccbr2oM3vtKC7nPGMdXRaaM/THuAZSZLYX9kBmrRnqwekDkyZQpyacUmyaEe+5MjcNFj0xEdGN2rcAO5p0ABxaz6/ZLQj80+DZjYcfsdoVoPJS+sDg+2Pz+cHp7VJ4X6O0awzkzf8k8npdieZTEERbDoepxRO6Ixu1Fg6EqiuaGq7o2kFJV0CgDLLYR7wzlr0jrwRSH9SeEbVlORNRgPI3a+Ozln0mP1JWfdXmcxlFzIli6YgR18cexRiNLAZmFxReEfLSIw2T05dHso36cGkxk/XGA2bUwkSDJEmPa1y0+qiTY8HCQkRDJoO6yR2W/9LtMI/Ng0VwsY9NGKQ/6a1aC1ai9Z3rSC3cFpfzJPYUB4lSOQQWmuQfxAdJwhA//MYFk37TtVxgrBZw6O9WEEoJl1BC/JHWrQWrfv2YtH9b58gfdDlXiNRR6EjUSOB9P96+14Caw8ZDZJYzG3LAnh1QnS3LWZ0lLirNT8t9mvRWrQWrQ281uH9aK1B/obVmj3dfSFINIQn6nhL8Coe7XXlfl35N0FEa9E6fBCrtdz7eg0niBw9ey6LQoejxhWkPcQwEijLgnMDQ6HFHiJ2PtFatBatRettJBr/BkaIG29gx7O75QYm9mvxLCNau/EGdm3VdTewbvac5LYb2HB+F+0hYucTrUVrzHeC3UNjBnF/a4x33cfJr1/G+TpAqws2vWm5wVALnSpwF1lO2UHMfaGR1pf/Z0DROO0P6YhNg/x15GquSUOxqhQ0jt9wqMtpU4KdG9h3Mhts0lBKZTK1xXantpCKSODQcCY710LDdSrxjMxkOwgUKbzRbbqT4+zXz3IItA0Ezj/GomcePMQKcuH9HSx6fv70T0KzcLgY6GqkAAAAAElFTkSuQmCC";
								var rightBG = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAACgCAMAAACL85puAAAAn1BMVEX////c3Nzr6+vw8PDT09PFxcXp6enV1dWdnpro6Ojt7e2en5v29vb39/fq6uqhop+kpaOdnpvs7OyhoZ7g4ODOzs7Q0NDX19eam5ecnZq9vb3CwsK6urrGxsbv7+/Hx8fy8vKPkIyTlJC2tLGSk5DLy8ubnJiWl5TR0dGdnpwbfqafoJzZ2dna2trIyMj19fXd3d3e3t74+Pj5+fn6+voyWnv7AAAAAXRSTlMAQObYZgAAAR9JREFUeF7tmkduxTAMREnJvf/ea3qv9z9bYuQE0XyAXswDuJ3FA2XPgkJEHkFEQSRSjZDBAxQED7hCHTzgARhyqz3++7MOQ1a9A18d/T4MyVSj8ZsvnGv+cM2/kImqr7xL8kCk1enXsUjyUKTUae1dDgVU+wYIaM0DyssE0AEd0EGGO+Aqj9CAMxpwQgOuzQNOeAAdnM1XuVUFn7N5QKtKB8MLSFAHiYlELpJ9wajZE9mVl9YtjSWLDnrkzqCl8XswZAd0QAd0QAd0MLrIz5UdiQ7M6/6S/YD9YEAO6IAO6GDy8oGdUGTP79gRx2qxcNAZyVOapgVyyFJGv4yBU5puPj8c7l34MU83m+12wMgNiLyCSBzH6zUwst1stsj8AK74lmQgdGoWAAAAAElFTkSuQmCC";
								break;
							case ClientLib.Base.EFactionType.NODFaction:
								var iconFlipHorizontal = "data:image/png;base64,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%3D";
								var iconFlipVertical = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAFMElEQVR4XsWXXWwUZRfHz5nZ7213u91u2W26RRFfaoCgiSDbxpiYKIitcueFGKM3mhhD64WJ0Qgx75WxkBATjRdcCBdyIYlEJNF4gdrlI6AUiNBCtFK3Le2W3S3dnZl9nnnOe7ZbQJp2obDre+bZZDMXk9+cc+Z//gdhgaCxIwhKIAAf0glbtxDUKBYEyJ3bu8Kpw5MAKIkco75w01nQtQxGNql/BWDohx37w/FHXyJZtOT0lXOBYONB1N2nPeHIGRDyOrY8L2oKMHZi9/7ohp6XwRwnMztSsHIjRciPJEH3nK4LhH/U6+vPkyFmtLbuYk0ARo/t2hfbuH0bTJ0A8D8AyhbSlkoYqeQ1XWROWkq71Ngc/wZc+pA0VM65vEtUFSCV7PuyJdH7CqT7gVAj1H0IDh8oLSBI81Bh6MAwgj0oleNiQzR+EED9WRSuSXfbs6o6GejnDHT0bIN0EkBzABABXwzimQUm/ypJpFThwt5LipxjpLlOBiPRb0HZw9j64tj990By975oYvstgHLMgQAh6giIQKHHSRXGDfPy18NFW8t6vHXfef11R5n6D2zbOno/JfisJdHzJqSP3Q4AMA9GETqDCIHVIKfO5qzxX9OmVcgFg+H9iPCb7vQOYhtnZMklSO76PJbY/sY8gMVBVJHQ/yCCLw7F0aNpkU9bRjZ1NRSK7BO2/N0TCA+A1zWJoWfUXfZA3x7ugbfnAVQOshlEEAbXIDjrwEr1TwnLIuva4GV/XcMhBXjG1xw/BcLIYqxL3KEEn+xs2di7A6bKAEsKJculCaxGJgIrOzxdnEmTnb04AJr7uM/fcMTV1HgKw5tnFgfo7/u0paPnLZj8GQArAVTOCKAG4F/OfyVJYQtzckAamSu/1DdGdnqDDcdxWTct1gPvxxK9/wW7UCZChHsOUgCaCwCdAKBg6vxXps8pX/OGIgdw2ZaFAQa///DdSHztKiVFOyJeI6ViCFB+AmDpENwKJJq9hYu1Oc4FoE65iWGtMRx5rz4SO4zRzQsDHNrV1e30eLodqBEBSNRKnKjKPyBAPogAxIeonCKkOQbCf/bXPFSwTNO9sn3dx+2bPrq0aA8c3rN1ldvrAx21Ej6V4G++eYkZae4eAdGNGtHshbcSgTRHgEQ3y2gaBj78yLqRh57+YLa+i5VgZaR1jV/Zog5QK4Kt3ICkISAt1BM0R1F+XYTb3lwr39G0ErgO2YlhDIcjFwJrX5+oIER9a2OJd1ZwE6oaNKHkJhzwtb86WukzXN/S0RuFyZ+oap+htMmcGFBG5q9MoHHZkPc/2zKVhGgdj+M2VkKqghAJFiJgIZpmIcqwEE2wEOVYiOxKUrw+VspAOkn3KMVopZKWsExgKc6zFF9VgDmW4hwIQ7AU052G0ROxRE+EAZY6jLCYOmqJQlrxMLJCjZGUkHKah1HJR1pLGccbuATNDLCEcXxOWOOnizyOJY/jFCJkeRzneRxb92JIOtmQhO7SkCg2JAU2JJINyYS3rj4NhAYbEvN+LFknj+NQBUumiBSwJcsrcpqku7LBpugEKFXA1hesapjSTi5BaAFTqkjzAJvSAoKdl8ox0xBtHQegPDdWsZq2vDO2kTMwdfyGLVe2VMS2vKiLbM5SOMO2/Cq49LxtKOFY3kXVXkw6eDEJgzmmzOzfNi8miheTLOieLC8maV5MrpMhbF5MVK1Ws6ea4o/5lbQUr2bXA8HwGOquHK9m0yCk5E+KarqaZc580ex2O1ygkAgcJi+n0xh9TtRmO/4/x/8AHKjlP9O9djoAAAAASUVORK5CYII%3D";
								var iconRefresh = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAFmklEQVR4Xu2VfWxT5QLGn3P6tbasU9nGAO+GczjQOUaAuyioSPxjSC6BmAiEixjMEEz4UiJxfs2PoJL9gyFeVDJGgID4gd443R8oRByyTRBwiDg23YAxVrvSru1pT895j4+n/WMyGHHtnz7Lr+3es/M+z/u8Z28lpFFG/WwLADvJIE5iJX4SJZo050sDV8maJmMJgI14SA7JIyOTQVrIZRIkgwLIaTK3Jw2L4c6ZjcI5NSip3IW7V9Qhb1oFgBHEMuku550MKyeR0tWAhWSRIuSULUVe+VJI8oB5DYaDPLO6cZHDKlU+UtO09eP15fUAogwRk5G67GQUssbNwuh7njDNI5e7zx7dd+rDujfa4W09/MzOH++026SVhaNcrvKyopc3159bBCCXZKQjQA4Zj9ypy0DF/R0Xt71XE3n3o4PyZ43nglW7j7nOXAhVj89zu9cu+U/Bs0+/MH7KtH+/uvtw53/BEOkIUEDugjMnH9QXn9ZJgYgGJS5aPW5rdWtXsKR4jPvMsrnTlfKZ80eCmvHQgmyGeBTA7RJSlPHLtgPgRHDmjoMWE+c7TigjMrOiN3tuakD7/qpER5MWYvS9b+Fq9bX+L/UAJze+g1tKVuJqXTqyAd6TewEw3vyN/uCVilB/IONfhWVOWB0ylN7fALSnvgUXDn/0c/MnJzFAx77a2byuZufEuZu+m/dU7YmylVUvW2q3v+s/3lgfMM0ptH1cS16Vkbraj7U07/v2wAe/g2o6tN9X+/9G59nu8MSSfE9rMKxVO21ySZbLiofnPW6AguLtAnCadFpxHb22pmhJNBx5SRgC15IsyXCOcK8F8PXi+wp2ba5v9h851bbuh9Md/b5QXL07P/OVjYunRD5s6fGUTrg9XFz6gAuuUWNAoff7WrAD4pVwHb2y6ra3dU1fNTa/AJJkAYxEeP4CITSc7+iAw5lR9WJF8ZsAHCSDh8ycC33RFU679f1D1dMPIW/qAuRO24SkYPDGnqYd8J7YAeAs6RtqC2KGMLBk+WZUrt6DyrW7Eqzei4WPvQ5dCDCMmvyCiZEgT7g9Mc14kuZ7AAhAUhlch9BiCHUdR8cnG2i+HcA5EiC6FTeQoUUBKICIJxuw01zFQCVDEFM/EZmE0NPSQHwAosRHeoiXBEmc4Y0hAxis3YjTXAsDEEhIMFSE14bOTcKkm3xDNKIkg6g01pGUdchJJEDoMUAoMHSdIxyS4wylYiglG4kn6ccQsg6xeskQoFkYRtSe2HPKIlkg2AqvIwUNDvBc5dimULB/MpLq7fFZ7phQiIYDdZBlG1wZbsyaMQ9Wp5ttRM0AJH0BNFXNKRxfZCuZNNNs3+50wOn0QBcy/L52+Ho7occC0CXNfAZ0XYckSf60BWCjuixbcf+DqwBJgAINOO7Eubb98F5qg87qhcSVqwqyc7MR8AfWPL/81grB7ZIhyTaHral6y6+bhhnAgBACQrtovtM8EcJwQIsFYQiZxmEwJ7R4BDl5eXC5biqNRCKlgEAkFELwSv9UAMMNANaqIR72AQOOX5stgwEU8yHU1RDt4wwSMc+X+QvXI3vkZAAatm5ZDKUrrIIafgOaBhHpveogcrD6UKIdGgvEE1thANFQLwxPJz/rHOO9HEwhAEwTXfEBA+YRNgdElAEYUGMADTY2EmUjBsf7oPd3m+0IoZlzpNSAxga0SB+MASuRbHYah01DXaUxNPNwoif0iB96iAENwXsIE6S2BToniV4ZOBHDWCHiUZoaiHPlNlgZVDXbiocZwCVB530Mn3oA/kBRgubn5L8h65aJAk3oUGlCGAJmS1Y9DEmRIJmHUuoN2KOqhtqGo7haggZCAmrPdyeCyeYrPvd5YbPKHABUVQe3yT7sAO5M98FQIDD9Wi3SHBYMVsj4699ketyNQAB/R//oD9nHCW2twSEjAAAAAElFTkSuQmCC";
								var leftBG = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAACgCAMAAAC7f4tPAAABj1BMVEX///+hop/p6el0dXOXmJSTlJBqa2jY2NihoZ6XmJV2d3XX19egoZ6dnprOzs3X19aIiYeKiojQ0NDr6+vq6uqen51sbWqnp6WRko+cnZl0dHKMjIuur6yLjIro6Oh2dnTIyMh1dnRtbmupqajCwsLu7u6enpuWl5OGh4OgoZ2EhYJ0dXKHiIWHiIR6eniSk49ub2yam5hpameJioiNjoqlpqOkpaK9vr25uritrq18fXtvb22Ki4d1dnOOjou4uLZzc3Fra2mrq6irrKnPz8/t7e2lpaOQkY6mp6W7vLvOzs6CgoFubm1vb26bm5mYmJaZmpfFxcWVlpO6urrc3NzZ2dnT09PV1dXa2trg4ODz8/PW1tbJycnLy8u0tLTi4uLSvbq5ubnDw8OwsLC3t7fb29vw8PDR0dHv7+/f39+uRDqvRTzj4+Px8fGcnZrh4eGsrKv09PSioqHTwL2mGxvW19by8vJyc3Czs7Ojo6KfoJxubmyEhYPOuri4uLjS0tK9vb2en5tub254eXdub21rpm98AAAAAXRSTlMAQObYZgAAAr9JREFUeF7s0MUOwzAURNF+5DxTEIrMzPDhjRtZztqx1E2vNNuzmNZv+rf2Wl0epWgSEelxA9TkYQryEGcQLBBENfkC8kSjpO9L+8YKjatoQJQdXj5loKK1jffZvKHlvGhf3cuyEObrgOE0NT9rOQ47cuCalDP08KWFYAzPh30j30fjrtq6ptRiktwAcH3HZr47WjmOkv6nffPsbRoKozBva+oRO6NJS5OSpIWWTubee+/xxqgOqCBGQaobpUKOxIdW/udwrUgOX/jA7UGxeM8PeBQ90rWOc65DnURBuHZHoZnN+rGjS+oMJifl49tNRdZid8u7v9A+m6UTqycthWaVT5+/hLoJyi2Fbp9unpnyUvTOWqCPrig0zzZtci1K0d8ibXQ0kqBrLpFFCLQ/FpOxP/5H6FA/CZpHSSU7aKCQ/8a1uBbX4vpUTMZxjOubHhlTHkRI7iDMNZsHKMYIYR4/YqDQfv7CBEaIShGH7qGE+Ej0KEzIH9HiWlznD6PQ48tXQQfdnHZszOMpV3Js0PN6csVG9ZBDLhlG1soC92KiGFbMYK4J63r40NKvxbW4FtcOznXhNsw1m2dRrtXb3TkCoblwfgJXghfh1R3fr/FovBBxLa4LF1GuzelLRYwQs3T5ShWCLpSca6Ae4jg2oCykGxgELT1EOp+4FtfiWlxPgtD4DYwoixvY9eqwbGDSr+VdRlxncQO7sZi5Dazu2ERZ28DGvCHqIdL5xLW4Rt4Jzg4aKST7rhF33Wv0+4X0D3uAjhoJetYicq0BdKerbWS+kwhp37IWBi//z3AYaLLvruf6G9i9hftbKZo3NsNuoPENRzS/3m5xfwN7QD/cFM27nXK5MvK3qTQ66jf30fywujSA5kd+SyemIidCeMPnx3GC3tP0+/WTLQCaVd49fYZCzzx/gRLycvsVCj039/onvUF9K+HA7eQAAAAASUVORK5CYII%3D";
								var rightBG = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAACgCAMAAACL85puAAAAolBMVEX////o6Ojg4ODLy8vIyMien5uhop/FxcXCwsLOzs66urrGxsa9vb2Sk5CPkIyTlJCdnpvV1dXHx8eWl5T5+fmkpaPQ0NCam5fX19fR0dHa2trZ2dnd3d3e3t6foJzc3Nzr6+vw8PDT09P29vbq6ur19fWmGxvp6ent7e339/ehoZ7y8vKdnpqlGxu2tLHv7++bnJj4+PicnZrs7Oydnpz6+voBl3AiAAAAAXRSTlMAQObYZgAAAS9JREFUeNrtmttuwjAQRDe0JNxDuPcCayehSSCUFtr//7US8QX1IBmhGcmvR+zBseZhhRE5fGARBSOpaoocHKBgcMAnOsIPDsAiX9rE/n5XbpFT81NstrdHt0h9AZy3tjQmv8bk/4rsVG1mTRE4RkJtzfZlETgD2tqqrAkgQHbMAUDoHXAdgQ7ogA7gEWr+jfgIYxQQo4ARChh6B4zoAB8h9n6VQ1X0c8YB8Ah0cH+AAnVQ8CJ5uUj+C0bFnsiuvEQBMQsGS9YtAFO4pfE94JtIB3RAB3TwWA7GKGDKjsSe2AC81/0l3wO+iXRAB3RwRw52r2tshaJ+e8eWOE6rlYHWSDZJkpTIIks7veQMrNLMF4vJ5MW4L/PMu91+HzjyBEaewUgURYMBcKTX6fSQ8wfrkQWdCN/EzwAAAABJRU5ErkJggg%3D%3D";
								break;
							}

							if (this.toolBar) {
								this.toolBarParent.remove(this.toolBar);
							}

							if (this.repairInfo) {
								playArea.remove(this.repairInfo);
							}

							// Repair Time Infobox
							this.repairInfo = new qx.ui.container.Composite();
							var layout = new qx.ui.layout.Grid();
							layout.setColumnAlign(0, "right", "middle");
							//layout.setColumnFlex(0, 1);
							//layout.setColumnWidth(1, 70);
							this.repairInfo.setLayout(layout);
							this.repairInfo.setThemedFont("bold");
							this.repairInfo.set({
								visibility: false
							});
							//this.repairInfo.setThemedBackgroundColor("#eef");
							// Available Repair Label
							this.repairInfo.add(new qx.ui.basic.Image("webfrontend/ui/icons/icn_repair_off_points.png"), {
								row: 0,
								column: 1
							});
							this.labels.repairinfos.available = new qx.ui.basic.Label("100").set({
								textColor: "white"
							});
							this.repairInfo.add(this.labels.repairinfos.available, {
								row: 0,
								column: 0
							});
							// Max Infantry Repaircharge Label
							this.repairInfo.add(new qx.ui.basic.Image("webfrontend/ui/icons/icon_res_repair_inf.png"), {
								row: 1,
								column: 1
							});
							this.labels.repairinfos.infantry = new qx.ui.basic.Label("100").set({
								textColor: "white"
							});
							this.repairInfo.add(this.labels.repairinfos.infantry, {
								row: 1,
								column: 0
							});
							// Max Vehicle Repaircharge Label
							this.repairInfo.add(new qx.ui.basic.Image("webfrontend/ui/icons/icon_res_repair_tnk.png"), {
								row: 2,
								column: 1
							});
							this.labels.repairinfos.vehicle = new qx.ui.basic.Label("100").set({
								textColor: "white"
							});
							this.repairInfo.add(this.labels.repairinfos.vehicle, {
								row: 2,
								column: 0
							});
							// Max Air Repaircharge Label
							this.repairInfo.add(new qx.ui.basic.Image("webfrontend/ui/icons/icon_res_repair_air.png"), {
								row: 3,
								column: 1
							});
							this.labels.repairinfos.aircraft = new qx.ui.basic.Label("100").set({
								textColor: "white"
							});
							this.repairInfo.add(this.labels.repairinfos.aircraft, {
								row: 3,
								column: 0
							});

							playArea.add(this.repairInfo, {
								bottom: 130,
								right: 3
							});

							// Toolbar
							this.toolBar = new qx.ui.container.Composite();
							this.toolBar.setLayout(new qx.ui.layout.Canvas());
							this.toolBar.setHeight(53);
							this.toolBar.setWidth(this.TOOL_BAR_WIDTH);
							this.toolBar.set({
								decorator: new qx.ui.decoration.Decorator().set({
									backgroundImage: "FactionUI/menues/victory_screen/bgr_victscr_header.png"
								}),
								visibility: false
							});

							if (PerforceChangelist >= 441272) { // 15.4 patch
								this.toolBarParent = this._armyBar.getLayoutParent().getLayoutParent().getLayoutParent();
							} else { //old
								this.toolBarParent = this._armyBar.getLayoutParent().getLayoutParent();
							}

							this.toolBarParent.add(this.toolBar, {
								bottom: this.TOOL_BAR_HIGH,
								left: (playAreaWidth - this.TOOL_BAR_WIDTH) / 2,
								visibility: false
							});

							// Toolbar Mouse Region
							this.toolBarMouse = new qx.ui.container.Composite();
							this.toolBarMouse.setLayout(new qx.ui.layout.Canvas());
							this.toolBarMouse.setHeight(25);
							this.toolBarMouse.setWidth(740);
							this.toolBarParent.add(this.toolBarMouse, {
								bottom: 155,
								left: (playAreaWidth - this.TOOL_BAR_WIDTH) / 2
							});
							this.toolBarMouse.hide();
							this.toolBarMouse.setBackgroundColor("#FF0000");
							this.toolBarMouse.setOpacity(0);
							this.toolBarMouse.setZIndex(10);

							this.initToolBarListeners();
							/*
							// does the game init in combat mode?
							if (this._VisMain.get_Mode() === ClientLib.Vis.Mode.CombatSetup) {
							this.toolBar.show();
							this.toolBarMouse.show();
							//this.toolBar.setOpacity(0);
							this.toolBar.setLayoutProperties({
							bottom : this.TOOL_BAR_LOW
							});
							}
							 */

							// (De)activate All Button
							this.buttons.attack.activateAll = new qx.ui.form.ToggleButton("", "FactionUI/icons/icon_disable_unit_active.png");
							this.buttons.attack.activateAll.set({
								width: 44,
								height: 40,
								padding: 0,
								show: "icon",
								appearance: "button-text-small",
								toolTipText: "<strong>" + lang("Deactivate All") + "</strong>"
							});
							this.buttons.attack.activateAll.addListener("changeValue", function () {
								var btnActivateAll = this.buttons.attack.activateAll;
								if (!btnActivateAll.getValue()) {
									btnActivateAll.setOpacity(1);
									btnActivateAll.setToolTipText("<strong>" + lang("Deactivate All") + "</strong>");
								} else {
									btnActivateAll.setOpacity(0.75);
									btnActivateAll.setToolTipText("<strong>" + lang("Activate All") + "</strong>");
								}
							}, this);
							this.buttons.attack.activateAll.addListener("execute", function () {
								var btnActivateAll = this.buttons.attack.activateAll;
								if (this.buttons.attack.activateInfantry.getValue() !== btnActivateAll.getValue()) {
									this.buttons.attack.activateInfantry.setValue(btnActivateAll.getValue());
								}
								if (this.buttons.attack.activateVehicles.getValue() !== btnActivateAll.getValue()) {
									this.buttons.attack.activateVehicles.setValue(btnActivateAll.getValue());
								}
								if (this.buttons.attack.activateAir.getValue() !== btnActivateAll.getValue()) {
									this.buttons.attack.activateAir.setValue(btnActivateAll.getValue());
								}
							}, this);

							// (De)activate Infantry Button
							this.buttons.attack.activateInfantry = new qx.ui.form.ToggleButton("", "FactionUI/icons/icon_alliance_bonus_inf.png");
							this.buttons.attack.activateInfantry.set({
								width: 44,
								height: 40,
								appearance: "button-text-small",
								toolTipText: "<strong>" + lang("Deactivate Infantry") + "</strong>"
							});
							this.buttons.attack.activateInfantry.addListener("changeValue", function () {
								var btnActivateInfantry = this.buttons.attack.activateInfantry;
								if (btnActivateInfantry.getValue() === this.buttons.attack.activateVehicles.getValue() && btnActivateInfantry.getValue() === this.buttons.attack.activateAir.getValue()) {
									this.buttons.attack.activateAll.setValue(btnActivateInfantry.getValue());
								}
								this.activateUnits('infantry', !btnActivateInfantry.getValue());
								if (!btnActivateInfantry.getValue()) {
									btnActivateInfantry.setOpacity(1);
									btnActivateInfantry.setToolTipText("<strong>" + lang("Deactivate Infantry") + "</strong>");
								} else {
									btnActivateInfantry.setOpacity(0.75);
									btnActivateInfantry.setToolTipText("<strong>" + lang("Activate Infantry") + "</strong>");
								}
							}, this);

							// (De)activate Vehicles Button
							this.buttons.attack.activateVehicles = new qx.ui.form.ToggleButton("", "FactionUI/icons/icon_alliance_bonus_tnk.png");
							this.buttons.attack.activateVehicles.set({
								width: 44,
								height: 40,
								appearance: "button-text-small",
								toolTipText: "<strong>" + lang("Deactivate Vehicles") + "</strong>"
							});
							this.buttons.attack.activateVehicles.addListener("changeValue", function () {
								var btnActivateVehicles = this.buttons.attack.activateVehicles;
								if (btnActivateVehicles.getValue() === this.buttons.attack.activateInfantry.getValue() && btnActivateVehicles.getValue() === this.buttons.attack.activateAir.getValue()) {
									this.buttons.attack.activateAll.setValue(btnActivateVehicles.getValue());
								}
								this.activateUnits('vehicles', !btnActivateVehicles.getValue());
								if (!btnActivateVehicles.getValue()) {
									btnActivateVehicles.setOpacity(1);
									btnActivateVehicles.setToolTipText("<strong>" + lang("Deactivate Vehicles") + "</strong>");
								} else {
									btnActivateVehicles.setOpacity(0.75);
									btnActivateVehicles.setToolTipText("<strong>" + lang("Activate Vehicles") + "</strong>");
								}
							}, this);

							// (De)activate Air Button
							this.buttons.attack.activateAir = new qx.ui.form.ToggleButton("", "FactionUI/icons/icon_alliance_bonus_air.png");
							this.buttons.attack.activateAir.set({
								width: 44,
								height: 40,
								appearance: "button-text-small",
								toolTipText: "<strong>" + lang("Deactivate Air") + "</strong>"
							});
							this.buttons.attack.activateAir.addListener("changeValue", function () {
								var btnActivateAir = this.buttons.attack.activateAir;
								if (btnActivateAir.getValue() === this.buttons.attack.activateInfantry.getValue() && btnActivateAir.getValue() === this.buttons.attack.activateVehicles.getValue()) {
									this.buttons.attack.activateAll.setValue(btnActivateAir.getValue());
								}
								this.activateUnits('air', !btnActivateAir.getValue());
								if (!btnActivateAir.getValue()) {
									btnActivateAir.setOpacity(1);
									btnActivateAir.setToolTipText("<strong>" + lang("Deactivate Air") + "</strong>");
								} else {
									btnActivateAir.setOpacity(0.75);
									btnActivateAir.setToolTipText("<strong>" + lang("Activate Air") + "</strong>");
								}
							}, this);

							// Reset Formation Button
							this.buttons.attack.formationReset = new qx.ui.form.Button("", resetIcon);
							this.buttons.attack.formationReset.set({
								width: 44,
								height: 40,
								appearance: "button-text-small",
								toolTipText: "<strong>" + lang("Reset Formation") + "</strong>"
							});
							this.buttons.attack.formationReset.addListener("click", this.resetFormation, this);

							// Flip Horizontal Button
							this.buttons.attack.flipHorizontal = new qx.ui.form.Button("", iconFlipHorizontal);
							this.buttons.attack.flipHorizontal.set({
								width: 44,
								height: 40,
								padding: 0,
								show: "icon",
								appearance: "button-text-small",
								toolTipText: "<strong>" + lang("Flip Horizontal") + "</strong>"
							});
							this.buttons.attack.flipHorizontal.addListener("click", function () {
								this.flipFormation('horizontal');
							}, this);

							// Flip Vertical Button
							this.buttons.attack.flipVertical = new qx.ui.form.Button("", iconFlipVertical);
							this.buttons.attack.flipVertical.set({
								width: 44,
								height: 40,
								padding: 0,
								show: "icon",
								appearance: "button-text-small",
								toolTipText: "<strong>" + lang("Flip Vertical") + "</strong>"
							});
							this.buttons.attack.flipVertical.addListener("click", function () {
								this.flipFormation('vertical');
							}, this);

							// Repair Mode Button
							this.buttons.attack.repairMode = new qx.ui.form.ToggleButton("", "FactionUI/icons/icon_mode_repair_active.png");
							this.buttons.attack.repairMode.set({
								width: 44,
								height: 40,
								padding: 0,
								show: "icon",
								appearance: "button-text-small",
								toolTipText: "<strong>" + lang("Activate Repair Mode") + "</strong>"
							});
							this.buttons.attack.repairMode.addListener("execute", this.toggleRepairMode, this);
							this.buttons.attack.repairMode.addListener("changeValue", function () {
								var btnRepairMode = this.buttons.attack.repairMode;
								if (!btnRepairMode.getValue()) {
									btnRepairMode.setToolTipText("<strong>" + lang("Deactivate Repair Mode") + "</strong>");
								} else {
									btnRepairMode.setToolTipText("<strong>" + lang("Activate Repair Mode") + "</strong>");
								}
							}, this);

							// The new refresh button
							this.buttons.attack.toolbarRefreshStats = new qx.ui.form.Button("", iconRefresh);
							this.buttons.attack.toolbarRefreshStats.addListener("click", this.refreshStatistics, this);
							this.buttons.attack.toolbarRefreshStats.set({
								width: 44,
								height: 40,
								padding: 0,
								show: "icon",
								appearance: "button-text-small",
								toolTipText: "<strong>" + lang("Refresh Stats") + "</strong>"
							});

							// The new stats window button
							this.buttons.attack.toolbarShowStats = new qx.ui.form.Button("", statsIcon);
							this.buttons.attack.toolbarShowStats.addListener("click", this.toggleTools, this);
							this.buttons.attack.toolbarShowStats.set({
								width: 44,
								height: 40,
								padding: 0,
								show: "icon",
								appearance: "button-text-small",
								toolTipText: "<strong>" + lang("Open Stats Window") + "</strong>"
							});

							// Undo
							this.buttons.attack.toolbarUndo = new qx.ui.form.Button("", undoIcon);
							this.buttons.attack.toolbarUndo.addListener("click", function () {
								console.log("Undo");
							}, this);
							this.buttons.attack.toolbarUndo.set({
								width: 44,
								height: 40,
								padding: 0,
								show: "icon",
								appearance: "button-text-small",
								enabled: false,
								toolTipText: "<strong>" + lang("Undo") + "</strong>"
							});

							// Redo (if possible)
							this.buttons.attack.toolbarRedo = new qx.ui.form.Button("", redoIcon);
							this.buttons.attack.toolbarRedo.addListener("click", function () {
								console.log("Redo");
							}, this);
							this.buttons.attack.toolbarRedo.set({
								width: 44,
								height: 40,
								padding: 0,
								show: "icon",
								appearance: "button-text-small",
								enabled: false,
								toolTipText: "<strong>" + lang("Redo") + "</strong>"
							});

							// Options Button
							this.buttons.attack.options = new qx.ui.form.Button().set({
								width: 44,
								height: 40,
								appearance: "button-text-small",
								icon: "FactionUI/icons/icon_forum_properties.png",
								toolTipText: "<strong>" + lang("Options") + "</strong>"
							});
							this.buttons.attack.options.addListener("click", this.toggleOptionsWindow, this);

							this.toolBar.add(this.buttons.attack.flipVertical, {
								top: 10,
								left: 10
							});
							this.toolBar.add(this.buttons.attack.flipHorizontal, {
								top: 10,
								left: 60
							});
							this.toolBar.add(this.buttons.attack.activateAll, {
								top: 10,
								left: 130
							});
							this.toolBar.add(this.buttons.attack.activateInfantry, {
								top: 10,
								left: 180
							});
							this.toolBar.add(this.buttons.attack.activateVehicles, {
								top: 10,
								left: 230
							});
							this.toolBar.add(this.buttons.attack.activateAir, {
								top: 10,
								left: 280
							});
							this.toolBar.add(this.buttons.attack.toolbarRefreshStats, {
								top: 10,
								left: 349
							});
							// right bound buttons
							this.toolBar.add(this.buttons.attack.options, {
								top: 10,
								right: 10
							});
							this.toolBar.add(this.buttons.attack.repairMode, {
								top: 10,
								right: 60
							});
							this.toolBar.add(this.buttons.attack.toolbarShowStats, {
								top: 10,
								right: 110
							});
							this.toolBar.add(this.buttons.attack.toolbarRedo, {
								top: 10,
								right: 175
							});
							this.toolBar.add(this.buttons.attack.toolbarUndo, {
								top: 10,
								right: 225
							});
							this.toolBar.add(this.buttons.attack.formationReset, {
								top: 10,
								right: 275
							});

							if (this.userInterface) {
								this._armyBar.remove(this.userInterface);
							}

							if (this.options.rightSide.getValue()) {
								var canvasWidth = 64;
								var interfaceBG = rightBG;
								var buttonsLeftPosition = 5;
								var shiftRRightPos = 0;
								var shiftLRightPos = 30;
								var shiftURightPos = 15;
								var shiftDRightPos = 15;
							} else {
								var canvasWidth = 90;
								var interfaceBG = leftBG;
								var buttonsLeftPosition = 15;
								var shiftRRightPos = 16;
								var shiftLRightPos = 46;
								var shiftURightPos = 30;
								var shiftDRightPos = 30;
							}

							// Interface Canvas
							this.userInterface = new qx.ui.container.Composite();
							this.userInterface.setLayout(new qx.ui.layout.Canvas());
							this.userInterface.setHeight(160);
							this.userInterface.setWidth(canvasWidth);
							this.userInterface.set({
								decorator: new qx.ui.decoration.Decorator().set({
									backgroundImage: interfaceBG
								})
							});
							if (this.options.rightSide.getValue()) {
								this._armyBar.add(this.userInterface, {
									top: 0,
									right: 65
								});
							} else {
								this._armyBar.add(this.userInterface, {
									top: 0,
									left: 0
								});
							}

							// Simulate Button
							this.buttons.attack.simulate = new qx.ui.form.Button();
							this.buttons.attack.simulate.set({
								width: 58,
								height: 37,
								appearance: "button-baseviews",
								icon: "FactionUI/icons/icon_play.png",
								toolTipText: lang("Start Combat Simulation")
							});
							this.buttons.attack.simulate.addListener("click", this.startSimulation, this);

							// Tools Button
							this.buttons.attack.tools = new qx.ui.form.Button(lang("Stats"));
							this.buttons.attack.tools.set({
								width: 58,
								appearance: "button-text-small",
								toolTipText: lang("Open Simulator Tools")
							});
							this.buttons.attack.tools.addListener("click", this.toggleTools, this);

							//Shift Buttons
							this.buttons.shiftFormationLeft = new qx.ui.form.Button("<");
							this.buttons.shiftFormationLeft.set({
								width: 30,
								appearance: "button-text-small",
								toolTipText: lang("Shift units left")
							});
							this.buttons.shiftFormationLeft.addListener("click", function () {
								this.shiftFormation('l');
							}, this);

							this.buttons.shiftFormationRight = new qx.ui.form.Button(">");
							this.buttons.shiftFormationRight.set({
								width: 30,
								appearance: "button-text-small",
								toolTipText: lang("Shift units right")
							});
							this.buttons.shiftFormationRight.addListener("click", function () {
								this.shiftFormation('r');
							}, this);

							this.buttons.shiftFormationUp = new qx.ui.form.Button("^");
							this.buttons.shiftFormationUp.set({
								width: 30,
								appearance: "button-text-small",
								toolTipText: lang("Shift units up")
							});
							this.buttons.shiftFormationUp.addListener("click", function () {
								this.shiftFormation('u');
							}, this);

							this.buttons.shiftFormationDown = new qx.ui.form.Button("v");
							this.buttons.shiftFormationDown.set({
								width: 30,
								appearance: "button-text-small",
								toolTipText: lang("Shift units down")
							});
							this.buttons.shiftFormationDown.addListener("click", function () {
								this.shiftFormation('d');
							}, this);

							var temp = localStorage.ta_sim_showShift;
							if (temp) {
								temp = JSON.parse(localStorage.ta_sim_showShift);
							} else {
								temp = true;
							}
							if (temp) {
								this.userInterface.add(this.buttons.shiftFormationUp, {
									top: 16,
									right: shiftURightPos
								});
								this.userInterface.add(this.buttons.shiftFormationLeft, {
									top: 35,
									right: shiftLRightPos
								});
								this.userInterface.add(this.buttons.shiftFormationRight, {
									top: 35,
									right: shiftRRightPos
								});
								this.userInterface.add(this.buttons.shiftFormationDown, {
									top: 54,
									right: shiftDRightPos
								});
							}

							this.userInterface.add(this.buttons.attack.tools, {
								top: 82,
								left: buttonsLeftPosition
							});
							this.userInterface.add(this.buttons.attack.simulate, {
								top: 108,
								left: buttonsLeftPosition
							});
						} catch (e) {
							console.log(e);
						}
					},
					getAttackUnits: function () {
						try {
							var base_city = this._MainData.get_Cities().get_CurrentOwnCity();
							var target_city = this._MainData.get_Cities().get_CurrentCity();
							if (target_city != null) {
								var target_city_id = target_city.get_Id();
								var units = base_city.get_CityArmyFormationsManager().GetFormationByTargetBaseId(target_city_id);
								this.view.lastUnits = units;
								this.view.lastUnitList = units.get_ArmyUnits().l;
							}
							this.attackUnitsLoaded = true;
						} catch (e) {
							console.log(e);
						}
					},
					optionPopup: function () {
						localStorage.ta_sim_popup = JSON.stringify(this.options.autoDisplayStats.getValue());
					},
					optionShowShift: function () {
						localStorage.ta_sim_showShift = JSON.stringify(this.options.showShift.getValue());
						if (this.options.showShift.getValue()) {
							this.setupInterface();
						} else {
							this.userInterface.remove(this.buttons.shiftFormationUp);
							this.userInterface.remove(this.buttons.shiftFormationLeft);
							this.userInterface.remove(this.buttons.shiftFormationRight);
							this.userInterface.remove(this.buttons.shiftFormationDown);
						}
					},
					optionAttackLock: function () {
						try {
							localStorage.ta_sim_attackLock = JSON.stringify(this.options.attackLock.getValue());
							if (this.options.attackLock.getValue()) {
								this._armyBar.add(this.buttons.attack.unlock, {
									top: 108,
									right: 9
								});
							} else {
								this._armyBar.remove(this.buttons.attack.unlock);
							}
						} catch (e) {
							console.log(e);
						}
					},
					optionRepairLock: function () {
						try {
							localStorage.ta_sim_repairLock = JSON.stringify(this.options.repairLock.getValue());
							if (this.options.repairLock.getValue()) {
								this._armyBar.add(this.buttons.attack.repair, {
									top: 16,
									right: 9
								});
							} else {
								this._armyBar.remove(this.buttons.attack.repair);
							}
						} catch (e) {
							console.log(e);
						}
					},
					toggleTools: function () {
						this.battleResultsBox.isVisible() ? this.battleResultsBox.close() : this.battleResultsBox.open();
					},
					toggleOptionsWindow: function () {
						this.optionsWindow.isVisible() ? this.optionsWindow.close() : this.optionsWindow.open();
					},
					getAllUnitsDeactivated: function () {
						var f = this.getFormation();
						var unitEnabled = false;
						for (var i = 0; i < f.length; i++) {
							if (f[i].e) {
								unitEnabled = true;
								break;
							}
						}
						//console.log(unitEnabled);
						if (unitEnabled) {
							return false;
						} else {
							return true;
						}
					},
					refreshStatistics: function () {

						try {
							var ownCity = this._MainData.get_Cities().get_CurrentOwnCity();
							if (!this.getAllUnitsDeactivated() && ownCity.GetOffenseConditionInPercent() > 0) {
								this.timerStart();
								ClientLib.API.Battleground.GetInstance().SimulateBattle();
								this.buttons.attack.refreshStats.setEnabled(false);
								this.buttons.attack.toolbarRefreshStats.setEnabled(false);
								this.buttons.attack.simulate.setEnabled(false);
								this.labels.countDown.setWidth(110);
								this.count = 10;
								this.statsOnly = true;
							}
						} catch (e) {
							console.log(e);
						}
					},
					countDownToNextSimulation: function () {
						try {
							var _this = window.TACS.getInstance();
							_this.count = _this.count - 1;
							_this.labels.countDown.setWidth(_this.labels.countDown.getWidth() - 11);
							if (_this.count <= 0) {
								clearInterval(_this.counter);
								_this.buttons.attack.refreshStats.setEnabled(true);
								_this.buttons.attack.toolbarRefreshStats.setEnabled(true);

								if (_this.warningIcon) {
									_this._armyBar.remove(_this.simulationWarning);
									_this.warningIcon = false;
								}
							}
						} catch (e) {
							console.log(e);
						}
					},
					formationChangeHandler: function () {
						try {
							var _this = this;
							if (this.labels.countDown.getWidth() != 0) {
								if (!_this.warningIcon) {
									// Simulation Warning
									_this.simulationWarning = new qx.ui.basic.Image("https://eaassets-a.akamaihd.net/cncalliancesgame/cdn/data/d75cf9c68c248256dfb416d8b7a86037.png");
									_this.simulationWarning.set({
										toolTipText: lang("Simulation will be based on most recently refreshed stats!")
									});
									if (this.options.rightSide.getValue()) {
										this._armyBar.add(_this.simulationWarning, {
											top: 122,
											right: 67
										});
									} else {
										this._armyBar.add(_this.simulationWarning, {
											top: 122,
											left: 27
										});
									}
									_this.warningIcon = true;
								}
							}
						} catch (e) {
							console.log(e);
						}
					},
					calculateLoot: function () {
						try {
							// Adapted from the CNC Loot script:
							// http://userscripts.org/scripts/show/135953
							//var city = this._MainData.get_Cities().get_CurrentCity(); // not used
							var mod;
							var spoils = {
								1: 0,
								2: 0,
								3: 0,
								6: 0,
								7: 0
							};

							var loot = ClientLib.API.Battleground.GetInstance().GetLootFromCurrentCity();
							for (var i in loot) {
								spoils[loot[i].Type] += loot[i].Count;
							}

							this.stats.spoils.tiberium.setLabel(this.formatNumberWithCommas(spoils[1]));
							this.stats.spoils.crystal.setLabel(this.formatNumberWithCommas(spoils[2]));
							this.stats.spoils.credit.setLabel(this.formatNumberWithCommas(spoils[3]));
							this.stats.spoils.research.setLabel(this.formatNumberWithCommas(spoils[6]));
						} catch (e) {
							console.log(e);
						}
					},
					getRepairCost: function (unitStartHealth, unitEndHealth, unitMaxHealth, unitLevel, unitMDBID) {
						if (unitStartHealth != unitEndHealth) {
							if (unitEndHealth > 0) {
								var damageRatio = ((unitStartHealth - unitEndHealth) / 16) / unitMaxHealth;
							} else {
								var damageRatio = ((unitStartHealth / 16) / unitMaxHealth);
							}

							// var repairCosts = ClientLib.API.Util.GetUnitRepairCosts(unitLevel, unitMDBID, damageRatio);
							var repairCosts = ClientLib.API.Util.GetUnitRepairCostsForCity(ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity(), unitLevel, unitMDBID, damageRatio);
							// var crystal = 0;  // crystal didn't use, only RT
							var repairTime = 0;
							for (var j = 0; j < repairCosts.length; j++) {
								var c = repairCosts[j];
								var type = parseInt(c.Type);
								switch (type) {
									/*case ClientLib.Base.EResourceType.Crystal: // crystal ddidn't use, only RT
									crystal += c.Count;
									break;*/
								case ClientLib.Base.EResourceType.RepairChargeBase:
								case ClientLib.Base.EResourceType.RepairChargeInf:
								case ClientLib.Base.EResourceType.RepairChargeVeh:
								case ClientLib.Base.EResourceType.RepairChargeAir:
									repairTime += c.Count;
									break;
								}
							}
							return repairTime;
						}
						return 0;
					},
					setLabelColor: function (obj, val, dir) {
						var colors = ['green', 'blue', 'black', 'red'];
						var color = colors[0];
						var v = val;
						if (dir >= 0)
							v = 100.0 - v;
						if (v > 99.99)
							color = colors[3];
						else if (v > 50)
							color = colors[2];
						else if (v > 0)
							color = colors[1];
						obj.setTextColor(color);
					},
					updateLabel100: function (obj, val, dir) {
						this.setLabelColor(obj, val, dir);
						val = Math.ceil(val * 100) / 100;
						obj.setValue(val.toFixed(2).toString());
					},
					updateLabel100time: function (obj, val, dir, time) {
						var s = val.toFixed(2).toString() + " @ " + webfrontend.phe.cnc.Util.getTimespanString(time);
						this.setLabelColor(obj, val, dir);
						obj.setValue(s);
					},
					updateStatsWindow: function () {
						var _this = this;
						var colors = ['black', 'blue', 'green', 'red'];
						var s = "";
						var n = 0;
						if (this.stats.damage.structures.construction === 0) {
							s = lang("Total Victory");
							n = 0;
						} else if (this.stats.damage.structures.overall < 100) {
							s = lang("Victory");
							n = 1;
						} else {
							s = lang("Total Defeat");
							n = 3;
						}
						this.labels.damage.outcome.setValue(s);
						this.labels.damage.outcome.setTextColor(colors[n]);
						this.updateLabel100(this.labels.damage.overall, this.stats.damage.overall,  - 1);
						this.updateLabel100(this.labels.damage.units.overall, this.stats.damage.units.overall,  - 1);
						this.updateLabel100(this.labels.damage.structures.overall, this.stats.damage.structures.overall,  - 1);
						this.updateLabel100(this.labels.damage.structures.construction, this.stats.damage.structures.construction,  - 1);
						this.updateLabel100(this.labels.damage.structures.defense, this.stats.damage.structures.defense,  - 1);
						// Command Center
						if (this.view.playerCity)
							this.updateLabel100(this.labels.damage.structures.command, this.stats.damage.structures.command,  - 1);
						else {
							this.labels.damage.structures.command.setValue("--");
							this.labels.damage.structures.command.setTextColor("green");
						}
						// SUPPORT
						var SLabel = (this.stats.supportLevel > 0) ? this.stats.supportLevel.toString() : '--';
						this.labels.supportLevel.setValue(lang('Support lvl ') + SLabel + ': ');
						this.updateLabel100(this.labels.damage.structures.support, this.stats.damage.structures.support,  - 1);
						// AVAILABLE RT
						this.labels.repair.available.setValue(webfrontend.phe.cnc.Util.getTimespanString(this.stats.repair.available));
						// AVAILABLE ATTACKS

						this.labels.attacks.available.setValue('CP:' + this.stats.attacks.availableAttacksCP + ' / F:' + this.stats.attacks.availableAttacksAtFullStrength + '/ C:' + this.stats.attacks.availableAttacksWithCurrentRepairCharges);
						// OVERALL
						this.updateLabel100time(this.labels.health.overall, this.stats.health.overall, 1, this.stats.repair.overall);
						// INF
						this.updateLabel100time(this.labels.health.infantry, this.stats.health.infantry, 1, this.stats.repair.infantry);
						// VEH
						this.updateLabel100time(this.labels.health.vehicle, this.stats.health.vehicle, 1, this.stats.repair.vehicle);
						// AIR
						this.updateLabel100time(this.labels.health.aircraft, this.stats.health.aircraft, 1, this.stats.repair.aircraft);
						// BATTLE TIME
						setTimeout(function () {
							_this.stats.time = _this._VisMain.get_Battleground().get_BattleDuration() / 1000;
							_this.setLabelColor(_this.labels.time, _this.stats.time / 120.0,  - 1); // max is 120s
							_this.labels.time.setValue(_this.stats.time.toFixed(2).toString());
						}, 1);
						//this.saveUndoState();
					},
					formatNumberWithCommas: function (x) {
						return Math.floor(x).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
					},
					/* Not used:
					formatSecondsAsTime: function (secs, format) {
					var hr = Math.floor(secs / 3600);
					var min = Math.floor((secs - (hr * 3600)) / 60);
					var sec = Math.floor(secs - (hr * 3600) - (min * 60));

					if (hr < 10) hr = "0" + hr;
					if (min < 10) min = "0" + min;
					if (sec < 10) sec = "0" + sec;

					if (format !== null) {
					var formatted_time = format.replace('hh', hr);
					formatted_time = formatted_time.replace('h', hr * 1 + "");
					formatted_time = formatted_time.replace('mm', min);
					formatted_time = formatted_time.replace('m', min * 1 + "");
					formatted_time = formatted_time.replace('ss', sec);
					formatted_time = formatted_time.replace('s', sec * 1 + "");
					return formatted_time;
					} else {
					return hr + ':' + min + ':' + sec;
					}
					},
					 */
					unlockAttacks: function () {
						this._armyBar.remove(this.buttons.attack.unlock);
						var _this = this;
						setTimeout(function () {
							_this._armyBar.add(_this.buttons.attack.unlock);
						}, 2000);
					},
					unlockRepairs: function () {
						this._armyBar.remove(this.buttons.attack.repair);
						var _this = this;
						setTimeout(function () {
							_this._armyBar.add(_this.buttons.attack.repair);
						}, 5000);
					},
					/*calculateDefenseBonus : function (context, data) {
					try {
					var score = data.rpois[6].s;
					var rank = data.rpois[6].r;
					this.view.playerCityDefenseBonus = Math.round(ClientLib.Base.PointOfInterestTypes.GetTotalBonusByType(ClientLib.Base.EPOIType.DefenseBonus, rank, score));
					} catch (e) {
					console.log(e);
					}
					},*/
					hideAll: function () {
						if (this.buttons.attack.repairMode.getValue())
							this.buttons.attack.repairMode.execute();
						if (this.battleResultsBox.isVisible())
							this.battleResultsBox.close();
						if (this.resourceLayoutWindow.isVisible())
							this.resourceLayoutWindow.close();
						if (this.optionsWindow.isVisible())
							this.optionsWindow.close();
						/*if (this.toolBar.isVisible())
						this.toolBar.hide();
						if (this.toolBarMouse.isVisible())
						this.toolBarMouse.hide();*/
					},
					gameOverlaysToFront: function () {
						webfrontend.gui.reports.ReportsOverlay.getInstance().setZIndex(20);
						webfrontend.gui.mail.MailOverlay.getInstance().setZIndex(20);
						//webfrontend.gui.mail.MailMessageOverlay.getInstance().setZIndex(20);
						webfrontend.gui.alliance.AllianceOverlay.getInstance().setZIndex(20);
						webfrontend.gui.forum.ForumOverlay.getInstance().setZIndex(20);
						webfrontend.gui.research.ResearchOverlay.getInstance().setZIndex(20);
						webfrontend.gui.monetization.ShopOverlay.getInstance().setZIndex(20);
						webfrontend.gui.ranking.RankingOverlay.getInstance().setZIndex(20);
					},
					ownCityChangeHandler: function (oldId, newId) {
						console.log("CurrentOwnChange event");
						if (this._armyBarContainer.isVisible()) {
							this.buttons.attack.refreshStats.setEnabled(false);
							this.buttons.attack.toolbarRefreshStats.setEnabled(false);
							this.buttons.attack.simulate.setEnabled(false);
							this.onCityLoadComplete();
							this.resetDisableButtons();
						}
					},
					//onViewChange
					viewChangeHandler: function (oldMode, newMode) {
						//console.log("ViewModeChange event");
						this.curViewMode = newMode;
						this.buttons.attack.simulate.setEnabled(false);
						this.buttons.attack.refreshStats.setEnabled(false);
						this.buttons.attack.toolbarRefreshStats.setEnabled(false);
						try {

							this.hideAll();
							//this.getAvailableRepairAndCP();

							switch (newMode) {
								/*
								case ClientLib.Vis.Mode.None:
								break;
								case ClientLib.Vis.Mode.City: //own base
								break;
								case ClientLib.Vis.Mode.Region: //the map
								break;
								 */
							case ClientLib.Vis.Mode.Battleground: // 3: while attacking or simming
								this.curPAVM = qx.core.Init.getApplication().getPlayArea().getViewMode();
								this.onCityLoadComplete();
								break;
								/*
								case ClientLib.Vis.Mode.ArmySetup: //in own base / add upgrade units
								break;
								case ClientLib.Vis.Mode.DefenseSetup:
								break;
								case ClientLib.Vis.Mode.World: //world button
								break;
								 */
							case ClientLib.Vis.Mode.CombatSetup: // 7: formation setup
								this.curPAVM = qx.core.Init.getApplication().getPlayArea().getViewMode();
								this.onCityLoadComplete();
								break;
							}
							//console.log("\nViewMode: " + ClientLib.Vis.VisMain.GetInstance().get_Mode() + "\n");
							//console.log("curPAVM: " + this.curPAVM);
						} catch (e) {
							console.log(e);
						}
					},
					resetDisableButtons: function () {
						try {
							if (this.buttons.attack.activateInfantry.getValue(true))
								this.buttons.attack.activateInfantry.setValue(false);
							if (this.buttons.attack.activateVehicles.getValue(true))
								this.buttons.attack.activateVehicles.setValue(false);
							if (this.buttons.attack.activateAir.getValue(true))
								this.buttons.attack.activateAir.setValue(false);
						} catch (e) {
							console.log(e);
						}
					},
					onCityLoadComplete: function () {
						try {
							var _this = this;
							//console.log("Running onCityLoadComplete...");
							if (this._VisMain.GetActiveView().get_VisAreaComplete()) {
								/*setTimeout(function () {
								var cbtSetup = ClientLib.Vis.VisMain.GetInstance().get_CombatSetup(); // No longer needed. They've fixed the issue in-game. Leaving here just in case.
								cbtSetup.SetPosition(0, cbtSetup.get_MinYPosition() + cbtSetup.get_DefenseOffsetY() * cbtSetup.get_GridHeight());
								//qx.core.Init.getApplication().getUIItem(ClientLib.Data.Missions.PATH.OVL_PLAYAREA).getLayoutParent().setZIndex(1);
								}, 500);*/

								this.checkAttackRange();
								if (this.curPAVM > 3) {
									this.showCombatTools();

									var currentcity = this._MainData.get_Cities().get_CurrentCity();
									if (currentcity != null) {
										var ownCity = this._MainData.get_Cities().get_CurrentOwnCity();
										var cityFaction = currentcity.get_CityFaction();
										this.stats.attacks.attackCost = ownCity.CalculateAttackCommandPointCostToCoord(currentcity.get_PosX(), currentcity.get_PosY());
										this.getAvailableRepairAndCP();
										this.calculateLoot();
										this.updateLayoutsList();
										this.getAttackUnits();
										//if opened new city then reset disable buttons and calculate defense bonus
										if (this.targetCityId != null && this.targetCityId !== currentcity.get_Id()) {
											this.labels.repair.available.setValue(webfrontend.phe.cnc.Util.getTimespanString(this.stats.repair.available));
											//this.labels.attacks.available.setValue('CP:' + Math.floor(this.stats.attacks.availableCP / this.stats.attacks.attackCost) + ' / F:' + Math.floor(this.stats.repair.available / this.stats.repair.max) + '/ C:-');
											this.labels.attacks.available.setValue('CP:' + this.stats.attacks.availableAttacksCP + ' / F:' + this.stats.attacks.availableAttacksAtFullStrength + '/ C:-');
											this.resetDisableButtons();
											this.view.playerCity = cityFaction === ClientLib.Base.EFactionType.GDIFaction || cityFaction === ClientLib.Base.EFactionType.NODFaction;
											if (this.view.playerCity) {
												this.view.playerCityDefenseBonus = currentcity.get_AllianceDefenseBonus();
												/*var cityAllianceId = currentcity.get_OwnerAllianceId();
												ClientLib.Net.CommunicationManager.GetInstance().SendSimpleCommand("GetPublicAllianceInfo", {
												id : cityAllianceId
												}, webfrontend.phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, this.calculateDefenseBonus), null);*/
											}
										}
										if (cityFaction >= 4 && cityFaction <= 6)
											this.createLayoutPreview();
										this.targetCityId = currentcity.get_Id();
									}
								}
								return;
							}

							setTimeout(function () {
								_this.onCityLoadComplete();
							}, 200);
						} catch (e) {
							console.log(e);
						}
					},
					createLayoutPreview: function () {
						try {
							var fileManager = ClientLib.File.FileManager.GetInstance();
							var images = {
								0: fileManager.GetPhysicalPath('ui/menues/main_menu/misc_empty_pixel.png'),
								1: fileManager.GetPhysicalPath('ui/common/icn_res_chrystal.png'),
								2: fileManager.GetPhysicalPath('ui/common/icn_res_tiberium.png')
							}
							var currenLayout = this.getLayout();
							var tibCount = currenLayout.match(/2/g).length;
							switch (this._MainData.get_Player().get_Faction()) {
							case ClientLib.Base.EFactionType.GDIFaction:
								var playerFaction = "G";
								break;
							case ClientLib.Base.EFactionType.NODFaction:
								var playerFaction = "N";
								break;
							}
							var cncOptURL = "http://cncopt.com/?map=2|" + playerFaction + "|" + playerFaction + "||" + this.encodeToCNCOpt(currenLayout) + "....................................|newEconomy";
							var html = '<table border="2" cellspacing="0" cellpadding="0">';

							for (var i = 0; i < 72; i++) {
								var row = Math.floor(i / 9);
								var column = i - Math.floor(i / 9) * 9;
								if (column == 0)
									html += '<tr>';
								html += '<td><img width="14" height="14" src="' + images[currenLayout.charAt(i)] + '"></td>';
								if (column == 8)
									html += '</tr>';
							}

							html += '</table><a href="' + cncOptURL + '" target="_blank" style="color:#FFFFFF;">CNCOpt';

							this.resourceLayout = new qx.ui.basic.Label().set({
								backgroundColor: "#303030",
								value: html,
								padding: 10,
								rich: true
							});
							if (tibCount == 7) {
								this.resourceLayout.setBackgroundColor("#202820");
							} else if (tibCount == 5) {
								this.resourceLayout.setBackgroundColor("#202028");
							}
							this.resourceLayoutWindow.removeAll();
							this.resourceLayoutWindow.add(this.resourceLayout);

						} catch (e) {
							console.log(e);
						}
					},
					getLayout: function () {
						try {
							var resourceLayout = "";
							for (var y = 0; y < 16; y++) {
								for (var x = 0; x < 9; x++) {
									resourceLayout += this._MainData.get_Cities().get_CurrentCity().GetResourceType(x, y);
								}
							}
							return resourceLayout;
						} catch (e) {
							console.log(e);
						}
					},
					encodeToCNCOpt: function (data) {
						try {
							var str = ".ct-jhlk";
							for (var i = 0; i < 8; i++) {
								var re = new RegExp(i, 'g');
								var char = str.charAt(i);
								data = data.replace(re, char);
							}
							return data;
						} catch (e) {
							console.log(e);
						}
					},
					showCombatTools: function () {
						this.curPAVM = qx.core.Init.getApplication().getPlayArea().getViewMode();
						//console.log("showCombatTools PAVM: " + this.curPAVM);
						switch (this.curPAVM) {
							//4 Scrolled up (when more than ~50% of the top is in view) this should never be the case
						case ClientLib.Data.PlayerAreaViewMode.pavmCombatSetupBase: {
								console.log("!!!\n TACS Warning\n!!!\n onCityLoadComplete, unexpected case pavmCombatSetupBase");
								break;
							}
							//5 Scrolled down -- normal combat setup
						case ClientLib.Data.PlayerAreaViewMode.pavmCombatSetupDefense: {
								if (this.options.autoDisplayStats.getValue()) {
									this.battleResultsBox.open();
								}
								if (this.options.showResourceLayoutWindow.getValue()) {
									this.resourceLayoutWindow.open();
								}
								break;
							}
							//6 While attacking a target
						case ClientLib.Data.PlayerAreaViewMode.pavmCombatAttacker: {
								if (this.options.autoDisplayStats.getValue() && this.saveObj.checkbox.showStatsDuringAttack) {
									this.battleResultsBox.open();
									/*if(this._armyBarContainer.isVisible()){
									this.toolBar.show();
									}*/
								}
								break;
							}
							//8
						case ClientLib.Data.PlayerAreaViewMode.pavmCombatViewerAttacker: {
								console.log("pavmCombatViewerAttacker");
								break;
							}
							//9
						case ClientLib.Data.PlayerAreaViewMode.pavmCombatViewerDefender: {
								console.log("pavmCombatViewerDefender");
								break;
							}
							//10 Watching a "sim" OR replay
						case ClientLib.Data.PlayerAreaViewMode.pavmCombatReplay: {
								if (this.saveObj.checkbox.showStatsDuringSimulation) {
									console.log("simulation case 10");
									this.battleResultsBox.open();
								}
								break;
							}
						}
					},
					getAvailableRepairAndCP: function () {
						try {
							var ownCity = this._MainData.get_Cities().get_CurrentOwnCity();
							var offHealth = ownCity.GetOffenseConditionInPercent();
							var unitData = ownCity.get_CityUnitsData();
							//var availableInfRT = ownCity.GetResourceCount(ClientLib.Base.EResourceType.RepairChargeInf);
							//var availableVehRT = ownCity.GetResourceCount(ClientLib.Base.EResourceType.RepairChargeVeh);
							//var availableAirRT = ownCity.GetResourceCount(ClientLib.Base.EResourceType.RepairChargeAir);
							var maxInfRepairCharge = unitData.GetRepairTimeFromEUnitGroup(ClientLib.Data.EUnitGroup.Infantry, false);
							var maxVehRepairCharge = unitData.GetRepairTimeFromEUnitGroup(ClientLib.Data.EUnitGroup.Vehicle, false);
							var maxAirRepairCharge = unitData.GetRepairTimeFromEUnitGroup(ClientLib.Data.EUnitGroup.Aircraft, false);
							//this.stats.repair.available = this._MainData.get_Time().GetTimeSpan(Math.min(availableInfRT, availableAirRT, availableVehRT));
							this.stats.repair.available = ClientLib.Base.Resource.GetResourceCount(ownCity.get_RepairOffenseResources().get_RepairChargeOffense());
							this.stats.repair.max = this._MainData.get_Time().GetTimeSpan(Math.max(maxInfRepairCharge, maxAirRepairCharge, maxVehRepairCharge));
							this.stats.attacks.availableCP = this._MainData.get_Player().GetCommandPointCount();
							this.stats.attacks.availableAttacksCP = Math.floor(this.stats.attacks.availableCP / this.stats.attacks.attackCost);
							this.stats.attacks.availableAttacksAtFullStrength = Math.floor(this.stats.repair.available / this.stats.repair.max) + 1;
							this.stats.attacks.availableAttacksWithCurrentRepairCharges = Math.floor(this.stats.repair.available / this.stats.repair.overall) + 1;
							if (offHealth !== 100) {
								this.stats.attacks.availableAttacksAtFullStrength--;
								this.stats.attacks.availableAttacksAtFullStrength += '*';
							} // Decrease number of attacks by 1 when unit unhealthy. Borrowed from Maelstrom Tools - by krisan
						} catch (e) {
							console.log(e);
						}
					},
					returnSetup: function () {
						// Set the scene again, just in case it didn't work the first time
						try {
							this._Application.getPlayArea().setView(ClientLib.Data.PlayerAreaViewMode.pavmCombatSetupDefense, localStorage.ta_sim_last_city, 0, 0);
						} catch (e) {
							this._Application.getPlayArea().setView(ClientLib.Data.PlayerAreaViewMode.pavmCombatSetupDefense, localStorage.ta_sim_last_city, 0, 0);
							console.log(e);
						}
					},
					checkAttackRange: function () {
						try {
							var cities = this._MainData.get_Cities();
							var target_city = cities.get_CurrentCity();
							if (target_city != null) {
								var base_city = cities.get_CurrentOwnCity();
								var attackDistance = ClientLib.Base.Util.CalculateDistance(target_city.get_PosX(), target_city.get_PosY(), base_city.get_PosX(), base_city.get_PosY());
								if (attackDistance <= 10) {
									//console.log("Target in range");
									this.buttons.attack.simulate.setEnabled(true);
									if (this.count <= 0) {
										this.buttons.attack.refreshStats.setEnabled(true);
										this.buttons.attack.toolbarRefreshStats.setEnabled(true);
									}
								} else {
									//console.log("Target Out of range");
								}
							}
						} catch (e) {
							console.log(e);
						}
					},
					skipSimulation: function () {
						try {
							while (this._VisMain.get_Battleground().get_Simulation().DoStep(false)) {}
							this._VisMain.get_Battleground().set_ReplaySpeed(1);
						} catch (e) {
							console.log(e);
						}
					},
					startSimulation: function () {
						try {
							if (PerforceChangelist >= 448942) {
								var simTimeLimit = 3000;
							} else {
								var simTimeLimit = 10000;
							}
							if (Date.now() - this.lastSimulation > simTimeLimit) {
								var ownCity = this._MainData.get_Cities().get_CurrentOwnCity();
								if (!this.getAllUnitsDeactivated() && ownCity.GetOffenseConditionInPercent() > 0) {
									ClientLib.API.Battleground.GetInstance().SimulateBattle();
									this.buttons.attack.refreshStats.setEnabled(false);
									this.buttons.attack.toolbarRefreshStats.setEnabled(false);
									this.buttons.attack.simulate.setEnabled(false);
									this.labels.countDown.setWidth(110);
									this.count = 10;
									this.statsOnly = false;
								}
							} else {
								this.enterSimulationView();
								this._VisMain.get_Battleground().RestartReplay();
								this._VisMain.get_Battleground().set_ReplaySpeed(1);
							}
						} catch (e) {
							console.log(e);
						}
					},
					OnSimulateCombatReportEvent: function (data) {
						// console.log(data);
						this.timerEnd("OnSimulateCombatReportEvent");
						try {
							// Resource Summary
							this.stats.resourcesummary.research = data.GetAttackerTotalResourceReceived(ClientLib.Base.EResourceType.ResearchPoints);
							this.stats.resourcesummary.credits = data.GetAttackerTotalResourceReceived(ClientLib.Base.EResourceType.Gold);
							this.stats.resourcesummary.crystal = data.GetAttackerTotalResourceReceived(ClientLib.Base.EResourceType.Crystal);
							this.stats.resourcesummary.tiberium = data.GetAttackerTotalResourceReceived(ClientLib.Base.EResourceType.Tiberium);

							this.labels.resourcesummary.research.setLabel(webfrontend.phe.cnc.gui.util.Numbers.formatNumbersCompact(this.stats.resourcesummary.research));
							this.labels.resourcesummary.credits.setLabel(webfrontend.phe.cnc.gui.util.Numbers.formatNumbersCompact(this.stats.resourcesummary.credits));
							this.labels.resourcesummary.crystal.setLabel(webfrontend.phe.cnc.gui.util.Numbers.formatNumbersCompact(this.stats.resourcesummary.crystal));
							this.labels.resourcesummary.tiberium.setLabel(webfrontend.phe.cnc.gui.util.Numbers.formatNumbersCompact(this.stats.resourcesummary.tiberium));
						} catch (e) {
							console.log('OnSimulateCombatReportEvent()', e);
						}
					},
					onSimulateBattleFinishedEvent: function (data) {
						//console.log("data:");
						//console.log(data);
						this.timerEnd("onSimulateBattleFinishedEvent");
						try {
							if (!this.statsOnly) {
								this.enterSimulationView();
								setTimeout(function () {
									ClientLib.Vis.VisMain.GetInstance().get_Battleground().set_ReplaySpeed(1);
								}, 1);
							}
							var total_hp = 0;
							var end_hp = 0;
							var e_total_hp = 0;
							var e_end_hp = 0;
							var eb_total_hp = 0;
							var eb_end_hp = 0;
							var eu_total_hp = 0;
							var eu_end_hp = 0;
							var i_end_hp = 0;
							var v_end_hp = 0;
							var a_end_hp = 0;
							var v_total_hp = 0;
							var a_total_hp = 0;
							var i_total_hp = 0;
							var costInf = 0;
							var costAir = 0;
							var costVeh = 0;
							this.stats.damage.structures.defense = 0;
							this.stats.damage.structures.construction = 0;
							this.stats.damage.structures.command = 0;
							this.stats.supportLevel = 0;
							this.stats.damage.structures.support = 0;
							this.stats.repair.infantry = 0;
							this.stats.repair.vehicle = 0;
							this.stats.repair.aircraft = 0;

							this.lastSimulation = Date.now();
							if (PerforceChangelist >= 448942) {
								var countDownInterval = 300;
							} else {
								var countDownInterval = 1000;
							}
							if (this.count == 10)
								this.counter = setInterval(this.countDownToNextSimulation, countDownInterval);

							for (var i = 0; i < data.length; i++) {
								var unitData = data[i].Value;
								var unitMDBID = unitData.t;
								var unit = ClientLib.Res.ResMain.GetInstance().GetUnit_Obj(unitMDBID);
								var placementType = unit.pt;
								var movementType = unit.mt;
								var unitLevel = unitData.l;
								var unitStartHealth = unitData.sh;
								var unitEndHealth = unitData.h;
								var unitMaxHealth = ClientLib.API.Util.GetUnitMaxHealthByLevel(unitLevel, unit, false);

								switch (placementType) {
								case ClientLib.Base.EPlacementType.Defense:
									if (this.view.playerCity) {
										var defenseBonus = this.view.playerCityDefenseBonus;
										var nerfBoostModifier = ClientLib.Base.Util.GetNerfAndBoostModifier(unitLevel, defenseBonus);
										unitMaxHealth = Math.floor((unitMaxHealth * nerfBoostModifier) / 100 * 16) / 16;
									}
									eu_total_hp += unitMaxHealth;
									eu_end_hp += unitEndHealth;
									e_total_hp += unitMaxHealth;
									e_end_hp += unitEndHealth;
									break;
								case ClientLib.Base.EPlacementType.Offense:
									total_hp += unitMaxHealth;
									end_hp += unitEndHealth;
									switch (movementType) {
									case ClientLib.Base.EUnitMovementType.Feet:
										i_total_hp += unitMaxHealth;
										i_end_hp += unitEndHealth;
										costInf += this.getRepairCost(unitStartHealth, unitEndHealth, unitMaxHealth, unitLevel, unitMDBID);
										break;
									case ClientLib.Base.EUnitMovementType.Wheel:
									case ClientLib.Base.EUnitMovementType.Track:
										v_total_hp += unitMaxHealth;
										v_end_hp += unitEndHealth;
										costVeh += this.getRepairCost(unitStartHealth, unitEndHealth, unitMaxHealth, unitLevel, unitMDBID);
										break;
									case ClientLib.Base.EUnitMovementType.Air:
									case ClientLib.Base.EUnitMovementType.Air2:
										a_total_hp += unitMaxHealth;
										a_end_hp += unitEndHealth;
										costAir += this.getRepairCost(unitStartHealth, unitEndHealth, unitMaxHealth, unitLevel, unitMDBID);
										break;
									}
									break;
								case ClientLib.Base.EPlacementType.Structure:
									if (this.view.playerCity) {
										var defenseBonus = this.view.playerCityDefenseBonus;
										var nerfBoostModifier = ClientLib.Base.Util.GetNerfAndBoostModifier(unitLevel, defenseBonus);
										unitMaxHealth = Math.floor((unitMaxHealth * nerfBoostModifier) / 100 * 16) / 16;
									}
									eb_total_hp += unitMaxHealth;
									eb_end_hp += unitEndHealth;
									e_total_hp += unitMaxHealth;
									e_end_hp += unitEndHealth;
									break;
								}

								if (unitMDBID >= 200 && unitMDBID <= 205) {
									this.stats.supportLevel = unitLevel;
									this.stats.damage.structures.support = (unitEndHealth / 16 / unitMaxHealth) * 100;
								} else {
									switch (unitMDBID) {
									case 131:
										// GDI DF
									case 158:
										// NOD DF
									case 195:
										// Forgotten DF
										this.stats.damage.structures.defense = (unitStartHealth > 0) ? (unitEndHealth / 16 / unitMaxHealth) * 100 : 0;
										break;
									case 112:
										// GDI CY
									case 151:
										// NOD CY
									case 177:
										// Forgotten CY
									case 251:
										// Mutated Forgotten CY
										this.stats.damage.structures.construction = (unitEndHealth / 16 / unitMaxHealth) * 100;
										break;
									case 111:
										// GDI CC
									case 159:
										// NOD CC
										this.stats.damage.structures.command = (unitEndHealth / 16 / unitMaxHealth) * 100;
										break;
									}
								}
							}

							// Calculate Percentages
							this.stats.health.infantry = i_total_hp ? (i_end_hp / 16 / i_total_hp) * 100 : 100;
							this.stats.health.vehicle = v_total_hp ? (v_end_hp / 16 / v_total_hp) * 100 : 100;
							this.stats.health.aircraft = a_total_hp ? (a_end_hp / 16 / a_total_hp) * 100 : 100;
							this.stats.damage.units.overall = eu_total_hp ? (eu_end_hp / 16 / eu_total_hp) * 100 : 0;
							this.stats.damage.structures.overall = (eb_end_hp / 16 / eb_total_hp) * 100;
							this.stats.damage.overall = (e_end_hp / 16 / e_total_hp) * 100;
							this.stats.health.overall = end_hp ? (end_hp / 16 / total_hp) * 100 : 0;

							// Calculate the repair time
							var _this = this;
							this.stats.repair.infantry = _this._MainData.get_Time().GetTimeSpan(costInf);
							this.stats.repair.aircraft = _this._MainData.get_Time().GetTimeSpan(costAir);
							this.stats.repair.vehicle = _this._MainData.get_Time().GetTimeSpan(costVeh);
							this.stats.repair.overall = _this._MainData.get_Time().GetTimeSpan(Math.max(costInf, costAir, costVeh));
							this.getAvailableRepairAndCP();
							this.updateStatsWindow();
							this.buttons.attack.simulate.setEnabled(true);

						} catch (e) {
							console.log('onSimulateBattleFinishedEvent()\n check getRepairCost()', e);
						}
					},
					enterSimulationView: function () {
						try {
							var city = this._MainData.get_Cities().get_CurrentCity();
							var ownCity = this._MainData.get_Cities().get_CurrentOwnCity();
							ownCity.get_CityArmyFormationsManager().set_CurrentTargetBaseId(city.get_Id());
							localStorage.ta_sim_last_city = city.get_Id();
							this._Application.getPlayArea().setView(ClientLib.Data.PlayerAreaViewMode.pavmCombatReplay, city.get_Id(), 0, 0);
						} catch (e) {
							console.log(e);
						}
					},
					//Undo / Redo
					saveUndoState: function () {
						var formation = this.getFormation();
						var ts = this.getTimestamp();
						var stats = this.badClone(this.stats);
						this.undoCache[0] = {
							f: formation,
							t: ts,
							s: stats
						};
						console.log(this.undoCache[0]);
						/*
						f.d = {
						eb : 0,
						de : 0,
						bu : 0,
						cy : 0,
						df : 0,
						cc : 0,
						sl : 0,
						ovr : this.stats.health.overall,
						inf : this.stats.health.infantry,
						veh : this.stats.health.vehicle,
						air : this.stats.health.aircraft,
						ou : 0,
						bt : 0
						};
						 */

					},
					wipeUndoStateAfter: function (timestamp) {
						var i;
						for (i = 0; i < this.undoCache.length; i++) {
							if (this.undoCache[i].t > timestamp) {

								break;
							}
						}
						this.undoCache = this.undoCache.slice(0, i);
					},

					//Layouts
					updateLayoutsList: function () {
						try {
							this.layouts.list.removeAll();
							// Load the saved layouts for this city
							this.loadCityLayouts();
							if (this.layouts.current) {
								for (var i in this.layouts.current) {
									var layout = this.layouts.current[i];
									var item = new qx.ui.form.ListItem(layout.label, null, layout.id);
									//item.addListener("cellDblclick", function (){},this)
									this.layouts.list.add(item);
								}
							}
						} catch (e) {
							console.log(e);
						}
					},
					deleteCityLayout: function () {
						try {
							var list = this.layouts.list.getSelection();
							if (list != null && list.length > 0) {
								var lid = list[0].getModel();
								if (this.layouts.current && typeof this.layouts.current[lid] !== 'undefined') {
									delete this.layouts.current[lid];
									this.saveLayouts();
									this.updateLayoutsList();
								}
							}
						} catch (e) {
							console.log(e);
						}
					},
					loadCityLayout: function (lid) {
						try {
							var list = this.layouts.list.getSelection();
							if (list != null && list.length > 0) {
								var layout = typeof lid === 'object' ? list[0].getModel() : lid;
								if (this.layouts.current && typeof this.layouts.current[layout] !== 'undefined') {
									//console.log("layout: ");
									//console.log(layout);
									//console.log(this.layouts.current[layout].layout);
									this.loadFormation(this.layouts.current[layout].layout);
								}
							}
						} catch (e) {
							console.log(e);
						}
					},
					saveCityLayout: function () {
						var formation = [],
						lid,
						title;
						try {
							formation = this.getFormation();
							lid = new Date().getTime().toString();
							if (this.stats.damage.structures.construction !== null) {
								title = this.layouts.label.getValue() + " (" + this.stats.damage.structures.construction.toFixed(0).toString() + ":" + this.stats.damage.structures.defense.toFixed(0).toString() + ":" + this.stats.damage.units.overall.toFixed(0).toString() + ")";
							} else {
								title = this.layouts.label.getValue() + " (??:??:??)";
							}
							this.layouts.current[lid] = {
								id: lid,
								label: title,
								layout: formation
							};

							this.saveLayouts();
							this.updateLayoutsList();
							this.layouts.label.setValue("");
						} catch (e) {
							console.log(e);
						}
						return lid; // return value at the end
					},
					loadCityLayouts: function () {
						try {
							if (this._MainData.get_Cities().get_CurrentCity() == null)
								return;
							var target_city = this._MainData.get_Cities().get_CurrentCity().get_Id();
							var base_city = this._MainData.get_Cities().get_CurrentOwnCity().get_Id();
							if (!this.layouts.all.hasOwnProperty(target_city))
								this.layouts.all[target_city] = {};
							if (!this.layouts.all[target_city].hasOwnProperty(base_city))
								this.layouts.all[target_city][base_city] = {};
							this.layouts.current = this.layouts.all[target_city][base_city];
						} catch (e) {
							console.log(e);
						}
					},
					loadLayouts: function () {
						try {
							var temp = localStorage.ta_sim_layouts;
							if (temp)
								this.layouts.all = JSON.parse(temp);
							else
								this.layouts.all = {};
						} catch (e) {
							console.log(e);
						}
					},
					saveLayouts: function () {
						try {
							localStorage.ta_sim_layouts = JSON.stringify(this.layouts.all);
						} catch (e) {
							console.log(e);
						}
					},
					//Formations
					loadFormation: function (formation) {
						try {
							this.layouts.restore = true;
							//console.log("this.view = ");
							//console.log(this.view);

							for (var i = 0; i < formation.length; i++) {
								var unit = formation[i];
								if (i == formation.length - 1)
									this.layouts.restore = false;
								for (var j = 0; j < this.view.lastUnitList.length; j++) {
									if (this.view.lastUnitList[j].get_Id() === unit.id) {
										this.view.lastUnitList[j].MoveBattleUnit(unit.x, unit.y);
										if (unit.e === undefined)
											this.view.lastUnitList[j].set_Enabled(true);
										else
											this.view.lastUnitList[j].set_Enabled(unit.e);
									}
								}
							}

							//this.view.lastUnits.RefreshData(); // RefreshData() has been obfuscated ?

						} catch (e) {
							console.log(e);
						}
					},
					getFormation: function () {
						var formation = [];
						try {
							for (var i = 0; i < this.view.lastUnitList.length; i++) {
								var unit = this.view.lastUnitList[i];
								var armyUnit = {};
								armyUnit.x = unit.get_CoordX();
								armyUnit.y = unit.get_CoordY();
								armyUnit.id = unit.get_Id();
								armyUnit.e = unit.get_Enabled();
								formation.push(armyUnit);
							}
						} catch (e) {
							console.log(e);
						}
						return formation; // return value at the end
					},
					shiftFormation: function (direction) { //left right up down
						var Army = [],
						v_shift = 0,
						h_shift = 0;
						if (direction === "u")
							v_shift = -1;
						if (direction === "d")
							v_shift = 1;
						if (direction === "l")
							h_shift = -1;
						if (direction === "r")
							h_shift = 1;

						//read army, consider use getFormation(?)
						for (var i = 0; i < this.view.lastUnitList.length; i++) {
							var unit = this.view.lastUnitList[i];
							var armyUnit = {};
							var x = unit.get_CoordX() + h_shift;
							switch (x) {
							case 9:
								x = 0;
								break;
							case  - 1:
								x = 8;
								break;
							}
							var y = unit.get_CoordY() + v_shift;
							switch (y) {
							case 4:
								y = 0;
								break;
							case  - 1:
								y = 3;
								break;
							}
							armyUnit.x = x;
							armyUnit.y = y;
							armyUnit.id = unit.get_Id();
							armyUnit.e = unit.get_Enabled();
							Army.push(armyUnit);
						}
						this.loadFormation(Army);
					},
					flipFormation: function (axis) {
						var Army = [];
						try {
							for (var i = 0; i < this.view.lastUnitList.length; i++) {
								var unit = this.view.lastUnitList[i];
								var armyUnit = {};
								var x = unit.get_CoordX();
								var y = unit.get_CoordY();

								if (axis === 'horizontal') {
									x = Math.abs(x - 8);
								} else if (axis === 'vertical') {
									y = Math.abs(y - 3);
								}

								armyUnit.x = x;
								armyUnit.y = y;
								armyUnit.id = unit.get_Id();
								armyUnit.e = unit.get_Enabled();
								Army.push(armyUnit);
							}
							this.loadFormation(Army);
						} catch (e) {
							console.log(e);
						}
					},
					activateUnits: function (type, activate) {
						var Army = [];
						try {
							for (var i = 0; i < this.view.lastUnitList.length; i++) {
								var unit = this.view.lastUnitList[i];
								var armyUnit = {};

								switch (type) {
								case 'air':
									if (unit.get_UnitGameData_Obj().mt === ClientLib.Base.EUnitMovementType.Air || unit.get_UnitGameData_Obj().mt === ClientLib.Base.EUnitMovementType.Air2)
										unit.set_Enabled(activate);
									break;
								case 'infantry':
									if (unit.get_UnitGameData_Obj().mt === ClientLib.Base.EUnitMovementType.Feet)
										unit.set_Enabled(activate);
									break;
								case 'vehicles':
									if (unit.get_UnitGameData_Obj().mt === ClientLib.Base.EUnitMovementType.Wheel || unit.get_UnitGameData_Obj().mt === ClientLib.Base.EUnitMovementType.Track)
										unit.set_Enabled(activate);
									break;
								}

								armyUnit.x = unit.get_CoordX();
								armyUnit.y = unit.get_CoordY();
								armyUnit.e = unit.get_Enabled();
								armyUnit.id = unit.get_Id();
								Army.push(armyUnit);
							}
							this.loadFormation(Army);
						} catch (e) {
							console.log(e);
						}
					},
					resetFormation: function () {
						var Army = [];
						try {
							for (var i = 0; i < this.view.lastUnitList.length; i++) {
								var unit = this.view.lastUnitList[i];
								var armyUnit = {};

								armyUnit.x = unit.GetCityUnit().get_CoordX();
								armyUnit.y = unit.GetCityUnit().get_CoordY();
								armyUnit.id = unit.get_Id();
								Army.push(armyUnit);
							}
							this.loadFormation(Army);
							if (this.buttons.attack.activateInfantry.getValue(true))
								this.buttons.attack.activateInfantry.setValue(false);
							if (this.buttons.attack.activateVehicles.getValue(true))
								this.buttons.attack.activateVehicles.setValue(false);
							if (this.buttons.attack.activateAir.getValue(true))
								this.buttons.attack.activateAir.setValue(false);
						} catch (e) {
							console.log(e);
						}
					},
					//Audio
					playSound: function (str, _this) {
						var temp = _this.audio[str].cloneNode(true);
						temp.volume = _this.getAudioSettings().ui / 100;
						temp.play();
					},
					getAudioSettings: function () {
						return JSON.parse(localStorage.getItem("CNC_Audio"));
					},
					//Repair
					repairUnit: function () {
						try {
							ClientLib.Net.CommunicationManager.GetInstance().SendCommand("Repair", {
								cityid: this.ownCityId,
								entityId: this.unitId,
								mode: 4
							}, webfrontend.phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, window.TACS.getInstance().repairResult), this.buttonId, true);
						} catch (e) {
							console.log(e);
						}
					},
					repairResult: function (buttonId, result) {
						// result erroneously true when not enough RT, button deletes/sound plays but unit does not repair.
						try {
							if (result) {
								var _this = window.TACS.getInstance();
								if (_this.saveObj.audio.playRepairSound) {
									if (_this.repairButtons[buttonId].unitType == "Inf") {
										_this.playSound("soundRepairReload", _this);
									} else {
										_this.playSound("soundRepairImpact", _this);
									}
								}
								_this._armyBar.remove(_this.repairButtons[buttonId]);
								delete _this.repairButtons[buttonId];
							}
						} catch (e) {
							console.log(e);
						}
					},
					removeAllRepairButtons: function () {
						for (var i in this.repairButtons) {
							this._armyBar.remove(this.repairButtons[i]);
						}
						this.repairButtons = [];
					},
					setResizeTimer: function () {
						var _this = this;
						if (this.repairButtonsRedrawTimer) {
							clearTimeout(_this.repairButtonsRedrawTimer);
						}
						this.repairButtonsRedrawTimer = setTimeout(function () {
							_this.redrawRepairButtons(_this);
						}, 500);
					},
					redrawRepairButtons: function (that) {
						var _this = that || this;
						var base_city_id = _this._MainData.get_Cities().get_CurrentOwnCity().get_Id();
						if (_this.repairButtons.length > 0) {
							_this.removeAllRepairButtons();
						}
						var cbtSetup = _this._VisMain.get_CombatSetup();
						var zoomFactor = cbtSetup.get_ZoomFactor();
						var startX = Math.round(cbtSetup.get_MinXPosition() * zoomFactor * -1) + 10; //qx.core.Init.getApplication().getUIItem(ClientLib.Data.Missions.PATH.BAR_ATTACKSETUP).getChildren()[1].getBounds().left;
						var startY = 7;
						var gridWidth = Math.round(cbtSetup.get_GridWidth() * zoomFactor);
						var gridHeight = 38;

						for (var i = 0; i < _this.view.lastUnitList.length; i++) {
							var unit = _this.view.lastUnitList[i];

							if (unit.get_HitpointsPercent() < 1) {
								var cityUnit = unit.GetCityUnit();
								var unitRepairCharges = cityUnit.GetResourceCostForFullRepair().d;
								var resourceCost,
								repairCharge,
								unitType;

								for (var type in unitRepairCharges) {
									type = parseInt(type);
									switch (type) {
									case ClientLib.Base.EResourceType.Crystal:
										resourceCost = unitRepairCharges[type];
										break;
									case ClientLib.Base.EResourceType.RepairChargeInf:
										repairCharge = unitRepairCharges[type];
										unitType = "Inf";
										break;
									case ClientLib.Base.EResourceType.RepairChargeVeh:
										repairCharge = unitRepairCharges[type];
										unitType = "Veh";
										break;
									case ClientLib.Base.EResourceType.RepairChargeAir:
										repairCharge = unitRepairCharges[type];
										unitType = "Air";
										break;
									}

								}
								repairCharge = webfrontend.phe.cnc.Util.getTimespanString(_this._MainData.get_Time().GetTimeSpan(repairCharge));
								resourceCost = _this.formatNumberWithCommas(resourceCost);

								_this.repairButtons[i] = new qx.ui.form.Button("", "data:image/png;base64,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%3D%3D");
								_this.repairButtons[i].set({
									decorator: new qx.ui.decoration.Decorator().set({
										backgroundColor: 'transparent'
									}),
									width: gridWidth,
									height: gridHeight,
									show: "icon",
									center: false,
									padding: 3,
									appearance: "button-text-small",
									cursor: "pointer",
									toolTipText: "Crystal: " + resourceCost + " / Time: " + repairCharge + " / Type: " + unitType
								});
								_this.repairButtons[i].addListener("execute", _this.repairUnit, {
									ownCityId: base_city_id,
									unitId: unit.get_Id(),
									buttonId: i,
									frm: _this
								});
								_this.repairButtons[i].unitType = unitType;
								//        allowGrowY: false
								_this._armyBar.add(_this.repairButtons[i], {
									left: startX + gridWidth * unit.get_CoordX(),
									top: startY + gridHeight * unit.get_CoordY()
								});
							}
						}
					},
					toggleRepairMode: function () {
						try {
							var _this = this;
							if (!this.audio.soundRepairImpact) {
								this.audio.soundRepairImpact = new Audio(window.soundRepairImpact.d);
								this.audio.soundRepairReload = new Audio(window.soundRepairReload.d);
								this.audio.soundRepairImpact.volume = this.getAudioSettings().ui / 100;
								this.audio.soundRepairReload.volume = this.getAudioSettings().ui / 100;
							}
							this._armyBar.getLayoutParent().toggleEnabled();
							this._armyBar.setEnabled(true);
							this.userInterface.toggleEnabled();
							this.battleResultsBox.toggleEnabled();
							if (this.buttons.attack.repairMode.getValue()) {
								this.redrawRepairButtons();
								this._armyBar.addListener("resize", this.setResizeTimer, this);
								this.repairInfo.show();
								this.updateRepairTimeInfobox();
								this.repairModeTimer = setInterval(this.updateRepairTimeInfobox, 1000);
							} else {
								this.removeAllRepairButtons();
								this._armyBar.removeListener("resize", this.setResizeTimer, this);
								this.repairInfo.hide();
								clearInterval(this.repairModeTimer);
							}
						} catch (e) {
							console.log(e);
						}
					},
					updateRepairTimeInfobox: function () {
						try {
							var _this = window.TACS.getInstance();
							var ownCity = _this._MainData.get_Cities().get_CurrentOwnCity();
							var availableInfRT = ownCity.GetResourceCount(ClientLib.Base.EResourceType.RepairChargeInf);
							var availableVehRT = ownCity.GetResourceCount(ClientLib.Base.EResourceType.RepairChargeVeh);
							var availableAirRT = ownCity.GetResourceCount(ClientLib.Base.EResourceType.RepairChargeAir);
							_this.stats.repair.available = ClientLib.Base.Resource.GetResourceCount(ownCity.get_RepairOffenseResources().get_RepairChargeOffense());
							_this.labels.repairinfos.available.setValue(webfrontend.phe.cnc.Util.getTimespanString(_this.stats.repair.available));
							_this.labels.repairinfos.infantry.setValue(webfrontend.phe.cnc.Util.getTimespanString(availableInfRT - _this.stats.repair.available));
							_this.labels.repairinfos.vehicle.setValue(webfrontend.phe.cnc.Util.getTimespanString(availableVehRT - _this.stats.repair.available));
							_this.labels.repairinfos.aircraft.setValue(webfrontend.phe.cnc.Util.getTimespanString(availableAirRT - _this.stats.repair.available));

							/*var unitGroupData = webfrontend.phe.cnc.gui.RepairUtil.getUnitGroupCityData(ownCity);
							if (unitGroupData[ClientLib.Data.EUnitGroup.Infantry].lowestUnitDmgRatio == 1) console.log("No damage to Infantry");
							if (unitGroupData[ClientLib.Data.EUnitGroup.Vehicle].lowestUnitDmgRatio == 1) console.log("No damage to Vehicles");
							if (unitGroupData[ClientLib.Data.EUnitGroup.Aircraft].lowestUnitDmgRatio == 1) console.log("No damage to Aircraft");*/

						} catch (e) {
							console.log(e);
						}
					},
					resetDblClick: function () {
						try {
							var _this = window.TACS.getInstance();
							clearInterval(_this.armybarClearnClickCounter);
							_this.armybarClickCount = 0;
						} catch (e) {
							console.log(e);
						}
					},
					//Util
					getDateFromMillis: function (ms) {
						return new Date(ms);
					},
					getTimestamp: function () {
						return new Date().getTime();
					},
					timerStart: function () {
						this.ts1 = this.getTimestamp();
					},
					timerEnd: function (functionName) {
						functionName = functionName || "nullName";
						this.ts2 = this.getTimestamp();
						var diff = this.ts2 - this.ts1;
						console.log(diff + "ms to run " + functionName)
					},
					badClone: function (obj) {
						// broken
						var stringied = JSON.stringify(obj);
						//var p = JSON.parse(stringied);
						return stringied;
					}
				}
			});
		}

		var TASuite_timeout = 0; // 10 seconds

		function TASuite_checkIfLoaded() {
			try {
				if (typeof qx !== 'undefined') {
					var a = qx.core.Init.getApplication(); // application
					var mb = qx.core.Init.getApplication().getMenuBar();
					var v = ClientLib.Vis.VisMain.GetInstance();
					var md = ClientLib.Data.MainData.GetInstance();
					if (a && mb && v && md && typeof PerforceChangelist !== 'undefined') {
						if (TASuite_timeout > 10 || typeof CCTAWrapper_IsInstalled !== 'undefined') {
							CreateTweak();
							window.TACS.getInstance().initialize();

							/*if (typeof ClientLib.API.Util.GetUnitMaxHealthByLevel == 'undefined') {
							for (var key in ClientLib.Base.Util) {
							var strFunction = ClientLib.Base.Util[key].toString();
							if (typeof ClientLib.Base.Util[key] === 'function' & strFunction.indexOf("1.1") > -1 & strFunction.indexOf("*=") > -1) {
							ClientLib.API.Util.GetUnitMaxHealthByLevel = ClientLib.Base.Util[key];
							break;
							}
							}
							}*/
							/*if (PerforceChangelist >= 392583) { //endgame patch - repair costs fix
								var currentCity = ClientLib.Data.Cities.prototype.get_CurrentCity.toString();
								for (var i in ClientLib.Data.Cities.prototype) {
									if (ClientLib.Data.Cities.prototype.hasOwnProperty(i) && typeof(ClientLib.Data.Cities.prototype[i]) === 'function') {
										var strCityFunction = ClientLib.Data.Cities.prototype[i].toString();
										if (strCityFunction.indexOf(currentCity) > -1) {
											if (i.length == 6) {
												currentCity = i;
												break;
											}
										}
									}
								}
								var currentOwnCity = ClientLib.Data.Cities.prototype.get_CurrentOwnCity.toString();
								for (var y in ClientLib.Data.Cities.prototype) {
									if (ClientLib.Data.Cities.prototype.hasOwnProperty(y) && typeof(ClientLib.Data.Cities.prototype[y]) === 'function') {
										var strOwnCityFunction = ClientLib.Data.Cities.prototype[y].toString();
										if (strOwnCityFunction.indexOf(currentOwnCity) > -1) {
											if (y.length == 6) {
												currentOwnCity = y;
												break;
											}
										}
									}
								}
								var strFunction = ClientLib.API.Util.GetUnitRepairCosts.toString();
								strFunction = strFunction.replace(currentCity, currentOwnCity);
								var functionBody = strFunction.substring(strFunction.indexOf("{") + 1, strFunction.lastIndexOf("}"));
								var fn = Function('a,b,c', functionBody);
								ClientLib.API.Util.GetUnitRepairCosts = fn;
							}*/

							// Solution for OnSimulateBattleFinishedEvent issue
							for (var key in ClientLib.API.Battleground.prototype) {
								if (typeof ClientLib.API.Battleground.prototype[key] === 'function') {
									strFunction = ClientLib.API.Battleground.prototype[key].toString();
									if (strFunction.indexOf(",-1,0,0,0);") > -1) {
										strFunction = strFunction.substring(strFunction.indexOf("{") + 1, strFunction.lastIndexOf("}"));
										var re = /.I.[A-Z]{6}.[A-Z]{6}\(.I.[A-Z]{6}.[a-zA-Z]+,-1,0,0,0\)\;/;
										//$I.QPYKHN.IVAYJF($I.XIMKGT.pavmCombatSimulation,-1,0,0,0);
										strFunction = strFunction.replace(re, "");
										var re2 = /.I.[A-Z]{6}.[A-Z]{6}\(\).[A-Z]{6}\(\).[A-Z]{6}\([a-z].[a-z]\)\;/;
										//$I.BFALSI.DZYMBX().JLBGOK().KLRGNI(b.d);
										var temp = strFunction.match(re2).toString();
										console.log(temp);
										strFunction = strFunction.replace(re2, "");
										strFunction = strFunction.replace("}}", "}}" + temp);
										//strFunction = strFunction.replace("var $createHelper;", "var $createHelper;var offenseData = b.d.a;var baseData = b.d.s;var defenseData = b.d.d;var simResults = b.e;for (var i in offenseData) {simResults[offenseData[i].ci-1].Value.x = offenseData[i].x;simResults[offenseData[i].ci-1].Value.y = offenseData[i].y;}for (var u in baseData) {simResults[baseData[u].ci-1].Value.x = baseData[u].x;simResults[baseData[u].ci-1].Value.y = baseData[u].y;}for (var e in defenseData) {simResults[defenseData[e].ci-1].Value.x = defenseData[e].x;simResults[defenseData[e].ci-1].Value.y = defenseData[e].y;}"); // Add Coords
										var fn = Function('a,b', strFunction);
										ClientLib.API.Battleground.prototype[key] = fn;
										break;
									}
								}
							}

							for (var key in ClientLib.Vis.BaseView.BaseView.prototype) {
								if (typeof ClientLib.Vis.BaseView.BaseView.prototype[key] === 'function') {
									strFunction = ClientLib.Vis.BaseView.BaseView.prototype[key].toString();
									if (strFunction.indexOf(ClientLib.Vis.BaseView.BaseView.prototype.ShowToolTip.toString()) > -1) {
										console.log("ClientLib.Vis.BaseView.BaseView.prototype.ShowToolTip_Original = ClientLib.Vis.BaseView.BaseView.prototype." + key);
										var showToolTip_Original = "ClientLib.Vis.BaseView.BaseView.prototype.ShowToolTip_Original = ClientLib.Vis.BaseView.BaseView.prototype." + key;
										var stto = Function('', showToolTip_Original);
										stto();
										var showToolTip_New = "ClientLib.Vis.BaseView.BaseView.prototype." + key + "=function (a){if(ClientLib.Vis.VisMain.GetInstance().get_Mode()==7&&window.TACS.getInstance().saveObj.checkbox.disableAttackPreparationTooltips){return;}else{this.ShowToolTip_Original(a);}}";
										var sttn = Function('', showToolTip_New);
										sttn();
										console.log(showToolTip_New);
										break;
									}
								}
							}
							qx.core.Init.getApplication().getArmyUnitTooltipOverlay().setVisibility_Original = qx.core.Init.getApplication().getArmyUnitTooltipOverlay().setVisibility;
							qx.core.Init.getApplication().getArmyUnitTooltipOverlay().setVisibility = function (a) {
								if (window.TACS.getInstance().saveObj.checkbox.disableArmyFormationManagerTooltips) {
									qx.core.Init.getApplication().getArmyUnitTooltipOverlay().setVisibility_Original(false);
								} else {
									qx.core.Init.getApplication().getArmyUnitTooltipOverlay().setVisibility_Original(a);
								}
							};

						} else {
							TASuite_timeout++;
							window.setTimeout(TASuite_checkIfLoaded, 1000);
						}
					} else
						window.setTimeout(TASuite_checkIfLoaded, 1000);
				} else {
					window.setTimeout(TASuite_checkIfLoaded, 1000);
				}
			} catch (e) {
				if (typeof console !== 'undefined')
					console.log(e);
				else if (window.opera)
					opera.postError(e);
				else
					GM_log(e);
			}
		}

		if (/commandandconquer\.com/i.test(document.domain)) {
			window.setTimeout(TASuite_checkIfLoaded, 1000);
		}

	};
	// injecting, because there seem to be problems when creating game interface with unsafeWindow
	var TASuiteScript = document.createElement("script");
	var txt = TASuite_mainFunction.toString();
	TASuiteScript.innerHTML = "(" + txt + ")();";
	TASuiteScript.type = "text/javascript";
	if (/commandandconquer\.com/i.test(document.domain))
		document.getElementsByTagName("head")[0].appendChild(TASuiteScript);

	//Sound sample B64LOBs
	window.soundRepairImpact = {
		info: "Impact Wrench Sound; Used in TACS; courtesy of: http://www.freesfx.co.uk",
		d: "data:video/ogg;base64,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"
	};
	window.soundRepairReload = {
		info: "Reload sound; Used in TACS; courtesy of: http://www.freesfx.co.uk; 7806 bytes",
		d: "data:video/ogg;base64,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"
	};
})();