New Custom Flunik Tools

Upgrades Offense or Defense or Buildings

// ==UserScript==
// @name        New Custom Flunik Tools
// @namespace   FlunikTools
// @description Upgrades Offense or Defense or Buildings
// @version     Awesome 1.3.3 
// @author      dbendure
// @include     http*://prodgame*.alliances.commandandconquer.com/*/index.aspx*
//@grant none
// ==/UserScript==

(function (){
	var FlunikTools_main =  function() {
		try {
			/*function CCTAWrapperIsInstalled() {
				return (typeof (CCTAWrapper_IsInstalled) != 'undefined' && CCTAWrapper_IsInstalled);
			}*/
			
			function createFlunikTools() {
				console.log('FLUNIKTOOLS createFlunikTools');
				
				qx.Class.define("FlunikTools.Main", {
					type: "singleton",
					extend: qx.core.Object,
					members: {
						button : null,
						popup : null,
						AutoUpdateButton : null,
						BuildingsButton : null,
						DefenseButton : null,
						OffenseButton : null,
						autoUpdateHandle : null,
						AautoUpdateHandle : null,
						p : 1,
						f : 1,
						g : 0,
						h : 1,
						h1 : 1,
						r : 1,
						s : 1,
						a : 1,
						x : 0,
						y: 1,
						z: 1,
						

						
						initialize: function() {
						
							console.log('FLUNIKTOOLS initialize');
							/*AutoUpdateButton = new qx.ui.form.Button("All", null).set({
								toolTipText: "Only Upgrades Everything, even if you turn it off... stupid all button!",
								width: 60,
								height: 30,
								maxWidth: 60,
								maxHeight: 30,
								appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
								center: true
							});*/
							BuildingsButton = new qx.ui.form.Button("Building", null).set({
								toolTipText: "Only Upgrades Buildings",
								width: 63,
								height: 30,
								maxWidth: 60,
								maxHeight: 30,
								appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
								center: true,
								
							});
							DefenseButton = new qx.ui.form.Button("Defence", null).set({
								toolTipText: "Only Upgrades Defence",
								width: 63,
								height: 30,
								maxWidth: 60,
								maxHeight: 30,
								appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
								center: true,
								
							});
							OffenseButton = new qx.ui.form.Button("Offence", null).set({
								toolTipText: "Only Upgrades Offence",
								width: 63,
								height: 30,
								maxWidth: 60,
								maxHeight: 30,
								appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
								center: true,
								
							});
							CommandBuildingChoice = new qx.ui.form.Button("Resonly?", null).set({
								toolTipText: "Allows only Resources to upgrade, press 1 for only resources, press 0 for normal procedure, then press the upgrade button",
								width: 63,
								height: 30,
								maxWidth: 60,
								maxHeight: 30,
								appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
								center: true,
								
							});
							worldResBuildingChoice = new qx.ui.form.Button("World", null).set({
								toolTipText: "not pressed looks at everything as it is, New = harvester hungry, Old = Power plant hungry. However, both options upgrade refineries.",
								width: 63,
								height: 30,
								maxWidth: 60,
								maxHeight: 30,
								appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
								center: true,
								
							});
							PowerBuildingChoice = new qx.ui.form.Button("PP's", null).set({
								toolTipText: "P = 0 stops power plants from upgrading, P = 1 allows powers plants to upgrade.",
								width: 63,
								height: 30,
								maxWidth: 60,
								maxHeight: 30,
								appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
								center: true,
								
							});
							HarvBuildingChoice = new qx.ui.form.Button("TibHar", null).set({
								toolTipText: "P = 0 stops power plants from upgrading, P = 1 allows powers plants to upgrade.",
								width: 63,
								height: 30,
								maxWidth: 60,
								maxHeight: 30,
								appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
								center: true,
								
							});
							
							Harv1BuildingChoice = new qx.ui.form.Button("CryHar", null).set({
								toolTipText: "P = 0 stops power plants from upgrading, P = 1 allows powers plants to upgrade.",
								width: 63,
								height: 30,
								maxWidth: 60,
								maxHeight: 30,
								appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
								center: true,
								
							});
							
							RefBuildingChoice = new qx.ui.form.Button("Ref's", null).set({
								toolTipText: "P = 0 stops power plants from upgrading, P = 1 allows powers plants to upgrade.",
								width: 63,
								height: 30,
								maxWidth: 60,
								maxHeight: 30,
								appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
								center: true,
								
							});
							
							SiloBuildingChoice = new qx.ui.form.Button("Silo's", null).set({
								toolTipText: "P = 0 stops power plants from upgrading, P = 1 allows powers plants to upgrade.",
								width: 63,
								height: 30,
								maxWidth: 60,
								maxHeight: 30,
								appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
								center: true,
								
							});
							
							AccBuildingChoice = new qx.ui.form.Button("Acc's", null).set({
								toolTipText: "P = 0 stops power plants from upgrading, P = 1 allows powers plants to upgrade.",
								width: 63,
								height: 30,
								maxWidth: 60,
								maxHeight: 30,
								appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
								center: true,
								
							});
							
							button = new qx.ui.form.Button("DB.aUp");
							button1 = new qx.ui.form.Button("Options");
							popup = new qx.ui.popup.Popup(new qx.ui.layout.Grid(5)).set({
								  width: 120,
								  height: 30,
							      allowGrowY: false,
							      allowGrowX: false,
							      padding: 5,
							      position: "top-right"
								  //appearance: ("button-text-small")
								  
								});
								popup1 = new qx.ui.popup.Popup(new qx.ui.layout.Grid(5)).set({
								  width: 120,
								  height: 30,
							      allowGrowY: false,
							      allowGrowX: false,
							      padding: 5,
							      position: "top-right"
								  //appearance: ("button-text-small")
								  
								});

								

								
							
							
							
							BuildingsButton.addListener("click", function (e) {
								if (window.FlunikTools.Main.getInstance().autoUpdateHandle != null) {
									window.FlunikTools.Main.getInstance().BstopAutoUpdate();
									BuildingsButton.setLabel("B.OFF");
									//alert("Stopped auto-update");
									
								} else {
									window.FlunikTools.Main.getInstance().BuildingstartAutoUpdate();
									BuildingsButton.setLabel("B.ON");
									
								}
							}, this);
							DefenseButton.addListener("click", function (e) {
								if (window.FlunikTools.Main.getInstance().autoUpdateHandle != null) {
									window.FlunikTools.Main.getInstance().DstopAutoUpdate();
									DefenseButton.setLabel("D.OFF");
									//alert("Stopped auto-update");
								} else {
									window.FlunikTools.Main.getInstance().DefensestartAutoUpdate();
									DefenseButton.setLabel("D.ON");
								}
							}, this);
							OffenseButton.addListener("click", function (e) {
								if (window.FlunikTools.Main.getInstance().autoUpdateHandle != null) {
									window.FlunikTools.Main.getInstance().OstopAutoUpdate();
									OffenseButton.setLabel("O.OFF");
									//alert("Stopped auto-update");
								} else {
									window.FlunikTools.Main.getInstance().OffensestartAutoUpdate();
									OffenseButton.setLabel("O.ON");
								}
							}, this);
							CommandBuildingChoice.addListener("click", function (e) {
								  var _this = window.FlunikTools.Main.getInstance();
								if (window.FlunikTools.Main.getInstance().AautoUpdateHandle != null) {
									window.FlunikTools.Main.getInstance().OffFunction();
									CommandBuildingChoice.setLabel("R = 0");
									//BuildingsButton.setLabel("B.Hold");
									_this.x = 0;
									console.log(_this.x + " normal mode");
									//alert("Stopped auto-update");
								} else {
									window.FlunikTools.Main.getInstance().OnFunction();
									CommandBuildingChoice.setLabel("R = 1");
									//BuildingsButton.setLabel("B.Hold");
									//alert("Stop auto-update to return value to 0");
									_this.x = 1;
									console.log(_this.x + " ResOnly mode");
								}
							}, this);
							worldResBuildingChoice.addListener("click", function (e) {
								  var _this = window.FlunikTools.Main.getInstance();
								if (window.FlunikTools.Main.getInstance().AautoUpdateHandle != null) {
									window.FlunikTools.Main.getInstance().OffFunction();
									worldResBuildingChoice.setLabel("New");
									//BuildingsButton.setLabel("B.Hold");
									_this.y = 1;
									_this.z = 0.293;
									_this.g = 0;
									console.log("_this.y "+_this.y + " _this.z " +_this.z +" new world mode" + "_this.g" + _this.g + "tibcost");
									//alert("Stopped auto-update");
								} else {
									window.FlunikTools.Main.getInstance().OnFunction();
									worldResBuildingChoice.setLabel("Old");
									//BuildingsButton.setLabel("B.Hold");
									//alert("Stop auto-update to return value to 0");
									_this.y = 0.293;
									_this.z = 1;
									_this.g=1;
									console.log("_this.y "+_this.y + " _this.z " +_this.z +  " old world mode"+ "_this.g" + _this.g + "powcost");
								}
							}, this);
							PowerBuildingChoice.addListener("click", function (e) {
								  var _this = window.FlunikTools.Main.getInstance();
								if (window.FlunikTools.Main.getInstance().AautoUpdateHandle != null) {
									window.FlunikTools.Main.getInstance().OffFunction();
									PowerBuildingChoice.setLabel("P = 0");
									//BuildingsButton.setLabel("B.Hold");
									_this.p = 0;
									console.log(_this.p + " Power off mode");
									//alert("Stopped auto-update");
								} else {
									window.FlunikTools.Main.getInstance().OnFunction();
									PowerBuildingChoice.setLabel("P = 1");
									//BuildingsButton.setLabel("B.Hold");
									//alert("Stop auto-update to return value to 0");
									_this.p = 1;
									console.log(_this.p + " Power On mode");
								}
							}, this);
							
							HarvBuildingChoice.addListener("click", function (e) {
								  var _this = window.FlunikTools.Main.getInstance();
								if (window.FlunikTools.Main.getInstance().AautoUpdateHandle != null) {
									window.FlunikTools.Main.getInstance().OffFunction();
									HarvBuildingChoice.setLabel("T.H = 0");
									//BuildingsButton.setLabel("B.Hold");
									_this.h = 0;
									console.log(_this.h + " Green Harvester off mode");
									//alert("Stopped auto-update");
								} else {
									window.FlunikTools.Main.getInstance().OnFunction();
									HarvBuildingChoice.setLabel("T.H = 1");
									//BuildingsButton.setLabel("B.Hold");
									//alert("Stop auto-update to return value to 0");
									_this.h = 1;
									console.log(_this.h + " Green Harvester On mode");
								}
							}, this);
							
							Harv1BuildingChoice.addListener("click", function (e) {
								  var _this = window.FlunikTools.Main.getInstance();
								if (window.FlunikTools.Main.getInstance().AautoUpdateHandle != null) {
									window.FlunikTools.Main.getInstance().OffFunction();
									Harv1BuildingChoice.setLabel("C.H = 0");
									//BuildingsButton.setLabel("B.Hold");
									_this.h1 = 0;
									console.log(_this.h1 + " Blue Harvester off mode");
									//alert("Stopped auto-update");
								} else {
									window.FlunikTools.Main.getInstance().OnFunction();
									Harv1BuildingChoice.setLabel("C.H = 1");
									//BuildingsButton.setLabel("B.Hold");
									//alert("Stop auto-update to return value to 0");
									_this.h1 = 1;
									console.log(_this.h1 + " Blue Harvester On mode");
								}
							}, this);
							
							RefBuildingChoice.addListener("click", function (e) {
								  var _this = window.FlunikTools.Main.getInstance();
								if (window.FlunikTools.Main.getInstance().AautoUpdateHandle != null) {
									window.FlunikTools.Main.getInstance().OffFunction();
									RefBuildingChoice.setLabel("R = 0");
									//BuildingsButton.setLabel("B.Hold");
									_this.r = 0;
									console.log(_this.r + " Refinery off mode");
									//alert("Stopped auto-update");
								} else {
									window.FlunikTools.Main.getInstance().OnFunction();
									RefBuildingChoice.setLabel("R = 1");
									//BuildingsButton.setLabel("B.Hold");
									//alert("Stop auto-update to return value to 0");
									_this.r = 1;
									console.log(_this.r + " Refinery On mode");
								}
							}, this);
							
							SiloBuildingChoice.addListener("click", function (e) {
								  var _this = window.FlunikTools.Main.getInstance();
								if (window.FlunikTools.Main.getInstance().AautoUpdateHandle != null) {
									window.FlunikTools.Main.getInstance().OffFunction();
									SiloBuildingChoice.setLabel("S = 0");
									//BuildingsButton.setLabel("B.Hold");
									_this.s = 0;
									console.log(_this.s + " Silo off mode");
									//alert("Stopped auto-update");
								} else {
									window.FlunikTools.Main.getInstance().OnFunction();
									SiloBuildingChoice.setLabel("S = 1");
									//BuildingsButton.setLabel("B.Hold");
									//alert("Stop auto-update to return value to 0");
									_this.s = 1;
									console.log(_this.s + " Silo On mode");
								}
							}, this);
							
							AccBuildingChoice.addListener("click", function (e) {
								  var _this = window.FlunikTools.Main.getInstance();
								if (window.FlunikTools.Main.getInstance().AautoUpdateHandle != null) {
									window.FlunikTools.Main.getInstance().OffFunction();
									AccBuildingChoice.setLabel("A = 0");
									//BuildingsButton.setLabel("B.Hold");
									_this.a = 0;
									console.log(_this.a + " Accumulator off mode");
									//alert("Stopped auto-update");
								} else {
									window.FlunikTools.Main.getInstance().OnFunction();
									AccBuildingChoice.setLabel("A = 1");
									//BuildingsButton.setLabel("B.Hold");
									//alert("Stop auto-update to return value to 0");
									_this.a = 1;
									console.log(_this.p + " Accumulator On mode");
								}
							}, this);
							
							/*AutoUpdateButton.addListener("click", function (e) {
								if (window.FlunikTools.Main.getInstance().autoUpdateHandle != null) {
									
									AutoUpdateButton.setLabel("F.OFF");
									//window.FlunikTools.Main.getInstance().stopAutoUpdate();
									BuildingsButton.setLabel("F.OFF");
									window.FlunikTools.Main.getInstance().BstopAutoUpdate();
									DefenseButton.setLabel("F.OFF");
									window.FlunikTools.Main.getInstance().DstopAutoUpdate();
									OffenseButton.setLabel("F.OFF");
									window.FlunikTools.Main.getInstance().OstopAutoUpdate();
									//alert("Stopped auto-update");
								} else {
									//window.FlunikTools.Main.getInstance().startAutoUpdate("Construction Yard, Command Center, Defense HQ, Defense Facility, Barracks, Factory, Airfield, Accumulator, Silo, Refinery, Power Plant, Harvester, Blade of Kane, Eye of Kane, Fist of Kane, Falcon Support, Ion Cannon Support, Skystrike Support, War Factory, Hand of Nod, Airport");
									AutoUpdateButton.setLabel("F.ON");
									
									window.FlunikTools.Main.getInstance().BuildingstartAutoUpdate();
									BuildingsButton.setLabel("F.ON");
									
									window.FlunikTools.Main.getInstance().DefensestartAutoUpdate();
									DefenseButton.setLabel("F.ON");
									
									window.FlunikTools.Main.getInstance().OffensestartAutoUpdate();
									OffenseButton.setLabel("F.ON");
								}
							}, this);*/
							
							//popup.add(new qx.ui.basic.Atom(null, null));//new qx.ui.basic.Atom("Hello World #1", "button-text-small")
							
							//popup.add(AutoUpdateButton, {row: 0, column: 0});
							popup.add(button1, {row: 1, column: 3});
							popup.add(worldResBuildingChoice, {row: 1, column: 1});
							popup.add(CommandBuildingChoice, {row: 1, column: 2});
							popup.add( BuildingsButton, {row: 0, column: 1});
							popup.add(DefenseButton, {row: 0, column: 2});
							popup.add(OffenseButton, {row: 0, column: 3});
							popup1.add(PowerBuildingChoice, {row: 0, column: 0});
							popup1.add(RefBuildingChoice, {row: 0, column: 1});
							popup1.add(HarvBuildingChoice, {row: 0, column: 2});
							popup1.add(Harv1BuildingChoice, {row: 0, column: 3});
							popup1.add(SiloBuildingChoice, {row: 0, column: 4});
							popup1.add(AccBuildingChoice, {row: 0, column: 5});
						button.addListener("click", function(e)
								{
								  popup.placeToMouse(e);
									popup.show();
								}, this);
							button1.addListener("click", function(e)
								{
								  popup1.placeToMouse(e);
									popup1.show();
								}, this);
						
						
							var app = qx.core.Init.getApplication();

							/*app.getDesktop().add(BuildingsButton, {
								left : 0
							});
							app.getDesktop().add(DefenseButton, {
								left : 60
							});
							app.getDesktop().add(OffenseButton, {
								left : 120
							});
							app.getDesktop().add(AutoUpdateButton, {
								left : 180
							});	*/						
							app.getDesktop().add(button, {
								right: 128,
								top: 3
							});					
							
						
						
						},
                        
                        
                        // Use
						// this.canUpgradeUnit(unit, city)
						// instead of
						// unit.CanUpgrade()
						//Thanks to KRS_L
						/*canUpgradeUnit: function (unit, city, placementType) {
							var _this = FlunikTools.Main.getInstance();
							var nextLevel = unit.get_CurrentLevel() + 1;
							var gameDataTech = unit.get_UnitGameData_Obj();
							var hasEnoughResources = city.HasEnoughResources(ClientLib.Base.Util.GetTechLevelResourceRequirements_Obj(nextLevel, gameDataTech));
							var CanUpgrade;
							
							if(placementType == ClientLib.Base.EPlacementType.Defense){
							CanUpgrade = city.GetUnitRecruitedInfoByCoord(ClientLib.Base.EPlacementType.Defense ,unit.get_CoordX() ,unit.get_CoordY()).CanUpgrade;
							}
							
							if(placementType == ClientLib.Base.EPlacementType.Offense){
							CanUpgrade = city.GetUnitRecruitedInfoByCoord(ClientLib.Base.EPlacementType.Offense ,unit.get_CoordX() ,unit.get_CoordY()).CanUpgrade;
							}
						    
							if (gameDataTech == null || unit.get_IsDamaged() || city.get_IsLocked() || !hasEnoughResources || CanUpgrade == false) {
						        return (CanUpgrade);
						    }
						    var id = _this.getMainProductionBuildingMdbId(gameDataTech.pt, gameDataTech.f);
						    var building = city.get_CityBuildingsData().GetBuildingByMDBId(id);
						    if ((building == null) || (building.get_CurrentDamage() > 0) || CanUpgrade == false) {
						        return (CanUpgrade);
						    }
						    var levelReq = ClientLib.Base.Util.GetUnitLevelRequirements_Obj(nextLevel, gameDataTech);
							var reqTechIndexes = _this.getMissingTechIndexesFromTechLevelRequirement(levelReq, true, city);
						    if ((reqTechIndexes != null) && (reqTechIndexes.length > 0) || CanUpgrade == false) {
						        return (CanUpgrade);
						    }
						    return (CanUpgrade);
						},*/
						canUpgradeUnit: function (unit, city) {
							var _this = FlunikTools.Main.getInstance();
							var nextLevel = unit.get_CurrentLevel() + 1;
							var gameDataTech = unit.get_UnitGameData_Obj();
							var hasEnoughResources = city.HasEnoughResources(ClientLib.Base.Util.GetTechLevelResourceRequirements_Obj(nextLevel, gameDataTech));
						    if (gameDataTech == null || unit.get_IsDamaged() || city.get_IsLocked() || !hasEnoughResources) {
						        return false;
						    }
						    var id = _this.getMainProductionBuildingMdbId(gameDataTech.pt, gameDataTech.f);
						    var building = city.get_CityBuildingsData().GetBuildingByMDBId(id);
						    if ((building == null) || (building.get_CurrentDamage() > 0)) {
						        return false;
						    }
						    var levelReq = ClientLib.Base.Util.GetUnitLevelRequirements_Obj(nextLevel, gameDataTech);
							var reqTechIndexes = _this.getMissingTechIndexesFromTechLevelRequirement(levelReq, true, city);
						    if ((reqTechIndexes != null) && (reqTechIndexes.length > 0)) {
						        return false;
						    }
						    return true;
						},

						getMainProductionBuildingMdbId: function (placementType, faction) {
							var mdbId = -1;
							var techNameId = -1;
							if (placementType == 2) {
								techNameId = 3;
							} else {
								techNameId = 4;
							}
							if (techNameId > 0) {
								mdbId = ClientLib.Base.Tech.GetTechIdFromTechNameAndFaction(techNameId, faction);
							}
							return mdbId;
						},

						getMissingTechIndexesFromTechLevelRequirement: function (levelRequirements, breakAtFirst, city) {
							var reqTechIndexes = [];
							if (levelRequirements != null && levelRequirements.length > 0) {
								for (var lvlIndex=0; (lvlIndex < levelRequirements.length); lvlIndex++) {
									var lvlReq = levelRequirements[lvlIndex];
									var requirementsMet = false;
									var amountCounter = lvlReq.Amount;
									for (var buildingIndex in city.get_Buildings().d) {
										if (city.get_Buildings().d[buildingIndex].get_MdbBuildingId() == lvlReq.RequiredTechId && city.get_Buildings().d[buildingIndex].get_CurrentLevel() >= lvlReq.Level) {
											amountCounter--;
											if (amountCounter <= 0) {
												requirementsMet=true;
												break;
											}
										}
									}
									if (!requirementsMet) {
										requirementsMet = ClientLib.Data.MainData.GetInstance().get_Player().get_PlayerResearch().IsResearchMinLevelAvailable(lvlReq.RequiredTechId, lvlReq.Level);
									}
									if (!requirementsMet) {
										reqTechIndexes.push(lvlIndex);
										if (breakAtFirst) {
											return reqTechIndexes;
										}
									}
								}
							}
							return reqTechIndexes;
						},
						
						// Add the below function to your code and then use
						// this.canUpgradeBuilding(building, city)
						// instead of
						// building.CanUpgrade()
						//Thanks to KRS_L

						canUpgradeBuilding: function (building, city) {
							var nextLevel = (building.get_CurrentLevel() + 1);
							var gameDataTech = building.get_TechGameData_Obj();
							var hasEnoughResources = city.HasEnoughResources(ClientLib.Base.Util.GetTechLevelResourceRequirements_Obj(nextLevel, gameDataTech));
							return (!building.get_IsDamaged() && !city.get_IsLocked() && hasEnoughResources);
						},
                        
						
						OnFunction: function() {
						this.AautoUpdateHandle = 0;
						},
						OffFunction: function() {
						this.AautoUpdateHandle = null;
						},
						
						
						BuildingstartAutoUpdate: function () {
							
							//this.buildingsToUpdate = _buildingsToUpdate;
							//this.BuildingautoUpgrade();
							this.autoUpdateHandle = window.setInterval(this.BuildingautoUpgrade, 2000);
						},
						
						OffensestartAutoUpdate: function () {
							
							//this.buildingsToUpdate = _buildingsToUpdate;
							//this.OffenseautoUpgrade();
							this.autoUpdateHandle = window.setInterval(this.OffenseautoUpgrade, 2000);
						},
						
						DefensestartAutoUpdate: function () {
							
							//this.buildingsToUpdate = _buildingsToUpdate;
							//this.DefenseautoUpgrade();
							this.autoUpdateHandle = window.setInterval(this.DefenseautoUpgrade, 1000);
						},
						
						BstopAutoUpdate : function() {
							window.clearInterval(this.autoUpdateHandle);
							this.autoUpdateHandle = null;
						},
						
						DstopAutoUpdate : function() {
							window.clearInterval(this.autoUpdateHandle);
							this.autoUpdateHandle = null;
						},
						
						OstopAutoUpdate : function() {
							window.clearInterval(this.autoUpdateHandle);
							this.autoUpdateHandle = null;
						},
                        
						
						totalRepairTime: function ( airRT, vehRT, infRT) {
						
						
							if ((airRT > 0) && (vehRT > 0) && (infRT > 0)){
								if((airRT > vehRT) && (airRT > infRT) ){
									var maxRT = airRT;
									
									return (maxRT);
									}
								if((vehRT > airRT) && (vehRT > infRT) ){
									var maxRT = vehRT;
									
									return (maxRT);
									}
								if((infRT > vehRT) && (infRT > airRT) ){
									var maxRT = infRT;
									
									return (maxRT);
									}
							
							
							}
							
							if ((airRT < 1 )&& (vehRT > 0) && (infRT > 0)){
							
								if((vehRT > infRT) ){
									var maxRT = vehRT;
									
									return (maxRT);
									}
								if((infRT > vehRT)){
									var maxRT = infRT;
									
									return (maxRT);
									}
							}
							
							if ((airRT > 0) && (vehRT < 1 )&& (infRT > 0)){
								if((airRT > infRT) ){
									var maxRT = airRT;
									
									return (maxRT);
									}
								
								if((infRT > airRT) ){
									var maxRT = infRT;
									
									return (maxRT);
									}
							}
							
							if ((airRT > 0) && (vehRT > 0 )&& (infRT < 1)){
								if((airRT > vehRT)){
										var maxRT = airRT;
										
										return (maxRT);
										}
									if((vehRT > airRT)){
										var maxRT = vehRT;
										
										return (maxRT);
										}
								
							}
							
						/*
						
						if (((airRT !< 1) && (vehRT !< 1 )&& (infRT !< 1))&&(airRT !> 0) && (vehRT !> 0 )&& (infRT !> 0)){
						var totalNoRT = 0;
						return (totalNoRT);
						}
						*/
						if (((airRT < 1) && (vehRT < 1 ))&& (infRT > 0)){
						var oneWithRT = infRT;
						return (oneWithRT);
						}
						
						if ((vehRT > 0 )&& ((airRT < 1) && (infRT < 1))){
						var oneWithRT = vehRT;
						return (oneWithRT);
						}
						
						if ((airRT >0) && ((vehRT < 1 )&& (infRT < 1))){
						var oneWithRT = airRT;
						return (oneWithRT);
						}
						
						else{
						var totalNoRT = 0;
						return (totalNoRT);
						}
						
						},
						Production_Math: function(city, building_Id, Production, Package_Size, Time_To_Get_Package, LinkType0, LinkType1, LinkType2){
													
							if(city != null){
								var Production_Value = city.GetBuildingCache(building_Id).DetailViewInfo.OwnProdModifiers.d[Production].TotalValue;
								var Package = city.GetBuildingCache(building_Id).DetailViewInfo.OwnProdModifiers.d[Package_Size].TotalValue;
								var Package_Per_Hour = city.GetBuildingCache(building_Id).DetailViewInfo.OwnProdModifiers.d[Time_To_Get_Package].TotalValue;
								
								if(city.GetBuildingCache(building_Id).DetailViewInfo.OwnProdModifiers.d[Production].ConnectedLinkTypes.d[LinkType0] != undefined){
									var type0 = city.GetBuildingCache(building_Id).DetailViewInfo.OwnProdModifiers.d[Production].ConnectedLinkTypes.d[LinkType0].Value;
								}else{
									var type0 = 0;
								}
								if(city.GetBuildingCache(building_Id).DetailViewInfo.OwnProdModifiers.d[Production].ConnectedLinkTypes.d[LinkType1] != undefined){
									var type1 = city.GetBuildingCache(building_Id).DetailViewInfo.OwnProdModifiers.d[Production].ConnectedLinkTypes.d[LinkType1].Value;
								}else{
									var type1 = 0;
								}
								if(city.GetBuildingCache(building_Id).DetailViewInfo.OwnProdModifiers.d[Production].ConnectedLinkTypes.d[LinkType2] != undefined){
									var type2 = city.GetBuildingCache(building_Id).DetailViewInfo.OwnProdModifiers.d[Production].ConnectedLinkTypes.d[LinkType2].Value;
								}else{
									var type2 = 0;
								}
								var Total_Production = Production_Value + (Package/(Package_Per_Hour/3600)) + type0 + type1 + type2;
								
								return Total_Production;
							
							}
						},
						
						Building_Object: function(city, building, type){
								if(city != null && building != null){
									if(type != null){
										var building_obj = {
												base_name: city.m_SupportDedicatedBaseName,
												building_name: building.get_UnitGameData_Obj().dn,
												Ratio: type,
												cityid: city.get_Id(),
												posX: building.get_CoordX(),
												posY: building.get_CoordY(),
												isPaid: true
											}
										} else {
											var building_obj = {
													base_name: city.m_SupportDedicatedBaseName,
													building_name: building.get_UnitGameData_Obj().dn,
													cityid: city.get_Id(),
													posX: building.get_CoordX(),
													posY: building.get_CoordY(),
													isPaid: true
												}
										}
								return building_obj;
								
								}
						},					


						
/*
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                               The Defense Function
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/
						DefenseautoUpgrade : function() {
                           var _this = window.FlunikTools.Main.getInstance();
                            var basenum = 0;
							for (var nCity in ClientLib.Data.MainData.GetInstance().get_Cities().get_AllCities().d)
							{basenum++;
								var city = ClientLib.Data.MainData.GetInstance().get_Cities().get_AllCities().d[nCity];
								
                                 var baseName = city.m_SupportDedicatedBaseName;
                             var Type = ClientLib.Base.EPlacementType.Defense;
                           
                             
                            var baselvl = city.get_LvlBase();
                             var blvlLow = baselvl + 3;
                                
                             	
                             	
                                var defarr = new Array();
							    var defnum = 0;
                               
								var units = city.get_CityUnitsData();
								var gey;

								var defenceUnits = units.get_DefenseUnits();
								for (var nUnit in defenceUnits.d ) 
								{defnum++
									var unit = defenceUnits.d[nUnit];
									
									var HQ = city.GetBuildingTypeMaxLvlByTechName(ClientLib.Base.ETechName.Defense_HQ);
									
									
                                    if(!_this.canUpgradeUnit(unit, city))continue;
                                    var unitlvlup1 = unit.get_CurrentLevel() + 1;
                                    var name  = unit.get_UnitGameData_Obj().dn;
									var canUpgrade = city.GetUnitRecruitedInfoByCoord(ClientLib.Base.EPlacementType.Defense ,unit.get_CoordX() ,unit.get_CoordY()).CanUpgrade;
									//console.log(city.GetUnitRecruitedInfoByCoord(ClientLib.Base.EPlacementType.Defense ,unit.get_CoordX() ,unit.get_CoordY()).CanUpgrade);
									//console.log(!_this.canUpgradeUnit(unit, city));
								  if(unit.get_CurrentLevel() > 3){
									var unitHealthperCost = _this.GetUnitMaxHealth(unit.get_CurrentLevel(), ClientLib.Res.ResMain.GetInstance().GetUnit_Obj(unit.get_MdbUnitId()), false)/(ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(unitlvlup1, unit.get_UnitGameData_Obj())[1].Count);
									}
									if(unit.get_CurrentLevel() <= 3){
									var unitHealthperCost = Math.pow( (_this.GetUnitMaxHealth(unit.get_CurrentLevel(), ClientLib.Res.ResMain.GetInstance().GetUnit_Obj(unit.get_MdbUnitId()), false)/(ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(unitlvlup1, unit.get_UnitGameData_Obj())[0].Count)), -1);
									}
									defarr[defnum] =  unitHealthperCost;
								    defarr.sort(function(a,b){return b-a});
									//console.log(defarr[0], defarr[1]);
									
									if((defarr[0] >= defarr[1]) && ((unit.get_CurrentLevel() > 3)&&( unit.get_CurrentLevel() <= 4) ) && (defarr[1] != undefined)  ){
									
									//console.log(defarr[0], defarr[1]);
									defarr.shift();
									}
									if((defarr[0] >= defarr[1]) && (unit.get_CurrentLevel() > 4) && (defarr[1] != undefined)  ){
									defarr.sort(function(a,b){return a-b});
									//console.log(defarr[0], defarr[1]);
									defarr.shift();
									}
									
									if((defarr[0] >= defarr[1]) && (unit.get_CurrentLevel() <= 3) && (defarr[1] != undefined)){
									defarr.shift();
									}
									
									
									if(unitHealthperCost == defarr[0] ){
									var defunit_obj = {
										cityid: city.get_Id(),
										basename: city.m_SupportDedicatedBaseName,
										Ratio: unitHealthperCost,
										unitname: unit.get_UnitGameData_Obj().dn,
										level: unit.get_CurrentLevel(),
										type: "Defense",
										upgradepossiblity: canUpgrade,
										unitId: unit.get_Id()
									}
									}
									/*if(_this.GetUnitMaxHealth(unit.get_CurrentLevel(), ClientLib.Res.ResMain.GetInstance().GetUnit_Obj(unit.get_MdbUnitId()), false).toString() !== "NaN"){
									console.log(_this.GetUnitMaxHealth(unit.get_CurrentLevel(), ClientLib.Res.ResMain.GetInstance().GetUnit_Obj(unit.get_MdbUnitId()), false));
									}*/
								}
								if ( (defunit_obj != undefined)&&(defunit_obj.Ratio == defarr[0]) && (defunit_obj.level <= (HQ-1) ) && (canUpgrade == defunit_obj.upgradepossiblity)) {
										//console.log(units);
										console.log(defunit_obj, defarr);
										ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UnitUpgrade", defunit_obj, null, null, true);
										defarr = [];
										HQ = [];
										break;
								}
                               
							}
                             
						},
						
						
/*
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                             The Offense Function
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/

						OffenseautoUpgrade : function() {
                           var _this = window.FlunikTools.Main.getInstance();
                            var basenum = 0;
							for (var nCity in ClientLib.Data.MainData.GetInstance().get_Cities().get_AllCities().d)
							{basenum++;
								var city = ClientLib.Data.MainData.GetInstance().get_Cities().get_AllCities().d[nCity];
								var buildings = city.get_Buildings();
                                 var baseName = city.m_SupportDedicatedBaseName;
                             
                           var Type = ClientLib.Base.EPlacementType.Offense;
                             
                            var baselvl = city.get_LvlBase();
                             var blvlLow = baselvl + 3;
                                
                             	
                             	
                               var offarr = new Array();
							   var offnum = 0;
                               
								var units = city.get_CityUnitsData();
								

								var offenceUnits = units.get_OffenseUnits();
								for (var nUnit in offenceUnits.d) 
								{offnum++
									var unit = offenceUnits.d[nUnit];
                                    
									if(!_this.canUpgradeUnit(unit, city))continue;
                                    var unitlvlup1 = unit.get_CurrentLevel() + 1;
                                    var name  = unit.get_UnitGameData_Obj().dn;
									if(unit.get_CurrentLevel() > 2){
									var unitHealthperCost = _this.GetUnitMaxHealth(unit.get_CurrentLevel(), ClientLib.Res.ResMain.GetInstance().GetUnit_Obj(unit.get_MdbUnitId()), false)/(ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(unitlvlup1, unit.get_UnitGameData_Obj())[1].Count);
									}
									if(unit.get_CurrentLevel() <= 2){
									var unitHealthperCost = Math.pow( (_this.GetUnitMaxHealth(unit.get_CurrentLevel(), ClientLib.Res.ResMain.GetInstance().GetUnit_Obj(unit.get_MdbUnitId()), false)/(ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(unitlvlup1, unit.get_UnitGameData_Obj())[0].Count)), -1);
									}
									offarr[offnum] =  unitHealthperCost;
									//What this does is sort the array from highest to lowest, then it dumps the first ratio with the .shift(), and upgrades the next best thing. 
									
								   offarr.sort(function(a,b){return b-a});
								   //console.log(offarr[0], offarr[1]);
									
									if(offarr[0] >= offarr[1] && ((unit.get_CurrentLevel() > 2)&&( unit.get_CurrentLevel() <= 3) ) && (offarr[1] != undefined)  ){
									
									offarr.shift();
									
									}
									if(offarr[0] >= offarr[1] &&( unit.get_CurrentLevel() > 3)  && (offarr[1] != undefined)  ){
									offarr.sort(function(a,b){return a-b});
									offarr.shift();
									
									}
									if(offarr[0] >= offarr[1] &&( unit.get_CurrentLevel() <= 2)  && (offarr[1] != undefined)  ){
									
									offarr.shift();
									
									}
									if(unitHealthperCost == offarr[0]){
									var offunit_obj = {
										cityid: city.get_Id(),
										basename: city.m_SupportDedicatedBaseName,
										unitname: unit.get_UnitGameData_Obj().dn,
										Ratio: unitHealthperCost,
										level: unit.get_CurrentLevel(),
										type: "Offense",
										unitId: unit.get_Id()
									}
									}
									
									
								  
									
								  
									
										
									}
									
									//console.log(offarr[1].toString());
									
									if ( (offunit_obj != undefined)&&(offunit_obj.Ratio == offarr[0]) && (offunit_obj.level <= (city.get_CommandCenterLevel() - 1)) ) {
										//console.log(units);
										
										console.log(offunit_obj, offarr);
										ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UnitUpgrade", offunit_obj, null, null, true);
										offarr = [];
										break;
								}
                               
							}
                             
						},
						
						
/*The Building Function*/BuildingautoUpgrade : function() {
                           var _this = window.FlunikTools.Main.getInstance();
                            var basenum = 0;
							for (var nCity in ClientLib.Data.MainData.GetInstance().get_Cities().get_AllCities().d)
							{basenum++;
								var city = ClientLib.Data.MainData.GetInstance().get_Cities().get_AllCities().d[nCity];
								var buildings = city.get_Buildings();
                                 var baseName = city.m_SupportDedicatedBaseName;
                             //console.log(baseName,  _this.x, _this.y, _this.z);
                             var airRT = city.get_CityUnitsData().GetRepairTimeFromEUnitGroup(ClientLib.Data.EUnitGroup.Aircraft, false);
								var vehRT = city.get_CityUnitsData().GetRepairTimeFromEUnitGroup(ClientLib.Data.EUnitGroup.Vehicle, false);
								var infRT = city.get_CityUnitsData().GetRepairTimeFromEUnitGroup(ClientLib.Data.EUnitGroup.Infantry, false);
                            // var maxRT = math.Max(airRT, vehRT, infRT);
                              
                            var baselvl = city.get_LvlBase();
                             var blvlLow = baselvl + 3;
                             var defLvl = city.get_LvlDefense();
                             var offLvl = city.get_LvlOffense();
                                //var offensehealth = city.get_CityUnitsData().GetTotalOffenseUnitHealth();
                             	//console.log(_this.totalRepairTime(airRT, vehRT, infRT), infRT);
                                    var cryMax = city.GetResourceMaxStorage(ClientLib.Base.EResourceType.Crystal);
									var tibMax = city.GetResourceMaxStorage(ClientLib.Base.EResourceType.Tiberium);
									var powMax = city.GetResourceMaxStorage(ClientLib.Base.EResourceType.Power);
									
									var alliance = ClientLib.Data.MainData.GetInstance().get_Alliance();
									var tiberiumAlly = alliance.GetPOIBonusFromResourceType(ClientLib.Base.EResourceType.Tiberium);
									var tiberiumCont = city.GetResourceGrowPerHour(ClientLib.Base.EResourceType.Tiberium, false, false);
									var tiberiumPac = city.GetResourceBonusGrowPerHour(ClientLib.Base.EResourceType.Tiberium);
									
                             	//console.log(baseName + " tibContGain " +  tibContGain + " tibPacGain " +  tibPacGain + " tibContGain * _this.y " +  tibContGain * _this.y +" tibPacGain * _this.y " + tibPacGain * _this.y );
									var powerAlly = alliance.GetPOIBonusFromResourceType(ClientLib.Base.EResourceType.Power);
									var powerCont = city.GetResourceGrowPerHour(ClientLib.Base.EResourceType.Power, false, false);
									var powerPac = city.GetResourceBonusGrowPerHour(ClientLib.Base.EResourceType.Power);
									
                             	//console.log(baseName + " powContGain " +  powContGain + " powPacGain " +  powPacGain +" powContGain * _this.z "+ powContGain * _this.z +" powPacGain * _this.z "+ powPacGain * _this.z);
									var crystalAlly = alliance.GetPOIBonusFromResourceType(ClientLib.Base.EResourceType.Crystal);
									var crystalCont = city.GetResourceGrowPerHour(ClientLib.Base.EResourceType.Crystal, false, false);
									var crystalPac = city.GetResourceBonusGrowPerHour(ClientLib.Base.EResourceType.Crystal);
									
                             	//console.log(baseName + " cryContGain " +  cryContGain + " cryPacGain " +  cryPacGain + " cryContGain * _this.y " +  cryContGain * _this.y +" cryPacGain * _this.y " + cryPacGain * _this.y );
									var creditCont = ClientLib.Base.Resource.GetResourceGrowPerHour(city.get_CityCreditsProduction(), false);
									var creditPac = ClientLib.Base.Resource.GetResourceBonusGrowPerHour(city.get_CityCreditsProduction(), false);
                               
							   //console.log(ClientLib.API.Army.GetInstance().GetUpgradeCostsForAllUnitsToLevel(offLvl+1)[0].Count,  ClientLib.API.Defense.GetInstance().GetUpgradeCostsForAllUnitsToLevel(defLvl+1)[0].Count, ClientLib.API.City.GetInstance().GetUpgradeCostsForAllBuildingsToLevel(blvlLow)[0].Count);
								
								//console.log(baseName + " creditContGain " +  creditContGain + " creditPacGain " +  creditPacGain +" creditContGain * _this.z "+ creditContGain * _this.z +" creditPacGain * _this.z "+ creditPacGain * _this.z);
								//console.log(baseName, airRT, vehRT, infRT, _this.totalRepairTime(airRT, vehRT, infRT));
                                
                                var refarr = new Array();
								var refnum = 0;
                             	var powarr = new Array();
                             	var pownum = 0;
                             	var hararr = new Array();
                             	var hararr1 = new Array();
                             	var harnum = 0;
                             	var harnum1 = 0;
                             	var accarr = new Array();
                             	var accnum = 0;
                             	var silarr = new Array();
                             	var silnum = 0;
								var maxarr = [];
                             	
                             for (var nBuildings in buildings.d) {
                                   
									var building = buildings.d[nBuildings];
									
                                   if(!_this.canUpgradeBuilding(building, city))continue;
									var name = building.get_UnitGameData_Obj().dn;
									var buildinglvlup1 = building.get_CurrentLevel() + 1;
                                    var bulid = building.get_Id();
                                 var tech = building.get_TechName();
                                 //console.log(ClientLib.Res.ResMain.GetInstance().GetTech_Obj(building.get_MdbBuildingId()));
								 //var buildTibCost = ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[0].Count;
								  //var buildPowCost = ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[1].Count;
									//if (name == "Silo" || name == "Accumulator" || name == "Command Center" || name == "Defence HQ" ) {
									//console.log(city.GetUnitRecruitedInfoByCoord(ClientLib.Base.EPlacementType.Structure ,building.get_CoordX(), building.get_CoordY()));
/*						  
**************************************************************************************************************************************************************************************************************************************************************************************************************************************
Upgrade RT CC CY DHQ DFac and low level resource building Defining
**************************************************************************************************************************************************************************************************************************************************************************************************************************************							  
	*/                             
	
	 
								 
						//	/*	 
								 if(	(tech == ClientLib.Base.ETechName.Factory)	&& ((_this.totalRepairTime(airRT, vehRT, infRT) == vehRT) && (_this.x == 0))){
										  var offRT = building;
										  var offRT_obj = {
											cityid: city.get_Id(),
											buildingid: building.get_Id(),
											basename: city.m_SupportDedicatedBaseName,
											building: building.get_UnitGameData_Obj().dn,
											buildTibCost: ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[0].Count,
											buildPowCost: ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[1].Count,
											specal: vehRT,
											posX: building.get_CoordX(),
											posY: building.get_CoordY(),
											isPaid: true
											};
                                 
										 
                                 }
                                 
                                 if(	(tech == ClientLib.Base.ETechName.Barracks) &&	((_this.totalRepairTime(airRT, vehRT, infRT) == infRT)&& (_this.x == 0))){
										  var offRT = building;
										  var offRT_obj = {
											cityid: city.get_Id(),
											buildingid: building.get_Id(),
											basename: city.m_SupportDedicatedBaseName,
											building: building.get_UnitGameData_Obj().dn,
											buildTibCost: ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[0].Count,
											buildPowCost: ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[1].Count,
											specal:  infRT,
											posX: building.get_CoordX(),
											posY: building.get_CoordY(),
											isPaid: true
											};
										 
                                 }
                                 
                                 if(	(tech == ClientLib.Base.ETechName.Airport) && ((_this.totalRepairTime(airRT, vehRT, infRT) == airRT)&& (_this.x == 0)))	{
										 var offRT = building;
										 var offRT_obj = {
											cityid: city.get_Id(),
											buildingid: building.get_Id(),
											basename: city.m_SupportDedicatedBaseName,
											building: building.get_UnitGameData_Obj().dn,
											buildTibCost: ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[0].Count,
											buildPowCost: ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[1].Count,
											specal:  airRT,
											posX: building.get_CoordX(),
											posY: building.get_CoordY(),
											isPaid: true
											};
											
                                 }
                             //    */
							 //      /*
                                 
                                 if (	(tech == ClientLib.Base.ETechName.Construction_Yard ) && ((building.get_CurrentLevel() < baselvl) && (_this.totalRepairTime(airRT, vehRT, infRT) < 14400)&& (_this.x == 0))	){
										  var cbuilding = building;
										  //console.log(name);
										  var building_obj = {
											cityid: city.get_Id(),
											buildingid: building.get_Id(),
											basename: city.m_SupportDedicatedBaseName,
											buildinglevel: building.get_CurrentLevel(),
											building: building.get_UnitGameData_Obj().dn,
											posX: building.get_CoordX(),
											posY: building.get_CoordY(),
											isPaid: true
											};
										 
                                 }
                                 
                                 if (	(tech ==ClientLib.Base.ETechName.Command_Center ) && ((building.get_CurrentLevel() <= offLvl) && (_this.totalRepairTime(airRT, vehRT, infRT) < 14400)&& (_this.x == 0))	){
										  var cbuilding = building;
										  //console.log(name);
										  var building_obj = {
											cityid: city.get_Id(),
											buildingid: building.get_Id(),
											basename: city.m_SupportDedicatedBaseName,
											buildinglevel: building.get_CurrentLevel(),
											building: building.get_UnitGameData_Obj().dn,
											posX: building.get_CoordX(),
											posY: building.get_CoordY(),
											isPaid: true
											};
										 
                                 }
                                 
                                 if (	(tech ==ClientLib.Base.ETechName.Defense_HQ ) && ((building.get_CurrentLevel() <= defLvl) && (_this.x == 0))	){
										  var cbuilding = building;
										  //console.log(name);
										  var building_obj = {
											cityid: city.get_Id(),
											buildingid: building.get_Id(),
											basename: city.m_SupportDedicatedBaseName,
											buildinglevel: building.get_CurrentLevel(),
											building: building.get_UnitGameData_Obj().dn,
											posX: building.get_CoordX(),
											posY: building.get_CoordY(),
											isPaid: true
											};
										 
                                 }
                                 
								  if (	(tech == ClientLib.Base.ETechName.Defense_Facility) &&  ((building.get_CurrentLevel() <= defLvl + 3) && (_this.x == 0))	){
										  var cbuilding = building;
										  //console.log(name);
										  var building_obj = {
											cityid: city.get_Id(),
											buildingid: building.get_Id(),
											basename: city.m_SupportDedicatedBaseName,
											buildinglevel: building.get_CurrentLevel(),
											building: building.get_UnitGameData_Obj().dn,
											posX: building.get_CoordX(),
											posY: building.get_CoordY(),
											isPaid: true
											};
										   
                                 }
							
							//	*/ 
							//	/*
                                 if (((tech ==ClientLib.Base.ETechName.Support_Air)||(tech == ClientLib.Base.ETechName.Support_Ion)||(tech == ClientLib.Base.ETechName.Support_Art)) && (( _this.totalRepairTime(airRT, vehRT, infRT) < 14400) &&  (building.get_CurrentLevel() <= defLvl + 3)&& (_this.x == 0))	){
										  var support = building;
										  var support_obj = {
											cityid: city.get_Id(),
											buildingid: building.get_Id(),
											basename: city.m_SupportDedicatedBaseName,
											building: building.get_UnitGameData_Obj().dn,
											buildinglevel: building.get_CurrentLevel(),
											posX: building.get_CoordX(),
											posY: building.get_CoordY(),
											isPaid: true
											};
										  
										  
                                 } 
							//	 */
								
                                 if (
								 (
								 (tech == ClientLib.Base.ETechName.Harvester && building.get_CurrentLevel() <= 2) || 
								 (tech == ClientLib.Base.ETechName.Refinery && building.get_CurrentLevel() <= 2) ||
								 (tech == ClientLib.Base.ETechName.PowerPlant && building.get_CurrentLevel() <= 2) ||
								 ( (tech == ClientLib.Base.ETechName.Accumulator && building.get_CurrentLevel() <= 2)) ||
								 ((tech == ClientLib.Base.ETechName.Silo && building.get_CurrentLevel() <= 2) )
								 )
								 
								 
								 

								 ){
								 var lowres = building;
								 var LowResbuilding_obj = {
											cityid: city.get_Id(),
											buildingid: building.get_Id(),
											type: "LowResbuilding",
											basename: city.m_SupportDedicatedBaseName,
											building: building.get_UnitGameData_Obj().dn,
											buildinglevel: building.get_CurrentLevel(),
											posX: building.get_CoordX(),
											posY: building.get_CoordY(),
											isPaid: true
											};
								 //ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", building_obj, null, null, true);
								 
								 }
                             /*if (name == "Refinery"  || name == "Power Plant" || name == "Harvester" || name == "Accumulator" || name == "Silo") {
									//if (name == "Silo") {
										var building_obj = {
											cityid: city.get_Id(),
											posX: building.get_CoordX(),
											posY: building.get_CoordY(),
											isPaid: true
										}*/
                                        
/*						  
**************************************************************************************************************************************************************************************************************************************************************************************************************************************
Upgrade Resource Defining 
**************************************************************************************************************************************************************************************************************************************************************************************************************************************							  
	*/                                        
                                        
                                        if ((tech == ClientLib.Base.ETechName.Refinery    &&  building.get_CurrentLevel() > 2) && (_this.r == 1)){
										var ref = building;
                                            refnum++;
                                             //var refObj = Object();CreditsBonusTimeToComplete
                              				//if(refnum = 0)break;
                                            //console.log(city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[30].ConnectedLinkTypes.d[36].ProvidingToValue, city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[30].ConnectedLinkTypes.d[37].ProvidingToValue );
                               //OwnProdModifiers.d[30].ConnectedLinkTypes.d[36].Value         OwnProdModifiers.d[30].ConnectedLinkTypes.d[37].Value   
                                            
                                            var refPro = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CreditsProduction].TotalValue;
											//var refLinkTypes = (city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CreditsProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.PowerplantCreditBonus].Value) + (city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CreditsProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.TiberiumCreditProduction].Value);
                                            var refPac = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CreditsPackageSize].TotalValue;
                                            var refPacperH = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CreditsBonusTimeToComplete].TotalValue;
                                            var refCost = ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[_this.g].Count;
                                            var refLinkTypes0 = 0;
											var refLinkTypes1 = 0;
											
											if(city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CreditsProduction].ConnectedLinkTypes.d[36] != undefined){
											 refLinkTypes0 = (city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CreditsProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.PowerplantCreditBonus].Value);
											//var refTotalPro = refPro + (refPac/(refPacperH/3600)) +  refLinkTypes0 ;
											}else {refLinkTypes0 = 0;}
											
											if(city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CreditsProduction].ConnectedLinkTypes.d[37] != undefined){
											refLinkTypes1 = (city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CreditsProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.TiberiumCreditProduction].Value);
											//var refTotalPro = refPro + (refPac/(refPacperH/3600)) +  refLinkTypes0 +  refLinkTypes1  ;
                                           }else {refLinkTypes1 = 0;}
										   
										   var refTotalPro = refPro + (refPac/(refPacperH/3600)) +  refLinkTypes0 +  refLinkTypes1  ;

   										    var refTotalProOfLevel12 = 605 + (7260/6) + 484 + 605; 
                                            var refProRatio = Math.pow( ((refTotalProOfLevel12/31608)*100)/((refTotalPro/refCost)*100), -1);
                                           	refarr[refnum] = refProRatio;
                                           // refarr[refid] = Ref;
                                            if ((refProRatio > 0) ){/* Math.floor((Math.random()*10)+1)){*/
                                            //console.log(((refTotalProOfLevel12/96000)*100)/((refTotalPro/refCost)*100) );
                                            refarr.sort(function(a,b){return b-a});
                                                
                                            
                                            }
                                            if((Math.max(refProRatio) == refarr[0])){
                                 var Ref_obj = {
											cityid: city.get_Id(),
                                     		basename: city.m_SupportDedicatedBaseName,
											building: building.get_UnitGameData_Obj().dn,
											buildinglevel: building.get_CurrentLevel(),
											posX: building.get_CoordX(),
											posY: building.get_CoordY(),
											isPaid: true
										}
                                 //ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Ref_obj, null, null, true);
                           
                             }
                                            
                                            }
                                        if ((tech == ClientLib.Base.ETechName.PowerPlant) && (building.get_CurrentLevel() > 2) &&(_this.p == 1)){
                                            var pow = building;
											pownum++;
                                             //var refObj = Object();CreditsBonusTimeToComplete
                              				
                                            //OwnProdModifiers.d[6].ConnectedLinkTypes.d[29].Value - OwnProdModifiers.d[6].ConnectedLinkTypes.d[38].Value - OwnProdModifiers.d[30].ConnectedLinkTypes.d[42].Value
                                            
                                            var powPro = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].TotalValue;
											var powPac = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerPackageSize].TotalValue;
                                            var powPacperH = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerBonusTimeToComplete].TotalValue;
                                            var powCost = ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[_this.g].Count;
                                            var powLinkTypes0 = 0;
											var powLinkTypes1 = 0;
											var powLinkTypes2 = 0;
											var powTotalProOfLevel12 = 605 + (7260/6) + 570 + 456 + 484; 
                                            
											
											if(city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].ConnectedLinkTypes.d[29] != undefined ){
											 powLinkTypes0 = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.AccumulatorPowerBonus].Value ;											
											 var powLinkTypes1 = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.CrystalCreditProduction].Value ;
                                            //var powTotalPro = powPro + (powPac/(powPacperH/3600)) + powLinkTypes0 +  powLinkTypes1 + powLinkTypes2 ;
											//var powTotalProOfLevel12 = 605 + (7260/6) + 570 + 456 + 484;
											//console.log(powLinkTypes0);
											}else{var powLinkTypes0 = 0;}
											
											if( city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].ConnectedLinkTypes.d[38] != undefined ){
											 powLinkTypes1 = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.CrystalCreditProduction].Value ;
                                            //var powTotalPro = powPro + (powPac/(powPacperH/3600)) + powLinkTypes0 +  powLinkTypes1 + powLinkTypes2 ;
											//var powTotalProOfLevel12 = 605 + (7260/6) + 570 + 456 + 484; 
											//console.log(powLinkTypes1);
											}else{var powLinkTypes1 = 0;}
											
											if(city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].ConnectedLinkTypes.d[42] != undefined){
											 powLinkTypes2 = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.RefineryPowerBonus].Value;
											//var powTotalPro = powPro + (powPac/(powPacperH/3600)) + powLinkTypes0 +  powLinkTypes1 + powLinkTypes2 ;
											//var powTotalProOfLevel12 = 605 + (7260/6) + 570 + 456 + 484; 
											//console.log(powLinkTypes2);
											}else{var powLinkTypes2 = 0;}
											
											
											var powTotalPro = powPro + (powPac/(powPacperH/3600)) + powLinkTypes0 +  powLinkTypes1 + powLinkTypes2 ;
											
                                            //var powTotalProOfLevel12 = 605 + (7260/6) + 570 + 456 + 484; 
											var powProRatio = Math.pow( ((powTotalProOfLevel12/164736)*100)/((powTotalPro/powCost)*100), -1);
                                           	powarr[pownum] = powProRatio;
                                            
                                            if ((powProRatio > 0) ){/* Math.floor((Math.random()*10)+1)){*/
                                           // console.log(((powTotalProOfLevel12/96000)*100)/((powTotalPro/refCost)*100) );
                                            powarr.sort(function(a,b){return b-a});
                                                
                                            
                                            }
                                            if((Math.max(powProRatio) == powarr[0])){
                                 var Pow_obj = {
											cityid: city.get_Id(),
                                     		basename: city.m_SupportDedicatedBaseName,
											building: building.get_UnitGameData_Obj().dn,
											buildinglevel: building.get_CurrentLevel(),
											posX: building.get_CoordX(),
											posY: building.get_CoordY(),
											isPaid: true
										}
                                 //ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Pow_obj, null, null, true);
                           
                             }
                                            
                                        }
                                        if ((tech == ClientLib.Base.ETechName.Harvester   &&  building.get_CurrentLevel() > 2)){
                                            var harv = building;
											harnum++;   harnum1++;
                                            
                                             var hartibLinkTypes = 0;
											 var harcryLinkTypes = 0;
											 //OwnProdModifiers.d[1].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.SiloTiberiumProduction].Value - 
                              				
                                            if((city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[1,25,33]) && (_this.h == 1)){
											//console.log(city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[1,25,33]);&& (powPacGain > tibPacGain)&& (powPacGain > cryPacGain)
                                            
                                            var hartibPro = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.TiberiumProduction].TotalValue;
											//var hartibLinkTypes = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.TiberiumProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.SiloTiberiumProduction].Value;
                                            var hartibPac = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.TiberiumPackageSize].TotalValue;
                                            var hartibPacperH = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.TiberiumBonusTimeToComplete].TotalValue;
                                            
											if(city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.TiberiumProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.SiloTiberiumProduction] != undefined){
											hartibLinkTypes = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.TiberiumProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.SiloTiberiumProduction].Value;
											//var harTibTotalPro = hartibPro + (hartibPac/(hartibPacperH/3600)) + hartibLinkTypes;
											}else{hartibLinkTypes = 0;}
                                            
                                           var harTibTotalPro = hartibPro + (hartibPac/(hartibPacperH/3600)) + hartibLinkTypes;
                                            var harCost = ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[_this.g].Count;
                                            
                                            //var harTibTotalPro = hartibPro + (hartibPac/(hartibPacperH/3600)) ;
                                            var harTibTotalProOfLevel12 = 570 + (7260/6) + 380; 
                                            var harTibProRatio = Math.pow( ((harTibTotalProOfLevel12/95040)*100)/((harTibTotalPro/harCost)*100), -1);
                                            
                                            
                                           	
                                            hararr[harnum] = harTibProRatio;
                                            
                                            
                                            if ((harTibProRatio > 0) ){/* Math.floor((Math.random()*10)+1)){*/
                                           // console.log(((harTibTotalProOfLevel12/72000)*100)/((harTibTotalPro/refCost)*100) );
                                            hararr.sort(function(a,b){return b-a});
                                            }
                                                
                                            
                                            
                                            if((Math.max(harTibProRatio) == hararr[0])){
                                 var Har_obj = {
											cityid: city.get_Id(),
                                     		basename: city.m_SupportDedicatedBaseName,
											building: building.get_UnitGameData_Obj().dn,
											buildinglevel: building.get_CurrentLevel(),
											type: "Tiberium",
											posX: building.get_CoordX(),
											posY: building.get_CoordY(),
											isPaid: true
										}
                                 //ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Har_obj, null, null, true);
                           
                             }
                                            }
                                            if((city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[4,26,34]) && (_this.h1 == 1)){
                                            //console.log(city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[4,26,34]);
                                          
                                             //var refObj = Object();CreditsBonusTimeToComplete
                              				
                                            //Production_Value = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalProduction].TotalValue;
											//Package = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalPackageSize].TotalValue;
											//Package_Per_Hour = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalBonusTimeToComplete].TotalValue;
											//Production = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalProduction];
											//LinkType0 = Prodution.ConnectedLinkTypes.d[ClientLib.Base.ELinkType.SiloCrystalProduction].Value;
											//LinkType1 = ;
											//LinkType2 = ;
                                            
                                           
                                            
                                            var harcryPro = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalProduction].TotalValue;
											//var harcryLinkTypes =  city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.SiloCrystalProduction].Value;
                                            var harcryPac = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalPackageSize].TotalValue;
                                            var harcryPacperH = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalBonusTimeToComplete].TotalValue;
                                           
                                            var harCryCost = ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[_this.g].Count;
                                            
                                            if(city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.SiloCrystalProduction] != undefined){
											harcryLinkTypes = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.SiloCrystalProduction].Value;
											//var harCryTotalPro = harcryPro + (harcryPac/(harcryPacperH/3600)) + harcryLinkTypes;
											}else{var harcryLinkTypes = 0;}
                                            
                                            var harCryTotalPro = harcryPro + (harcryPac/(harcryPacperH/3600)) + harcryLinkTypes;
                                            var harCryTotalProOfLevel12 = 570 + (7260/6) + 380; 
                                            var harCryProRatio = Math.pow( ((harCryTotalProOfLevel12/95040)*100)/((harCryTotalPro/harCryCost)*100), -1);
                                           	
                                           
                                            hararr1[harnum1] = harCryProRatio;
                                            
                                            if ( harCryProRatio > 0 ){// Math.floor((Math.random()*10)+1)){
                                            //console.log(((harCryTotalProOfLevel12/96000)*100)/((harCryTotalPro/harCryCost)*100) );
                                          
                                            hararr1.sort(function(a,b){return b-a});
                                                
                                            
                                            }
                                            if((Math.max(harCryProRatio) == hararr1[0])){
                                 var Har1_obj = {
											cityid: city.get_Id(),
                                     		basename: city.m_SupportDedicatedBaseName,
											building: building.get_UnitGameData_Obj().dn,
											buildinglevel: building.get_CurrentLevel(),
											type: "Crystal",
											posX: building.get_CoordX(),
											posY: building.get_CoordY(),
											isPaid: true
										}
                                 //ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Har1_obj, null, null, true);
                          
                             }
                                            
                                            }
                                            
                                        }
                                        if((tech == ClientLib.Base.ETechName.Accumulator) && (building.get_CurrentLevel() > 2) && (_this.a == 1)){
                                           var acc = building;
										   accnum++;
                                             //var refObj = Object();CreditsBonusTimeToComplete
                              				
                                            var accLinkTypes = 0;
											//OwnProdModifiers.d[6].ConnectedLinkTypes.d[41].Value
                                            
                                            var accPro = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].TotalValue;
											//var accLinkTypes = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.PowerPlantAccumulatorBonus].Value;
                                            var accSto = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerStorage].TotalValue;
                                            var accCost = ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[_this.g].Count;
                                            //var accTotalPro = accPro ;
                                             
                                            if(city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.PowerPlantAccumulatorBonus] != undefined){
											var accLinkTypes = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.PowerPlantAccumulatorBonus].Value;
											//var accTotalPro = accLinkTypes;
											}else{accLinkTypes = 0;}
											var accTotalPro = accLinkTypes;
											var accTotalProOfLevel12 = 456 ;
											var accProRatio = Math.pow( ((accTotalProOfLevel12/63360)*100)/((accTotalPro/accCost)*100), -1);
                                           	accarr[accnum] = accProRatio;
                                          
                                            if ((accProRatio > 0) ){/* Math.floor((Math.random()*10)+1)){*/
                                            //console.log(((accTotalProOfLevel12/36360)*100)/((accTotalPro/accCost)*100) );
                                            accarr.sort(function(a,b){return b-a});
                                                
                                            
                                            }
                                            if((Math.max(accProRatio) == accarr[0])){
                                 var Acc_obj = {
											cityid: city.get_Id(),
                                     		basename: city.m_SupportDedicatedBaseName,
											building: building.get_UnitGameData_Obj().dn,
											buildinglevel: building.get_CurrentLevel(),
											posX: building.get_CoordX(),
											posY: building.get_CoordY(),
											isPaid: true
										}
                                 //ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Acc_obj, null, null, true);
                           
                             				} 
                                        }
                                        if((tech == ClientLib.Base.ETechName.Silo)        && (building.get_CurrentLevel() > 2)  && (_this.s == 1) ){
                                        var silo = building;
										silnum++;
                                            // console.log(city.GetBuildingCache(bulid).DetailViewInfo);
											 //OwnProdModifiers.d[1].ConnectedLinkTypes.d[39].Value - OwnProdModifiers.d[4].ConnectedLinkTypes.d[40].Value
                              				//console.log(city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d);
                                            var silCryLinkType = 0;
                                            var silTibLinkType = 0;
											var silTotalPro = 0;
                                            var silCryPro = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalProduction].TotalValue;
											//var silCryLinkType = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.HarvesterCrystalProduction].Value;
                                            var silTibPro = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.TiberiumProduction].TotalValue;
											//var silTibLinkType = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.HarvesterTiberiumProduction].Value;
                                            var silCrySto = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalStorage].TotalValue;
                                            var silTibSto = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.TiberiumStorage].TotalValue;
                                            var silCost = ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[_this.g].Count;
                                            
											if(city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.HarvesterCrystalProduction] == undefined ){
											
											 silCryLinkType =  0 ;
											}else{silCryLinkType = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.HarvesterCrystalProduction].Value;
											//silTotalPro = silCryLinkType + silTibLinkType;
											}
											
											if(city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.TiberiumProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.HarvesterTiberiumProduction] == undefined ){
											
											silTibLinkType = 0;
											}else{silTibLinkType = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.TiberiumProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.HarvesterTiberiumProduction].Value;
											//silTotalPro = silCryLinkType + silTibLinkType;
											}
											
											
                                           silTotalPro = silCryLinkType + silTibLinkType;
                                            var silTotalProOfLevel12 = 380 + 380 ; 
                                            var silProRatio = Math.pow( ((silTotalProOfLevel12/63360)*100)/((silTotalPro/silCost)*100), -1);
                                            
                                            
                                            silarr[silnum] = silProRatio;
                                            
                                            if ((silProRatio >= 0) ){// Math.floor((Math.random()*10)+1)){
                                            //console.log(((accTotalProOfLevel12/36360)*100)/((accTotalPro/accCost)*100) );
                                            silarr.sort(function(a,b){return b-a});
                                                
                                            
                                            }
                                            if((Math.max(silProRatio) == silarr[0])){
                                 var Sil_obj = {
											cityid: city.get_Id(),
                                     		basename: city.m_SupportDedicatedBaseName,
											building: building.get_UnitGameData_Obj().dn,
											buildinglevel: building.get_CurrentLevel(),
											posX: building.get_CoordX(),
											posY: building.get_CoordY(),
											isPaid: true
										}
                                 //ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Sil_obj, null, null, true);
                           
                             				}
											 //silCryLinkType = 0;
                                            //silTibLinkType = 0;
											//silTotalPro = 0;
                                        }
                                 //if((Ref_obj.toString() != "undefined" || Pow_obj.toString() != "undefined" || Har_obj.toString() != "undefined" || Har1_obj.toString() != "undefined" || Acc_obj.toString() != "undefined" || Sil_obj.toString() != "undefined")&&
                                  // (refarr.toString() != "[]" || powarr.toString() != "[]" || hararr.toString() != "[]" || hararr1.toString() != "[]" || accarr.toString() != "[]" || silarr.toString() != "[]")){
                                       
                                    
                                // }   
                                 //}
                                      
                                   
								}
                     
					 /* ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
					 if( (Ref_obj != undefined) || (Pow_obj != undefined) || (Har_obj != undefined) || (Har1_obj != undefined) || (Acc_obj != undefined) || (Sil_obj != undefined)){
                       console.log(Ref_obj, refarr);console.log(Pow_obj, powarr);console.log(Har_obj, hararr); console.log(Har1_obj, hararr1);console.log(Acc_obj, accarr);console.log(Sil_obj, silarr);
                           
                             ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Sil_obj, null, null, true);
                              ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Acc_obj, null, null, true);
                             ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Har1_obj, null, null, true);
                             ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Har_obj, null, null, true);
                             ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Pow_obj, null, null, true);
                              ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Ref_obj, null, null, true);
							  }
						/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	  
							  */
	/*						  
**************************************************************************************************************************************************************************************************************************************************************************************************************************************
Upgrade decisions
**************************************************************************************************************************************************************************************************************************************************************************************************************************************							  
	*/						  // console.log(baseName,refnum,pownum);
							  maxarr = [refarr[0], powarr[0], hararr[0], hararr1[0], accarr[0], silarr[0]];
							  maxarr.sort(function(a,b){return b-a});
						//	  /* 
						  if((offRT_obj != undefined)&& (_this.x == 0)){
						  
							  console.log(offRT_obj, _this.x);
							  ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", offRT_obj, null, null, true);
							  offRT_obj = {};
							  break;
							 }
							 
						//	  */
						//	  /* 	  
							  if((building_obj != undefined) && (_this.x == 0) ){
							  
							  console.log(building_obj, _this.x);
							  ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", building_obj, null, null, true);
							  building_obj = {};
							  break;
							  
							 
							  }
							 //	  */ 
							  
							  if((LowResbuilding_obj != undefined)){
							  console.log(LowResbuilding_obj, _this.x );
							  ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", LowResbuilding_obj, null, null, true);
							  LowResbuilding_obj = {};
							 break;
							  }
						//	  /*
							 if((support_obj != undefined)&& (_this.x == 0)){
							 
							  console.log(support_obj, _this.x);
							  ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", support_obj, null, null, true);
							  support_obj = {};
							  
							  break;
							  
							
							  
							  }
						//	  */
							  
							  if( (Ref_obj != undefined) && (refarr.toString() != "") && (maxarr[0] == refarr[0]) && (((_this.totalRepairTime(airRT, vehRT, infRT) < 14400) && (_this.x == 0))||(_this.x == 1))){/*(_this.totalRepairTime(airRT, vehRT, infRT) < 14400)||( building.get_CurrentLevel() > 2)*/
								console.log(Ref_obj, refarr, _this.x);
								ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Ref_obj, null, null, true);
								Ref_obj = {};
								refarr = [];
								maxarr = [];
							 break; }
							  
							  if(  (Pow_obj != undefined)&& (powarr.toString() != "") && (maxarr[0] == powarr[0]) && (((_this.totalRepairTime(airRT, vehRT, infRT) < 14400) && (_this.x == 0))||(_this.x == 1))){/*(_this.totalRepairTime(airRT, vehRT, infRT) < 14400)||*/
								console.log(Pow_obj, powarr, _this.x);
								ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Pow_obj, null, null, true);
								Pow_obj = {};
								powarr = [];
								maxarr = [];
                             break;
							  }
							  
							  if( (Har_obj != undefined)&& (hararr.toString()!= "") && (maxarr[0] == hararr[0]) && (((_this.totalRepairTime(airRT, vehRT, infRT) < 14400) && (_this.x == 0))||(_this.x == 1))){/*(_this.totalRepairTime(airRT, vehRT, infRT) < 14400)||*/
								console.log(Har_obj, hararr, _this.x);
								ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Har_obj, null, null, true);
								Har_obj = {};
								hararr = [];
								maxarr = [];
                             break;
							  }
							  
							  if( (Har1_obj != undefined)&& (hararr1.toString() != "") && (maxarr[0] == hararr1[0]) && (((_this.totalRepairTime(airRT, vehRT, infRT) < 14400) && (_this.x == 0))||(_this.x == 1))){/*(_this.totalRepairTime(airRT, vehRT, infRT) < 14400)||*/
								console.log(Har1_obj, hararr1, _this.x);
								ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Har1_obj, null, null, true);
								Har1_obj = {};
								hararr1 = [];
								maxarr = [];
                             break;
							  }
							  
							  if( (Acc_obj != undefined)&& (accarr.toString() != "") && (maxarr[0] == accarr[0]) && (((_this.totalRepairTime(airRT, vehRT, infRT) < 14400) && (_this.x == 0))||(_this.x == 1))){/*(_this.totalRepairTime(airRT, vehRT, infRT) < 14400)||*/
								console.log(Acc_obj, accarr, _this.x);
								ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Acc_obj, null, null, true);
								Acc_obj = {};
								accarr = [];
								maxarr = [];
                            break;
							  }
							  
							  if((Sil_obj != undefined)&& (silarr.toString() != "") && (maxarr[0] == silarr[0]) && (((_this.totalRepairTime(airRT, vehRT, infRT) < 14400) && (_this.x == 0))||(_this.x == 1))){/*(_this.totalRepairTime(airRT, vehRT, infRT) < 14400)||*/
								console.log(Sil_obj, silarr, _this.x);
								ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Sil_obj, null, null, true);
								Sil_obj = {};
								silarr = [];
								maxarr = [];
                              break;
							  }
