Monday, December 5, 2011

Ikariam Empire Board


// coding: utf-8
// ==UserScript==
// @name  Ikariam Empire Board
// @namespace empire-board.ikariam
// @version 205
// @author  oliezekat
// @description Display population, resources, trading, transports, incomes, buildings, and army or fleet units overviews for each cities. Support any countries/languages.
// @icon http://s3.amazonaws.com/uso_ss/icon/41051/large.jpg
// @require http://userscripts.org/scripts/source/60774.user.js
// @include http://s*.ikariam.*/*
// @include http://s*.*.ikariam.*/*
// @exclude http://support.ikariam.*/*
// @exclude http://board.*.ikariam.*/*
// ==/UserScript==

/**************************************************************************************************
LAST CHANGES:

Version 2.0.5:
- Fix to detect troop/fleet deployment under v.0.4.4.1
- Detect government type
- Detect number of cultural treaties into any museum
- Apply research bonus per cultural treaties under Demokratie government
- Fix to detect current Ikariam version
- Support new fleet units (under v.0.4.x rev 28493 on s666 server)
- Fix to detect premium features remaining time
- Add premium icon to report if require to fetch features remaining times
- Fix if tavern has been demolished without disable wine usage
- Fix if barracks/shipyard has been demolished while units were under construction
- Report foreign transports which will arrive for trading or exchange (from "Troop movements" view)

PREVIOUS CHANGES:
http://feeds.feedburner.com/ikariam-v3-empire-board

Based on "Ikariam Alarm And Overview Table" script (for Ikariam v0.2.8)
http://userscripts.org/scripts/show/35995
**************************************************************************************************/

// Old global vars
var config;
var langtype;
var texts;
var buildings;
var tavernWineUsage = [0, 4, 8, 13, 18, 24, 30, 37, 44, 51, 60, 68, 78, 88, 99, 110, 122, 136,150,165,180,197,216,235,255,277,300,325,351,378,408,439,472,507,544,584,626,670,717,766,818,874,933,995,1060,1129,1202,1278];
var townHallSpaces = [0, 60, 96, 142, 200, 262, 332, 410, 492, 580, 672, 768, 870, 976, 1086, 1200, 1320, 1440, 1566, 1696, 1828, 1964, 2102, 2246, 2390, 2540, 2690, 2845, 3003, 3163, 3326, 3492, 3710, 3880, 4054, 4230, 4410, 4590, 4774, 4960, 5148, 5340, 5532, 5728, 5926, 6126, 6328, 6534, 6760];

// Old objects
function Resource()
 {
 this.wood  = 0;
 this.wine  = 0;
 this.marble  = 0;
 this.glass  = 0; // For crystal
 this.sulfur  = 0;
 }

// New unique object
if (!EmpireBoard) var EmpireBoard = {};

EmpireBoard =
 {
 /* Requires modules */
 Log:    {},
 DOM:    {},
 Str:    {},
 Ikariam:   {},
 DB:     {},
 Renders:   {},
 Tooltip:   {},
 Handlers:   {},
 Updater:   {},
 
 StartTime:   0,
 EndTime:   0,
 LogEnabled:   false,
 MainID:    'EmpireBoard',
 
 /* Script metas */
 ScriptName:   'Ikariam Empire Board',
 Version:   205,
 HomePage:   '',
 ScriptURL:   '',
 UserScriptsID:  41051
 };

EmpireBoard.Init = function()
 {
 this.StartTime = new Date().getTime();
 this.HomePage   = 'http://userscripts.org/scripts/show/'+this.UserScriptsID;
 this.ScriptURL   = 'http://userscripts.org/scripts/source/'+this.UserScriptsID+'.user.js';
 
 /* Init Log */
 this.Log.Init(this);
 this.Log._Enabled = this.LogEnabled;
 this.Log.Add('Start...');
 
 this.DOM.Init(this);
 this.Str.Init(this);
 this.Ikariam.Init(this);
 this.DB.Init(this);
 this.DB.Load_Options();
 this.Intl.Init(this, this.MainID);
 this.Renders.Init(this);
 this.Tooltip.Init(this, this.MainID+'Tooltip', this.MainID);
 this.Handlers.Init(this);
 this.Updater.Init(this);
 
 // Always create main div for add-ons which need to check version
 var body = this.DOM.Get_First_Node("//body");
 if (body != null)
  {
  var div = document.createElement('div');
  div.id = this.MainID;
  div.setAttribute("version", this.Version);
  body.appendChild(div);
  }
 
 this.DB.Load();
 
 this.Intl.SetLanguage(this.DB.Options.Prefs.LANGUAGE);
 this.Intl.Load_LocalizedTexts();
 
 // Str module presets
 this.Str._decimalPoint     = this.Ikariam.LocalizationStrings('decimalPoint');
 this.Str._thousandSeparator    = this.Ikariam.LocalizationStrings('thousandSeperator');
 if (this.Str._decimalPoint == undefined)
  this.Str._decimalPoint = '.';
 if (this.Str._thousandSeparator == undefined)
  this.Str._thousandSeparator = ',';
 this.Str._timeunits_short_day   = this.Ikariam.LocalizationStrings('day','timeunits','short');
 this.Str._timeunits_short_hour   = this.Ikariam.LocalizationStrings('hour','timeunits','short');
 this.Str._timeunits_short_minute  = this.Ikariam.LocalizationStrings('minute','timeunits','short');
 this.Str._timeunits_short_second  = this.Ikariam.LocalizationStrings('second','timeunits','short');
 if (this.Str._timeunits_short_day == undefined)
  this.Str._timeunits_short_day = 'D';
 if (this.Str._timeunits_short_hour == undefined)
  this.Str._timeunits_short_hour = 'h';
 if (this.Str._timeunits_short_minute == undefined)
  this.Str._timeunits_short_minute = 'm';
 if (this.Str._timeunits_short_second == undefined)
  this.Str._timeunits_short_second = 's';
 
 this.CheckScriptUpdate();
 
 this.FetchData();
 };
 
EmpireBoard.FetchData = function()
 {
 // 1. Global data
 
 // 1.1 current cities
 this.Ikariam.Fetch_CitiesSelect(this.DB.CurrentCities, true);
 // 1.2 gold
 var GoldTitle = this.DOM.Get_First_Node_Title("//div[@id='globalResources']//li[@class='gold']",'?');
 if (GoldTitle != '?')
  {
  config.gold = this.Str.To_Integer(GoldTitle, 0);
  }
 else
  {
  // not connected ?
  }
 this.Log.Add('Gold = '+config.gold);
 
 // 2. Current city data
 
 // 2.1 Current city Id
 
 // 2.2 Current city ressources
 
 // 3. Main view data
 
 };
 
EmpireBoard.CheckScriptUpdate = function()
 {
 if ((this.DB.Options['LastCheckUpdate'] == undefined) || (this.DB.Options['LastCheckUpdate'] < this.StartTime - (1000 * 60 * 60 * 24)))
  {
  var self = this;
  var ScriptURL = 'http://userscripts.org/scripts/source/'+this.UserScriptsID+'.meta.js?since='+this.StartTime;
  this.Updater.Check(ScriptURL, function(availableVersion) { self._CompareScriptUpdate(availableVersion); });
  }
 else
  {
  this.Log.Add('Not need check update today');
  }
 };
 
EmpireBoard._CompareScriptUpdate = function(availableVersion)
 {
 this.Log.Add('Available version: '+availableVersion);
 if (availableVersion != 0)
  {
  availableVersion = parseInt(availableVersion);

  if ((availableVersion > this.Version) && ((this.DB.Options['AvailableVersion'] == undefined) || (availableVersion > this.DB.Options['AvailableVersion'])))
   {
   if (confirm("Do you want to install \""+this.ScriptName+"\" v. "+availableVersion+" ?"))
    {
    GM_openInTab(this.ScriptURL+'?version='+availableVersion+'.user.js');
    }
   }
  
  this.DB.Options['AvailableVersion'] = availableVersion;
  this.DB.Options['LastCheckUpdate'] = this.StartTime;
  this.DB.Save_Options();
  }
 };
 
EmpireBoard.ViewIsFinances = function()
 {
 if (this.Ikariam.Is_Version('0.3.4') == true)
  {
  var Cities = this.DB.CurrentCities;
  
  // 1. Sum of population
  var overallPop = 0;
  for (CityId in Cities)
   {
   if (Cities[CityId].own != true) continue;
   var city = getCity(CityId);
   var population = getArrValue(city.buildings['townHall'], 'population', '?');
   
   if (population == '?')
    {
    overallPop = '?';
    break;
    }
   else
    {
    overallPop += parseInt(population);
    }
   }
  
  if (overallPop != '?')
   {
   this.Log.Add('overallPop = '+overallPop);
   
   // 2. Fetch overall Upkeep
   var overallUpkeep = '?';
   var cells = this.DOM.Get_Nodes("//table[@id='upkeepReductionTable'][3]//td[contains(@class,'hidden')]");
   if (cells.snapshotLength >= 3)
    {
    overallUpkeep = Math.abs(this.Str.To_Integer(cells.snapshotItem(1).textContent,0));
    
    config["upkeeps"]['overall'] = overallUpkeep;
    
    this.Log.Add('overallUpkeep = '+overallUpkeep);
    }
    
   if (overallUpkeep != '?')
    {
    // 3. Fetch and update citizens (gold) production
    // 3.1. Array of cities per name
    var citiesIDs = {};
    var lName = '';
    for (CityId in Cities)
     {
     if (Cities[CityId].own != true) continue;
     var cName = Cities[CityId].name+'';
     citiesIDs[cName] = parseInt(CityId);
     if (lName == cName) this.Ikariam.Insert_Warning("You may choose different names for each cities.",this.ScriptName);
     lName = cName+'';
     }
    // 3.2. Fetch cities table
    var nodes = this.DOM.Get_Nodes("//table[@id='balance']//td[@class='city']");
    for (var i = 0; i < nodes.snapshotLength; i++)
     {
     var node = nodes.snapshotItem(i);
     var cName = this.Str.Trim(node.innerHTML);
     var cID = citiesIDs[cName];
     
     var tr = node.parentNode;
     var tds = tr.getElementsByTagName("td");
     //var tds = tr.childNodes;
     var citizensProd = this.Str.To_Integer(tds[3].innerHTML);
     
     var city = getCity(cID); 
     
     if (city.buildings["townHall"] == undefined) city.buildings["townHall"] = {};
     
     city.buildings["townHall"].citizensProd  = citizensProd;
     this.Log.Add('['+cName+'] (from Finances): citizensProd='+citizensProd);
     }
    
    // 4. Calc shared upkeep for each cities
    for (CityId in Cities)
     {
     if (Cities[CityId].own != true) continue;
     var city = getCity(CityId);
     var population = getArrValue(city.buildings['townHall'], 'population', '?');
     
     if (population != '?')
      {
      var upkeep = Math.ceil(((overallUpkeep*parseInt(population)) / overallPop)-0.6);
      city.buildings["townHall"].upkeep = upkeep;
      this.Log.Add('['+Cities[CityId].name+'] (from Finances): upkeep='+upkeep);
      
      // 5. Calc new income
      var citizensProd = getArrValue(city.buildings['townHall'], 'citizensProd', '?');
      if (citizensProd != '?')
       {
       var incomegold = citizensProd - upkeep;
       city.buildings["townHall"].incomegold = incomegold;
       this.Log.Add('['+Cities[CityId].name+'] (from Finances): incomegold='+incomegold);
       }
      }
     }
    }
   }
  }
 else if (this.Ikariam.Is_Version('0.3.3') == true)
  {
  // Too late to support it, sorry
  }
 else
  {
  var citiesIDs = {};
  var res = this.DOM.Get_Nodes("//select[@id='citySelect']/option");
  for(var i = 0; i < res.snapshotLength; i++)
    {
    var n = res.snapshotItem(i);
    var cName = this.Ikariam.Trim_Coords(n.innerHTML);
    citiesIDs[cName] = parseInt(n.value);
    }
    
  var nodes = this.DOM.Get_Nodes("//table[@id='balance']//td[@class='city']");
  for (var i = 0; i < nodes.snapshotLength; i++)
   {
   var node = nodes.snapshotItem(i);
   var cName = this.Str.Trim(node.innerHTML);
   var cID = citiesIDs[cName];
   
   var tr = node.parentNode;
   var tds = tr.getElementsByTagName("td");
   //var tds = tr.childNodes;
   var incomegold = this.Str.To_Integer(tds[3].innerHTML);
   
   var city = getCity(cID); 
   if (city.buildings["townHall"] == undefined) city.buildings["townHall"] = {};
   city.buildings["townHall"].incomegold  = incomegold;
   }
  }
  
 config.financestime = this.StartTime;
 };
 
EmpireBoard.ViewIsCity = function()
 {
 
 };
 
EmpireBoard.ViewIsBuildingTemple = function()
 {
 var _self = this;
 
 function reportTemple()
  {
  setViewRqTime('finances');
  _self.DB.Save();
  }
 
 var n = document.getElementById("inputWorkersSubmit");
 n.addEventListener("click", reportTemple, false);
 
 var city = getCity(city_idmainView);
 
 var n = document.getElementById("valuePriests");
 city.buildings["temple"].priests = this.Str.To_Integer(n.textContent);
 this.Log.Add('valuePriests = '+city.buildings["temple"].priests);
 };
 
EmpireBoard.ViewIsBuildingMuseum = function()
 {
 var totalCulturalGoods = 0;
 
 var players = this.DOM.Get_Nodes("//div[@id='mainview']//table[@class='content_table']//td[@class='player']");
 if (players.snapshotLength > 0)
  {
  totalCulturalGoods = players.snapshotLength;
  }
  
 
 config.totalCulturalGoods = totalCulturalGoods;
 this.Log.Add('totalCulturalGoods = '+config.totalCulturalGoods);
 };
 
EmpireBoard.ViewIsBuildingPalace = function()
 {
 var newGov = 'ikakratie';
 // values: ikakratie, aristokratie, demokratie
 
 if (this.Ikariam.Is_Version('0.4.4'))
  {
  var government_pic_img = this.DOM.Get_First_Node("//*[@class='government_pic']/img");
  var govRegExp = /\/([a-z]+)_280/.exec(government_pic_img.src);
  if (govRegExp != null)
   {
   newGov = '' + RegExp.$1;
   }
  }
  
 config.government = newGov;
 this.Log.Add('Government = '+config.government);
 };
 
EmpireBoard.ViewIsBuildingAcademy = function()
 {
 var _self = this;
 
 function reportAcademy()
  {
  setViewRqTime('finances');
  _self.DB.Save();
  }
 
 var n = document.getElementById("inputWorkersSubmit");
 n.addEventListener("click", reportAcademy, false);
 
 var city = getCity(city_idmainView);
 
 var n = document.getElementById("valueResearch");
 city.buildings["academy"].Research = this.Str.To_Integer(n.textContent);
 this.Log.Add('valueResearch = '+city.buildings["academy"].Research);
 
 var n = document.getElementById("valueWorkers");
 city.buildings["academy"].scientists = this.Str.To_Integer(n.textContent);
 this.Log.Add('valueWorkers(scientists) = '+city.buildings["academy"].scientists);
 };
 
EmpireBoard.ViewIsBuildingBranchOffice = function()
 {
 var city = getCity(city_idmainView);
 
 var reservedGold =  document.getElementById("reservedGold");
 if (reservedGold != null)
  {
  city.buildings["branchOffice"].reservedGold = this.Str.To_Integer(reservedGold.innerHTML, 0);
  }
 else
  {
  city.buildings["branchOffice"].reservedGold = 0;
  }
  
 // Fetch wood offer
 city.tradewood = 0;
 var selectElt = document.getElementById('resourceTradeType');
 if ((selectElt != null) && (selectElt.value == '444'))
  {
  var inputElt = document.getElementById('resource');
  if ((inputElt != null) && (inputElt.value != '') && (inputElt.value != '0'))
   {
   city.tradewood = this.Str.To_Integer(inputElt.value, 0);
   }
  }
  
 // Fetch wine offer
 city.tradewine = 0;
 var selectElt = document.getElementById('tradegood1TradeType');
 if ((selectElt != null) && (selectElt.value == '444'))
  {
  var inputElt = document.getElementById('tradegood1');
  if ((inputElt != null) && (inputElt.value != '') && (inputElt.value != '0'))
   {
   city.tradewine = this.Str.To_Integer(inputElt.value, 0);
   }
  }
  
 // Fetch marble offer
 city.trademarble = 0;
 var selectElt = document.getElementById('tradegood2TradeType');
 if ((selectElt != null) && (selectElt.value == '444'))
  {
  var inputElt = document.getElementById('tradegood2');
  if ((inputElt != null) && (inputElt.value != '') && (inputElt.value != '0'))
   {
   city.trademarble = this.Str.To_Integer(inputElt.value, 0);
   }
  }
  
 // Fetch crystal offer
 city.tradeglass = 0;
 var selectElt = document.getElementById('tradegood3TradeType');
 if ((selectElt != null) && (selectElt.value == '444'))
  {
  var inputElt = document.getElementById('tradegood3');
  if ((inputElt != null) && (inputElt.value != '') && (inputElt.value != '0'))
   {
   city.tradeglass = this.Str.To_Integer(inputElt.value, 0);
   }
  }
  
 // Fetch sulfur offer
 city.tradesulfur = 0;
 var selectElt = document.getElementById('tradegood4TradeType');
 if ((selectElt != null) && (selectElt.value == '444'))
  {
  var inputElt = document.getElementById('tradegood4');
  if ((inputElt != null) && (inputElt.value != '') && (inputElt.value != '0'))
   {
   city.tradesulfur = this.Str.To_Integer(inputElt.value, 0);
   }
  }
 };
 
EmpireBoard.ViewIsIslandResource = function()
 {
 var cityID = 0;
  
 cityID = this.DOM.Get_First_Node_Value("//form[@id='setWorkers']//input[@name='cityId']",0);
 if (cityID > 0)
  {
  var city = getCity(cityID);
  
  if (city.buildings["townHall"] == undefined) city.buildings["townHall"] = {};
  
  // Fetch wood workers
  var woodworkers = 0;
  var valueWorkers = document.getElementById("valueWorkers");
  if (valueWorkers != null) 
   {
   woodworkers = Number(valueWorkers.textContent);
   }
  
  city.buildings["townHall"].woodworkers = woodworkers;
  this.Log.Add('woodworkers (from Resource)='+woodworkers);
  }
 
 var _self = this;
 
 function reportResource()
  {
  setViewRqTime('finances');
  _self.DB.Save();
  }
 
 var n = document.getElementById("inputWorkersSubmit");
 if (n != null) 
  {
  n.addEventListener("click", reportResource, false);
  }
 };

EmpireBoard.ViewIsIslandTradeGood = function()
 {
 var cityID = 0;
  
 cityID = this.DOM.Get_First_Node_Value("//form[@id='setWorkers']//input[@name='cityId']",0);
 if (cityID > 0)
  {
  var city = getCity(cityID);
  
  if (city.buildings["townHall"] == undefined) city.buildings["townHall"] = {};
  
  // Fetch wood workers
  var specialworkers = 0;
  var valueWorkers = document.getElementById("valueWorkers");
  if (valueWorkers != null) 
   {
   specialworkers = Number(valueWorkers.textContent);
   }
  
  city.buildings["townHall"].specialworkers = specialworkers;
  this.Log.Add('specialworkers (from Resource)='+specialworkers);
  }
 
 var _self = this;
 
 function reportTradegood()
  {
  setViewRqTime('finances');
  _self.DB.Save();
  }
 
 var n = document.getElementById("inputWorkersSubmit");
 if (n != null)
  {
  n.addEventListener("click", reportTradegood, false);
  }
 };
  
EmpireBoard.ViewIsBuildingTavern = function()
 {
 var city = getCity(city_idmainView);
 
 // New method Thank  to TorfDrottel 
 var iniValue = 0;
 var scripts = document.getElementsByTagName("script");
 for (var j = 0; j < scripts.length; j++)
  {
  var nScript = scripts[j];
  var sCode = nScript.innerHTML;
  if (sCode.indexOf('create_slider') > 0)
   {
   iniValue = parseInt(/iniValue : (\d+)/.exec(sCode)[1])
   }
  }
 city.wineUsageId = iniValue;
 
 var savedWine = 0;
 if (unsafeWindow && unsafeWindow.savedWine)
  {
  savedWine = unsafeWindow.savedWine[iniValue];
  }
 if ((savedWine == '&nbsp;') || (savedWine == ''))
  {
  savedWine = 0;
  }
 savedWine = Math.round(parseFloat(savedWine));
 var wineUsage = tavernWineUsage[iniValue] - savedWine;
 city.wineUsage = wineUsage;
 
 this.Log.Add('Tavern: iniValue= '+iniValue+', savedWine='+savedWine+', wineUsage='+wineUsage);
 
 var _self = this;

 function storeWineUsage()
  {
  try
   {
   var city_id = _self.DOM.Get_First_Node_Value("//form[@id='wineAssignForm']/input[@type='hidden' and @name='id']");
   var city = getCity(city_id);
   var n = document.getElementById("wineAmount");
   
   var iniValue = n.selectedIndex;
   if (city.wineUsageId != iniValue)
    {
    setViewRqTime('townHall', city_id);
    }
   city.wineUsageId = iniValue;
   
   var savedWine = getSavedWine();
   var wineUsage = tavernWineUsage[iniValue] - savedWine;
   city.wineUsage = wineUsage;
   
   _self.Log.Add('Tavern: iniValue= '+iniValue+', savedWine='+savedWine+', wineUsage='+wineUsage);
   
   _self.DB.Save();
   }
  catch (e)
   {
   }
  }
  
 // Fix for v3
 function getSavedWine() 
  {
  try 
   {
   var n = document.getElementById("savedWine");
   if ((n.innerHTML != '&nbsp;') && (_self.Str.Trim(n.innerHTML) != ''))
    {
    return Math.round(parseFloat(n.innerHTML));
    }
   else return 0;
   }
  catch (e) 
   {
   return 0;
   }
  }
 
 // Soon deprecated
 var n = this.DOM.Get_First_Node("//form[@id='wineAssignForm']//*[@type='submit']");
 n.addEventListener("click", storeWineUsage, false);
 };

EmpireBoard.ViewIsBuildingTownHall = function()
 {
 var city = getCity(city_idmainView);
 
 if (city.buildings["townHall"] == undefined) city.buildings["townHall"] = {};

 var population = 0;
 population = Number(this.DOM.Get_First_Node_TextContent("//li[contains(@class, 'space')]/span[contains(@class, 'occupied')]", "0"));
 city.buildings["townHall"].population = population;
 //city.population = population; // Soon deprecated
 
 // May use happiness than growth...
 city.buildings["townHall"].growth = this.Str.To_Float(this.DOM.Get_First_Node_TextContent("//li[contains(@class, 'growth')]/span[@class='value']", "0"),'?',this.Ikariam.LocalizationStrings('decimalPoint'));
 this.Log.Add('Growth (from TownHall)='+city.buildings["townHall"].growth);
 
 city.buildings["townHall"].happiness  = Number(this.DOM.Get_First_Node_TextContent("//div[contains(@class, 'happiness')]/div[@class='value']", "0")) + city.buildings["townHall"].population;

 city.buildings["townHall"].bonusspace = Number(this.DOM.Get_First_Node_TextContent("//li[contains(@class, 'space')]/span[contains(@class, 'total')]", "0")) - townHallSpaces[getBuildingLevel(city_idmainView, 'townHall', 1, 0)];
 
 // Fetch citizens
 var citizens = 0;
 citizens = Number(this.DOM.Get_First_Node_TextContent("//div[contains(@class, 'citizens')]//span[@class='count']", "0"));
 city.buildings["townHall"].citizens = citizens;
 this.Log.Add('citizens (from TownHall)='+citizens);
 
 // Fetch wood workers
 var woodworkers = 0;
 woodworkers = Number(this.DOM.Get_First_Node_TextContent("//div[contains(@class, 'woodworkers')]//span[@class='count']", "0"));
 city.buildings["townHall"].woodworkers = woodworkers;
 this.Log.Add('woodworkers (from TownHall)='+woodworkers);
 
 // Fetch good workers
 var specialworkers = 0;
 specialworkers = Number(this.DOM.Get_First_Node_TextContent("//div[contains(@class, 'specialworkers')]//span[@class='count']", "0"));
 city.buildings["townHall"].specialworkers = specialworkers;
 this.Log.Add('specialworkers (from TownHall)='+specialworkers);
 
 // Fetch scientist
 var scientists = 0;
 scientists = Number(this.DOM.Get_First_Node_TextContent("//div[contains(@class, 'scientists')]//span[@class='count']", "0"));
 if ((scientists > 0) || (city.buildings["academy"] != undefined))
  {
  if (city.buildings["academy"] == undefined) city.buildings["academy"] = {};
  city.buildings["academy"].scientists = scientists;
  }
 this.Log.Add('scientists (from TownHall)='+scientists);
 
 // Fetch priests
 if (this.Ikariam.Is_Version('0.3.2') == true)
  {
  var priests = 0;
  priests = Number(this.DOM.Get_First_Node_TextContent("//div[contains(@class, 'priests')]//span[@class='count']", "0"));
  if ((priests > 0) || (city.buildings["temple"] != undefined))
   {
   if (city.buildings["temple"] == undefined) city.buildings["temple"] = {};
   city.buildings["temple"].priests = priests;
   }
  this.Log.Add('priests (from TownHall)='+priests);
  }

 var citizensProd = 0;
 citizensProd = this.Str.To_Integer(this.DOM.Get_First_Node_TextContent("//div[@class='citizens']/span[@class='production']", "0"),0);
 city.buildings["townHall"].citizensProd = citizensProd;
 this.Log.Add('citizensProd (from TownHall)='+citizensProd);
 
 if (this.Ikariam.Is_Version('0.3.5') == true)
  {
  
  }
 else
  {
  var incomegold = 0;
  incomegold = Number(this.DOM.Get_First_Node_TextContent("//li[contains(@class, 'incomegold')]/span[@class='value']", "0"));
  city.buildings["townHall"].incomegold = incomegold;
  this.Log.Add('IncomeGold (from TownHall)='+incomegold);

  var upkeep = citizensProd - incomegold;
  city.buildings["townHall"].upkeep = upkeep;
  this.Log.Add('Upkeep (from TownHall)='+upkeep);
  }
 };
 
EmpireBoard.ViewIsDiplomacyAdvisorTreaty = function()
 {
 
 };
 
EmpireBoard.ViewIsResearchAdvisor = function()
 {
 var _self = this;
 
 function reportResearch()
  {
  setViewRqTime('researchOverview');
  _self.DB.Save();
  }
 
 var rButtons = this.DOM.Get_Nodes("//ul[@class='researchTypes']//div[@class='researchButton']//a[contains(@class, 'build')]");
 this.Log.Add("Research buttons: "+rButtons.snapshotLength);
 if (rButtons.snapshotLength > 0)
  {
  for (var i=0; i < rButtons.snapshotLength; i++)
   {
   var rButton = rButtons.snapshotItem(i);
   //rButton.href='';
   rButton.addEventListener("click", reportResearch, false);
   }
  }
 };

// Thank to matteo466
EmpireBoard.ViewIsResearchOverview = function()
 {
 this.Log.Add('Fetch discovered research...');
 
 config["research"] = {};
 
 var LIs = this.DOM.Get_Nodes("//div[@id='mainview']//div[contains(@class, 'content')]//li[@class='explored']");
 this.Log.Add("Research explored: "+LIs.snapshotLength);
 if (LIs.snapshotLength > 0)
  {
  for (var i=0; i < LIs.snapshotLength; i++)
   {
   var researchLI = LIs.snapshotItem(i);
   var researchA = researchLI.getElementsByTagName("a")[0];
   var resReg = /[\?&]{1}researchId=([0-9]+)&?/i.exec(researchA.href);
   if (resReg != null)
    {
    var researchID = parseInt(resReg[1]);
    var researchLevel = this.Str.To_Integer(researchA.textContent.replace(/\-/g, ""),1);
    
    this.Log.Add("Found research: "+researchID+', level '+researchLevel);
    
    config["research"][researchID] = {};
    config["research"][researchID].Explored = true;
    config["research"][researchID].Level = researchLevel;
    }
   }
  }
 
 function isExplored(researchID)
  {
  if ((config["research"][researchID] != undefined) && (config["research"][researchID].Explored == true))
   return true;
  else
   return false;
  }
 
 var FleetUpkeepBonus = 0;
 if (isExplored(1020)) FleetUpkeepBonus += 2;
 if (isExplored(1050)) FleetUpkeepBonus += 4;
 if (isExplored(1090)) FleetUpkeepBonus += 8;
 if (isExplored(1999))
  {
  FleetUpkeepBonus += 2*config["research"][1999].Level;
  }
 this.Log.Add("FleetUpkeepBonus: "+FleetUpkeepBonus);
 config["research"].FleetUpkeepBonus = FleetUpkeepBonus;
 
 var ArmyUpkeepBonus = 0;
 if (isExplored(4020)) ArmyUpkeepBonus += 2;
 if (isExplored(4050)) ArmyUpkeepBonus += 4;
 if (isExplored(4090)) ArmyUpkeepBonus += 8;
 if (isExplored(4999))
  {
  ArmyUpkeepBonus += 2*config["research"][4999].Level;
  }
 this.Log.Add("ArmyUpkeepBonus: "+ArmyUpkeepBonus);
 config["research"].ArmyUpkeepBonus = ArmyUpkeepBonus;
 
 var ResearchCost = 6;
 if (isExplored(3110)) ResearchCost -= 3;
 this.Log.Add("ResearchCost: "+ResearchCost);
 config["research"].ResearchCost = ResearchCost;
 
 var ResearchBonus = 0;
 if (isExplored(3020)) ResearchBonus += 2;
 if (isExplored(3050)) ResearchBonus += 4;
 if (isExplored(3090)) ResearchBonus += 8;
 if (isExplored(3999))
  {
  ResearchBonus += 2*config["research"][3999].Level;
  }
 this.Log.Add("ResearchBonus: "+ResearchBonus);
 config["research"].ResearchBonus = ResearchBonus;
 
 config["research"].uptime = this.StartTime;
 };
 
EmpireBoard.ViewIsPremium = function()
 {
 if (config["premium"] == undefined) config["premium"] = {};
 
 var TRs = this.DOM.Get_Nodes("//div[@id='premiumOffers']//table[contains(@class, 'TableHoriMax')]//tr");
 this.Log.Add("premiumOffers rows: "+TRs.snapshotLength);
 
 // array of TR index per features
 var premiumOffers = {};
 if (this.Ikariam.Is_Version('0.4.4'))
  {
  premiumOffers['account']     = 2;
  premiumOffers['woodbonus']     = 7;
  premiumOffers['marblebonus']    = 10;
  premiumOffers['sulfurbonus']    = 13;
  premiumOffers['crystalbonus']    = 16;
  premiumOffers['winebonus']     = 19;
  premiumOffers['savecapacityBonus']   = 22;
  premiumOffers['storagecapacityBonus']  = 25;
  }
 else if (this.Ikariam.Is_Version('0.4.2'))
  {
  premiumOffers['account']     = 2;
  premiumOffers['savecapacityBonus']   = 20;
  premiumOffers['storagecapacityBonus']  = 23;
  }
 
 var featureId;
 for (featureId in premiumOffers)
  {
  var TrNo = premiumOffers[featureId];
  var TDstatus = TRs.snapshotItem(TrNo).getElementsByTagName("td")[0];
  if (this.DOM.Has_ClassName(TDstatus,'active') == true)
   {
   var remainingTime = 60*60*1000; // set minimal remaining time if fail to fetch time counter
   var remainingText = TDstatus.textContent;
   var regExp = new RegExp("([0-9])\\s+([a-z])", "ig");
   var RegExpRes = regExp.exec(remainingText);
   if (RegExpRes != null)
    {
    var timeValue = parseInt(RegExpRes[1]);
    var timeUnit = RegExpRes[2];
    
    if (timeUnit == this.Ikariam.LocalizationStrings('day','timeunits','short'))
     {
     remainingTime = timeValue*24*60*60*1000;
     }
    else if (timeUnit == this.Ikariam.LocalizationStrings('hour','timeunits','short'))
     {
     remainingTime = timeValue*60*60*1000;
     }
    else if (timeUnit == this.Ikariam.LocalizationStrings('minute','timeunits','short'))
     {
     remainingTime = timeValue*60*1000;
     }
    else if (timeUnit == this.Ikariam.LocalizationStrings('second','timeunits','short'))
     {
     remainingTime = timeValue*1000;
     }
    else
     {
     remainingTime = 24*60*60*1000;
     }
    }
   else
    {
    remainingTime = 24*60*60*1000;
    }
   config["premium"][featureId] = this.StartTime + remainingTime;
   setViewRqTime('premium',0,this.StartTime + remainingTime);
   this.Log.Add("premium["+featureId+"]: remainingTime="+remainingTime+", timeValue="+timeValue+", timeUnit="+timeUnit);
   }
  }
 
 config["premium"].uptime = this.StartTime;
 };
 
EmpireBoard.ViewIsActionTransport = function()
 {
 // Todo
 };
 
EmpireBoard.ViewIsActionDeployment = function()
 {
 var self = this;
 
 var dSubmit = this.DOM.Get_First_Node("//form[@id='deploymentForm']//input[@type='submit']");
 dSubmit.addEventListener("click", function(e) { self.Handlers.Deployment_Submit_Event(e); }, false);
 };
 
EmpireBoard.ViewIsActionPlunder = function()
 {
 // Todo
 };
 
EmpireBoard.ViewIsActionBlockade = function()
 {
 // Todo
 };
 
EmpireBoard.ViewIsActionOccupy = function()
 {
 // Todo
 };
 
EmpireBoard.ViewIsActionDefendCity = function()
 {
 // Todo
 };
 
EmpireBoard.ViewIsActionDefendPort = function()
 {
 // Todo
 };
 
EmpireBoard.ViewIsMerchantNavy = function()
 {
 var _self = this;
 var MerchantTimes = {};
 this.Ikariam.Fetch_MerchantNavy_Boxes(this.DB.MerchantBoxes, true);
 this.Ikariam.Fetch_TimeCounters(MerchantTimes,'getCountdown');
 
 config["transports"] = {};
 
 function addTransport(cityID, transportID, endTime)
  {
  if (config["transports"][cityID] == undefined) config["transports"][cityID] = {};
  if (config["transports"][cityID][transportID] == undefined) config["transports"][cityID][transportID] = {};
  config["transports"][cityID][transportID].endTime = endTime;
  
  _self.Log.Add('Transport['+transportID+'] from oCityId='+cityID+' while '+_self.Str.FormatRemainingTime(endTime-_self.StartTime));
  }
 
 var boxId;
 for (boxId in this.DB.MerchantBoxes)
  {
  if (this.DB.MerchantBoxes[boxId].missions != undefined)
   {
   var missionId;
   for (missionId in this.DB.MerchantBoxes[boxId].missions)
    {
    var oCityId = this.DB.MerchantBoxes[boxId].missions[missionId].oCityId;
    if (oCityId > 0)
     {
     var endTime = 0;
     
     var ETA = this.DB.MerchantBoxes[boxId].missions[missionId].ETA;
     var ETAtime = 0;
     if ((ETA != '') && (MerchantTimes[ETA] != undefined))
      {
      ETAtime = this.StartTime + (MerchantTimes[ETA].enddate - MerchantTimes[ETA].currentdate);
      }
     if (ETAtime > 0) endTime = ETAtime;
      
     var RETtime = 0;
     var RET = this.DB.MerchantBoxes[boxId].missions[missionId].RET;
     if ((RET != '') && (MerchantTimes[RET] != undefined))
      {
      RETtime = this.StartTime + (MerchantTimes[RET].enddate - MerchantTimes[RET].currentdate);
      }
     if ((RETtime > 0) && (RETtime > endTime)) endTime = RETtime;
     
     if (endTime <= 0)
      endTime = this.StartTime + (1 * 20 * 60 * 1000);
     
     addTransport(oCityId, missionId, endTime);
     }
    }
   }
  }
 };
 
EmpireBoard.ViewIsMilitaryMovements = function()
 {
 config["movements"] = {};
 function addMovement(cityID, movementID, FleetMovement)
  {
  if (config["movements"][cityID] == undefined) config["movements"][cityID] = {};
  if (config["movements"][cityID][movementID] == undefined) config["movements"][cityID][movementID] = {};

  config["movements"][cityID][movementID] = FleetMovement;
  config["movements"][cityID][movementID].endTime = FleetMovement.time;
  }
  
 config["attacks"] = {};
 function addAttacks(cityID, movementID, FleetMovement)
  {
  if (config["attacks"][cityID] == undefined) config["attacks"][cityID] = {};
  if (config["attacks"][cityID][movementID] == undefined) config["attacks"][cityID][movementID] = {};

  config["attacks"][cityID][movementID] = FleetMovement;
  config["attacks"][cityID][movementID].endTime = FleetMovement.time;
  }
 
 config["foreignTransports"] = {};
 function addForeignTransport(cityID, movementID, FleetMovement)
  {
  if (config["foreignTransports"][cityID] == undefined)
   config["foreignTransports"][cityID] = {};
  if (config["foreignTransports"][cityID][movementID] == undefined)
   config["foreignTransports"][cityID][movementID] = {};

  config["foreignTransports"][cityID][movementID] = FleetMovement;
  config["foreignTransports"][cityID][movementID].endTime = FleetMovement.time;
  }
 
 this.Ikariam.Fetch_FleetMovements(this.DB.FleetMovements);
 
 var resMi = this.DOM.Get_Nodes("//div[@id='fleetMovements']//table[contains(@class, 'locationEvents')]/tbody/tr/td/img[contains(@src, 'mission_')]");
 if (resMi.snapshotLength > 0)
  {
  for (var i=0; i < resMi.snapshotLength; i++)
   {
   var tr = resMi.snapshotItem(i).parentNode.parentNode;
   var tds = tr.getElementsByTagName("td");
   //var tds = tr.childNodes;
    
   var fleetId = tds[1].id;
   
   if ((fleetId != '') && (this.DB.FleetMovements[fleetId] != undefined))
    {
    var FleetMovement = this.DB.FleetMovements[fleetId];
    var toOwn = false;
    if ((this.DB.CurrentCities[FleetMovement.tCityId] != undefined) && (FleetMovement.tCityId != FleetMovement.oCityId) && (this.DB.CurrentCities[FleetMovement.tCityId].own == true))
     {
     toOwn = true;
     }
    
    // Values: deployarmy, deployfleet, plunder, blockade, defend, defend_port, trade, transport, occupy
    if (FleetMovement.hostile == true)
     {
     addAttacks(FleetMovement.tCityId, fleetId, FleetMovement);
     }
    else if (FleetMovement.own == true)
     {
     if (FleetMovement.mission == 'trade')
      {
      // Not military movement
      }
     else if (FleetMovement.mission == 'transport')
      {
      // Not military movement
      if ((FleetMovement.hasAction == true) && (FleetMovement.hasGoods == true) && (FleetMovement.toLeft == false) && (FleetMovement.toRight == false) && (toOwn == true))
       {
       setViewRqTime('merchantNavy',0,FleetMovement.time);
       }
      }
     else if (FleetMovement.mission == 'deployarmy')
      {
      addMovement(FleetMovement.oCityId, fleetId, FleetMovement);
      
      if ((FleetMovement.toRight == true) && (toOwn == true))
       {
       this.Log.Add("Army "+fleetId+" will arrive to city["+FleetMovement.tCityId+"]");
       setViewRqTime('cityMilitary-army', FleetMovement.tCityId, FleetMovement.time);
       }
      else if (FleetMovement.toLeft == true)
       {
       this.Log.Add("Army "+fleetId+" come back to city["+FleetMovement.oCityId+"]");
       setViewRqTime('cityMilitary-army', FleetMovement.oCityId, FleetMovement.time);
       }
      }
     else if (FleetMovement.mission == 'deployfleet')
      {
      addMovement(FleetMovement.oCityId, fleetId, FleetMovement);
      
      if ((FleetMovement.toRight == true) && (toOwn == true))
       {
       this.Log.Add("Fleet "+fleetId+" will arrive to city["+FleetMovement.tCityId+"]");
       setViewRqTime('cityMilitary-fleet', FleetMovement.tCityId, FleetMovement.time);
       }
      else if (FleetMovement.toLeft == true)
       {
       this.Log.Add("Fleet "+fleetId+" come back to city["+FleetMovement.oCityId+"]");
       setViewRqTime('cityMilitary-fleet', FleetMovement.oCityId, FleetMovement.time);
       }
      }
     else if (FleetMovement.mission == 'plunder')
      {
      addMovement(FleetMovement.oCityId, fleetId, FleetMovement);
      
      if ((FleetMovement.hasGoods == true) && (FleetMovement.toLeft == false) && (FleetMovement.toRight == false))
       {
       setViewRqTime('merchantNavy',0,FleetMovement.time);
       }
      }
     else if (FleetMovement.mission == 'blockade')
      {
      addMovement(FleetMovement.oCityId, fleetId, FleetMovement);
      }
     else
      {
      addMovement(FleetMovement.oCityId, fleetId, FleetMovement);
      }
     }
    else
     {
     if (FleetMovement.mission == 'trade')
      {
      if ((toOwn == true) && (FleetMovement.toRight == true))
       {
       this.Log.Add("Foreign trade "+fleetId+" arrive to city["+FleetMovement.tCityId+"] "+this.Str.FormatRemainingTime(FleetMovement.time - EmpireBoard.StartTime));
       setViewRqTime('branchOffice', FleetMovement.tCityId, FleetMovement.time);
       addForeignTransport(FleetMovement.tCityId, fleetId, FleetMovement);
       }
      }
     else if (FleetMovement.mission == 'transport')
      {
      if ((toOwn == true) && (FleetMovement.toRight == true))
       {
       this.Log.Add("Foreign transport "+fleetId+" arrive to city["+FleetMovement.tCityId+"] "+this.Str.FormatRemainingTime(FleetMovement.time - EmpireBoard.StartTime));
       setViewRqTime('', FleetMovement.tCityId, FleetMovement.time);
       addForeignTransport(FleetMovement.tCityId, fleetId, FleetMovement);
       }
      }
     }
    }
   }
  }
  
 config.mAMMtime = this.StartTime;
 };
 
EmpireBoard.ViewIsBuildingWorkshop = function()
 {
 var scripts = document.getElementsByTagName("script");
 var found = false;
 var sCode = '';
 for (var j = 0; j < scripts.length; j++)
  {
  // search upgradeCountDown
  var nScript = scripts[j];
  sCode = nScript.innerHTML;
  if (sCode.indexOf('upgradeCountdown') >= 0)
   {
   found = true;
   break;
   }
  }
 if (found == true)
  {
  // buildings under upgrading
  var enddate = 0;
  var currentdate = 0;
  if (/enddate[^0-9]*([0-9]+)/.exec(sCode) != null)
   {
   enddate = parseFloat(RegExp.$1) * 1000; 
   }
  if (/currentdate[^0-9]*([0-9]+)/.exec(sCode) != null)
   {
   currentdate = parseFloat(RegExp.$1) * 1000; 
   }
  if (enddate != 0 && currentdate != 0)
   {
   setViewRqTime('workshop', city_idmainView, this.StartTime + (enddate - currentdate), true);
   this.Log.Add('Workshop upgrade remaining time: '+enddate+' - '+currentdate+' = '+(enddate-currentdate)/1000+'s');
   }
  }
 };
 
EmpireBoard.DB =
 {
 _Parent:    null,
 Prefix:     '',
 CurrentCities:   {},
 FleetMovements:   {},
 MerchantBoxes:   {},
 Options:    {}
 };

EmpireBoard.DB.Init = function(parent, host)
 {
 this._Parent = parent;
 if (host == undefined) host = this._Parent.Ikariam.Host();
 
 var prefix = host;
 prefix = prefix.replace('.ikariam.', '-');
 prefix = prefix.replace('.', '-');
 this.Prefix = prefix;
 };
  
EmpireBoard.DB.Serialize = function(data)
 {
 return uneval(data);
 };

EmpireBoard.DB.UnSerialize = function(data)
 {
 return eval(data);
 };
 
function getVar(varname, vardefault) {
  var res = GM_getValue(EmpireBoard.Ikariam.Host()+varname);
  if (res == undefined) {
    return vardefault;
  }
  return res;
}

function setVar(varname, varvalue) {
  GM_setValue(EmpireBoard.Ikariam.Host()+varname, varvalue);
}

EmpireBoard.DB.Load = function()
 {
 config = this.UnSerialize(getVar("config", ""));
 if (config == null || config == undefined || config == "" || ("".config == "NaN"))
  {
  config = new Object();
  }
 
 // Set dbversion for migrate agent
 if (config["dbversion"] == undefined)   config["dbversion"]  = this._Parent.Version-1;
 
 // Check if main arrays exists
 if (config["unitnames"] == undefined)    config["unitnames"]    = {};
 if (config["upkeeps"] == undefined)     config["upkeeps"]     = {};
 if (config["arrivinggoods"] == undefined)   config["arrivinggoods"]   = {};
 if (config["movements"] == undefined)    config["movements"]    = {};
 if (config["attacks"] == undefined)     config["attacks"]     = {};
 if (config["transports"] == undefined)    config["transports"]    = {};
 if (config["foreignTransports"] == undefined)  config["foreignTransports"]  = {};
 if (config["research"] == undefined)    config["research"]     = {};
 if (config["premium"] == undefined)     config["premium"]     = {};
 
 if (config["dbversion"] < this._Parent.Version)
  {
  this.MigrateAgent();
  }
 };
 
EmpireBoard.DB.MigrateAgent = function()
 {
 this._Parent.Log.Add('Apply Migrate Agent to DB v. '+config["dbversion"]);
 
 config["dbversion"] = this._Parent.Version;
 };
 
EmpireBoard.DB.GarbageCollector = function()
 {
 var ConfigIds = '';
 var ConfigId;
 for (ConfigId in config)
  {
  var toDelete = false;
  switch(ConfigId)
   {
   case 'unitnames':
   case 'upkeeps':
   case 'movements':
   case 'attacks':
   case 'transports':
   case 'foreignTransports':
   case 'research':
   case 'premium':
   case 'gold':
   case 'merchantNavyrqtime':
   case 'merchantNavytime':
   case 'financestime':
   case 'financesrqtime':
   case 'mAMMtime':
   case 'mAMMrqtime':
   case 'government':
   case 'totalCulturalGoods':
   case 'dbversion':
    toDelete = false;
    break;
   
   case 'arrivinggoods':
    var oCityId;
    for (oCityId in config['arrivinggoods'])
     {
     if (this.CurrentCities[oCityId] == undefined)
      {
      if (delete config['arrivinggoods'][oCityId])
       this._Parent.Log.Add('Garbage collector has removed arrivinggoods of unkown city['+oCityId+']');
      }
     }
    toDelete = false;
    break;
 
   case 'cfg':
    toDelete = true;
    break;
   
   default:
    // Check if old city
    var CityId = this._Parent.Str.To_Integer(ConfigId,'NaN');
    if (CityId != 'NaN')
     {
     if (this.CurrentCities[CityId] == undefined)
      {
      toDelete = true;
      }
     else
      {
      toDelete = false;
      
      // deprecated attributes
      var ConfigSubIds = '';
      var ConfigSubId;
      var unkownConfigSubIds = '';
      for (ConfigSubId in config[ConfigId])
       {
       var subToDelete = false;
       switch(ConfigSubId)
        {
        case 'city_name':
        case 'city_coord':
        case 'island_id':
        case 'actions':
        case 'citytime':
        case 'rqtime':
        case 'wood':
        case 'wine':
        case 'marble':
        case 'glass':
        case 'sulfur':
        case 'prodwood':
        case 'prodwine':
        case 'prodmarble':
        case 'prodglass':
        case 'prodsulfur':
        case 'prodgood':
        case 'prodtime':
        case 'tradewood':
        case 'tradewine':
        case 'trademarble':
        case 'tradeglass':
        case 'tradesulfur':
        case 'wineUsageId':
        case 'wineUsage':
        case 'buildings':
        case 'underConstructionName':
        case 'underConstructionPosition':
        case 'underConstructionTime':
        case 'units':
        case 'cityMilitaryarmytime':
        case 'cityMilitaryarmyrqtime':
        case 'cityMilitaryfleettime':
        case 'cityMilitaryfleetrqtime':
         subToDelete = false;
         break;
         
        case 'crystal':
        case 'underConstruction':
        case 'population':
        case 'citizens':
         subToDelete = true;
         break;
        
        default:
         unkownConfigSubIds += ' '+ConfigSubId;
         break;
        }
       if (subToDelete == true)
        {
        if (delete config[ConfigId][ConfigSubId])
         ConfigSubIds += ' '+ConfigSubId;
        }
       }
      if (ConfigSubIds != '') this._Parent.Log.Add('Garbage collector has removed city['+ConfigId+'] properties:'+ConfigSubIds);
      if (unkownConfigSubIds != '') this._Parent.Log.Add('Garbage collector has detected unknown city['+ConfigId+'] objects:'+unkownConfigSubIds);
      }
     }
    else
     {
     this._Parent.Log.Add('Garbage collector has detected unknown object: '+ConfigId);
     }
    break;
   }
  
  if (toDelete == true)
   {
   if (delete config[ConfigId])
    ConfigIds += ' '+ConfigId;
   }
  }
 
 if (ConfigIds != '') this._Parent.Log.Add('Garbage collector has removed array:'+ConfigIds);
 };

EmpireBoard.DB.Save = function()
 {
 setVar("config", this.Serialize(config));
 };

EmpireBoard.DB.Load_Options = function()
 {
 this.Options = this.UnSerialize(GM_getValue(this.Prefix+'.Opt', false)) || {};
 
 if (this.Options.Prefs == undefined)      this.Options.Prefs = {};
 if (this.Options.Prefs.TABLE_RESOURCES == undefined)  this.Options.Prefs.TABLE_RESOURCES = true;
 if (this.Options.Prefs.TABLE_BUILDINGS == undefined)  this.Options.Prefs.TABLE_BUILDINGS = true;
 if (this.Options.Prefs.TABLE_ARMYFLEET == undefined)  this.Options.Prefs.TABLE_ARMYFLEET = true;
 if (this.Options.Prefs.PROGRESS_BAR_MODE == undefined)  this.Options.Prefs.PROGRESS_BAR_MODE = 'time';
 if (this.Options.Prefs.LANGUAGE == undefined)    this.Options.Prefs.LANGUAGE = '';
 };

EmpireBoard.DB.Save_Options = function()
 {
 GM_setValue(this.Prefix+'.Opt', this.Serialize(this.Options));
 };
 
EmpireBoard.Renders =
 {
 _Parent:    null
 };

EmpireBoard.Renders.Init = function(parent)
 {
 this._Parent = parent;
 };
 
function createLink(text, href, attrs)
 {
 return "<a href=\""+href+"\" "+attrs+">"+text+"</a>";
 }

EmpireBoard.Renders.Buildings_Table_Content = function()
 {
 var s = '';
 var Cities = this._Parent.DB.CurrentCities;
 
 // Array use to group buildings
 var orderedBuildings = this._Parent.Ikariam.BuildingsList();
 
 function getBuildingCount(city_id, name, defaultValue)
  {
  if (defaultValue == undefined) defaultValue = 0;
  var count = 0;
  var city = getCity(city_id);
  
  if ((city.buildings == undefined) || (city.buildings[name] == undefined))
   {
   if (name == 'townHall') count = 1;
   }
  else if (city.buildings[name].levels != undefined)
   {
   var p;
   for (p in city.buildings[name].levels)
    {
    count++;
    }
   }
  else if (city.underConstructionName == name)
   {
   count = 1;
   }
  
  if (count == 0) count = defaultValue;
  return count;
  }
 
 // Search buildings used
 var CityId;
 var buildingsCount = [];
 for (CityId in Cities)
  {
  if (Cities[CityId].own != true) continue;
  for (key in orderedBuildings)
   {
   var count = getBuildingCount(CityId, key, 0);
   if (buildingsCount[key] == undefined || buildingsCount[key] < count)
    {
    buildingsCount[key] = count;
    }
   }
  }
 
 s += "<table class='Overview Buildings'>";
 
 // Table header
 s += "<thead><tr><th class='nolf city_name' nowrap>"+this._Parent.Intl.TT("cityName")+"</th>";
 s += "<th class='actions' nowrap>"+this.Buildings_HeaderIcons(current_city_id)+"</th>";
 var firstStyle = '';
 var buildsNum = 0;
 var lastTopic = '';
 for (key in orderedBuildings) 
  {
  if (buildingsCount[key] > 0)
   {
   var colspan = (buildingsCount[key] > 1) ? ' colspan='+buildingsCount[key] : '';
   if (lastTopic != orderedBuildings[key]) { firstStyle = "lf"; } else { firstStyle = ""; }
   s += "<th"+colspan+" building='"+key+"' class='"+firstStyle+" build_name build_name"+buildingsCount[key]+" "+key+"' nowrap>"+
    this._Parent.Intl.TT(key,'buildings_short')+
    "</th>";
   lastTopic = orderedBuildings[key];
   buildsNum++;
   }
  }
 if (buildsNum <= 1) s += "<th class='lf'></th><th></th><th></th><th></th><th></th><th></th>";
 s += "</tr></thead>";
 
 s += "<tbody>";
 
 function createLinkToCityView(city_id)
  {
  var rHTML = '';
  rHTML += '<a href="?view=city&cityId='+city_id+'" class="changeCity" cityid="'+city_id+'" title="View city"><img align="absmiddle" src="skin/layout/icon-city2.gif" /></a>';
  if (reportViewToSurvey('city', city_id) == '!')
   {
   rHTML += '<sup class=Red title="Require attention">!</sup>';
   }
  else
   {
   rHTML += '&nbsp;';
   }
  return rHTML;
  }

 function getBuildingLink(city_id, name, defaultValue, position)
  {
  if (defaultValue == undefined) defaultValue = '';
  if (position == undefined)
   {
   position = -1;
   if (name == 'townHall') position = 0;
   }
  var link = '';
  
  if (position == -1)
   {
   // will deprecated
   var city = getCity(city_id);
   link = getArrValue(city.buildings[name], "link", defaultValue);
   }
  else
   {
   link = '?view='+name+'&id='+city_id+'&position='+position;
   }
  
  if (link == '') link = defaultValue;
  return link;
  }

 var CityId;
 var i = 0;
 var odd = '';
 for (CityId in Cities)
  {
  if (Cities[CityId].own != true) continue;
  var city = getCity(CityId);
  
  var trclass = (parseInt(current_city_id) == parseInt(CityId)) ? "current" : "";
  s += "<tr class='"+odd+" "+trclass+"' cityid='"+CityId+"' islandid='"+city.island_id+"' coord='"+city.city_coord+"'>";
  
  var usedspaces = getCityBuildingsCount(CityId, 0);
  s += "<td class='nolf city_name' nowrap>"+createLinkToChangeCity(Cities[CityId].name, CityId, i, (usedspaces > 0) ? 15-usedspaces : '', 'Green', 'Available free spaces')+"</td>";
  s += "<td class='actions' nowrap>"+createLinkToCityView(CityId)+"</td>";
  
  var firstStyle = '';
  var lastTopic = '';
  for (key in orderedBuildings)
   {
   if (buildingsCount[key] > 0)
    {
    if (lastTopic != orderedBuildings[key]) { firstStyle = "lf"; } else { firstStyle = ""; }
    
    var buildingCount = 0;
    if (city.buildings[key] != undefined)
     {
     if (city.buildings[key].levels == undefined)
      {
      // soon deprecated
      city.buildings[key].levels = {};
      var position = getBuildingPosition(parseInt(CityId), key, -1);
      var level = getBuildingLevel(parseInt(CityId), key, 0, position);
      city.buildings[key].levels[position] = level;
      }
     
     var position;
     for (position in city.buildings[key].levels)
      {
      var currentBuildingStyle = "";
      if ((key == this._Parent.Ikariam.View()) && (parseInt(CityId) == city_idmainView) && (position == city_positionmainView))
       {
       currentBuildingStyle = " Bold current";
       }

      var level = getBuildingLevel(parseInt(CityId), key, '-', position);
      if (level == undefined || level == "" || level == 0)
       {
       level = "-";
       }

      var link = getBuildingLink(parseInt(CityId), key, '-', position);

      if ((city.underConstructionName == key) && (city.underConstructionPosition == position))
       {
       if (level == "-") { level = 0; }
       var underConstructionTime = city.underConstructionTime;
       // deprecated
       //if (underConstructionTime == undefined) underConstructionTime = city.underConstruction.split(",")[1];
       var sdate = smartDateFormat(underConstructionTime);
       if (underConstructionTime <= this._Parent.StartTime)
        {
        var levellink = level;
        if (link != "-")
         levellink = "<a href='" + link + "' class=\"changeCity Green Bold\" cityid="+CityId+">"+level+"</a>";
        levellink += '<sup class=Red title="Require attention">!</sup>';
        levelUpgrading = createTooltip(levellink, '<nobr>'+sdate+'</nobr>', this._Parent.Intl.TT("finishedBuilding")+':' );
        }
       else
        {
        var counter = "<font id='mytimecounter' counter='"+Math.round(underConstructionTime)+"' class='time_counter'>___:___:___</font>";
        var levellink =level+"&raquo;"+(level+1);
        if (link != "-")
         levellink = "<a href='" + link + "' class=\"changeCity Green Bold\" cityid="+CityId+">"+level+"&raquo;"+(level+1)+"</a>";
        if ((level > 0) && (reportViewToSurvey(key, CityId) == '!'))
         {
         levellink += '<sup class=Red title="Require attention">!</sup>';
         }
        else
         {
         levellink += '&nbsp;';
         }
        levelUpgrading = createTooltip(levellink, '<nobr>'+sdate +' ('+ counter+')</nobr>', this._Parent.Intl.TT("currentlyBuilding")+':');
        }
       s += "<td level='"+level+"' view='"+key+"' position='"+position+"' class='"+firstStyle+" "+key+" "+currentBuildingStyle+"'>"+levelUpgrading+"</td>";
       }
      else
       {
       var levellink =level;
       if (level != "-")
        {
        levellink = "<a href='" + link + "' class=changeCity cityid="+CityId+">"+level+"</a>";
        
        if (reportViewToSurvey(key, CityId) == '!')
         {
         levellink += '<sup class=Red title="Require attention">!</sup>';
         }
        else
         {
         levellink += '&nbsp;';
         }
        }
       else
        {
        levellink += '&nbsp;';
        }
       s += "<td level='"+level+"' view='"+key+"' position='"+position+"' class='"+firstStyle+" "+key+" "+currentBuildingStyle+"'>"+levellink+"</td>";
       }
      buildingCount++;
      firstStyle = 'lfdash';
      }
     }
    else
     {
     s += "<td level='0' view='"+key+"' class='"+firstStyle+" "+key+"'>-&nbsp;</td>";
     buildingCount++;
     firstStyle = '';
     }

    if (buildingCount < buildingsCount[key])
     {
     for (var j = buildingCount; j < buildingsCount[key]; j++)
      {
      s += "<td level='0' view='"+key+"' class='"+firstStyle+" "+key+"'>-&nbsp;</td>";
      firstStyle = 'lfdash';
      }
     }

    lastTopic = orderedBuildings[key];
    }
   }
  
  if (buildsNum <= 1) s += "<td class='lf'></td><td></td><td></td><td></td><td></td><td></td>";
  
  s += "</tr>";
  
  if (odd == '') { odd = 'odd'; } else { odd = ''; }
  i++;
  }
 
 s += "</tbody>";
 
 s += "<tfoot></tfoot>";
 
 s += "</table>";
 
 return s;
 };
 
EmpireBoard.Renders.BuildingName_Tooltip_Content = function(building_id)
 {
 return '<nobr>'+this._Parent.Intl.TT(building_id,'buildings')+'</nobr>';
 };
 
EmpireBoard.Renders.Resources_Table_Content = function()
 {
 var _self = this;
 
 var s = "";
 var Cities = this._Parent.DB.CurrentCities;
 
 s += "<table class='Overview Resources'>";
 
 s += "<thead><tr>";
 s += "<th class='nolf city_name' nowrap>"+this._Parent.Intl.TT("cityName")+"</th>"+
   "<th class='actions' nowrap>"+this.Resources_HeaderIcons(current_city_id)+"</th>"+
   "<th colspan=3 class='lf population' nowrap>"+this._Parent.Intl.TT("Population")+"</th>"+
   "<th colspan=1 class='growth' nowrap>"+this._Parent.Intl.TT("Growth")+"</th>"+
   "<th colspan=1 class='lf research' nowrap>"+this._Parent.Intl.TT("Research")+"</th>"+
   "<th colspan=1 class='lf incomes' nowrap>"+this._Parent.Intl.TT("Incomes")+"</th>"+
   "<th colspan=2 class='lf wood'>"+this._Parent.Intl.TT("Wood")+"</th>"+
   "<th colspan=3 class='lf wine'>"+this._Parent.Intl.TT("Wine")+"</th>"+
   "<th colspan=2 class='lf marble'>"+this._Parent.Intl.TT("Marble")+"</th>"+
   "<th colspan=2 class='lf crystal'>"+this._Parent.Intl.TT("Crystal")+"</th>"+
   "<th colspan=2 class='lf sulfur'>"+this._Parent.Intl.TT("Sulfur")+"</th>";
 s += "</tr></thead>";
 
 var sumres = new Resource("");
 sumres.population  = 0;
 sumres.citizens   = 0;
 sumres.spacetotal  = 0;
 sumres.growth   = 0;
 sumres.Income   = 0;
 sumres.reservedGold  = '';
 sumres.Research   = 0;
 sumres.ResearchBonus = '';
 
 var sumProd = new Resource("");
 sumProd.wineUsage = 0;
 
 var sumArTr = new Resource("");

 function createIncome(prodPerHour, extraTooltip, classname)
  {
  if (classname == undefined) classname = '';
  if (""+prodPerHour == "NaN" || ""+prodPerHour == "" || ""+prodPerHour == "?" || prodPerHour == undefined || ""+prodPerHour == "???")
   {
   return "?";
   }
  else if (""+prodPerHour == "0")
   {
   return "0";
   }
  else
   {
   var tooltip = _self._Parent.Str.FormatBigNumber(Math.round(24 * prodPerHour), true)+" / "+_self._Parent.Ikariam.LocalizationStrings('day','timeunits','short');
   if ((extraTooltip != undefined) && (extraTooltip != ''))
    {
    tooltip += "<br>&nbsp;"+extraTooltip;
    }
   return createTooltip('<span class="'+classname+'">'+_self._Parent.Str.FormatBigNumber(Math.round(prodPerHour), true)+'</span>', tooltip);
   }
  }

 function createLinkToAgora(city_id)
  {
  var rHTML = '';
  
  if (_self._Parent.Ikariam.Is_Version('0.3.2') == true)
   {
   var res = getCity(city_id);
   
   if (res.island_id != undefined)
    {
    rHTML += '<a href="?view=islandBoard&id='+res.island_id+'" title="View island agora"><img hspace="3" height="12" src="skin/board/schriftrolle_offen2.gif" align="absmiddle" /></a>';
    }
   }
   
  return rHTML;
  }

 function createLinkToMap(city_id)
  {
  var res = getCity(city_id);
  var rHTML = '';
  
  if (res.city_coord != undefined)
   {
   cCoord =  res.city_coord.split(":");
   rHTML += '<a href="?view=worldmap_iso&islandX='+_self._Parent.Str.To_Integer(cCoord[0],'')+'&islandY='+_self._Parent.Str.To_Integer(cCoord[1],'')+'" title="' + res.city_coord + ' View world map"><img align="absmiddle" src="skin/layout/icon-world.gif" /></a>'; 
   }
   
  if ((res.island_id != undefined) && (res.city_coord != undefined))
   {
   rHTML += '<a href="?view=island&id=' + res.island_id + '&selectCity='+city_id+'" title="' + res.city_coord + ' View island"><img align="absmiddle" src="skin/layout/icon-island.gif" /></a>'; 
   }
  else if (res.island_id != undefined)
   {
   rHTML += '<a href="?view=island&id=' + res.island_id + '&selectCity='+city_id+'" title="View island"><img align="absmiddle" src="skin/layout/icon-island.gif" /></a>'; 
   }
   
  return rHTML;
  }

 function createLinkToResourceCond(condition, text, island_id, city_id, city_index)
  {
  if (condition == true && island_id != undefined && island_id != "")
   {
   return createLink(text, "?view=resource&type=resource&id="+island_id, "class=changeCity cityid="+city_id);
   }
  return text;
  }

 function createLinkToTradegoodCond(condition, text, island_id, city_id, city_index)
  {
  if (condition == true && island_id != undefined && island_id != "")
   {
   return createLink(text, "?view=tradegood&type=tradegood&id="+island_id, "class=changeCity cityid="+city_id);
   }
  return text;
  }

 function createLinkToResources(city_id)
  {
  var res = getCity(city_id);
  var rHTML = '';
  if (res.island_id != undefined)
   {
   rHTML += '<a class="changeCity" cityid="'+city_id+'" href="?view=resource&type=resource&id=' + res.island_id + '" title="View island saw mill"><img height="12" align="absmiddle" src="skin/resources/icon_wood.gif" /></a>';
   rHTML += '&nbsp;';
   
   if (res.prodgood == 'wine')
    {
    rHTML += '<a class="changeCity" cityid="'+city_id+'" href="?view=tradegood&type=tradegood&id=' + res.island_id + '" title="View island vineyard"><img height="12" align="absmiddle" src="skin/resources/icon_wine.gif" /></a>';
    }
   else if (res.prodgood == 'marble')
    {
    rHTML += '<a class="changeCity" cityid="'+city_id+'" href="?view=tradegood&type=tradegood&id=' + res.island_id + '" title="View island quarry"><img height="12" align="absmiddle" src="skin/resources/icon_marble.gif" /></a>';
    }
   else if (res.prodgood == 'glass')
    {
    rHTML += '<a class="changeCity" cityid="'+city_id+'" href="?view=tradegood&type=tradegood&id=' + res.island_id + '" title="View island crystal mine"><img height="12" align="absmiddle" src="skin/resources/icon_glass.gif" /></a>';
    }
   else if (res.prodgood == 'sulfur')
    {
    rHTML += '<a class="changeCity" cityid="'+city_id+'" href="?view=tradegood&type=tradegood&id=' + res.island_id + '" title="View island sulphur pit"><img height="12" align="absmiddle" src="skin/resources/icon_sulfur.gif" /></a>';
    }
    
   rHTML += '&nbsp;';
   }
  return rHTML;
  }

 function createLinkToTransportGoods(city_id)
  {
  var rHTML = '';
  if (current_city_id == city_id)
   {
   rHTML += '<img class="Action" src="skin/actions/transport_disabled.gif" align="absmiddle" />';
   }
  else
   {
   rHTML += '<a view=transport href="?view=transport&destinationCityId='+city_id+'" title="Transports goods"><img class="Action" src="skin/actions/transport.gif" align="absmiddle" /></a>';
   }
  return rHTML;
  }

 function createProd(prodPerHour, extraTooltip)
  {
  if (prodPerHour == "-" || prodPerHour == "?")
   {
   return prodPerHour;
   }
  else if (""+prodPerHour == "NaN" || ""+prodPerHour == "" || ""+prodPerHour == "0" || prodPerHour == undefined || ""+prodPerHour == "???")
   {
   return "";
   }
  else
   {
   var tooltip = _self._Parent.Str.FormatBigNumber(Math.round(24 * prodPerHour), true)+" / "+_self._Parent.Ikariam.LocalizationStrings('day','timeunits','short');
   if (extraTooltip != undefined)
    {
    tooltip += ", "+extraTooltip;
    }
   return createTooltip(_self._Parent.Str.FormatBigNumber(Math.round(prodPerHour), true), tooltip);
   }
  }

 function createResCounter(startTime, startAmount, factPerHour, showTooltip, maxAmount, tradeAmount, secureAmount, arrAmount)
  {
  if (tradeAmount == undefined) tradeAmount = 0;
  if (arrAmount == undefined) arrAmount = 0;
  if ((maxAmount == undefined) || (maxAmount == '-'))
   {
   maxAmount = '-';
   }
  else
   {
   maxAmount = maxAmount - tradeAmount;
   }
  var currAmount = startAmount;
  var tooltip = "";
  var res;
  
  if ((startAmount == undefined) || (startAmount+"" == "NaN"))
   {
   res = '?';
   }
  else if ((factPerHour != undefined) && (factPerHour+"" != "NaN") && (factPerHour != 0))
   {
   var counterClass = '';
   var intfactPerHour = Math.round(factPerHour);
   var dailyFact = Math.round(24 * factPerHour);
   if (startTime != undefined)
    {
    currAmount = getCurrentResourceAmount(_self._Parent.StartTime, startTime, startAmount, intfactPerHour);
    if (intfactPerHour > 0)
     {
     counterClass = 'Bold';
     }
    else if (intfactPerHour < 0)
     {
     if (currAmount+(6*intfactPerHour) <= 0)
      {
      counterClass = 'Red';
      }
     else if (currAmount+(24*intfactPerHour) <= 0)
      {
      counterClass = 'DarkRed';
      }
     }
    res = "<font id='myresourcecounter' counter='"+startTime+","+startAmount+","+intfactPerHour+","+maxAmount+"' class='"+counterClass+"'>"+_self._Parent.Str.FormatBigNumber(currAmount)+"</font>";
    }
   
   if (showTooltip == true) 
    {
       tooltip = _self._Parent.Str.FormatBigNumber(intfactPerHour, true)+" / "+_self._Parent.Ikariam.LocalizationStrings('hour','timeunits','short')+"<br> "+_self._Parent.Str.FormatBigNumber(dailyFact, true)+" / "+_self._Parent.Ikariam.LocalizationStrings('day','timeunits','short');
    if (intfactPerHour < 0)
     tooltip += "<br>&nbsp;" + _self._Parent.Str.FormatRemainingTime(-1 * (currAmount+arrAmount) / intfactPerHour * 60 * 60 * 1000) + " to empty";
    }
   }
  else
   {
   res = _self._Parent.Str.FormatBigNumber(currAmount);
   }
   
  // Safety goods ?
  if ((secureAmount > 0) && (secureAmount >= (currAmount+tradeAmount)))
   {
   res = '<img src="skin/layout/icon-wall.gif" class="Safe" title="Safety resources"/> '+res;
   }
   
  if (tooltip != '') res = createTooltip(res, tooltip);
  return res + "&nbsp;";
  }
 
 function createResearch(prodPerHour, extraTooltip)
  {
  if (prodPerHour == "-" || prodPerHour == "?")
   {
   return prodPerHour;
   }
  else if (""+prodPerHour == "0")
   {
   return '+0';
   }
  else if (""+prodPerHour == "NaN" || ""+prodPerHour == "" || prodPerHour == undefined || ""+prodPerHour == "???")
   {
   return "";
   }
  else
   {
   var tooltip = _self._Parent.Str.FormatBigNumber(Math.round(24 * prodPerHour), true)+" / "+_self._Parent.Ikariam.LocalizationStrings('day','timeunits','short');
   if (extraTooltip != undefined)
    {
    tooltip += ", "+extraTooltip;
    }
   return createTooltip(_self._Parent.Str.FormatBigNumber(Math.round(prodPerHour), true), tooltip);
   }
  }

 function getArrivingGoodsSum(city_id, resName)
  {
  var sum = 0;
  var city = getCity(city_id);
  var rows = getArrValue(config.arrivinggoods, city_id, []);
  var key;
  for (key in rows)
   {
   var row = rows[key];
   var res = row["res"];
   var a = getArrValue(res, resName, 0);
   var arrivetime = parseInt(getArrValue(row, "arrivetime", ""));
   if ((a > 0) && (arrivetime > city.prodtime)) sum += a;
   }
  return sum;
  }
 
 function getArrivingGoods(city_id, resName, tradinggoods, resAmount, ArrivingGoodsSum)
  {
  var sum = 0;
  var found = false;
  if (ArrivingGoodsSum == undefined)
   ArrivingGoodsSum = getArrivingGoodsSum(city_id, resName);
  if (ArrivingGoodsSum > 0)
   {
   sum += ArrivingGoodsSum;
   found = true;
   }

  if ((tradinggoods != undefined) && (parseInt(tradinggoods) > 0))
   {
   sum += parseInt(tradinggoods);
   }

  var s = "<font class='More'>-&nbsp;</font>";
  if (found == true)
   {
   s = "<font class='More MoreGoods Green'>"+_self._Parent.Str.FormatBigNumber(sum, true);
   if (getDeliveredGoodsTransports(city_id, resName) > 0)
    {
    s += "<sup>*</sup>";
    }
   else s += "&nbsp;";
   s += "</font>";
   }
  else if (sum > 0)
   {
   s = "<font class='More MoreGoods'>"+_self._Parent.Str.FormatBigNumber(sum, true)+"&nbsp;</font>";
   }
  return s;
  }

 function createReservedGold(sum)
  {
  var output = '';
  if (sum == '?')
   {
   output = '<font class="More">?</font>';
   }
  else if (sum === 0)
   {
   output = '<font class="More">-</font>';
   }
  else if ((sum != undefined) && (sum != ''))
   {
   output = '<font class="More" title="Reserved gold">'+_self._Parent.Str.FormatBigNumber(sum)+'</font>';
   }
  return output;
  }
  
 function createSimpleProd(prodPerHour)
  {
  if (""+prodPerHour == "NaN" || ""+prodPerHour == "" || ""+prodPerHour == "0" || prodPerHour == undefined || ""+prodPerHour == "???")
   {
   return "";
   }
  return _self._Parent.Str.FormatBigNumber(Math.round(prodPerHour), true);
  }

 function createTransports(cityID)
  {
  var res = "<font class='More'></font>";
  var numTransports = 0;
  if (config["transports"] == undefined)
   {
   
   }
  else if (config["transports"][cityID] != undefined)
   {
   for (key in config["transports"][cityID])
    {
    if (config["transports"][cityID][key].endTime >= _self._Parent.StartTime) numTransports++;
    }
    
   if (numTransports > 0) res = "<font class='More Transports'>"+numTransports+" transport(s) on way</font>";
   }
   
  return res;
  }

 function createForeignTransports(cityID)
  {
  var res = "<font class='More'></font>";
  var numMovements = 0;
  if (config["foreignTransports"] == undefined)
   {
   
   }
  else if (config["foreignTransports"][cityID] != undefined)
   {
   for (key in config["foreignTransports"][cityID])
    {
    if (config["foreignTransports"][cityID][key].endTime >= _self._Parent.StartTime)
     numMovements++;
    }
    
   if (numMovements > 0)
    res = "<font class='More ForeignTransports'>"+numMovements+" foreign transport(s)</font>";
   }
   
  return res;
  }
  
 function createResProgressBar(startTime, startAmount, factPerHour, maxCapacity, secureCapacity)
  {
  var res = '';
  if ((_self._Parent.DB.Options.Prefs.PROGRESS_BAR_MODE != "off") && (maxCapacity > 0) && (startTime != undefined))
   {
   var curres = getCurrentResourceAmount(new Date().getTime(), startTime, startAmount, factPerHour);
   var perc = Math.min(100, Math.round(curres / maxCapacity * 100.0));
   var remaining = "";
   var remhour = 100000000;
   if (curres >= maxCapacity)
    {
    // no more
    remhour = 0;
    }
   else if (factPerHour > 0)
    {
    remhour = (maxCapacity - curres) / factPerHour;
    remaining = "<br>"+_self._Parent.Str.FormatRemainingTime(remhour*60*60*1000)+" to full";
    }
   else if (factPerHour < 0)
    {
    remaining = "<br>"+_self._Parent.Str.FormatRemainingTime((curres / -factPerHour)*60*60*1000) + " to empty";
    }
   var cl = "Normal";
   var vperc = perc;
   if ((curres > 0) && (vperc < 4)) vperc = 4;
   if ((_self._Parent.DB.Options.Prefs.PROGRESS_BAR_MODE == "time") && (factPerHour != 0))
    {
    if (remhour <= 1) 
     {
     cl = "Full";
     } 
    else if (remhour < 24)
     {
     cl = "AlmostFull";
     }
    else if (remhour < 72)
     {
     cl = "Warning";
     }
    }
   else
    {
    if (perc >= 99)
     {
     cl = "Full";
     }
    else if (perc >= 90)
     {
     cl = "AlmostFull";
     }
    else if (perc >= 80)
     {
     cl = "Warning";
     }
    } 
   res +=  "<table class='myPercent' "+createTooltipAttribute(_self._Parent.Str.FormatBigNumber(maxCapacity) + " total capacity<br>"+_self._Parent.Str.FormatBigNumber(secureCapacity)+" safety capacity<br>" + perc+"% full" + remaining)+">"+
   "<tr>"+
   "<td width='"+vperc+"%' class='"+cl+"'></td>"+
   "<td width='"+(100-vperc)+"%'></td>"+
   "</tr>"+
   "</table>";
   }
  else if (_self._Parent.DB.Options.Prefs.PROGRESS_BAR_MODE != "off")
   {
   res +=  "<table class='myPercent'>"+
   "<tr>"+
   "<td></td>"+
   "</tr>"+
   "</table>";
   }
  return res;
  }

 s += "<tbody>";

 var CityId;
 var i = 0;
 var odd = '';
 for (CityId in Cities)
  {
  if (Cities[CityId].own != true) continue;
  var city = getCity(CityId);
  
  if (getBuildingLevel(CityId, "branchOffice", "-") != '-')
   {
   if (city.tradewood == undefined) city.tradewood = 0;
   if (city.tradewine == undefined) city.tradewine = 0;
   if (city.trademarble == undefined) city.trademarble = 0;
   if (city.tradeglass == undefined) city.tradeglass = 0;
   if (city.tradesulfur == undefined) city.tradesulfur = 0;
   }
  else
   {
   city.tradewood = 0;
   city.tradewine = 0;
   city.trademarble = 0;
   city.tradeglass = 0;
   city.tradesulfur = 0;
   }
  
  var wineUsage = 0;
  var cellarLevel = getBuildingLevel(CityId, "vineyard", "-");
  var tavernLevel = getBuildingLevel(CityId, "tavern", "-");
  if (tavernLevel == '-')
   {
   // Fix if tavern has been demolished without disable wine usage
   }
  else if (city.wineUsageId != undefined)
   {
   wineUsage = tavernWineUsage[city.wineUsageId];
   if (cellarLevel != '-') 
    {
    wineSave = wineUsage * cellarLevel;
    wineSave = Math.round(wineSave / 100);
    wineUsage = wineUsage - wineSave;
    }
   }
  else if (city.wineUsage != undefined)
   {
   wineUsage = city.wineUsage;
   } 
  // Wine usage tooltip
  var wineUsageHtml = '-';
  if (wineUsage > 0)
   {
   wineUsageHtml = createSimpleProd(-1 * wineUsage);
   }
  
  // Estimate current amount of each resources
  var curres = new Resource("");
  curres.wood   = getCurrentResourceAmount(this._Parent.StartTime, city.prodtime, city.wood, city.prodwood);
  curres.wine   = getCurrentResourceAmount(this._Parent.StartTime, city.prodtime, city.wine, city.prodwine - wineUsage);
  curres.marble  = getCurrentResourceAmount(this._Parent.StartTime, city.prodtime, city.marble, city.prodmarble);
  curres.glass  = getCurrentResourceAmount(this._Parent.StartTime, city.prodtime, city.glass, city.prodglass);
  curres.sulfur  = getCurrentResourceAmount(this._Parent.StartTime, city.prodtime, city.sulfur, city.prodsulfur);

  sumres.wood   += curres.wood;
  sumres.wine   += curres.wine;
  sumres.marble  += curres.marble;
  sumres.glass  += curres.glass;
  sumres.sulfur  += curres.sulfur;

  sumProd.wood   += city.prodwood;
  sumProd.wine   += city.prodwine;
  sumProd.wineUsage  += wineUsage;
  sumProd.marble   += city.prodmarble;
  sumProd.glass   += city.prodglass;
  sumProd.sulfur   += city.prodsulfur;
  
  // Resources which will arrive
  var arrres = new Resource('');
  arrres.wood   = getArrivingGoodsSum(CityId, 'wood');
  arrres.wine   = getArrivingGoodsSum(CityId, 'wine');
  arrres.marble  = getArrivingGoodsSum(CityId, 'marble');
  arrres.glass  = getArrivingGoodsSum(CityId, 'glass');
  arrres.sulfur  = getArrivingGoodsSum(CityId, 'sulfur');

  sumArTr.wood  += city.tradewood + arrres.wood;
  sumArTr.wine  += city.tradewine + arrres.wine;
  sumArTr.marble  += city.trademarble + arrres.marble;
  sumArTr.glass  += city.tradeglass + arrres.glass;
  sumArTr.sulfur  += city.tradesulfur + arrres.sulfur;
  
  // City income
  var Income = getArrValue(city.buildings["townHall"],"incomegold","?");
  if (Income != "?")
   {
   sumres.Income += Income;
   }
  
  // Gold in trading post
  var reservedGold = '';
  if (city.buildings["branchOffice"] != undefined)
   {
   if (city.buildings["branchOffice"].reservedGold == undefined)
    {
    reservedGold = '?';
    }
   else
    {
    reservedGold = city.buildings["branchOffice"].reservedGold;
    if (reservedGold > 0)
     {
     if (sumres.reservedGold == '')
      {
      sumres.reservedGold = reservedGold;
      }
     else
      {
      sumres.reservedGold += reservedGold;
      }
     }
    }
   }
   
  // Research point
  var Research = '-';
  if (getBuildingLevel(CityId, "academy", 0) > 0)
   {
   Research = getArrValue(city.buildings["academy"],"Research","?");
   
   if (Research != '?')
    {
    sumres.Research += Research;
    }
   }
  
  var spacetotal   = '?';
  var townHallLevel  = getBuildingLevel(CityId, "townHall", "?", 0);
  if (townHallLevel != '?')
   spacetotal = townHallSpaces[townHallLevel];
  var bonusspace   = getArrValue(city.buildings["townHall"], "bonusspace", "?");

  var workers    = '?';
  var population   = getArrValue(city.buildings["townHall"], "population", 0);
  var citizens   = getArrValue(city.buildings["townHall"], "citizens", '?');
  if (citizens != '?')
   workers = population - citizens;
  
  // Estimate current population and growth
  var growth    = 0;
  var happiness   = getArrValue(city.buildings["townHall"], "happiness", "?");
  if ((happiness != '?') && (spacetotal != '?') && (bonusspace != '?'))
   {
   population = getEstimatedPopulation(population, city.prodtime, this._Parent.StartTime, happiness - population);
   if (parseInt(population) > parseInt(spacetotal) + parseInt(bonusspace))
    {
    population = parseInt(spacetotal) + parseInt(bonusspace);
    }
   happiness -= population;
   
   if (happiness != 0)
    growth = (0.02 * happiness) + 0.01;
   }
  else
   {
   growth = getArrValue(city.buildings["townHall"], "growth", "?");
   }
  sumres.population += population;
  
  // Current citizens
  if (workers != '?')
   {
   citizens = population - workers;
   if (sumres.citizens != '?')
    {
    sumres.citizens += citizens;
    }
   }
  else
   {
   citizens = '?';
   sumres.citizens = '?';
   }
  
  // Estimate growth remaining time
  var growthRemainingHours = '';
  if (happiness != "?" && happiness > 0 && bonusspace != "?" && growth >= 0.20)
   {
   growthRemainingHours = getGrowthRemainingHours(population, parseInt(spacetotal) + parseInt(bonusspace), this._Parent.StartTime, happiness);
   }
  
  // Global growth
  if ((growth != '?') && (sumres.growth != '?'))
   {
   if (parseInt(population) < parseInt(spacetotal) + parseInt(bonusspace))
    sumres.growth += growth;
   }
  else
   {
   sumres.growth = '?';
   }
  
  // Is current city ?
  var trclass = "";
  if (parseInt(current_city_id) == parseInt(CityId))
   {
   trclass = "current";
   }

  var townHallStyle = "";
  var growthStyle = "";
  if (parseInt(population) >= parseInt(spacetotal) + parseInt(bonusspace))
   {
   // Townhall is full
   growthRemainingHours = '';
   if (growth >= 1.20) 
    {
    townHallStyle = " DarkRed";
    }
   else if (growth >= 0.20) 
    {
    townHallStyle = " Brown";
    }
   else
    {
    townHallStyle = " Bold";
    }
   }
  else if (growth >= 0.20)
   {
   growthStyle = " Green";
   }
  else if (growth >= 0)
   {
   growthStyle = "";
   }
  else if (growth <= -1)
   {
   growthStyle = " Red";
   }
  else if (growth <= -0.20)
   {
   growthStyle = " DarkRed";
   }
  
  // Global townhall capacity
  if (bonusspace != "?")
   {
   if (sumres.spacetotal != '?')
    sumres.spacetotal += parseInt(spacetotal) + parseInt(bonusspace);
   spacetotal = this._Parent.Str.FormatBigNumber(parseInt(spacetotal) + parseInt(bonusspace));
   }
  else
   {
   sumres.spacetotal = '?';
   spacetotal = this._Parent.Str.FormatBigNumber(spacetotal) + " + ?";
   }
  
  // Warehouse safe capacity bonus by premium option
  var savecapacityBonus = 0;
  if (config["premium"] != undefined)
   {
   if ((config["premium"].savecapacityBonus != undefined) && (config["premium"].savecapacityBonus > this._Parent.StartTime))
    {
    savecapacityBonus = 100;
    }
   }
  
  // Warehouse storage capacity bonus by premium option
  var storagecapacityBonus = 0;
  if (config["premium"] != undefined)
   {
   if ((config["premium"].storagecapacityBonus != undefined) && (config["premium"].storagecapacityBonus > this._Parent.StartTime))
    {
    storagecapacityBonus = 100;
    }
   }
  
  // Warehouse max capacity
  var maxcwood   = 0;
  var maxcother   = 0;
  var maxsafewood   = 0;
  var maxsafeother  = 0;
  if (this._Parent.Ikariam.Is_Version('0.3.4') == true)
   {
   var WarehousesLevels = [];
   var WarehousesLevel = 0;
   if ((city.buildings['warehouse'] != undefined) && (city.buildings['warehouse'].levels != undefined))
    {
    var p;
    for (p in city.buildings['warehouse'].levels)
     {
     var WarehouseLevel = getBuildingLevel(CityId, 'warehouse', city.buildings['warehouse'].levels[p], p);
     WarehousesLevel += WarehouseLevel;
     WarehousesLevels.push(WarehouseLevel);
     }
    }
   else
    {
    // While build first warehouse
    WarehousesLevel  = getBuildingLevel(CityId,'warehouse', 0, -1);
    WarehousesLevels.push(WarehousesLevel);
    }
    
   var DumpLevel = getBuildingLevel(CityId,'dump', 0, -1);
   
   maxcwood   = this._Parent.Ikariam.Resource_Capacity('wood',WarehousesLevel,DumpLevel,storagecapacityBonus);
   maxcother   = maxcwood;
   maxsafewood   = this._Parent.Ikariam.Resource_SafeCapacity('wood',WarehousesLevels,savecapacityBonus);
   maxsafeother  = maxsafewood;
   }
  else
   {
   // Soon deprecated
   var WarehousesLevel  = getBuildingLevel(CityId,'warehouse', 0, -1);
   
   maxcwood   = this._Parent.Ikariam.Resource_Capacity('wood',WarehousesLevel,0,storagecapacityBonus);
   maxcother   = this._Parent.Ikariam.Resource_Capacity('wine',WarehousesLevel,0,storagecapacityBonus);
   maxsafewood   = this._Parent.Ikariam.Resource_SafeCapacity('wood',WarehousesLevel,savecapacityBonus);
   maxsafeother  = this._Parent.Ikariam.Resource_SafeCapacity('wine',WarehousesLevel,savecapacityBonus);
   }

  var cityLink = '';
  if (reportViewToSurvey('',CityId) == '!')
   {
   cityLink = createLinkToChangeCity(Cities[CityId].name, CityId, i, reportViewToSurvey('',CityId),'Red', 'Require attention');
   }
  else
   {
   cityLink = createLinkToChangeCity(Cities[CityId].name, CityId, i , city.actions, 'Green', 'Available action points');
   }
  
  s += "<tr class='"+odd+" "+trclass+"' cityid='"+CityId+"' islandid='"+city.island_id+"' coord='"+city.city_coord+"' tradegood='"+city.prodgood+"'>";
  
  s += "<td class='nolf city_name' nowrap>"+cityLink+createTransports(CityId)+createForeignTransports(CityId)+"</td>"+
    "<td class='actions' nowrap>"+createLinkToMap(CityId)+createLinkToAgora(CityId)+"<br />"+createLinkToResources(CityId)+createLinkToTransportGoods(CityId)+"</td>"+
    "<td class='lf'>"+
     "<span title='Citizens'>"+(population > 0 ? this._Parent.Str.FormatBigNumber(citizens) : '?')+"</span>"+
     "&nbsp;("+
    "</td>"+
    "<td class='nolf'>"+
     "<span title='Overall inhabitants' class='inhabitant"+townHallStyle+"'>"+(population > 0 ? this._Parent.Str.FormatBigNumber(population) : '?')+"</span>)"+
     "&nbsp;/</td>"+
    "<td class='nolf' title='Housing space'>"+spacetotal+"</td>"+
    "<td class='"+growthStyle+"'>"+(growth != '?' ? '<img src="'+this._Parent.Ikariam.Get_Happiness_ImgSrc(growth)+'" align=left height=18 hspace=2 vspace=0 title="Total satisfaction: '+happiness+'">' : '')+createTooltip(this._Parent.Str.FormatFloatNumber(growth,2,true), growthRemainingHours)+"</td>"+
    "<td class='lf'>"+createResearch(Research)+"</td>"+
    "<td class='lf'>"+
     createIncome(Income)+
     createReservedGold(reservedGold)+
    "</td>"+
    "<td class='lf' resource='wood'>"+
     createLinkToResourceCond(true, createResCounter(city.prodtime, city.wood, city.prodwood, false, maxcwood, city.tradewood, maxsafewood), city.island_id, CityId, i)+
     getArrivingGoods(CityId, "wood", city.tradewood, curres.wood, arrres.wood)+
     createResProgressBar(city.prodtime, city.wood + arrres.wood, city.prodwood, maxcwood - city.tradewood, maxsafewood)+
    "</td>"+
    "<td class='lfdash'>"+createProd(city.prodwood)+"</td>"+
    "<td class='lf' resource='wine'>"+
     createLinkToTradegoodCond((city.prodwine > 0) || (city.prodgood == 'wine'), createResCounter(city.prodtime, city.wine, city.prodwine - wineUsage, true, maxcother, city.tradewine, maxsafeother, arrres.wine), city.island_id, CityId, i)+
     getArrivingGoods(CityId, "wine", city.tradewine, curres.wine, arrres.wine)+
     createResProgressBar(city.prodtime, city.wine + arrres.wine, city.prodwine - wineUsage, maxcother - city.tradewine, maxsafeother)+
    "</td>"+
    "<td class='lfdash'>"+createSimpleProd(city.prodwine)+"</td>"+
    "<td class='lfdash'>"+wineUsageHtml+"</td>"+
    "<td class='lf' resource='marble'>"+
     createLinkToTradegoodCond((city.prodmarble > 0) || (city.prodgood == 'marble'), createResCounter(city.prodtime, city.marble, city.prodmarble, false, maxcother, city.trademarble, maxsafeother), city.island_id, CityId, i)+
     getArrivingGoods(CityId, "marble", city.trademarble, curres.marble, arrres.marble)+
     createResProgressBar(city.prodtime, city.marble + arrres.marble, city.prodmarble, maxcother - city.trademarble, maxsafeother)+
    "</td>"+
    "<td class='lfdash'>"+createProd(city.prodmarble)+"</td>"+
    "<td class='lf' resource='glass'>"+
     createLinkToTradegoodCond((city.prodglass > 0) || (city.prodgood == 'glass'), createResCounter(city.prodtime, city.glass, city.prodglass, false, maxcother, city.tradeglass, maxsafeother), city.island_id, CityId, i)+
     getArrivingGoods(CityId, "glass", city.tradeglass, curres.glass, arrres.glass)+
     createResProgressBar(city.prodtime, city.glass + arrres.glass, city.prodglass, maxcother - city.tradeglass, maxsafeother)+
    "</td>"+
    "<td class='lfdash'>"+createProd(city.prodglass)+"</td>"+
    "<td class='lf' resource='sulfur'>"+
     createLinkToTradegoodCond((city.prodsulfur > 0) || (city.prodgood == 'sulfur'), createResCounter(city.prodtime, city.sulfur, city.prodsulfur, false, maxcother, city.tradesulfur, maxsafeother), city.island_id, CityId, i)+
     getArrivingGoods(CityId, "sulfur", city.tradesulfur, curres.sulfur, arrres.sulfur)+
     createResProgressBar(city.prodtime, city.sulfur + arrres.sulfur, city.prodsulfur, maxcother - city.tradesulfur, maxsafeother)+
    "</td>"+
    "<td class='lfdash'>"+createProd(city.prodsulfur)+"</td>";
  s += "</tr>";
  
  i++;
  if (odd == '') { odd = 'odd'; } else { odd = ''; }
  }
 
 s += "</tbody>";
 
 // Gold usage remaining time
 var goldRemainingHours = '';
 var goldStyle = '';
 if (sumres.Income < 0) 
  {
  var RemainingHours = -1 * config.gold / sumres.Income;
  if (RemainingHours <= 6)
   {
   goldStyle = 'Red';
   }
  else if (RemainingHours <= 72)
   {
   goldStyle = 'DarkRed';
   }
  goldRemainingHours = this._Parent.Str.FormatRemainingTime(RemainingHours*60*60*1000)+" to expense";
  }
  
 // Research bonus from government
 if (this._Parent.Ikariam.Is_Version('0.4.4'))
  {
  if ((config.government == undefined) || (config.government == ''))
   {
   
   }
  else if (config.government == 'demokratie')
   {
   if ((config.totalCulturalGoods != undefined) && (config.totalCulturalGoods != ''))
    {
    sumres.ResearchBonus = config.totalCulturalGoods;
    }
   }
  }
 
 function createMoreResearch(sum)
  {
  var output = '';
  if (sum > 0) 
   {
   output = '<font class="More">'+_self._Parent.Str.FormatBigNumber(sum, true)+'</font>';
   }
   return output;
  }
  
 function createMoreGoods(sum)
  {
  var output = '';
  if (sum > 0) 
   {
   output = '<font class="More">'+_self._Parent.Str.FormatBigNumber(sum, true)+'&nbsp;</font>';
   }
   return output;
  }
  
 s += "<tfoot class='Summary'><tr>";
 s += "<td class='nolf sigma' nowrap colspan=2><img vspace=2 hspace=5 src='skin/layout/sigma.gif'></td>"+
   "<td class='lf'>"+
   "<span title='Citizens'>"+this._Parent.Str.FormatBigNumber(sumres.citizens)+'</span>'+
   "&nbsp;("+
   "</td>"+
   "<td class='nolf'>"+
   "<span title='Overall inhabitants'>"+this._Parent.Str.FormatBigNumber(sumres.population)+"</span>)"+
   "&nbsp;/</td>"+
   "<td class='nolf' title='Housing space'>"+this._Parent.Str.FormatBigNumber(sumres.spacetotal)+"</td>"+
   "<td>"+this._Parent.Str.FormatFloatNumber(sumres.growth,2,true)+"</td>"+
   "<td class='lf'>"+
   createResearch(sumres.Research)+
   createMoreResearch(sumres.ResearchBonus)+
   "</td>"+
   "<td class='lf'>"+
   createIncome(sumres.Income, goldRemainingHours, goldStyle)+
   createReservedGold(sumres.reservedGold)+
   "</td>"+
   "<td class='lf'>"+
       createResCounter(this._Parent.StartTime, sumres.wood, sumProd.wood)+
       createMoreGoods(sumArTr.wood)+
       "</td>"+
   "<td class='lfdash'>"+createProd(sumProd.wood)+"</td>"+
   "<td class='lf'>"+
       createResCounter(this._Parent.StartTime, sumres.wine, sumProd.wine - sumProd.wineUsage, true)+
       createMoreGoods(sumArTr.wine)+
       "</td>"+
   "<td class='lfdash'>"+createSimpleProd(sumProd.wine)+"</td>"+
   "<td class='lfdash'>"+createSimpleProd(-1 * sumProd.wineUsage)+"</td>"+
   "<td class='lf'>"+
       createResCounter(this._Parent.StartTime, sumres.marble, sumProd.marble)+
       createMoreGoods(sumArTr.marble)+
       "</td>"+
   "<td class='lfdash'>"+createProd(sumProd.marble)+"</td>"+
   "<td class='lf'>"+
       createResCounter(this._Parent.StartTime, sumres.glass, sumProd.glass)+
       createMoreGoods(sumArTr.glass)+
       "</td>"+
   "<td class='lfdash'>"+createProd(sumProd.glass)+"</td>"+
   "<td class='lf'>"+
       createResCounter(this._Parent.StartTime, sumres.sulfur, sumProd.sulfur)+
       createMoreGoods(sumArTr.sulfur)+
       "</td>"+
   "<td class='lfdash'>"+createProd(sumProd.sulfur)+"</td>";
 s += "</tr></tfoot>";
 
 s += "</table>";
 
 return s;
 };
 
EmpireBoard.Renders.ArmyFleet_Table_Content = function()
 {
 var _self = this;
 
 var s = "";
 var Cities = this._Parent.DB.CurrentCities;
 
 var FleetUpkeepBonus = 0;
 if (config["research"].FleetUpkeepBonus != undefined)
  FleetUpkeepBonus = config["research"].FleetUpkeepBonus;
 
 var ArmyUpkeepBonus = 0;
 if (config["research"].ArmyUpkeepBonus != undefined) 
  ArmyUpkeepBonus = config["research"].ArmyUpkeepBonus;
 
 function applyUpkeepBonus(value, bonus)
  {
  if ((value == '-') || (value == '?') || (value == 0) || (bonus == 0))
   {
   return value;
   }
  else
   {
   return (value - (value/100*bonus));
   }
  }
 
 var orderedUnits = this._Parent.Ikariam.UnitsList();
 
 var usedIndexes = {};
 var usedIndexesCount = 0;
 if (config["unitnames"] != undefined)
  {
  var CityId;
  for (CityId in Cities)
   {
   if (Cities[CityId].own != true) continue;
   var city = getCity(CityId);
   var key;
   for (key in orderedUnits)
    {
    var ukey = 'unit '+key;
    if (parseInt(getArrValue(getArrValue(city.units, ukey), "count", 0)) > 0)
     {
     usedIndexes[key] = 1;
     usedIndexesCount++;
     }
    else if (parseInt(getArrValue(getArrValue(city.units, ukey), "construction", 0)) > 0)
     {
     usedIndexes[key] = 1;
     usedIndexesCount++;
     }
    }
   }
  }
 
 s += "<thead><tr><th class='nolf city_name' nowrap>"+this._Parent.Intl.TT("cityName")+"</th>";
 s += "<th class='actions' nowrap>"+this._Parent.Renders.ArmyFleet_HeaderIcons(current_city_id)+"</th>";
 if (usedIndexesCount > 0)
  {
  var firstStyle = "";
  var lastTopic = '';
  var key;
  for (key in orderedUnits)
   {
   var ukey = 'unit '+key;
   var name = this._Parent.Intl.TT(ukey,'army_units');
   if (usedIndexes[key] == 1) 
    {
    if (lastTopic != orderedUnits[key]) { firstStyle = "lf"; } else { firstStyle = ""; }
    
    s += "<th unit='"+key+"' class='"+firstStyle+" unit_name "+key+"' nowrap>"+name+"</th>";
    firstStyle = "";
    
    lastTopic = orderedUnits[key];
    }
   }
  }
 else s += "<th class='lf'></th><th></th><th></th><th></th><th></th><th></th><th></th>";
 s += "<th class='upkeep lf' nowrap title='"+this._Parent.Intl.TT("Upkeep")+"'>"+this._Parent.Intl.TT("Upkeep")+"</th>";
 s += "</tr></thead>";
 
 function createAttacks(cityID)
  {
  var res = "<font class='More Red'></font>";
  var numMovements = 0;
  if (config["attacks"] == undefined)
   {
   
   }
  else if (config["attacks"][cityID] != undefined)
   {
   for (key in config["attacks"][cityID])
    {
    if (config["attacks"][cityID][key].endTime >= _self._Parent.StartTime)
     numMovements++;
    }
    
   if (numMovements > 0)
    res = "<font class='More Attacks Red'>under "+numMovements+" attack(s)</font>";
   }
   
  return res;
  }

 function createLinkToArmyView(city_id)
  {
  var rHTML = '';
  rHTML += '<a href="?view=cityMilitary-army&id='+city_id+'" class="changeCity" cityid="'+city_id+'" title="View army overview"><img align="absmiddle" src="skin/img/city/building_barracks.gif" /></a>';
  if (reportViewToSurvey('cityMilitary-army', city_id) == '!')
   {
   rHTML += '<sup class=Red title="Require attention">!</sup>';
   }
  else
   {
   rHTML += '&nbsp;';
   }
  return rHTML;
  }
 
 function createLinkToFleetView(city_id)
  {
  var rHTML = '';
  rHTML += '<a href="?view=cityMilitary-fleet&id='+city_id+'" class="changeCity" cityid="'+city_id+'" title="View fleet overview"><img align="absmiddle" src="skin/img/city/building_shipyard.gif" /></a>';
  if (reportViewToSurvey('cityMilitary-fleet', city_id) == '!')
   {
   rHTML += '<sup class=Red title="Require attention">!</sup>';
   }
  else
   {
   rHTML += '&nbsp;';
   }
  return rHTML;
  }
  
 function createLinkToDeployArmy(city_id)
  {
  var rHTML = '';
  if (current_city_id == city_id)
   {
   rHTML += '<img class="Action" src="skin/actions/move_army_disabled.gif" align="absmiddle" />';
   }
  else
   {
   rHTML += '<a view=deployment deploymenttype=army href="?view=deployment&deploymentType=army&destinationCityId='+city_id+'" title="Deploy troops"><img class="Action" src="skin/actions/move_army.gif" align="absmiddle" /></a>';
   }
  return rHTML;
  }

 function createLinkToDeployFleet(city_id)
  {
  var rHTML = '';
  if (current_city_id == city_id)
   {
   rHTML += '<img class="Action" src="skin/actions/move_fleet_disabled.gif" align="absmiddle" />';
   }
  else
   {
   rHTML += '<a view=deployment deploymenttype=fleet href="?view=deployment&deploymentType=fleet&destinationCityId='+city_id+'" title="Station fleets"><img class="Action" src="skin/actions/move_fleet.gif" align="absmiddle" /></a>';
   }
  return rHTML;
  }

 function createMovements(cityID)
  {
  var res = "<font class='More'></font>";
  var numMovements = 0;
  if (config["movements"] == undefined)
   {
   
   }
  else if (config["movements"][cityID] != undefined)
   {
   var key;
   for (key in config["movements"][cityID])
    {
    if (config["movements"][cityID][key].endTime >= _self._Parent.StartTime) numMovements++;
    }
    
   if (numMovements > 0) res = "<font class='More Movements'>"+numMovements+" movement(s) on way</font>";
   }
  return res;
  }

 var sum = [];
 var sumConstruction = [];
 var sumUpkeep = 0;
 var sumConstructionUpkeep = 0;
 s += "<tbody class='ownCities'>";
 var i = 0;
 var odd = '';
 var CityId;
 for (CityId in Cities)
  {
  if (Cities[CityId].own != true) continue;
  var city = getCity(CityId);
  var trclass = (parseInt(current_city_id) == parseInt(CityId)) ? "current" : "";
  
  s += "<tr class='"+odd+" "+trclass+"' cityid='"+CityId+"' islandid='"+city.island_id+"' coord='"+city.city_coord+"'>";
  
  s += "<td class='nolf city_name' nowrap>"+
          createLinkToChangeCity(Cities[CityId].name, CityId, i, city.actions, 'Green', 'Available action points')+
          createMovements(CityId)+
          createAttacks(CityId)+
          "</td>";
  s += "<td class='actions' nowrap>"+createLinkToArmyView(CityId)+createLinkToDeployArmy(CityId)+"<br />"+createLinkToFleetView(CityId)+createLinkToDeployFleet(CityId)+"</td>";
  
  var barracksLevel = getBuildingLevel(CityId, "barracks", "-");
  var shipyardLevel = getBuildingLevel(CityId, "shipyard", "-");
  var cityUpkeep = 0;
  var cityConstructionUpkeep = 0;
  if (usedIndexesCount > 0)
   {
   var firstStyle = "";
   var lastTopic = '';
   for (key in orderedUnits)
    {
    var ukey = 'unit '+key;
    var ugender = this._Parent.Ikariam.Get_UnitGender(key);
    if (usedIndexes[key] == 1) 
     {
     if (lastTopic != orderedUnits[key]) { firstStyle = "lf"; } else { firstStyle = ""; }
    
     var unitCount = this._Parent.Str.To_Integer(getArrValue(getArrValue(city.units, ukey), "count", 0), 0);
      
     if (config["upkeeps"][key] == undefined)
      {
      cityUpkeep = '?';
      }
     else if (cityUpkeep != '?')
      {
      if (ugender == 'army')
       {
       cityUpkeep += applyUpkeepBonus(config["upkeeps"][key]*unitCount,ArmyUpkeepBonus);
       }
      else if (ugender == 'fleet')
       {
       cityUpkeep += applyUpkeepBonus(config["upkeeps"][key]*unitCount,FleetUpkeepBonus);
       }
      }
      
     if (unitCount == 0)
      {
      unitCount = "-";
      }
     else
      {
      sum[key] = (sum[key] == undefined) ? unitCount : sum[key] + unitCount;
      }
      
     var unitConstructionHTML = '<font class="More">-</font>';
     var unitConstruction = 0;
     if ((ugender == 'army') && (barracksLevel == '-'))
      {
      // Fix if barracks has been demolished while units were under construction
      }
     else if ((ugender == 'fleet') && (shipyardLevel == '-'))
      {
      // Fix if barracks has been demolished while units were under construction
      }
     else
      {
      unitConstruction = this._Parent.Str.To_Integer(getArrValue(getArrValue(city.units, ukey, undefined), "construction", 0), 0);
      }
     
     if (config["upkeeps"][key] == undefined)
      {
      cityConstructionUpkeep = '?';
      }
     else if (cityConstructionUpkeep != '?')
      {
      if (ugender == 'army')
       {
       cityConstructionUpkeep += applyUpkeepBonus(config["upkeeps"][key]*unitConstruction,ArmyUpkeepBonus);
       }
      else if (ugender == 'fleet')
       {
       cityConstructionUpkeep += applyUpkeepBonus(config["upkeeps"][key]*unitConstruction,FleetUpkeepBonus);
       }
      }
      
     if (unitConstruction > 0)
      {
      unitConstructionHTML = '<font class="More" title="'+this._Parent.Intl.TT("currentlyBuilding")+'">'+this._Parent.Str.FormatBigNumber(unitConstruction, true)+'</font>';
      sumConstruction[key] = (sumConstruction[key] == undefined) ? unitConstruction : sumConstruction[key] + unitConstruction;
      }
     
     s += "<td unit='"+key+"' class='"+firstStyle+" "+key+"'>"+
          this._Parent.Str.FormatBigNumber(unitCount)+
          unitConstructionHTML+
          "</td>";
    
     lastTopic = orderedUnits[key];
     }
    }
   }
  else s += "<td class='lf'></td><td></td><td></td><td></td><td></td><td></td><td></td>";
  
  if (sumUpkeep != '?')
   {
   if (cityUpkeep != '?')
    {
    sumUpkeep += cityUpkeep;
    }
   else sumUpkeep = '?';
   }
  if (cityUpkeep == 0) cityUpkeep = '-';
  
  if (sumConstructionUpkeep != '?')
   {
   if (cityConstructionUpkeep != '?')
    {
    sumConstructionUpkeep += cityConstructionUpkeep;
    }
   else sumConstructionUpkeep = '?';
   }
  if (cityConstructionUpkeep == 0) cityConstructionUpkeep = '-';
  
  s += "<td class='upkeep lf'>"+(cityUpkeep != '-' ? this._Parent.Str.FormatBigNumber(-1*Math.round(cityUpkeep), true) : cityUpkeep)+"<font class='More'>"+(cityConstructionUpkeep != '-' ? this._Parent.Str.FormatBigNumber(-1*Math.round(cityConstructionUpkeep), true) : cityConstructionUpkeep)+"</font></td>";
  
  s += "</tr>";
  i++;
  if (odd == '') { odd = 'odd'; } else { odd = ''; }
  }
  
 s += "</tbody>";
 
 //s += "<tbody class='foreignCities'>";
 //s += "</tbody>";
 
 s += "<tfoot class='Summary'>";
 
 s += "<tr class='Units'>";
 
 s += "<td class='nolf sigma' colspan=2><img vspace=2 hspace=5 src='skin/layout/sigma.gif'></td>";
 if (usedIndexesCount > 0)
  {
  var firstStyle = "";
  var lastTopic = '';
  for(key in orderedUnits)
   {
   if (usedIndexes[key] == 1)
    {
    if (lastTopic != orderedUnits[key]) { firstStyle = "lf"; } else { firstStyle = ""; }

    var unitConstructionHTML = '<font class="More">-</font>';
    if (sumConstruction[key] > 0)
     {
     unitConstructionHTML = '<font class="More">'+this._Parent.Str.FormatBigNumber(sumConstruction[key], true)+'</font>';
     }
    s += "<td unit='"+key+"' class='"+firstStyle+" "+key+"'>"+
        (sum[key] == undefined ? '-' : this._Parent.Str.FormatBigNumber(sum[key]))+
        unitConstructionHTML+
        "</td>";

    lastTopic = orderedUnits[key];
    }
   }
  }
 else s += "<td class='lf'></td><td></td><td></td><td></td><td></td><td></td><td></td>";
 
 if (sumUpkeep == 0) sumUpkeep = '-';
 if (sumConstructionUpkeep == 0) sumConstructionUpkeep = '-';
 s += "<td class='upkeep lf'>"+(sumUpkeep != '-' ? this._Parent.Str.FormatBigNumber(-1*Math.round(sumUpkeep), true) : sumUpkeep)+"<font class='More'>"+(sumConstructionUpkeep != '-' ? this._Parent.Str.FormatBigNumber(-1*Math.round(sumConstructionUpkeep), true) : sumConstructionUpkeep)+"</font></td>";
 
 s += "</tr>";
 
 s += "</tfoot>";
 
 s += "</table>";
 
 return s;
 };
 
EmpireBoard.Renders.UnitName_Tooltip_Content = function(unit_id)
 {
 return '<nobr>'+this._Parent.Intl.TT('unit '+unit_id,'army_units')+'</nobr>';
 };
 
EmpireBoard.Renders.Set_Common_Styles = function()
 {
 var default_style = <><![CDATA[
 #EmpireBoard {
  width: 990px;
  margin: -15px auto 20px;
  }
 
 #EmpireBoard.LtoR,
 #EmpireBoard.LtoR * {
  direction: ltr;
  }
 
 #EmpireBoard.RtoL,
 #EmpireBoard.RtoL * {
  direction: rtl;
  }
 
 #EmpireBoard div.Table {
  margin-bottom: 2px;
  }
 
 #EmpireBoard table.Overview {
  width: 100% !important;
  margin-bottom: 3px;
  background-color: #F6EBBA; /* #FDF7DD */
  text-align: center;
  border-collapse: collapse;
  border: 2px solid #fff;
  box-shadow: 3px 3px 0 #AB9166;
  }
  
 #EmpireBoard table.Overview thead {
  background: #F8E7B3 url(skin/input/button.gif) repeat-x scroll 0 bottom;
  }
 
 #EmpireBoard table.Overview tfoot { 
  background: #E7C680 url(skin/input/button.gif) repeat-x scroll 0 0;
  border-top: 2px solid #CB9B6A;
  }

 #EmpireBoard table.Overview tbody tr {
  border-top: 1px solid #ECCF8E;
  }
 
 #EmpireBoard table.Overview tfoot tr { 
  border-top: 1px solid #CB9B6A;
  }
 
 #EmpireBoard table.Overview tr.odd {
  background-color: #FDF1D4;
  }
 
 #EmpireBoard table.Overview tr.current {
  background-color: #FAE3B8;
  }
  
 #EmpireBoard table.Overview th,
 #EmpireBoard table.Overview td {
  border-left: 1px solid #ECCF8E;
  }
  
 #EmpireBoard.RtoL table.Overview th,
 #EmpireBoard.RtoL table.Overview td {
  border-left: inherit;
  border-right: 1px solid #ECCF8E;
  }
  
 #EmpireBoard table.Overview th {
  height: 22px;
  width: auto;
  padding: 1px;
  padding-bottom: 2px;
  padding-left: 3px;
  text-align: center !important;
  color: #542C0F; 
  font-weight: bold;
  text-shadow:0 1px #FFFFFF;
  }
  
 #EmpireBoard table.Overview td {
  height: auto;
  line-height: 11px;
  font-size: 11px;
  min-width: 10px;
  padding: 1px;
  vertical-align: top;
  text-align: right;
  color: #542C0F;
  text-shadow:0 1px #FFFFFF;
  }
  
 #EmpireBoard table.Overview th.lf,
 #EmpireBoard table.Overview td.lf {
  border-left: 2px solid #CB9B6A;
  }
 #EmpireBoard.RtoL table.Overview th.lf,
 #EmpireBoard.RtoL table.Overview td.lf {
  border-left: inherit;
  border-right: 2px solid #CB9B6A;
  }
  
 #EmpireBoard table.Overview th.nolf,
 #EmpireBoard table.Overview td.nolf {
  border-left: none;
  }
 #EmpireBoard.RtoL table.Overview th.nolf,
 #EmpireBoard.RtoL table.Overview td.nolf {
  border-left: inherit;
  border-right: none;
  }
  
 #EmpireBoard table.Overview th.city_name,
 #EmpireBoard table.Overview td.city_name {
  overflow: hidden;
  }

 #EmpireBoard table.Overview th.actions,
 #EmpireBoard table.Overview td.actions,
 #EmpireBoard table.Overview th.lfdash,
 #EmpireBoard table.Overview td.lfdash {
  border-left: 1px dashed #ECCF8E;
  }
 #EmpireBoard.RtoL table.Overview th.actions,
 #EmpireBoard.RtoL table.Overview td.actions,
 #EmpireBoard.RtoL table.Overview th.lfdash,
 #EmpireBoard.RtoL table.Overview td.lfdash {
  border-left: inherit;
  border-right: 1px dashed #ECCF8E;
  }
  
 #EmpireBoard table.Overview th.city_name {
  width: 95px !important;
  max-width: 95px;
  }
 #EmpireBoard.RtoL table.Overview th.city_name {}
 
 #EmpireBoard table.Overview th.actions {
  width: 62px;
  max-width: 62px;
  padding-left: 2px;
  padding-bottom: 3px;
  text-align: right !important;
  vertical-align: bottom;
  }

 #EmpireBoard table.Buildings th.build_name0,
 #EmpireBoard table.Buildings th.build_name1,
 #EmpireBoard table.Buildings th.build_name2,
 #EmpireBoard table.Buildings th.build_name3,
 #EmpireBoard table.Buildings th.build_name4,
 #EmpireBoard table.Buildings th.build_name5,
 #EmpireBoard table.Buildings th.build_name6,
 #EmpireBoard table.Buildings th.build_name7,
 #EmpireBoard table.Buildings th.build_name8,
 #EmpireBoard table.Buildings th.build_name9,
 #EmpireBoard table.Buildings th.build_name10,
 #EmpireBoard table.Buildings th.build_name11,
 #EmpireBoard table.Buildings th.build_name12 { max-width: 25px; overflow: hidden; cursor: default;}
 #EmpireBoard table.Buildings th.build_name2 { max-width: 45px;}
 #EmpireBoard table.Buildings th.build_name3 { max-width: 65px;}
 #EmpireBoard table.Buildings th.build_name4 { max-width: 80px;}
 #EmpireBoard table.Buildings th.build_name5 { max-width: 95px;}
 #EmpireBoard table.Buildings th.build_name6 { max-width: 105px;}
 #EmpireBoard table.Buildings th.build_name7 { max-width: 115px;}
 #EmpireBoard table.Buildings th.build_name8 { max-width: 125px;}
 #EmpireBoard table.Buildings th.build_name9 { max-width: 135px;}
 #EmpireBoard table.Buildings th.build_name10 { max-width: 140px;}
 #EmpireBoard table.Buildings th.build_name11 { max-width: 145px;}
 #EmpireBoard table.Buildings th.build_name12 { max-width: 150px;}
 
 #EmpireBoard table.Army th.unit_name { min-width: 25px; max-width: 35px; overflow: hidden; cursor: default;}
 
 #EmpireBoard table.Army th.upkeep { min-width: 20px; overflow: hidden; cursor: default; }

 #EmpireBoard table.Overview tfoot td { 
  font-weight: bold;
  }
 
 #EmpireBoard table.Buildings td {vertical-align: middle;}
 
 #EmpireBoard table.Overview td.city_name {
  width: 110px;
  max-width: 110px;
  padding-left: 3px;
  text-align: left;
  }
  
 #EmpireBoard.RtoL table.Overview td.city_name { text-align: right; }
 
 #EmpireBoard table.Overview td.actions {  text-align: right; line-height:12px; padding-right:3px;}
 #EmpireBoard.RtoL table.Overview td.actions { }

 #EmpireBoard table.Overview th.actions img,
 #EmpireBoard table.Overview td.actions img { margin-left: 1px; border: none; max-height: 15px;}
 #EmpireBoard table.Overview td.actions img.Action { height: 12px; margin-top: 1px; }

 #EmpireBoard.RtoL table.Overview td.sigma {
  text-align: left;
  }
  
 #EmpireBoard table.Overview .More {
  font-size: 10px;
  line-height: 10px !important;
  height: 10px !important;
  margin-top:-1px;
  clear: both;
  display: block;
  cursor: default;
  text-shadow: none;
  }
 #EmpireBoard table.Resources .MoreGoods { margin-top:0; }
 #EmpireBoard table.Overview tbody .More { color: #CB9B6A;}

 #EmpireBoard table.Buildings td.current {
  }
 #EmpireBoard table.Buildings td.current a {
  color: #542C0F;
  }

 /****************** progress bar styles *******************/
 #EmpireBoard table.Overview table.myPercent {
  height: auto !important;
  width: 92%;
  margin-top: 2px;
  margin-left: 2px;
  margin-right: 2px;
  background-color: !transparent !important;
  box-shadow: 0 0 1px rgba(0, 0, 0, 0.6);
  }
 #EmpireBoard table.Overview table.myPercent td {
  height: 4px !important;
  min-width: 0px !important;
  padding: 0px !important;
  background-color: #CB9B6A;
  border: 1px solid #FDF7DD;
  }
 #EmpireBoard table.Overview table.myPercent td.Normal { background-color: #73443E;}
 #EmpireBoard table.Overview table.myPercent td.Warning { background-color: #8F1D1A;}
 #EmpireBoard table.Overview table.myPercent td.AlmostFull { background-color: #B42521;}
 #EmpireBoard table.Overview table.myPercent td.Full { background-color: #ff0000;}
 /****************** alerts *******************/
 #EmpireBoard sup {
  vertical-align: top !important;
  font-size: 9px;
  line-height: 9px;
  margin-left: 1px;
  }
 #EmpireBoard .Bold,
 #EmpireBoard .Brown,
 #EmpireBoard .DarkRed,
 #EmpireBoard .Red {font-weight: bold;}
 #EmpireBoard .Green {  color: green !important;}
 #EmpireBoard .Brown {  color: #8F1D1A !important;}
 #EmpireBoard .DarkRed {  color: #CC3300 !important;}
 #EmpireBoard .Red {  color: red !important;}
 #EmpireBoard img.Safe { height: 11px; }
 #EmpireBoard table.Overview td img.Safe {float: left; margin-left: 1px; margin-right: 1px;}

 /****************** footer *******************/

 #EmpireBoard p {text-align: left; display: block;  }
 #EmpireBoard.RtoL p {text-align: right;}
 #EmpireBoard p.Caption { font-size: 9px; margin: 0 2px;}

 #EmpireBoardSettings {}
 #EmpireBoardSettings td {border: none !important;}
 #EmpireBoardSettings input.button {margin-right: 5px;}
 
 #EmpireBoard #EmpireBoardAddons { float: left; text-align: left;}
 #EmpireBoard.RtoL #EmpireBoardAddons { text-align: right;}
 #EmpireBoardAddons u { font-weight: bold; }
 #EmpireBoardAddons li { list-style-type: disc; list-style-position: inside; padding-left: 15px; }

 #EmpireBoard p.Footer {text-align: right; clear: both;}
 #EmpireBoard.RtoL p.Footer {text-align: left;}
 #EmpireBoard p.Footer .button {}

 /****************** tooltip *******************/
 #EmpireBoardTooltip {
  position:absolute;
  z-index: 2000;
  }
 #WzTtDiV,
 #EmpireBoardTooltip {
  box-shadow: 2px 2px 0 rgba(0, 0, 0, 0.2); 
  }

 .TTContent {
  padding: 3px;
  color: #542C0F;
  background-color: #FDF7DD;
  border: 1px solid #BE8D53;
  border-top-width: 4px;
  }
 .TTTitle { font-weight: bold; background-color: #FAE0AE;padding: 3px; margin: -3px; margin-bottom:4px;}
 .RtoL .TTTitle { text-align: right; }
 
 .TTContent table tbody {background-color: #FAEAC6; border-bottom-width: 3px; border-bottom-color: #FDF7DD;border-bottom-style: solid;}
 .TTContent table tfoot {background-color: #FAE0AE;}
 .TTContent table td {padding: 2px; height: auto !important;}
 .TTContent table .Small td {
  padding-top: 0px;
  font-size: 10px !important;
  line-height: 10px !important;
  }
 .TTContent table td.Mission img { max-height: 15px;}
 ]]></>.toXMLString();
 
 GM_addStyle(default_style);
 };

EmpireBoard.Renders.ArmyFleet_HeaderIcons = function(currentCityId)
 {
 var rHTML = '';
  
 rHTML += this.IconTo_safehouseReports(currentCityId);
 if (reportViewToSurvey('safehouse-reports') == '!')
  {
  rHTML += '<sup class=Red title="Require attention">!</sup>';
  }
 else
  {
  rHTML += '&nbsp;';
  }
 
 rHTML += '<a view="militaryAdvisorCombatReports" href="?view=militaryAdvisorCombatReports" title="View combat reports"><img align="absmiddle" src="skin/layout/medallie32x32_gold.gif"/></a>';
 // skin/layout/icon-helmet.gif
 if (reportViewToSurvey('militaryAdvisorCombatReports') == '!')
  {
  rHTML += '<sup class=Red title="Require attention">!</sup>';
  }
 else
  {
  rHTML += '&nbsp;';
  }
 
 rHTML += '<a view="militaryAdvisorMilitaryMovements" href="?view=militaryAdvisorMilitaryMovements" title="View military advisor"><img align="absmiddle" src="skin/relatedCities/general.gif"/></a>';
 // skin/layout/icon-helmet.gif
 if (reportViewToSurvey('militaryAdvisorMilitaryMovements') == '!')
  {
  rHTML += '<sup class=Red title="Require attention">!</sup>';
  }
 else
  {
  rHTML += '&nbsp;';
  }
 
 return rHTML;
 };

EmpireBoard.Renders.IconTo_safehouseReports = function(currentCityId,Title)
 {
 if (currentCityId == undefined) currentCityId = 0;
 if (Title == undefined) Title = "View espionage reports";
 var rHTML = '';
 var sCityId = 0;
 var sCityPos = -1;
 
 if (currentCityId > 0) 
  {
  sCityPos = getBuildingPosition(currentCityId, 'safehouse', -1);
  if (sCityPos > 0)
   {
   sCityId = currentCityId;
   }
  }
  
 if (sCityId == 0)
  {
  var Cities = this._Parent.DB.CurrentCities;
  for (CityId in Cities)
   {
   if (Cities[CityId].own != true) continue;
   sCityPos = getBuildingPosition(CityId, 'safehouse', -1);
   if (sCityPos > 0)
    {
    sCityId = CityId;
    break;
    }
   }
  }
  
 if ((sCityId == 0) || (sCityPos <= 0))
  {
  return '';
  }
 else
  {
  rHTML += '<a view="safehouse" tab="reports" cityid="'+sCityId+'" position="'+sCityPos+'" href="?view=safehouse&id='+sCityId+'&position='+sCityPos+'&tab=reports" title="'+Title+'"><img align="absmiddle" src="skin/buildings/x40_y40/safehouse.gif"/></a>';
  // skin/img/city/building_safehouse.gif
  return rHTML;
  }
 };
  
EmpireBoard.Renders.Resources_HeaderIcons = function(currentCityId)
 {
 var rHTML = '';
  
 rHTML += '<a href="?view=merchantNavy" view="merchantNavy" title="View merchant navy"><img align="absmiddle" src="skin/img/city/building_port.gif" /></a>';
 if (reportViewToSurvey('merchantNavy') == '!')
  {
  rHTML += '<sup class=Red title="Require attention">!</sup>';
  }
 else
  {
  rHTML += '&nbsp;';
  }
 
 rHTML += '<a href="?view=finances" view="finances" title="View finances"><img align="absmiddle" src="skin/img/city/building_townhall.gif" /></a>';
 if (reportViewToSurvey('finances') == '!')
  {
  rHTML += '<sup class=Red title="Require attention">!</sup>';
  }
 else
  {
  rHTML += '&nbsp;';
  }
 
 rHTML += '<a href="?view=premium" view="premium" title="View premium features"><img align="absmiddle" src="skin/premium/ambrosia_icon.gif" /></a>';
 if (reportViewToSurvey('premium') == '!')
  {
  rHTML += '<sup class=Red title="Require attention">!</sup>';
  }
 else
  {
  rHTML += '&nbsp;';
  }
 
 return rHTML;
 };
  
EmpireBoard.Renders.Buildings_HeaderIcons = function(currentCityId)
 {
 var rHTML = '';
 
 rHTML += this.IconTo_researchOverview(currentCityId);
 if (reportViewToSurvey('researchOverview') == '!')
  {
  rHTML += '<sup class=Red title="Require attention">!</sup>';
  }
 else
  {
  rHTML += '&nbsp;';
  }
 
 rHTML += this.IconTo_researchAdvisor();
 if (reportViewToSurvey('researchAdvisor') == '!')
  {
  rHTML += '<sup class=Red title="Require attention">!</sup>';
  }
 else
  {
  rHTML += '&nbsp;';
  }
 
 return rHTML;
 };
 
EmpireBoard.Renders.IconTo_researchAdvisor = function(Title)
 {
 if (Title == undefined) Title = "View research advisor";
 var rHTML = '';
  
 rHTML += '<a view="researchAdvisor" href="?view=researchAdvisor" title="'+Title+'"><img align="absmiddle" src="skin/resources/icon_scientist.gif"/></a>';
 
 return rHTML;
 };
  
EmpireBoard.Renders.IconTo_researchOverview = function(currentCityId,Title)
 {
 if (currentCityId == undefined) currentCityId = 0;
 if (Title == undefined) Title = "View research library";
 var rHTML = '';
  
 rHTML += '<a view="researchOverview" cityid="'+currentCityId+'" href="?view=researchOverview&id='+currentCityId+'" title="'+Title+'"><img align="absmiddle" src="skin/buildings/x40_y40/academy.gif"/></a>';
 // skin/icons/researchbonus_30x30.gif
 // skin/img/city/building_academy.gif
 return rHTML;
 };
  
EmpireBoard.Renders.Movements_Tooltip_Content = function(cityID)
 {
 var tooltip = "<table>";
 var orderedUnits = this._Parent.Ikariam.UnitsList();
 
 if (config["movements"] == undefined)
  {
  return '';
  }
 else if (config["movements"][cityID] != undefined)
  {
  for (key in config["movements"][cityID])
   {
   var arrivetime = config["movements"][cityID][key].endTime;
   if (arrivetime >= this._Parent.StartTime)
    {
    var tCityId = config["movements"][cityID][key].tCityId;
    var tCity ='';
    if ((this._Parent.DB.CurrentCities[tCityId] != undefined) && (this._Parent.DB.CurrentCities[tCityId].own == true))
     {
     tCity = config["movements"][cityID][key].tCityName;
     }
    else
     {
     tCity = config["movements"][cityID][key].tCityName+" ("+config["movements"][cityID][key].tPlayerName+")";
     }
    
    var tLocation = "";
    if (config["movements"][cityID][key].toLeft == true)
     {
     tLocation += "&laquo;";
     }
    else if (config["movements"][cityID][key].toRight == true)
     {
     tLocation += "&raquo;";
     }
    else
     {
     tLocation += "&laquo;&raquo;";
     }
    tLocation += "&nbsp;";
    tLocation += "<i>"+tCity+"</i>";
    
    var payload = '';
    if (config["movements"][cityID][key].payload != undefined)
     {
     for (utype in orderedUnits)
      {
      if (config["movements"][cityID][key].payload[utype] != undefined)
       {
       var ugender = this._Parent.Ikariam.Get_UnitGender(utype);
       if (ugender == 'army')
        {
        payload += config["movements"][cityID][key].payload[utype]+' <img align="absmiddle" height="18" src="/skin/characters/military/x40_y40/y40_'+utype+'_faceright.gif">&nbsp;';
        }
       else if (ugender == 'fleet')
        {
        payload += config["movements"][cityID][key].payload[utype]+' <img align="absmiddle" height="18" src="/skin/characters/fleet/40x40/'+utype+'_r_40x40.gif">&nbsp;';
        }
       }
      }
     }
    
    var counter = "(<font id='mytimecounter' counter='"+Math.round(arrivetime)+"' class='time_counter'>__:__:__</font>)";
    var smartDate = smartDateFormat(arrivetime);
     
    tooltip += "<tbody><tr>"+
       "<td valign=top align=left class='Mission'><img src='"+this._Parent.Ikariam.Get_FleetMission_ImgSrc(config["movements"][cityID][key].mission)+"' /></td>"+
       "<td valign=top align=right><nobr><b>"+config["movements"][cityID][key].summary+"</b></nobr>&nbsp;</td>"+
       "<td valign=top align=left>"+tLocation+"</td>"+
       "</tr><tr class=Small>"+
       "<td class=Payload align=left valign=middle colspan=2><nobr>"+payload+"</nobr></td>"+
       "<td align=right colspan=3>&nbsp;<nobr>"+smartDate+"&nbsp;"+counter+"</nobr></td>"+
       "</tr></tbody>";
    }
   }
  }
 else
  {
  return '';
  }
 
 tooltip += "</table>";
 return tooltip;
 };
 
EmpireBoard.Renders.Attacks_Tooltip_Content = function(cityID)
 {
 var tooltip = "<table>";
 
 if (config["attacks"] == undefined)
  {
  return '';
  }
 else if (config["attacks"][cityID] != undefined)
  {
  for (key in config["attacks"][cityID])
   {
   var arrivetime = config["attacks"][cityID][key].endTime;
   if (arrivetime >= this._Parent.StartTime)
    {
    var tCityId = config["attacks"][cityID][key].oCityId;
    var tCity ='';
     
    tCity = config["attacks"][cityID][key].oCityName+" ("+config["attacks"][cityID][key].oPlayerName+")";
    
    var tLocation = "";
    tLocation += "<i>"+tCity+"</i>";
    tLocation += "&nbsp;";
    if (config["attacks"][cityID][key].toLeft == true)
     {
     tLocation += "&laquo;";
     }
    else if (config["attacks"][cityID][key].toRight == true)
     {
     tLocation += "&raquo;";
     }
    else
     {
     tLocation += "&laquo;&raquo;";
     }
    
    var counter = "(<font id='mytimecounter' counter='"+Math.round(arrivetime)+"' class='time_counter'>__:__:__</font>)";
    var smartDate = smartDateFormat(arrivetime);
     
    tooltip += "<tbody><tr>"+
       "<td valign=top align=left class=Red>"+tLocation+"</td>"+
       "<td valign=top align=left class='Mission'><img src='"+this._Parent.Ikariam.Get_FleetMission_ImgSrc(config["attacks"][cityID][key].mission)+"' /></td>"+
       "<td valign=top align=right class=Red><b>"+config["attacks"][cityID][key].summary+"</b>&nbsp;</td>"+
       "</tr><tr class=Small>"+
       "<td align=right colspan=3>&nbsp;&nbsp;"+smartDate+"&nbsp;"+counter+"</td>"+
       "</tr></tbody>";
    }
   }
  }
 else
  {
  return '';
  }
 
 tooltip += "</table>";
 return tooltip;
 };
 
EmpireBoard.Renders.ArrivingGoods_Tooltip_Content = function(city_id, resName)
 {
 var _nowTime = new Date().getTime();
 
 var tooltip = "<table>";
 
 var sum = 0;
 
 var city = getCity(city_id);
 var rows = getArrValue(config.arrivinggoods, city_id, []);
 var key;
 var higherTime = 0;
 for (key in rows)
  {
  var row = rows[key];
  var res = row["res"];
  var a = parseInt(getArrValue(res, resName, 0));
  var arrivetime = parseInt(getArrValue(row, "arrivetime", ""));
  if ((a > 0) && (arrivetime > city.prodtime))
   {
   sum += a;
   var startcity = getArrValue(row, "startcity", "");
   var quest = getArrValue(row, "quest", "");
   if (_nowTime >= arrivetime)
    {
    var counter = "(delivered)";
    var smartDate = '';
    }
   else if (quest == 'loading')
    {
    var counter = "(loading)";
    var smartDate = '';
    }
   else
    {
    if (arrivetime > higherTime) higherTime = arrivetime;
    var counter = "(<font id='mytimecounter' counter='"+Math.round(arrivetime)+"' class='time_counter'>__:__:__</font>)";
    var smartDate = smartDateFormat(arrivetime);
    }
   var fromLocation = "&laquo;&nbsp;<i>" + startcity + "</i>";
    
   tooltip += "<tbody><tr>"+
      "<td valign=top>+</td>"+
      "<td valign=top align=right><b>"+this._Parent.Str.FormatBigNumber(a) + "</b>&nbsp;</td>"+
      "<td valign=top align=left>"+fromLocation+"</td>"+
      "</tr><tr class=Small>"+
      "<td align=right colspan=3>&nbsp;&nbsp;" + smartDate + "&nbsp;"+counter+"</td>"+
      "</tr></tbody>";
   }
  }
 
 var tradinggoods = 0;
 var hourlyprod = 0;
 var resAmount = parseInt(getArrValue(city, resName, 0));
 if (resName == 'wood')
  {
  tradinggoods = city.tradewood;
  hourlyprod = city.prodwood;
  resAmount = getCurrentResourceAmount(_nowTime, city.prodtime, city.wood, city.prodwood);
  }
 else if (resName == 'wine')
  {
  tradinggoods = city.tradewine;
  var wineUsage = 0;
  var cellarLevel = getBuildingLevel(city_id, "vineyard", "-");
  var tavernLevel = getBuildingLevel(city_id, "tavern", "-");
  if (tavernLevel == '-')
   {
   // Fix if tavern has been demolished without disable wine usage
   }
  else if (city.wineUsageId != undefined)
   {
   wineUsage = tavernWineUsage[city.wineUsageId];
   if (cellarLevel != '-')
    {
    wineSave = wineUsage * cellarLevel;
    wineSave = Math.round(wineSave / 100);
    wineUsage = wineUsage - wineSave;
    }
   }
  hourlyprod = city.prodwine - wineUsage;
  resAmount = getCurrentResourceAmount(_nowTime, city.prodtime, city.wine, city.prodwine - wineUsage);
  }
 else if (resName == 'marble')
  {
  tradinggoods = city.trademarble;
  hourlyprod = city.prodmarble;
  resAmount = getCurrentResourceAmount(_nowTime, city.prodtime, city.marble, city.prodmarble);
  }
 else if (resName == 'glass')
  {
  tradinggoods = city.tradeglass;
  hourlyprod = city.prodglass;
  resAmount = getCurrentResourceAmount(_nowTime, city.prodtime, city.glass, city.prodglass);
  }
 else if (resName == 'sulfur')
  {
  tradinggoods = city.tradesulfur;
  hourlyprod = city.prodsulfur;
  resAmount = getCurrentResourceAmount(_nowTime, city.prodtime, city.sulfur, city.prodsulfur);
  }
  
 if ((tradinggoods != undefined) && (parseInt(tradinggoods) > 0))
  {
  sum += parseInt(tradinggoods);
  tooltip += "<tbody><tr>"+
      "<td>+</td>"+
      "<td align=right><b>"+this._Parent.Str.FormatBigNumber(parseInt(tradinggoods)) + "</b>&nbsp;</td>"+
      "<td align=left>&laquo;&nbsp;<i>" + this._Parent.Intl.TT('branchOffice','buildings') + "</i></td>"+
     "</tr></tbody>";
  }
  
 if (resAmount > 0)
  {
  tooltip += "<tbody><tr>"+
     "<td>+</td>"+
     "<td align=right><b>"+this._Parent.Str.FormatBigNumber(resAmount) + "</b>&nbsp;</td>"+
     "<td align=left>&laquo;&nbsp;<i>" + this._Parent.Intl.TT('warehouse','buildings') + "</i></td>"+
     "</tr></tbody>";
  }
    
 if (sum > 0)
  {
  tooltip += "<tfoot><tr>"+
     "<td>=</td>"+
     "<td align=right><b>"+this._Parent.Str.FormatBigNumber(sum+resAmount) + "</b>&nbsp;</td>"+
     "<td></td>"+
     "</tr>";
  if ((hourlyprod != 0) && (higherTime > _nowTime + (1000 * 60 * 20)))
   {
   var restHours = (higherTime - _nowTime) / (1000 * 60 * 60);
   var prodSign = '+';
   if (hourlyprod < 0) prodSign = '-';
   tooltip += "<tr class=Small>"+
      "<td>"+prodSign+"</td>"+
      "<td align=right>"+this._Parent.Str.FormatBigNumber(Math.abs(hourlyprod)) + "&nbsp;</td>"+
      "<td align=left>x&nbsp;" + this._Parent.Str.FormatFloatNumber(restHours, 1) + this._Parent.Ikariam.LocalizationStrings('hour','timeunits','short')+"</td>"+
      "</tr>";
   tooltip += "<tr class=Small>"+
      "<td>=</td>"+
      "<td align=right>"+this._Parent.Str.FormatBigNumber(sum+resAmount+Math.floor(restHours*hourlyprod)) + "&nbsp;</td>"+
      "<td align=left>&raquo;&nbsp;" + smartDateFormat(higherTime)+"</td>"+
      "</tr>";
   }
  tooltip += "</tfoot>";
  }

 tooltip += "</table>";
 return tooltip;
 };

EmpireBoard.Ikariam =
 {
 _Parent:     null,
 _View:      null,
 _Tab:      null,
 _Host:      null,
 _Server:     null,
 _Language:     null,
 _Version:     null,
 _Revision:     null,
 _IsVersions:    {},
 _ActionRequest:    null,
 _currentCity:    null,
 _phpSet:     null,
 _LocalizationStrings:  null,
 _UnitsList:     null,
 _UnitsClassNames:   null,
 _BuildingsList:    null,
 _IsLogged:     null
 };
 
EmpireBoard.Ikariam.Init = function(parent)
 {
 this._Parent = parent;
 };

EmpireBoard.Ikariam.BuildingsList = function()
 {
 if (this._BuildingsList == null)
  {
  this._BuildingsList       = {};
  this._BuildingsList['townHall']    = 'growth';
  this._BuildingsList['palace']    = 'growth';
  this._BuildingsList['palaceColony']   = 'growth';
  this._BuildingsList['tavern']    = 'growth';
  this._BuildingsList['museum']    = 'growth';
  this._BuildingsList['academy']    = 'research';
  this._BuildingsList['workshop']    = 'research';
  this._BuildingsList['temple']    = 'research';
  this._BuildingsList['embassy']    = 'diplomacy';
  this._BuildingsList['warehouse']   = 'trading';
  this._BuildingsList['dump']     = 'trading';
  this._BuildingsList['port']     = 'trading';
  this._BuildingsList['branchOffice']   = 'trading';
  this._BuildingsList['wall']     = 'military';
  this._BuildingsList['safehouse']   = 'military';
  this._BuildingsList['barracks']    = 'military';
  this._BuildingsList['shipyard']    = 'military';
  this._BuildingsList['forester']    = 'wood';
  this._BuildingsList['carpentering']   = 'wood';
  this._BuildingsList['winegrower']   = 'wine';
  this._BuildingsList['vineyard']    = 'wine';
  this._BuildingsList['stonemason']   = 'marble';
  this._BuildingsList['architect']   = 'marble';
  this._BuildingsList['glassblowing']   = 'crystal';
  this._BuildingsList['optician']    = 'crystal';
  this._BuildingsList['alchemist']   = 'sulfur';
  this._BuildingsList['fireworker']   = 'sulfur';
  }
 return this._BuildingsList;
 };

EmpireBoard.Ikariam.Get_BuildingUsage = function(buildingName)
 {
 var buildingUsage = '';
 orderedBuildings = this.BuildingsList();
 if (orderedBuildings[buildingName] != undefined)
  {
  var arrayClassNames = orderedBuildings[buildingName].split(' ');
  buildingUsage = arrayClassNames[0];
  }
 return buildingUsage;
 };

EmpireBoard.Ikariam.UnitsClassNames = function()
 {
 if (this._UnitsClassNames == null)
  {
  this._UnitsClassNames = {};
  // Army
  this._UnitsClassNames[301] = 'slinger';
  this._UnitsClassNames[302] = 'swordsman';
  this._UnitsClassNames[303] = 'phalanx';
  this._UnitsClassNames[304] = 'marksman';
  this._UnitsClassNames[305] = 'mortar';
  this._UnitsClassNames[306] = 'catapult';
  this._UnitsClassNames[307] = 'ram';
  this._UnitsClassNames[308] = 'steamgiant';
  this._UnitsClassNames[309] = 'bombardier';
  this._UnitsClassNames[310] = 'cook';
  this._UnitsClassNames[311] = 'medic';
  this._UnitsClassNames[312] = 'gyrocopter';
  this._UnitsClassNames[313] = 'archer';
  this._UnitsClassNames[315] = 'spearman';
  // Fleet
  this._UnitsClassNames[210] = 'ship_ram';
  this._UnitsClassNames[211] = 'ship_flamethrower';
  this._UnitsClassNames[212] = 'ship_submarine';
  this._UnitsClassNames[213] = 'ship_ballista';
  this._UnitsClassNames[214] = 'ship_catapult';
  this._UnitsClassNames[215] = 'ship_mortar';
  this._UnitsClassNames[216] = 'ship_steamboat';
  // v.0.4.x new units
  this._UnitsClassNames[217] = 'ship_rocketship';
  this._UnitsClassNames[218] = 'ship_paddlespeedship';
  this._UnitsClassNames[219] = 'ship_ballooncarrier';
  this._UnitsClassNames[220] = 'ship_tender';
  }
 return this._UnitsClassNames;
 };

EmpireBoard.Ikariam.UnitsList = function()
 {
 if (this._UnitsList == null)
  {
  this._UnitsList        = {};
  this._UnitsList['phalanx']     = 'army line1';
  this._UnitsList['steamgiant']    = 'army line1';
  this._UnitsList['spearman']     = 'army flank';
  this._UnitsList['swordsman']    = 'army flank';
  this._UnitsList['slinger']     = 'army line2';
  this._UnitsList['archer']     = 'army line2';
  this._UnitsList['marksman']     = 'army line2';
  this._UnitsList['ram']      = 'army artillery';
  this._UnitsList['catapult']     = 'army artillery';
  this._UnitsList['mortar']     = 'army artillery';
  this._UnitsList['gyrocopter']    = 'army air';
  this._UnitsList['bombardier']    = 'army air';
  this._UnitsList['cook']      = 'army support';
  this._UnitsList['medic']     = 'army support';
  this._UnitsList['ship_ram']     = 'fleet line1';
  this._UnitsList['ship_flamethrower']  = 'fleet line1';
  this._UnitsList['ship_steamboat']   = 'fleet line1';
  this._UnitsList['ship_ballista']   = 'fleet line2';
  this._UnitsList['ship_catapult']   = 'fleet line2';
  this._UnitsList['ship_mortar']    = 'fleet line2';
  this._UnitsList['ship_rocketship']   = 'fleet firststrike';
  this._UnitsList['ship_submarine']   = 'fleet firststrike';
  this._UnitsList['ship_paddlespeedship']  = 'fleet carrier';
  this._UnitsList['ship_ballooncarrier']  = 'fleet carrier';
  this._UnitsList['ship_tender']    = 'fleet support';
  }
 return this._UnitsList;
 };
 
EmpireBoard.Ikariam.Get_UnitGender = function(unitType)
 {
 var unitGender = '';
 orderedUnits = this.UnitsList();
 if (orderedUnits[unitType] != undefined)
  {
  var arrayClassNames = orderedUnits[unitType].split(' ');
  unitGender = arrayClassNames[0];
  }
 return unitGender;
 };

EmpireBoard.Ikariam.Is_Logged = function()
 {
 if (this._IsLogged == null)
  {
  this._IsLogged = this._Parent.DOM.Has_Node("//div[@id='GF_toolbar']//li[contains(@class,'logout')]");
  this._Parent.Log.Add('User logged : '+(this._IsLogged == true ? 'yes' : 'no'));
  }
  
 return this._IsLogged;
 };

EmpireBoard.Ikariam.View = function()
 {
 if (this._View == null)
  {
  this._View = '';
  
  if (this.phpSet('currentView') != undefined)
   {
   this._View = this.phpSet('currentView');
   }
  else
   {
   // Fetch view name
   try
    {
    this._View = document.getElementsByTagName("body")[0].id;
    }
   catch (e)
    {
    var url_view = /[\?&]view=([a-zA-Z0-9\-_]+)/.exec(document.URL);
    if (url_view != null) this._View = RegExp.$1;
    }
   }
  
  this._Parent.Log.Add('View = '+this._View);
  }
  
 return this._View;
 };
 
EmpireBoard.Ikariam.Host = function()
 {
 if (this._Host == null)
  {
  this._Host = '';
  
  this._Host = document.location.host;
  }
  
 return this._Host;
 };
 
EmpireBoard.Ikariam.Server = function(host)
 {
 if (this._Server == null)
  {
  if (host == undefined) host = this.Host();
  this._Server = '';
  
  var parts = host.split(".");
  var idx = 0;
  if (parts[0] == 'www') idx++;
  this._Server = parts[idx];
  }
 
 return this._Server;
 };

EmpireBoard.Ikariam.Language = function()
 {
 if (this._Language == null)
  {
  if (this.LocalizationStrings('language') != undefined)
   {
   this._Language = this.LocalizationStrings('language');
   }
  else
   {
   this._Language = '';
   
   var sCode = '';
   var scripts = document.getElementsByTagName("script");
   for (var j = 0; j < scripts.length; j++)
    {
    var nScript = scripts[j];
    sCode = nScript.innerHTML;
    if (sCode.indexOf('LocalizationStrings') >= 0)
     {
     break;
     }
    }
   
   if (sCode != '')
    {
    var reg = /LocalizationStrings\['language'\]\s+=\s+'(.+)';/;
    var res = reg.exec(sCode);
    if (res != null) this._Language = res[1];
    }
   }
   
  //if (this._Language == '') this._Language = 'en';
  }
 return this._Language;
 };
 
EmpireBoard.Ikariam.Grab_JSCompleteScript_Version = function(defaultVersion)
 {
 // Requires: DOM
 var Version = '';
 if (defaultVersion != undefined) Version = defaultVersion;
 
 var JSCompleteScript = this._Parent.DOM.Get_First_Node("//script[contains(@src,'/js/complete')]");
 if (JSCompleteScript != null)
  {
  var JSCompleteSrc = JSCompleteScript.src;
  var JSCompleteRegExp_x3 = /complete-([0-9]+\.[0-9]+\.[0-9]+)/.exec(JSCompleteSrc);
  if (JSCompleteRegExp_x3 != null)
   {
   Version = RegExp.$1;
   }
  var JSCompleteRegExp_x4 = /complete-([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/.exec(JSCompleteSrc);
  if (JSCompleteRegExp_x4 != null)
   {
   Version = RegExp.$1;
   }
  }
  
 return Version;
 };
 
EmpireBoard.Ikariam.Version = function()
 {
 // Requires: DOM
 if (this._Version == null)
  {
  this._Version = '';
  
  this._Version = this._Parent.DOM.Get_First_Node_TextContent("//div[@id='GF_toolbar']//li[@class='version']//span[@class='textLabel']",'');
  
  // remove "v."
  this._Version = this._Version.replace(/v\./gi, "");
  // remove "v"
  this._Version = this._Version.replace(/v/gi, "");
  // build number use space separator
  this._Version = this._Version.replace(/ /gi, ".");
  
  if ((this._Version == '0.4.X') || (this._Version == '0.4.x'))
   {
   this._Version = this.Grab_JSCompleteScript_Version('0.4.4.2');
   }
  else if (this._Version == '0.4.4')
   {
   this._Version = this.Grab_JSCompleteScript_Version('0.4.4');
   }
  else if (this._Version == '0.4.2')
   {
   this._Version = this.Grab_JSCompleteScript_Version('0.4.2');
   }
  
  this._Parent.Log.Add("Ikariam server version: "+this._Version);
  }
 
 return this._Version;
 };

EmpireBoard.Ikariam.Revision = function()
 {
 // Requires: DOM, Str
 if (this._Revision == null)
  {
  this._Revision = 0;
  
  this._Revision = this._Parent.Str.To_Integer(this._Parent.DOM.Get_First_Node_Title("//div[@id='GF_toolbar']//li[@class='version']//span[@class='textLabel']",'0'), 0);
  
  this._Parent.Log.Add("Ikariam server revision: "+this._Revision);
  }
 
 return this._Revision;
 };
 
// NB: return true if current version is higher or equal than requiredVersion
EmpireBoard.Ikariam.Is_Version = function(requiredVersion)
 {
 // Requires: Str
 var isHigher = false;
 
 if (requiredVersion == undefined)
  {
  isHigher = false;
  }
 else if (requiredVersion == '')
  {
  isHigher = false;
  }
 else
  {
  if (this._IsVersions[requiredVersion] == undefined)
   {
   if (this._Parent.Str.Compare_Versions(requiredVersion, this.Version()) >= 0)
    {
    isHigher = true;
    //this._Parent.Log.Add("Ikariam version is v."+requiredVersion+" or higher");
    }
   else
    {
    isHigher = false;
    }
   this._IsVersions[requiredVersion] = isHigher;
   }
  else
   {
   isHigher = this._IsVersions[requiredVersion];
   }
  }
 
 return isHigher;
 };

/* DEPRECATED
EmpireBoard.Ikariam.Is_Version_031x = function()
 {
 return this.Is_Version('0.3.1');
 };
 
EmpireBoard.Ikariam.Is_Version_032x = function()
 {
 return this.Is_Version('0.3.2');
 };
 
EmpireBoard.Ikariam.Is_Version_033x = function()
 {
 return this.Is_Version('0.3.3');
 };
 
EmpireBoard.Ikariam.Is_Version_034x = function()
 {
 return this.Is_Version('0.3.4');
 };
 
EmpireBoard.Ikariam.Is_Version_035x = function()
 {
 return this.Is_Version('0.3.5');
 };
 
EmpireBoard.Ikariam.Is_Version_040x = function()
 {
 return this.Is_Version('0.4.0');
 };
 
EmpireBoard.Ikariam.Is_Version_041x = function()
 {
 return this.Is_Version('0.4.1');
 };
 
EmpireBoard.Ikariam.Is_Version_042x = function()
 {
 return this.Is_Version('0.4.2');
 };
 
EmpireBoard.Ikariam.Is_Version_0424 = function()
 {
 return this.Is_Version('0.4.2.4');
 };
 
EmpireBoard.Ikariam.Is_Version_043x = function()
 {
 return this.Is_Version('0.4.3');
 };
 
EmpireBoard.Ikariam.Is_Version_044x = function()
 {
 return this.Is_Version('0.4.4');
 };
*/
 
EmpireBoard.Ikariam.Tab = function()
 {
 if (this._Tab == null)
  {
  this._Tab = '';
  var url_view = /[\?&]tab=([a-zA-Z0-9\-_]+)/.exec(document.URL);
  if (url_view != null) this._Tab = RegExp.$1;
  }
  
 return this._Tab;
 };
 
EmpireBoard.Ikariam.Trim_Coords = function(str)
 {
 // Require: Str
 return this._Parent.Str.Trim(this._Parent.Str.Trim_Accodances(str));
 };
 
EmpireBoard.Ikariam.Trim_PlayerName = function(str)
 {
 // Require: Str
 return this._Parent.Str.Trim(this._Parent.Str.Trim_Brackets(str));
 };
 
EmpireBoard.Ikariam.Trim_Unit = function(str)
 {
 // Require: Str
 str = str.replace("unit", "");
 str = str.replace("currentUnit", "");
  
 return this._Parent.Str.Trim(str);
 };

EmpireBoard.Ikariam.TwoDigit_Coords = function(str)
 {
 // Require: Str
 var a = str.indexOf('[');
 var b = str.indexOf(']');
 str = str.substring(a+1,b);
 var coords = str.split(':');
 res = '[';
 res += this._Parent.Str.TwoDigit(coords[0].substr(-2,2));
 res += ':';
 res += this._Parent.Str.TwoDigit(coords[1].substr(-2,2));
 res += ']';
 return res;
 };

EmpireBoard.Ikariam.City_Object = function()
 {
 var City = new Object;
 
 City.id    = 0;
 City.name   = '';
 //City.playername  = '';
 //City.islandid   = 0;
 
 City.knownTime  = new Date().getTime();
 
 //City.own    = false;
 //City.occupied   = false;
 //City.deployed   = false;
 
 //City.selected   = false;
 
 return City;
 };
 
EmpireBoard.Ikariam.Parse_Coords = function(str)
 {
 var res = null;
 
 if ((str != undefined) && (str != null) && (str != ''))
  {
  var resReg = /(\[[0-9:]+\])/.exec(str);
  if (resReg != null)
   {
   res = resReg[1];
   }
  }
  
 return res;
 };
   
EmpireBoard.Ikariam.Fetch_CitiesSelect = function(database, includeForeign)
 {
 // Requires: DOM, Str
 if (database == undefined)    database = {};
 if (includeForeign == undefined)  includeForeign = false;
 
 var Options = this._Parent.DOM.Get_Nodes("//select[@id='citySelect']/option");
 if (Options != null)
  {
  for (var i=0; i < Options.snapshotLength; i++)
   {
   var Option = Options.snapshotItem(i);
   
   // Occupied city ?
   var isOccupied = false;
   if (this._Parent.DOM.Has_ClassName(Option,'occupiedCities'))
    {
    isOccupied = true;
    }
   
   // Deployed troops into allied city
   var isDeployed = false;
   if (this._Parent.DOM.Has_ClassName(Option,'deployedCities'))
    {
    isDeployed = true;
    }
    
   if ((includeForeign == false) && ((isOccupied == true) || (isDeployed == true))) continue;
   
   var CityId = parseInt(Option.value);
   
   if (database[CityId] == undefined)
    {
    database[CityId] = new this.City_Object();
    }
   
   database[CityId].id = CityId;
   database[CityId].name = this.Trim_Coords(Option.textContent);
   if (isOccupied == true)
    {
    database[CityId].occupied = true;
    }
   else if (isDeployed == true)
    {
    database[CityId].deployed = true;
    }
   else
    {
    database[CityId].own = true;
    }
   
   if (Option.selected == true) database[CityId].selected = true;
   
   this._Parent.Log.Add('Fetch select list: city ['+CityId+'], '+database[CityId].name+', selected='+database[CityId].selected);
   }
  }
 
 return database;
 };

EmpireBoard.Ikariam.ActionRequest = function()
 {
 if (this._ActionRequest == null)
  {
  this._ActionRequest = this._Parent.DOM.Get_First_Node_Value("//form[@id='changeCityForm']//input[@type='hidden' and @name='actionRequest']" ,'');
  }
  
 return this._ActionRequest;
 };
 
EmpireBoard.Ikariam.Get_FleetMission_ImgSrc = function(mission)
 {
 // Values: deployarmy, deployfleet, plunder, blockade, defend, defend_port, trade, transport, occupy
 var tag = '';
 
 tag = 'skin/interface/mission_' + mission + '.gif';
 
 return tag;
 };
 
EmpireBoard.Ikariam.Get_Happiness_ImgSrc = function(growth)
 {
 if (growth == undefined) growth = 0;
 var imagen = '';
 var tag = '';
 
 if (growth < -6 )
  {
  imagen = 'outraged';
  }
 else if (growth < 0)
  {
  imagen = 'sad';
  }
 else if (growth < 1)
  {
  imagen = 'neutral';
  }
 else if (growth < 6)
  {
  imagen = 'happy';
  }
 else
  {
  imagen = 'ecstatic';
  }
 //tag = 'skin/smilies/' + imagen + '.gif';
 //tag = 'skin/smilies/'+imagen+'_x32.gif';
 tag = 'skin/smilies/'+imagen+'_x25.gif';
 
 return tag;
 };
 
EmpireBoard.Ikariam.Resource_Capacity = function(ResType, WarehouseLevel, DumpLevel, Bonus)
 {
 if (ResType == undefined) ResType = 'wine';
 if (WarehouseLevel == undefined) WarehouseLevel = 0;
 if (DumpLevel == undefined) DumpLevel = 0;
 if (Bonus == undefined) Bonus = 0;
 
 var result = 0;
 
 if (this.Is_Version('0.3.1') == true)
  {
  result = 1500;
  }
 else
  {
  if (ResType == 'wood')
   {
   result = 3000;
   }
  else
   {
   result = 1500;
   }
  }
 result = result + (WarehouseLevel * 8000);
 result = result + (DumpLevel * 32000);
 
 return result + (result/100*Bonus);
 };

EmpireBoard.Ikariam.Resource_SafeCapacity = function(ResType, WarehousesLevels, Bonus)
 {
 var _self = this;
 
 if (ResType == undefined) ResType = 'wine';
 if (WarehousesLevels == undefined) WarehousesLevels = 0;
 if (Bonus == undefined) Bonus = 0;
 
 function SafeCapacityPerWarehouse(ResType, WarehouseLevel)
  {
  if (_self.Is_Version('0.3.3') == true)
   {
   return (WarehouseLevel * 480);
   }
  else if (_self.Is_Version('0.3.1') == true)
   {
   return (WarehouseLevel * 80);
   }
  else
   {
   if (ResType == 'wood')
    {
    return (WarehouseLevel * 160);
    }
   else
    {
    return (WarehouseLevel * 80);
    }
   }
  }
  
 function isArray(obj)
  {
  if (obj.constructor.toString().indexOf("Array") == -1)
   return false;
  else
   return true;
  }
 
 var result = 0;
 
 if (this.Is_Version('0.3.4') == true)
  {
  result = 100;
  
  if (isArray(WarehousesLevels))
   {
   var WarehousesLevel = 0;
   if (WarehousesLevels.length <= 4)
    {
    var p;
    for (p in WarehousesLevels)
     {
     WarehousesLevel += WarehousesLevels[p];
     }
    }
   else
    {
    WarehousesLevels.sort(function(a,b){return b - a});
    for (var i=0; i<=3; i++)
     {
     WarehousesLevel += WarehousesLevels[i];
     }
    }
   result += SafeCapacityPerWarehouse(ResType, WarehousesLevel);
   }
  else
   {
   result += SafeCapacityPerWarehouse(ResType, parseInt(WarehousesLevels));
   }
  }
 else
  {
  var WarehousesLevel = 0;
  if (isArray(WarehousesLevels))
   {
   var p;
   for (p in WarehousesLevels)
    {
    WarehousesLevel += WarehousesLevels[p];
    }
   }
  else
   {
   WarehousesLevel = parseInt(WarehousesLevels);
   }
  
  if (this.Is_Version('0.3.1') == true)
   {
   result = 100;
   result += SafeCapacityPerWarehouse(ResType, WarehousesLevel);
   }
  else
   {
   if (ResType == 'wood')
    {
    result = 100;
    result += SafeCapacityPerWarehouse(ResType, WarehousesLevel);
    }
   else
    {
    result = 50;
    result += SafeCapacityPerWarehouse(ResType, WarehousesLevel);
    }
   }
  }
 
 return result + (result/100*Bonus);
 };
 
EmpireBoard.Ikariam.MerchantNavyBox_Object = function()
 {
 var MerchantNavyBox     = new Object;
 
 //MerchantNavyBox.id    = '';
 
 MerchantNavyBox.title    = '';
 //MerchantNavyBox.length     = ''; // Number of missions
 //MerchantNavyBox.missions     = {};
 
 return MerchantNavyBox;
 };

EmpireBoard.Ikariam.NavyTransport_Object = function()
 {
 var NavyTransport    = new Object;
 
 //NavyTransport.id    = '';
 
 //NavyTransport.oCityId    = 0;
 //NavyTransport.oCityName    = '';
 //NavyTransport.oPlayerName   = '';
 
 NavyTransport.ETA   = '';
 NavyTransport.RET   = '';
 
 return NavyTransport;
 };
 
EmpireBoard.Ikariam.Fetch_TimeCounters = function(database, objectName)
 {
 if (database == undefined)    database    = {};
 if (objectName == undefined)   objectName    = 'getCountdown';
 
 this._Parent.Log.Add("Start to fetch '"+objectName+"' time counters");
 // Fetch time counters
 var scripts = document.getElementsByTagName("script");
 for (var j = 0; j < scripts.length; j++)
  {
  var nScript = scripts[j];
  var sCode = nScript.innerHTML;
  if (sCode.indexOf(objectName) > 0)
   {
   var aCodeLines = sCode.split(';');
   for (var i=0; i < aCodeLines.length; i++)
    {
    var sValues = aCodeLines[i].substring(aCodeLines[i].indexOf('{')+1,aCodeLines[i].indexOf('}'));
    var sParts = sValues.split(',');
    if (sParts.length >= 3)
     {
     var CounterValues = new Object;
     var CounterId = '';
     for (var k=0; k < sParts.length; k++)
      {
      var sPartPeer = sParts[k].split(':');
      var sPartName = this._Parent.Str.Trim(sPartPeer[0]);
      var sPartValue = this._Parent.Str.Trim(sPartPeer[1]);
      
      if (sPartName == 'el')
       {
       sPartValue = this._Parent.Str.Trim_DoubleQuotes(sPartValue);
       CounterId = ''+sPartValue;
       }
      else
       {
       sPartValue = 1000*parseInt(sPartValue);
       }
       
      CounterValues[sPartName]=sPartValue;
      //this._Parent.Log.Add("TimeCounter."+sPartName+" = "+CounterValues[sPartName]);
      }
     
     if (CounterId != '')
      {
      database[CounterId] = CounterValues;
      
      //this._Parent.Log.Add("TimeCounter["+CounterId+"] found");
      }
     }
    }
   }
  }
  
 return database;
 };
 
EmpireBoard.Ikariam.Fetch_MerchantNavy_Boxes = function(boxesDB, includeMissions)
 {
 // Require: DOM, Str
 this._Parent.Log.Add('Start fetch MerchantNavy boxes...');
 var StartTime = new Date().getTime();
 if (boxesDB == undefined)    boxesDB    = {};
 if (includeMissions == undefined)  includeMissions  = false;
 
 function grabCityID(rootElt)
  {
  var resID = 0;
  var alinks = rootElt.getElementsByTagName("a");
  for (var k=0; k < alinks.length; k++)
   {
   var resReg = /[\?&]{1}cityId=([0-9]+)&?/i.exec(alinks[k].href);
   if (resReg != null)
    {
    resID = parseInt(resReg[1]);
    break;
    }
   }
  
  return resID;
  }
  
 var contentBoxes = this._Parent.DOM.Get_Nodes("//div[@id='mainview']/div[contains(@class, 'contentBox')]");
 if (contentBoxes.snapshotLength > 0)
  {
  this._Parent.Log.Add('Found '+contentBoxes.snapshotLength+' contentBox');
  
  for (var i=0; i < contentBoxes.snapshotLength; i++)
   {
   var contentBox = contentBoxes.snapshotItem(i);
   var boxId = contentBox.id;
   if (boxId == '')
    {
    boxId = 'contentBox'+(i+1);
    contentBox.id = boxId;
    }
   
   if (boxesDB[boxId] == undefined)
    {
    boxesDB[boxId] = new this.MerchantNavyBox_Object();
    }
   boxesDB[boxId].id = boxId;
    
   var h3s = contentBox.getElementsByTagName("h3");
   boxesDB[boxId].title = h3s[0].textContent;
   
   var Missions = this._Parent.DOM.Get_Nodes("//div[@id='mainview']/div[@id='"+boxId+"']//td[contains(@class, 'mission')]");
   boxesDB[boxId].length = Missions.snapshotLength;
   this._Parent.Log.Add('contentBox['+boxId+']: '+boxesDB[boxId].title+', '+boxesDB[boxId].length+' missions');

   if ((includeMissions == true) && (Missions.snapshotLength >= 1))
    {
    boxesDB[boxId].missions = {};
    for (var j=0; j < Missions.snapshotLength; j++)
     {
     var nMi = Missions.snapshotItem(j);
     var tr = nMi.parentNode;
     var tds = tr.getElementsByTagName("td");
     var tdslength = tds.length;
     //var tds = tr.childNodes;
     
     var missionId = '';
     if (tdslength == 6)
      {
      // pillaging under 0.4.3
      var ETA = tds[4].id;
      var RET = tds[4].id;
      }
     else if (this._Parent.DOM.Has_ClassName(tds[4],'speed'))
      {
      // transport under 0.4.3
      var ETA = tds[5].id;
      var RET = tds[5].id;
      }
     else if (this._Parent.DOM.Has_ClassName(tds[5],'speed'))
      {
      // transport under 0.4.2
      var ETA = tds[4].id;
      var RET = tds[6].id;
      }
     else
      {
      var ETA = tds[4].id;
      var RET = tds[5].id;
      }
     if (ETA != '')
      {
      missionId = ETA;
      }
     else if (RET != '')
      {
      missionId = RET;
      }
     
     if (missionId != '')
      {
      if (boxesDB[boxId].missions[missionId] == undefined)
       {
       boxesDB[boxId].missions[missionId] = new this.NavyTransport_Object();
       }
      boxesDB[boxId].missions[missionId].id = missionId;
      
      if (ETA != '')
       {
       boxesDB[boxId].missions[missionId].ETA = ETA;
       }
      
      if (RET != '')
       {
       boxesDB[boxId].missions[missionId].RET = RET;
       }
       
      boxesDB[boxId].missions[missionId].oCityId = grabCityID(tds[1]);
      
      //this._Parent.Log.Add('NavyTransport['+missionId+']: oCityId='+boxesDB[boxId].missions[missionId].oCityId);
      }
     }
    }
   }
  }
 
 return boxesDB;
 };

EmpireBoard.Ikariam.FleetMovement_Object = function()
 {
 var FleetMovement    = new Object;
 
 //FleetMovement.id     = '';
 
 //FleetMovement.own     = false;
 //FleetMovement.hostile    = false;
 
 FleetMovement.time    = 0;
 
 //FleetMovement.summary    = '';
 //FleetMovement.payload    = {};
 //FleetMovement.hasFleet    = false;
 //FleetMovement.hasGoods    = false;
 //FleetMovement.hasArmy    = false;
 
 //FleetMovement.oCityId    = 0;
 //FleetMovement.oCityName    = '';
 //FleetMovement.oPlayerName   = '';
 //FleetMovement.toLeft     = false;
 //FleetMovement.mission    = '';
 // Values: deployarmy, deployfleet, plunder, blockade, defend, defend_port, trade, transport, occupy
 //FleetMovement.subject    = '';
 //FleetMovement.toRight    = false;
 //FleetMovement.tCityId    = 0;
 //FleetMovement.tCityName    = '';
 //FleetMovement.tPlayerName    = '';
 
 //FleetMovement.hasAction    = false;
 
 return FleetMovement;
 };
 
EmpireBoard.Ikariam.Fetch_FleetMovements = function(database)
 {
 // Require: DOM, Str
 var StartTime = new Date().getTime();
 this._Parent.Log.Add('Start fetch movements...');
 if (database == undefined) database = {};
 
 var _self = this;
 
 function grabCityID(rootElt)
  {
  var resID = 0;
  var alinks = rootElt.getElementsByTagName("a");
  for (var k=0; k < alinks.length; k++)
   {
   var resReg = /[\?&]{1}cityId=([0-9]+)&?/i.exec(alinks[k].href);
   if (resReg != null)
    {
    resID = parseInt(resReg[1]);
    break;
    }
   }
  
  return resID;
  }
  
 function TrimIcon(src)
  {
  var str = '';

  var parsedURL = src.split('/');
  if (parsedURL.length > 0)
   {
   str = parsedURL[parsedURL.length-1];
   }
  
  str = str.replace(".gif", "");
  str = str.replace("40x40", "");
  str = str.replace("60x60", "");
  str = str.replace("_r_", "");
  str = str.replace("y40_", "");
  str = str.replace("_faceright", "");
  str = str.replace("icon_", "");
  
  return _self._Parent.Str.Trim(str);
  }

 var resMi = this._Parent.DOM.Get_Nodes("//div[@id='fleetMovements']//table[contains(@class, 'locationEvents')]/tbody/tr/td/img[contains(@src, 'mission_')]");
 if (resMi.snapshotLength > 0)
  {
  this._Parent.Log.Add('Found '+resMi.snapshotLength+' fleets');
  
  // heures
  var mTimers = {};
  var scripts = document.getElementsByTagName("script");
  for (var j = 0; j < scripts.length; j++)
   {
   // search getCountdown
   var nScript = scripts[j];
   var sCode = nScript.innerHTML;
   if (sCode.indexOf('getCountdown') >= 0)
    {
    var aCodeLines = sCode.split(';');
    for (var i=0; i < aCodeLines.length-1; i++)
     {
     if (aCodeLines[i].indexOf('getCountdown') >= 0)
      {
      var sValues = aCodeLines[i].substring(aCodeLines[i].indexOf('{')+1,aCodeLines[i].indexOf('}'));
      var sParts = sValues.split(',');
      if (sParts.length >= 3)
       {
       var sPart0 = sParts[0].split(':');
       var enddate = 1000*parseInt(this._Parent.Str.Trim(sPart0[1]));
       
       var sPart1 = sParts[1].split(':');
       var currentdate = 1000*parseInt(this._Parent.Str.Trim(sPart1[1]));
       
       var sID = sParts[2].substring(sParts[2].indexOf('"')+1,sParts[2].indexOf('"',sParts[2].indexOf('"')+2));
       
       if ((enddate - currentdate) > 0)
        {
        mTimers[sID] = StartTime + (enddate - currentdate);
        }
       }
      else
       {
       this._Parent.Log.Add("Failed to fetch getCountdown");
       }
      }
     }
    }
   }
  
  for (var i=0; i < resMi.snapshotLength; i++)
   {
   var tr = resMi.snapshotItem(i).parentNode.parentNode;
   var tds = tr.getElementsByTagName("td");
   //var tds = tr.childNodes;
    
   var fleetId = this._Parent.Str.Trim(tds[1].id);
   
   var tdinc = 0;
   // Fix for v. 0.4.3
   if (this.Is_Version('0.4.3'))
    {
    tdinc = 1;
    }
   
   if (fleetId != '')
    {
    if (database[fleetId] == undefined)
     {
     database[fleetId] = new this.FleetMovement_Object();
     }
    database[fleetId].id    = fleetId;
     
    database[fleetId].own    = this._Parent.DOM.Has_ClassName(tr,'own');
    database[fleetId].hostile   = this._Parent.DOM.Has_ClassName(tr,'hostile');
    
    if (mTimers[fleetId] != undefined)
     {
     database[fleetId].time    = mTimers[fleetId];
     }
    else 
     {
     database[fleetId].time    = mTimers['nexEventETA1'];
     }
    
    database[fleetId].summary = this._Parent.Str.Trim(tds[2+tdinc].childNodes[0].textContent);
    
    database[fleetId].payload = {};
    var hasFleet = false;
    var hasGoods = false;
    var hasArmy = false;
    
    var payloadDoc = this._Parent.DOM.Create_Document(tds[2+tdinc].innerHTML);
    var icons = this._Parent.DOM.Get_Nodes("//div[contains(@class, 'icon')]/img",payloadDoc);
    var iconsNb = 0;
    if (icons.snapshotLength >= 1)
     {
     iconsNb = icons.snapshotLength;
     for (var j=0; j < iconsNb; j++)
      {
      var iconIMG = icons.snapshotItem(j);
      var unitType = TrimIcon(iconIMG.src);
      
      var payloadDivs = iconIMG.parentNode.parentNode.getElementsByTagName("div");
      var unitQty = this._Parent.Str.To_Integer(payloadDivs[1].textContent);
      
      database[fleetId].payload[unitType] = unitQty;
      
      switch(this._LangCode)
       {
       case 'wood':
       case 'wine':
       case 'marble':
       case 'glass':
       case 'sulfur':
        hasGoods = true;
        break;
       
       case 'ship_ram':
       case 'ship_ballista':
       case 'ship_flamethrower':
       case 'ship_catapult':
       case 'ship_steamboat':
       case 'ship_mortar':
       case 'ship_submarine':
        hasFleet = true;
        break;
       
       case 'slinger':
       case 'swordsman':
       case 'phalanx':
       case 'spearman':
       case 'archer':
       case 'marksman':
       case 'gyrocopter':
       case 'steamgiant':
       case 'bombardier':
       case 'ram':
       case 'catapult':
       case 'mortar':
       case 'medic':
       case 'cook':
        hasArmy = true;
        break;
       
       default:
        break;
       }
      this._Parent.Log.Add('Payload['+unitType+']='+unitQty);
      }
     }
    
    if (hasFleet == true)
     {
     database[fleetId].hasFleet = true;
     }
    if (hasGoods == true)
     {
     database[fleetId].hasGoods = true;
     }
    if (hasArmy == true)
     {
     database[fleetId].hasArmy = true;
     }
    
    database[fleetId].oCityId = grabCityID(tds[3+tdinc]);
    database[fleetId].oCityName = this._Parent.Str.Trim(tds[3+tdinc].childNodes[0].textContent);
    var oPlayerName = this._Parent.Str.Trim(tds[3+tdinc].childNodes[1].textContent);
    oPlayerName = oPlayerName.substring(1,oPlayerName.length-1);
    database[fleetId].oPlayerName = oPlayerName;
    
    database[fleetId].toLeft = (tds[4+tdinc].innerHTML != '') ? true : false;
    database[fleetId].mission = /mission_([_a-z]+)\.[a-z]+/i.exec(resMi.snapshotItem(i).src)[1];
    database[fleetId].subject = this._Parent.Str.Trim(tds[5+tdinc].title);
    database[fleetId].toRight = (tds[6+tdinc].innerHTML != '') ? true : false;
    
    database[fleetId].tCityId = grabCityID(tds[7+tdinc]);
    database[fleetId].tCityName = this._Parent.Str.Trim(tds[7+tdinc].childNodes[0].textContent);
    var tPlayerName = this._Parent.Str.Trim(tds[7+tdinc].childNodes[1].textContent);
    tPlayerName = tPlayerName.substring(1,tPlayerName.length-1);
    database[fleetId].tPlayerName = tPlayerName;
    
    database[fleetId].hasAction = (tds[8+tdinc].innerHTML != '') ? true : false;
    
    this._Parent.Log.Add('Detect fleet['+fleetId+']: oCityId='+database[fleetId].oCityId+', tCityId['+database[fleetId].tCityId+']: '+database[fleetId].tCityName+' ('+database[fleetId].tPlayerName+'), time='+database[fleetId].time+', mission='+database[fleetId].mission+', payload: '+iconsNb+' units');
    }
   }
  }
 
 return database;
 };
 
EmpireBoard.Ikariam.LocalizationStrings = function(valueName,sectionName,subSectionName)
 {
 if (this._LocalizationStrings == null)
  {
  if (unsafeWindow && (unsafeWindow.LocalizationStrings != undefined))
   {
   this._LocalizationStrings = unsafeWindow.LocalizationStrings;
   }
  else
   {
   return undefined;
   }
  }
 
 if (sectionName == undefined)
  {
  if (valueName == undefined)
   {
   return this._LocalizationStrings;
   }
  else
   {
   if (this._LocalizationStrings[valueName] == undefined)
    {
    return undefined;
    }
   else
    {
    return this._LocalizationStrings[valueName];
    }
   }
  }
 else
  {
  if (this._LocalizationStrings[sectionName] == undefined)
   {
   return undefined;
   }
  else if (subSectionName != undefined)
   {
   if (this._LocalizationStrings[sectionName][subSectionName] == undefined)
    {
    return undefined;
    }
   else if (this._LocalizationStrings[sectionName][subSectionName][valueName] == undefined)
    {
    return undefined;
    }
   else
    {
    return this._LocalizationStrings[sectionName][subSectionName][valueName];
    }
   }
  else if (this._LocalizationStrings[sectionName][valueName] == undefined)
   {
   return undefined;
   }
  else
   {
   return this._LocalizationStrings[sectionName][valueName];
   }
  }
 };
 
EmpireBoard.Ikariam.phpSet = function(valueName)
 {
 if (this._phpSet == null)
  {
  if (unsafeWindow && (unsafeWindow.IKARIAM != undefined))
   {
   if (unsafeWindow.IKARIAM.phpSet != undefined)
    {
    this._phpSet = unsafeWindow.IKARIAM.phpSet;
    }
   else
    {
    return undefined;
    }
   }
  else
   {
   return undefined;
   }
  }
 
 if (valueName == undefined)
  {
  return this._phpSet;
  }
 else
  {
  if (this._phpSet[valueName] == undefined)
   {
   return undefined;
   }
  else
   {
   return this._phpSet[valueName];
   }
  }
 };

EmpireBoard.Ikariam.currentCity = function(valueName,sectionName)
 {
 if (this._currentCity == null)
  {
  if (unsafeWindow && (unsafeWindow.IKARIAM != undefined))
   {
   if (unsafeWindow.IKARIAM.currentCity != undefined)
    {
    this._currentCity = unsafeWindow.IKARIAM.currentCity;
    }
   else
    {
    return undefined;
    }
   }
  else
   {
   return undefined;
   }
  }
 
 if (sectionName == undefined)
  {
  if (valueName == undefined)
   {
   return this._currentCity;
   }
  else
   {
   if (this._currentCity[valueName] == undefined)
    {
    return undefined;
    }
   else
    {
    return this._currentCity[valueName];
    }
   }
  }
 else
  {
  if ((this._currentCity[sectionName] == undefined) || (this._currentCity[sectionName][valueName] == undefined))
   {
   return undefined;
   }
  else
   {
   return this._currentCity[sectionName][valueName];
   }
  }
 };

// From kChen script with some fixes
EmpireBoard.Ikariam.Change_currentCity = function(city_id)
 {
 var _self = this;
 
 function getFormInput(path, root)
  {
  var nodes = _self._Parent.DOM.Get_Nodes(path, root);
  if (nodes.snapshotLength <= 0) return null;
  
  var node0 = nodes.snapshotItem(0);
  var postdata = node0.name+"="+node0.value;
  
  for (var i = 1; i < nodes.snapshotLength; i++) 
   {
   var node = nodes.snapshotItem(i);
   postdata = postdata +"&" + node.name+"="+node.value;
   }
  
  return postdata;
  }
 
 var postdata = getFormInput("//form[@id='changeCityForm']//input");
 postdata = postdata + "&cityId="+city_id+"&view=city";
 var xmlhttp;
 if (window.XMLHttpRequest)
  {
  xmlhttp = new XMLHttpRequest();
  }
 xmlhttp.open('POST','http://' + window.location.host + '/index.php',false);
 xmlhttp.setRequestHeader('User-agent',window.navigator.userAgent);
 xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
 xmlhttp.setRequestHeader('Accept','text/html,application/xhtml+xml,application/xml');
 xmlhttp.setRequestHeader('Referer',window.location);
 xmlhttp.setRequestHeader('Cookie',document.cookie);
 xmlhttp.overrideMimeType('text/html; charset='+document.characterSet);
 xmlhttp.send(postdata);
 
 // Grab new ActionRequest value
 var node = this._Parent.DOM.Create_Document(xmlhttp.responseText);
 this._ActionRequest = this._Parent.DOM.Get_First_Node_Value("//input[@name='actionRequest']",node);
 
 return true;
 };

EmpireBoard.Ikariam.Insert_Warning = function(message, title)
 {
 var notices = document.getElementById('notices');
 if (notices == null)
  {
  notices = document.createElement('div');
  notices.id = 'notices';
  var mainview = document.getElementById("mainview");
  var buildingDescription = this._Parent.DOM.Get_Nodes("//div[@id='mainview']/div[contains(@class,'buildingDescription')]");
  if (buildingDescription.snapshotLength >= 1)
   {
   mainview.insertBefore(notices, buildingDescription.snapshotItem(0).nextSibling);
   }
  else
   {
   var contentBox = document.createElement('div');
   contentBox.setAttribute("class", "contentBox");
   contentBox.appendChild(notices);
   //mainview.appendChild(contentBox);
   mainview.insertBefore(contentBox, mainview.getElementsByTagName("h1")[0].nextSibling);
   }
  }
 notices.innerHTML = notices.innerHTML+'<div class="warning"><h5>'+title+'</h5><p>'+message+'</p></div>';
 };

EmpireBoard.DOM =
 {
 _Parent: null,
 };

EmpireBoard.DOM.Init = function(parent)
 {
 this._Parent = parent;
 };

EmpireBoard.DOM.Create_Document = function(responseText)
 {
 // Thank sizzlemctwizzle and Seniltai
 var dt = document.implementation.createDocumentType("html", "-//W3C//DTD HTML 4.01 Transitional//EN", "http://www.w3.org/TR/html4/loose.dtd");
 var doc = document.implementation.createDocument('', '', dt);
 var html = doc.createElement('html');

 html.innerHTML = responseText;
 doc.appendChild(html);

 return doc;
 };

EmpireBoard.DOM.Get_Nodes = function(path, root)
 {
 var contextNode = root ? root.evaluate ? root : root.ownerDocument : document;
 return contextNode.evaluate(path, contextNode, null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
 };
 
EmpireBoard.DOM.Has_Node = function(path, root)
 {
 var value = this.Get_Nodes(path, root);
 if (value.snapshotLength >= 1)
  {
  return true;
  }
 else
  {
  return false;
  }
 };
 
EmpireBoard.DOM.Get_First_Node = function(path, root)
 {
 var value = this.Get_Nodes(path, root);
 if (value.snapshotLength >= 1)
  {
  return value.snapshotItem(0);
  }
 return null;
 };
 
EmpireBoard.DOM.Get_Last_Node = function(path, root)
 {
 var value = this.Get_Nodes(path, root);
 if (value.snapshotLength >= 1)
  {
  return value.snapshotItem(value.snapshotLength-1);
  }
 return null;
 };
 
EmpireBoard.DOM.Get_First_Node_Value = function(path, defaultValue, root)
 {
 var value = this.Get_First_Node(path, root);
 if (value != null)
  {
  return value.value;
  }
 else return defaultValue;
 };
 
EmpireBoard.DOM.Get_Last_Node_Value = function(path, defaultValue, root)
 {
 var value = this.Get_Last_Node(path, root);
 if (value != null)
  {
  return value.value;
  }
 else return defaultValue;
 };
 
EmpireBoard.DOM.Get_First_Node_TextContent = function(path, defaultValue, root)
 {
 var value = this.Get_First_Node(path, root);
 if (value != null)
  {
  return value.textContent;
  }
 else return defaultValue;
 };

EmpireBoard.DOM.Get_First_Node_Title = function(path, defaultValue, root)
 {
 var value = this.Get_First_Node(path, root);
 if ((value != null) && (value.title != '')) 
  {
  return value.title;
  } 
 else return defaultValue;
 };
 
EmpireBoard.DOM.Has_ClassName = function(oElm, strClassName)
 {
 var arrayClassNames = oElm.className.split(' ');
 var Found = false;
 var arrayClassNamesLength = arrayClassNames.length;
 for (var k = 0; k < arrayClassNamesLength; k++)
  {
  if (arrayClassNames[k] == strClassName)
   {
   Found = true;
   break;
   }
  }
 return Found;
 };
 
/* Lib for strings processes */
EmpireBoard.Str =
 {
 _Parent:     null,
 _decimalPoint:    '.',
 _thousandSeparator:   ',',
 _timeunits_short_day:  'D',
 _timeunits_short_hour:  'h',
 _timeunits_short_minute: 'm',
 _timeunits_short_second: 's'
 };
 
EmpireBoard.Str.Init = function(parent)
 {
 this._Parent = parent;
 //this._decimalPoint = this.Get_LocaleDecimalPoint();
 };

// Replace any joker (%1, %2, %3, etc) with values from an array
EmpireBoard.Str.ValuesReplace = function(text, values)
 {
 if (text == undefined) text = '';
 if (values == undefined) values = [];
 
 var key;
 var i = 1;
 for (key in values)
  {
  text = text.replace('%'+i, values[key]);
  i++;
  }
 
 return text;
 }
 
EmpireBoard.Str.Trim = function(str)
 {
 if (str != undefined)
  {
  str = str.replace(/&nbsp;/gi, " ");
  str = str.replace(/\t/gi, " ");
  str = str.replace(/\v/gi, "");
  str = str.replace(/\f/gi, "");
  str = str.replace(/\n/gi, "");
  str = str.replace(/\r/gi, "");
  //str = str.replace(/\e/gi, "");
  str = str.replace(/\s/gi, " ");
  
  while(str.charAt(0) == (" "))
   { 
   str = str.substring(1);
   }
  while(str.charAt(str.length-1) == " " )
   { 
   str = str.substring(0,str.length-1);
   }
  }
 return str;
 };
 
EmpireBoard.Str.Trim_DoubleQuotes = function(str)
 {
 str = str.replace(/["]{1}/gi, "");
 
 return str;
 };
 
EmpireBoard.Str.Trim_Brackets = function(str)
 {
 str = str.replace(/\(.+\)/gi, "");
 
 return str;
 };
 
EmpireBoard.Str.Trim_Accodances = function(str)
 {
 str = str.replace(/\[.+\]/gi, "");
 
 return str;
 };
 
EmpireBoard.Str.TwoDigit = function(val)
 {
 val = parseInt(val);
 if (val == 0)
  {
  val = "00";
  }
 else if (val < 10)
  {
  return "0"+val;
  }
 return val;
 };

/*
v1 & v2 as "v.00.00.00 0000"

return 0 if v2 = v1
  1 if v2 > v1
 -1 if v2 < v1
*/
EmpireBoard.Str.Compare_Versions = function(v1, v2)
 {
 var result = 0;
 
 // remove "v."
 v1 = v1.replace(/v\./gi, "");
 v2 = v2.replace(/v\./gi, "");
 // remove "v"
 v1 = v1.replace(/v/gi, "");
 v2 = v2.replace(/v/gi, "");
 
 // build number use space separator
 v1 = v1.replace(/ /gi, ".");
 v2 = v2.replace(/ /gi, ".");

 // Parse numbers
 var vn1 = v1.split('.');
 var vn2 = v2.split('.');
 
 // Convert as integer
 for (var i = 0; i < vn1.length; i++)
  {
  vn1[i] = parseInt(vn1[i]);
  }
 for (var j = 0; j < vn2.length; j++)
  {
  vn2[j] = parseInt(vn2[j]);
  }
  
 for (var k = 0; k < vn1.length; k++)
  {
  if (vn2[k] == undefined)
   {
   if (vn1[k] > 0) result = -1;
   break;
   }
  else if (vn2[k] > vn1[k])
   {
   result = 1;
   break;
   }
  else if (vn2[k] < vn1[k])
   {
   result = -1;
   break;
   }
  }
 if ((result == 0) && (vn2.length > vn1.length))
  {
  if (vn2[vn1.length] > 0)
   {
   result = 1;
   }
  else if (vn2[vn2.length-1] > 0)
   {
   result = 1;
   }
  }
 
 return result;
 };
 
EmpireBoard.Str.To_Integer = function(str, defaultValue)
 {
 // Support signed integers
 var temp = ""+str;
 temp = temp.replace(/[^-0-9]+/g, "");
 temp = parseInt(temp,10);
 if (((temp == undefined) || (""+temp == "NaN")) && (defaultValue != undefined))
  {
  return defaultValue;
  }
 return temp;
 };

// decimalPoint = '.' or ','
EmpireBoard.Str.To_Float = function(str, defaultValue, decimalPoint)
 {
 if (decimalPoint == undefined) decimalPoint = this._decimalPoint;
 // Support signed integers
 var temp = ""+str;
 if (decimalPoint == '.')
  {
  temp = temp.replace(/[^-0-9\.]+/g, "");
  }
 else if (decimalPoint == ',')
  {
  temp = temp.replace(/[^-0-9\,]+/g, "");
  }
 else
  {
  temp = temp.replace(/[^-0-9]+/g, "");
  }
 temp = Number(temp);
 if (defaultValue != undefined && (temp == undefined || (""+temp == "NaN")))
  {
  return defaultValue;
  }
 return temp;
 };
 
EmpireBoard.Str.Get_LocaleDecimalPoint = function()
 {
 var _cachedDecimalPoint = new Number(1.5).toLocaleString().substring(1, 2);
 if (_cachedDecimalPoint == undefined || _cachedDecimalPoint == "")
  {
  _cachedDecimalPoint = ".";
  }
 return _cachedDecimalPoint;
 };

EmpireBoard.Str.FormatFloatNumber = function(num, fracdigits, alwaysShowSign, decimalPoint)
 {
 if (fracdigits == undefined) fracdigits = 2;
 if (alwaysShowSign == undefined) alwaysShowSign = false;
 if (decimalPoint == undefined) decimalPoint = this._decimalPoint;
 
 var s = ""+num;
 if (num == "?")
  {
  return num;
  }
 var negative = "";
 if (s.substring(0, 1) == "-")
  {
  negative = "-";
  s = s.substring(1);
  }
 else if (alwaysShowSign == true)
  {
  negative = "+";
  }
 var p = s.indexOf(".");
 if (p >= 0)
  {
  var i = s.substring(0, p);
  var frac = s.substring(p + 1, p + 1 + fracdigits);
  while (frac.length < fracdigits)
   {
   frac += "0";
   }
  s = i + decimalPoint + frac;
  }
 return negative + s;
 };

EmpireBoard.Str.FormatBigNumber = function(num, alwaysShowSign, thousandSeparator)
 {
 if (alwaysShowSign == undefined) alwaysShowSign = false;
 if (thousandSeparator == undefined) thousandSeparator = this._thousandSeparator;
 
 var s = ""+num;
 if (num == undefined || s == "NaN" || s == "?")
  {
  return "?";
  }
 else if (num == "-")
  {
  return num;
  }
  
 var negative = "";
 if (s.substring(0, 1) == "-")
  {
  negative = "-";
  s = s.substring(1);
  }
 else if (alwaysShowSign == true)
  {
  negative = "+";
  }
  
 var i = s.length-3;
 while (i > 0)
  {
  s = s.substring(0, i) + thousandSeparator + s.substring(i);
  i -= 3;
  }
 return negative + s;
 };

EmpireBoard.Str.FormatRemainingTime = function(timestamp,maxDigits,delimiter,approx,showunits,zerofill)
 {
 if(typeof timestamp=="undefined"){timestamp=0;}
 if(typeof maxDigits=="undefined"){maxDigits=2;}
 if(typeof delimiter=="undefined"){delimiter=" ";}
 if(typeof approx=="undefined"){approx="";}
 if(typeof showunits=="undefined"){showunits=true;}
 if(typeof zerofill=="undefined"){zerofill=false;}
 var timeunits=[];
 timeunits['day']=60*60*24;
 timeunits['hour']=60*60;
 timeunits['minute']=60;
 timeunits['second']=1;
 var loca=[];
 loca['day']   = (showunits) ? this._timeunits_short_day:"";
 loca['hour']  = (showunits) ? this._timeunits_short_hour:"";
 loca['minute']  = (showunits) ? this._timeunits_short_minute:"";
 loca['second']  = (showunits) ? this._timeunits_short_second:"";
 timestamp=Math.floor(timestamp/1000);
 var timestring="";
 for (var k in timeunits)
  {
  var nv=Math.floor(timestamp/timeunits[k]);
  if (maxDigits>0&&(nv>0||(zerofill&&timestring!="")))
   {
   timestamp=timestamp-nv*timeunits[k];
   if (timestring!="")
    {
    timestring+=delimiter;
    if (nv<10&&nv>0&&zerofill){nv="0"+nv;}
    if (nv==0){nv="00";}
    }
   timestring+=nv+loca[k];
   maxDigits--;
   }
  }
 if (timestamp>0) {timestring=approx+timestring;}
 return timestring;
 };

function smartDateFormat(time, showElapsedTime, elapsedTimeSeparator) {
  if (showElapsedTime != true) {
    showElapsedTime = false;
  }
  if (elapsedTimeSeparator == undefined) {
    elapsedTimeSeparator = ",";
  }
  var s = new Date();
  s.setTime(time);
  var now = new Date();
  var t = "";
  if ((1+now.getDate()) == s.getDate() && now.getYear() == s.getYear() && now.getMonth() == s.getMonth()) {
    t = 'tomorrow ' + EmpireBoard.Str.TwoDigit(s.getHours())+":"+EmpireBoard.Str.TwoDigit(s.getMinutes());
  } else if (now.getYear() != s.getYear() || now.getMonth() != s.getMonth() || now.getDate() != s.getDate()) {
    t = s.toLocaleString();
  } else {
    t = EmpireBoard.Str.TwoDigit(s.getHours())+":"+EmpireBoard.Str.TwoDigit(s.getMinutes());
  }
  if (showElapsedTime) {
    t += elapsedTimeSeparator;
    var d = (now.getTime() - s.getTime()) / 1000;
    if (d < 3600) {
      t += " " + Math.floor(d / 60) + "m";
    } else {
      if (d >= 86400) {
        t += " " + Math.floor(d / 86400) + "d";
      }
      t += " " + EmpireBoard.Str.FormatFloatNumber((d % 86400) / 3600, 1) + "h";
    }
  }
  return t;
}

EmpireBoard.Handlers =
 {
 _Parent: null
 };
 
EmpireBoard.Handlers.Init = function(parent)
 {
 this._Parent = parent;
 };
 
EmpireBoard.Handlers.Attach_Events = function()
 {
 // Common events
 this.Attach_ChangeCity_Events();
 
 if (this._Parent.DB.Options.Prefs.TABLE_BUILDINGS == true)
  {
  // Buildings table
  this.Attach_BuildingsHeader_Events();
  }
  
 if (this._Parent.DB.Options.Prefs.TABLE_RESOURCES == true)
  {
  // Resources table
  this.Attach_ArrivingGoods_Events();
  }
 
 if (this._Parent.DB.Options.Prefs.TABLE_ARMYFLEET == true)
  {
  // Army table
  this.Attach_ArmyFleetHeader_Events();
  this.Attach_Movements_Events();
  this.Attach_Attacks_Events();
  }
 };
 
EmpireBoard.Handlers.Attach_ChangeCity_Events = function()
 {
 var self = this;
 
 var nodes = this._Parent.DOM.Get_Nodes("//div[@id='"+this._Parent.MainID+"']//a[contains(@class,'changeCity')]");
 for (var i = 0; i < nodes.snapshotLength; i++)
  {
  var node = nodes.snapshotItem(i);
  if (current_city_id != parseInt(node.getAttribute("cityid")))
   node.addEventListener('click', function(e) { return self.ChangeCity_Click_Event(e); }, false);
  }
 };
 
EmpireBoard.Handlers.ChangeCity_Click_Event = function(e)
 {
 var obj = e.srcElement ? e.srcElement:e.target;
 obj.style.cursor="wait";
 document.getElementsByTagName("body")[0].style.cursor="wait";
 while (obj.hasAttribute('cityid') == false)
  {
  obj = obj.parentNode;
  }
 var city_id = obj.getAttribute("cityid");
 return this._Parent.Ikariam.Change_currentCity(city_id);
 };
 
EmpireBoard.Handlers.Attach_BuildingsHeader_Events = function()
 {
 var self = this;
 
 var nodes = this._Parent.DOM.Get_Nodes("//div[@id='"+this._Parent.MainID+"']//th[contains(@class,'build_name')]");
 for (var i = 0; i < nodes.snapshotLength; i++)
  {
  var node = nodes.snapshotItem(i);
  node.addEventListener('mouseover', function(e) { self.BuildingName_MouseOver_Event(e); }, false);
  node.addEventListener('mousemove', function(e) { self._Parent.Tooltip.mouseMove(e); }, false);
  node.addEventListener('mouseout', function(e) { self._Parent.Tooltip.hide(e); }, false);
  }
 };
 
EmpireBoard.Handlers.BuildingName_MouseOver_Event = function(e)
 {
 if (!e) { e = window.event; }
 var obj = e.srcElement ? e.srcElement : e.target;
 while (obj.hasAttribute('building') == false)
  {
  obj = obj.parentNode;
  }
 var building_id = obj.getAttribute('building');
 //window.status = 'building_id: '+building_id;
 
 var tooltipHTML = this._Parent.Tooltip.innerHTML(this._Parent.Renders.BuildingName_Tooltip_Content(building_id));
 this._Parent.Tooltip.show(tooltipHTML);
 };
 
EmpireBoard.Handlers.Attach_ArrivingGoods_Events = function()
 {
 var self = this;

 var nodes = this._Parent.DOM.Get_Nodes("//div[@id='"+this._Parent.MainID+"']//*[contains(@class,'MoreGoods')]");
 for (var i = 0; i < nodes.snapshotLength; i++)
  {
  var node = nodes.snapshotItem(i);
  node.addEventListener('mouseover', function(e) { self.ArrivingGoods_MouseOver_Event(e); }, false);
  node.addEventListener('mousemove', function(e) { self._Parent.Tooltip.mouseMove(e); }, false);
  node.addEventListener('mouseout', function(e) { self._Parent.Tooltip.hide(e); }, false);
  }
 };
 
EmpireBoard.Handlers.ArrivingGoods_MouseOver_Event = function(e)
 {
 if (!e) { e = window.event; }
 var obj = e.srcElement ? e.srcElement : e.target;
 //var targetObj = obj;
 while (obj.hasAttribute('resource') == false)
  {
  obj = obj.parentNode;
  }
 var resName = obj.getAttribute('resource');
 while (obj.hasAttribute('cityid') == false)
  {
  obj = obj.parentNode;
  }
 var city_id = parseInt(obj.getAttribute('cityid'));
 //window.status = 'Resource: '+resName+' City ID: '+city_id;
 var tooltipHTML = this._Parent.Tooltip.innerHTML(this._Parent.Renders.ArrivingGoods_Tooltip_Content(city_id, resName));
 
 this._Parent.Tooltip.show(tooltipHTML);
 };

EmpireBoard.Handlers.Attach_ArmyFleetHeader_Events = function()
 {
 var self = this;
 
 var nodes = this._Parent.DOM.Get_Nodes("//div[@id='"+this._Parent.MainID+"']//th[contains(@class,'unit_name')]");
 for (var i = 0; i < nodes.snapshotLength; i++)
  {
  var node = nodes.snapshotItem(i);
  node.addEventListener('mouseover', function(e) { self.UnitName_MouseOver_Event(e); }, false);
  node.addEventListener('mousemove', function(e) { self._Parent.Tooltip.mouseMove(e); }, false);
  node.addEventListener('mouseout', function(e) { self._Parent.Tooltip.hide(e); }, false);
  }
 };
 
EmpireBoard.Handlers.UnitName_MouseOver_Event = function(e)
 {
 if (!e) { e = window.event; }
 var obj = e.srcElement ? e.srcElement : e.target;
 while (obj.hasAttribute('unit') == false)
  {
  obj = obj.parentNode;
  }
 var unit_id = obj.getAttribute('unit');
 //window.status = 'unit_id: '+unit_id;
 
 var tooltipHTML = this._Parent.Tooltip.innerHTML(this._Parent.Renders.UnitName_Tooltip_Content(unit_id));
 this._Parent.Tooltip.show(tooltipHTML);
 };
 
EmpireBoard.Handlers.Attach_Movements_Events = function()
 {
 var self = this;
 
 var nodes = this._Parent.DOM.Get_Nodes("//div[@id='"+this._Parent.MainID+"']//*[contains(@class,'Movements')]");
 for (var i = 0; i < nodes.snapshotLength; i++)
  {
  var node = nodes.snapshotItem(i);
  node.addEventListener('mouseover', function(e) { self.Movements_MouseOver_Event(e); }, false);
  node.addEventListener('mousemove', function(e) { self._Parent.Tooltip.mouseMove(e); }, false);
  node.addEventListener('mouseout', function(e) { self._Parent.Tooltip.hide(e); }, false);
  }
 };
 
EmpireBoard.Handlers.Movements_MouseOver_Event = function(e)
 {
 if (!e) { e = window.event; }
 var obj = e.srcElement ? e.srcElement : e.target;
 while (obj.hasAttribute('cityid') == false)
  {
  obj = obj.parentNode;
  }
 var city_id = parseInt(obj.getAttribute('cityid'));
 //window.status = 'Movements of city by ID : '+city_id;
 
 var tooltipHTML = this._Parent.Tooltip.innerHTML(this._Parent.Renders.Movements_Tooltip_Content(city_id));
 this._Parent.Tooltip.show(tooltipHTML);
 };
 
EmpireBoard.Handlers.Attach_Attacks_Events = function()
 {
 var self = this;
 
 var nodes = this._Parent.DOM.Get_Nodes("//div[@id='"+this._Parent.MainID+"']//*[contains(@class,'Attacks')]");
 for (var i = 0; i < nodes.snapshotLength; i++)
  {
  var node = nodes.snapshotItem(i);
  node.addEventListener('mouseover', function(e) { self.Attacks_MouseOver_Event(e); }, false);
  node.addEventListener('mousemove', function(e) { self._Parent.Tooltip.mouseMove(e); }, false);
  node.addEventListener('mouseout', function(e) { self._Parent.Tooltip.hide(e); }, false);
  }
 };
 
EmpireBoard.Handlers.Attacks_MouseOver_Event = function(e)
 {
 if (!e) { e = window.event; }
 var obj = e.srcElement ? e.srcElement : e.target;
 while (obj.hasAttribute('cityid') == false)
  {
  obj = obj.parentNode;
  }
 var city_id = parseInt(obj.getAttribute('cityid'));
 //window.status = 'Movements of city by ID : '+city_id;
 
 var tooltipHTML = this._Parent.Tooltip.innerHTML(this._Parent.Renders.Attacks_Tooltip_Content(city_id));
 this._Parent.Tooltip.show(tooltipHTML);
 };
 
EmpireBoard.Handlers.Start_Timers = function()
 {
 // Common real-time counters
 window.setInterval(myTimeCounterF, 1100);
 
 if (this._Parent.DB.Options.Prefs.TABLE_RESOURCES == true)
  {
  // Resources timers
  window.setInterval(realtimeFactDisplayF, 10000);
  }
 };
 
EmpireBoard.Handlers.Deployment_Submit_Event = function(e)
 {
 var dType = this._Parent.DOM.Get_First_Node_Value("//form[@id='deploymentForm']/input[@name='function']", '');

 // Update units garrisoned
 var city = getCity(current_city_id);
 var duList = this._Parent.DOM.Get_Nodes("//form[@id='deploymentForm']//ul[@class='assignUnits']/li");
 if (duList.snapshotLength >= 1)
  {
  for (var i = 0; i < duList.snapshotLength; i++)
   {
   var uLI = duList.snapshotItem(i);
   var unit_id = 'unit '+uLI.className;
   
   if (this._Parent.Ikariam.Is_Version('0.4.4'))
    {
    var oAmount = this._Parent.Str.To_Integer(uLI.childNodes[1].childNodes[3].textContent);
    var dAmount = this._Parent.Str.To_Integer(uLI.childNodes[3].value,0);
    }
   else if (this._Parent.Ikariam.Is_Version('0.4.3'))
    {
    var oAmount = this._Parent.Str.To_Integer(uLI.childNodes[3].textContent);
    var dAmount = this._Parent.Str.To_Integer(uLI.childNodes[13].value,0);
    }
   else
    {
    var oAmount = this._Parent.Str.To_Integer(uLI.childNodes[3].textContent);
    if (dType == 'deployFleet')
     {
     var dAmount = this._Parent.Str.To_Integer(uLI.childNodes[7].value,0);
     }
    else
     {
     var dAmount = this._Parent.Str.To_Integer(uLI.childNodes[9].value,0);
     }
    }
   
   if (city.units[unit_id] == undefined) city.units[unit_id] = {};
   city.units[unit_id].count = oAmount - dAmount;
   this._Parent.Log.Add(unit_id+": oAmount="+oAmount+" dAmount="+dAmount);
   }
  }
 
 setViewRqTime('finances');
 setViewRqTime('militaryAdvisorMilitaryMovements');
 this._Parent.DB.Save();
 };
 
function myTimeCounterF()
 {
 var currenttime = new Date().getTime();
 var cs = EmpireBoard.DOM.Get_Nodes("//font[contains(@id, 'mytimecounter')]");
 for (var i = 0; i < cs.snapshotLength; i++)
  {
  var c = cs.snapshotItem(i);
  var abstime = Math.round(c.getAttribute('counter'));
  hdata = (abstime - currenttime) / 1000;
  if (hdata > 0)
   {
   var s = "";
   s = EmpireBoard.Str.FormatRemainingTime(hdata*1000);
   c.innerHTML = s;
   }
  else 
   {
   c.innerHTML = "-";
   }
  }
 }

function realtimeFactDisplayF()
 {
 var currenttime = new Date().getTime();
 var counters = EmpireBoard.DOM.Get_Nodes("//font[contains(@id, 'myresourcecounter')]");
 for(var i=0; i < counters.snapshotLength; i++)
  {
  var c = counters.snapshotItem(i);
  if (c.color != "#ff0000")
   {
   var arr = c.getAttribute('counter').split(",");
   var startTime = arr[0];
   var startAmount = parseFloat(arr[1]);
   var factPerHour = parseFloat(arr[2]);
   var maxAmount = arr[3];

   var currAmount = getCurrentResourceAmount(currenttime, startTime, startAmount, factPerHour);

   if ((maxAmount != '-') && (currAmount >= maxAmount))
    {
    c.innerHTML = EmpireBoard.Str.FormatBigNumber(maxAmount);
    c.color = "#ff0000";
    }
   else
    {
    c.innerHTML = EmpireBoard.Str.FormatBigNumber(currAmount);
    //+' ('+Math.floor((currenttime-startTime)/1000)+' s)'
    }
   }
  }
 return (counters.snapshotLength > 0);
 }

EmpireBoard.Log =
 {
 _Parent: null,
 _Enabled: false
 };
 
EmpireBoard.Log.Init = function(parent)
 {
 this._Parent = parent;
 };
 
EmpireBoard.Log.Add = function(msg)
 {
 if (this._Enabled == true)
  {
  GM_log(msg);
  }
 };

EmpireBoard.Updater =
 {
 _Parent:    null,
 _ScriptURL:    '',
 _availableVersion:  0
 };
 
EmpireBoard.Updater.Init = function(parent)
 {
 this._Parent = parent;
 };
 
// CallBackFct function receive available version number (or null value if failed) as argument
EmpireBoard.Updater.Check = function(ScriptURL, CallBackFct)
 {
 this._availableVersion  = 0;
 this._ScriptURL    = ScriptURL;
 var self = this;
 
 GM_xmlhttpRequest({
  method:    "GET",
  url:    ScriptURL,
  headers:   { Accept:"text/javascript; charset=UTF-8" },
  overrideMimeType: "application/javascript; charset=UTF-8",
  onload:    function(response) { self._ParseScript(response, CallBackFct); }
  });
 };
 
EmpireBoard.Updater._ParseScript = function(response, CallBackFct)
 {
 var availableVersion = 0;
 
 if (response.status == 200)
  {
  var resReg = /@version\s+(\d+)/.exec(response.responseText);
  if (resReg != null)
   {
   availableVersion = resReg[1];
   }
  }
  
 this._availableVersion = availableVersion;
 
 if (typeof CallBackFct == 'function')
  {
  CallBackFct.call(this._Parent, availableVersion, response);
  }
 };

// the tooltip object
EmpireBoard.Tooltip =
 {
 // setup properties of tooltip object
 _Parent:     null,
 id:       "TooltipContainer",
 idParent:     "",
 offsetx:     10,
 offsety:     10,
 _x:       0,
 _y:       0,
 _tooltipElement:   null,
 _saveonmouseover:   null
 };
 
EmpireBoard.Tooltip.Init = function(parent, IdName, IdParent)
 {
 if (parent != undefined) this._Parent = parent;
 
 if (IdName != undefined) this.id    = IdName;
 if (IdParent != undefined) this.idParent  = IdParent;
 };
 
EmpireBoard.Tooltip.CreateContainer = function(IdName, IdParent)
 {
 if (IdName != undefined) this.id    = IdName;
 if (IdParent != undefined) this.idParent  = IdParent;
 
 // create tooltip DIV
 var body = document.getElementById(this.idParent);
 var tooltipdiv = document.createElement('div');
 tooltipdiv.id = this.id;
 tooltipdiv.innerHTML = "";
 tooltipdiv.style.visibility = 'hidden';
 body.appendChild(tooltipdiv);
 };

EmpireBoard.Tooltip.innerHTML = function (Content, Title)
 {
 if (Content == undefined || Content == "")
  {
  return "";
  }
 else
  {
  var innerHTML = '';
  if (Title == undefined || Title == "")
   {
   Title = "";
   }
  else Title = "<div class=TTTitle>"+Title+"</div>";
  
  if (this._Parent.Intl.LangDir() == "rtl")
   {
   innerHTML = "<div dir=rtl class='TTContent RtoL'>"+Title+Content+"</div>";
   }
  else
   {
   innerHTML = "<div class=TTContent>"+Title+Content+"</div>";
   }
  
  return innerHTML;
  }
 };

EmpireBoard.Tooltip.show = function (htmlelement)
 {
 if (document.getElementById)
  {
  this._tooltipElement = document.getElementById(this.id);
  }
 else if ( document.all )
  {
  this._tooltipElement = document.all[this.id].style;
  }
 
 this._tooltipElement.innerHTML = htmlelement;

 this.moveTo(this._x + this.offsetx , this._y + this.offsety);

 if (this._tooltipElement.style)
  {
  this._tooltipElement.style.visibility ="visible";
  }
 else
  {
  this._tooltipElement.visibility = "visible";
  }
  
 return false;
 };

EmpireBoard.Tooltip.hide = function(e)
 {
 if (this._tooltipElement.style)
  {
  this._tooltipElement.style.visibility ="hidden";
  }
 else
  {
  this._tooltipElement.visibility = "hidden";
  }
 };

// Moves the tooltip element
EmpireBoard.Tooltip.mouseMove = function(e)
 {
 // we don't use "this" because this method is assign to an event of document
 // and so is dereferenced
 if (e == undefined) e = event;

 if (e.pageX != undefined)
  { // gecko, konqueror,
  this._x = e.pageX;
  this._y = e.pageY;
  }
 else if (event != undefined && event.x != undefined && event.clientX == undefined)
  { // ie4 ?
  this._x = event.x;
  this._y = event.y;
  }
 else if (e.clientX != undefined )
  { // IE6,  IE7, IE5.5
  if (document.documentElement)
   {
   this._x = e.clientX + ( document.documentElement.scrollLeft || document.body.scrollLeft);
   this._y = e.clientY + ( document.documentElement.scrollTop || document.body.scrollTop);
   }
  else
   {
   this._x = e.clientX + document.body.scrollLeft;
   this._y = e.clientY + document.body.scrollTop;
   }
  /*
  }
  else if(event != undefined && event.x != undefined)
  { // IE6,  IE7, IE5.5
  tooltip.x = event.x + ( document.documentElement.scrollLeft || document.body.scrollLeft);
  tooltip.y = event.y + ( document.documentElement.scrollTop || document.body.scrollTop);
  */
  }
 else
  {
  this._x = 0;
  this._y = 0;
  }

 var MovX = this._x + this.offsetx;
 if ((MovX+this.GetDivW(this._tooltipElement)) > (this.GetClientW() + this.GetScrollX() - 2))
  {
  MovX = this.GetClientW() + this.GetScrollX() - 2 - this.GetDivW(this._tooltipElement);
  }
 var MovY = this._y - this.offsety - this.GetDivH(this._tooltipElement);
 if (MovY < (this.GetScrollY() + 2))
  {
  MovY = this._y + this.offsety;
  }
 
 //window.status = "Scroll="+this.GetScrollX()+","+this.GetScrollY();
 //window.status = "Client="+this.GetClientW()+","+this.GetClientH();

 this.moveTo(MovX , MovY);
 };
 
EmpireBoard.Tooltip.GetDivH = function(el)
 {
 return (el ? (el.offsetHeight || el.style.pixelHeight || 0) : 0);
 };
 
EmpireBoard.Tooltip.GetDivW = function(el)
 {
 return (el ? (el.offsetWidth || el.style.pixelWidth || 0) : 0);
 };

EmpireBoard.Tooltip.GetClientW = function()
 {
 var tt_db = document.documentElement || document.body ||
    (document.getElementsByTagName ? document.getElementsByTagName("body")[0]
    : null);
 return (document.body && (typeof(document.body.clientWidth) != 'undefined') ? document.body.clientWidth
   : (typeof(window.innerWidth) != 'undefined') ? window.innerWidth
   : tt_db ? (tt_db.clientWidth || 0)
   : 0);
 };

EmpireBoard.Tooltip.GetClientH = function()
 {
 var tt_db = document.documentElement || document.body ||
    (document.getElementsByTagName ? document.getElementsByTagName("body")[0]
    : null);
 // Exactly this order seems to yield correct values in all major browsers
 return (document.body && (typeof(document.body.clientHeight) != 'undefined') ? document.body.clientHeight
   : (typeof(window.innerHeight) != 'undefined') ? window.innerHeight
   : tt_db ? (tt_db.clientHeight || 0)
   : 0);
 };

EmpireBoard.Tooltip.GetScrollX = function()
 {
 var tt_db = document.documentElement || document.body ||
    (document.getElementsByTagName ? document.getElementsByTagName("body")[0]
    : null);
 return (window.pageXOffset || (tt_db ? (tt_db.scrollLeft || 0) : 0));
 };
 
EmpireBoard.Tooltip.GetScrollY = function()
 {
 var tt_db = document.documentElement || document.body ||
    (document.getElementsByTagName ? document.getElementsByTagName("body")[0]
    : null);
 return (window.pageYOffset || (tt_db ? (tt_db.scrollTop || 0) : 0));
 };

// Move the tooltip element
EmpireBoard.Tooltip.moveTo = function(xL,yL)
 {
 if (this._tooltipElement.style)
  {
  this._tooltipElement.style.left = xL +"px";
  this._tooltipElement.style.top = yL +"px";
  }
 else
  {
  this._tooltipElement.left = xL;
  this._tooltipElement.top = yL;
  }
 };

// Manage translation
EmpireBoard.Intl =
 {
 _Parent:     null,
 _AppName:     'AnyApp',
 _LangCode:     '',
 _LangDir:     'ltr'
 };
 
EmpireBoard.Intl.Init = function(parent, AppName)
 {
 this._Parent = parent;
 if (AppName != undefined) this._AppName = AppName;
 };

// Get text to translate
EmpireBoard.Intl.TT = function(stringName, contextName, stringValues, appName)
 {
 if ((stringName != undefined) && (stringName != ''))
  {
  if ((contextName == undefined) || (contextName == '')) contextName = 'misc';
  if ((appName == undefined) || (appName == '')) appName = this._AppName;
  
  var stringResult = stringName;
  switch(contextName)
   {
   case 'buildings':
    if ((buildings[stringName] != undefined) && (buildings[stringName][0] != undefined))
     stringResult = buildings[stringName][0];
    break;
   
   case 'buildings_short':
    if ((buildings[stringName] != undefined) && (buildings[stringName][1] != undefined))
     stringResult = buildings[stringName][1];
    break;
   
   case 'army_units':
    if (config["unitnames"] == undefined)
     {
     
     }
    else if (config["unitnames"][stringName] != undefined)
     {
     stringResult = config["unitnames"][stringName];
     }
    else if (config["unitnames"]['unit '+stringName] != undefined)
     {
     stringResult = config["unitnames"]['unit '+stringName];
     }
    break;
   
   case 'fleet_units':
    if (config["unitnames"] == undefined)
     {
     
     }
    else if (config["unitnames"][stringName] != undefined)
     {
     stringResult = config["unitnames"][stringName];
     }
    else if (config["unitnames"]['unit '+stringName] != undefined)
     {
     stringResult = config["unitnames"]['unit '+stringName];
     }
    break;
   
   case 'misc':
   default:
    if (texts[stringName] != undefined)
     stringResult = texts[stringName];
    break;
   }
  
  if ((stringValues != undefined) && (stringValues != ''))
   {
   stringResult = this._Parent.Str.ValuesReplace(stringResult, stringValues);
   }
   
  return this._Parent.Str.Trim(stringResult);
  }
 else return '';
 };

EmpireBoard.Intl.Languages = function()
 {
 var languages = {
  "": "Automatic",
  ae: "العربية",
  bg: "Bulgarian",
  cn: "Chinese",
  tw: "Chinese (traditional)",
  cz: "Czech",
  dk: "Danish",
  de: "Deutsch",
  nl: "Dutch",
  en: "English",
  es: "Espanol",
  fi: "Finnish",
  fr: "Français",
  gr: "Greek",
  il: "Hebrew",
  it: "Italiano",
  lv: "Latvian",
  hu: "Magyar",
  pl: "Polish",
  pt: "Portuguese",
  ro: "Romanian",
  ru: "Russian",
  rs: "Serbian",
  sk: "Slovak",
  sl: "Slovenian",
  se: "Swedish",
  tr: "Turkish",
  ua: "Ukrainian",
  vn: "Vietnamese"
  };
 
 return languages;
 };

EmpireBoard.Intl.SetLanguage = function(LangCode)
 {
 if (LangCode == undefined)
  {
  LangCode = '';
  }
  
 if (LangCode == '')
  {
  LangCode = this._Parent.Ikariam.Language();
  }
 
 if (LangCode == '')
  {
  var Host = this._Parent.Ikariam.Host();
  var arr = Host.split("\.");
  LangCode = arr[arr.length - 1];
  if (LangCode == "com" && arr.length == 4) 
   {
   //for example: http://s1.ba.ikariam.com
   LangCode = arr[1];
   }
   
  if ((LangCode == 'com') || (LangCode == 'org') || (LangCode == 'net')) LangCode = 'en';
  }
 
 if (LangCode == '')
  {
  LangCode = 'en';
  }
 
 this._Parent.Log.Add('Set language code: '+LangCode);
 
 this._LangCode = LangCode;
 };
 
EmpireBoard.Intl.LangCode = function()
 {
 if ((this._LangCode == undefined) || (this._LangCode == null) || (this._LangCode == ''))
  {
  this.SetLanguage('');
  }
 
 return this._LangCode;
 };

EmpireBoard.Intl.LangDir = function()
 {
 if ((this._LangDir == undefined) || (this._LangDir == null) || (this._LangDir == ''))
  {
  this._LangDir = 'ltr';
  }
 // Todo: detect like http://userscripts.org/scripts/diff/87680/326530
 
 return this._LangDir;
 };

EmpireBoard.Intl.Load_LocalizedTexts = function()
 {
 switch(this._LangCode)
  {
  case 'ae':
  case 'eg':
  case 'sa':
   this.Load_Texts_AE();
   break;
  
  case 'bg':
   this.Load_Texts_BG();
   break;
  
  case 'cn':
   this.Load_Texts_CN();
   break;
  
  case 'cz':
   this.Load_Texts_CZ();
   break;
  
  case 'de':
   this.Load_Texts_DE();
   break;
  
  case 'dk':
   this.Load_Texts_DK();
   break;
  
  case 'es':
  case 'ar':
  case 'mx':
  case 'cl':
  case 'co':
  case 've':
  case 'pe':
   this.Load_Texts_ES();
   break;
  
  case 'fi':
   this.Load_Texts_FI();
   break;
  
  case 'fr':
   this.Load_Texts_FR();
   break;
  
  case 'gr':
   this.Load_Texts_GR();
   break;
  
  case 'hu':
   this.Load_Texts_HU();
   break;
  
  case 'il':
   this.Load_Texts_IL();
   break;
   
  case 'ir':
   // Todo
   this.Load_Texts_PK();
   break;
  
  case 'it':
   this.Load_Texts_IT();
   break;
  
  case 'lv':
   this.Load_Texts_LV();
   break;
  
  case 'nl':
   this.Load_Texts_NL();
   break;
  
  case 'pk':
   // Todo
   this.Load_Texts_PK();
   break;
   
  case 'pl':
   this.Load_Texts_PL();
   break;
  
  case 'pt':
  case 'br':
   this.Load_Texts_PT();
   break;
  
  case 'ro':
   this.Load_Texts_RO();
   break;
  
  case 'rs':
   this.Load_Texts_RS();
   break;
   
  case 'ru':
   this.Load_Texts_RU();
   break;
  
  case 'se':
   this.Load_Texts_SE();
   break;
  
  case 'sk':
   this.Load_Texts_SK();
   break;
  
  case 'sl':
  case 'si':
   this.Load_Texts_SL();
   break;
  
  case 'tr':
   this.Load_Texts_TR();
   break;
  
  case 'tw':
  case 'hk':
   this.Load_Texts_TW();
   break;
  
  case 'ua':
   this.Load_Texts_UA();
   break;
  
  case 'vn':
   this.Load_Texts_VN();
   break;
  
  case 'ba':
  case 'yu':
   // Todo
  case 'by':
   // Todo
  case 'ee':
   // Todo
  case 'id':
   // Todo
  case 'lt':
   // Todo
  case 'ph':
   // Todo
  
  case 'en':
  case 'us':
  case 'uk':
  case 'org':
  case 'com':
  case 'net':
  default:
   this.Load_Texts_EN();
   break;
  }
  
 if (langtype == "rf")
  {
  this._LangDir = 'rtl';
  }
 else
  {
  this._LangDir = 'ltr';
  }
 };

EmpireBoard.Intl.Load_Texts_EN = function()
 {
 langtype = ""; // Set "rf" for Rigth-to-Left languages, or leave blank
 // Set short building name into second field 
 buildings = {
  "townHall"   : ["Town Hall", "T. Hall"],
  "temple"   : ["Temple", "Temple"],
  "academy"   : ["Academy", "Academy"],
  "port"    : ["Trading Port", "Port"],
  "shipyard"   : ["Shipyard", "Shipyard"],
  "warehouse"   : ["Warehouse", "Warehouse"],
  "dump"    : ["Dump", "Dump"],
  "wall"    : ["Wall", "Wall"],
  "tavern"   : ["Tavern", "Tavern"],
  "museum"   : ["Museum", "Museum"],
  "palace"   : ["Palace", "Palace"],
  "palaceColony"  : ["Governor's Residence", "Governor"],
  "embassy"   : ["Embassy", "Embassy"],
  "branchOffice"  : ["Trading Post", "Trading"],
  "safehouse"   : ["Hideout", "Hideout"],
  "barracks"   : ["Barracks", "Barracks"],
  "workshop"   : ["Workshop", "Workshop"],
  "carpentering"  : ["Carpenter", "Carpenter"],
  "forester"   : ["Forester", "Forester"],
  "stonemason"  : ["Stone Mason", "Mason"],
  "glassblowing"  : ["Glass Blowing", "Blowing"],
  "winegrower"  : ["Wine Grower", "Grower"],
  "alchemist"   : ["Alchemist", "Alchemist"],
  "architect"   : ["Architect", "Architect"],
  "optician"   : ["Optician", "Optician"],
  "vineyard"   : ["Vine Yard", "Yard"],
  "fireworker"  : ["Fireworker", "Fireworker"]
  };
 texts = {
  "Upkeep"     : "Upkeep",
  "Growth"     : "Growth",
  "Research"     : "Research",
  "cityName"     : "Cities",
  "currentlyBuilding"   : "Currently building",
  "summary"     : "Summary:",
  "hide_settings"    : "Hide settings",
  "show_settings"    : "Show settings",
  "Population"    : "Population",
  "finishedBuilding"   : "Finished building",
  "Incomes"     : "Incomes",
  "Trading"     : "Trading",
  "Wood"      : "Wood",
  "Wine"      : "Wine",
  "Marble"     : "Marble",
  "Crystal"     : "Crystal",
  "Sulfur"     : "Sulfur"
  };
 };

EmpireBoard.Intl.Load_Texts_AE = function()
 {
 //by wa7d and Moshakes 
 langtype = "rf";
 buildings = {
  "townHall" : ["البلدية", "البلدية"],
  "temple" : ["مركز", "مركز"],
  "academy" : ["الاكاديمية", "الاكاديمية"],
  "port" : ["المرفأ", "المرفأ"],
  "shipyard" : ["حوض السفن", "حوض السفن"],
  "warehouse" : ["المخزن", "المخزن"],
  "wall" : ["السور", "السور"],
  "tavern" : ["الاستراحة", "الاستراحة"],
  "museum" : ["المتحف", "المتحف"],
  "palace" : ["القصر", "القصر"],
  "palaceColony" : ["قائم مقام", "قائم مقام"],
  "embassy" : ["السفارة", "السفارة"],
  "branchOffice" : ["السوق", "السوق"],
  "safehouse" : ["المخبأ", "المخبأ"],
  "barracks" : ["الثكنة", "الثكنة"],
  "workshop" : ["المختبر", "المختبر"],
  "carpentering" : ["انخفاض في تكلفة الخشب", "النجار"],
  "forester" : ["إنتاج الخشب", "الحطاب"],
  "stonemason" : ["إنتاج الرخام", "الحجار"],
  "glassblowing" : ["نافخ الزجاج", "نافخ الزجاج"],
  "winegrower" : ["إنتاج العنب", "مزرعة"],
  "alchemist" : ["الكيمائي", "الكيمائي"],
  "architect" : ["انخفاض في تكلفة الرخام", "المهندس"],
  "optician" : ["انخفاض في تكلفة البلور", "صانع البصريات"],
  "vineyard" : ["تخفيض تكلفة العنب", "معصرة"],
  "fireworker" : ["عامل النار", "البارود"] 
  };
 texts = {
  "Upkeep":"التكاليف",
  "cityName": "المدينة",
  "currentlyBuilding": "أعمال بناء",
  "summary": "الإجمالي",
  "hide_settings": "إخفاء الخيارات",
  "show_settings": "إظهار الخيارات",
  "Population": "السكان",
  "Research": "الابحاث",
  "finishedBuilding": "مباني منجزة","Incomes":"الذهب","Trading":"التجارة",
  "Wood": "الخشب", "Wine": "العنب", "Marble": "الرخام", "Crystal": "البلور", "Sulfur": "الكبريت" 
  };
 };

EmpireBoard.Intl.Load_Texts_BG = function()
 {
 //Bulgarian translation by dsimeonov
 langtype = "";
 buildings = {
  "townHall" : ["Кметство", "Кметство"],
  "temple" : ["Храм", "Храм"],
  "academy" : ["Академия", "Академия"],
  "port" : ["Пристанище", "Пристанище"],
  "shipyard" : ["Корабостроителница", "Корабостроителница"],
  "warehouse" : ["Склад", "Склад"],
  "wall" : ["Градска стена", "Градска стена"],
  "tavern" : ["Кръчма", "Кръчма"],
  "museum" : ["Музей", "Музей"],
  "palace" : ["Дворец", "Дворец"],
  "palaceColony" : ["Губернаторска резиденция", "Губернаторска резиденция"],
  "embassy" : ["Посолство", "Посолство"],
  "branchOffice" : ["Пазар", "Пазар"],
  "safehouse" : ["Скривалище", "Скривалище"],
  "barracks" : ["Казарма", "Казарма"],
  "workshop" : ["Работилница", "Работилница"],
  "carpentering" : ["Дърводелец", "Дърводелец"],
  "forester" : ["Горска къща", "Горска къща"],
  "stonemason" : ["Каменоделна", "Каменоделна"],
  "glassblowing" : ["Стъклодув", "Стъклодув"],
  "winegrower" : ["Винар", "Винар"],
  "alchemist" : ["Кула на Алхимика", "Кула на Алхимика"],
  "architect" : ["Офис на Архитекта", "Офис на Архитекта"],
  "optician" : ["Оптика", "Оптика"],
  "vineyard" : ["Винена преса", "Винена преса"],
  "fireworker" : ["Тестова зона за фойерверки", "Тестова зона за фойерверки"]
  };
 texts = {
  "cityName" : "Град",
  "currentlyBuilding" : "В процес на разширение",
  "summary" : "Общо",
  "hide_settings" : "Скрий",
  "show_settings" : "Покажи",
  "Population" : "Популация",
  "finishedBuilding" : "Завършена",
  "Incomes" : "Доходи",
  "Trading" : "Търговия",
  "Wood" : "Дърво",
  "Wine" : "Вино",
  "Marble" : "Мрамор",
  "Crystal" : "Кристал",
  "Sulfur" : "Сяра"
  };
 };

EmpireBoard.Intl.Load_Texts_CN = function()
 {
 //chinese translation, thank Alphasong
 langtype = "";
 buildings = {
  "townHall" : ["市政厅", "市政厅"],
  "temple"      : ["Temple", "Temple"],
  "academy" : ["学院", "学院"],
  "port" : ["港口", "港口"],
  "shipyard" : ["船坞", "船坞"],
  "warehouse" : ["仓库", "仓库"],
  "wall" : ["城墙", "城墙"],
  "tavern" : ["酒馆", "酒馆"],
  "museum" : ["博物馆", "博物馆"],
  "palace" : ["皇宫", "皇宫"],
  "palaceColony" : ["总督府", "总督府"],
  "embassy" : ["使馆", "使馆"],
  "branchOffice" : ["市场", "市场"],
  "safehouse" : ["藏身处", "藏身处"],
  "barracks" : ["兵营", "兵营"],
  "workshop" : ["兵工厂", "兵工厂"],
  "carpentering" : ["木匠所", "木匠所r"],
  "forester" : ["林务官宅", "林务官宅"],
  "stonemason" : ["石匠屋", "石匠屋"],
  "glassblowing" : ["玻璃吹制厂", "玻璃吹制厂"],
  "winegrower" : ["葡萄种植园", "葡萄种植园"],
  "alchemist" : ["炼金塔", "炼金塔"],
  "architect" : ["建筑公署", "建筑公署"],
  "optician" : ["配镜商馆", "配镜商馆"],
  "vineyard" : ["藏酒窖", "藏酒窖"],
  "fireworker" : ["烟火实验场", "烟火实验场"]
  };
 texts = {
  "cityName": "城市",
  "currentlyBuilding": "正在建造",
  "summary": "总计",
  "hide_settings": "隐藏设置", "show_settings": "显示设置",
  "Population": "人口",
  "finishedBuilding": "建造完成","Incomes":"收入","Trading":"交易",
  "Wood": "木材", "Wine": "葡萄", "Marble": "大理石", "Crystal": "水晶", "Sulfur": "硫磺"
  };
 };

EmpireBoard.Intl.Load_Texts_CZ = function()
 {
 //Czech translation , thank Tetraedron, Assassin
 langtype = "";
 buildings = {
  "townHall"     : ["Městská radnice", "Radnice"],
  "temple"      : ["Temple", "Temple"],
  "academy"      : ["Akademie", "Akademie"],
  "port"         : ["Obchodní přístav", "Přístav"],
  "shipyard"     : ["Loděnice", "Loděnice"],
  "warehouse"    : ["Sklad", "Sklad"],
  "wall"         : ["Městská zeď", "Zeď"],
  "tavern"       : ["Hostinec", "Hostinec"],
  "museum"       : ["Muzeum", "Muzeum"],
  "palace"       : ["Palác", "Palác"],
  "palaceColony" : ["Guvernérova rezidence", "Guvernér"],
  "embassy"      : ["Ambasáda", "Ambasáda"],
  "branchOffice" : ["Tržiště", "Tržiště"],
  "safehouse"    : ["Úkryt", "Úkryt"],
  "barracks"     : ["Kasárna", "Kasárna"],
  "workshop"     : ["Dílna", "Dílna"],
  "carpentering" : ["Truhlárna", "Truhlárna"],
  "forester"     : ["Hájovna", "Hájovna"],
  "stonemason"   : ["Kameník", "Kameník"],
  "glassblowing" : ["Sklárna", "Sklárna"],
  "winegrower"   : ["Vinařství", "Vinařství"],
  "alchemist"    : ["Věž alchymisty", "Věž alchymisty"],
  "architect"    : ["Pracovna architekta", "Architekt"],
  "optician"     : ["Optik", "Optik"],
  "vineyard"     : ["Vinný sklep", "Vinný sklep"],
  "fireworker"   : ["Zkušebna ohňostroje", "Zkušebna ohňostroje"]
  };
 texts = {
  "cityName"          : "Město",
  "currentlyBuilding" : "Staví se",
  "summary"           : "Celkem",
  "hide_settings"     : "Skrýt nastavení",
  "show_settings"     : "Ukázat nastavení",
  "Population"        : "Populace",
  "finishedBuilding"  : "Dokončené stavby",
  "Incomes"           : "Příjmy",
  "Trading"           : "Obchod",
  "Wood"              : "Dřevo",
  "Wine"              : "Víno",
  "Marble"            : "Mramor",
  "Crystal"           : "Sklo",
  "Sulfur"            : "Síra"
  };
 };

EmpireBoard.Intl.Load_Texts_DK = function()
 {
 // Danish  translation, thank to LGO
 langtype = "";
 buildings = {
  "townHall" : ["Rådhus", "Rådhus"],
  "temple" : ["Temple", "Tempel"],
  "academy" : ["Akademi", "Akademi"],
  "port" : ["Handelshavn", "Havn"],
  "shipyard" : ["Skipsværft", "Værft"],
  "warehouse" : ["Lagerbygning", "Lager"],
  "wall" : ["Bymur", "Mur"],
  "tavern" : ["Værtshus", "Kro"],
  "museum" : ["Museum", "Museum"],
  "palace" : ["Palads", "Palads"],
  "palaceColony" : ["Guvernørens residens", "Guvernør"],
  "embassy" : ["Ambassade", "Ambassade"],
  "branchOffice" : ["Handelsstation", "Handel"],
  "safehouse" : ["Skjulested", "Spion"],
  "barracks" : ["Kaserne", "Kaserne"],
  "workshop" : ["Værksted", "Værksted"],
  "carpentering" : ["Tømrer", "Tømrer"],
  "forester" : ["Skovfodged", "Skov"],
  "stonemason" : ["Stenhugger", "Sten"],
  "glassblowing" : ["Glaspuster", "Glas"],
  "winegrower" : ["Vinplanter", "Vin"],
  "alchemist" : ["Alkymist", "Alkymist"],
  "architect" : ["Arkitekt", "Arkitekt"],
  "optician" : ["Optiker", "Optiker"],
  "vineyard" : ["Vinpresse", "Vin"],
  "fireworker" : ["Fyrværkerifabrik", "Fyrværk."]
  };
 texts = {
  "Upkeep" :"Vedligehold",
  "cityName": "Bynavn",
  "currentlyBuilding": "Bygger nu",
  "summary": "Total",
  "hide_settings": "Gem indstillinger", "show_settings": "Vis indstillinger",
  "Population": "Befolkning",
  "Research": "Forskning",
  "finishedBuilding": "Færdig bygget","Incomes":"Inkomst","Trading":"Handler",
  "Wood": "Træ", "Wine": "Vin", "Marble": "Marmor", "Crystal": "Krystal", "Sulfur": "Svovl"
  }; 
 };

EmpireBoard.Intl.Load_Texts_DE = function()
 {
 //german translation, thanks to Schneppi & xkaaay
 langtype = "";
 buildings = {
  "townHall"      : ["Rathaus", "Rathaus"],
  "temple"   : ["Tempel", "Tempel"],
  "academy"       : ["Akademie", "Akademie"],
  "port"          : ["Handelshafen", "Handelshafen"],
  "shipyard"      : ["Schiffswerft", "Schiffswerft"],
  "warehouse"     : ["Lagerhaus", "Lagerhaus"],
  "dump"    : ["Halde", "Halde"],
  "wall"          : ["Stadtmauer", "Stadtmauer"],
  "tavern"        : ["Taverne", "Taverne"],
  "museum"        : ["Museum", "Museum"],
  "palace"        : ["Palast", "Palast"],
  "palaceColony"  : ["Statthaltersitz", "Statthaltersitz"],
  "embassy"       : ["Botschaft", "Botschaft"],
  "branchOffice"  : ["Kontor", "Kontor"],
  "safehouse"     : ["Versteck", "Versteck"],
  "barracks"      : ["Kaserne", "Kaserne"],
  "workshop"      : ["Erfinderwerkstatt", "Erfinderwerkstatt"],
  "carpentering"  : ["Zimmerei", "Zimmerei"],
  "forester"      : ["Forsthaus", "Forsthaus"],
  "stonemason"    : ["Steinmetz", "Steinmetz"],
  "glassblowing"  : ["Glasbläserei", "Glasbläserei"],
  "winegrower"    : ["Winzerei", "Winzerei"],
  "alchemist"     : ["Alchimistenturm", "Alchimistenturm"],
  "architect"     : ["Architekturbüro", "Architekturbüro"],
  "optician"      : ["Optiker", "Optiker"],
  "vineyard"      : ["Kelterei", "Kelterei"],
  "fireworker"    : ["Feuerwerksplatz", "Feuerwerksplatz"]
  };
 texts = {
  "Upkeep"   : "Unterhalt",
  "cityName"          : "Stadtname",
  "currentlyBuilding" : "Zur Zeit im Bau",
  "summary"           : "Gesamt",
  "hide_settings"     : "Verstecke Optionen",
  "show_settings"     : "Zeige Optionen",
  "Population"        : "Bevölkerung",
  "finishedBuilding"  : "Bau abgeschlossen",
  "Incomes"           : "Einkommen",
  "Trading"           : "Handel",
  "Wood"              : "Baumaterial",
  "Wine"              : "Wein",
  "Marble"            : "Marmor",
  "Crystal"           : "Kristallglas",
  "Sulfur"            : "Schwefel",
  "Growth"    : "Wachstum",
  "Research"    : "Forschung"
  };
 };

EmpireBoard.Intl.Load_Texts_ES = function()
 {
 //Spanish translation, thanks to dragondeluz, graff86, Crom
 langtype = "";
 buildings = {
  "townHall" : ["Intendencia", "Intendencia"],
  "temple"      : ["Templo", "Templo"],
  "academy" : ["Academia", "Academia"],
  "port" : ["Puerto comercial", "Puerto"],
  "shipyard" : ["Astillero", "Astillero"],
  "warehouse" : ["Depósito", "Depósito"],
  "wall" : ["Muralla", "Muralla"],
  "tavern" : ["Taberna", "Taberna"],
  "museum" : ["Museo", "Museo"],
  "palace" : ["Palacio", "Palacio"],
  "palaceColony" : ["Residencia del Gobernador", "Residencia"],
  "embassy" : ["Embajada", "Embajada"],
  "branchOffice" : ["Tienda", "Tienda"],
  "safehouse" : ["Escondite", "Escondite"],
  "barracks" : ["Cuarteles", "Cuarteles"],
  "workshop" : ["Taller de invenciones", "Taller"],
  "carpentering" : ["Carpintería", "Carpintería"],
  "forester" : ["Cabaña del guardabosques", "Cabaña"],
  "stonemason" : ["Cantero", "Cantero"],
  "glassblowing" : ["Soplador de vidrio", "Soplador"],
  "winegrower" : ["Vinicultor", "Vinicultor"],
  "alchemist" : ["Torre del Alquimista", "Alquimista"],
  "architect" : ["Oficina del Arquitecto", "Arquitecto"],
  "optician" : ["Óptico", "Óptico"],
  "vineyard" : ["Prensa de Vino", "Prensa"],
  "fireworker" : ["Área de Pruebas Pirotécnicas", "Pirotécnica"]
  };
 texts = {
  "Upkeep"   :"Costes",
  "cityName": "Ciudad", "currentlyBuilding": "Construyendo", "summary": "Totales",
  "hide_settings": "Ocultar opciones", "show_settings": "Mostrar opciones",
  "Population": "Población",
  "Research": "Investigación",
  "finishedBuilding": "Edificios terminados","Incomes":"Ingresos","Trading":"Comercio",
  "Wood": "Madera",
  "Wine": "Vino",
  "Marble": "Mármol",
  "Crystal": "Cristal",
  "Sulfur": "Azufre"
  }; 
 };

EmpireBoard.Intl.Load_Texts_FI = function()
 {
 //Finnish translation by DeFe
 langtype = "";
 buildings = {
  "townHall" : ["Kaupungintalo", "K. Talo"],
  "temple" : ["Temppeli", "Temppeli"],
  "academy" : ["Akatemia", "Akatemia"],
  "port" : ["Kauppasatama", "Satama"],
  "shipyard" : ["Telakka", "Telakka"],
  "warehouse" : ["Varasto", "Varasto"],
  "dump" : ["Säilytysalue", "Säilytysalue"],
  "wall" : ["Muuri", "Muuri"],
  "tavern" : ["Taverna", "Taverna"],
  "museum" : ["Museo", "Museo"],
  "palace" : ["Palatsi", "Palatsi"],
  "palaceColony" : ["Kuvernöörin asunto", "Kuvernööri"],
  "embassy" : ["Lähetystö", "Lähetystö"],
  "branchOffice" : ["Kauppapaikka", "Kauppapaikka"],
  "safehouse" : ["Piilopaikka", "Piilopaikka"],
  "barracks" : ["Kasarmi", "Kasarmi"],
  "workshop" : ["Paja", "Paja"],
  "carpentering" : ["Puusepän Paja", "Puuseppä"],
  "forester" : ["Metsänhoitaja", "Metsänhoitaja"],
  "stonemason" : ["Kivenhakkaaja", "Kivenhakkaaja"],
  "glassblowing" : ["Lasinpuhaltaja", "Lasinpuhaltaja"],
  "winegrower" : ["Viinitarhuri", "Viinitarhuri"],
  "alchemist" : ["Alkemistin Torni", "Alkemisti"],
  "architect" : ["Arkkitehdin Toimisto", "Arkkitehti"],
  "optician" : ["Optikko", "Optikko"],
  "vineyard" : ["Viinipaino", "Viinipaino"],
  "fireworker" : ["Ilotulite Testialue", "Testialue"] 
  };
 texts = {
  "Upkeep": "Ylläpito",
  "Growth": "Kasvu",
  "cityName": "Kaupungin nimi",
  "currentlyBuilding": "Rakentumassa",
  "summary": "Yhteenveto",
  "hide_settings": "Piilota asetukset",
  "show_settings": "Näytä asetukset",
  "Population": "Populaatio",
  "finishedBuilding": "Rakennus valmis",
  "Incomes":"Tulot",
  "Trading":"kaupankäynti",
  "Wood": "Puu",
  "Wine": "Viini",
  "Marble": "Marmori",
  "Crystal": "Kristalli",
  "Sulfur": "Rikki" 
  }; 
 };

EmpireBoard.Intl.Load_Texts_FR = function()
 {
 //French translation, thanks to Chirel
 langtype = "";
 buildings = {
  "townHall"      : ["Hôtel de ville", "HdV"],
  "temple"      : ["Temple", "Temple"],
  "academy"       : ["Académie", "Ac."],
  "port"          : ["Port commercial", "Port"],
  "shipyard"      : ["Chantier naval", "Chtr"],
  "warehouse"     : ["Entrepôt", "Entp"],
  "dump"    : ["Dépôt", "Dépôt"],
  "wall"          : ["Mur d'enceinte", "Mur"],
  "tavern"        : ["Taverne", "Tvrn"],
  "museum"        : ["Musée", "Msé"],
  "palace"        : ["Palais", "Plais"],
  "palaceColony"  : ["Résidence du Gouverneur", "RdG"],
  "embassy"       : ["Ambassade", "Amb."],
  "branchOffice"  : ["Comptoir", "Cptr"],
  "safehouse"     : ["Cachette", "Ccht"],
  "barracks"      : ["Caserne", "Csrn"],
  "workshop"    : ["Atelier", "Atlr"],
  "carpentering" : ["Menuisier","Men."],
  "forester" : ["Maison forestière","Frst"],
  "stonemason" : ["Tailleur de pierres","Tail."],
  "glassblowing" : ["Verrier","Vrr"],
  "winegrower" : ["Pressoir à vin","Prsr"],
  "alchemist" : ["Tour des alchimistes","Alch."],
  "architect" : ["Bureau de l`architecte","Arch."],
  "optician" : ["Opticien","Opt."],
  "vineyard" : ["Cave à vin","Cave"],
  "fireworker" : ["Zone de test des artificiers","Artf"]
  };
 texts = {
  "Upkeep"     : "Coûts",
  "Growth"     : "Croissance",
  "cityName": "Villes",
  "currentlyBuilding": "Construction en cours",
  "summary": "Total",
  "hide_settings": "Cacher les options",
  "show_settings": "Voir les options",
  "Population": "Population",
  "Research": "Recherche",
  "finishedBuilding": "Construction terminée",
  "Incomes":"Revenus",
  "Trading":"Commerce",
  "Wood": "Bois",
  "Wine": "Vin",
  "Marble": "Marbre",
  "Crystal": "Cristal",
  "Sulfur": "Soufre"
  };
 };

EmpireBoard.Intl.Load_Texts_GR = function()
 {
 //greek translation, thanks to panospap and Napoleon I
 langtype = "";  
 buildings = {  
  "townHall" : ["Δημαρχείο", "Δημαρχείο"],  
  "temple"      : ["Ναός", "Ναός"],  
  "academy" : ["Ακαδημία", "Ακαδημία"],  
  "port" : ["Εμπορικός Λιμένας", "Εμπορικός Λιμένας"],  
  "shipyard" : ["Ναυπηγείο", "Ναυπηγείο"],  
  "warehouse" : ["Αποθήκη Εμπορευμάτων", "Αποθήκη Εμπορευμάτων"], 
  "dump"           : ["Αλάνα", "Αλάνα"],
  "wall" : ["Τείχη της Πόλης", "Τείχη της Πόλης"],  
  "tavern" : ["Ταβέρνα", "Ταβέρνα"],  
  "museum" : ["Μουσείο", "Μουσείο"],  
  "palace" : ["Παλάτι", "Παλάτι"],  
  "palaceColony" : ["Η Κατοικία του Κυβερνήτη", "Η Κατοικία του Κυβερνήτη"],  
  "embassy" : ["Πρεσβεία", "Πρεσβεία"],  
  "branchOffice" : ["Θέση Εμπορικών Συναλλαγών", "Θέση Εμπορικών Συναλλαγών"],  
  "safehouse" : ["Κρησφύγετο", "Κρησφύγετο"],  
  "barracks" : ["Στρατώνες", "Στρατώνες"],  
  "workshop" : ["Εργαστήριο", "Εργαστήριο"],  
  "carpentering" : ["Ξυλουργός", "Ξυλουργός"],  
  "forester" : ["Σπίτι Ξυλοκόπου", "Σπίτι Ξυλοκόπου"],  
  "stonemason" : ["Κτίριο Λατομείου", "Κτίριο Λατομείου"],  
  "glassblowing" : ["Υαλουργείο", "Υαλουργείο"],  
  "winegrower" : ["Αποστακτήριο", "Αποστακτήριο"],  
  "alchemist" : ["Πύργος Αλχημιστή", "Πύργος Αλχημιστή"],  
  "architect" : ["Αρχιτεκτονικό Γραφείο", "Αρχιτεκτονικό Γραφείο"],  
  "optician" : ["Οπτικός", "Οπτικός"],  
  "vineyard" : ["Πιεστήριο Σταφυλιού", "Πιεστήριο Σταφυλιού"],  
  "fireworker" : ["Περιοχή Δοκιμών Πυροτεχνημάτων", "Περιοχή Δοκιμών Πυροτεχνημάτων"]  
  };  
 texts = {  
  "Upkeep":"Συντήρηση",
  "Growth"         : "Ικανοποίηση", 
  "cityName": "Όνομα Πόλης",
  "currentlyBuilding": "Αναβαθμίζετε τώρα",
  "summary": "Σύνολο",  
  "hide_settings": "Κρύψε ρυθμίσεις",
  "show_settings": "Εμφάνισε ρυθμίσεις",  
  "Population": "Πληθυσμός",  
  "Research": "Έρευνες",  
  "finishedBuilding": "Ολοκληρωμένη Αναβαθμιση",
  "Incomes":"Εισοδήματα",
  "Trading":"Εμπόριο",  
  "Wood": "Οικοδομικό Υλικό",
  "Wine": "Κρασί",
  "Marble": "Μάρμαρο",
  "Crystal": "Κρύσταλλο",
  "Sulfur": "Θείο"  
  };  
 };

EmpireBoard.Intl.Load_Texts_HU = function()
 {
 // Thank Luzer
 langtype = "";
 buildings = {
  "townHall"      : ["Városháza", "Városháza"],
  "temple"      : ["Templom", "Templom"],
  "academy"       : ["Akadémia", "Akadémia"],
  "port"          : ["Kikötő", "Kikötő"],
  "shipyard"      : ["Hajógyár", "Hajógyár"],
  "warehouse"     : ["Raktár", "Raktár"],
  "wall"          : ["Városfal", "Fal"],
  "tavern"        : ["Fogadó", "Fogadó"],
  "museum"        : ["Múzeum", "Múzeum"],
  "palace"        : ["Palota", "Palota"],
  "palaceColony"  : ["Helytartó", "Helytartó"],
  "embassy"       : ["Nagykövetség", "Nagykövetség"],
  "branchOffice"  : ["Kereskedő", "Kereskedő"],
  "safehouse"     : ["Rejtekhely", "Rejtekhely"],
  "barracks"      : ["Barakk", "Barakk"],
  "workshop"    : ["Műhely", "Műhely"],
  "carpentering" : ["Ácsmester", "Ácsmester"],
  "forester" : ["Erdész", "Erdész"],
  "stonemason" : ["Kőműves", "Kőműves"],
  "glassblowing" : ["Üvegfúvó", "Üvegfúvó"],
  "winegrower" : ["Bortermelő", "Bortermelő"],
  "alchemist" : ["Alkimista", "Alkimista"],
  "architect" : ["Építész", "Építész"],
  "optician" : ["Optikus", "Optikus"],
  "vineyard" : ["Szőlőprés", "Szőlőprés"],
  "fireworker" : ["Tűzszerész", "Tűzszerész"],
  "dump" : ["Nyersanyag depó", "Depó"]
  };
 texts = {
  "Growth" : "Növekedés", 
  "Upkeep"   :"Fenntartás",
  "cityName": "Város neve",
  "currentlyBuilding": "Építés alatt",
  "summary": "Összesen",
  "hide_settings": "Beállítások elrejtése",
  "show_settings": "Beállítások megtekintése",
  "Population": "Lakosság",
  "Research": "Fejlesztés",
  "finishedBuilding": "Finished building",
  "Incomes":"Bevételek",
  "Trading":"Trading",
  "Wood": "Építőanyag",
  "Wine": "Bor",
  "Marble": "Márvány",
  "Crystal": "Kristály",
  "Sulfur": "Kénpor"
  };
 };

EmpireBoard.Intl.Load_Texts_IL = function()
 {
 //hebrew translation, thank Refael Ackermann, Yaakov Rothmann
 langtype = "rf";
 buildings = {
  "townHall"      : ["עיריה", "עיריה"],
  "temple" : ["מקדש", "מקדש"], 
  "academy"       : ["אקדמיה", "אקדמיה"],
  "port"          : ["נמל מסחר", "נמל"],
  "shipyard"      : ["מספנה", "מספנה"],
  "warehouse"     : ["מחסן", "מחסן"],
  "wall"          : ["חומה", "חומה"],
  "tavern"        : ["פונדק", "פונדק"],
  "museum"        : ["מוזאון", "מוזאון"],
  "palace"        : ["ארמון", "ארמון"],
  "palaceColony"  : ["מגורי המושל", "מושל"],
  "embassy"       : ["שגרירות", "שגרירות"],
  "branchOffice"  : ["תחנת סחר", "סחר"],
  "safehouse"     : ["מחבוא", "מחבוא"],
  "barracks"      : ["מגורי חיילים", "חיילים"],
  "workshop"      : ["סדנא", "סדנא"],
  "carpentering"  : ["נגר", "נגר"],
  "forester"      : ["יערן", "יערן"],
  "stonemason"    : ["חרש אבן", "אבן"],
  "glassblowing"  : ["נפח זכוכית", "זכוכית"],
  "winegrower"    : ["יינן", "יינן"],
  "alchemist"     : ["אלכימאי", "אלכימאי"],
  "architect"     : ["ארכיטקט", "ארכיטקט"],
  "optician"      : ["אופטיקאי", "אופטיקאי"],
  "vineyard"      : ["יקב", "יקב"],
  "fireworker"    : ["זיקוקים", "זיקוקים"],
  "dump" : ["מאגר", "לפרק"]
  };
 texts = {
  "Upkeep" : "אחזקה",
  "Growth" : "גידול", 
  "cityName": "שם עיר",
  "currentlyBuilding": "בבניה",
  "summary": "סיכום",
  "hide_settings": "הסתר אפשרויות",
  "show_settings": "הצג אפשרויות",
  "Population": "אוכלוסיה",
  "Research" : "מחקר", 
  "finishedBuilding": "הסתימה בניה",
  "Incomes":"הכנסה",
  "Trading":"סוחר",
  "Wood": "עץ",
  "Wine": "יין",
  "Marble": "שיש",
  "Crystal": "קריסטל",
  "Sulfur": "גופרית"
  };
 };

EmpireBoard.Intl.Load_Texts_IR = function()
 {
 // Todo
 this.Load_Texts_EN();
 langtype = "rf";
 };
 
EmpireBoard.Intl.Load_Texts_IT = function()
 {
 //Italian translation, thanks to Brucee and matteo466
 langtype = "";
 buildings = {
  "townHall" : ["Municipio", "Municipio"],
  "temple"      : ["Temple", "Temple"],
  "academy" : ["Accademia", "Accademia"],
  "port" : ["Porto", "Porto"],
  "shipyard" : ["Cantiere navale", "Cantiere navale"],
  "warehouse" : ["Magazzino", "Magazzino"],
  "wall" : ["Muro", "Muro"],
  "tavern" : ["Taverna", "Taverna"],
  "museum" : ["Museo", "Museo"],
  "palace" : ["Palazzo", "Palazzo"],
  "palaceColony" : ["Governatore", "Governatore"],
  "embassy" : ["Ambasciata", "Ambasciata"],
  "branchOffice" : ["Mercato", "Mercato"],
  "safehouse" : ["Nascondiglio", "Nascondiglio"],
  "barracks" : ["Caserma", "Caserma"],
  "workshop" : ["Officina", "Officina"],
  "carpentering" : ["Carpentiere", "Carpentiere"],
  "forester" : ["Guardaboschi", "Guardaboschi"],
  "stonemason" : ["Tagliapietre", "Tagliapietre"],
  "glassblowing" : ["Vetraio", "Vetraio"],
  "winegrower" : ["Viticoltore", "Viticoltore"],
  "alchemist" : ["Alchimista", "Alchimista"],
  "architect" : ["Architetto", "Architetto"],
  "optician" : ["Ottico", "Ottico"],
  "vineyard" : ["Cantina", "Cantina"],
  "fireworker" : ["Pirotecnico", "Pirotecnico"]
  };
 texts = {
  "cityName": "Città", "currentlyBuilding": "Costruzione in corso", "summary": "Sommario",
  "hide_settings": "Nascondi opzioni", "show_settings": "Mostra opzioni",
  "Population": "Popolazione",
  "finishedBuilding": "Costruzione completata","Incomes":"Saldo oro",
  "Wood": "Legno", "Wine": "Vino", "Marble": "Marmo", "Crystal": "Cristallo", "Sulfur": "Zolfo"
  };
 };

EmpireBoard.Intl.Load_Texts_LV = function()
 {
 //Latvian translation by aezaurs/sauron
 langtype = "";
 buildings = {
  "townHall" : ["Rātsnams", "Rātsnams"],
  "temple" : ["Templis", "Templis"],
  "academy" : ["Akadēmija", "Akadēmija"],
  "port" : ["Osta", "Osta"],
  "shipyard" : ["Kuģu būvētava", "Kuģu būvētava"],
  "warehouse" : ["Noliktava", "Noliktava"],
  "wall" : ["Mūris", "Mūris"],
  "tavern" : ["Krogs", "Krogs"],
  "museum" : ["Muzejs", "Muzejs"],
  "palace" : ["Pils", "Pils"],
  "palaceColony" : ["Gubernātora rezidence", "Gubernātora rezidence"],
  "embassy" : ["Vēstniecība", "Vēstniecība"],
  "branchOffice" : ["Tirgus", "Tirgus"],
  "safehouse" : ["Paslēptuve", "Paslēptuve"],
  "barracks" : ["Kazarmas", "Kazarmas"],
  "workshop" : ["Darbnīca", "Darbnīca"],
  "carpentering" : ["Namdaris", "Namdaris"],
  "forester" : ["Mežsarga māja", "Mežsargs"],
  "stonemason" : ["Akmeņkalis", "Akmeņkalis"],
  "glassblowing" : ["Stikla pūtējs", "Stiklinieks"],
  "winegrower" : ["Vīna audzētājs", "Vīna audzētājs"],
  "alchemist" : ["Alhīmiķa Tornis", "Alhīmiķa Tornis"],
  "architect" : ["Arhitekta Ofiss", "Arhitekts"],
  "optician" : ["Optiķis", "Optiķis"],
  "vineyard" : ["Vīna Gatavotājs", "Vīna Gatavotājs"],
  "fireworker" : ["Uguņošanas izmēģinājumu apgabals", "Uguņošanas apg."]
  };
 texts = {
  "Upkeep" :"Uzturēšana",
  "cityName" : "Pilsēta",
  "currentlyBuilding" : "Šobrīd ceļās",
  "summary" : "Kopā",
  "hide_settings" : "Slēpt iestatījumus",
  "show_settings" : "Rādīt iestatījumus",
  "Population" : "Apdzīvotība",
  "Research": "Izpēte",
  "finishedBuilding" : "Pabeigta celtniecība",
  "Incomes" : "Zelts",
  "Trading" : "Tirzniecība",
  "Wood" : "Koks",
  "Wine" : "Vīns",
  "Marble" : "Marmors",
  "Crystal" : "Kristāls",
  "Sulfur" : "Sērs"
  };
 };

EmpireBoard.Intl.Load_Texts_NL = function()
 {
 //Dutch translation, thanks to cremers
 langtype = "";
 buildings = {
  "townHall" : ["Stadhuis", "Stadhuis"],
  "temple"      : ["Temple", "Temple"],
  "academy" : ["Academie", "Academie"],
  "port" : ["Handelshaven", "Haven"],
  "shipyard" : ["Scheepswerf", "Werf"],
  "warehouse" : ["Opslagplaats", "Opslagplaats"],
  "wall" : ["Stadsmuur", "Muur"],
  "tavern" : ["Taverne", "Taverne"],
  "museum" : ["Museum", "Museum"],
  "palace" : ["Paleis", "Paleis"],
  "palaceColony" : ["Gouverneurswoning", "Gouverneurswoning"],
  "embassy" : ["Ambassade", "Ambassade"],
  "branchOffice" : ["Handelspost", "Handelspost"],
  "safehouse" : ["Schuilplaats", "Schuilplaats"],
  "barracks" : ["Barakken", "Barakken"],
  "workshop" : ["Werkplaats", "Werkplaats"],
  "carpentering" : ["Timmerman", "Timmerman"],
  "forester" : ["Houthakkers Loge", "Houthakkers Loge"],
  "stonemason" : ["Steenhouwer", "Steenhouwer"],
  "glassblowing" : ["Glasblazer", "Glasblazer"],
  "winegrower" : ["Wijnboer", "Wijnboer"],
  "alchemist" : ["De Alchemie Toren", "De Alchemie Toren"],
  "architect" : ["Architectenbureau", "Architectenburea"],
  "optician" : ["Opticien", "Opticien"],
  "vineyard" : ["Wijnpers", "Wijnpers"],
  "fireworker" : ["Vuurwerk Opslag", "Vuurwerk Opslag"]
  };
 texts = {
  "cityName": "Stadsnaam", "currentlyBuilding": "Huidige constructie", "summary": "Opgeteld",
  "hide_settings": "Verberg instellingen", "show_settings": "Instellingen",
  "Population": "Inwoners", "finishedBuilding": "Klaar","Incomes":"Inkomsten","Trading":"Handel",
  "Wood": "Hout", "Wine": "Wijn", "Marble": "Marmer", "Crystal": "Glas", "Sulfur": "Zwavel"
  }; 
 };
 
EmpireBoard.Intl.Load_Texts_PK = function()
 {
 // Todo
 this.Load_Texts_EN();
 langtype = "rf";
 };
 
EmpireBoard.Intl.Load_Texts_PL = function()
 {
 // thanks to Syjamek and Patibar
 langtype = "";
 buildings = {
  "townHall" : ["Ratusz", "Ratusz"],
  "temple"      : ["Świątynia", "Świątynia"],
  "academy" : ["Akademia", "Akademia"],
  "port" : ["Port", "Port"],
  "shipyard" : ["Stocznia", "Stocznia"],
  "warehouse" : ["Magazyn", "Magazyn"],
  "wall" : ["Mur", "Mur"],
  "tavern" : ["Tawerna ", "Tawerna"],
  "museum" : ["Muzeum", "Muzeum"],
  "palace" : ["Pałac", "Pałac"],
  "palaceColony" : ["Rezydencja", "Rezydencja"],
  "embassy" : ["Ambasada", "Ambasada"],
  "branchOffice" : ["Bazar", "Bazar"],
  "safehouse" : ["Kryjówka", "Kryjówka"],
  "barracks" : ["Koszary", "Koszary"],
  "workshop" : ["Warsztat", "Warsztat"],
  "carpentering" : ["Warsztat Cieśli", "Warsztat Cieśli"],
  "forester" : ["Leśniczówka", "Leśniczówka"],
  "stonemason" : ["Kamieniarz", "Kamieniarz"],
  "glassblowing" : ["Huta Szkła", "Huta Szkła"],
  "winegrower" : ["Winnica", "Winnica"],
  "alchemist" : ["Wieża Alchemika", "Wieża Alchemika"],
  "architect" : ["Biuro Architekta", "Biuro Architekta"],
  "optician" : ["Optyk", "Optyk"],
  "vineyard" : ["Winiarz", "Winiarz"],
  "fireworker" : ["Zakład Pirotechnika", "Zakład Pirotechnika"]
  };
 texts = {
  "Upkeep"   :"Koszty utrzymania",
  "cityName": "Nazwa", "currentlyBuilding": "W budowie", "summary": "Suma",
  "hide_settings": "Ukryj ustawieni", "show_settings": "Pokaż ustawienia",
  "Population": "Populacja",
  "Research": "Badania",
  "finishedBuilding": "Budowa zakończona","Incomes":"Bilans złota","Trading":"Handel",
  "Wood": "Drewno", "Wine": "Wino", "Marble": "Marmur", "Crystal": "Kryształ", "Sulfur": "Siarka"
  }; 
 };

EmpireBoard.Intl.Load_Texts_PT = function()
 {
 // Portuguese translation, thanks to alpha tester, Mr. Burns, Jeanipoo
 langtype = "";
 buildings = {
  "townHall"      : ["Câmara Municipal", "Câmara Municipal"],
  "temple"      : ["Temple", "Temple"],
  "academy"       : ["Academia", "Academia"],
  "port"          : ["Porto Mercantil", "Porto"],
  "shipyard"      : ["Estaleiro", "Estaleiro"],
  "warehouse"     : ["Armazém", "Armazém"],
  "wall"          : ["Muralha", "Muralha"],
  "tavern"        : ["Taberna", "Taberna"],
  "museum"        : ["Museu", "Museu"],
  "palace"        : ["Palácio", "Palácio"],
  "palaceColony"  : ["Residência do Governador", "Governador"],
  "embassy"       : ["Embaixada", "Embaixada"],
  "branchOffice"  : ["Mercado", "Mercado"],
  "safehouse"     : ["Espionagem", "Espionagem"],
  "barracks"      : ["Quartel", "Quartel"],
  "workshop" : ["Oficina", "Oficina"],
  "carpentering" : ["Carpintaria", "Carpintaria"],
  "forester" : ["Guarda Florestal", "Florestal"],
  "stonemason" : ["Pedreiro", "Pedreiro"],
  "glassblowing" : ["Fábrica de Vidro", "Vidro"],
  "winegrower" : ["Viticultor", "Viticultor"],
  "alchemist" : ["Torre do Alquimista", "Alquimista"],
  "architect" : ["Atelier de Arquitetura", "Arquitetura"],
  "optician" : ["Oculista", "Oculista"],
  "vineyard" : ["Caves de Vinho", "Caves"],
  "fireworker" : ["Fábrica de Pirotecnia", "Pirotecnia"]
  };
 texts = {
  "Upkeep"     : "Manutenção",
  "Growth"     : "Crescimento",
  "Research"     : "Pesquisa",
  "cityName": "Cidades",
  "currentlyBuilding": "Em Construçao",
  "summary": "Sumário",
  "hide_settings": "Ocultar Configuraçoes",
  "show_settings": "Ver Configuraçoes",
  "Population": "População",
  "Incomes":"Rendimento",
  "Wood": "Madeira",
  "Wine": "Vinho",
  "Marble": "Mármore",
  "Crystal": "Cristal",
  "Sulfur": "Enxofre"
  };
 };

EmpireBoard.Intl.Load_Texts_RO = function()
 {
 //Romanian translation, thanks to Peta
 langtype = "";
 buildings = {
  "townHall" : ["Primarie", "Primarie"],
  "temple"      : ["Temple", "Temple"],
  "academy" : ["Academie", "Academie"],
  "port" : ["Port comercial", "Port"],
  "shipyard" : ["Santier Naval", "S.Naval"],
  "warehouse" : ["Depozit", "Depozit"],
  "wall" : ["Zid", "Zid"],
  "tavern" : ["Taverna", "Taverna"],
  "museum" : ["Muzeu", "Muzeu"],
  "palace" : ["Palat", "Palat"],
  "palaceColony" : ["Resedinta Guvernatorului", "R.Guv."],
  "embassy" : ["Ambasada", "Ambasada"],
  "branchOffice" : ["Punct de negot", "Piata"],
  "safehouse" : ["Ascunzatoare", "Ascunzatoare"],
  "barracks" : ["Cazarma", "Cazarma"],
  "workshop" : ["Atelier", "Atelier"],
  "carpentering" : ["Dulgher", "Dulgher"],
  "forester" : ["Casa Padurarului", "Padurar"],
  "stonemason" : ["Cariera", "Cariera"],
  "glassblowing" : ["Sticlarie", "Sticlarie"],
  "winegrower" : ["Vinificator", "Vinificator"],
  "alchemist" : ["Turnul Alchimistului", "Alchimist"],
  "architect" : ["Biroul Arhitectului", "Architect"],
  "optician" : ["Optician", "Optician"],
  "vineyard" : ["Presa de Vin", "Presa Vin"],
  "fireworker" : ["Zona Pirotehnica de Test", "Poligon"]
  };
 texts = {
  "cityName": "Nume Oras", "currentlyBuilding": "In constructie", "summary": "Total",
  "hide_settings": "Ascunde Setari", "show_settings": "Arata Setari",
  "Population": "Populatie",
  "finishedBuilding": "Constructie Finalizata","Incomes":"Economii","Trading":"Comert",
  "Wood": "Lemn", "Wine": "Vin", "Marble": "Marmura", "Crystal": "Cristal", "Sulfur": "Sulf"
  };
 };

EmpireBoard.Intl.Load_Texts_RS = function()
 {
 //serbian translation by s-a-k-a 
 langtype = "";
 buildings = {
  "townHall"       : ["Градска кућа", "Г. кућа"],    
  "temple"         : ["Храм", "Храм"],    
  "academy"        : ["Академија", "Академија"],    
  "port"           : ["Трговачка лука", "Лука"],    
  "shipyard"       : ["Бродоградилиште", "Бродоградилиште"],    
  "warehouse"      : ["Складиште", "Складиште"],    
  "wall"           : ["Градски зид", "Зид"],    
  "tavern"         : ["Крчма", "Крчма"],    
  "museum"         : ["Музеј", "Музеј"],    
  "palace"         : ["Палата", "Палата"],    
  "palaceColony"   : ["Гувернерова резиденција", "Резиденција"],    
  "embassy"        : ["Амбасада", "Амбасада"],    
  "branchOffice"   : ["Трговина", "Трговина"],    
  "safehouse"      : ["Скровиште", "Скровиште"],    
  "barracks"       : ["Барака", "Барака"],    
  "workshop"       : ["Радионица", "Радионица"],    
  "carpentering"   : ["Тесар", "Тесар"],    
  "forester"       : ["Шумарова кућа", "Ш. кућа"],    
  "stonemason"     : ["Зидар", "Зидар"],    
  "glassblowing"   : ["Стаклара", "Стаклара"],    
  "winegrower"     : ["Виноградар", "Виноградар"],    
  "alchemist"      : ["Алхемичарев торањ", "Торањ"],    
  "architect"      : ["Архитектина канцеларија", "Архитекта"],    
  "optician"       : ["Оптичар", "Оптичар"],    
  "vineyard"       : ["Винска преса", "Преса"],    
  "fireworker"     : ["Област за тестирање ватромета", "Област"]    
  };
 texts = {
  "Upkeep"                 : "Одржавање",    
  "cityName"               : "Градови",    
  "currentlyBuilding"      : "Тренутно се гради",    
  "summary"                : "Кратак преглед",    
  "hide_settings"          : "Сакриј подешавања",    
  "show_settings"          : "Прикажи подешавања",    
  "Population"             : "Популација",    
  "Research"               : "Истраживање",    
  "finishedBuilding"       : "Завршена изградња",    
  "Incomes"                : "Приходи",    
  "Trading"                : "Трговински",    
  "Wood"                   : "Дрво",    
  "Wine"                   : "Вино",    
  "Marble"                 : "Мермер",    
  "Crystal"                : "Кристал",    
  "Sulfur"                 : "Сумпор"    
  };
 };

EmpireBoard.Intl.Load_Texts_RU = function()
 {
 //russian translation by Mugivara, GrAndAG
 langtype = "";
 buildings = {
  "townHall" : ["Ратуша", "Ратуша"],
  "temple" : ["Храм", "Храм"],
  "academy" : ["Академия", "Академия"],
  "port" : ["Торговый порт", "Порт"],
  "shipyard" : ["Верфь", "Верфь"],
  "warehouse" : ["Склад", "Склад"],
  "wall" : ["Стена", "Стена"],
  "tavern" : ["Таверна", "Таверна"],
  "museum" : ["Музей", "Музей"],
  "palace" : ["Дворец", "Дворец"],
  "palaceColony" : ["Резиденция губернатора", "Резиденция"],
  "embassy" : ["Посольство", "Посольство"],
  "branchOffice" : ["Торговый пост", "Пост"],
  "safehouse" : ["Укрытие", "Укрытие"],
  "barracks" : ["Казарма", "Казарма"],
  "workshop" : ["Мастерская", "Мастерская"],
  "carpentering" : ["Плотницкая мастерская", "Плотник"],
  "forester" : ["Хижина леничего", "Лесничий"],
  "stonemason" : ["Каменоломня", "Каменоломня"],
  "glassblowing" : ["Стеклодувная мастерская", "Стеклодув"],
  "winegrower" : ["Винодельня", "Винодельня"],
  "alchemist" : ["Башня алхимика", "Алхимик"],
  "architect" : ["Бюро архитектора", "Архитектор"],
  "optician" : ["Оптика", "Оптика"],
  "vineyard" : ["Винный погреб", "Погреб"],
  "fireworker" : ["Полигон пиротехника", "Полигон"]
  };
 texts = {
  "Upkeep": "Содерж.",
  "Growth": "Рост",
  "cityName": "Название города",
  "currentlyBuilding": "Текущее строительство",
  "summary": "Итого",
  "hide_settings": "Скрыть настройки",
  "show_settings": "Показать настройки",
  "Population": "Население",
  "Research": "Учёные",
  "finishedBuilding": "Строительство завершено",
  "Incomes":"Золото",
  "Trading":"Торговля",
  "Wood": "Стройматериалы",
  "Wine": "Виноград",
  "Marble": "Мрамор",
  "Crystal": "Хрусталь",
  "Sulfur": "Сера"
  };
 };

EmpireBoard.Intl.Load_Texts_SE = function()
 {
 // thank Dinfur
 langtype = "";
 buildings = {
  "townHall" : ["Rådhus", "Rådhus"],
  "temple"      : ["Temple", "Temple"],
  "academy" : ["Akademi", "Akademi"],
  "port" : ["Handelshamn", "Hamn"],
  "shipyard" : ["Skeppsvarv", "Varv"],
  "warehouse" : ["Lagerlokal", "Lager"],
  "wall" : ["Stadsmur", "Mur"],
  "tavern" : ["Taverna", "Taverna"],
  "museum" : ["Museum", "Museum"],
  "palace" : ["Palats", "Palats"],
  "palaceColony" : ["Guvernörsresidens", "Guvernör"],
  "embassy" : ["Ambassad", "Ambassad"],
  "branchOffice" : ["Handelsstation", "Handel"],
  "safehouse" : ["Gömställe", "Gömställe"],
  "barracks" : ["Kasern", "Kasern"],
  "workshop" : ["Verkstad", "Verkstad"],
  "carpentering" : ["Snickare", "Snickare"],
  "forester" : ["Skogsvaktare", "Skog"],
  "stonemason" : ["Stenhuggare", "Sten"],
  "glassblowing" : ["Glasblåsare", "Glas"],
  "winegrower" : ["Vinodlare", "Vin"],
  "alchemist" : ["Alkemist", "Alkemist"],
  "architect" : ["Arkitekt", "Arkitekt"],
  "optician" : ["Optiker", "Optiker"],
  "vineyard" : ["Vinpress", "Vin"],
  "fireworker" : ["Fyrverkerifabrik", "Fyrverk."]
  };
 texts = {
  "cityName": "Stadsnamn", "currentlyBuilding": "Bygger nu", "summary": "Summering",
  "hide_settings": "Göm inställningar", "show_settings": "Visa inställningar",
  "Population": "Befolkning",
  "finishedBuilding": "Byggt klart","Incomes":"Inkomster","Trading":"Handlar",
  "Wood": "Trä", "Wine": "Vin", "Marble": "Marmor", "Crystal": "Kristall", "Sulfur": "Svavel"
  };
 };

EmpireBoard.Intl.Load_Texts_SK = function()
 {
 //Slovak translation by RxR
 langtype = "";
 buildings = {
  "townHall" : ["Radnica", "Radnica"],
  "temple" : ["Kostol", "Kostol"],
  "academy" : ["Akadémia", "Akadémia"],
  "port" : ["Obchodný prístav", "Prístav"],
  "shipyard" : ["Lodenica", "Lodenica"],
  "warehouse" : ["Sklad", "Sklad"],
  "wall" : ["Mestský múr", "Múr"],
  "tavern" : ["Vináreň", "Vináreň"],
  "museum" : ["Múzeum", "Múzeum"],
  "palace" : ["Palác", "Palác"],
  "palaceColony" : ["Rezidencia guvernéra", "Guvernér"],
  "embassy" : ["Ambasáda", "Ambasáda"],
  "branchOffice" : ["Trhovisko", "Trh"],
  "safehouse" : ["Úkryt", "Úkryt"],
  "barracks" : ["Kasárne", "Kasárne"],
  "workshop" : ["Dielňa", "Dielňa"],
  "carpentering" : ["Tesár", "Tesár"],
  "forester" : ["Dom lesníka", "Lesník"],
  "stonemason" : ["Kameňolom", "Kamenár"],
  "glassblowing" : ["Fúkač skla", "Sklár"],
  "winegrower" : ["Vinár", "Vinár"],
  "alchemist" : ["Veža alchymistov", "Alchymista"],
  "architect" : ["Úrad architekta", "Architekt"],
  "optician" : ["Optik", "Optik"],
  "vineyard" : ["Vinica", "Vinica"],
  "fireworker" : ["Testovanie ohňostrojov", "Ohňostroje"]
  };
 texts = {
  "cityName" : "Mesto",
  "currentlyBuilding" : "Stavia sa",
  "summary" : "Spolu",
  "hide_settings" : "Skryť nastavenia",
  "show_settings" : "Zobraziť nastavenia",
  "Population" : "Obyvateľstvo",
  "finishedBuilding" : "Dokončené stavby",
  "Incomes" : "Príjmy",
  "Trading" : "Obchod",
  "Wood" : "Drevo",
  "Wine" : "Víno",
  "Marble" : "Mramor",
  "Crystal" : "Sklo",
  "Sulfur" : "Síra"
  };
 };

EmpireBoard.Intl.Load_Texts_SL = function()
 {
 //Slovenian translation, thanks to Americano, MazaM, kayz1
 langtype = "";
 buildings = {
  "townHall"   : ["Mestna hiša", "Mestna"],
  "temple"   : ["Tempelj", "Tempelj"],
  "academy"   : ["Akademija", "Akademija"],
  "port"    : ["Trgovska luka", "Luka"],
  "shipyard"   : ["Ladjedelnica", "Ladjedelnica"],
  "warehouse"   : ["Skladišče", "Skladišče"],
  "dump"    : ["Depot", "Depot"],
  "wall"    : ["Obzidje", "Obzidje"],
  "tavern"   : ["Krčma", "Krčma"],
  "museum"   : ["Muzej", "Muzej"],
  "palace"   : ["Palača", "Palača"],
  "palaceColony"  : ["Guvernerjeva rezidenca", "Guverner"],
  "embassy"   : ["Ambasada", "Ambasada"],
  "branchOffice"  : ["Tržnica", "Tržnica"],
  "safehouse"   : ["Skrivališče", "Skrivališče"],
  "barracks"   : ["Barake", "Barake"],
  "workshop"   : ["Delavnica", "Delavnica"],
  "carpentering"  : ["Tesar", "Tesar"],
  "forester"   : ["Gozdarska hiša", "Gozdar"],
  "stonemason"  : ["Kamnoseška delavnica", "Kamnosek"],
  "glassblowing"  : ["Steklopihač", "Steklopihač"],
  "winegrower"  : ["Vinogradnik", "Vinogradnik"],
  "alchemist"   : ["Stolp alkimista", "Alkimist"],
  "architect"   : ["Pisarna arhitekta", "Arhitekt"],
  "optician"   : ["Optika", "Optika"],
  "vineyard"   : ["Vinska preša", "Preša"],
  "fireworker"  : ["Testno območje ognjemetov", "Pirotehnik"]
  };
 texts = {
  "Upkeep"     : "Vzdrževanje",
  "Growth"     : "Rast",
  "Research"     : "Raziskave",
  "cityName"     : "Ime mesta",
  "currentlyBuilding"   : "Gradi se",
  "summary"     : "Povzetek:",
  "hide_settings"    : "Skrij nastavitve",
  "show_settings"    : "Pokaži nastavitve",
  "Population"    : "Prebivalci",
  "finishedBuilding"   : "Zgrajeno",
  "Incomes"     : "Prihodki",
  "Trading"     : "Trgovanje",
  "Wood"      : "Gradbeni material",
  "Wine"      : "Vino",
  "Marble"     : "Marmor",
  "Crystal"     : "Kristal",
  "Sulfur"     : "Žveplo"
  };  
 };

EmpireBoard.Intl.Load_Texts_TR = function()
 {
//Turkish translation, thanks to NailBey, regular6
 langtype = "";
 buildings = {
  "townHall"   : ["Belediye Binası", "Belediye"],
  "temple"   : ["Tapınak", "Tapınak"],
  "academy"   : ["Akademi", "Akademi"],
  "port"    : ["Ticaret Limanı", "Liman"],
  "shipyard"   : ["Donanma Tersanesi", "Donanma "],
  "warehouse"   : ["Depo", "Depo"],
  "dump"    : ["Yığın Sahası", "Yığın Sahası"],
  "wall"    : ["Sur", "Sur"],
  "tavern"   : ["Taverna", "Taverna"],
  "museum"   : ["Müze", "Müze"],
  "palace"   : ["Saray", "Saray"],
  "palaceColony"    : ["Vali Konağı", "Vali Konağı"],
  "embassy"   : ["Büyükelçilik", "Büyükelçilik"],
  "branchOffice"   : ["Ticaret Merkezi", "Ticaret Merkezi"],
  "safehouse"   : ["İstihbarat Merkezi", "İstihbarat Merkezi"],
  "barracks"   : ["Kışla", "Kışla"],
  "workshop"   : ["Mucit Atölyesi", "Mucit Atölyesi"],
  "carpentering"   : ["Marangoz Atölyesi", "Marangoz Atölyesi"],
  "forester"   : ["Ormancı Kulübesi", "Ormancı Kulübesi"],
  "stonemason"   : ["Mermer Atölyesi", "Mermer Atölyesi"],
  "glassblowing"   : ["Cam Eşya Atölyesi", "Cam Eşya Atölyesi"],
  "winegrower"   : ["Bağ Evi", "Bağ Evi"],
  "alchemist"   : ["Simya Kulesi", "Simya Kulesi"],
  "architect"   : ["Mimarlık Bürosu", "Mimarlık Bürosu"],
  "optician"   : ["Optik", "Optik"],
  "vineyard"   : ["Şarap Mahzeni", "Şarap Mahzeni"],
  "fireworker"   : ["Fişekçi", "Fişekçi"]
  };
 texts = {
  "Upkeep"     : "Bakım Masrafı",
  "Growth"     : "Büyüme",
  "Research"     : "Araştrma",
  "cityName"     : "Şehir Adı",
  "currentlyBuilding"    : "İnşaa Ediliyor",
  "summary"     : "Toplam:",
  "hide_settings"     : "Ayarları Gizle",
  "show_settings"     : "Ayarları Göster",
  "Population"     : "Nüfus",
  "finishedBuilding"    : "İnşaa Bitti",
  "Incomes"     : "Gelir",
  "Trading"     : "Ticaret",
  "Wood"      : "Odun",
  "Wine"      : "Şarap",
  "Marble"     : "Mermer",
  "Crystal"     : "Kristal",
  "Sulfur"     : "Sülfür"
  };
 };

EmpireBoard.Intl.Load_Texts_TW = function()
 {
 //traditional chinese translation by Whiskers, cherub
 langtype = "";
 buildings = {
  "townHall" : ["市政府", "市府"],
  "temple" : ["祭祀神殿", "神殿"],
  "academy" : ["學院", "學院"],
  "port" : ["港口", "港口"],
  "shipyard" : ["船塢", "船塢"],
  "warehouse" : ["倉庫", "倉庫"],
  "wall" : ["城牆", "城牆"],
  "tavern" : ["酒館", "酒館"],
  "museum" : ["博物館", "博物"],
  "palace" : ["皇宫", "皇宫"],
  "palaceColony" : ["總督府", "總督"],
  "embassy" : ["大使館", "使館"],
  "branchOffice" : ["市場", "市場"],
  "safehouse" : ["間諜小屋", "間諜"],
  "barracks" : ["兵營", "兵營"],
  "workshop" : ["兵工廠", "兵廠"],
  "carpentering" : ["木匠屋", "木-"],
  "forester" : ["林務官宅", "木+"],
  "stonemason" : ["石匠屋", "石+"],
  "glassblowing" : ["玻璃吹制廠", "晶+"],
  "winegrower" : ["葡萄樹園", "葡+"],
  "alchemist" : ["煉金塔", "硫+"],
  "architect" : ["建築公署", "石-"],
  "optician" : ["配鏡商館", "晶-"],
  "vineyard" : ["藏酒窖", "葡-"],
  "fireworker" : ["煙火測試區域", "硫-"],
  "dump"   : ["貨棧","貨棧"]
  };
 texts = {
  "cityName": "城鎮",
  "currentlyBuilding": "正在建造",
  "summary": "總計",
  "hide_settings": "隐藏設定",
  "show_settings": "顯示設定",
  "Population": "人口",
  "finishedBuilding": "建造完成",
  "Incomes":"收入",
  "Trading":"交易",
  "Wood": "木材",
  "Wine": "葡萄",
  "Marble": "大理石",
  "Crystal": "水晶",
  "Sulfur": "硫磺",
  "Growth":"成長率",
  "Research":"研究",
  "Upkeep":"軍費"
  }; 
 };

EmpireBoard.Intl.Load_Texts_UA = function()
 {
 //ukrainian Translation by feelimon http://www.ikariam.com.ua
 langtype = "";
 buildings = {
  "townHall" : ["Ратуша", "Ратуша"],
  "temple" : ["Храм", "Храм"],
  "academy" : ["Академія", "Академія"],
  "port" : ["Торговий порт", "Порт"],
  "shipyard" : ["Верф", "Верф"],
  "warehouse" : ["Склад", "Склад"],
  "wall" : ["Стіна", "Стіна"],
  "tavern" : ["Таверна", "Таверна"],
  "museum" : ["Музей", "Музей"],
  "palace" : ["Палац", "Палац"],
  "palaceColony" : ["Резиденція губернатора", "Резиденція"],
  "embassy" : ["Посольство", "Посольство"],
  "branchOffice" : ["Торговий пост", "Пост"],
  "safehouse" : ["Схованка", "Схованка"],
  "barracks" : ["Бараки", "Бараки"],
  "workshop" : ["Майстерня", "Майстерня"],
  "carpentering" : ["Теслярська майстерня", "Тесля"],
  "forester" : ["Дім лісничого", "Лісник"],
  "stonemason" : ["Дім каменяра", "Дім каменяра"],
  "glassblowing" : ["Склодувна майстерня", "Склодув"],
  "winegrower" : ["Виноградник", "Виноградник"],
  "alchemist" : ["Вежа алхіміка", "Алхімік"],
  "architect" : ["Офіс архітектора", "Архітектор"],
  "optician" : ["Оптик", "Оптик"],
  "vineyard" : ["Винний погріб", "Погріб"],
  "fireworker" : ["Полігон піротехніка", "Піротехнік"]
  };
 texts = {
  "Upkeep" :"Утримання",
  "cityName": "Назва міста", "currentlyBuilding": "Поточне будівництво", "summary": "Всього",
  "hide_settings": "Сховати налаштування", "show_settings": "Показати налаштування",
  "Population": "Населення",
  "Research": "Вчені",
  "finishedBuilding": "Будівництво завершено", "Incomes":"Золото", "Trading":"Торгівля",
  "Wood": "Дерево", "Wine": "Вино", "Marble": "Мармур",
  "Crystal": "Кришталь", "Sulfur": "Сірка"
  };
 };

EmpireBoard.Intl.Load_Texts_VN = function()
 {
 // Vietnamese translations, thank Gafs
 langtype = ""; 
 buildings = {
  "townHall"      : ["Tòa thị chính", "Tòa T.Chính"],
  "temple"      : ["Temple", "Temple"],
  "academy"       : ["Học viện", "Học viện"],
  "port"          : ["Cảng giao dịch", "Cảng GD"],
  "shipyard"      : ["Xưởng đóng tàu", "Xưởng tàu"],
  "warehouse"     : ["Kho hàng", "Kho"],
  "wall"          : ["Tường thành", "Tường"],
  "tavern"        : ["Quán rượu", "Quán rượu"],
  "museum"        : ["Viện bảo tàng", "V.B.Tàng"],
  "palace"        : ["Cung điện", "Cung điện"],
  "palaceColony"  : ["Phủ thủ hiến", "Phủ"],
  "embassy"       : ["Tòa đại sứ", "Tòa Đ.Sứ"],
  "branchOffice"  : ["Trạm giao dịch", "Trạm GD"],
  "safehouse"     : ["Nơi ẩn náu", "Nơi ẩn náu"],
  "barracks"      : ["Trại lính", "Trại lính"],
  "workshop"    : ["Xưởng", "Xưởng"],
  "carpentering" : ["Thợ mộc", "Thợ mộc"],
  "forester" : ["Nhà kiểm lâm", "Kiểm lâm"],
  "stonemason" : ["Thợ xây đá", "Thợ đá"],
  "glassblowing" : ["Người thổi thủy tinh", "Thổi TT"],
  "winegrower" : ["Máy ép nho", "Ép nho"],
  "alchemist" : ["Giả kim", "Giả kim"],
  "architect" : ["Tòa kiến trúc", "Kiến trúc"],
  "optician" : ["Thợ kính", "Thợ kính"],
  "vineyard" : ["Vườn nho", "V.Nho"],
  "fireworker" : ["Thử thuốc súng", "Thuốc súng"]
  };
 texts = {
  "cityName": "Thành phố", "currentlyBuilding": "Đang xây dựng", "summary": "Tổng",
  "hide_settings": "Ẩn thiết lập", "show_settings": "Hiển thị thiết lập",
  "Population": "Dân số",
  "finishedBuilding": "Công trình hoàn tất","Incomes":"Thu nhập","Trading":"Trao đổi",
  "Wood": "Gỗ", "Wine": "Rượu", "Marble": "Cẩm thạch", "Crystal": "Pha lê", "Sulfur": "Lưu huỳnh"
  };
 };

EmpireBoard.Init();

//lots of code to get the city id. The code trys to find the city id no matter which "city dropdown view" the user has chosen.
// Fix for v3.1
var city_id = EmpireBoard.Str.To_Integer(EmpireBoard.DOM.Get_Last_Node_Value("//select[@id='citySelect']/option[@selected='selected']"), 0);
var current_city_id = city_id;
EmpireBoard.Log.Add('current_city_id = '+current_city_id);

var city_name = EmpireBoard.DOM.Get_First_Node_TextContent("id('breadcrumbs')/*[@class='city']");
EmpireBoard.Log.Add('Main view city_name = "'+city_name+'"');
if (city_name != undefined)
 {
 var island_id = EmpireBoard.DOM.Get_First_Node_TextContent("id('breadcrumbs')//a[@class='island']");
 if ( island_id == undefined || island_id == 0 )
     island_id = /\[[0-9:]+\]/.exec(EmpireBoard.DOM.Get_First_Node("id('breadcrumbs')//a[contains(@href,'view=island')]").innerHTML)[0];
 
 var city_idmainView = 0;
 
 // Fix for v3.1
 if (city_idmainView == 0)
  {
  city_idmainView = EmpireBoard.DOM.Get_First_Node_Value("//select[@id='citySelect']/option[text()='"+EmpireBoard.Ikariam.TwoDigit_Coords(island_id)+" "+city_name+"']", 0);
  }
 if (city_idmainView == 0)
  {
  city_idmainView = EmpireBoard.DOM.Get_First_Node_Value("//select[@id='citySelect']/option[text()='"+city_name+"']", 0);
  }
 
 // Fix for v3.2
 if (city_idmainView == 0)
  {
  city_idmainView = EmpireBoard.DOM.Get_First_Node_Value("//select[@id='citySelect']/option[contains(text(),'"+EmpireBoard.Ikariam.TwoDigit_Coords(island_id)+"') and contains(text(),'"+city_name+"')]", 0);
  }
 if (city_idmainView == 0)
  {
  city_idmainView = EmpireBoard.DOM.Get_First_Node_Value("//select[@id='citySelect']/option[contains(text(),'"+city_name+"')]", 0);
  }
  
 EmpireBoard.Log.Add('city_idmainView['+EmpireBoard.Ikariam.TwoDigit_Coords(island_id)+' '+city_name+'] = '+city_idmainView);
 var city_positionmainView = -1;

 var a = EmpireBoard.DOM.Get_First_Node("//div[@id='breadcrumbs']/*[@class='island' and contains(text(), '[')]", "");
 if (a == null) {
   a = EmpireBoard.DOM.Get_First_Node("//a[contains(@href, '?view=island')]/span[contains(text(), '[')]", "");
   if (a != null) {
     a = a.parentNode;
   }
 }
 var city_coord = "";
 var island_id = "";
 if (a != null) {
   if (/(\[[0-9:]+\])/.exec(a.innerHTML)) {
     city_coord = RegExp.$1;
     if (/[?&]id=([0-9]+)/.exec(a.href) != null) {
       island_id = RegExp.$1;
     }
   }
 }
 if (island_id == "" && (/view=island&id=([0-9]+)/.exec(document.URL) != null)) { 
   island_id = RegExp.$1;
 }
 }
else
 {
 city_idmainView = 0;
 city_name = '';
 city_coord = '';
 island_id = '';
 }

function getCity(city_id)
 {
 city_id = "city_"+city_id;
 if (config[city_id] == undefined)
  {
  config[city_id] = new Resource();
  config[city_id].buildings  = {};
  config[city_id].units   = {};
  
  EmpireBoard.Log.Add('Create city id='+city_id);
  }
 return config[city_id];
 }

function digProducedResources(res) 
 {
 var scripts = document.getElementsByTagName("script");
 var found = false;
 for (var j = scripts.length-1; j >= 0; j--)
  {
  var nScript = scripts[j];
  var sCode = nScript.innerHTML;
  if (sCode.indexOf('getResourceCounter') > 0)
   {
   found = true;
   break;
   }
  }
 if (found == false)
  {
  return;
  }

 var aCodeLines = sCode.split(';');
 
 // by AubergineAnodyne (not used)
 function findResourceCounterData(name)
  {
  for (var i = 0; i < aCodeLines.length; i++)
   {
   if (aCodeLines[i].indexOf(name + 'Counter') >= 0)
    {
    return aCodeLines[i].substring(aCodeLines[i].indexOf('(') + 2, aCodeLines[i].indexOf(')') - 1);
    }
   }
  }
 
 var sWoodLine = 0;
 var sTradeGoodLine = 0;
 for (var j = 0; j <= aCodeLines.length-1; j++)
  {
  if (aCodeLines[j].indexOf('getResourceCounter') > 0)
   {
   if (aCodeLines[j].indexOf('woodCounter') > 0)
    {
    sWoodLine = j;
    if (sTradeGoodLine > 0) break;
    }
   if (aCodeLines[j].indexOf('tradegoodCounter') > 0)
    {
    sTradeGoodLine = j;
    if (sWoodLine > 0) break;
    }
   }
  }
  
 var startResourcesDelta = 0;
 if (sWoodLine > 0)
  {
  var sWood = aCodeLines[sWoodLine].substring(aCodeLines[sWoodLine].indexOf('(')+2,aCodeLines[sWoodLine].indexOf(')')-1);
  var prodRegExp = /production: *([0-9.\E\-]+)/.exec(sWood);
  if (prodRegExp != null)
   {
   startResourcesDelta = Math.floor(parseFloat(RegExp.$1) * 3600);
   } 
  }
 
 var startTradegoodDelta = 0;
 var sTradeGoodName = '';
 if (sTradeGoodLine > 0)
  {
  var sTradeGood = aCodeLines[sTradeGoodLine].substring(aCodeLines[sTradeGoodLine].indexOf('(')+2,aCodeLines[sTradeGoodLine].indexOf(')')-1);
  var prodRegExp = /production: *([0-9.\E\-]+)/.exec(sTradeGood);
  if (prodRegExp != null)
   {
   startTradegoodDelta = Math.floor(parseFloat(RegExp.$1) * 3600);
   }
  var sName = /valueElem: *\"(.*)\"/.exec(sTradeGood);
  sTradeGoodName = sName[1];
  }

 res.prodwood = startResourcesDelta;
 res.prodwine = 0;
 res.prodmarble = 0;
 res.prodglass = 0;
 res.prodsulfur = 0;
 res.prodtime = EmpireBoard.StartTime; 
 if (sTradeGoodName == "value_wine")
  {
  res.prodwine = startTradegoodDelta;
  res.prodgood = 'wine';
  }
 else if (sTradeGoodName == "value_marble")
  {
  res.prodmarble = startTradegoodDelta;
  res.prodgood = 'marble';
  }
 else if (sTradeGoodName == "value_crystal")
  {
  res.prodglass = startTradegoodDelta;
  res.prodgood = 'glass';
  }
 else if (sTradeGoodName == "value_sulfur")
  {
  res.prodsulfur = startTradegoodDelta;
  res.prodgood = 'sulfur';
  }
 }

function getCurrentResourceAmount(currenttime, startTime, startAmount, factPerHour) {
  var elapsedhours = (currenttime - startTime) / 1000.0 / 3600.0;
  return Math.max(0, Math.floor(startAmount + elapsedhours * factPerHour));
  /*
  TODO:
  spendings: [{amount: 197, tickInterval: 1200}], valueElem: "value_wine"
this.currentRes=this.startRes+this.production*Math.floor((this.currenttime-this.startdate)/1000);
this.currentRes=this.currentRes-this.spendings[i]['amount']*Math.floor((this.currenttime-this.startdate)/1000/this.spendings[i]['tickInterval'])*this.spendings[i]['tickInterval']/3600;}
197*floor(3600/1200)*1200/3600
  */
}

function createTooltipAttribute(tooltip, title, isFct) {
  if (tooltip == undefined || tooltip == "") {
    return "";
  }
  if (isFct == true)
 {
 html = tooltip;
 }
  else
 {
   if (title == undefined || title == "") {
      title = "";
   }
   else title = "<div class=TTTitle>"+title+"</div>";
   if (EmpireBoard.Intl.LangDir() == "rtl")
  {
  var html = "<div dir=rtl class='TTContent RtoL'>"+title+tooltip+"</div>";
  }
   else
  {
  var html = "<div class=TTContent>"+title+tooltip+"</div>";
  }
   html = "'"+html.replace(/'/g, "\\'")+"'";
 }
  return "onmouseover=\"Tip("+html+", ABOVE, true, BORDERWIDTH, 0, SHADOW, false, BGCOLOR, '');\"";
}

function createTooltip(content, tooltip, title) {
  if (tooltip == undefined || tooltip == "") {
    return content;
  }
  return "<font "+createTooltipAttribute(tooltip, title)+">"+content+"</font>";
}


function createTimeCounter(enddate) {
  if (enddate != undefined && enddate != "") {
    var s = smartDateFormat(enddate);
    return createTooltip("<font id='mytimecounter' counter='"+enddate+"'></font>", s);
  }
  return "";
}

function getArrValue(arr, key, defaultValue) {
  if (arr == undefined || arr[key] == undefined) {
    return defaultValue;
  }
  return arr[key];
}

function createLinkToChangeCity(text, city_id, city_index, sup_text, sup_class, sup_title) {
 var res = getCity(city_id);
 var rHTML = '';
 
 if (res.city_name != undefined)
  {
  cName = res.city_name;
  }
 else
  {
  cName = EmpireBoard.Ikariam.Trim_Coords(text);
  }
 if (current_city_id == city_id)
  {
  rHTML += '<b>'+cName+'</b>';
  }
 else
  {
  rHTML += createLink(cName, "?cityId="+city_id, "title=\"Change current city\" onclick=\"var s = document.getElementById('citySelect'); s.selectedIndex = "+city_index+"; s.form.submit(); return false;\"");
  }
 
 if ((sup_text != undefined) && (sup_text != '') && (sup_text != 0))
  {
  if (sup_class == undefined) sup_class = '';
  if (sup_title == undefined) sup_title = '';
  rHTML += '<sup class="'+sup_class+'" title="'+sup_title+'">'+sup_text+'</sup>';
  }
 
 return rHTML;
}

function setViewRqTime(view, city_id, newTime, force)
 {
 if (view == undefined) view = '';
 if (newTime == undefined) newTime = EmpireBoard.StartTime;
 if (force == undefined) force = false;
 
 if ((city_id == undefined) || (city_id <= 0))
  {
  if (view == 'premium')
   {
   if (config["premium"] == undefined) config["premium"] = {};
   
   if (config["premium"].rqtime == undefined)
    {
    config["premium"].rqtime = newTime;
    }
   else if (EmpireBoard.StartTime > config["premium"].rqtime)
    {
    config["premium"].rqtime = newTime;
    }
   else if (newTime < config["premium"].rqtime)
    {
    config["premium"].rqtime = newTime;
    }
   }
  else if (view == 'researchOverview')
   {
   if (config["research"] == undefined) config["research"] = {};
   
   if (config["research"].rqtime == undefined)
    {
    config["research"].rqtime = newTime;
    }
   else if (EmpireBoard.StartTime > config["research"].rqtime)
    {
    config["research"].rqtime = newTime;
    }
   else if (newTime < config["research"].rqtime)
    {
    config["research"].rqtime = newTime;
    }
   }
  else if (view == 'merchantNavy')
   {
   if (config.merchantNavyrqtime == undefined)
    {
    config.merchantNavyrqtime = newTime;
    }
   else if (EmpireBoard.StartTime > config.merchantNavyrqtime)
    {
    config.merchantNavyrqtime = newTime;
    }
   else if (newTime < config.merchantNavyrqtime)
    {
    config.merchantNavyrqtime = newTime;
    }
   else if (force == true)
    {
    config.merchantNavyrqtime = newTime;
    }
   }
  else if (view == 'finances')
   {
   if (config.financesrqtime == undefined)
    {
    config.financesrqtime = newTime;
    }
   else if (EmpireBoard.StartTime > config.financesrqtime)
    {
    config.financesrqtime = newTime;
    }
   else if (newTime < config.financesrqtime)
    {
    config.financesrqtime = newTime;
    }
   }
  else if (view == 'militaryAdvisorMilitaryMovements')
   {
   if (config.mAMMrqtime == undefined)
    {
    config.mAMMrqtime = newTime;
    }
   else if (EmpireBoard.StartTime > config.mAMMrqtime)
    {
    config.mAMMrqtime = newTime;
    }
   else if (newTime < config.mAMMrqtime)
    {
    config.mAMMrqtime = newTime;
    }
   }
  }
 else
  {
  var city = getCity(city_id);
  if (view == '')
   {
   if (city.rqtime == undefined)
    {
    city.rqtime = newTime;
    }
   else if (EmpireBoard.StartTime > city.rqtime)
    {
    city.rqtime = newTime;
    }
   else if (newTime < city.rqtime)
    {
    city.rqtime = newTime;
    }
   }
  else if (view == 'cityMilitary-army')
   {
   if (city.cityMilitaryarmyrqtime == undefined)
    {
    city.cityMilitaryarmyrqtime = newTime;
    }
   else if (EmpireBoard.StartTime > city.cityMilitaryarmyrqtime)
    {
    city.cityMilitaryarmyrqtime = newTime;
    }
   else if (newTime < city.cityMilitaryarmyrqtime)
    {
    city.cityMilitaryarmyrqtime = newTime;
    }
   }
  else if (view == 'cityMilitary-fleet')
   {
   if (city.cityMilitaryfleetrqtime == undefined)
    {
    city.cityMilitaryfleetrqtime = newTime;
    }
   else if (EmpireBoard.StartTime > city.cityMilitaryfleetrqtime)
    {
    city.cityMilitaryfleetrqtime = newTime;
    }
   else if (newTime < city.cityMilitaryfleetrqtime)
    {
    city.cityMilitaryfleetrqtime = newTime;
    }
   }
  else if (city.buildings[view] != undefined)
   {
   if (city.buildings[view].rqtime == undefined)
    {
    city.buildings[view].rqtime = newTime;
    }
   else if (EmpireBoard.StartTime > city.buildings[view].rqtime)
    {
    city.buildings[view].rqtime = newTime;
    }
   else if (newTime < city.buildings[view].rqtime)
    {
    city.buildings[view].rqtime = newTime;
    }
   else if (force == true)
    {
    city.buildings[view].rqtime = newTime;
    }
   }
  }
 }

function reportViewToSurvey(view, city_id)
 {
 if (view == undefined)   view = '';
 if (city_id == undefined)  city_id = 0;
 var report = false;
 
 if ((city_id == undefined) || (city_id <= 0))
  {
  if (view == 'premium')
   {
   if (config["premium"] == undefined) config["premium"] = {};
   
   if (config["premium"].uptime == undefined)
    {
    report = true;
    }
   else if (config["premium"].uptime == 0)
    {
    report = true;
    }
   else if ((config["premium"].rqtime != undefined) && (config["premium"].rqtime <= EmpireBoard.StartTime) && (config["premium"].rqtime > config["premium"].uptime))
    {
    report = true;
    }
   }
  else if (view == 'researchOverview')
   {
   if (config["research"] == undefined) config["research"] = {};
   
   if (config["research"].uptime == undefined)
    {
    report = true;
    }
   else if (config["research"].uptime == 0)
    {
    report = true;
    }
   else if ((config["research"].rqtime != undefined) && (config["research"].rqtime <= EmpireBoard.StartTime) && (config["research"].rqtime > config["research"].uptime))
    {
    report = true;
    }
   }
  else if (view == 'finances')
   {
   if (config.financestime == undefined)
    {
    report = true;
    }
   else if (config.financestime == 0)
    {
    report = true;
    }
   else if ((config.financesrqtime != undefined) && (config.financesrqtime <= EmpireBoard.StartTime) && (config.financesrqtime > config.financestime))
    {
    report = true;
    }
   }
  else if (view == 'merchantNavy')
   {
   if (config.merchantNavytime == undefined)
    {
    report = true;
    }
   else if (config.merchantNavytime == 0)
    {
    report = true;
    }
   else if ((config.merchantNavyrqtime != undefined) && (config.merchantNavyrqtime <= EmpireBoard.StartTime) && (config.merchantNavyrqtime > config.merchantNavytime))
    {
    report = true;
    }
   }
  else if (view == 'militaryAdvisorMilitaryMovements')
   {
   if (config.mAMMtime == undefined)
    {
    report = true;
    }
   else if (config.mAMMtime == 0)
    {
    report = true;
    }
   else if ((config.mAMMrqtime != undefined) && (config.mAMMrqtime <= EmpireBoard.StartTime) && (config.mAMMrqtime > config.mAMMtime))
    {
    report = true;
    }
   }
  }
 else
  {
  var city = getCity(city_id);
  if (view == '')
   {
   if (city.prodtime == undefined)
    {
    report = true;
    }
   else if (city.prodtime == 0)
    {
    report = true;
    }
   else if ((city.rqtime != undefined) && (city.rqtime <= EmpireBoard.StartTime) && (city.rqtime > city.prodtime))
    {
    report = true;
    }
   else if (city.prodtime <= (EmpireBoard.StartTime - 1000*60*60*24*7))
    {
    report = true;
    }
   }
  else if (view == 'city')
   {
   if (city.citytime == undefined)
    {
    report = true;
    }
   else if (city.citytime == 0)
    {
    report = true;
    }
   }
  else if ((view == 'cityMilitary-army') || (view == 'barracks'))
   {
   var recentTime = 0;
   if (city.cityMilitaryarmytime != undefined) recentTime = city.cityMilitaryarmytime;
   if ((city.buildings['barracks'] != undefined) && (city.buildings['barracks'].uptime > recentTime)) recentTime = city.buildings['barracks'].uptime;
   
   if (recentTime == undefined)
    {
    report = true;
    }
   else if (recentTime == 0)
    {
    report = true;
    }
   else if ((city.buildings['barracks'] != undefined) && (city.buildings['barracks'].rqtime != undefined) && (city.buildings['barracks'].rqtime <= EmpireBoard.StartTime) && (city.buildings['barracks'].rqtime > city.buildings['barracks'].uptime))
    {
    report = false;
    }
   else if ((city.cityMilitaryarmyrqtime != undefined) && (city.cityMilitaryarmyrqtime <= EmpireBoard.StartTime) && (city.cityMilitaryarmyrqtime > recentTime))
    {
    report = true;
    }
   else if (recentTime <= (EmpireBoard.StartTime - 1000*60*60*24*30))
    {
    report = true;
    }
   }
  else if ((view == 'cityMilitary-fleet') || (view == 'shipyard'))
   {
   var recentTime = 0;
   if (city.cityMilitaryfleettime != undefined) recentTime = city.cityMilitaryfleettime;
   if ((city.buildings['shipyard'] != undefined) && (city.buildings['shipyard'].uptime > recentTime)) recentTime = city.buildings['shipyard'].uptime;
   
   if (recentTime == undefined)
    {
    report = true;
    }
   else if (recentTime == 0)
    {
    report = true;
    }
   else if ((city.buildings['shipyard'] != undefined) && (city.buildings['shipyard'].rqtime != undefined) && (city.buildings['shipyard'].rqtime <= EmpireBoard.StartTime) && (city.buildings['shipyard'].rqtime > city.buildings['shipyard'].uptime))
    {
    report = false;
    }
   else if ((city.cityMilitaryfleetrqtime != undefined) && (city.cityMilitaryfleetrqtime <= EmpireBoard.StartTime) && (city.cityMilitaryfleetrqtime > recentTime))
    {
    report = true;
    }
   else if (recentTime <= (EmpireBoard.StartTime - 1000*60*60*24*30))
    {
    report = true;
    }
   }
   
  // Any buildings
  if (EmpireBoard.Ikariam.Get_BuildingUsage(view) != '')
   {
   if (city.buildings[view] != undefined)
    {
    if (view == 'townHall')
     {
     if (city.buildings[view].uptime == undefined)
      {
      report = true;
      }
     else if (city.buildings[view].uptime == 0)
      {
      report = true;
      }
     else if ((city.buildings[view].rqtime != undefined) && (city.buildings[view].rqtime <= EmpireBoard.StartTime) && (city.buildings[view].rqtime > city.buildings[view].uptime))
      {
      report = true;
      }
     else if (city.buildings[view].uptime <= (EmpireBoard.StartTime - 1000*60*60*24*30))
      {
      report = true;
      }
     }
    else if (view == 'tavern')
     {
     if (city.buildings[view].uptime == undefined)
      {
      report = true;
      }
     else if (city.buildings[view].uptime == 0)
      {
      report = true;
      }
     }
    else if (view == 'academy')
     {
     if (city.buildings[view].uptime == undefined)
      {
      report = true;
      }
     else if (city.buildings[view].uptime == 0)
      {
      report = true;
      }
     }
    else if (view == 'palace')
     {
     if (config.government == undefined)
      {
      report = true;
      }
     else if (city.buildings[view].uptime == undefined)
      {
      report = true;
      }
     else if (city.buildings[view].uptime == 0)
      {
      report = true;
      }
     else if ((city.buildings[view].rqtime != undefined) && (city.buildings[view].rqtime <= EmpireBoard.StartTime) && (city.buildings[view].rqtime > city.buildings[view].uptime))
      {
      report = true;
      }
     }
    else if (view == 'branchOffice')
     {
     if (city.buildings[view].uptime == undefined)
      {
      report = true;
      }
     else if (city.buildings[view].uptime == 0)
      {
      report = true;
      }
     else if ((city.buildings[view].rqtime != undefined) && (city.buildings[view].rqtime <= EmpireBoard.StartTime) && (city.buildings[view].rqtime > city.buildings[view].uptime))
      {
      report = true;
      }
     }
    else
     {
     if (city.buildings[view].uptime == undefined)
      {
      
      }
     else if (city.buildings[view].uptime == 0)
      {
      
      }
     else if ((city.buildings[view].rqtime != undefined) && (city.buildings[view].rqtime <= EmpireBoard.StartTime) && (city.buildings[view].rqtime > city.buildings[view].uptime))
      {
      report = true;
      }
     }
    }
   }
  }
 
 return (report == true ? '!' : '');
 }

function dropUndeliveredLoadingGoods()
 {
 var arrivinggoods = getArrValue(config, 'arrivinggoods', []);
 var city_id;
 var i = 0;
 for (city_id in arrivinggoods)
  {
  var rows = getArrValue(arrivinggoods, city_id, []);
  var city = getCity(city_id);
  var key;
  for (key in rows)
   {
      var row = rows[key];
   var quest = getArrValue(row, "quest", "");
   if (quest == 'loading')
    {
    if (delete config.arrivinggoods[city_id][key]) i++;
    continue;
    }
      var arrivetime = parseInt(getArrValue(row, "arrivetime", 0));
   if (EmpireBoard.StartTime < arrivetime)
    {
    if (delete config.arrivinggoods[city_id][key]) i++;
    continue;
    }
   }
  }
 }
 
function dropDeliveredGoods(city_id)
 {
 var rows = getArrValue(config.arrivinggoods, city_id, []);
 var city = getCity(city_id);
 var key;
 var i = 0;
 for (key in rows)
  {
     var row = rows[key];
     var arrivetime = parseInt(getArrValue(row, "arrivetime", 0));
  if (arrivetime <= city.prodtime)
   {
   if (delete config.arrivinggoods[city_id][key]) i++;
   }
  }
 }
 
function getDeliveredGoodsTransports(city_id, resName)
 {
 var sum = 0;
 var city = getCity(city_id);
 var rows = getArrValue(config.arrivinggoods, city_id, []);
 var key;
 for (key in rows)
  {
     var row = rows[key];
     var res = row["res"];
     var a = getArrValue(res, resName, 0);
     var arrivetime = parseInt(getArrValue(row, "arrivetime", ""));
  if ((a > 0) && (arrivetime > city.prodtime) && (EmpireBoard.StartTime >= arrivetime)) sum++;
  }
 return sum;
 }
 
function getBuildingPosition(city_id, name, defaultValue)
 {
 if (defaultValue == undefined) defaultValue = -1;
 var position = -1;
 var city = getCity(city_id);
 
 if ((city.buildings == undefined) || (city.buildings[name] == undefined))
  {
  if (name == 'townHall') position = 0;
  }
 else if ((city.buildings[name].link != undefined) && (city.buildings[name].link != ''))
  {
  // will deprecated
  var link = city.buildings[name].link;
  position = parseInt(/position=([0-9]+)/.exec(link)[1]);
  }
 else if (city.buildings[name].position != undefined)
  {
  position = city.buildings[name].position;
  }
 else if (name == 'townHall') position = 0;
 
 if (position == -1) position = defaultValue;
 return position;
 }
 
function getCityBuildingsCount(city_id, defaultValue)
 {
 if (defaultValue == undefined) defaultValue = 0;
 var count = 0;
 var city = getCity(city_id);

 if (city.citytime != undefined)
  {
  for (name in city.buildings)
   {
   if (city.buildings[name].levels != undefined)
    {
    var p;
    for (p in city.buildings[name].levels)
     {
     count++;
     }
    }
   else if (city.buildings[name].level != undefined)
    {
    count++;
    }
   }
  }

 if (count == 0) count = defaultValue;
 return count;
 }
 
// Get level instead building upgrading is finished
function getBuildingLevel(city_id, name, defaultValue, position)
 {
 if (defaultValue == undefined) defaultValue = 0;
 if (position == undefined) position = -1;
 var level = 0;
 var city = getCity(city_id);
 
 if ((city.buildings == undefined) || (city.buildings[name] == undefined))
  {
  if (name == 'townHall') level = 1;
  if (city.underConstructionName == name)
   {
   if (city.underConstructionTime <= EmpireBoard.StartTime) level++;
   }
  }
 else if (position == -1)
  {
  if (city.buildings[name].levels != undefined)
   {
   var p;
   for (p in city.buildings[name].levels)
    {
    level += city.buildings[name].levels[p];
    }
   }
  else
   {
   // deprecated
   level = getArrValue(city.buildings[name], "level", 0);
   }
  if (city.underConstructionName == name)
   {
   if (city.underConstructionTime <= EmpireBoard.StartTime) level++;
   }
  }
 else if (city.buildings[name].levels != undefined)
  {
  if (city.buildings[name].levels[position] != undefined)
   level = city.buildings[name].levels[position];
  if ((city.underConstructionName == name) && (city.underConstructionPosition == position))
   {
   if (city.underConstructionTime <= EmpireBoard.StartTime) level++;
   }
  }
  
 if (level == 0) level = defaultValue;
 return level;
 }

function getOnePeopleGrowthTime(happiness) {
  if (happiness != 0) {
    return Math.abs(3600/0.02/happiness*1000);
  }
  return "NaN";
}

function getEstimatedPopulationOld(population, startTime, currenttime, startHappiness) {
  var thappiness = startHappiness;
  startTime = Number(startTime);
  while (thappiness > 0) {
    var t = getOnePeopleGrowthTime(thappiness);
    if (t == "NaN" || startTime + t > currenttime) {
      break;
    }
    population++;
    thappiness--;
    startTime += t;
  }
  return population;
}

function getEstimatedPopulation(population, startTime, currenttime, startHappiness) {
  var thappiness = startHappiness;
  startTime = Number(startTime);
  if (thappiness != 0)
 {
 var t = getOnePeopleGrowthTime(thappiness);
 while (startTime + t < currenttime)
  {
  if (thappiness == 0)
   {
   break;
   }
  else if (thappiness > 0)
   {
      population++;
      thappiness--;
   startTime += t;
   }
  else
   {
      population--;
      thappiness++;
   startTime += t;
   }
  
  t = getOnePeopleGrowthTime(thappiness);
  }
 }
  
  return population;
}

function getGrowthRemainingHours(population, maxPopulation, startTime, happiness) {
  if (maxPopulation - population > happiness) {
    return "&#8734;"+EmpireBoard.Ikariam.LocalizationStrings('hour','timeunits','short');
  }
  var time = Number(startTime);
  while (population < maxPopulation) {
    var t = getOnePeopleGrowthTime(happiness);
    if (t == "NaN") {
      return "&#8734;"+EmpireBoard.Ikariam.LocalizationStrings('hour','timeunits','short');
    }
    time += t;
    population++;
    happiness--;
  }
  return EmpireBoard.Str.FormatRemainingTime(time - Number(startTime));
}

// Current selected city
if (current_city_id > 0)
 {
 var res = getCity(current_city_id);
 
 /* Update current city */
 
 // Stored resources
 res.wood = EmpireBoard.Ikariam.currentCity('wood','resources');
 if (res.wood == undefined)
  res.wood   = EmpireBoard.Str.To_Integer(EmpireBoard.DOM.Get_First_Node_TextContent("id('value_wood')"));
 
 res.wine = EmpireBoard.Ikariam.currentCity('wine','resources');
 if (res.wine == undefined)
  res.wine   = EmpireBoard.Str.To_Integer(EmpireBoard.DOM.Get_First_Node_TextContent("id('value_wine')"));
 
 res.marble = EmpireBoard.Ikariam.currentCity('marble','resources');
 if (res.marble == undefined)
  res.marble = EmpireBoard.Str.To_Integer(EmpireBoard.DOM.Get_First_Node_TextContent("id('value_marble')"));
 
 res.glass = EmpireBoard.Ikariam.currentCity('crystal','resources');
 if (res.glass == undefined)
  res.glass  = EmpireBoard.Str.To_Integer(EmpireBoard.DOM.Get_First_Node_TextContent("id('value_crystal')"));
 
 res.sulfur = EmpireBoard.Ikariam.currentCity('sulfur','resources');
 if (res.sulfur == undefined)
  res.sulfur = EmpireBoard.Str.To_Integer(EmpireBoard.DOM.Get_First_Node_TextContent("id('value_sulfur')"));
 
 
 if (EmpireBoard.Ikariam.Is_Version('0.4.1'))
  {
  // Couldn't recognize fields
  }
 else
  {
  // Resources to sold
  var wareNode = EmpireBoard.DOM.Get_First_Node_TextContent("//div[@id='cityResources']//li[@class='wood']/div[@class='tooltip']");
  if (/: [0-9,.]+[^0-9]+: ([0-9,.]+)/.exec(wareNode) != null)
   {
   res.tradewood = parseInt((RegExp.$1).replace(/[^0-9]/g, ""));
   }
  else
   {
   res.tradewood = 0;
   }
  var wareNode = EmpireBoard.DOM.Get_First_Node_TextContent("//div[@id='cityResources']//li[@class='wine']/div[@class='tooltip']");
  if (/: [0-9,.]+[^0-9]+: ([0-9,.]+)/.exec(wareNode) != null)
   {
   res.tradewine = parseInt((RegExp.$1).replace(/[^0-9]/g, ""));
   }
  else
   {
   res.tradewine = 0;
   }
  var wareNode = EmpireBoard.DOM.Get_First_Node_TextContent("//div[@id='cityResources']//li[@class='marble']/div[@class='tooltip']");
  if (/: [0-9,.]+[^0-9]+: ([0-9,.]+)/.exec(wareNode) != null)
   {
   res.trademarble = parseInt((RegExp.$1).replace(/[^0-9]/g, ""));
   }
  else
   {
   res.trademarble = 0;
   }
  var wareNode = EmpireBoard.DOM.Get_First_Node_TextContent("//div[@id='cityResources']//li[@class='glass']/div[@class='tooltip']");
  if (/: [0-9,.]+[^0-9]+: ([0-9,.]+)/.exec(wareNode) != null)
   {
   res.tradeglass = parseInt((RegExp.$1).replace(/[^0-9]/g, ""));
   }
  else
   {
   res.tradeglass = 0;
   }
  var wareNode = EmpireBoard.DOM.Get_First_Node_TextContent("//div[@id='cityResources']//li[@class='sulfur']/div[@class='tooltip']");
  if (/: [0-9,.]+[^0-9]+: ([0-9,.]+)/.exec(wareNode) != null)
   {
   res.tradesulfur = parseInt((RegExp.$1).replace(/[^0-9]/g, ""));
   }
  else
   {
   res.tradesulfur = 0;
   }
  }
  
 digProducedResources(res);
 
 if (res.buildings["townHall"] == undefined) res.buildings["townHall"] = {};
 var inhabitantsNode = EmpireBoard.DOM.Get_First_Node_TextContent("//span[@id='value_inhabitants']");
 if (/([0-9,.]+) \(([0-9,.]+)\)/.exec(inhabitantsNode) != null)
  {
  cizReg = RegExp.$1;
  popReg = RegExp.$2;
  res.buildings["townHall"].population = EmpireBoard.Str.To_Integer(popReg);
  res.buildings["townHall"].citizens = EmpireBoard.Str.To_Integer(cizReg);
  } else { 
  res.buildings["townHall"].population = 0;
  res.buildings["townHall"].citizens = 0;
  }
 
 res.actions = EmpireBoard.DOM.Get_First_Node_TextContent("//span[@id='value_maxActionPoints']");
 
 dropDeliveredGoods(current_city_id);
 
 if (EmpireBoard.Ikariam.View() == "plunder")
  {
  function reportPlunder()
   {
   setViewRqTime('finances');
   setViewRqTime('militaryAdvisorMilitaryMovements');
   EmpireBoard.DB.Save();
   }
  
  var n = document.getElementById("plunderbutton");
  n.addEventListener("click", reportPlunder, false);
  }
 else if (EmpireBoard.Ikariam.View() == "transport")
  {
  function reportTransport()
   {
   setViewRqTime('merchantNavy');
   EmpireBoard.DB.Save();
   }
  
  var n = document.getElementById("submit");
  n.addEventListener("click", reportTransport, false);
  }
 else if (EmpireBoard.Ikariam.View() == 'deployment')
  {
  EmpireBoard.ViewIsActionDeployment();
  }
 else if (EmpireBoard.Ikariam.View() == 'resource')
  {
  EmpireBoard.ViewIsIslandResource();
  }
 else if (EmpireBoard.Ikariam.View() == 'tradegood')
  {
  EmpireBoard.ViewIsIslandTradeGood();
  }
 }

// If main view is a city
if (city_idmainView > 0) 
 {
 var res = getCity(city_idmainView);
 
 // Update city info
 if (city_name != "") 
  {
  res.city_name = city_name;
  }
 if (city_coord != "") 
  {
  res.city_coord = city_coord;
  }
 if (island_id != "") 
  {
  res.island_id = island_id;
  }
  
 // Vue ville
 if (EmpireBoard.Ikariam.View() == 'city')
  {
  var orderedBuildings = EmpireBoard.Ikariam.BuildingsList();
  
  // Add new buildings
  var nodes = EmpireBoard.DOM.Get_Nodes("//li[contains(@id, 'position')]/a[contains(@href, 'view=')]");
  for(var i = 0; i < nodes.snapshotLength; i++)
   {
   var node = nodes.snapshotItem(i);
   var li = node.parentNode;
   
   var name = li.getAttribute("class");
   if (orderedBuildings[name] != undefined)
    {
    if (res.buildings[name] == undefined)
     {
     res.buildings[name] = {};
     }
    }
   else
    {
    if (res.buildings[name] != undefined)
     {
     // fix if not building...
     if (delete config["city_"+city_idmainView].buildings[name])
      EmpireBoard.Log.Add('Remove unknown building: '+name);
     }
    }
   }
  
  // Reset levels
  var res = getCity(city_idmainView);
  for (name in res.buildings)
   {
   res.buildings[name].position = -1; // Soon deprecated
   res.buildings[name].level = 0; // Soon deprecated
   res.buildings[name].levels = {};
   res.buildings[name].link = ''; // Soon deprecated
   }
    
  // Fetch levels & positions
  //var nodes = EmpireBoard.DOM.Get_Nodes("//li[contains(@id, 'position')]/a[contains(@href, 'view=')]");
  for (var i = 0; i < nodes.snapshotLength; i++)
   {
   var node = nodes.snapshotItem(i);
   var li = node.parentNode;
   
   // name
   var name = li.getAttribute("class");
   if (orderedBuildings[name] != undefined)
    {
    var position = parseInt(/position=([0-9]+)/.exec(node.href)[1]);
    // deprecated
    res.buildings[name].position = position;
    
    // level
    var level = "-";
    if (/([0-9]+)/.exec(node.title) != null)
     {
     level = RegExp.$1;
     }
    
    res.buildings[name].level = res.buildings[name].level + parseInt(level); // deprecated
    res.buildings[name].levels[position] = parseInt(level);
      
    res.buildings[name].link = node.href;// link, will deprecated
    }
   }
    
  // Nouvelle construction
    var node = EmpireBoard.DOM.Get_Nodes("//div[@class='constructionSite']/following-sibling::a[contains(@href, 'view=')]");
    if (node.snapshotLength >= 1) {
   //res.underConstruction = node.snapshotItem(0).title;
   res.underConstructionName = node.snapshotItem(0).parentNode.getAttribute("class");
   res.underConstructionPosition = /position=([0-9]+)/.exec(node.snapshotItem(0).href)[1];
   
   // Search cityCountdown
   var scripts = document.getElementsByTagName("script");
   var found = false;
   var sCode = '';
   for (var j = 0; j < scripts.length; j++)
    {
    var nScript = scripts[j];
    sCode = nScript.innerHTML;
    if (sCode.indexOf('cityCountdown') >= 0)
     {
     found = true;
     break;
     }
    }
   if (found == true)
    {
      var enddate = 0;
      var currentdate = 0;
      if (/enddate[^0-9]*([0-9]+)/.exec(sCode) != null) 
      {
     enddate = parseFloat(RegExp.$1) * 1000; 
      }
      if (/currentdate[^0-9]*([0-9]+)/.exec(sCode) != null) 
      {
     currentdate = parseFloat(RegExp.$1) * 1000; 
      }
      if (enddate != 0 && currentdate != 0) 
      {
     res.underConstructionTime = enddate - currentdate + new Date().getTime();
      }
    }
    }
    else 
    {
     //res.underConstruction = "-";
     res.underConstructionName = "";
     res.underConstructionPosition = -1;
     res.underConstructionTime = 0;
    }
  
  // Remove deleted buildings
  for (name in res.buildings)
   {
   var buildingsNb = 0;
   for (position in res.buildings[name].levels)
    {
    buildingsNb++;
    }
   
   if (buildingsNb == 0)
    {
    if (delete config["city_"+city_idmainView].buildings[name])
     EmpireBoard.Log.Add('Building removed: '+name);
    }
   }
  var res = getCity(city_idmainView);
   
  res.citytime = EmpireBoard.StartTime;
  
  EmpireBoard.ViewIsCity();
  }
  
 if ((EmpireBoard.Ikariam.View() == "cityMilitary-army") || (EmpireBoard.Ikariam.View() == "cityMilitary-fleet"))
  {
   //military-army and fleet unit counts
  
  if (res.units == undefined) { res.units = {}; }
  
  var names = EmpireBoard.DOM.Get_Nodes("//table/tbody/tr/th");
  var counts = EmpireBoard.DOM.Get_Nodes("//table/tbody/tr[@class='count']/td");
  if (names.snapshotLength >= counts.snapshotLength)
   {
   for(var i = 0; i < counts.snapshotLength; i++)
    {
    var n = EmpireBoard.Str.Trim(names.snapshotItem(i).title);
    
    var unit_id = '';
    if (EmpireBoard.Ikariam.View() == "cityMilitary-fleet")
     {
     var url_unit = /([a-z]+_[a-z]+)_faceright/.exec(names.snapshotItem(i).firstChild.src);
     if (url_unit != null)
      {
      unit_id = 'unit ' + RegExp.$1;
      }
     }
    else
     {
     var url_unit = /y60_([a-z]+)_/.exec(names.snapshotItem(i).firstChild.src);
     if (url_unit != null)
      {
      unit_id = 'unit ' + RegExp.$1;
      }
     }

    config["unitnames"][unit_id] = n;
    
    var c = counts.snapshotItem(i);
    var cnt = EmpireBoard.Str.To_Integer(c.innerHTML, 0);
    if (res.units[unit_id] == undefined)
     {
     res.units[unit_id] = {};
     }
    res.units[unit_id].count = cnt;
    if (cnt > 0) EmpireBoard.Log.Add('Unit['+unit_id+'] named "'+n+'": '+cnt);
    }
   }
  
  if (EmpireBoard.Ikariam.View() == "cityMilitary-army")
   {
   res.cityMilitaryarmytime = EmpireBoard.StartTime;
   }
  else if (EmpireBoard.Ikariam.View() == "cityMilitary-fleet")
   {
   res.cityMilitaryfleettime = EmpireBoard.StartTime;
   }
  }
 
 // view is a building ; common parsing
 if ((EmpireBoard.Ikariam.Get_BuildingUsage(EmpireBoard.Ikariam.View()) != '') && (EmpireBoard.Ikariam.Tab() == ''))
  {
  if (res.buildings[EmpireBoard.Ikariam.View()] == undefined) {
   res.buildings[EmpireBoard.Ikariam.View()] = {};
   }
  
  // Fetch position
  var position = -1;
  var node = EmpireBoard.DOM.Get_Nodes("//*[@id='buildingUpgrade']//ul[@class='actions']//a[contains(@href, 'position=')]");
  if (node.snapshotLength == 0)
   {
   node = EmpireBoard.DOM.Get_Nodes("//*[@id='buildingUpgrade']//a[@class='cancelUpgrade']");
   }
  if (node.snapshotLength >= 1)
   {
   var url_position = /position=([0-9]+)/.exec(node.snapshotItem(0).href);
   if (url_position != null) position = parseInt(RegExp.$1);
   }
  else if ((res.buildings[EmpireBoard.Ikariam.View()].position != undefined) && (res.buildings[EmpireBoard.Ikariam.View()].position != -1))
   {
   position = res.buildings[EmpireBoard.Ikariam.View()].position;
   }
  else
   {
   var url_position = /[\?&]position=([0-9]+)/.exec(document.URL);
   if (url_position != null) position = parseInt(RegExp.$1);
   }
  city_positionmainView = position;
  // deprecated
  res.buildings[EmpireBoard.Ikariam.View()].position = position;
  
  // Fetch level & detect upgrading
  var n = EmpireBoard.DOM.Get_First_Node("//*[@id='buildingUpgrade']//*[@class='buildingLevel']");
  if (n != null)
   {
   if (position != -1)
    {
    // Fetch level
    if (res.buildings[EmpireBoard.Ikariam.View()].levels == undefined) res.buildings[EmpireBoard.Ikariam.View()].levels = {};
    res.buildings[EmpireBoard.Ikariam.View()].levels[position] = EmpireBoard.Str.To_Integer(n.innerHTML,0);
    }
   
   EmpireBoard.Log.Add('View '+EmpireBoard.Ikariam.View()+' building level '+EmpireBoard.Str.To_Integer(n.innerHTML,0)+' at position '+position);
   
   // Ignorer ancien upgrade du batiment
   if (res.underConstructionPosition == undefined) res.underConstructionPosition = -1; // Deprecated
   if ((res.underConstructionName == EmpireBoard.Ikariam.View()) && (res.underConstructionPosition == position))
    {
    //res.underConstruction = '';
    res.underConstructionName = '';
    res.underConstructionTime = 0;
    res.underConstructionPosition = -1;
    }
   
   var scripts = document.getElementsByTagName("script");
   var found = false;
   var sCode = '';
   for (var j = 0; j < scripts.length; j++)
    {
    // search upgradeCountDown
    var nScript = scripts[j];
    sCode = nScript.innerHTML;
    if (sCode.indexOf('upgradeCountDown') >= 0)
     {
     found = true;
     break;
     }
    }
   if (found == true)
    {
    // buildings under upgrading
    var enddate = 0;
    var currentdate = 0;
    if (/enddate[^0-9]*([0-9]+)/.exec(sCode) != null)
     {
     enddate = parseFloat(RegExp.$1) * 1000; 
     }
    if (/currentdate[^0-9]*([0-9]+)/.exec(sCode) != null)
     {
     currentdate = parseFloat(RegExp.$1) * 1000; 
     }
    if (enddate != 0 && currentdate != 0)
     {
     // First, apply previous upgrading of other building
     if (res.underConstructionName != '')
      {
      if ((res.buildings[res.underConstructionName].uptime != undefined) && (res.buildings[res.underConstructionName].uptime > res.underConstructionTime))
       {
       // Ignore
       }
      else if ((res.citytime != undefined) && (res.citytime > res.underConstructionTime))
       {
       // Ignore
       }
      else if ((res.buildings[res.underConstructionName].uptime != undefined) && (res.citytime != undefined))
       {
       if ((res.underConstructionPosition != undefined) && (res.underConstructionPosition != -1))
        {
        if (res.buildings[res.underConstructionName].levels == undefined) res.buildings[res.underConstructionName].levels = {};
        res.buildings[res.underConstructionName].levels[res.underConstructionPosition] = parseInt(res.buildings[res.underConstructionName].levels[res.underConstructionPosition])+1;
        }
       else
        {
        // deprecated
        res.buildings[res.underConstructionName].level = parseInt(res.buildings[res.underConstructionName].level)+1;
        }
       }
      }
     
     // Define new upgrading
     //res.underConstruction = buildings[EmpireBoard.Ikariam.View()][0] + " level " + EmpireBoard.Str.To_Integer(n.innerHTML,0);
     res.underConstructionName = EmpireBoard.Ikariam.View();
     res.underConstructionPosition = position;
     res.underConstructionTime = enddate - currentdate + new Date().getTime();
     }
    }
   else
    {
    // Not upgrading
    }
   }
  res.buildings[EmpireBoard.Ikariam.View()].uptime = EmpireBoard.StartTime;
  }
  
 if (EmpireBoard.Ikariam.View() == 'townHall')
  {
  EmpireBoard.ViewIsBuildingTownHall();
  }
 else if (EmpireBoard.Ikariam.View() == 'branchOffice')
  {
  EmpireBoard.ViewIsBuildingBranchOffice();
  }
  else if (EmpireBoard.Ikariam.View() == "tavern")
  {
  EmpireBoard.ViewIsBuildingTavern();
  }
 else if (EmpireBoard.Ikariam.View() == 'academy')
  {
  EmpireBoard.ViewIsBuildingAcademy();
  }
 else if (EmpireBoard.Ikariam.View() == 'temple')
  {
  EmpireBoard.ViewIsBuildingTemple();
  }
 else if (EmpireBoard.Ikariam.View() == 'museum')
  {
  EmpireBoard.ViewIsBuildingMuseum();
  }
 else if (EmpireBoard.Ikariam.View() == 'workshop')
  {
  EmpireBoard.ViewIsBuildingWorkshop();
  }
 else if (EmpireBoard.Ikariam.View() == 'palace')
  {
  EmpireBoard.ViewIsBuildingPalace();
  }
 else if ((EmpireBoard.Ikariam.View() == "barracks") || (EmpireBoard.Ikariam.View() == "shipyard"))
  {
  //military-army unit counts
  var idx = 0;
  if (EmpireBoard.Ikariam.View() == "shipyard") { idx = 13; }
  if (res.units == undefined) { res.units = {}; }
  
  var hasNotices = false;
  if (document.getElementById('notices')) hasNotices = true;
  
  // Fetch units counters
  var names = EmpireBoard.DOM.Get_Nodes("//ul[@id='units']/li[contains(@class, 'unit')]/div[@class='unitinfo']/h4");
  var counts = EmpireBoard.DOM.Get_Nodes("//ul[@id='units']/li[contains(@class, 'unit')]/div[@class='unitinfo']/div[@class='unitcount']");
  var upkeeps = EmpireBoard.DOM.Get_Nodes("//ul[@id='units']/li[contains(@class, 'unit')]/div[@class='costs']/ul/li[@class='upkeep']");
  if (names.snapshotLength == counts.snapshotLength)
   {
   for (var i = 0; i < names.snapshotLength; i++)
    {
    var node = names.snapshotItem(i);
    var unit_id = '';
    try
     { unit_id = node.parentNode.parentNode.getAttribute("class"); }
    catch(e) { }
    
    var uKey = EmpireBoard.Ikariam.Trim_Unit(unit_id);
    
    var n = node.innerHTML;
    config["unitnames"][unit_id] = n;
    
    var c = counts.snapshotItem(i);
    var cnt = EmpireBoard.Str.To_Integer(c.innerHTML.replace(/<.+>/g, ""), 0);
    if (res.units[unit_id] == undefined)
     {
     res.units[unit_id] = {};
     }
    res.units[unit_id].count = cnt;
    EmpireBoard.Log.Add('Count['+unit_id+'] = '+cnt);
    
    // Init units under construction
    res.units[unit_id].construction = 0;
    
    if (hasNotices != true)
     {
     var upkeepElt = upkeeps.snapshotItem(i);
     var upkeep = EmpireBoard.Str.To_Integer(upkeepElt.innerHTML.replace(/<.+>/g, ""), 0);
     config["upkeeps"][uKey] = upkeep;
     EmpireBoard.Log.Add('Upkeep['+uKey+'] = '+upkeep);
     }
    }
   }
   
  // Search units under construction
  if (EmpireBoard.Ikariam.Is_Version('0.3.3'))
   {
   // Construction list
   var ucList = EmpireBoard.DOM.Get_Nodes("//div[@id='unitConstructionList']//div[@class='army_wrapper']/div[contains(@class,'army')]/div[@class='unitcounttextlabel']");
   EmpireBoard.Log.Add('Units construction lists = '+ucList.snapshotLength);
   if (ucList.snapshotLength >= 1)
    {
    var unitsIdClass = EmpireBoard.Ikariam.UnitsClassNames();
    for (var i = 0; i < ucList.snapshotLength; i++)
     {
     var uDIVcount = ucList.snapshotItem(i);
     var uDIV = uDIVcount.parentNode;
     var unit_num = EmpireBoard.Str.To_Integer(uDIV.className);
     if (unitsIdClass[unit_num] != undefined)
      {
      var unit_id = 'unit '+unitsIdClass[unit_num];
      var AmountInt = EmpireBoard.Str.To_Integer(uDIVcount.textContent, 1);
      
      EmpireBoard.Log.Add('Construction['+unit_id+'] = '+AmountInt);
      res.units[unit_id].construction = res.units[unit_id].construction + AmountInt;
      }
     }
     
    if (unsafeWindow && unsafeWindow.tmppbar)
     {
     //var startdate = unsafeWindow.tmppbar['startdate'];
     var currentdate = unsafeWindow.tmppbar['currenttime'];
     var enddate = unsafeWindow.tmppbar['enddate'];
     setViewRqTime(EmpireBoard.Ikariam.View(), city_idmainView, EmpireBoard.StartTime + (enddate - currentdate), true);
     }
    }
   }
  else
   {
   var currentUnit = EmpireBoard.DOM.Get_First_Node("//div[@id='unitConstructionList']//div[contains(@class, 'currentUnit')]");
   if (currentUnit != null)
    {
    var currentUnit_id = 'unit '+EmpireBoard.Ikariam.Trim_Unit(currentUnit.className);
    res.units[currentUnit_id].construction = 1;
     
    // Fetch queue
    var simUnits = 0;
    var Amounts = EmpireBoard.DOM.Get_Nodes("//div[@id='unitConstructionList']//li/div[@class='amount']");
    if (Amounts.snapshotLength >= 1)
     {
     for (var i = 0; i < Amounts.snapshotLength; i++)
      {
      var Amount = Amounts.snapshotItem(i);
      var AmountInt = EmpireBoard.Str.To_Integer(Amount.textContent, 1);
      var unit_id = 'unit '+EmpireBoard.Ikariam.Trim_Unit(Amount.parentNode.className);

      res.units[unit_id].construction = res.units[unit_id].construction + AmountInt;
      if (unit_id == currentUnit_id)
       {
       simUnits = simUnits + AmountInt;
       }
      }
     } 
    
    var scripts = document.getElementsByTagName("script");
    var found = false;
    for (var j = scripts.length-1; j >= 0; j--)
     {
     var nScript = scripts[j];
     var sCode = nScript.innerHTML;
     if (sCode.indexOf('buildProgress') > 0)
      {
      found = true;
      break;
      }
     }
    if (found == true)
     {
     var enddate = 0;
     if (/enddate[^0-9]*([0-9]+)/.exec(sCode) != null) {
      enddate = parseFloat(RegExp.$1) * 1000; 
      }
     var currentdate = 0;
     if (/currentdate[^0-9]*([0-9]+)/.exec(sCode) != null) {
      currentdate = parseFloat(RegExp.$1) * 1000; 
      }
     var startdate = 0;
     if (/startdate[^0-9]*([0-9]+)/.exec(sCode) != null) {
      startdate = parseFloat(RegExp.$1) * 1000; 
      }

     setViewRqTime(EmpireBoard.Ikariam.View(), city_idmainView, EmpireBoard.StartTime + (enddate - currentdate) + simUnits * (enddate - startdate), true);
     }
    }
   }
  }
 }
else
 {
 // Global views
 if (EmpireBoard.Ikariam.View() == "militaryAdvisorMilitaryMovements")
  {
  EmpireBoard.ViewIsMilitaryMovements();
  }
 else if (EmpireBoard.Ikariam.View() == 'premium')
  {
  EmpireBoard.ViewIsPremium();
  }
 else if (EmpireBoard.Ikariam.View() == 'researchAdvisor')
  {
  EmpireBoard.ViewIsResearchAdvisor();
  }
 else if (EmpireBoard.Ikariam.View() == 'researchOverview')
  {
  EmpireBoard.ViewIsResearchOverview();
  }
 else if (EmpireBoard.Ikariam.View() == "finances")
  {
  EmpireBoard.ViewIsFinances();
  }
 else if (EmpireBoard.Ikariam.View() == "diplomacyAdvisorTreaty")
  {
  EmpireBoard.ViewIsDiplomacyAdvisorTreaty();
  }
 else if (EmpireBoard.Ikariam.View() == "merchantNavy")
  {
  if (config["arrivinggoods"] == undefined) config["arrivinggoods"] = {};
  dropUndeliveredLoadingGoods();
  
  function grab_City_ID(rootElt)
   {
   var resID = 0;
   var alinks = rootElt.getElementsByTagName("a");
   for (var k=0; k < alinks.length; k++)
    {
    var resReg = /[\?&]{1}cityId=([0-9]+)&?/i.exec(alinks[k].href);
    if (resReg != null)
     {
     resID = parseInt(resReg[1]);
     break;
     }
    }
   
   return resID;
   }
  
  EmpireBoard.Log.Add("Fetch arriving goods");
  var foundLoading = false;
  var takeSomething = false;
  var resMi = EmpireBoard.DOM.Get_Nodes("//div[@id='mainview']//td[contains(@class, 'mission')]");
  if (resMi.snapshotLength > 0)
   {
   EmpireBoard.Log.Add("Found "+resMi.snapshotLength+" missions");
   // Villes du joueur
   var citiesIDs = {};
   var citiesNames = {};
   var res = EmpireBoard.DOM.Get_Nodes("//select[@id='citySelect']/option");
   for(var i = 0; i < res.snapshotLength; i++)
     {
     var n = res.snapshotItem(i);
     var cName = EmpireBoard.Ikariam.Trim_Coords(n.textContent);
     var cID = parseInt(n.value);
     citiesIDs[cName] = cID;
     citiesNames[cID] = cName;
     }
   
   // heures
   var mTimers = {};
   var scripts = document.getElementsByTagName("script");
   for (var j = 0; j < scripts.length; j++)
    {
    // search getCountdown
    var nScript = scripts[j];
    var sCode = nScript.innerHTML;
    if (sCode.indexOf('getCountdown') > 0)
     {
     var aCodeLines = sCode.split(';');
     for (var i=0; i < aCodeLines.length-1; i++)
      {
      var sValues = aCodeLines[i].substring(aCodeLines[i].indexOf('{')+1,aCodeLines[i].indexOf('}'));
      var sParts = sValues.split(',');
      if (sParts.length >= 3)
       {
       var sPart0 = sParts[0].split(':');
       var enddate = 1000*parseInt(EmpireBoard.Str.Trim(sPart0[1]));
       
       var sPart1 = sParts[1].split(':');
       var currentdate = 1000*parseInt(EmpireBoard.Str.Trim(sPart1[1]));
       
       var sID = sParts[2].substring(sParts[2].indexOf('"')+1,sParts[2].indexOf('"',sParts[2].indexOf('"')+2));
       
       mTimers[sID] = EmpireBoard.StartTime + Math.abs(enddate - currentdate);
       //EmpireBoard.Log.Add("mTimers["+sID+"] = "+(enddate - currentdate));
       }
      else
       {
       //EmpireBoard.Log.Add("Failed to fetch getCountdown");
       }
      }
     }
    }
    
   // infos
   for (var i = 0; i < resMi.snapshotLength; i++)
    {
    var nMi = resMi.snapshotItem(i);
    var tr = nMi.parentNode;
    var tds = tr.getElementsByTagName("td");
    var tdslength = tds.length;
    //var tds = tr.childNodes;

    var nSource = tds[1];
    var nTarget = tds[3];
    if (tdslength == 6)
     {
     // pillaging under 0.4.3
     var nETA = tds[4];
     var nRET = tds[4];
     var nAc = tds[5];
     }
    else if (EmpireBoard.DOM.Has_ClassName(tds[4],'speed'))
     {
     // transport under 0.4.3
     var nETA = tds[5];
     var nRET = tds[5];
     var nAc = tds[6];
     }
    else if (EmpireBoard.DOM.Has_ClassName(tds[5],'speed'))
     {
     // transport under 0.4.2
     var nETA = tds[4];
     var nRET = tds[6];
     var nAc = tds[7];
     }
    else
     {
     var nETA = tds[4];
     var nRET = tds[5];
     var nAc = tds[6];
     }
    
    if (nETA.id == '') continue;
    if (nRET.id == '') continue;
    //EmpireBoard.Log.Add('nETA.id = '+nETA.id);
    
    var trPayload = tr.nextSibling;
    var payload = trPayload.getElementsByTagName("img");
    var foundGoods = false;
    var foundArmy = false;
    var PayloadGoods = {};
    if (payload.length > 0)
     {
     var rKey = ''; 
     for (var j = 0; j < payload.length; j++)
      {
      if (payload[j].src.indexOf('wood') > 0)
       {
       if (rKey == 'wood') continue;
       rKey = 'wood';
       foundGoods = true;
       }
      else if (payload[j].src.indexOf('wine') > 0)
       {
       if (rKey == 'wine') continue;
       rKey = 'wine';
       foundGoods = true;
       }
      else if (payload[j].src.indexOf('marble') > 0)
       {
       if (rKey == 'marble') continue;
       rKey = 'marble';
       foundGoods = true;
       }
      else if (payload[j].src.indexOf('glass') > 0)
       {
       if (rKey == 'glass') continue;
       rKey = 'glass';
       foundGoods = true;
       }
      else if (payload[j].src.indexOf('sulfur') > 0)
       {
       if (rKey == 'sulfur') continue;
       rKey = 'sulfur';
       foundGoods = true;
       }
      else if (payload[j].src.indexOf('slinger') > 0)
       {
       rKey = '';
       foundArmy = true;
       continue;
       }
      else if (payload[j].src.indexOf('swordsman') > 0)
       {
       rKey = '';
       foundArmy = true;
       continue;
       }
      else if (payload[j].src.indexOf('phalanx') > 0)
       {
       rKey = '';
       foundArmy = true;
       continue;
       }
      else if (payload[j].src.indexOf('spearman') > 0)
       {
       // v 3.2 unit
       rKey = '';
       foundArmy = true;
       continue;
       }
      else if (payload[j].src.indexOf('archer') > 0)
       {
       rKey = '';
       foundArmy = true;
       continue;
       }
      else if (payload[j].src.indexOf('marksman') > 0)
       {
       rKey = '';
       foundArmy = true;
       continue;
       }
      else if (payload[j].src.indexOf('gyrocopter') > 0)
       {
       rKey = '';
       foundArmy = true;
       continue;
       }
      else if (payload[j].src.indexOf('steamgiant') > 0)
       {
       rKey = '';
       foundArmy = true;
       continue;
       }
      else if (payload[j].src.indexOf('bombardier') > 0)
       {
       rKey = '';
       foundArmy = true;
       continue;
       }
      else if (payload[j].src.indexOf('ram') > 0)
       {
       rKey = '';
       foundArmy = true;
       continue;
       }
      else if (payload[j].src.indexOf('catapult') > 0)
       {
       rKey = '';
       foundArmy = true;
       continue;
       }
      else if (payload[j].src.indexOf('mortar') > 0)
       {
       rKey = '';
       foundArmy = true;
       continue;
       }
      else if (payload[j].src.indexOf('medic') > 0)
       {
       rKey = '';
       foundArmy = true;
       continue;
       }
      else if (payload[j].src.indexOf('cook') > 0)
       {
       rKey = '';
       foundArmy = true;
       continue;
       }
      else
       {
       rKey = '';
       continue;
       }
       
      if ((PayloadGoods[rKey] == undefined) && ((rKey == 'wood') || (rKey == 'wine') || (rKey == 'marble') || (rKey == 'glass') || (rKey == 'sulfur')))
       {
       var rAmnt = EmpireBoard.Str.To_Integer(payload[j].title);
       PayloadGoods[rKey] = rAmnt;
       }
      }
     }
    
    var citySource;
    var citySourceID = 0;
    var cityTarget;
    var cityTargetID = 0;
    var quest;
    
    citySourceID = grab_City_ID(nSource);
    cityTargetID = grab_City_ID(nTarget);
    
    if (nMi.className.indexOf('returning') > 0)
     {
     quest = 'returning';
     if (tr.parentNode.parentNode.parentNode.parentNode.id == 'plunderingTransports')
      {
      if (foundGoods == true)
       {
       citySource = EmpireBoard.Str.Trim(nTarget.textContent);
       cityTarget = citySourceID;
       if (citiesNames[cityTargetID] == undefined)
        {
        citySource = EmpireBoard.Ikariam.Trim_PlayerName(nSource.textContent);
        cityTarget = cityTargetID;
        }
       }
      else continue;
      }
     else if ((foundArmy == true) && (foundGoods == false))
      {
      continue;
      }
     else
      {
      if (mTimers[nETA.id] == undefined)
       {
       mTimers[nETA.id] = EmpireBoard.StartTime + (1 * 20 * 60 * 1000);
       quest = 'loading';
       }
      citySource = EmpireBoard.Str.Trim(nTarget.textContent);
      cityTarget = citySourceID;
      //if (foundArmy == false) addTransport(citiesIDs[EmpireBoard.Ikariam.Trim_PlayerName(nSource.textContent)], nETA.id, mTimers[nETA.id]);
      if (foundGoods == false) continue;
      }
     }
    else if ((nMi.className.indexOf('gotoown') > 0) || (citiesNames[cityTargetID] != undefined))
     {
     if (foundArmy == true)
      {
      continue;
      }
     else 
      {
      citySource = EmpireBoard.Ikariam.Trim_PlayerName(nSource.textContent);
      cityTarget = cityTargetID;
      quest = 'gotoown';
      if (mTimers[nETA.id] == undefined)
       {
       mTimers[nETA.id] = EmpireBoard.StartTime + (1 * 20 * 60 * 1000);
       quest = 'loading';
       }
      else if (nAc.innerHTML == '')
       {
       citySource = EmpireBoard.Ikariam.Trim_PlayerName(nTarget.textContent);
       cityTarget = citySourceID;
       quest = 'halfturn';
       }
      //addTransport(citiesIDs[EmpireBoard.Ikariam.Trim_PlayerName(nSource.textContent)], nETA.id, mTimers[nETA.id]);
      if (foundGoods == false) continue;
      }
     }
    else if (nMi.className.indexOf('gotoforeign') > 0)
     {
     quest = 'gotoforeign';
     if (tr.parentNode.parentNode.parentNode.parentNode.id == 'plunderingTransports')
      {
      quest = 'plundering';
      if ((mTimers[nETA.id] != undefined) && (mTimers[nETA.id] > EmpireBoard.StartTime))
       {
       takeSomething = true;
       setViewRqTime('merchantNavy', 0, parseInt(mTimers[nETA.id]) + (1000*60*15));
       }
      else if ((mTimers[nRET.id] != undefined) && (mTimers[nRET.id] > EmpireBoard.StartTime))
       {
       takeSomething = true;
       setViewRqTime('merchantNavy', 0, EmpireBoard.StartTime + (1000*60*15));
       }
      continue;
      }
     else if (foundArmy == true)
      {
      continue;
      }
     else
      {
      if (mTimers[nRET.id] != undefined)
       {
       //addTransport(citiesIDs[EmpireBoard.Ikariam.Trim_PlayerName(nSource.textContent)], nETA.id, mTimers[nRET.id]);
       }
      else if (mTimers[nETA.id] != undefined)
       {
       //addTransport(citiesIDs[EmpireBoard.Ikariam.Trim_PlayerName(nSource.textContent)], nETA.id, mTimers[nETA.id]);
       }
      else
       {
       //addTransport(citiesIDs[EmpireBoard.Ikariam.Trim_PlayerName(nSource.textContent)], nETA.id, EmpireBoard.StartTime + (1000*60*15));
       }
      
      if ((foundGoods == true) && (nAc.innerHTML != ''))
       {
       continue;
       }
      else if ((foundGoods == true) && (nAc.innerHTML == '') && (mTimers[nETA.id] == undefined))
       {
       citySource = EmpireBoard.Str.Trim(nTarget.textContent);
       cityTarget = citySourceID;
       if (mTimers[nRET.id] != undefined)
        {
        mTimers[nETA.id] = mTimers[nRET.id];
        }
       else 
        {
        mTimers[nETA.id] = EmpireBoard.StartTime + (1 * 20 * 60 * 1000);
        }
       quest = 'loading';
       }
      else if ((foundGoods == false) && (nAc.innerHTML != ''))
       {
       if (mTimers[nETA.id] != undefined)
        {
        takeSomething = true;
        setViewRqTime('merchantNavy', 0, parseInt(mTimers[nETA.id]));
        }
       }
       
      if (foundGoods == false) continue;
      }
     }
    else continue;
    
    if ((foundGoods == true) && (cityTarget != undefined) && (mTimers[nETA.id] != undefined))
     {
     if (config["arrivinggoods"][cityTarget] == undefined) config["arrivinggoods"][cityTarget] = {};
     var idx = nETA.id;
     if (config["arrivinggoods"][cityTarget][idx] == undefined) config["arrivinggoods"][cityTarget][idx] = {};
     config["arrivinggoods"][cityTarget][idx]["startcity"] = citySource;
     if (config["arrivinggoods"][cityTarget][idx]["res"] == undefined) config["arrivinggoods"][cityTarget][idx]["res"] = PayloadGoods;
     config["arrivinggoods"][cityTarget][idx]["quest"] = quest;
     config["arrivinggoods"][cityTarget][idx]["arrivetime"] = parseInt(mTimers[nETA.id]);
     
     if (quest != 'loading')
      {
      setViewRqTime('', cityTarget, parseInt(mTimers[nETA.id]));
      }
     else
      {
      foundLoading = true;
      setViewRqTime('merchantNavy', 0, EmpireBoard.StartTime + (1000*60*10));
      }
     }
    }
   }
  
  // disable attention
  if ((foundLoading != true) && (takeSomething != true))
   {
   setViewRqTime('merchantNavy', 0);
   }
   
  config.merchantNavytime = EmpireBoard.StartTime;
  
  EmpireBoard.ViewIsMerchantNavy();
  }
  
  }

/**************************************************************************************************
 * Render tables
 *************************************************************************************************/
function renderTables()
 {
 var s = "";

 if (EmpireBoard.DB.Options.Prefs.TABLE_BUILDINGS == true) 
  {
  s += "<div id='EmpireBoardBuildings' class='Table'>";
  s += EmpireBoard.Renders.Buildings_Table_Content();
  s += "<p class='Caption'>"+
   "<span dir='ltr'>(<span class=Green>1-14</span>)</span> available free spaces for new buildings."+
   " <span dir='ltr'>(<span class=Red>!</span>)</span> require your attention to update overview's data."+
   "</p>";
  s += "</div>";
  }

 if (EmpireBoard.DB.Options.Prefs.TABLE_RESOURCES == true)
  {
  s += "<div id='EmpireBoardResources' class='Table'>";
  s += EmpireBoard.Renders.Resources_Table_Content();
  s += "<p class='Caption'>"+
   "<span dir='ltr'>(<span class=Green>1-9</span>)</span> available action points."+
   " <span dir='ltr'>(<span class=Red>!</span>)</span> require your attention to update overview's data."+
   " <span dir='ltr'>(<img src='skin/layout/icon-wall.gif' class='Safe' />)</span> resources safe against pillaging."+
   " <span dir='ltr'>(<span class=Green>*</span>)</span> some resources delivered."+
   "</p>";
  s += "</div>";
  }

 if (EmpireBoard.DB.Options.Prefs.TABLE_ARMYFLEET == true)
  {
  s += "<div id='EmpireBoardArmy' class='Table'><table class='Overview Army'>";
  s += EmpireBoard.Renders.ArmyFleet_Table_Content();
     s += "<p class='Caption'>"+
   "<span dir='ltr'>(<span class=Green>1-9</span>)</span> available action points."+
   " <span dir='ltr'>(<span class=Red>!</span>)</span> require your attention to update overview's data."+
   "</p>";
  s + "</div>";
  }

 var body = EmpireBoard.DOM.Get_First_Node("//body");
 var span = document.getElementById(EmpireBoard.MainID);
 if (span == null)
  {
  span = document.createElement('div');
  span.id = EmpireBoard.MainID;
  span.setAttribute("version", EmpireBoard.Version);
  if (EmpireBoard.Intl.LangDir() == "rtl")
   {
   span.setAttribute("dir", "rtl");
   span.setAttribute("class", "RtoL");
   }
  else
   {
   span.setAttribute("dir", "ltr");
   span.setAttribute("class", "LtoR");
   }
  span.innerHTML = s;
  body.appendChild(span);
  }
 else
  {
  if (EmpireBoard.Intl.LangDir() == "rtl")
   {
   span.setAttribute("dir", "rtl");
   span.setAttribute("class", "RtoL");
   }
  else
   {
   span.setAttribute("dir", "ltr");
   span.setAttribute("class", "LtoR");
   }
  span.innerHTML = s;
  }

 //settings table
 function reset_all_data()
  {
  var answer = confirm(EmpireBoard.ScriptName+":\n\nAre you sure you want to delete ALL stored data ?");
  if (answer)
   {
   config = {};
   EmpireBoard.DB.Save();

   EmpireBoard.DB.Options = {};
   EmpireBoard.DB.Save_Options();

   window.location.href = window.location.href;
   }
  }

 function myChkEventHandler()
  {
  this.value = (this.value == '1' ? '0' : '1');
  EmpireBoard.DB.Options.Prefs[this.lang] = (this.value == '1');
  EmpireBoard.DB.Save_Options();
  }

 function myChgEventHandler() 
  {
  EmpireBoard.DB.Options.Prefs[this.lang] = this.value;
  EmpireBoard.DB.Save_Options();
  }

 function createChk(propertyName, propertyValue)
  {
  var btn = document.createElement('input');
  btn.type = "checkbox";
  btn.lang = propertyName;
  btn.value = (propertyValue == true ? '1' : '0');
  if (propertyValue == true) 
   {
   btn.checked = "checked";
   }
  btn.addEventListener('click', myChkEventHandler, false);
  return btn;
  }

 function createInp(propertyName, propertyValue) 
  {
  var btn = document.createElement('input');
  btn.type = "text";
  btn.lang = propertyName;
  btn.value = propertyValue;
  btn.addEventListener('change', myChgEventHandler, false);
  return btn;
  }

 function createTxtr(propertyName, propertyValue, rows, cols) 
  {
  var btn = document.createElement('textarea');
  btn.cols = (cols != undefined) ? cols : 50;
  btn.rows = (rows != undefined) ? rows : 15;
  btn.lang = propertyName;
  btn.value = propertyValue;
  btn.addEventListener('change', myChgEventHandler, false);
  return btn;
  }

 function createSlct(propertyName, propertyValue, items)
  {
  var btn = document.createElement('select');
  btn.lang = propertyName;
  for(key in items) 
   {
   var o = document.createElement("option");
   o.value = key;
   o.text = items[key];
   btn.add(o, null);
   }
  btn.value = propertyValue;
  btn.addEventListener('change', myChgEventHandler, false);
  return btn;
  }

 function createRow(title, input) 
  {
  var tr = document.createElement('tr');
  var td = document.createElement('td');
  td.setAttribute("align", "right");
  td.setAttribute("style", "border-style: dotted; border-width: 1px;");
  td.innerHTML = title;
  tr.appendChild(td);
  var td = document.createElement('td');
  td.setAttribute("align", "left");
  td.setAttribute("style", "border-style: dotted; border-width: 1px;");
  td.appendChild(input);
  tr.appendChild(td);
  return tr;
  }

 function createRowChk(title, propertyName, propertyValue) 
  {
  return createRow(title, createChk(propertyName, propertyValue));
  }

 function createRowInput(title, propertyName, propertyValue) 
  {
  return createRow(title, createInp(propertyName, propertyValue));
  }

 function createRowTxtr(title, propertyName, propertyValue, rows, cols) 
  {
  return createRow(title, createTxtr(propertyName, propertyValue, rows, cols));
  }

 function createRowSlct(title, propertyName, propertyValue, items) 
  {
  return createRow(title, createSlct(propertyName, propertyValue, items));
  }

 var t = document.createElement('table');
 t.id = EmpireBoard.MainID+"Settings";
 t.setAttribute("style", "display: none;");
 t.setAttribute("align", "right");
 t.appendChild(createRowChk("Show resources table:", "TABLE_RESOURCES", EmpireBoard.DB.Options.Prefs.TABLE_RESOURCES));
 t.appendChild(createRowChk("Show buildings table:", "TABLE_BUILDINGS", EmpireBoard.DB.Options.Prefs.TABLE_BUILDINGS));
 t.appendChild(createRowChk("Show army and fleet table:", "TABLE_ARMYFLEET", EmpireBoard.DB.Options.Prefs.TABLE_ARMYFLEET));
 t.appendChild(createRowSlct("Resource progress bar mode:", "PROGRESS_BAR_MODE", EmpireBoard.DB.Options.Prefs.PROGRESS_BAR_MODE, {off: "off", time: "based on remaining time", percent: "based on fullness percentage"}));
 t.appendChild(createRowSlct("Language:", "LANGUAGE", EmpireBoard.DB.Options.Prefs.LANGUAGE, EmpireBoard.Intl.Languages()));

 var tr = document.createElement('tr');
 t.appendChild(tr);
 var td = document.createElement('td');
 tr.appendChild(td);
 td.setAttribute("colspan", "2");
 var buttonsPanel = document.createElement('div');
 td.appendChild(buttonsPanel);

 //reset button
 var n = document.createElement('input');
 n.type = "button";
 n.value = "Reset all data";
 n.setAttribute("class", "button");
 n.setAttribute("style", "display: inline !important;");
 n.addEventListener("click", reset_all_data, false);
 buttonsPanel.appendChild(n);

 function show_hide_table()
  {
  var n = document.getElementById(EmpireBoard.MainID+"Settings");
  var m = document.getElementById(EmpireBoard.MainID+"Addons");
  if (n.style.display == 'none')
   {
   n.style.display = 'table';
   m.style.display = 'block';
   this.value = EmpireBoard.Intl.TT("hide_settings");
   }
  else
   {
   n.style.display = 'none';
   m.style.display = 'none';
   this.value = EmpireBoard.Intl.TT("show_settings");
   }
  }

 //now adds table
 span.appendChild(t);

 var ul = document.createElement('ul');
 ul.id = EmpireBoard.MainID+'Addons';
 ul.setAttribute("style", "display: none;");
 ul.innerHTML = '<u>Registered add-ons :</u>';
 span.appendChild(ul);

 var p = document.createElement('p');
 p.setAttribute("class", "Footer");

 var n = document.createElement('span');
 n.innerHTML = 'Powered by <a href="http://userscripts.org/scripts/show/41051" target="_blank"><b>'+EmpireBoard.ScriptName+'</b></a> <span dir="ltr">(<span>v. <i>' + EmpireBoard.Version + '</i></span> - <a target="_blank" href="http://feeds.feedburner.com/ikariam-v3-empire-board">last changes</a>)</span>. ';
 if (EmpireBoard.DB.Options['AvailableVersion'] > EmpireBoard.Version)
  n.innerHTML += '<a href="'+EmpireBoard.ScriptURL+'?version='+EmpireBoard.DB.Options['AvailableVersion']+'.user.js'+'" style="color: red;"><b>NEW RELEASE V. <i>'+EmpireBoard.DB.Options['AvailableVersion']+'</i> AVAILABLE !</b></a> ';
 p.appendChild(n);

 var n = document.createElement('input');
 n.type = "button";
 n.value = EmpireBoard.Intl.TT("show_settings");
 n.setAttribute("class", "button");
 n.addEventListener("click", show_hide_table, false);
 p.appendChild(n);

 // footer
 span.appendChild(p);
 }

if ((EmpireBoard.Ikariam.Is_Logged() == true) && (EmpireBoard.Ikariam.View() != '') && (EmpireBoard.Ikariam.View() != 'errorLoggedOut') && (EmpireBoard.Ikariam.View() != 'no-login-umod'))
 {
 // Fix for v3
 var body = EmpireBoard.DOM.Get_First_Node("//body");
 var script = document.createElement('script');
 script.type = "text/javascript";
 script.src = "/js/wz_tooltip.js";
 body.appendChild(script);
 
 EmpireBoard.Renders.Set_Common_Styles();

 renderTables();

 EmpireBoard.Tooltip.CreateContainer(EmpireBoard.MainID+'Tooltip', EmpireBoard.MainID);
 EmpireBoard.Handlers.Attach_Events();
 
 EmpireBoard.Handlers.Start_Timers();
 
 EmpireBoard.DB.GarbageCollector();
 EmpireBoard.DB.Save();
 };
 
EmpireBoard.EndTime = new Date().getTime();
EmpireBoard.Log.Add('Ended after '+((EmpireBoard.EndTime - EmpireBoard.StartTime)/1000)+'s');

0 comments:

Post a Comment