/*						  
**************************************************************************************************************************************************************************************************************************************************************************************************************************************
Upgrade decisions end
**************************************************************************************************************************************************************************************************************************************************************************************************************************************							  
	*/								
                               
							}
                             
						}
						
						
					}
				});
			}
		} catch (e) {
			console.log("createFlunikTools: ", e);
		}
		
		function FlunikTools_checkIfLoaded() {
			try {
			if (typeof qx != 'undefined' && qx.core.Init.getApplication() && qx.core.Init.getApplication().getUIItem(ClientLib.Data.Missions.PATH.BAR_NAVIGATION) && qx.core.Init.getApplication().getUIItem(ClientLib.Data.Missions.PATH.BAR_NAVIGATION).isVisible()) {
					createFlunikTools();
					if (typeof ClientLib.API.Util.GetUnitMaxHealth == 'undefined'){
							for (var key in ClientLib.Base.Util)
							{
								var strFunction = ClientLib.Base.Util[key].toString();
								if ((strFunction.indexOf("function (a,b,c)") == 0 || strFunction.indexOf("function (a,b)") == 0) &&
									 strFunction.indexOf("*=1.1") > -1)
								{
										FlunikTools.Main.getInstance().GetUnitMaxHealth = ClientLib.Base.Util[key];
										console.log("FlunikTools.Main.getInstance().GetUnitMaxHealth = ClientLib.Base.Util["+key+"]");
										break;
								}
							}
						}else{
							FlunikTools.Main.getInstance().GetUnitMaxHealth = ClientLib.API.Util.GetUnitMaxHealth;	
							

						
					}
					                // ClientLib.Data.CityUnits.prototype.get_OffenseUnits
                strFunction = ClientLib.Data.CityUnits.prototype.HasUnitMdbId.toString();
                var searchString = "for (var b in {d:this.";
                var startPos = strFunction.indexOf(searchString) + searchString.length;
                var fn_name = strFunction.slice(startPos, startPos + 6);
                strFunction = "var $createHelper;return this." + fn_name + ";";
                var fn = Function('', strFunction);
                ClientLib.Data.CityUnits.prototype.get_OffenseUnits = fn;
                console.log("ClientLib.Data.CityUnits.prototype.get_OffenseUnits = function(){var $createHelper;return this." + fn_name + ";}");

                // ClientLib.Data.CityUnits.prototype.get_DefenseUnits
                strFunction = ClientLib.Data.CityUnits.prototype.HasUnitMdbId.toString();
                searchString = "for (var c in {d:this.";
                startPos = strFunction.indexOf(searchString) + searchString.length;
                fn_name = strFunction.slice(startPos, startPos + 6);
                strFunction = "var $createHelper;return this." + fn_name + ";";
                fn = Function('', strFunction);
                ClientLib.Data.CityUnits.prototype.get_DefenseUnits = fn;
                console.log("ClientLib.Data.CityUnits.prototype.get_DefenseUnits = function(){var $createHelper;return this." + fn_name + ";}");


					FlunikTools.Main.getInstance();
					window.FlunikTools.Main.getInstance().initialize();
				} else {
					window.setTimeout(FlunikTools_checkIfLoaded, 1000);
				}
			} catch (e) {
				console.log("FlunikTools_checkIfLoaded: ", e);
			}
		}
		if (/commandandconquer\.com/i.test(document.domain)) {
			window.setTimeout(FlunikTools_checkIfLoaded, 1000);
		}
	}
		
	try
	{
		var FlunikScript = document.createElement("script");
		FlunikScript.innerHTML = "(" + FlunikTools_main.toString() + ")();";
		FlunikScript.type = "text/javascript";
		if (/commandandconquer\.com/i.test(document.domain)) {
			document.getElementsByTagName("head")[0].appendChild(FlunikScript);
		}
	} catch (e) {
		console.log("FlunikTools: init error: ", e);
	}
})();