BastianKanaan / MyFreeFarm Berater

// ==UserScript==
// @name           MyFreeFarm Berater
// @namespace      https://github.com/BastianKanaan/GMscripts_MyFreeFarm
// @author         BastianKanaan
// @description    Extends MyFreeFarm
// @icon           data:image/png;base64,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
// @date           01.04.2015
// @version        2.4.2
// @include        /^http:\/\/(|www\.|s\d+\.)au\.myfreefarm\.com\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)veselaferma\.com\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)myfreefarm\.com\.br\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)myfreefarm\.de\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)myfreefarm\.cz\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)myfreefarm\.dk\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)myfreefarm\.gr\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)migranjalinda\.es\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)mabelleferme\.fr\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)myfreefarm\.com\.hr\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)myfreefarm\.ae\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)myfreefarm\.ir\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)myfreefarm\.it\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)enkicsitanyam\.hu\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)myfreefarm\.nl\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)myfreefarm\.co\.nz\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)myfreefarm\.no\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)wolnifarmerzy\.pl\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)pt\.myfreefarm\.com\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)fermavesela\.ro\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)mojaderewnja\.ru\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)myfreefarm\.se\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)th\.myfreefarm\.com\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)tr\.myfreefarm\.com\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)myfreefarm\.co\.uk\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)myfreefarm\.com\/.*$/
// @include        /^http:\/\/(|www\.|s\d+\.)myfreefarm\.com\.vn\/.*$/
// @exclude        http://*/dyn_bubbles.php*
// @exclude        http://*/nachrichten/bbhelp.php*
// @exclude        http://*/payment/*
// @grant          GM_addStyle
// @grant          GM_deleteValue
// @grant          GM_getValue
// @grant          GM_listValues
// @grant          GM_log
// @grant          GM_registerMenuCommand
// @grant          GM_setValue
// @grant          GM_xmlhttpRequest
// @grant          unsafeWindow
// @require        https://raw.githubusercontent.com/BastianKanaan/GMscripts_MyFreeFarm/master/MyFreeFarm_Common_functions.user.js
// ==/UserScript==

//***********************************************************************************************************
unsafeData.beraterDone=false;
// global variables
const VERSION=GM_info["script"]["version"];
const neededVersionFunctionFile="2.1.3";
const GM_Home  =GM_info["script"]["namespace"];
const GM_Source=GM_info["script"]["namespace"];
// [version,date,[[de,en],[de,en],...]]
const CHANGELOG=[["2.0","29.05.2014",[["Migration nach openuserjs.org","Migration to openuserjs.org"],["Script wird jetzt auf GitHub entwickelt","Script now developed on GitHub"]]]
                ,["2.1.1","14.06.2014",[["Neu: Changelog","New: Changelog"],["Bugfixes","Bugfixes"]]]
                ,["2.1.2","28.06.2014",[["Ge"+a_dots+"ndert: Berechnung des \"Rekursiv ben"+o_dots+"tigt\"-Wertes","Change: Calculation of \"Recursive needed\" value"],["Neu: Optionen bzgl. Globaler Zeit und Bauernmarkt","New: Options according to global time and farmersmarket"],["Bugfix: Event nach Bedienung eines Farmis","Bugfix: Event after handling a farmi"]]]
                ,["2.2","11.07.2014",[["Refaktorierung der Zonen-Daten","Refactoring of zones data"]]]
                ,["2.2.1","12.07.2014",[["Bugfix","Bugfix"]]]
                ,["2.3","14.08.2014",[["Anpassung an Firefox 30","Adaptation to Firefox 30"]]]
                ,["2.3.1","15.08.2014",[["Bugfix: Zeit von anderen Accounts auf dem Server (Umloggen)","Bugfix: Time of other account on the server (login)"],["Bugfix: Ignorieren von verwelkten Gestecken","Bugfix: Ignoring of faded arrangements"],["Ge"+a_dots+"ndert: Spezieller Portal-Login nicht mehr ben"+o_dots+"tigt","Change: Special Portal-Login not needed anymore"]]]
                ,["2.3.2","17.08.2014",[["Bugfix: Farmi MiniInfo verschwindet","Bugfix: Farmi MiniInfo vanishes"],["Neu: Goldesel Waltraud Log","New: Donkey Luke Log"]]]
                ,["2.3.3","19.08.2014",[["Neu: Baumereiprodukte und -quests durch Patch 18.08.2014","New: Forestry products and quests by patch 18.08.2014"]]]
                ,["2.3.4","22.08.2014",[["Bugfix: S"+a_dots+"gewerk und Schreinerei durch Patch 18.08.2014","Bugfix: Sawmill and carpentry by patch 18.08.2014"]]]
                ,["2.3.5","23.11.2014",[["Bugfix: Im Markt wird manchmal die Menge nicht selektiert, wenn man ein Produkt kaufen will","Bugfix: Sometimes the amout of a product is not selected when buying a product"]]]
                ,["2.3.6","08.12.2014",[["Bugfix: DonkeyInfoPanel-Verhalten, wenn von zwei Computern auf einen Account zugegriffen wird","Bugfix: Multi user handling of donkey info panel (when accessing an account from several computers)"]]]
                ,["2.3.7","16.12.2014",[["Aktualisierung der Daten","Update of data"]]],
                ,["2.4.0","01.02.2015",[["Anpassung an Firefox 35","Fix for Firefox 35"],["Neu: G"+u_dots+"terhof","New: Megafield"]]]
                ,["2.4.1","12.02.2015",[["Bugfix: Logging Waltraud","Bugfix: Logging Waltraud"]]]
                ,["2.4.2","01.04.2015",[["Aktualisierung der Daten","Update of data"]]]
                ];
if(!VERSIONfunctionFile){
    alert("Hi, I am the Berater-Script.\nThe function-file is missing.\nPlease install me again.");
    location.href=GM_Source;
}else if(compareVersions(neededVersionFunctionFile,VERSIONfunctionFile)>0){
    alert("Hi, I am the Berater-Script.\nThe function-file is too old.\nPlease install me again.");
    location.href=GM_Source;
}
var DEVMODE=GM_getValue("devmode",false);
var DEVMODE_EVENTS=GM_getValue("devmode_events",false);
var DEVMODE_FUNCTION=GM_getValue("devmode_function",false);
var DEVMODE_LOG_WARNING=GM_getValue("devmode_log_warning",false);
var DEVMODE_LOG_ERROR=GM_getValue("devmode_log_error",false);
var hotkeymap=explode(GM_getValue("hotkeymap"),"do_main/hotkeymap",{"prevPage":37,"nextPage":39,"farm1":49,"farm2":50,"farm3":51,"guild":52,"city1":53,"city2":54,"farmilog":70,"help":72,"market":77,"marketstand":188,"messages":78,"options":79,"profit":80,"sgh":83,"overview":85,"contract":86,"systemmessage":88});
var FARMNAME=null;
var USERLEVEL=null;

// Constants
const INIT_CSS_STYLES = {
    "systemMsg_marketsale":[[],""],
    "systemMsg_contractsale":[[],"font-style:italic;"],
    "lowrack":[[],"background:orangered;color:#000;"],
    "farmicart_lowrack":[[],"color:yellow!important;"],
    "timeholder":[[],"background:url(\"http://mff.wavecdn.de/mff/guild/help_back.jpg\") -25px -25px;border:1px groove #4d240e;border-radius:10px;padding:5px;margin-bottom:5px;"],
    "timer":[[],"background-color:#de9008;color:white;font-weight:bold;text-align:center;"],
    "watertimer":[[],"background-color:blue;color:white;font-weight:bold;text-align:center;"],
    "timer_ready":[[],"background-color:red;color:white;font-weight:bold;text-align:center;"],
    "prod_border_lowamount":[[],"border:1px solid blue;"],
    "prod_border_missing":[[],"border:1px solid red;"],
    "cloud_back_noprice":[[],"background-color:white;"],
    "cloud_border_noprice":[["cloud_back_noprice"],"border:2px solid black;"],
    "cloud_back_below":[[],"background-color:#fdd;"],
    "cloud_border_below":[["cloud_back_below"],"border:2px solid red;"],
    "cloud_back_between":[[],"background-color:#ffe87c;"],
    "cloud_border_between":[["cloud_back_between"],"border:2px solid #ff8c00;"],
    "cloud_back_above":[[],"background-color:#dfd;"],
    "cloud_border_above":[["cloud_back_above"],"border:2px solid green;"],
    "farmi_price_unknown":[[],"background-color:none;"],
    "farmi_price_low":[[],"background-color:#FF3333;"],
    "farmi_price_between":[[],"background-color:yellow;"],
    "farmi_price_above":[[],"background-color:#22AA22;"],
    "farmi_amount_missing":[["farmi_price_above"],"border:1px solid red;"],
    "farmi_amount_low":[["farmi_price_above"],"border:1px solid blue;"],
    "farmi_amount_above":[["farmi_price_above"],"border:1px solid grey;"]};
const IMAGES={"leftarrow":"data:image/gif;base64,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",
              "rightarrow":"data:image/gif;base64,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",
              "leftarrow_dark":"data:image/gif;base64,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",
              "rightarrow_dark":"data:image/gif;base64,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",
              "settings":"data:image/png;base64,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",
              "starGrey":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAAOCAIAAAB7HQGFAAAABnRSTlMA/wD/AP83WBt9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAVklEQVR4nJ2RUQrAMAhDp3fMKT1k9iGs0tgiy4/wGqNFI/kM5IoiYuQb5WWYRk7zjGS7UBUAz3I3rbkn68ddUUuWT7espPkvAM22vFu2bs8V2v/7tnoB7YUnCmjChpYAAAAASUVORK5CYII=",
              "exclamationMark":"data:image/gif;base64,R0lGODlhGAAYAKEBAAAAAP///////////yH5BAEAAAIALAAAAAAYABgAAAJGlC+gy4B/QJi0BgeRtBZns3GU94Xi9UXnmKonmZpd64pwbNNaroN8n5gBfZUbTWY8Moa1SbL008mcwykKaH1mkEzQsjssAAA7",
              "graph":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAYdJREFUeNpi/P//P8NgBkwMgxyMOnDUgaMOHHUgrQGooMaFgWAmSAkQtwyUexjx1SSMjIwwyY9ALEAvB46mQSIBGzTp3IPiFqgYSWnwPxR/oIEDW5DMh+EuDDcMoANfYXHgc3Q3DGQU/x3MaRCU1r5gEV82WNLgHPSoBeIJIIdTKw0yA3Ev1GAQng/EPEQ6LhnJ3G9AbIYvwMh1YCmWBD6HCMcZA/FPJD1+hGKUVAc6QaPiMxYHfoOGLC4gCsQPkdRXEFPVEevAP9Co/E8AbwdiISz2ghy+C0ndNGLrYmIdiIxBpf5GPI58iJ6uoOkVJr8RX0hTEoKgjGCPlg6fQB0EavWkQaP5PzSd5UPFkdPcSSDmJKU1Q+1ixhgtnaFjgs02elR1oMywF4cDnwwGB8IyxQcsDrxNqgOZaFjPrsciPpfaTX5KqjoeaOH9Fhq1LQTKyeHd5AeFhspg7NW9IqL2oCYuJTUXd9HZgW9JdSAz1JG36eTAaSRlktGhj1EHjjpwCDgQIMAAkAsvxuJFQs4AAAAASUVORK5CYII=",
              "questActiveMain1":"data:image/png;base64,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",
              "questActiveMain2":"data:image/png;base64,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",
              "questActiveForestry1":"data:image/png;base64,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",
              "questActiveForestry2":"data:image/png;base64,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",
              "questActiveFoodworld":"data:image/png;base64,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",
              "floppyDisk":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAEg0lEQVR4XqWVW2xUVRSGv7l12tIZytBSMRVjSIg2RhCEmJhA0MjtwagJPmDQ+NK0miZaiA+UCBgMCCUBYoU0qEgxKYlaRUVsFa1EUihMh4ItRTQSLO1M6fTCXM5t7+3JyeTEQBswfMnKydpn7fWv/Z+dHA/3jsAFH/cOs4HxXCwAtNYfjilAc3L3nVPnshpQdxs1NTWqtvZNJ1+xbKn65KMPnSegtm/booC+nIgnZxHqZG+K65kxzjY3sOH5pXh9PpSUyEwGO4FcPmvVi/x0opVkcpj44AA5GBsbJRjMt9eu03H6HMdbf04B01yBtp5Bui7+Sc93TWx+bAakR0GCZRgQLEBmsxgFU/j9Wj+vffoFDfv3ANDadoJgno9HKh4lmx4jY9ftqG8AWA6c9JNDKQ9SSPLtKQZTAp+ZB1KBJ4DHVKjAFBZt2oWzc9lSANrb20kkhujv76enp4/q6kqi0XPYdmGf4CCQ51p07MIA5y9d5kbHUerr65kIn8/Hjve3UVExx7HHnp6OjjPE4wnCU8N28yiN+3bTf30Q0zQ5eOjIsNfdDEhdcifqNr7D3j17AZg3by6lJRGKQkWsX7cOXdOc5teu9TvNAenHRaEUDl1dXSiluJXOzk56e3uprKykqrqKq3//xeYtm5j3+EJGksN8+00LALY9AK8Cv7gWfd89QGf0IldPNnPgwAEmIxwOc6T5EOlUilTqpiMCOB8XYGAwwVDiBrZIGihzLZKaRHglxcXF3Imt7+3ky5aveaNmvXMl7eZ0d/ew+4OPuTGcdE6QA9ci3QtSiskscmlqamLNmjXEYjEaGxupra3FME3OdMao3LCT/e++RY6VAK5FX53/hwuxbkZbP6P+8GHulrKyMqSUpNNpNuxrIfrj57Qcdix+EBh2T2AIhWZYBBcsoa6uDl3XuRXNUvgR+P3uNtauXUsmkyEvXIrP6yGe1gFut0iZCl0XhIrL8UZmUWQXW0IipHLs8vu85OkmocKga5/X68W0BDPz88jqplNj6dbEAl4TJJLkeMbZGDt+EA8+iqdFKC6ZgRDCDhMppB0WCoWp6cQ1gRwZYsnqKh6aOR2kMckJAiCFACXoaz/KSysXs2LVc44d+QWFAM7k6dRNRsdGMLQs3bEobZ2XSUfmcuVKH/PnViClObEAKCxhgZRkUimeeXa53TifzZs2MpSIA7Bt+y6SySH0bAbNjieefIrmY6cofKAM09Io8CuENomAVKAUBH0AOFMX2PFfUjfHMQ0DgMj0UkJFYbuuwL2KQS+34S5ZlkBKO0zhTCeFwDQtEvHBnP8Cw9Ac/6cUhSi7v5xQeCqWZYIynPV4VhH0TPINLvzWRoAAaUtiGjrZTMa5fsIS7q3RtSzTIiWUls10fi66rjlDGbpBQCqkHUqICQUWNWx9+8zTL7xMqDhC+ew5nDt7mvLycl6vrqJkxn0A9uRhQqGp+P0BRkeG+eNyH7qmUYQPYWgYXolyDUMBbuYHFgKnuAcenr+YS9FfAV4B2oAxRyAn5AMKcxFw1/8/CjCBNJD9F+Hva8TmTxPaAAAAAElFTkSuQmCC",
              "category_f1_active":"data:image/png;base64,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",
              "category_f2_active":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB94EBQ8JC2vypPEAAAU1SURBVEjHpZZtbFNVGMd/96Xt3WvH1o1269Z1Y6DAdC5MgQUmCJgIMRgMStSQgAnBGKIfkPjJRYMvQCQKRjFICC/iCwaYYBREXsaYwtxYEGRA6Vq2dRu0u+tcd7vutn7o2JggTn2+nHOee8/5n+f8n+d/jsBtdvqbtTGANFv+bd4+IIHRWR+9XSpqT4S5z74u3PIOdbo0Lbb7s41QWotoUpAQB79EYZR9nSjRsMYjgZkjgASASy5PbHxBHgAdne0c7HwNSQKQAP0uLffoQ0QLU9Y1E031MX3RWkFY89bq2FNTF/LwnOkjAq+r3ctvqQf41yYKgEREC1HsfjC+hWzL+Ep3sAuLWSc5IxtFlgHIzp3IrvVHyCrp/3cgMUCIIckyXqMLW48dyaSEKr1XzzM2p4TzjRcwKiIJRgVFUZg3b8H/ABLQo1GsWinijZ4IiZY4H9eu1FJT00Bzq3fo/w3rP8biWcR/MwklIYRUPGVKZbbZTlgSUJIF2m+GsKQaUT0BcgpyARhfdB9O83wuBapGv74gENN1crQJSNb0nMqQEOLnmmMkC5kUOw2Ek3Jp8fkwjxmDnKigyDKKLOM0zyetPZkW6fyoQCIDOnYtB3FGxSTqTxxDCwapPXcCdzCZiBqEgTb6+rqhTxuaZzaZsE2cjXrQNrpoopCkmxCfnpbL+g+3AZCZYgCgydMMcjbbj9TSVHeBbrUbV6uLy9e89Hv8vLJmHQ2fF40inaFXCsdL1lB2iMPHDiBLY5mQY0TMtOI6dRKptYHNe3ex+6sDBHwevB1XaPT/Tnc4zLrVq2jaZ/sH2gEUZAA9CufYwoqteWx58Tvy8wuxFjmpr6vG43bR0+HGnLcRY7AaR/okmq9epqamgevua1x/H+a8qoAg3AES1wDtlvjEh6IksHKbk+ZmF/u+3k7plBlMK6mgrbWXqm3voZKJyZZC2NdDaaGJisefpzfQy6alZ7nfVP4XPmIMYiAtf+axyvb0TmRZHqrWsoVpaE0FfLt/J/qAn46gSuOZajoDN7DYx+EosNLgCfLko1MZa7Oyc9eX7Ntbx8pHX+Jm8uUheRno17HrjkEQcxuywRAHGbSiCp3ycS9RVbUf2WSi0DGJxjPVtLhaSM/MRvP9yvc/HubLqh9IlCMEbqr4wyGs0Scw5F27rU4ct45LumueJ5YfofbYHvxeL27vRRY8+QIA726opN79BxHjMPHl08o4fOg4ZaV2IhcW3UYCIzm5m1VHd/BR3XMoqanUnjuBT21BCwY5/tP3OKN+ss12rrf6uRka4NDBrzhb38LiebOwq0uHM9mgmEZRvVHe3FfOtJIKAHJzMgBIemgWFXNm4cybyKrli4mpCuOLc2iqu0Bx4SRmm9fHpx/54p1Yk6OWRLN5OCP+Vl1FGvYU0uVvZ0yGlQmO4Wt6SsE4GgOd2JIhy5iFyZZCQoI5TsbKJbMr3QYXxoREREkcQf6dEcWwTfbT35bBji2fIOhGwpKAJS2Ntq4AV88fRzRkIScNkGDS0XwhOvs7EOqPbo1pagdnx54m0Zw+eO3eS4/iu7B4FrFs2YssWb6K9ituAAoeyCQ3azIA+fIAUWv68EOi/ujmmP9GDxftp1BSUjAYDKPSP12P8ukyL1PnzqHL3w5Axn0lOMJXSXJOJ6IGeXnF0mEtqD+6Oaap3fxiOYHBqCCKIjoiEtF7tgAnN6RiLXIiX/fSoulYi5xMcOTz8oqlwognEcDF01tjqq8jPlDMGND+MZoICgY0PqhyDfnGZFjZ9PYbQ2v/CXD3FEIkaI2ZAAAAAElFTkSuQmCC",
              "category_f3_active":"data:image/png;base64,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",
              "category_f4_active":"data:image/png;base64,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",
              "category_f5_active":"data:image/png;base64,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",
              "category_r0_active":"data:image/png;base64,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",
              "category_r1_active":"data:image/png;base64,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",
              "category_r2_active":"data:image/png;base64,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"
             }
// cases(%=number): %=money, "c%"=coins, "f%"=fictive money
const NPC=[[,0.5,1.1,1.34,2.75,3.95,8.05,17.8,18.5,"f85","f110","f180","f280",,,,,0.16,0.52,1.02,1.44,1.96,2.28,3.8,3.69,"f340",4.38,"f510","f590",12.4,"f650",3.49,5.19,8.75,6,15.63,16.88,37.5,3.9,52.44,51.75,60.25,58.13,66.19,18.2,"c79",150,,1200,,1200,,,,,4500,,14400,1200,,"c125",,"c23",,4800,4200,,,,,,,,750,2100,"c25",,,,,,,10800,12000,,1500,3300,,,,,"f650","f1500","f1500",5000,12000,"c10",,"c20",,"c5","c5","c5","c5",,"c5",,,10.12,3.72,"f155.1","f545.7",37.42,23.32,7.44,82.36,"f106.8","f148.8","f69.6","f196.8","f278.4","f408","f240","f324","f250","f864",47.15,140.56,125.88,,"f12.8","f73.5","f127","f106","f53.05","f113.75","f44","f33.33","f71.3","f73.2","f181.2","f321","f316","f491","f350","f484.2","f906.5","f421.7","f473.5","f749.98","f237.1","f675","f975",12.25,37.5,"f1025","f1100","f810",,"f231","f6500","f58","f137.67","f197.67","f342.5","f830","f700.5","f1063.2","f704.42","f734","f339.53",3.1,3.15,3.27,7.3,4.9,5.92,6.61,6.1,7.3,5.6,5.2,3.6,10,8.1,23.5,7.8,8.2,,,,,,,,,,,,,"f410","f490","f503","f589","f469","f1312","f598","f533","f480","f420","f1620","f1030","f675","f950","f2350","f2400","f2450","f3550","f3600","f3650","f8000","f8000"],{},[],[]]; // task_new_plant task_new_product
    /*
    var new_NPC=NPC.clone();
    new_NPC[0][221]='f8000';
    GM_log(implode(new_NPC));
    */
const INIT_NPC_SAISON={"94":false,"95":false,"96":false,"98":false,"100":false,"101":false,"102":false,"103":false,"105":false}; // task_new_product
const ALL_ZONES = {"farm":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24],"farmersmarket":["farmersmarket-0","farmersmarket-1","farmersmarket-2","farmersmarket-3","farmersmarket-4","farmersmarket-5","farmersmarket-6"],"forestry":["forest","sawmill","carpentry"],"city":["windmill"],"foodworld":["foodworld-0","foodworld-1","foodworld-2","foodworld-3","foodworld-4"]}; // task_new_zone
unsafeData.ALL_ZONES=ALL_ZONES.clone();
const DATA_zones = {"1":{"location":"farm","farmNr":0,"zoneNr":1,"productional":true},"2":{"location":"farm","farmNr":0,"zoneNr":2,"productional":true},"3":{"location":"farm","farmNr":0,"zoneNr":3,"productional":true},"4":{"location":"farm","farmNr":0,"zoneNr":4,"productional":true},"5":{"location":"farm","farmNr":0,"zoneNr":5,"productional":true},"6":{"location":"farm","farmNr":0,"zoneNr":6,"productional":true},"7":{"location":"farm","farmNr":1,"zoneNr":1,"productional":true},"8":{"location":"farm","farmNr":1,"zoneNr":2,"productional":true},"9":{"location":"farm","farmNr":1,"zoneNr":3,"productional":true},"10":{"location":"farm","farmNr":1,"zoneNr":4,"productional":true},"11":{"location":"farm","farmNr":1,"zoneNr":5,"productional":true},"12":{"location":"farm","farmNr":1,"zoneNr":6,"productional":true},"13":{"location":"farm","farmNr":2,"zoneNr":1,"productional":true},"14":{"location":"farm","farmNr":2,"zoneNr":2,"productional":true},"15":{"location":"farm","farmNr":2,"zoneNr":3,"productional":true},"16":{"location":"farm","farmNr":2,"zoneNr":4,"productional":true},"17":{"location":"farm","farmNr":2,"zoneNr":5,"productional":true},"18":{"location":"farm","farmNr":2,"zoneNr":6,"productional":true},"19":{"location":"farm","farmNr":3,"zoneNr":1,"productional":true},"20":{"location":"farm","farmNr":3,"zoneNr":2,"productional":true},"21":{"location":"farm","farmNr":3,"zoneNr":3,"productional":true},"22":{"location":"farm","farmNr":3,"zoneNr":4,"productional":true},"23":{"location":"farm","farmNr":3,"zoneNr":5,"productional":true},"24":{"location":"farm","farmNr":3,"zoneNr":6,"productional":true},"windmill":{"location":"city","cityNr":2,"zoneNr":1,"productional":true},"forest":{"location":"forestry","productional":true},"sawmill":{"location":"forestry","zoneNr":1,"productional":true},"carpentry":{"location":"forestry","zoneNr":2,"productional":true},"foodworld-0":{"location":"foodworld","productional":false},"foodworld-1":{"location":"foodworld","zoneNr":1,"productional":true},"foodworld-2":{"location":"foodworld","zoneNr":2,"productional":true},"foodworld-3":{"location":"foodworld","zoneNr":3,"productional":true},"foodworld-4":{"location":"foodworld","zoneNr":4,"productional":true},"farmersmarket-0":{"location":"farmersmarket","productional":false},"farmersmarket-1":{"location":"farmersmarket","zoneNr":1,"productional":true},"farmersmarket-2":{"location":"farmersmarket","zoneNr":2,"productional":true},"farmersmarket-3":{"location":"farmersmarket","zoneNr":3,"productional":true},"farmersmarket-4":{"location":"farmersmarket","zoneNr":4,"productional":true},"farmersmarket-5":{"location":"farmersmarket","zoneNr":5,"productional":true},"farmersmarket-6":{"location":"farmersmarket","zoneNr":6,"productional":true}}; // task_new_zone
// All single-slot-zones themselves and all slots of multi-slot-zones
var ALL_SLOTS={};
// [farm, forestry, recipes, powerups]
// Growing duration in min
const PRODUCT_GROWTIME=[[,20,45,45,90,120,240,480,960,240,720,1440,2880,,,,,15,90,240,480,600,500,800,720,1000,780,2000,3000,950,4000,1000,720,1200,800,2000,880,3000,960,4000,4800,5500,6200,6800,7200,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2880,,,,,,720,,,,,,,740,,,700,360,135,2160,1000,1440,1680,540,5100,840,1080,480,1320,1800,2520,1260,1620,720,3780,6400,7400,7800,640,180,180,90,90,200,200,100,130,150,80,80,120,120,120,375,300,240,300,480,220,360,3120,3240,1440,1920,1440,2520,840,600,,,210,130,260,190,160,195,250,90,150,300,420,270,540,220,180,315,390,250,230,345,600,245,880,360,510,440,240,,,,,,,,,,,,,240,240,180,210,350,60,180,250,290,380,180,325,120,210,480,480,480,480,480,480,1440,1440],{"1":600,"2":960,"3":2160,"4":480,"5":2750,"6":490,"7":1200,"8":2520,"41":300,"42":345,"43":360,"44":270,"45":300,"46":330,"47":420,"48":480,"49":510,"50":180,"51":210,"52":240,"53":480,"54":510,"55":540,"56":300,"57":375,"58":470,"59":360,"60":450,"61":420,"101":240,"102":700,"103":640,"104":360,"105":960,"106":90,"107":120,"108":1320,"109":570,"110":330,"111":160,"112":935,"113":120,"114":300,"115":180,"116":1040,"117":1920,"118":300,"119":1440,"120":2010,"121":480,"122":300,"123":840,"124":690,"125":480,"126":240,"127":255,"128":525,"129":375,"130":410,"131":480,"132":225,"133":120,"500":0,"501":0,"502":0,"511":0,"512":0}]; // task_new_plant task_new_product
// Points earned at cropping
const PRODUCT_POINTS=[[,3,17,10,44,64,128,267,600,750,950,1540,2350,,,,,1,7,24,42,63,52,88,92,3100,108,4500,5000,319,5400,179,133,229,157,405,733,2569,211,3611,4444,5220,6028,6769,1833,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2500,,,,,,0,,,,,,,0,,0,0,179,31,2300,4900,490,340,240,1174,890,1240,580,1640,2320,3400,2000,2700,1250,7200,1475,6540,7955,0,36,36,18,18,40,36,20,26,30,16,16,24,24,24,3600,60,48,60,69,44,72,5400,7750,450,2600,8250,9725,6250,0,,,41,30,45,36,27,54,36,23,17,23,252,165,310,137,114,207,258,173,161,257,420,192,701,290,425,380,220,,,,,,,,,,,,,520,625,460,650,810,394,515,634,660,762,1343,1500,361,852,1245,1255,1275,1312,1362,1425,45000,45000],{"1":30,"2":48,"3":108,"4":24,"5":138,"6":0,"7":60,"8":126,"21":0,"22":0,"23":0,"24":0,"25":0,"41":150,"42":105,"43":108,"44":108,"45":60,"46":66,"47":294,"48":144,"49":153,"50":54,"51":42,"52":48,"53":48,"54":51,"55":54,"56":33,"57":38,"58":47,"59":39,"60":45,"61":42,"101":48,"102":140,"103":128,"104":74,"105":0,"106":18,"107":66,"108":0,"109":114,"110":70,"111":32,"112":187,"113":24,"114":60,"115":36,"116":208,"117":384,"118":660,"119":0,"120":0,"121":96,"122":60,"123":168,"124":138,"125":24,"126":48,"127":51,"128":105,"129":75,"130":82,"131":96,"132":45,"133":24,"500":0,"501":0,"502":0,"511":0,"512":0}]; // task_new_plant task_new_product

// Required quest to unlock product
const PRODUCT_QUEST=[{"117":["main",2,15],"118":["main",2,25],"119":["main",2,35],"120":["main",2,45],"121":["main",2,50],"123":["main",2,15],"124":["main",2,25],"125":["main",2,35]},{"1":["forestry",1,3],"2":["forestry",1,9],"3":["forestry",1,24],"4":["forestry",1,47],"5":["forestry",1,63],"7":["forestry",2,35],"8":["forestry",2,45],"21":["forestry",1,3],"22":["forestry",1,9],"23":["forestry",1,24],"24":["forestry",1,47],"25":["forestry",1,63],"26":["forestry",2,35],"27":["forestry",2,45],"41":["forestry",1,6],"42":["forestry",1,6],"43":["forestry",1,6],"44":["forestry",1,9],"45":["forestry",1,9],"46":["forestry",1,9],"47":["forestry",1,24],"48":["forestry",1,24],"49":["forestry",1,24],"50":["forestry",1,47],"51":["forestry",1,47],"52":["forestry",1,47],"53":["forestry",1,63],"54":["forestry",1,63],"55":["forestry",1,63],"56":["forestry",2,35],"57":["forestry",2,35],"58":["forestry",2,35],"59":["forestry",2,45],"60":["forestry",2,45],"61":["forestry",2,45],"101":["forestry",1,12],"102":["forestry",1,18],"103":["forestry",1,21],"104":["forestry",1,27],"105":["forestry",1,30],"106":["forestry",1,33],"107":["forestry",1,36],"108":["forestry",1,39],"109":["forestry",1,42],"110":["forestry",1,60],"111":["forestry",1,50],"112":["forestry",1,53],"115":["forestry",1,66],"116":["forestry",1,69],"117":["forestry",1,75],"118":["forestry",1,72],"119":["forestry",2,16],"120":["forestry",2,24],"121":["forestry",2,35],"122":["forestry",2,35],"123":["forestry",2,36],"124":["forestry",2,42],"125":["forestry",2,43],"126":["forestry",2,46],"127":["forestry",2,46],"128":["forestry",2,47],"129":["forestry",2,47],"130":["forestry",2,48],"131":["forestry",2,48],"132":["forestry",2,49]}];
// Required products to produce
const PRODUCT_REQUIRE=[{"25":[[0,9,30]],"27":[[0,10,12]],"28":[[0,11,8]],"30":[[0,12,5]],"111":[[0,110,5]],"116":[[0,2,1980]],"117":[[0,7,550]],"118":[[0,4,1020]],"119":[[0,38,650]],"120":[[0,42,110]],"121":[[0,43,100]],"122":[[0,112,130],[0,116,35]],"123":[[0,113,220],[0,117,35]],"124":[[0,114,345],[0,118,35]],"125":[[0,115,80],[0,119,35]],"130":[[0,17,400]],"131":[[0,21,150]],"132":[[0,20,100],[0,10,2]],"133":[[0,19,100],[0,10,2]],"134":[[0,17,400],[0,6,25]],"135":[[0,21,150],[0,6,25]],"136":[[0,2,120]],"137":[[0,1,200]],"138":[[0,1,200],[0,23,30]],"139":[[0,18,150],[0,22,30]],"140":[[0,21,150],[0,22,30]],"141":[[0,26,100],[0,144,3]],"142":[[0,26,100],[0,25,3]],"143":[[0,26,100],[0,25,3],[0,144,3]],"144":[[0,21,450]],"145":[[0,33,300],[0,12,2]],"146":[[0,35,200],[0,10,4],[0,12,2]],"147":[[0,37,60],[0,12,2]],"148":[[0,31,250],[0,26,150],[0,27,7]],"149":[[0,21,300],[0,43,10],[0,22,50],[0,121,4]],"150":[[0,38,60],[0,119,6],[0,17,50]],"152":[[0,151,5]],"155":[[0,152,5],[0,28,6]],"156":[[0,152,8],[0,28,5]],"157":[[0,152,2],[0,28,9]],"161":[[0,1,300],[0,17,150]],"162":[[0,1,250],[0,20,200]],"163":[[0,22,190],[0,26,120]],"164":[[0,1,150],[0,10,30]],"165":[[0,10,10],[0,12,5]],"166":[[0,10,10],[0,27,7]],"167":[[0,40,60],[0,111,10]],"168":[[0,10,10],[0,42,25]],"169":[[0,6,300],[0,9,15],[0,121,3]],"170":[[0,1,200],[0,43,20],[0,121,4]],"200":[[-1,1200],[0,171,24],[0,172,20],[0,173,12]],"201":[[-1,1400],[0,171,25],[0,172,18],[0,174,15]],"202":[[-1,1500],[0,172,22],[0,173,19],[0,174,16]],"203":[[-1,1460],[0,172,19],[0,173,16],[0,175,29]],"204":[[-1,1510],[0,171,7],[0,173,18],[0,174,8],[0,176,21]],"205":[[-1,1622],[0,171,14],[0,173,22],[0,176,10],[0,177,12]],"206":[[-1,1787],[0,174,16],[0,176,9],[0,177,10],[0,178,9]],"207":[[-1,1894],[0,173,15],[0,175,10],[0,177,11],[0,179,8]],"208":[[-1,1950],[0,173,12],[0,175,13],[0,178,15],[0,180,18]],"209":[[-1,2110],[0,171,12],[0,176,21],[0,179,7],[0,181,9]],"210":[[-1,2250],[0,171,12],[0,175,5],[0,179,34],[0,182,11]],"211":[[-1,2357],[0,172,9],[0,176,12],[0,181,22],[0,183,18]],"212":[[-1,2488],[0,171,13],[0,182,13],[0,183,16],[0,184,6]],"213":[[-1,2595],[0,171,3],[0,179,8],[0,185,7],[0,186,9],[0,187,7]],"214":[[0,0,2],[0,171,10],[0,172,14],[0,173,13],[0,174,18]],"215":[[0,0,2],[0,171,12],[0,172,22],[0,174,10],[0,175,19]],"216":[[0,0,2],[0,173,14],[0,175,8],[0,177,19],[0,178,16]],"217":[[0,0,3],[0,171,19],[0,177,5],[0,178,17],[0,180,13]],"218":[[0,0,3],[0,180,9],[0,181,8],[0,182,9],[0,183,9]],"219":[[0,0,3],[0,179,4],[0,182,1],[0,185,6],[0,186,15],[0,187,7]],"220":[[-1,1500],[0,171,70],[0,172,180],[0,173,80],[0,174,80],[0,188,1]],"221":[[-1,1500],[0,171,80],[0,172,50],[0,173,65],[0,174,140],[0,189,1]]},{"41":[[1,21,1]],"42":[[1,21,1]],"43":[[1,21,1]],"44":[[1,22,1]],"45":[[1,22,1]],"46":[[1,22,1]],"47":[[1,23,1]],"48":[[1,23,1]],"49":[[1,23,1]],"50":[[1,24,1]],"51":[[1,24,1]],"52":[[1,24,1]],"53":[[1,25,1]],"54":[[1,25,1]],"55":[[1,25,1]],"56":[[1,26,1]],"57":[[1,26,1]],"58":[[1,26,1]],"59":[[1,27,1]],"60":[[1,27,1]],"61":[[1,27,1]],"101":[[1,41,4]],"102":[[1,41,18],[1,42,2]],"103":[[1,44,11]],"104":[[1,42,1],[1,43,5]],"105":[[1,44,20],[1,45,50],[1,46,70]],"106":[[1,49,1]],"107":[[1,46,1]],"108":[[1,47,125],[1,48,65],[1,49,32]],"109":[[1,47,5]],"110":[[1,50,9],[1,51,4]],"111":[[1,52,4]],"112":[[1,50,12],[1,51,7],[1,52,6]],"113":[[1,42,1]],"114":[[1,41,1],[1,43,1]],"115":[[1,53,8],[1,55,2]],"116":[[1,53,120],[1,54,40],[1,55,40]],"117":[[1,53,80],[1,54,65],[1,55,125]],"118":[[1,53,6],[1,54,8]],"119":[[1,54,20],[1,55,25]],"120":[[1,54,35],[1,55,40]],"121":[[1,56,7],[1,57,4]],"122":[[1,58,9]],"123":[[1,57,4],[1,58,5]],"124":[[1,56,9],[1,57,4]],"125":[[1,58,3]],"126":[[1,61,5]],"127":[[1,60,3]],"128":[[1,60,6],[1,61,5]],"129":[[1,59,10],[1,60,8],[1,61,5]],"130":[[1,60,9],[1,61,8]],"131":[[1,59,6],[1,61,12]],"132":[[1,59,10],[1,60,8],[1,61,5]],"133":[[1,42,1]]}]; // task_new_product task_new_picnic_product
// Yielded amount of production
const PRODUCT_YIELD=[,{"1":1,"2":1,"3":1,"4":1,"5":1,"7":1,"8":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"41":5,"42":3,"43":3,"44":4,"45":2,"46":2,"47":7,"48":3,"49":3,"50":3,"51":2,"52":2,"53":8,"54":4,"55":4,"56":5,"57":3,"58":5,"59":6,"60":4,"61":3,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1}]; // task_new_product
    /*
    var new_data=PRODUCT_YIELD.clone();
    new_data[1][7]=;
    GM_log(implode(new_data));
    */
const ANIMAL_MOVE=[,,[false,0,0,255,10,10,505],[false,0,0,280,1,0,525],[false,0,0,280,1,25,500],,,,,,,[false,2,20,120,4,0,200]];
// Upgrade-data of buildings
// BUILDING_UPGRADES[zoneType][levelNr-1][needed level,buildcost,bonus,animalamount]
const BUILDING_UPGRADES={"1":[[1,2000,0.95,0],[15,21500,0.9,0],[21,76000,0.85,0],[27,192300,0.8,0],[33,"c20",0.8,0]],"2":[[2,2500,1,5],[7,15200,1,10],[12,32500,1,15],[23,134500,0.9,20],[29,350800,0.8,20]],"3":[[11,3400,1,2],[13,16300,1,3],[17,50200,1,4],[25,159600,0.9,5],[32,441000,0.8,6]],"4":[[14,6200,1,2],[18,33500,1,3],[20,76000,1,4],[28,210500,0.9,5],[34,482000,0.8,6]],"5":[[19,6800,1,1],[22,44800,1,2],[26,128200,1,3],[31,230600,0.9,4],[35,482000,0.8,4]],"7":[[16,5200,1,1],[19,33500,0.95,1],[25,106400,0.9,1],[30,230600,0.85,1],[33,441000,0.8,1]],"8":[[18,6800,1,1],[21,38000,0.95,1],[27,128200,0.9,1],[31,230600,0.85,1],[35,482000,0.8,1]],"9":[[27,8100,1,1],[30,53200,0.95,1],[33,140300,0.9,1],[36,264600,0.85,1],[38,597200,0.8,1]],"10":[[30,9700,1,1],[33,70200,0.95,1],[34,153700,0.9,1],[37,289200,0.85,1],[39,626300,0.8,1]],"11":[[16,10000,1,1],[20,85000,1,3],[24,200000,1,5],[28,"c22",0.9,6],[32,"c38",0.8,6]],"12":[[15,38000,1,2],[17,17200,1,3],[23,54600,1,4],[29,168800,0.9,5],[38,472400,0.8,6]],"13":[[31,16800,1,1],[32,86400,0.95,1],[34,174200,0.9,1],[36,362800,0.85,1],[38,796300,0.8,1]],"14":[[35,19400,1,1],[37,97100,0.95,1],[39,218400,0.9,1],[40,509800,0.85,1],[41,1388600,0.8,1]],"15":[[37,23000,1,1],[37,95300,1,2],[38,198500,1,3],[38,391700,0.9,4],[39,842200,0.8,5]],"16":[[38,97100,1,1],[39,209736,0.95,1],[40,467711,0.9,1],[41,1080413,0.85,1],[42,2538970,0.8,1]],"17":[[10,1000,1,1]],"18":[[10,5000,1,1]],"19":[[28,250000,1,1]],"fw1":[[11,7000,1,1],[11,24600,0.95,1],[11,64200,0.9,1],[11,114400,0.85,1],[11,186300,0.8,1]],"fw2":[[12,8400,1,1],[12,32500,0.95,1],[12,68900,0.9,1],[12,122400,0.85,1],[12,178600,0.8,1]],"fw3":[[12,11200,1,1],[12,43300,0.95,1],[12,91900,0.9,1],[12,163200,0.85,1],[12,238100,0.8,1]],"fl1":[[23,85000,0.95,36]],"fl2":[[23,75000,1,1]],"fl3":[[31,900000,1,1]],"fl6":[[31,900000,1,1]]};  // task_new_building
// produced thing -> production area
const PRODUCT2BUILDING=[[,1,1,1,1,1,1,1,1,2,3,4,5,,,,,1,1,1,1,1,1,1,1,7,1,8,9,1,10,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,11,,,,,,1,,,,,,,1,,,1,1,1,12,8,1,1,1,1,13,13,13,13,13,13,14,14,14,14,1,1,1,1,"fw1","fw1","fw1","fw1","fw1","fw1","fw2","fw2","fw2","fw2","fw2","fw2","fw2","fw2",7,"fw1","fw1","fw1","fw2","fw2","fw2",15,9,1,1,16,16,16,1,,,"fw3","fw3","fw3","fw3","fw3","fw3","fw3","fw3","fw3","fw3","fl1","fl1","fl1","fl1","fl1","fl1","fl1","fl1","fl1","fl1","fl1","fl1","fl1","fl1","fl1","fl1","fl1","fl1","fl1",,,,,,,,,,,"fl2","fl2","fl2","fl2","fl2","fl2","fl2","fl2","fl2","fl2","fl2","fl2","fl2","fl2","fl2","fl2","fl2","fl2","fl2","fl2","fl2","fl2",,],{"1":"forest","2":"forest","3":"forest","4":"forest","5":"forest","7":"forest","8":"forest","21":"forest","22":"forest","23":"forest","24":"forest","25":"forest","26":"forest","27":"forest","41":"sawmill","42":"sawmill","43":"sawmill","44":"sawmill","45":"sawmill","46":"sawmill","47":"sawmill","48":"sawmill","49":"sawmill","50":"sawmill","51":"sawmill","52":"sawmill","53":"sawmill","54":"sawmill","55":"sawmill","56":"sawmill","57":"sawmill","58":"sawmill","59":"sawmill","60":"sawmill","61":"sawmill","101":"carpentry","102":"carpentry","103":"carpentry","104":"carpentry","105":"carpentry","106":"carpentry","107":"carpentry","108":"carpentry","109":"carpentry","110":"carpentry","111":"carpentry","112":"carpentry","113":"carpentry","114":"carpentry","115":"carpentry","116":"carpentry","117":"carpentry","118":"carpentry","119":"carpentry","120":"carpentry","121":"carpentry","122":"carpentry","123":"carpentry","124":"carpentry","125":"carpentry","126":"carpentry","127":"carpentry","128":"carpentry","129":"carpentry","130":"carpentry","131":"carpentry","132":"carpentry","133":"carpentry","300":"forest"},[],[,"windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill","windmill"]];// task_new_plant task_new_product
unsafeData.PRODUCT2BUILDING=PRODUCT2BUILDING.clone();
// produced thing <- production area
const BUILDING2PRODUCT=[,,[9],[10],[11],[12],,[25,144],[27,111],[28,152],[30],[91],[110],[116,117,118,119,120,121],[122,123,124,125],[151],[155,156,157]]; // task_new_product
unsafeData.BUILDING2PRODUCT=BUILDING2PRODUCT.clone();
// building -> -/field/stable/factory/foodworld
const BUILDINGTYPE={"0":0,"1":1,"2":2,"3":2,"4":2,"5":2,"6":0,"7":3,"8":3,"9":3,"10":3,"11":2,"12":2,"13":3,"14":3,"15":2,"16":3,"17":0,"18":0,"19":3,"fl1":1,"fl2":4,"fw1":4,"fw2":4,"fw3":4} // task_new_building
unsafeData.BUILDINGTYPE=BUILDINGTYPE.clone();
const BUILDING_SIZE={"1":120,"forest":25,"fl0":17,"fl1":36,"19":[11,9]};
unsafeData.BUILDING_SIZE=BUILDING_SIZE.clone();
// Needed input of a zone
// BUILDING_INPUT[buildTyp]{output}[alternatives]=[[prod1,amount1||reducing time1],...]
const BUILDING_INPUT=[,,{"9":[[[1,600]],[[2,1200]]]},{"10":[[[3,900]],[[4,1800]]]},{"11":[[[5,2400]],[[6,4800]]]},{"12":[[[7,4800]],[[8,9600]]]},,{"25":[[[9,30]]],"144":[[[21,450]]]},{"27":[[[10,12]]],"111":[[[110,5]]]},{"28":[[[11,8]]],"152":[[[151,5]]]},{"30":[[[12,5]]]},{"91":[[[92,14400]],[[93,28800]]]},{"110":[[[108,3600]],[[109,1800]]]},{"116":[[[2,1980]]],"117":[[[7,550]]],"118":[[[4,1020]]],"119":[[[38,650]]],"120":[[[42,110]]],"121":[[[43,100]]]},{"122":[[[112,130],[116,35]]],"123":[[[113,220],[117,35]]],"124":[[[114,345],[118,35]]],"125":[[[115,80],[119,35]]]},{"151":[[[153,1560]],[[154,3120]]]},{"155":[[[152,5],[28,6]]],"156":[[[152,8],[28,5]]],"157":[[[152,2],[28,9]]]}]; // task_new_product
unsafeData.BUILDING_INPUT=BUILDING_INPUT.clone();
// Zone  2 -> "9":[[[0,1,600]],[[0,2,1200]]]
// Zone  3 -> "10":[[[0,3,900]],[[0,4,1800]]]
// Zone  4 -> "11":[[[0,5,2400]],[[0,6,4800]]]
// Zone  5 -> "12":[[[0,7,4800]],[[0,8,9600]]]
// Zone 11 -> "91":[[[0,92,14400]],[[0,93,28800]]]
// Zone 12 -> "110":[[[0,108,3600]],[[0,109,1800]]]
// Zone 15 -> "151":[[[0,153,1560]],[[0,154,3120]]]
// price of an animal. formula: cost=Math.round(ANIMALCOST[zone][0]+nr*ANIMALCOST[zone][1])
const ANIMALCOST=[,,[309,1000/19],[419,320],[529,320],[1599,2600/3],,,,,,[999,1000],[789,320],,,[2400,1200],,,]; // task_new_building
// sizes of Farmis [width,height,left,top] in px , taken from setFarmis()
const FARMISIZE=[,[40,60,-1,-5],[30,40,0,0],[30,40,2,0],[33,45,2,0],[33,45,4,2],[40,65,2,-11],[40,65,-2,-20],[45,60,-2,-14]];
// QUESTS[questType][campaign][nr]=[[[type1,id1,amount1],...],waitdays,points,more]
// more: Array of items:
// [0,money]
// [1,type of gained product,id of gained product,amount]
// [2,number of accessed rack]
// [3,number of accessed farm]
// [4,type of product,id of product,minutes this product grows faster]]
// [5,number of additional farmis ('<img src=GFX+"adbonus.gif" style="border:0;height:15px;">')]
// [6,Erhoehung der Lagerkapazitaet Staemme um x]
// [7,Giessbonus x%]
// [8,id of accessed zone]
// [9,type of accessed product,id of accessed product]
// [10] access to watering of forest
// [11,number of additional farmi slots]
// [12,id of gained farmhouse item]
// [13,id of gained gift]
// task_new_quest:
const QUESTS = {"main":{"1":[,[[[0,17,43],[0,9,1]],1,142,[[0,54]]],[[[0,1,173],[0,9,2]],1,348,[[0,145]]],[[[0,18,192],[0,17,288]],1,255,[[0,73]]],[[[0,18,672],[0,9,10]],1,1883,[[0,608]]],[[[0,17,922],[0,9,19]],1,2304,[[0,890]]],[[[0,20,360],[0,18,960]],1,3300],[[[0,19,540],[0,20,720]],1,6413],[[[0,2,240],[0,21,245]],1,2895],[[[0,20,1440],[0,9,24]],1,11700,[[1,0,47,1]]],[[[0,21,1152],[0,9,48]],1,16200],[[[0,9,72],[0,22,1037]],1,16202],[[[0,20,3456],[0,10,27]],1,25476],[[[0,18,8064],[0,10,48]],1,15660],[[[0,23,3110],[0,9,144]],1,57240],[[[0,10,96],[0,9,180]],1,33930,[[1,0,59,1]]],[[[0,9,240],[0,6,1836]],1,62190],[[[0,10,384],[0,9,144]],1,70920],[[[0,10,192],[0,23,6739]],1,116280,[[2,2]]],[[[0,22,7518],[0,9,216]],1,108956],[[[0,11,150],[[0,10,272],[0,110,112]]],1,34650],[[[0,7,1350],[0,12,50]],1,78375,[[1,0,63,1]]],[[[0,23,15552],[0,9,1008]],1,318600],[[[0,29,6552],[0,25,130]],1,373645,[[3,2]]],[[[0,1,51840],[[0,27,55],[0,111,51]]],1,60579],[[[0,11,280],[0,12,210]],1,138705],[[[[0,10,672],[0,110,276]],[0,12,210]],1,169785],[[[0,1,75600],[0,2,25000]],1,42131,[[1,0,90,1]]],[[[0,11,480],[0,12,272]],1,206760],[[[0,9,2688],[[0,10,1024],[0,110,420]]],1,448320],[[[0,12,320],[0,11,560]],1,242160],[[[0,29,14742],[[0,27,194],[0,111,180]]],1,836328,[[2,3]]],[[[0,20,77760],[0,12,383]],1,620831,[[1,0,78,1]]],[[[0,12,540],[0,32,14600]],1,449550],[[[0,32,50400],[0,25,432]],1,1208880],[[[[0,10,1760],[0,110,722]],[0,11,1000]],1,481800,[[3,3]]],[[[0,9,4800],[0,12,595]],1,749738],[[[0,26,46550],[[0,27,216],[0,111,201]]],1,933756,[[1,0,77,1]]],[[[0,1,259200],[0,30,216]],1,252960],[[[0,23,51840],[0,28,230]],1,856800],[[[0,9,5280],[[0,10,1795],[0,110,736]]],1,849816],[[[0,25,475],[0,30,238]],1,1665576,[[1,0,80,1]]],[[[0,34,64152],[0,28,253]],1,1704780],[[[0,11,1320],[0,12,880]],1,615120],[[[[0,27,238],[0,111,221]],[0,24,30294]],1,576923,[[1,0,76,1]]],[[[[0,10,2304],[0,110,945]],[0,30,259]],1,538272],[[[0,9,5760],[[0,10,2304],[0,110,945]]],1,976320],[[[0,37,13800],[0,25,518]],1,5559806,[[1,0,61,1]]],[[[0,9,5760],[[0,10,1958],[0,110,803]]],1,927072],[[[0,28,276],[0,30,259]],1,417312],[[[0,12,1040],[0,30,281]],1,376253,[[1,0,52,1]]],[[[0,20,72000],[0,12,800]],1,732000,[[4,0,23,15]]],[[[0,12,4000],[[0,10,1920],[0,110,787]]],1,1683600],[[[0,23,64800],[0,9,4800]],1,1395000],[[[0,25,432],[0,28,230]],1,373680,[[4,0,24,15]]],[[[0,24,72000],[[0,27,216],[0,111,201]]],1,1135800],[[[0,7,18000],[[0,10,1920],[0,110,787]]],1,1083600],[[[[0,27,216],[0,111,201]],[0,11,1200]],1,423000,[[4,0,31,15]]],[[[0,31,103700],[0,30,216]],1,2965498],[[[0,11,1200],[0,25,432]],1,478080,[[4,0,21,10]]],[[[0,21,57600],[[0,10,1920],[0,110,787]]],1,813600],[[[0,12,800],[[0,27,216],[0,111,201]]],1,427800,[[4,0,29,15]]],[[[0,29,27300],[0,25,432]],1,1506635],[[[0,4,48000],[0,9,4800]],1,855000],[[[0,28,230],[[0,27,216],[0,111,201]]],1,318600,[[4,0,33,15]]],[[[0,33,43200],[0,25,432]],1,1685880,[[5,1]]],[[[0,9,4800],[0,12,800]],1,822000,[[4,0,22,10]]],[[[0,8,18000],[0,28,230]],1,1792800],[[[[0,10,1920],[0,110,787]],[0,11,1200]],1,550800,[[4,0,34,15]]],[[[0,34,64800],[0,30,216]],1,1704960],[[[0,6,10800],[0,28,230]],1,207000],[[[0,11,1200],[[0,10,1920],[0,110,787]]],1,550800,[[4,0,35,20]]],[[[0,35,12950],[[0,27,216],[0,111,201]]],1,932692],[[[0,25,432],[0,11,1200]],1,478080],[[[0,32,72000],[0,12,800]],1,1722000,[[4,0,36,15]]],[[[0,36,24500],[0,9,4800]],1,3235000],[[[[0,27,216],[0,111,201]],[0,30,216]],1,320760,[[4,0,7,10]]],[[[0,26,66500],[0,28,230]],1,1298451],[[[0,12,800],[[0,10,1920],[0,110,787]]],1,555600,[[4,0,37,30]]],[[[0,37,3833],[0,9,4800]],1,2017431],[[[0,28,230],[0,25,432]],1,373680],[[[0,33,43200],[0,12,800]],1,1767000,[[4,0,38,15]]],[[[0,38,108000],[0,30,216]],1,3594960],[[[0,9,4800],[0,28,230]],1,712800,[[4,0,19,5]]],[[[0,5,72000],[[0,10,1920],[0,110,787]]],1,963600],[[[0,30,216],[0,9,4800]],1,714960,[[4,0,39,30]]],[[[0,39,2867],[0,12,800]],1,1834778],[[[[0,10,1920],[0,110,787]],[0,25,432]],1,474480],[[[0,32,72000],[[0,27,216],[0,111,201]]],1,1585800,[[4,0,40,30]]],[[[0,40,2250],[0,12,800]],1,1782000],[[[0,25,432],[0,11,1200]],1,478080,[[4,0,20,10]]],[[[0,3,64000],[0,30,216]],1,374960],[[[[0,27,216],[0,111,201]],[0,11,1200]],1,423000,[[4,0,41,30]]],[[[0,41,1975],[[0,10,1920],[0,110,787]]],1,1819998],[[[0,11,1200],[[0,27,216],[0,111,201]]],1,423000,[[4,0,8,15]]],[[[0,24,72000],[[0,10,1280],[0,110,787]]],1,1172400,[[5,1]]],[[[0,12,800],[0,9,4800]],1,822000,[[4,0,26,15]]],[[[0,36,24500],[0,28,230]],1,2867800],[[[0,31,103700],[[0,10,1920],[0,110,787]]],1,3064138,[[4,0,42,30]]],[[[0,28,230],[0,25,432]],1,373680],[[[0,42,1680],[0,30,216]],1,1693960,[[4,0,33,15]]],[[[0,4,80000],[0,30,210]],2,722800],[[[0,6,48000],[0,12,300]],2,854400],[[[0,1,800000],[0,25,320]],2,998400,[[4,0,32,10]]],[[[0,35,64000],[0,32,12000]],2,1629600],[[[0,26,108000],[0,11,540]],2,1452600],[[[0,39,12000],[0,9,5600]],2,2160000,[[4,0,43,30]]],[[[0,43,10000],[[0,27,600],[0,111,558]]],2,2556000],[[[0,24,184000],[0,25,480]],2,2248000],[[[0,9,10200],[[0,10,24000],[0,110,9840]]],2,2205600],[[[0,23,108000],[0,91,250]],2,1359600,[[12,105]]],[[[0,34,36936],[0,37,10580]],2,1959726],[[[0,29,78624],[0,26,5200]],2,2164176],[[[0,44,2016],[0,28,1600]],2,2059245],[[[[0,10,12000],[0,110,4920]],[0,12,1200]],2,1536000],[[[0,30,840]],2,906800,[[12,123]]],[[[0,40,3240],[0,36,9800]],2,1265312],[[[0,91,750],[0,31,72590]],2,1233972],[[[0,26,113050],[[0,27,600],[0,111,558]]],2,1874430],[[[0,38,7020],[0,42,2352]],2,2134942],[[[0,41,9480],[0,9,28800]],2,1886172,[[5,1]]],[[[0,23,174960],[0,22,98515]],2,2267541],[[[0,8,5040],[0,7,3780]],2,2022804],[[[0,32,27000],[[0,10,24000],[0,110,9840]]],2,2357400],[[[0,39,2580],[0,37,7935]],2,1525641,[[1,0,99,1]]],[[[0,33,51840],[0,35,20720]],2,2464720],[[[0,43,5000],[0,21,146880]],2,2139910],[[[0,31,60664],[0,26,100520]],2,1945541],[[[0,20,100800],[0,9,15360]],2,1216320,[[4,0,44,20]]],[[[[0,10,10080],[0,110,4132]],[0,11,4500]],2,1571400],[[[0,7,18900],[0,38,5400]],2,2239480],[[[0,40,3500],[0,35,12000]],2,1168200],[[[0,91,1000]],2,600000,[[12,137]]],[[[0,44,4400],[0,26,22400]],2,1284560],[[[0,3,280000],[0,31,40000]],2,1328000],[[[0,12,1200],[0,39,3900]],2,1228860],[[[0,7,9800],[0,2,240000]],2,1003320],[[[0,26,60000],[0,1,275000]],2,1031000],[[[0,11,6400]],2,1088000],[[[0,6,14444],[0,33,34000]],2,1158911],[[[[0,27,625],[0,111,581]]],2,1078125],[[[0,38,8600],[0,41,2900]],2,1056220],[[[0,43,4050],[0,7,5250]],2,1133280],[[[0,9,16200]],2,453600,[[5,1]]],[[[0,25,900],[[0,10,5400],[0,110,2214]]],2,990000],[[[0,37,8600]],2,1016520],[[[0,28,300],[[0,10,7500],[0,110,3075]]],2,1050000],[[[0,30,400],[0,42,3600]],2,1096880],[[[0,29,51000],[0,9,3600]],2,1069800],[[[0,91,175],[0,8,18200]],2,1087560],[[[0,36,10300],[0,41,3800]],2,1312700],[[[0,24,90000],[[0,10,800],[0,110,328]]],2,1028000],[[[0,22,95500],[0,1,300000]],2,930300],[[[0,35,13000],[0,32,33000]],2,1176800],[[[0,17,155000],[0,21,99999]],2,1049993],[[[0,38,13000],[[0,27,250],[0,111,232]]],2,1104650],[[[0,37,4444],[0,39,3333]],2,1083225],[[[0,2,122000],[0,21,122000]],2,1146800],[[[0,20,112000],[[0,10,2800],[0,110,1148]]],2,1097600],[[[0,9,1111],[0,26,66000]],2,1142108],[[[0,11,2320],[0,23,72000]],2,1200800],[[[0,19,116000],[0,25,900]],2,976200,[[5,1]]],[[[0,5,220000],[0,12,720]],2,1049600],[[[0,18,240000],[0,6,50000]],2,1028000],[[[0,41,4400],[0,1,150000]],2,1076640],[[[0,40,3250],[0,30,500]],2,1069300],[[[0,29,45000],[0,20,25000]],2,1050000],[[[0,91,840],[0,1,510000]],2,1014000],[[[0,34,45000],[0,12,680]],2,1190400],[[[0,31,425000],[0,43,2800]],2,1048680],[[[[0,10,7500],[0,110,3075]],[0,3,140000]],2,1048000,[[7,5]]]]
                       ,"2":[,[[[0,8,6500],[0,12,300]],,495000],[[[0,34,18600],[0,111,75]],,496298],[[[0,33,5650],[0,30,315]],,498270],[[[0,26,15600],[0,9,11200]],,506380],[[[0,37,2150],[0,12,530]],,508530],[[[0,18,175000],[0,91,505]],,511250],[[[0,108,6350],[0,7,5400]],,505010],[[[0,35,6530],[0,110,950]],,507946],[[[0,24,19150],[0,27,412]],,511190],[[[0,23,33000],[0,25,480]],,518500,[[3,4]]],[[[0,28,366],[0,46,100]],,516000],[[[0,116,460],[0,11,1400]],,523880],[[[0,21,42000],[0,9,8000]],,534800],[[[0,32,15420],[0,10,3630]],,540204],[[[0,7,5000],[0,30,265]],,550550,[[9,0,117],[9,0,123]]],[[[0,116,480],[0,91,777]],,551640],[[[0,19,84000],[0,110,1255]],,554475],[[[0,117,917],[0,18,277000]],,559816],[[[0,12,625],[0,109,42000]],,560400],[[[0,108,12300],[0,116,670]],,559600],[[[0,5,50500],[0,26,32000]],,564800],[[[0,117,490],[0,9,16000]],,569520],[[[0,29,16600],[0,31,24000]],,574600],[[[0,33,18200],[0,11,1800]],,589560],[[[0,4,40450],[0,116,1560]],,594810,[[9,0,118],[9,0,124]]],[[[0,3,110000],[0,12,515]],,599200],[[[0,17,75000],[0,10,6800]],,605000],[[[0,91,700],[0,34,9900]],,610080],[[[0,2,155000],[0,28,305]],,615000],[[[0,37,3800],[0,118,1450]],,617360,[[8,"20"]]],[[[0,1,172350],[0,111,558]],,622350],[[[0,117,1090],[0,36,5800]],,625320],[[[0,12,900],[0,25,310]],,624400],[[[0,31,38380],[0,118,1800]],,623304],[[[0,38,9200],[0,116,840]],,623304,[[9,0,119],[9,0,125]]],[[[0,65,10],[0,27,680]],,623333],[[[0,36,7500],[0,9,8000]],,627000],[[[0,6,13150],[0,110,2214]],,626620],[[[0,37,2415],[0,11,2000]],,625453],[[[0,119,735],[0,30,360]],,626280],[[[0,21,19000],[0,10,6120]],,630200],[[[0,33,14400],[0,35,4750]],,634970],[[[0,38,8200],[0,111,116]],,640341],[[[0,73,30],[0,28,600]],,650000],[[[0,42,2980],[0,117,430]],,660324,[[9,0,120]]],[[[0,39,2250],[0,12,666]],,696030],[[[0,40,2400],[0,30,286]],,700580],[[[0,41,2200],[0,118,2275]],,702800],[[[0,20,36000],[0,23,38000]],,706400],[[[0,43,1850],[0,120,690]],,709770,[[9,0,121]]],[[[0,108,14000],[0,8,13200]],,715040],[[[0,40,1950],[0,9,14200]],,719600],[[[0,39,1900],[0,116,1540]],,729920],[[[0,27,268],[0,43,1300]],,735580],[[[0,42,2300],[0,109,34850]],,740010],[[[0,112,3300],[0,121,500]],,748000],[[[0,41,2500],[0,111,138]],,754830],[[[0,119,1000],[0,29,22750]],,760250],[[[0,112,3300],[0,22,52300]],,766260],[[[0,32,24799],[0,9,13333]],,766260,[[8,"21"]]],[[[0,113,9100],[0,27,400]],,750000],[[[0,44,1142],[0,144,790]],,755000],[[[0,154,1695],[0,111,210]],,760000],[[[0,24,39500],[0,118,2350]],,765000],[[[0,153,6250],[0,26,22650]],,765000],[[[0,23,39500],[0,28,385]],,770000],[[[0,6,34500],[0,122,37]],,770000],[[[0,32,13400],[0,10,3900]],,775000],[[[0,39,990],[0,38,8400]],,775000],[[[0,144,1150],[0,123,46]],,780000],[[[0,9,7900],[0,151,85]],,780000],[[[0,5,56200],[0,4,41500]],,785000],[[[0,64,15],[0,152,80]],,785000],[[[0,31,28500],[0,91,550]],,790000],[[[0,20,59000],[0,30,720]],,790000,[[8,"22"]]],[[[0,114,15000],[0,29,25000]],,795000],[[[0,120,400],[0,11,4500]],,795000],[[[0,2,150000],[0,6,45000]],,800000],[[[0,40,9000],[0,25,200]],,800000],[[[0,7,28000],[0,30,225]],,805000],[[[0,32,65000],[0,1,190000]],,805000],[[[0,109,125000],[0,108,65000]],,810000],[[[0,22,92000],[0,27,450]],,810000],[[[0,124,1125],[0,21,85000]],,815000],[[[0,36,9500],[0,112,6600]],,815000],[[[0,116,840],[0,24,63000]],,820000],[[[0,26,63000],[0,117,700]],,820000],[[[0,152,120],[0,44,15000]],,825000],[[[0,144,450],[0,113,30000]],,825000],[[[0,125,650],[0,151,550]],,830000,[[8,"23"]]],[[[0,115,1680],[0,10,4200]],,835000],[[[0,154,7500],[0,118,3300]],,840000],[[[0,153,18500],[0,31,22000]],,845000],[[[0,42,2250],[0,110,1450]],,850000],[[[0,43,1500],[0,1,150000]],,855000],[[[0,41,2200],[0,12,1100]],,860000],[[[0,157,550],[0,120,600]],,865000],[[[0,33,14000],[0,35,16500]],,870000],[[[0,21,29500],[0,112,11500]],,875000],[[[0,10,3500],[0,114,18200]],,880000],[[[0,22,32000],[0,123,1250]],,885000],[[[0,30,650],[0,155,350]],,890000],[[[0,91,1050],[0,7,14000]],,895000],[[[0,29,18400],[0,26,21200]],,900000],[[[0,28,650],[0,152,250]],,905000],[[[0,157,320],[0,156,410]],,910000],[[[0,121,1000],[0,9,15000]],,915000],[[[0,44,62000],[0,144,450]],,920000],[[[0,8,18000],[0,12,1350]],,925000],[[[0,113,18000],[0,27,350]],,930000],[[[0,21,42500],[0,122,1850]],,935000],[[[0,22,95000],[0,120,950]],,940000],[[[0,40,5500],[0,41,6800]],,945000],[[[0,116,2500],[0,38,18600]],,950000],[[[0,111,650],[0,119,750]],,955000],[[[0,36,18500],[0,37,12000]],,960000],[[[0,6,32500],[0,117,1450]],,965000],[[[0,34,27500],[0,32,32100]],,970000],[[[0,151,600],[0,11,1200]],,980000],[[[0,125,1000],[0,124,1600]],,985000,[[8,"24"]]]]
                       }
               ,"forestry":{"1":[,[[[0,4,3300],[0,19,4500],[0,24,1400]],,51520],[[[0,5,2600],[0,17,8000],[0,91,50]],,50360],[[[0,6,1250],[0,21,6600],[0,18,7300]],,0,[[1,1,1,5],[8,"forest"],[9,1,1],[9,1,21]]],[[[0,22,1400],[0,7,750]],,48630],[[[0,25,64],[0,3,3200],[1,21,8]],,50800],[[[0,8,650],[0,27,85],[0,4,4800],[0,91,25]],,0,[[8,"sawmill"],[9,1,41],[9,1,42],[9,1,43]]],[[[0,10,420],[0,19,1600]],,39360],[[[0,2,6000],[0,22,2100],[0,21,1800]],,38980],[[[0,24,1800],[1,21,12],[1,41,10]],,0,[[1,1,2,5],[9,1,2],[9,1,22],[9,1,44],[9,1,45],[9,1,46]]],[[[0,3,3200],[0,5,3150],[0,20,1900]],,36200],[[[0,27,40],[0,18,7700]],,39240],[[[0,91,60],[1,22,30],[1,44,12]],,0,[[8,"carpentry"],[9,1,101]]],[[[0,8,300],[0,6,2000]],,39600],[[[0,17,16000],[1,22,30],[1,42,10]],,34520],[[[0,11,90],[1,101,6],[1,22,18]],,0,[[10]]],[[[0,22,800],[0,7,430],[0,2,2200]],,32642],[[[0,10,380]],,30400],[[[0,9,460],[1,41,20]],,0,[[9,1,102]]],[[[0,19,2600],[0,3,3000],[0,18,5400],[0,4,1200]],,31740],[[[0,91,15],[0,26,1700]],,31420],[[[0,25,35],[0,5,2800],[1,102,4]],,0,[[9,1,103]]],[[[0,24,1900],[0,6,1400]],,31060],[[[0,20,1350],[0,23,1250],[0,1,4900]],,30230],[[[0,12,75],[0,21,2500],[1,45,15]],,0,[[1,1,3,5],[9,1,3],[9,1,23],[9,1,47],[9,1,48],[9,1,49]]],[[[0,8,310],[0,9,240]],,31520],[[[0,7,130],[0,6,400],[0,27,30]],,32562],[[[0,3,5400],[1,23,18],[1,103,3]],,0,[[9,1,104]]],[[[0,11,185]],,31450],[[[0,22,1900],[0,91,22],[0,2,2600]],,30940],[[[0,10,110],[1,41,32],[1,101,24]],,0,[[9,1,105]]],[[[0,25,55],[1,46,27]],,35025],[[[0,20,2300],[0,23,1350],[1,43,36]],,34485],[[[0,5,2000],[1,104,12],[1,47,72]],,0,[[9,1,106]]],[[[0,26,2100],[0,8,150]],,36600],[[[0,3,2200],[0,18,4500],[0,19,3000],[0,4,1400],[0,17,2800]],,37520],[[[0,9,600],[1,106,20]],,0,[[9,1,107]]],[[[0,7,700]],,37380],[[[0,29,1400],[0,12,40]],,42000],[[[0,1,45000],[1,107,52],[1,48,18]],,0,[[9,1,108]]],[[[0,5,3000],[0,11,240]],,44400],[[[0,3,5800],[0,9,380],[0,21,2400]],,46970],[[[0,6,1600],[1,102,12],[1,23,48]],,0,[[9,1,109]]],[[[0,25,75]],,48500],[[[0,29,1200],[0,8,1300],[0,17,20000],[0,2,5600],[1,49,24]],,50340,[[5,1]]],[[[0,20,5400],[0,10,100],[1,42,35]],,52325],[[[0,26,450],[0,25,45],[0,9,850]],,52510],[[[0,5,18000],[0,4,3600],[1,109,50]],,0,[[1,1,4,5],[9,1,4],[9,1,24],[9,1,50],[9,1,51],[9,1,52]]],[[[0,11,100],[0,3,9200],[1,45,30],[1,103,18]],,52207],[[[0,91,50],[0,22,3300],[0,18,4000],[1,46,45]],,52953],[[[1,101,40],[1,21,80],[1,48,30]],,0,[[9,1,111]]],[[[0,21,3000],[0,23,1600],[0,6,800]],,51960],[[[0,25,50],[0,24,2200],[1,43,60]],,53008],[[[1,104,70],[1,107,55],[1,24,60]],,0,[[9,1,112]]],[[[0,8,500],[0,7,450]],,50730],[[[0,91,35],[0,2,3500],[0,29,1200],[1,23,30]],,52432],[[[0,11,290],[1,52,30]],,50496,[[5,1]]],[[[0,10,360],[0,9,720],[1,106,100]],,52200],[[[0,27,75],[1,112,15]],,50049,[[11,1]]],[[[0,23,2000],[0,12,60],[1,42,50],[1,102,20]],,53630],[[[1,50,65],[1,47,30],[1,111,50]],,0,[[9,1,110]]],[[[0,109,3500],[0,24,2500],[1,48,30]],,50792],[[[0,11,275],[1,22,60]],,51934],[[[0,10,250],[0,12,100],[1,41,50],[1,23,33]],,0,[[1,1,5,5],[9,1,5],[9,1,25],[9,1,53],[9,1,54],[9,1,55]]],[[[0,9,250],[0,23,4000]],,51800],[[[0,25,90],[0,18,6400],[0,21,1000],[1,44,50]],,55282],[[[0,108,7500],[1,53,15],[1,112,5]],,0,[[9,1,115]]],[[[0,6,500],[0,22,6250]],,48650],[[[0,3,9700],[0,17,30000],[0,5,2200],[1,25,36]],,51590],[[[0,91,50],[1,115,26],[1,101,62]],,0,[[9,1,116]]],[[[0,112,2900],[0,12,80],[1,22,32]],,54505],[[[0,108,3700],[0,11,200]],,51020],[[[0,27,125],[1,115,22]],,0,[[9,1,118]]],[[[0,29,2700],[1,104,27]],,54896],[[[0,10,380],[0,19,5100],[1,50,65],[1,109,8]],,52508],[[[0,91,40],[1,118,10],[1,50,80],[1,107,65]],,0,[[9,1,117],[7,5]]]]
                        ,"2":[,[[[0,111,45],[0,9,380]],,48150],[[[1,21,400]],,,[[6,100]]],[[[0,12,100],[0,5,315]],,49140],[[[1,24,350]],,,[[6,100]]],[[[0,26,3200],[0,9,220],[1,106,30]],,47452],[[[1,22,450]],,,[[6,100]]],[[[0,11,150],[1,111,35]],,51945],[[[1,21,600],[1,41,80]],,,[[6,100]]],[[[0,8,555],[1,44,40],[1,45,30]],,46164],[[[0,91,55],[1,23,550]],,,[[6,100]]],[[[1,25,150]],,103843],[[[1,102,22]],,276206],[[[1,115,45]],,145202],[[[1,21,650],[1,22,100]],,,[[6,100]]],[[[1,110,15]],,124977],[[[1,53,120],[1,55,50],[1,54,50]],,,[[9,1,119]]],[[[0,7,5200],[0,6,1200],[0,24,3500]],,103941],[[[1,21,350],[1,22,300]],,,[[6,100]]],[[[0,10,240],[0,27,85],[0,26,2500]],,135945],[[[1,1,125],[1,2,100],[1,3,90],[1,4,70],[1,5,50]],,138279],[[[1,109,30]],,168612],[[[0,144,40],[0,110,100],[0,12,50]],,,[[6,100]]],[[[1,103,20]],,179495],[[[1,53,210],[1,55,160]],,,[[9,1,120]]],[[[1,41,100],[1,48,75],[1,52,50]],,156645],[[[1,25,190]],,,[[6,100]]],[[[0,11,400]],,125956],[[[1,24,220],[1,47,50],[1,43,85]],,114596],[[[1,118,20]],,221544],[[[1,1,250],[1,2,200],[1,3,180],[1,4,140],[1,5,100]],,,[[6,100]]],[[[0,110,100],[0,12,80],[1,41,45],[1,53,40],[1,52,20]],,237672],[[[1,41,100],[1,21,80],[1,43,125],[1,42,75]],,257504],[[[1,46,70],[1,49,50],[1,23,60],[1,25,80]],,273176],[[[0,10,60],[1,118,5],[0,27,100],[0,26,8000]],,288144],[[[1,5,200],[1,4,200],[1,3,200]],,,[[1,1,7,5],[9,1,7],[9,1,26],[9,1,56],[9,1,57],[9,1,58],[9,1,121],[9,1,122],[13,309]]],[[[1,121,20],[1,122,5]],,288473,[[9,1,123]]],[[[1,123,15],[1,56,120]],,313426],[[[0,11,500],[1,111,40],[0,5,8000],[0,1,15000]],, 346934],[[[1,24,200],[1,23,200],[1,53,100],[1,58,50]],,305630],[[[1,54,100],[1,42,150],[1,51,250]],,512943],[[[0,12,200],[1,110,20],[0,6,3000],[0,7,2500]],,382357],[[[1,109,15],[1,107,15],[1,106,4],[1,102,8]],,311131,[[9,1,124]]],[[[1,124,25]],,401729,[[9,1,125]]],[[[1,125,80]],,298927],[[[1,7,250],[1,5,200],[1,1,500]],,,[[1,1,8,5],[9,1,8],[9,1,27],[9,1,59],[9,1,60],[9,1,61],[13,310]]],[[[0,27,80],[0,26,3000],[1,27,80],[1,122,5],[1,121,10]],,337285,[[9,1,126],[9,1,127]]],[[[1,126,20],[1,127,20]],,322536,[[9,1,128],[9,1,129]]],[[[1,128,10],[1,129,5]],,377008,[[9,1,130],[9,1,131]]],[[[1,130,10],[1,131,5]],,390178,[[9,1,132]]],[[[1,132,35],[1,41,400]],,807960]]
                        }
               ,"foodworld":{"1":[,[[[0,2,17000]],2,57800],[[[0,21,2000],[0,23,2500],[0,22,2750]],2,97800],[[[0,3,30000]],2,60000],[[[0,1,10000],[0,20,2500],[0,10,50]],2,36500],[[[0,22,6000]],2,62400],[[[0,4,8000]],2,70400],[[[0,131,40],[0,137,21],[0,140,23]],2,65400],[[[0,24,3000],[0,10,80]],2,70400],[[[0,1,6000],[0,2,4000],[0,5,2500]],2,65000],[[[0,19,2000],[0,109,3500],[0,2,7000]],2,55100],[[[0,11,50],[0,22,2500]],2,41400],[[[0,10,70],[0,110,45],[0,9,100]],2,49000],[[[0,6,2500],[0,21,2000],[0,17,9000]],2,91000],[[[0,20,4500],[0,21,3500],[0,10,30]],2,87600],[[[0,108,1500],[0,109,4000]],2,78500],[[[0,23,2000],[0,26,600],[0,9,150]],2,70660],[[[0,6,2200],[0,22,5000]],2,108320],[[[0,21,4000],[0,26,3500]],2,126000],[[[0,24,1200],[0,10,85],[0,17,20000]],2,42230],[[[0,1,20000],[0,12,35],[0,20,7500]],2,91450,[[8,"foodworld-3"]]]]
                            }
               };
unsafeData.QUESTS=QUESTS.clone();
const INIT_questDataItem = {"nr":0,"time":0,"calcTo":0,"state":0,"given":{}};
const INIT_questData = {"main":{"1":INIT_questDataItem.clone(),"2":INIT_questDataItem.clone()},"forestry":{"1":INIT_questDataItem.clone(),"2":INIT_questDataItem.clone()},"foodworld":{"1":INIT_questDataItem.clone()}};
// state: 0:not available, 1:not activated, 2:active
/*
// Generate PRODUCT_QUEST
var new_PRODUCT_QUEST=[];
for(var type in QUESTS){
    if(!QUESTS.hasOwnProperty(type)){ continue; }
    for(var campaign in QUESTS[type]){
        if(!QUESTS[type].hasOwnProperty(campaign)){ continue; }
        for(var nr=1;nr<QUESTS[type][campaign].length;nr++){
            if(QUESTS[type][campaign][nr][3]){
                for(var i=0;i<QUESTS[type][campaign][nr][3].length;i++){
                    if(QUESTS[type][campaign][nr][3][i][0]==9){
                        if(!new_PRODUCT_QUEST[QUESTS[type][campaign][nr][3][i][1]]){ new_PRODUCT_QUEST[QUESTS[type][campaign][nr][3][i][1]]={}; }
                        new_PRODUCT_QUEST[QUESTS[type][campaign][nr][3][i][1]][QUESTS[type][campaign][nr][3][i][2]] = [type,parseInt(campaign,10),nr];
                    }
                }
            }
        }
    }
}
for(type=0;type<new_PRODUCT_QUEST.length;type++){
    new_PRODUCT_QUEST[type].sortObj();
}
GM_log("new_PRODUCT_QUEST:\n"+implode(new_PRODUCT_QUEST));
*/
const INIT_valMinRack={"v":200,"e":50,"o":10,"z":0,"f1":25,"f2":10,"f3":10,"f4":0,"fw1":10,"fw2":10,"fw3":10};
const LEVEL_POINTS=[0,0,58,2420,6620,15620,27900,58700,101700,163100,211900
                   ,276900,359000,467000,730000,1190000,1750000,2680000,3900000,5660000,7850000
                   ,10590000,15300000,20640000,26020000,37340000,50030000,65160000,85030000,108900000,139150000
                   ,175520000,222430000,276920000,345930000,429330000,535520000,669000000,797010000,927020000,1069440000
                   ,1202920000,1336400000,1469880000,1603360000,1896272000,2220357000,2576977000,2967479000,3393198000,3855457000
                   ,4355565000,4894822000,5474516000,6095926000,6760322000,7468962000,8223098000,9023973000,9872820000,10770866000
                   ,11719330000,12719423000,13772351000,14879311000,16041494000,17260085000,18536263000,19871201000,21266065000,22722017000
                   ,24240212000,25821802000,27467932000,29179741000,30958366000,32804936000,34720579000,36706414000,38763560000,40893128000
                   ,43096227000,45373962000,47727432000,50157733000,52665958000,55253195000,57920530000,60669042000,63499810000,66413907000
                   ,69412404000,72496369000,75666864000,78924952000,82271688000,85708127000,89235321000,92854318000,96566163000,100371897000
                   ]; // task_new_level
const VARIABLES = {
            "USER":{"bargeld":["Cash amount",2],
                    "calcToLodgeCampaign":["Target lodge campaign",5],
                    "calcToLodgeQuest":["Target lodge quest",5],
                    "calcToQuest":["Target quest",3],
                    "changedata":["Data version",1],
                    "clubmemberLog":["Log-data club",1],
                    "contractSave":["Saved contract templates",3],
                    "css_styles":["CSS",3],
                    "farmiLog":["Log-data farmies",1],
                    "farmiOk":["Limit at farmi-log",5],
                    "farmname":["Name of farm",2],
                    "highlight":["Highlighted users",3],
                    "highlightProducts":["Highlighted products",3],
                    "infoPanelFormulas":["Mode",4],
                    "kauf":["Log-data sales",5],
                    "logSales":["Log-data sales",1],
                    "lastContractTo":["Last contract recipient",2],
                    "lastOffer":["Last market offer",2],
                    "levelLog":["Log-data points",1],
                    "lodgeCampaignNr":["Lodge campaign",5],
                    "lodgeQuestData":["Lodge quest data",5],
                    "lodgeQuestNr":["Lodge quest number",5],
                    "lodgeTimeEnd":["Lodge quest time",5],
                    "lotteryCollectForPrize":["Lottery collect data",3],
                    "lotteryLastLot":["Lottery taken time",2],
                    "lotteryLog":["Log-data lottery",1],
                    "marketOffers":["Market offers",5],
                    "ownMarketOffers":["Own market offers",2],
                    "marketOfferTimes":["Market offer times",5],
                    "modeBuildPreise":["Mode",4],
                    "modeBuyNotepad":["Mode",4],
                    "modeLotteryLog":["Mode",5],
                    "modeMarket":["Mode",4],
                    "modeProfittable":["Mode",4],
                    "modeProfittableFeed":["Mode",5],
                    "modeProfittableSterne":["Mode",5],
                    "modeQuestsTable":["Mode",4],
                    "modeStatistic":["Mode",4],
                    "modeStockTable":["Mode",4],
                    "nachrichten":["Messages",1],
                    "nachrichten_doread":["Messages auto-read",5],
                    "nachrichten_doreadState":["Messages auto-read",5],
                    "nachrichten_letzte":["Messages",2],
                    "nachrichten_system":["Messages",5],
                    "nachrichtvorlage":["Message template",3],
                    "notepad":["Notepad",3],
                    "prodBestand":["Product stock",5],
                    "prodBlock":["Blocked products",2],
                    "prodGrowTime":["Product growtime",2],
                    "prodMinRack":["Minimal rackamounts",2],
                    "prodMinRackInit":["Minimal rackamounts",3],
                    "prodRequire":["Recursive needed products",5],
                    "prodStock":["Product stock",2],
                    "prodStockMax":["Product stock limit",2],
                    "prodYield":["Product yield",2],
                    "quest":["Quest number",5],
                    "questState":["Quest state",5],
                    "questTime":["Quest time",5],
                    "questData":["Quest data",2],
                    "raisedEvents":["Raised events",4],
                    "session":["Session",4],
                    "show":["Mode",4],
                    "totalFarmis":["Farmi needings",2],
                    "valAssumeWater":["Option",3],
                    "valAutoCrop":["Option",3],
                    "valAutoWater":["Option",3],
                    "valClickErrorbox":["Option",3],
                    "valContractLogAmount":["Option",3],
                    "valDrag":["Option",3],
                    "valEmptyFieldForestLimit":["Option",5],
                    "valErnte":["Option",5],
                    "valErnteMsg":["Option",3],
                    "valFarmiLimits":["Option",3],
                    "valFarmiMiniInfo":["Option",3],
                    "valGamecursor":["Option",3],
                    "valGiess":["Option",5],
                    "valGiessAnnehm":["Option",5],
                    "valGiessNotw":["Option",5],
                    "valGlobalTimeAdd":["Option",3],
                    "valGlobaltimeShowCroppedZone":["Option",3],
                    "valHotkey":["Option",3],
                    "valJoinPreise":["Option",3],
                    "valKauflimit":["Option",3],
                    "valKauflimitNPC":["Option",3],
                    "valLeereFelderLimit":["Option",5],
                    "valLimitEmptyFields":["Option",3],
                    "valMessageRe":["Option",3],
                    "valMessagesSystemMarkRead":["Option",3],
                    "valMinRack":["Option",3],
                    "valMinRackE":["Option",5],
                    "valMinRackF":["Option",5],
                    "valMinRackP":["Option",5],
                    "valMinRackV":["Option",5],
                    "valMinRackFarmis":["Option",3],
                    "valMinRackForestryFarmis":["Option",3],
                    "valMinRackGrowing":["Option",3],
                    "valMinRackLodgeQuest":["Option",5],
                    "valMinRackMan":["Option",3],
                    "valMinRackPlantsize":["Option",3],
                    "valMinRackQuest":["Option",5],
                    "valMinRackRecursive":["Option",3],
                    "valMoveAnimals":["Option",3],
                    "valMsgFormat":["Option",3],
                    "valNachr":["Option",5],
                    "valPrivNachr":["Option",3],
                    "valProtectMinRack":["Option",3],
                    "valQuicklinks":["Option",3],
                    "valSpoilerZoneUpdate":["Option",5],
                    "valStatistik":["Option",3],
                    "valStatistikNpc":["Option",5],
                    "valStatistikTime":["Option",5],
                    "valVerkaufLimitDown":["Option",3],
                    "valVerkaufLimitUp":["Option",3],
                    "valWaterNeeded":["Option",3],
                    "vertraegeIn":["Contracts received",1],
                    "vertraegeOut":["Contracts sent",1],
                    "vertraegePreise":["Contract prices",3],
                    "zoneAnimals":["Amount of animals",5],
                    "zoneBlock":["Blocked zones",5],
                    "zoneBonus":["Zones bonus",5],
                    "zoneBonusSpecialAmount":["Zone special product",5],
                    "zoneBonusSpecialProduct":["Zone special product",5],
                    "zoneEndProducts":["Zones productions",5],
                    "zoneEndTimes":["Zones endtimes",5],
                    "zoneErnte":["Zones productions",5],
                    "zoneFieldData":["Zones productions",5],
                    "zoneProductionData":["Zones productions",5],
                    "zoneMainprod":["Zones productions",5],
                    "zones":["Zones",2],
                    "zoneTyp":["Zones types",5],
                    "zoneWaterTimes":["Times watering",5]},
          "SERVER":{"buildPreiseShowAll":["Mode",5],
                    "changedata":["Data version",1],
                    "competition":["Competition data",2],
                    "farmNamen":["Farm names",2],
                    "gut":["Product prices",3],
                    "gutBeob":["Product observed prices",2],
                    "npcSaison":["Products saisons",2],
                    "pagedataNachrichtenNew":["Page attributes",4],
                    "pagedataStadtMarktstand":["Page attributes",4],
                    "pagedataVertraegeNew":["Page attributes",4],
                    "pagedataVertraegeOverview":["Page attributes",4],
                    "preisBeob":["Price observation",2],
                    "prodId":["Product names lookup",2],
                    "prodName":["Product names",2],
                    "prodNameSort":["Product names",2],
                    "prodPlantSize":["Plant sizes",2],
                    "prodPoints":["Product points",2],
                    "prodRequire":["Recursive needed products",2],
                    "prodTyp":["Product types",2],
                    "sessionlost":["Page attributes",4],
                    "username":["Username",4],
                    "valNimmBeob":["Option",3]},
         "COUNTRY":{"changedata":["Data version",1],
                    "pagedataLogin":["Page attributes",4],
                    "valServerTimeOffset":["Option",3]},
          "GLOBAL":{"changedata":["Data version",1],
                    "devmode":["Option",3],
                    "devmode_function":["Option",3],
                    "devmode_events":["Option",3],
                    "hotkeymap":["Option",3],
                    "loginbusy":["Page attributes",4],
                    "logindata":["Accounts",3],
                    "tutorial":["Tutorial step",1],
                    "updateCheck":["Script update",5],
                    "valAutoLogin":["Option",3],
                    "valUpdate":["Option",3]}
};
    
var npcSaison = INIT_NPC_SAISON.clone();
var prodName=new Array();
var prodId=new Array();
var recipeNameToId=null; //TODO maybe rename / save as var
var prodTyp=new Array(); //c:coins, v:plant, e:product, u:garbage, z:deco, f:forestry, d:forestry deco
var prodBlock=new Array(); //c:only by club, u:garbage, l:level too low, t:not tradable, f:forestry, q:forestry quest too low
var prodMinRackInit=new Array(); // initial minimal rack amounts
// integer<0 is possible and means something like "product is produced"
// call: unsafeWindow.prodMinRackAddon.add(type,1,"Mill-Queue",20000);
// call: unsafeWindow.prodMinRackAddon.remove(type,1,"Mill-Queue");
var prodMinRackAddon=new Array(new Array(), new Object()); // additional minimal rack data from addons
unsafeWindow.prodMinRackAddon=new Object();
unsafeWindow.prodMinRackAddon.newdata=new Array();
unsafeWindow.prodMinRackAddon.busy=false;
var prodMinRack=new Array(); // + quest amount - field and powerup amounts
var prodNameSort=new Array(); // sorted by type(cveoz)
var prodStock=new Array();
var prodStockMax=new Array();//if not id is undefined then there is no max
var prodPlantSize=new Array();
var prodYield=new Array();
var prodRequire=new Array();
var prodPoints=new Array();
var prodGrowTime=new Array();
var gut=new Array();
var gutBeob=new Array();
var preisBeob=new Array();
var questData;
var css_styles=new Object();
var regMsgMarketsaleContent,regMsgContractsaleContent,regMsgContractsaleList,regMsgFriend;
var valAutoWater, valWaterNeeded, valAssumeWater, valAutoCrop, valErnteMsg, valLimitEmptyFields, valStatistik, valClickErrorbox, valGlobaltimeShowCroppedZone;
var valMoveAnimals, valMinRackMan, valMinRack, valMinRackPlantsize, valMinRackFarmis,valMinRackForestryFarmis, valMinRackGrowing, valMinRackRecursive, valFarmiLimits, valFarmiMiniInfo
var upjersAds, buyNotePadShowBlocked, show;
var farmiLog, farmiDailyCount, levelLog, levelLogId, lotteryLog, lotteryLogId, logSales, logSalesId, logDonkey;
var zoneAddToGlobalTime;
var totalAnimals, totalErnte, totalFarmis, totalPowerups, totalQuest, totalRecursive, totalZones, totalEndtime;
var valKauflimit, valKauflimitNPC, highlightProducts, highlightUser, valNimmBeob, valVerkaufLimitDown, valVerkaufLimitUp, valJoinPreise, lastOffer, protectMinRack, ownMarketOffers;
var valMessagesSystemMarkRead;
var megafieldVehicle;
top.unsafeData.autoAction=null;
var gameLocation=[null,null];
unsafeData.gameLocation=gameLocation.clone();

//***********************************************************************************************************
// developer functions
if(DEVMODE_FUNCTION){ tracking.init("berater"); }

//***********************************************************************************************************
//*********************** FUNCTIONS *************************************************************************
// DOM
function SortableTable (sortRow){
    // Sortable HTML table inspired by http://www.webtoolkit.info/
    // example-call: new SortableTable(x);
    // sorting by value-attribute of td-elements
    // only cols with sortdir-attribute in the thead-cell
    function sortCol(cell){
    try{
        var tableEl=cell;
        while(tableEl.tagName!="TABLE"){ tableEl=tableEl.parentNode; }
        var tbody=tableEl.getElementsByTagName("tbody")[0];
        var sortRow=cell.parentNode;
        var newclass,oldclass,sortdir;
        // clone the rows
        var newRows=new Array();
        for(j=0; j < tbody.rows.length; j++){
            newRows[j]=tbody.rows[j];
        }
        //sort them
        newRows.sort(function(a,b){
            aa=parseFloat(a.cells[cell.cellIndex].getAttribute("value"),10);
            if (isNaN(aa)) aa=0;
            bb=parseFloat(b.cells[cell.cellIndex].getAttribute("value"),10);
            if (isNaN(bb)) bb=0;
            return (aa-bb);
        });
        // set classes of headercells
        if (cell.getAttribute("sortdir") == "Asc"){
            newRows.reverse();
            sortdir="Desc";
        }else{
            sortdir="Asc";
        }
        cell.setAttribute("sortdir",sortdir);
        for(var i=0; i<sortRow.cells.length; i++){
            if(typeof(sortRow.cells[i].getAttribute("sortdir"))=="string"){
                oldclass=sortRow.cells[i].getAttribute("class");
                newclass=oldclass.replace(/sortableCol(.*)\b/,"sortableCol"+(i==cell.cellIndex?sortdir:""));
                if(oldclass!=newclass){ sortRow.cells[i].setAttribute("class",newclass); }
            }
        }
        // rebuild table
        for(i=0;i<newRows.length;i++){
            tbody.appendChild(newRows[i]);
        }
        tableEl=null;tbody=null;sortRow=null;newRows=null;
    }catch(err){ GM_logError("sortCol\n"+sortRow.cells[i].innerHTML+"\n"+err); }
    }
    // constructor actions
    try{
    for(var i=0; i<sortRow.cells.length; i++){
        if(typeof(sortRow.cells[i].getAttribute("sortdir"))=="string"){
            var oldclass=sortRow.cells[i].getAttribute("class");
            sortRow.cells[i].setAttribute("class",(oldclass?oldclass+" ":"")+"sortableCol");
            sortRow.cells[i].addEventListener("click",function (){
                sortCol(this);
                return false;
            },false);
        }
    }
    }catch(err){ GM_logError("SortableTable\n"+err); }
 }
function bar(size,markvalue,maxvalue){
    size=Math.floor(size);
    var mark=Math.floor(size*markvalue/maxvalue);
    var cell=createElement("div",{"style":"border:2px solid black; position:absolute;width:"+size+"px;height:12px;"});
        createElement("div",{"style":"position:absolute;width:"+mark+"px;height:12px;background-color:#5555FF;"},cell);
    return cell;
}
function setSelRange(inputEl, selStart, selEnd){
 if (inputEl.setSelectionRange){
  inputEl.focus();
  inputEl.setSelectionRange(selStart, selEnd);
 }else if (inputEl.createTextRange){
  var range=inputEl.createTextRange();
  range.collapse(true);
  range.moveEnd('character', selEnd);
  range.moveStart('character', selStart);
  range.select();
 }
}

// Strings
function getKeySymbol(keyCode){
    if((46<keyCode)&&(keyCode<91)){ return String.fromCharCode(keyCode); }
    var codelist={"8":"backspace","9":"tab","13":"enter","16":"shift","17":"ctrl","18":"alt","19":"pause/break","20":"caps lock","27":"escape","33":"page up","34":"page down","35":"end","36":"home","37":"<-","38":"up arrow","39":"->","40":"down arrow","45":"insert","46":"delete","91":"left window key","92":"right window key","93":"select key","96":"numpad 0","97":"numpad 1","98":"numpad 2","99":"numpad 3","100":"numpad 4","101":"numpad 5","102":"numpad 6","103":"numpad 7","104":"numpad 8","105":"numpad 9","106":"*","107":"+","109":"-","110":"decimal point","111":"divide","112":"F1","113":"F2","114":"F3","115":"F4","116":"F5","117":"F6","118":"F7","119":"F8","120":"F9","121":"F10","122":"F11","123":"F12","144":"num lock","145":"scroll lock","186":"semi-colon","187":"equal sign","188":",","189":"dash","190":"period","191":"forward slash","192":"grave accent","219":"open bracket","220":"back slash","221":"close braket","222":"single quote"};
    return codelist[keyCode]?codelist[keyCode]:"key("+keyCode+")";
}

// Game
function igm(name,append,betreff){
try{
    var link=createElement("span",{"to":name,"subject":(betreff?betreff:""),"class":"link playerMsg"});
    createElement("div",{},link);
    link.addEventListener("click",function(){
    try{
        if(unsafeWindow.messages_write_block == 1){
            unsafeWindow.showDiv("messages_view_info");
            unsafeWindow.hideDiv("messages_view_form");
        }else{
            unsafeWindow.hideDiv("messages_view_info");
            unsafeWindow.showDiv("messages_view_form");
        }
        $("messages_view_name").value = this.getAttribute("to");
        $("messages_view_subject").value = this.getAttribute("subject");
        $("messages_view_body").value = "";
        unsafeWindow.hideDiv("messages_list");
        unsafeWindow.hideDiv("messages_contacts");
        unsafeWindow.showDiv("messages_view");
        unsafeWindow.messagesNavi("new");
        unsafeWindow.messagesCalcBody();
    }catch(err){GM_logError("igm.click\n"+err);}
    },false);
    link.addEventListener("mouseover",function(event){
        toolTip.show(event,getText("writeMessage"),this);
    },false);
    if (append){ append.appendChild(link); }
    return link;
}catch(err){GM_logError("igm\n"+err);}
}
function vertrag(name,append){
    var link=createElement("span",{"to":name,"class":"link playerContract"});
    createElement("div",{},link);
    link.addEventListener("click",function(){
        var pagedata=new Object();
        pagedata["to"]=this.getAttribute("to");
        window.setTimeout(function(){
            GM_setValue(COUNTRY+"_"+SERVER+"_pagedataVertraegeNew",implode(pagedata));
            if($top("multiframe")){
                toolTip.hide(this);
                $top("multiframe").src="../vertraege/new.php";
                $top("multiframe").style.display="block";
            }else{
                window.open("../vertraege/new.php");
            }
        },0);
    },false);
    link.addEventListener("mouseover",function(event){
        toolTip.show(event,getText("sendContract"));
    },false);
    if (append) append.appendChild(link);
    return link;
}
function stats(name,append){
    var link=createElement("span", {"mouseOverText":getText("statistics"),"class":"link playerStats","href":"../stadt/stats.php?search=1&searchterm="+name});
    createElement("div",{},link);
    if($top("shop")){
        link.addEventListener("click",function(){
            toolTip.hide(this);
            showShopframePage(this.getAttribute("href"));
        },false);
    }else{
        link.addEventListener("click",function(){location.href=this.getAttribute("href");},false);
    }
    link.addEventListener("mouseover",function(event){
        toolTip.show(event,this.getAttribute("mouseOverText"),this);
    },false);
    if (append) append.appendChild(link);
    return link;
}

function loadProductData(){
    try{
    if(DEVMODE_FUNCTION){ var trackingHandle = tracking.start("berater","loadProductData"); }
        gut=explode(GM_getValue(COUNTRY+"_"+SERVER+"_gut"),"loadProductData/gut",[]);
        gutBeob=explode(GM_getValue(COUNTRY+"_"+SERVER+"_gutBeob"),"loadProductData/gutBeob",[]);
        preisBeob=explode(GM_getValue(COUNTRY+"_"+SERVER+"_preisBeob"),"loadProductData/preisBeob",[]); //isNotSent,time,min,max,amount 
        prodName=explode(GM_getValue(COUNTRY+"_"+SERVER+"_prodName"),"loadProductData/prodName",[]);
        prodId=explode(GM_getValue(COUNTRY+"_"+SERVER+"_prodId"),"loadProductData/prodId",[]);
        prodPlantSize=explode(GM_getValue(COUNTRY+"_"+SERVER+"_prodPlantSize"),"loadProductData/err/prodPlantSize",[]);
        prodStock=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodStock"),"loadProductData/prodStock",[]);
        prodStockMax=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodStockMax"),"loadProductData/prodStockMax",[]);
        prodYield=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodYield"),"loadProductData/prodYield",[]);
        prodRequire=explode(GM_getValue(COUNTRY+"_"+SERVER+"_prodRequire"),"loadProductData/prodRequire",[]);
        prodTyp=explode(GM_getValue(COUNTRY+"_"+SERVER+"_prodTyp"),"loadProductData/prodTyp",[]);//c:coins, v:plant, e:product, u:garbage, z:deco, f:forestry, r:recipe
        prodGrowTime=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodGrowTime"),"loadProductData/prodGrowTime",[]);
        prodPoints=explode(GM_getValue(COUNTRY+"_"+SERVER+"_prodPoints"),"loadProductData/prodPoints",[]);
        prodNameSort=explode(GM_getValue(COUNTRY+"_"+SERVER+"_prodNameSort"),"loadProductData/err/prodNameSort",[]);
        prodBlock=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodBlock"),"loadProductData/err/prodBlock",[]);
        prodMinRackInit=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodMinRackInit"),"loadProductData/err/prodMinRackInit",[]);
        prodMinRack=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodMinRack"),"loadProductData/err/prodMinRack",[]);
    if(DEVMODE_FUNCTION){ tracking.end("berater",trackingHandle); }
    }catch(err){ GM_logError("loadProductData\n"+err); }
}
function updateProductDataFarm(){
    try{
    if(DEVMODE_FUNCTION){ var trackingHandle = tracking.start("berater","updateProductDataFarm"); }
        if(USERLEVEL<parseInt(unsafeWindow.currentuserlevel,10)){
            raiseEvent("gameUserlevelUp");
        }
        USERLEVEL=parseInt(unsafeWindow.currentuserlevel,10);
        if(!(prodName instanceof Array)){ prodName=[]; }
        if(!(prodId instanceof Array)){ prodId=[]; }
        if(!(prodPlantSize instanceof Array)){ prodPlantSize=[]; }
        if(!(prodStock instanceof Array)){ prodStock=[]; }
        if(!(prodStockMax instanceof Array)){ prodStockMax=[]; }
        if(!(prodYield instanceof Array)){ prodYield=[]; }
        if(!(prodRequire instanceof Array)){ prodRequire=[]; }
        if(!(prodTyp instanceof Array)){ prodTyp=[]; }
        if(!(prodGrowTime instanceof Array)){ prodGrowTime=[]; }
        if(!(prodPoints instanceof Array)){ prodPoints=[]; }
        if(!(prodNameSort instanceof Array)){ prodNameSort=[]; }
        if(!(prodBlock instanceof Array)){ prodBlock=[]; }
 
        if(!prodName[0]||!(prodName[0] instanceof Array)){ prodName[0]=[]; } 
        if(!prodId[0]||(typeof prodId[0]!="object")||(prodId[0] instanceof Array)){ prodId[0]={}; } 
        if(!prodPlantSize[0]||!(prodPlantSize[0] instanceof Array)){ prodPlantSize[0]=[]; } 
        if(!prodStock[0]||!(prodStock[0] instanceof Array)){ prodStock[0]=[]; } 
        if(!prodStockMax[0]||!(prodStockMax[0] instanceof Array)){ prodStockMax[0]=[]; } 
        if(!prodYield[0]||!(prodYield[0] instanceof Array)){ prodYield[0]=[]; } 
        if(!prodRequire[0]||!(prodRequire[0] instanceof Array)){ prodRequire[0]=[]; } 
        if(!prodTyp[0]||!(prodTyp[0] instanceof Array)){ prodTyp[0]=[]; } 
        if(!prodGrowTime[0]||!(prodGrowTime[0] instanceof Array)){ prodGrowTime[0]=[]; } 
        if(!prodPoints[0]||!(prodPoints[0] instanceof Array)){ prodPoints[0]=[]; } 
        // if(!prodBlock[0]||!(prodBlock[0] instanceof Array)){ prodBlock[0]=[]; } 
        
        //c:only by club, u:garbage, l:level too low, t:not tradable, f:forestry, q:forestry quest too low, r:recipe, p:powerup, b:block recipe/powerup
        prodBlock[0]=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","ct","","ct","","ct","ct","","ct","","","","","","","","","","ct","ct","ct","ct","ct","ct","ct","","","","","","","ct","","ct","","","ct","","","ct","ct","ct","","","","","","","","t","","","","","","","t","","t","t","","","","","","","","","","","","","","","","","","","","","","t","","","","","","","","","","","","","","","","","","","","","","","","","","","","","t","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","ut","ut",,,,,,,,,,,"","","","","","","","","","","","","","","t","t","t","t","t","t","t","t"]; // task_new_plant task_new_product
         /*
        var new_prodBlock=prodBlock[0].clone();
        new_prodBlock[221]="";
        GM_log(implode(new_prodBlock));
        */
        var help={"v":[],"e":[],"o":[],"fw1":[],"fw2":[],"fw3":[],"fw4":[],"z":[],"fl":[],"fla":[]};
        // for(var v=1;v<unsafeWindow.produkt_name.length;v++){
        for(var v in unsafeWindow.produkt_name){
            if(!unsafeWindow.produkt_name.hasOwnProperty(v)){continue;}
            if(isNaN(gut[v])){ gut[v]=0; }
            prodName[0][v]=unsafeWindow.produkt_name[v];
            prodId[0][prodName[0][v]]=v;
            prodPlantSize[0][v]=unsafeWindow.produkt_x[v]*unsafeWindow.produkt_y[v];
            var c=(unsafeWindow.rackElement[v]&&unsafeWindow.rackElement[v].number)?unsafeWindow.rackElement[v].number:0;
            prodStock[0][v]=(c?parseInt(c,10):0);
            prodYield[0][v]=(unsafeWindow.produkt_ernte[v]?parseInt(unsafeWindow.produkt_ernte[v],10):0);
            prodTyp[0][v]=unsafeWindow.produkt_category[v];
            prodRequire[0][v]=PRODUCT_REQUIRE[0][v];
            prodGrowTime[0][v]=PRODUCT_GROWTIME[0][v]; //TODO take from game?
            prodPoints[0][v]=PRODUCT_POINTS[0][v]; //TODO take from game?
            if(prodTyp[0][v]=="u"){
                prodBlock[0][v]="ut";
            }else{
                if(typeof prodBlock[0][v]=="undefined"){
                    prodBlock[0][v]="t";
                }
                // Hack: split picnic products in different categories
                if(prodTyp[0][v]=="fw"){ // task_new_picnic_product
                    switch(parseInt(v,10)){
                    case 130:case 131:case 132:case 133:case 134:case 135:case 145:case 146:case 147:
                        prodTyp[0][v]+="1"; break;
                    case 136:case 137:case 138:case 139:case 140:case 141:case 142:case 143:case 148:case 149:case 150:
                        prodTyp[0][v]+="2"; break;
                    case 161:case 162:case 163:case 164:case 165:case 166:case 167:case 168:case 169:case 170:
                        prodTyp[0][v]+="3"; break;
                    default: prodTyp[0][v]+="4";
                    }
                }
                if(help[prodTyp[0][v]]){
                    help[prodTyp[0][v]].push(v);
                }
                if(USERLEVEL<unsafeWindow.produkt_level[v]){
                    prodBlock[0][v]+="l"+unsafeWindow.produkt_level[v];
                }
                if(PRODUCT_QUEST[0][v]&&(questData[PRODUCT_QUEST[0][v][0]][PRODUCT_QUEST[0][v][1]]["nr"]<=PRODUCT_QUEST[0][v][2])){
                    prodBlock[0][v]+="q";
                }
            }
        }
        prodTyp[0][0]="c";
        try{ prodStock[0][0]=parseInt($("coins").innerHTML,10); }catch(err){}
        prodNameSort[0]=[0].concat(help["v"],help["e"],help["o"],help["fw1"],help["fw2"],help["fw3"],help["fw4"],help["fl"],help["fla"],help["z"]);
        // quest boni
        for(var v=1;v<questData["main"]["1"]["nr"];v++){
            if(QUESTS["main"]["1"][v]&&QUESTS["main"]["1"][v][3]){
                for(var w=0;w<QUESTS["main"]["1"][v][3].length;w++){
                    if(QUESTS["main"]["1"][v][3][w][0]==4){
                        prodGrowTime[QUESTS["main"]["1"][v][3][w][1]][QUESTS["main"]["1"][v][3][w][2]]-=QUESTS["main"]["1"][v][3][w][3];
                    }
                }
            }
        }
        publishProductData();
    if(DEVMODE_FUNCTION){ tracking.end("berater",trackingHandle); }
    }catch(err){
        GM_logError("updateProductDataFarm\n"+err);
        loadProductData();
    }
}
function updateProductDataForestry(){
    try{
    if(DEVMODE_FUNCTION){ var trackingHandle = tracking.start("berater","updateProductDataForestry"); }
        prodName[1]={};
        if(!prodId[1]||(typeof prodId[1]!="object")||(prodId[1] instanceof Array)){ prodId[1]={}; } 
        if(!prodPlantSize[1]||(typeof prodPlantSize[1]!="object")||(prodPlantSize[1] instanceof Array)){ prodPlantSize[1]={}; } 
        if(!prodStock[1]||(typeof prodStock[1]!="object")||(prodStock[1] instanceof Array)){ prodStock[1]={}; } 
        if(!prodStockMax[1]||(typeof prodStockMax[1]!="object")||(prodStockMax[1] instanceof Array)){ prodStockMax[1]={}; } 
        if(!prodYield[1]||(typeof prodYield[1]!="object")||(prodYield[1] instanceof Array)){ prodYield[1]={}; } 
        if(!prodRequire[1]||(typeof prodRequire[1]!="object")||(prodRequire[1] instanceof Array)){ prodRequire[1]={}; } 
        if(!prodTyp[1]||(typeof prodTyp[1]!="object")||(prodTyp[1] instanceof Array)){ prodTyp[1]={}; } 
        if(!prodGrowTime[1]||(typeof prodGrowTime[1]!="object")||(prodGrowTime[1] instanceof Array)){ prodGrowTime[1]={}; } 
        if(!prodPoints[1]||(typeof prodPoints[1]!="object")||(prodPoints[1] instanceof Array)){ prodPoints[1]={}; } 
        if(!prodNameSort[1]||!(prodNameSort[1] instanceof Array)){ prodNameSort[1]=[]; } 
        if(!prodBlock[1]||(typeof prodBlock[1]!="object")||(prodBlock[1] instanceof Array)){ prodBlock[1]={}; } 
 
        var help={"f1":[],"f2":[],"f3":[],"f4":[],"f5":[]};
        for(var v in unsafeWindow.produkt_name_forestry){
            if(!unsafeWindow.produkt_name_forestry.hasOwnProperty(v)){continue;}    
            prodName[1][v]=unsafeWindow.produkt_name_forestry[v];
            prodId[1][prodName[1][v]]=v;
            prodPlantSize[1][v]=1;
            // prodStock
            // prodStockMax
            prodYield[1][v]=PRODUCT_YIELD[1][v];
            if((v==105)||(v==108)||(v==116)||(v==117)||(v==119)||(v==120)){ prodTyp[1][v]="f5"; } // farmhouse-items from carpentry
            else if(v<20){ prodTyp[1][v]="f1"; } // saplings
            else if(v<40){ prodTyp[1][v]="f2"; } // logs
            else if(v<100){ prodTyp[1][v]="f3"; } // sawmill-products
            else if(v<500){ prodTyp[1][v]="f4"; } // carpentry-products
            else { prodTyp[1][v]="u"; } // useless "products"
            prodRequire[1][v]=PRODUCT_REQUIRE[1][v];
            prodGrowTime[1][v]=PRODUCT_GROWTIME[1][v];
            prodPoints[1][v]=PRODUCT_POINTS[1][v];
            
            if(prodTyp[1][v]=="u"){
                prodBlock[1][v]="qtu";
            }else{
                prodBlock[1][v]="t";
                if((unsafeWindow.forestry_unlock==undefined)||(PRODUCT_QUEST[1][v]&&(questData[PRODUCT_QUEST[1][v][0]][PRODUCT_QUEST[1][v][1]]["nr"]<=PRODUCT_QUEST[1][v][2]))){
                    prodBlock[1][v]+="q";
                }
                if(v==113||v==114){ prodBlock[1][v]+="s"; } 
                if(help[prodTyp[1][v]]){
                    help[prodTyp[1][v]].push(v);
                }
            }
        }
        prodNameSort[1]=help["f1"].concat(help["f2"],help["f3"],help["f4"],help["f5"]);
        // prodName[1].sortObj();
        publishProductData();
    if(DEVMODE_FUNCTION){ tracking.end("berater",trackingHandle); }
    }catch(err){ GM_logError("updateProductDataForestry\n"+err); }
}
function updateProductDataWindmill(){
    try{
    if(DEVMODE_FUNCTION){ var trackingHandle = tracking.start("berater","updateProductDataWindmill"); }
        if(!prodName[2]||!(prodName[2] instanceof Array)){ prodName[2]=[]; } 
        if(!prodId[2]||(typeof prodId[2]!="object")||(prodId[2] instanceof Array)){ prodId[2]={}; } 
        if(!prodPlantSize[2]||!(prodPlantSize[2] instanceof Array)){ prodPlantSize[2]=[]; } 
        if(!prodStock[2]||!(prodStock[2] instanceof Array)){ prodStock[2]=[]; } 
        if(!prodStockMax[2]||!(prodStockMax[2] instanceof Array)){ prodStockMax[2]=[]; } 
        // if(!prodYield[2]||!(prodYield[2] instanceof Array)){ prodYield[2]=[]; } 
        // if(!prodRequire[2]||!(prodRequire[2] instanceof Array)){ prodRequire[2]=[]; } 
        if(!prodTyp[2]||!(prodTyp[2] instanceof Array)){ prodTyp[2]=[]; } 
        // if(!prodGrowTime[2]||!(prodGrowTime[2] instanceof Array)){ prodGrowTime[2]=[]; } 
        // if(!prodPoints[2]||!(prodPoints[2] instanceof Array)){ prodPoints[2]=[]; } 
        if(!prodBlock[2]||!(prodBlock[2] instanceof Array)){ prodBlock[2]=[]; } 

        prodYield[2]=[];
        prodRequire[2]=[];
        prodGrowTime[2]=[];
        prodPoints[2]=[];
        // GM_log("formulas:\n"+print_r(unsafeWindow.formulas,"",true,"\n"));
        for(var v in unsafeWindow.formulas[0]){
            if(!unsafeWindow.formulas[0].hasOwnProperty(v)){continue;}
            pId=unsafeWindow.formulas[0][v][0];
            // GM_log("updateProductDataWindmill loop formulas v="+v+" pId="+pId);
            prodName[2][pId]="*"+unsafeWindow.formulas[0][v][2];
            prodId[2]["*"+unsafeWindow.formulas[0][v][2]]=pId;
            prodId[2][unsafeWindow.formulas[0][v][2]]=pId;
            prodPlantSize[2][pId]=1;
            if(!prodStock[2][pId]||(typeof prodStock[2][pId]!="number")){ prodStock[2][pId]=0; }
            //1=earn prods,2=earn extra amount,3=earn extra score
            if(unsafeWindow.formulas[0][v][5][0]!=0){ prodTyp[2][pId]="r0"; }
            else if(unsafeWindow.formulas[0][v][5][1]!=0){ prodTyp[2][pId]="r1"; }
            else if(unsafeWindow.formulas[0][v][5][2]!=0){ prodTyp[2][pId]="r2" }
            prodBlock[2][pId]="rt"+(USERLEVEL<unsafeWindow.formulas[0][v][1]?"l":"")+(unsafeWindow.formulas[0][v]["endremain"]<0?"s":"");
        }
        // prodTyp[2].sortObj();
        var help={"r0":[],"r1":[],"r2":[]};
        for(var v in prodTyp[2]){
            if(!prodTyp[2].hasOwnProperty(v)){continue;}
            if(help[prodTyp[2][v]]){ help[prodTyp[2][v]].push(v); }
        }
        prodNameSort[2]=help["r0"].concat(help["r1"],help["r2"]);
        publishProductData();
    if(DEVMODE_FUNCTION){ tracking.end("berater",trackingHandle); }
    }catch(err){ GM_logError("updateProductDataWindmill\n"+err); }
}
function updateProductDataPowerup(){
    try{
    if(DEVMODE_FUNCTION){ var trackingHandle = tracking.start("berater","updateProductDataPowerup"); }
        if(!prodName[3]||!(prodName[3] instanceof Array)){ prodName[3]=[]; } 
        if(!prodId[3]||(typeof prodId[3]!="object")||(prodId[3] instanceof Array)){ prodId[3]={}; } 
        if(!prodPlantSize[3]||!(prodPlantSize[3] instanceof Array)){ prodPlantSize[3]=[]; } 
        if(!prodStock[3]||!(prodStock[3] instanceof Array)){ prodStock[3]=[]; } 
        if(!prodStockMax[3]||!(prodStockMax[3] instanceof Array)){ prodStockMax[3]=[]; } 
        if(!prodYield[3]||!(prodYield[3] instanceof Array)){ prodYield[3]=[]; } 
        if(!prodRequire[3]||!(prodRequire[3] instanceof Array)){ prodRequire[3]=[]; } 
        if(!prodTyp[3]||!(prodTyp[3] instanceof Array)){ prodTyp[3]=[]; } 
        if(!prodGrowTime[3]||!(prodGrowTime[3] instanceof Array)){ prodGrowTime[3]=[]; } 
        if(!prodPoints[3]||!(prodPoints[3] instanceof Array)){ prodPoints[3]=[]; } 
        if(!prodBlock[3]||!(prodBlock[3] instanceof Array)){ prodBlock[3]=[]; } 
    
        var pId;
        for(var v in unsafeWindow.formulas[0]){
            if(!unsafeWindow.formulas[0].hasOwnProperty(v)){continue;}
            pId=unsafeWindow.formulas[0][v][0];
            // GM_log("updateProductDataPowerup loop formulas v="+v+" pId="+pId);
            prodName[3][pId]=unsafeWindow.formulas[0][v][2];
            prodPlantSize[2][pId]=1;
            prodStock[3][pId]=0;
            prodYield[3][pId]=1;
            prodRequire[3][pId]=[[2,pId,1]];
            for(var i=0;i<unsafeWindow.formulas[0][v][3].length;i++){
                prodRequire[3][pId].push([0,unsafeWindow.formulas[0][v][3][i][0],unsafeWindow.formulas[0][v][3][i][1]]);
            }
            //1=earn prods,2=earn extra amount,3=earn extra score
            if(unsafeWindow.formulas[0][v][5][0]!=0){ prodTyp[3][pId]="p0"; }
            else if(unsafeWindow.formulas[0][v][5][1]!=0){ prodTyp[3][pId]="p1"; }
            else if(unsafeWindow.formulas[0][v][5][2]!=0){ prodTyp[3][pId]="p2"; }
            prodGrowTime[3][pId]=Math.round(unsafeWindow.formulas[0][v][4]/60);
            prodPoints[3][pId]=unsafeWindow.formulas[0][v][8];
            prodBlock[3][pId]="pt"+(USERLEVEL<unsafeWindow.formulas[0][v][1]?"l":"");
        }
        if (unsafeWindow.poweruprack == null) unsafeWindow.poweruprack = 0;
        for(var v in unsafeWindow.poweruprack){
            if(!unsafeWindow.poweruprack.hasOwnProperty(v)){continue;}
            pId=unsafeWindow.poweruprack[v][0];
            // GM_log("updateProductDataPowerup loop poweruprack v="+v+" pId="+pId);
            prodName[3][pId]=unsafeWindow.poweruprack[v][2];
            prodStock[3][pId]=unsafeWindow.poweruprack[v]["rack"];
            if(unsafeWindow.poweruprack[v]["endremain"]<0){ prodBlock[3][pId]+="s"; }
        }
        for(var v=0;v<prodName[3].length;v++){
            prodId[3][prodName[3][v]]=v;
        }
        // prodTyp[3].sortObj();
        var help={"p0":[],"p1":[],"p2":[]};
        for(var v in prodTyp[3]){
            if(!prodTyp[3].hasOwnProperty(v)){continue;}
            if(help[prodTyp[3][v]]){ help[prodTyp[3][v]].push(v); }
        }
        prodNameSort[3]=help["p0"].concat(help["p1"],help["p2"]);
        publishProductData();
    if(DEVMODE_FUNCTION){ tracking.end("berater",trackingHandle); }
    }catch(err){ GM_logError("updateProductDataPowerup\n"+err); }
}
function publishProductData(){
    window.setTimeout(function(){
    try{
    if(DEVMODE_FUNCTION){ var trackingHandle = tracking.start("berater","publishProductData"); }
        top.unsafeData.prodName     =prodName.clone();
        top.unsafeData.prodNameSort =prodNameSort.clone();
        top.unsafeData.prodTyp      =prodTyp.clone();
        top.unsafeData.prodBlock    =prodBlock.clone();
        top.unsafeData.prodYield    =prodYield.clone();
        top.unsafeData.prodRequire  =prodRequire.clone();
        top.unsafeData.prodStock    =prodStock.clone();
        top.unsafeData.prodStockMax =prodStockMax.clone();
        top.unsafeData.prodGrowTime =prodGrowTime.clone();
        top.unsafeData.prodPlantSize=prodPlantSize.clone();
        top.unsafeData.prodPoints   =prodPoints.clone();
        top.unsafeData.prodId       =prodId.clone();
        top.unsafeData.gut          =gut.clone();
        top.unsafeData.preisBeob    =explode(GM_getValue(COUNTRY+"_"+SERVER+"_preisBeob","[]"),"publishProductData/preisBeob",[]).clone();
    if(DEVMODE_FUNCTION){ tracking.end("berater",trackingHandle); }
    }catch(err){ GM_logError("publishProductData\n"+err); }
    },0);
}
function saveProductData(){
    try{
    if(DEVMODE_FUNCTION){ var trackingHandle = tracking.start("berater","saveProductData"); }
        GM_setValue(COUNTRY+"_"+SERVER+"_prodName",implode(prodName,"saveProductData\prodName"));
        GM_setValue(COUNTRY+"_"+SERVER+"_prodNameSort",implode(prodNameSort,"saveProductData\prodNameSort"));
        GM_setValue(COUNTRY+"_"+SERVER+"_prodId",implode(prodId,"saveProductData\prodId"));
        GM_setValue(COUNTRY+"_"+SERVER+"_prodPoints",implode(prodPoints,"saveProductData\prodPoints"));
        GM_setValue(COUNTRY+"_"+SERVER+"_prodPlantSize",implode(prodPlantSize,"saveProductData\prodPlantSize"));
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodStock",implode(prodStock,"saveProductData\prodStock"));
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodStockMax",implode(prodStockMax,"saveProductData\prodStockMax"));
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodYield",implode(prodYield,"saveProductData\prodYield"));
        GM_setValue(COUNTRY+"_"+SERVER+"_prodRequire",implode(prodRequire,"saveProductData\prodRequire"));
        GM_setValue(COUNTRY+"_"+SERVER+"_prodTyp",implode(prodTyp,"saveProductData\prodTyp"));
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodGrowTime",implode(prodGrowTime,"saveProductData\prodGrowTime"));
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodBlock",implode(prodBlock,"saveProductData\prodBlock"));
        GM_setValue(COUNTRY+"_"+SERVER+"_gut",implode(gut,"saveProductData\gut"));
        GM_setValue(COUNTRY+"_"+SERVER+"_gutBeob",implode(gutBeob,"saveProductData\gutBeob"));
    if(DEVMODE_FUNCTION){ tracking.end("berater",trackingHandle); }
    }catch(err){ GM_logError("saveProductData\n"+err); }
}

/* 
function checkRequest(request){
    if((request.readyState==4)&&(request.status==200)){
        var response=request.responseText;
        if(response!=0){
            var result=eval('('+response+')');
            if(result[0]!=0){
                return result;
            }
        }
    }
    return null;
}
*/
// function for validation of AJAX-response. taken from game and shrunk on return value
function checkRequest(request, mode) {
try{
    if (request.readyState == 4 && request.status == 200) {
        response = request.responseText;
        if ((response!="failed") && (response!="maintenance") && (response!=0)) {
            var result = eval("(" + response + ")");
            if (result.datablock) {
                return result.datablock;
            } else {
                return result;
            }
        }
    }
    return 0;
}catch(err){GM_logError("checkRequest\n"+err);return null;} 
}
function showMultiframePage(page){
try{
//GM_log("showMultiframePage:"+page);
    top.window.wrappedJSObject.gclr();
    top.window.wrappedJSObject.clr();
    var i=0,help;
    while (help=$top("kunde"+(i++))){ help.style.display="none"; }
    closeInfoPanel();
    if(help=$top("einkaufszettel")){ help.style.display="none"; }
    if(help=$top("popup_garden")){ help.style.display="block"; }
    if(help=$top("multiframe")){ help.style.display="block"; }
    if(help=$top("multiframe")){ help.src=page; }
}catch(err){GM_logError("showMultiframePage page="+page+"\n"+err);} 
}
function showShopframePage(page){
    var cell=$top("shop");
    if(cell){
        if (top.window.wrappedJSObject.city!=1){
            top.document.addEventListener("gameCity1",function(){
                GM_log("showShopframePage:in stad 1");
                top.document.removeEventListener("gameCity1",arguments.callee,false);
                showShopframePage(page);
            },false);
            click($top("speedlink_city1"));
        }else if (cell.style.display!="block"){
            cell.style.display="block";
            cell.style.visibility="visible";
            cell=$top("transp3");
            cell.style.display="block";
            cell.style.visibility="visible";
            showShopframePage(page);
        }else{
            $top("travel2city").style.display="none";
            $top("shopframe").src=page;
        }
        //closeInfoPanel();
    }else{
        location.href=page;
    }
    cell=null;
}
function showMessage(from,page,msg){
//GM_log("showMessage:"+from+":"+page+":"+msg);
    //click($top("menueimg1"));
    showMultiframePage("http://s"+SERVER+"."+GAMEPAGES[COUNTRY]+"/nachrichten/read.php?from="+from+"&page="+page+"&msg="+msg+"&mass=0");
}
function showSGH(){
    top.document.addEventListener("gameCity1",function(){
        click($top("cityzone_1_2"));
        top.document.removeEventListener("gameCity1",arguments.callee,false);
    },false);
    click($top("speedlink_city1"));
}
function showLottery(){
    var div=$top("speedlink_city2");
    if(div&&($top("lotterycontainer"))){
        top.document.addEventListener("gameCity2",function(){
            click($top("cityzone_2_8"));
            top.document.removeEventListener("gameCity2",arguments.callee,false);
        },false);
        click(div);
    }
    div=null;
}
function goToDonkey(){
try{
    var div;
    if((gameLocation[0]=="farm")&&(gameLocation[1]==0)){
        if(div=$("farm_inner_waltraud")){
            click(div);
        }
    }else if(div=$("speedlink_farm1")){
        document.addEventListener("gameFarmOpened",function(){
            document.removeEventListener("gameFarmOpened",arguments.callee,false);
            window.setTimeout(goToDonkey,100);
        },false);
        click(div);
    }
    div=null;
}catch(err){GM_logError("goToDonkey\n"+err);}
}

function showGoToMarketToolTip(event,prod,add1,add2){
    var str='<table>';
    str += '<tr><th colspan="2" class="lightBg">'+getText("goToMarketOfX").replace(/%1%/,prodName[0][prod])+'</th></tr>';
    if(add1){
        str += add1;
        str += '<tr><td colspan="2" style="border-bottom:1px solid black;"></td></tr>';
    }
    str += '<tr><td>'+getText("marketPrice")+'</td><td style="text-align:right;">'+(gut[prod]>=100?moneyFormatInt(gut[prod]):moneyFormat(gut[prod]))+'</td></tr>';
    str += '<tr><td>'+getText("inventory")+'</td><td style="text-align:right;">'+numberFormat(prodStock[0][prod])+'</td></tr>';
    str += '<tr><td>'+getText("value")+'</td><td style="text-align:right;">'+moneyFormatInt(gut[prod]*prodStock[0][prod])+'</td></tr>';
    if(add2){
        str += '<tr><td colspan="2" style="border-bottom:1px solid black;"></td></tr>';
        str += add2;
    }
    str += '</table>';
    toolTip.show(event,str);
    str=null;
}
function showStatisticFullscreen(pid){
    var mode=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeStatistic"),"showStatisticFullscreen/modeStatistic");
    var newdiv=createElement("div",{"style":"position:absolute;top:0;left:0;height:"+window.innerHeight+"px;width:"+window.innerWidth+"px;background-color:white;color:black;z-index:995;"},ALL,getText("loading")+"...");
    var url=STAT_VIEW[COUNTRY]+"/chart.php?w="+window.innerWidth+"&h="+window.innerHeight+"&t=h"+mode["time"]+"&shownpc="+(mode["npc"]?1:0)+"&clip=1&server1="+SERVER+"&product1="+pid+"&color1=green";
    var newobject=createElement("object",{"data":url,"type":"type=image/svg+xml","style":"position:absolute;top:0;left:0;","width":window.innerWidth+"px","height":window.innerHeight+"px"},newdiv);
    createElement("param",{"name":"src","value":url},newobject);
    var newimg=createElement("img",{"src":GFX+"close.jpg","class":"link","style":"position:absolute;top:30px;right:10px;z-index:2;"},newdiv);
    newimg.addEventListener("click",function(){removeElement(this.parentNode);},false);
    newimg=createElement("div",{"style":"position:absolute;top:0px;left:40%;padding:5px;z-index:2;border-width:0px 2px 2px 2px;border-style:solid;border-radius:0px 0px 10px 10px;background-color:white;"},newdiv);
    produktPic(0,pid,newimg);
    createElement("span",{"style":"font-weight:bold;"},newimg,prodName[0][pid]);
    newdiv=null;newobject=null;newimg=null;
}

function calcProductionTime(buildingType,productType,productId,bonus,feedTime,feedAmount){
// bonus like 0.85
try{
    var time;
    switch(buildingType){
    case 1:
    case "forest":
        time=calcGrowDuration(prodGrowTime[productType][productId]*60,bonus);
        break;
    case 2:
        var totalTime=prodGrowTime[productType][productId]*60*bonus;
        time=totalTime;
        if(!feedAmount){
            feedAmount=Math.ceil(totalTime/feedTime);
        }
        totalTime*=0.5;
        if(unsafeWindow.premium==0 && USERLEVEL>9){ totalTime+=5; } // hack: non-premiums cant feed completely
        for(var i=1;i<=feedAmount;i++){
            if(time-feedTime>=totalTime){
                time-=feedTime;
            } else { break; }
        }
        totalTime=null;
        time=[time,i-1];
        break;
    case 3:
    case 4:
        time=prodGrowTime[productType][productId]*60*bonus;
        break;
    case "windmill":
        time=parseInt(unsafeWindow.formulas[0][productId][4],10);
        //time*=bonus;
        break;
    case "forest":
        time=calcGrowDuration(prodGrowTime[productType][productId]*60,bonus);
        break;
    case "sawmill":
    case "carpentry":
        time=prodGrowTime[productType][productId]*60*bonus;
        break;
    }
    return time;
}catch(err){GM_logError("calcProductionTime product:"+[productType,productId]+" bonus="+bonus+" \n"+err);return 0;}
}
function calcGrowDuration(growDurationInitial,bonus){
//growDurationInitial in seconds, bonus like 0.85
    var gesamtdauer=0;
    while(growDurationInitial>0){
        growDurationInitial *= bonus;
        var help=Math.min(growDurationInitial,86400);
        growDurationInitial -= help;
        gesamtdauer += help;
    }
    return Math.round(gesamtdauer);
}
function calcGrowTimes(growDurationInitial,period,bonus){
    return period/calcGrowDuration(growDurationInitial,bonus);
}

// Zones
var zones=new function(){
    var data;
    const INIT_zoneItem={"animals":null,"block":"blpqs","bonus":0,"bonusSpecial":null,"building":null,"crop":[],"endproduct":null,"endtime":NEVER,"mainproduct":null,"production":[[{},{}],0,0,true],"slots":null,"watertime":NEVER};
    const INIT_zoneSlotItem={"block":"blpqs"};
    this.init=function(){
        try{
            data=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_zones","{}"),"zones.init/data",{});
            for(var zoneNrF in data){
                if(!data.hasOwnProperty(zoneNrF)){ continue; }
                if((typeof data[zoneNrF]!="object")||(data[zoneNrF] instanceof Array)){
                    zones.create(zoneNrF);
                }
            }
        }catch(err){GM_logError("zones.init\n"+err);}
    }
    this.save=function(){
        try{
            GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_zones",implode(data,"zones.save/data"));
        }catch(err){GM_logError("zones.save\n"+err);}
    }
    this.create=function(zoneNrF){
        try{
            data[zoneNrF]=INIT_zoneItem.clone();
            if(isNaN(zoneNrF)){
                var building;
                switch(zoneNrF){
                case "farmersmarket-0": building="fl0";break;
                case "farmersmarket-1": building="fl1";break;
                case "farmersmarket-2": building="fl2";break;
                case "farmersmarket-3": building="fl3";break;
                case "farmersmarket-4": building="fl4";break;
                case "farmersmarket-5": building="fl5";break;
                case "farmersmarket-6": building="fl6";break;
                case "windmill":        building="windmill";break;
                case "forest":          building="forest";break;
                case "sawmill":         building="sawmill";break;
                case "carpentry":       building="carpentry";break;
                case "foodworld-0":     building="fw0";break;
                case "foodworld-1":     building="fw1";break;
                case "foodworld-2":     building="fw2";break;
                case "foodworld-3":     building="fw3";break;
                case "foodworld-4":     building="fw4";break;
                default:                building=null;
                }
                zones.setBuilding(zoneNrF,building);
            }
        }catch(err){GM_logError("zones.create\n"+err);}
    }
    this.swap=function(zoneNr1,zoneNr2){
        try{
            if(data[zoneNr1]&&data[zoneNr1]){
                var help=data[zoneNr1].clone();
                data[zoneNr1]=data[zoneNr2].clone();
                data[zoneNr2]=help;
            }
        }catch(err){GM_logError("zones.swap\n"+err);}
    }   
    // Values
    this.setAnimals=function(zoneNrF,value){
        try{
            if(!data[zoneNrF]){
                zones.create(zoneNrF);
            }
            if(data[zoneNrF]["animals"]!=value){
                data[zoneNrF]["animals"]=value;
                zones.save();
                calcTotalAnimals();
            }
        }catch(err){GM_logError("zones.setAnimals\n"+err);}
    }
    this.getAnimals=function(zoneNr){
        try{
            var zoneNrF=zoneNr.toString().replace(/\.\d+$/g,"");
            if(data[zoneNrF]){
                return data[zoneNrF]["animals"];
            }else{
                return INIT_zoneItem["animals"];
            }
        }catch(err){GM_logError("zones.getAnimals\n"+err);}
    }
    this.setBlock=function(zoneNr,value){
        // b: payment
        // l: level requirement
        // p: premium-feature
        // q: quest
        // s: status
        // t: type (not handled)
        try{
            zoneNr=zoneNr.toString();
            var slot=(zoneNr.match(/\.(\d+)$/)?parseInt(/\.(\d+)$/.exec(zoneNr)[1],10):null);
            var zoneNrF=zoneNr.replace(/\.\d+$/g,"");
            if(!data[zoneNrF]){
                zones.create(zoneNrF);
            }
            if(slot){
                if(data[zoneNrF]["slots"][slot]["block"]!=value){
                    data[zoneNrF]["slots"][slot]["block"]=value;
                    zones.save();
                }
            }else if(data[zoneNrF]["block"]!=value){
                data[zoneNrF]["block"]=value;
                zones.save();
            }
        }catch(err){GM_logError("zones.setBlock zoneNr="+zoneNr+"\n"+implode(data[zoneNrF])+"\n"+err);}
    }
    this.getBlock=function(zoneNr){
        try{
            zoneNr=zoneNr.toString();
            var slot=(zoneNr.match(/\.(\d+)$/)?parseInt(/\.(\d+)$/.exec(zoneNr)[1],10):null);
            var zoneNrF=zoneNr.replace(/\.\d+$/g,"");
            if(!data[zoneNrF]){
                return INIT_zoneItem["block"];
            }else if(data[zoneNrF]["block"]){
                return data[zoneNrF]["block"];
            }else if(slot&&data[zoneNrF]["slots"]){
                return data[zoneNrF]["slots"][slot]["block"];
            }else{
                return "";
            }
        }catch(err){GM_logError("zones.getBlock zoneNr="+zoneNr+"\n"+err);}
    }
    this.setBonus=function(zoneNrF,value){
        try{
            if(!data[zoneNrF]){
                zones.create(zoneNrF);
            }
            if(data[zoneNrF]["bonus"]!=value){
                data[zoneNrF]["bonus"]=value;
                zones.save();
            }
        }catch(err){GM_logError("zones.setBonus\n"+err);}
    }
    this.getBonus=function(zoneNr){
        try{
            var zoneNrF=zoneNr.toString().replace(/\.\d+$/g,"");
            if(data[zoneNrF]){
                return data[zoneNrF]["bonus"];
            }else{
                return INIT_zoneItem["bonus"];
            }
        }catch(err){GM_logError("zones.getBonus\n"+err);}
    }
    this.setBonusSpecial=function(zoneNrF,value){
        try{
            if(!data[zoneNrF]){
                zones.create(zoneNrF);
            }
            if(data[zoneNrF]["bonusSpecial"]==null){
                if(value!=null){
                    data[zoneNrF]["bonusSpecial"]=value;
                    zones.save();
                }
            }else if((value==null)||(data[zoneNrF]["bonusSpecial"][0]!=value[0])||(data[zoneNrF]["bonusSpecial"][1]!=value[1])){
                data[zoneNrF]["bonusSpecial"]=value;
                zones.save();
            }
        }catch(err){GM_logError("zones.setBonusSpecial\n"+err);}
    }
    this.getBonusSpecial=function(zoneNr){
        try{
            var zoneNrF=zoneNr.toString().replace(/\.\d+$/g,"");
            if(data[zoneNrF]){
                return data[zoneNrF]["bonusSpecial"];
            }else{
                return INIT_zoneItem["bonusSpecial"];
            }
        }catch(err){GM_logError("zones.getBonusSpecial\n"+err);}
    }
    this.setBuilding=function(zoneNrF,value){
        /*  BUILDING    NAME                    TYPE        
            0           empty       
            1           Field                   Field       
            2           Chickens                Stable      
            3           Cows                    Stable      
            4           Sheep                   Stable      
            5           Bees                    Stable      
            6           Clubhouse
            7           Cheese                  Factory 
            8           Mayo                    Factory 
            9           Whool                   Factory 
            10          Bonbons                 Factory 
            11          Fishs                   Stable  
            12          Goats                   Stable  
            13          Oil                     Factory 
            14          Special-Oil             Factory 
            15          Angora shed             Stable  
            16          Knitting mill           Factory 
            17          Architectural office
            18          Pony farm
            19          Megafield               Factory
            fw1         Soda stall              Foodworld
            fw2         Snack booth             Foodworld
            fw3         Pastry shop             Foodworld
            fl1         Flower meadow           Farmersmarket
            fl2         Flower workshop         Farmersmarket
            fl3                                 Farmersmarket
        */  
        try{
            if(!data[zoneNrF]){
                zones.create(zoneNrF);
            }
            if(data[zoneNrF]["building"]!=value){
                data[zoneNrF]["building"]=value;
                switch(value){
                case 13: // Oil
                case 14: // Special oil
                case 16: // Knitting
                case "windmill":
                case "sawmill": case "carpentry":
                case "fw1": case "fw2": case "fw3": // Foodworld
                case "fl2": // Flowers
                    data[zoneNrF]["slots"]=[];
                    for(var i=1;i<=3;i++){
                        data[zoneNrF]["slots"][i]=INIT_zoneSlotItem.clone();
                    }
                break;
                default:
                    data[zoneNrF]["slots"]=null;
                }               
                zones.save();
            }
        }catch(err){GM_logError("zones.setBuilding\n"+err);}
    }
    this.getBuilding=function(zoneNr){
        try{
            var zoneNrF=zoneNr.toString().replace(/\.\d+$/g,"");
            if(data[zoneNrF]){
                return data[zoneNrF]["building"];
            }else{
                return INIT_zoneItem["building"];
            }
        }catch(err){GM_logError("zones.getBuilding zoneNr="+zoneNr+"\n"+err);}
    }
    this.getBuildingName=function(zoneNr){
        try{
            return getBuildingName(zones.getBuilding(zoneNr));
        }catch(err){GM_logError("zones.getBuildingName\n"+err);}
    }
    this.getLocation=function(zoneNr){
        try{
            var zoneNrF=zoneNr.toString().replace(/\.\d+$/g,"");
            if(DATA_zones[zoneNrF]){
                return DATA_zones[zoneNrF];
            }else{
                GM_logWarning("getLocation returns null\nzoneNr="+zoneNr);
                return null;
            }
        }catch(err){ GM_logError("getLocation\n"+err);return null; }
    }   
    // Production
    this.setProduction=function(zoneNrS,value){
        // production[0][i]={"id":item,...}
        // i = product-type
        // case production : item=[[amount,points,endtime,nextwatertime],...]
        // - amount : amount of production with these times
        // - points : points given for this production
        // - endtime : time of cropping (without future waterings)
        // - nextwatertime : NEVER if not possible to water in future
        // case deco : item=[[amount1,time1],[amount2,time2],...]
        // case garbage : item=amount
        // production[1]=[,int,int,,int]||int : free places for currently planting with that size
        // production[2]=[,int,int,,int]||int : free places for possibly planting with that size (cropped field)
        // production[3]=true||false : flag if data is ready    
        try{
            if(!data[zoneNrS]){
                zones.create(zoneNrS);
            }
            data[zoneNrS]["production"]=value;
            zones.processProduction(zoneNrS);
        }catch(err){GM_logError("zones.setProduction\n"+err);}
    }
    this.getProduction=function(zoneNrS){
        try{
            if(data[zoneNrS]){
                return data[zoneNrS]["production"];
            }else{
                return INIT_zoneItem["production"];
            }
        }catch(err){GM_logError("zones.getProduction\n"+err);}
    }
    this.processProduction=function(zoneNrS){
        try{
            if(DEVMODE_FUNCTION){ var trackingHandle = tracking.start("berater","zones.processProduction",[zoneNrS]); }
                var err_trace="begin";
                var zoneNrF=zoneNrS.toString().replace(/\.\d+$/g,"");
                var help;
                data[zoneNrS]["crop"]=new Array();
                data[zoneNrS]["endtime"]=NEVER;
                data[zoneNrS]["endproduct"]=null;
                data[zoneNrS]["watertime"]=NEVER;
                data[zoneNrS]["mainproduct"]=null;
                if(!zones.getBlock(zoneNrS)){
                    var currLocation=zones.getLocation(zoneNrS).location;
                    var currBonus=zones.getBonus(zoneNrS);
                    var currBonusSpecial=zones.getBonusSpecial(zoneNrS);
                    var zoneErnteCurr=new Object();
                    var iZoneTyp=zones.getBuilding(zoneNrS);
                    var isProductional=zones.isProductional(zoneNrS);
                    var nowServer=unsafeWindow.Zeit.Server;
                    var c=0,item;
                    err_trace="product loop";
                    for(var iType=0;iType<data[zoneNrS]["production"][0].length;iType++){
                        for(var iProdStr in data[zoneNrS]["production"][0][iType]){
                            if(!data[zoneNrS]["production"][0][iType].hasOwnProperty(iProdStr)){ continue; }
                            var iProd = parseInt(iProdStr,10);
                            if((prodTyp[iType][iProd]!="u")&&(prodTyp[iType][iProd]!="z")){ // only products
                                item=data[zoneNrS]["production"][0][iType][iProdStr];
                                for(var i=0;i<item.length;i++){
                                    var z=item[i][2];
                                    var w=item[i][3];
                                    if (data[zoneNrS]["mainproduct"]==iProd){ c += item[i][0]; }
                                    else{ c -= item[i][0]; }
                                    if (c<1){
                                        data[zoneNrS]["mainproduct"]=iProd;
                                        c=item[i][0];
                                    }
                                    if (!zoneErnteCurr[iType]){ zoneErnteCurr[iType]={}; }
                                    if (!zoneErnteCurr[iType][iProdStr]){ zoneErnteCurr[iType][iProdStr]=[0,0]; }
                                    zoneErnteCurr[iType][iProdStr][0] += item[i][0]; 
                                    zoneErnteCurr[iType][iProdStr][1] += item[i][1];
                                    if(w){
                                        data[zoneNrS]["watertime"]=Math.min(data[zoneNrS]["watertime"],w);
                                        if(valAssumeWater[currLocation]&&(nowServer<=z)&&(w<=z)){
                                            // calculate future watering
                                            // w<nowServer means that now can be watered. because it isnt watered, assume that watering is not wanted
                                            // if (nowServer<=w){
                                            w=Math.max(0,Math.min(86400,w-nowServer)); // time till watering
                                            z-=nowServer; // remaining time
                                            z=nowServer+w+calcGrowDuration(z-w,(100-currBonus-((currBonusSpecial&&(iProd==currBonusSpecial[0]))?currBonusSpecial[1]:0))/100);
                                        }
                                    }
            
                                    if (z < data[zoneNrS]["endtime"]){
                                        data[zoneNrS]["endtime"]=z;
                                        data[zoneNrS]["endproduct"]=iProd;
                                    }
                                }
                            }
                        }
                    }
                    if(isProductional){
                        for(var iTypeStr in zoneErnteCurr){
                            if(!zoneErnteCurr.hasOwnProperty(iTypeStr)){ continue; }
                            for(var iProdStr in zoneErnteCurr[iTypeStr]){
                                if(!zoneErnteCurr[iTypeStr].hasOwnProperty(iProdStr)){ continue; }
                                if(iTypeStr=="0"){
                                    // zoneErnteCurr[iTypeStr][iProdStr][0] /= 10; // Fix Seberoth ... why ... TODO!
                                }
                                data[zoneNrS]["crop"].push([parseInt(iTypeStr,10),parseInt(iProdStr,10)].concat(zoneErnteCurr[iTypeStr][iProdStr]));
                            }
                        }
                    }
                    // too many empty fields
                    err_trace="empty fields";
                    if(now<data[zoneNrS]["endtime"]){
                        if(!isNaN(valLimitEmptyFields[iZoneTyp])){
                            if(data[zoneNrS]["production"][1][1]>valLimitEmptyFields[iZoneTyp]){
                                data[zoneNrS]["endtime"]=NEVER;
                                data[zoneNrS]["endproduct"]=null;
                            }
                        }else if(valGlobaltimeShowCroppedZone[currLocation]&&(data[zoneNrS]["production"][1][1]>0)){
                            data[zoneNrS]["endtime"]=NEVER;
                            data[zoneNrS]["endproduct"]=null;
                        }
                    }
                    // create watering timer
                    if(iZoneTyp==1){
                        var farmNR=Math.floor((zoneNrF-1)/6)+1;
                        var zoneNr=zoneNrF-6*(farmNR-1);
                        createZoneTimer("zoneTimerWater_"+zoneNrS,zoneNrS,"zoneTimerWater","top:20px;left:5px;",$("farm"+farmNR+"_pos"+zoneNr));
                    }
                }
                err_trace="readyZone";
                zones.checkReady(zoneNrS);
                err_trace="timer";
                updateZoneTimer("zoneTimer_"+zoneNrS,zoneNrS,"zonetimer");
                updateZoneTimer("zoneTimerWater_"+zoneNrS,zoneNrS,"zoneTimerWater");
                updateZoneTimer("globalZoneTimer_"+zoneNrS,zoneNrS,"zonetimer");
                updateZoneTimer("globalZoneTimerWater_"+zoneNrS,zoneNrS,"zoneTimerWater");
                calcTotalEndtime();
                zones.save();
                if(DEVMODE_FUNCTION){ tracking.end("berater",trackingHandle); }
            }catch(err){ GM_logError("zones.processProduction ("+err_trace+") zoneNrS="+zoneNrS+" iProdStr="+iProdStr+" \n"+err); }
    }
    this.flagProduction=function(zoneNrS){
        try{
            if(!data[zoneNrS]){
                zones.create(zoneNrS);
            }
            data[zoneNrS]["production"][3]=false;
        }catch(err){GM_logError("zones.flagProduction\n"+err);}
    }
    this.getEndproduct=function(zoneNr){
        try{
            if(data[zoneNr]&&data[zoneNr]["endproduct"]){
                return data[zoneNr]["endproduct"];
            }else{
                return INIT_zoneItem["endproduct"];
            }
        }catch(err){GM_logError("zones.getEndproduct\n"+err);}
    }
    this.getEndtime=function(zoneNr){
        try{
            if(data[zoneNr]&&data[zoneNr]["endtime"]){
                return data[zoneNr]["endtime"];
            }else{
                return INIT_zoneItem["endtime"];
            }
        }catch(err){GM_logError("zones.getEndtime\n"+err);}
    }
    this.getWatertime=function(zoneNr){
        try{
            if(data[zoneNr]&&data[zoneNr]["watertime"]){
                return data[zoneNr]["watertime"];
            }else{
                return INIT_zoneItem["watertime"];
            }
        }catch(err){GM_logError("zones.getWatertime\n"+err);}
    }
    this.getCrop=function(zoneNr){
    // {"prodId1":[amount1,points1],"prodId2":[amount2,points2],...}
        try{
            if(data[zoneNr]&&data[zoneNr]["crop"]){
                return data[zoneNr]["crop"];
            }else{
                return INIT_zoneItem["crop"];
            }
        }catch(err){GM_logError("zones.getCrop\n"+err);}
    }
    this.getMainproduct=function(zoneNr){
        try{
            if(data[zoneNr]&&data[zoneNr]["mainproduct"]){
                return data[zoneNr]["mainproduct"];
            }else{
                return INIT_zoneItem["mainproduct"];
            }
        }catch(err){GM_logError("zones.getMainproduct\n"+err);}
    }
    this.checkReady=function(zoneNrS){
        try{
            var readyZoneAdded=0;
            if((!zones.getBlock(zoneNrS))&&(zones.isProductional(zoneNrS))){
                var zoneNrF=zoneNrS.toString().replace(/\.\d+$/g,"");
                var farmNR=Math.floor((zoneNrF-1)/6)+1;
                var zoneNr=zoneNrF-6*(farmNR-1);
                var currZoneType=zones.getBuilding(zoneNrF);
                var currLocation=zones.getLocation(zoneNrF);
                var zT=zones.getEndtime(zoneNrS);
                var zTw=zones.getWatertime(zoneNrS);
                var div;
    
                if (zT==NEVER){ // empty
                    if(unsafeData.readyZone[zoneNrS]&&(unsafeData.readyZone[zoneNrS][1]=="e")){
                        if(!unsafeData.readyZone[zoneNrS][2]){ unsafeData.readyZone[zoneNrS][2]=true; }
                    }else{
                        unsafeData.readyZone[zoneNrS]=[currLocation.farmNr==undefined?currLocation.location:currLocation.farmNr,"e",true];
                        readyZoneAdded=1;
                    }
                    if((currZoneType==1)&&(div=$("farm_production_ready"+farmNR+"_"+zoneNr))){
                        div.setAttribute("class","farm_production_ready1 fieldReady");
                    }
                }else if(zT<=unsafeWindow.Zeit.Server){ //READY
                    if(unsafeData.readyZone[zoneNrS]&&(unsafeData.readyZone[zoneNrS][1]=="r")){
                        if(!unsafeData.readyZone[zoneNrS][2]){ unsafeData.readyZone[zoneNrS][2]=true; }
                    }else{
                        if(DEVMODE){GM_log("checkReady readyZone add=READY zoneNrS="+zoneNrS);}
                        unsafeData.readyZone[zoneNrS]=[currLocation.farmNr==undefined?currLocation.location:currLocation.farmNr,"r",true];
                        readyZoneAdded=1;
                    }
                    if((currZoneType==1)&&(div=$("farm_production_ready"+farmNR+"_"+zoneNr))){
                        div.setAttribute("class","farm_production_ready1 fieldReady");
                    }
                // running (unsafeWindow.Zeit.Server<zT)
                }else if(valWaterNeeded[currLocation.location]&&(zTw<unsafeWindow.Zeit.Server)&&(zones.getBonus(zoneNrF)>0)){
                    //zTw<zT removes the watertimer if ready later then the field timer
                    if(unsafeData.readyZone[zoneNrS]&&(unsafeData.readyZone[zoneNrS][1]=="w")){
                        if(!unsafeData.readyZone[zoneNrS][2]){ unsafeData.readyZone[zoneNrS][2]=true; }
                    }else{
                        if(DEVMODE){GM_log("checkReady readyZone add:WATER zoneNrS:"+zoneNrS);}
                        unsafeData.readyZone[zoneNrS]=[currLocation.farmNr==undefined?currLocation.location:currLocation.farmNr,"w",true];
                        readyZoneAdded=1;
                    }
                    if((currZoneType==1)&&(div=$("farm_production_ready"+farmNR+"_"+zoneNr))){
                        div.setAttribute("class","farm_production_ready1 fieldWaterReady blinking");
                    }
                }else if(unsafeData.readyZone[zoneNrS]){
                    if(DEVMODE){GM_log("checkReady readyZone add:DELETE zoneNrS:"+zoneNrS);}
                    delete unsafeData.readyZone[zoneNrS];
                    if((currZoneType==1)&&(div=$("farm_production_ready"+farmNR+"_"+zoneNr))){
                        div.setAttribute("class","farm_production_ready1");
                    }
                }
                div=null;
            }
            return readyZoneAdded;
        }catch(err){GM_logError("zones.checkReady zoneNrS="+zoneNrS+"\n"+err);}
    }
    // Type
    this.isMultiSlot=function(zoneNrF){
    try{
        if(!data[zoneNrF]){
            zones.create(zoneNrF);
        }
        if(data[zoneNrF]["slots"]==null){
            return false;
        }else{
            return true;
        }
    }catch(err){GM_logError("isMultiSlot\n"+err);}
    }
    this.isProductional=function(zoneNr){
        try{
            var zoneNrF=zoneNr.toString().replace(/\.\d+$/g,"");
            if(DATA_zones[zoneNrF]){
                return DATA_zones[zoneNrF]["productional"];
            }else{
                GM_logWarning("zones.isProductional returns null\nzoneNr="+zoneNr);
                return null;
            }
        }catch(err){ GM_logError("zones.isProductional\n"+err);return null; }
    }
}
unsafeData.zones=zones;
function getBuildingName(building){
    try{
        if(unsafeWindow.buildinginfos[0][building]){
            return unsafeWindow.buildinginfos[0][building][10];
        }else if(getText(building)){
            return getText(building);
        }else{
            return "???";
        }
    }catch(err){GM_logError("getBuildingName\n"+err);}
}
// Totals
function calcTotalRecursive(recursionCount,stack){
try{
 if(DEVMODE_FUNCTION){ var trackingHandle = tracking.start("berater","calcTotalRecursive",[recursionCount]); }
    if(recursionCount>100){throw("TOO MUCH RECURSION")}
    var err_trace="init";
    var help;
    var next=false;
    var nextStack={};
    if(!stack){
        totalRecursive=new Array(new Object(),new Object(),new Object(),new Object());
        stack=prodStock.clone();
        for(var type in prodMinRack){
            if(!prodMinRack.hasOwnProperty(type)){ continue; }
            for(var iProd in prodMinRack[type]){
                if (!prodMinRack[type].hasOwnProperty(iProd)){ continue; }
                if(!stack[type]){ stack[type]={}; }
                stack[type][iProd]-=prodMinRack[type][iProd];
            }
        }
    }
    err_trace="step";
    for(var type in stack){
        if(!stack.hasOwnProperty(type)){ continue; }
        for(var iProd in stack[type]){
            if(!stack[type].hasOwnProperty(iProd)){ continue; }
            if(stack[type][iProd]<0){
                if((typeof prodRequire[type][iProd]=="object")&&(totalZones[PRODUCT2BUILDING[type][iProd]]>0)){
                    err_trace="prodRequire";
                    for(var i=0;i<prodRequire[type][iProd].length;i++){
                        err_trace="prodRequire "+i;
                        if(prodRequire[type][iProd][i][0]>-1){
                            help=-stack[type][iProd]/prodYield[type][iProd]*prodRequire[type][iProd][i][2];
                            if(!nextStack[prodRequire[type][iProd][i][0]]){
                                nextStack[prodRequire[type][iProd][i][0]]={}; 
                            }
                            if(!nextStack[prodRequire[type][iProd][i][0]][prodRequire[type][iProd][i][1]]){
                                nextStack[prodRequire[type][iProd][i][0]][prodRequire[type][iProd][i][1]]=0;
                            }
                            next=true;
                            nextStack[prodRequire[type][iProd][i][0]][prodRequire[type][iProd][i][1]]-=help;
                            if(!totalRecursive[prodRequire[type][iProd][i][0]][prodRequire[type][iProd][i][1]]){
                                totalRecursive[prodRequire[type][iProd][i][0]][prodRequire[type][iProd][i][1]]=0;
                            }
                            totalRecursive[prodRequire[type][iProd][i][0]][prodRequire[type][iProd][i][1]]+=help;
                        }
                    }
                }

            }       
        }
    }
    if(next){ calcTotalRecursive(++recursionCount,nextStack); }
 if(DEVMODE_FUNCTION){ tracking.end("berater",trackingHandle); }
}catch(err){ GM_logError("calcTotalRecursive ("+err_trace+")\ntype="+type+" iProd="+iProd+" help="+implode(help)+" i="+i+"\n"+err); }
}
function calcTotalErnte(){
    try{
        var help;
        totalErnte=new Array(new Object(),new Object(),new Object(),new Object());
        for(var i in ALL_ZONES){
            if(!ALL_ZONES.hasOwnProperty(i)){ continue; }
            for(var j=0;j<ALL_ZONES[i].length;j++){
                try{
                    var zoneNrF=ALL_ZONES[i][j];
                    if(help=zones.getCrop(zoneNrF)){
                        for(var k=0;k<help.length;k++){
                            if(!totalErnte[help[k][0]][help[k][1]]){ totalErnte[help[k][0]][help[k][1]]=0; }
                            totalErnte[help[k][0]][help[k][1]] += help[k][2];
                        }
                    }
                }catch(err){ GM_logError("calcTotalErnte loop\ni="+i+" j="+j+" zoneNrF="+zoneNrF+" help="+implode(help)+"\n"+err); }
            }
        }
        //GM_log("calcTotalErnte totalErnte:"+implode(totalErnte));
    }catch(err){ GM_logError("calcTotalErnte\nzoneNrF="+zoneNrF+"\n"+err); }
}
function calcTotalFarmis(){
    try{
        totalFarmis[0]=new Object();
        var farmiNr=-1;
        // GM_log("farmisinfo:\n"+print_r(unsafeWindow.farmisinfo,"",true,"\n"));       
        // GM_log("farmilist:\n"+print_r(unsafeWindow.farmilist,"",true,"\n"));     
        if(top.window.wrappedJSObject.farmisinfo&&top.window.wrappedJSObject.farmisinfo[0]){
            for(var farmiNr in top.window.wrappedJSObject.farmisinfo[0]){ // loop through all farmis...
                if(!top.window.wrappedJSObject.farmisinfo[0].hasOwnProperty(farmiNr)){continue;}
                if(top.window.wrappedJSObject.farmilist[farmiNr]==1){ // ...which are waiting...
                    // {"id":integer(string),"pic":integer(string),"verkauft":"0","price":float(string),"p1":prod(string),"a1":amount(string),...,"p7":...,"a7":...}
                    if(valFarmiLimits[0]<=top.window.wrappedJSObject.farmisinfo[0][farmiNr]["costQuotient"]){ // ...and pay enough
                        for(var i=1 ; i <= 7 ; i++){ // 7=max-amount of products per farmi
                            var pid=top.window.wrappedJSObject.farmisinfo[0][farmiNr]["p"+i];
                            var amount=parseInt(top.window.wrappedJSObject.farmisinfo[0][farmiNr]["a"+i],10);
                            if((pid > 0) && (amount > 0)){
                                if (totalFarmis[0][pid]) totalFarmis[0][pid] += amount;
                                else totalFarmis[0][pid]=amount;
                            }
                        }
                    }
                }
            }
            // totalFarmis[0].sortObj();
        }
    }catch(err){GM_logError("calcTotalFarmis \n"+err);}
    //GM_log("calcTotalFarmis totalFarmis:"+implode(totalFarmis[0]));
    //calcProdMinRack(); //TODO possible security error this in wrappedJSObject .. and the calcProMinRack/doBuyNotePad is in unsafeWindow
}
function calcTotalPowerups(){
try{
    totalPowerups=new Object();
    if(unsafeWindow.poweruprack){
        for(var v in unsafeWindow.poweruprack){
            if(!unsafeWindow.poweruprack.hasOwnProperty(v)){continue;}
            if(unsafeWindow.poweruprack[v][5] && unsafeWindow.poweruprack[v][5][0]){ //problem in the game made this visible
                var k=parseInt(unsafeWindow.poweruprack[v][5][0][0],10);
                totalPowerups[k]=parseInt(unsafeWindow.poweruprack[v]["rack"],10)*parseInt(unsafeWindow.poweruprack[v][5][0][1],10);
            }
        }
    }
    //GM_log("calcTotalPowerups totalPowerups:"+implode(totalPowerups));
}catch(err){ GM_logError("calcTotalPowerups\n"+err); }
}
function calcTotalQuest(quTyp){
    try{
        // GM_log("calcTotalQuest quTyp="+quTyp);
        totalQuest[quTyp]=new Array(new Object(),new Object());
        var questCurr;
        for(var camp in questData[quTyp]){
            if (!questData[quTyp].hasOwnProperty(camp)){ continue; }
            // GM_log("calcTotalQuest camp="+camp);
            // GM_log("questData["+quTyp+"]["+camp+"]="+implode(questData[quTyp][camp]));
            if(questData[quTyp][camp]["calcTo"]>0){
                questCurr=questData[quTyp][camp]["data"];
                // GM_log("calcTotalQuest questCurr="+implode(questCurr));
                if(questCurr&&questCurr[0]){
                    for(var j=0;j<questCurr[0].length;j++){
                        if(questCurr[0][j][3]){
                            if(!totalQuest[quTyp][questCurr[0][j][0]][questCurr[0][j][1]]){ totalQuest[quTyp][questCurr[0][j][0]][questCurr[0][j][1]]=0; }
                            totalQuest[quTyp][questCurr[0][j][0]][questCurr[0][j][1]]+=questCurr[0][j][2];
                        }
                    }               
                }               
                for(var pTyp in questData[quTyp][camp]["given"]){
                    if (!questData[quTyp][camp]["given"].hasOwnProperty(pTyp)){ continue; }
                    for(var p in questData[quTyp][camp]["given"][pTyp]){
                        if (!questData[quTyp][camp]["given"][pTyp].hasOwnProperty(p)){ continue; }
                        if(totalQuest[quTyp][pTyp]&&totalQuest[quTyp][pTyp][p]){
                            totalQuest[quTyp][pTyp][p]=Math.max(0,totalQuest[quTyp][pTyp][p]-questData[quTyp][camp]["given"][pTyp][p]);
                        }
                    }
                }
                for(var q=questData[quTyp][camp]["nr"]+1;q<=questData[quTyp][camp]["calcTo"];q++){
                    // GM_log("calcTotalQuest q="+q);
                    if(QUESTS[quTyp][camp][q]){
                        for(var j=0;j<QUESTS[quTyp][camp][q][0].length;j++){
                            questCurr=getQuestBestAlternative(QUESTS[quTyp][camp][q][0][j]);
                            if(!totalQuest[quTyp][questCurr[0]][questCurr[1]]){ totalQuest[quTyp][questCurr[0]][questCurr[1]]=0; }
                            totalQuest[quTyp][questCurr[0]][questCurr[1]]+=questCurr[2];
                        }
                    }
                }
            }
        }
        // GM_log("totalQuest["+quTyp+"]="+implode(totalQuest[quTyp]));
    }catch(err){ GM_logError("calcTotalQuest quTyp="+quTyp+" camp="+camp+" q="+q+"\n"+err); }
    // GM_log("calcTotalQuest END");
}
function calcTotalZones(){
try{
    totalZones=new Object();
    var zoneNrF,currZoneTyp;
    for(var i in ALL_ZONES){
        if(!ALL_ZONES.hasOwnProperty(i)){ continue; }
        for(var j=0;j<ALL_ZONES[i].length;j++){
            try{
                zoneNrF=ALL_ZONES[i][j];
                if(!zones.getBlock(zoneNrF)){
                    currZoneTyp=zones.getBuilding(zoneNrF)
                    if(!totalZones[currZoneTyp]){
                        totalZones[currZoneTyp]=0; 
                    }
                    totalZones[currZoneTyp]++;
                }
            }catch(err){ GM_logError("calcTotalErnte loop\ni="+i+" j="+j+" zoneNrF="+zoneNrF+"\n"+err); }
        }
    }
}catch(err){ GM_logError("calcTotalZones\n"+err); }
}
function calcTotalAnimals(){
try{
    totalAnimals=[,,0,0,0,0,,,,,,0,0];
    var help;
    for(var i=0;i<ALL_ZONES["farm"].length;i++){
        help=zones.getAnimals(ALL_ZONES["farm"][i]);
        if(help>0){
            totalAnimals[zones.getBuilding(ALL_ZONES["farm"][i])]+=help;
        }
    }
}catch(err){ GM_logError("calcTotalAnimals\n"+err); }
}
function calcTotalEndtime(){                
    try{
        totalEndtime=NEVER;
        for(var i in ALL_ZONES){
            if(!ALL_ZONES.hasOwnProperty(i)){ continue; }
            for(var j=0;j<ALL_ZONES[i].length;j++){
                zoneNrF=ALL_ZONES[i][j];
                if((!zones.getBlock(zoneNrF))&&(zones.getBuilding(zoneNrF)!=0)&&((i=="farm")||zoneAddToGlobalTime[zoneNrF])){
                    help=zones.getEndtime(zoneNrF);
                    if(help==NEVER){
                        if(valGlobaltimeShowCroppedZone[i]){
                            totalEndtime=-1;
                            GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_totalEndtime",totalEndtime);
                            return;
                        }
                    }else{
                        totalEndtime=Math.min(totalEndtime,help);
                        if(valWaterNeeded[i]){
                            totalEndtime=Math.min(totalEndtime,zones.getWatertime(zoneNrF));
                        }
                    }
                }
            }
        }
        GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_totalEndtime",totalEndtime);
    }catch(err){ GM_logWarning("calcTotalEndtime\ni="+i+" j="+j+" zoneNrF="+zoneNrF+"\n"+err); }
}
// calcProdMinRackInit: sets base values
// -> calcProdMinRack: adds quests, farmis, growing, addons, forestry 
// (calls calcTotalQuest,calcTotalErnte)
// -> doBuyNotepad, doRack, TODO doFarmis!
// TODO: switch this logic to: calcTotalX -> calcProdMinRack
function calcProdMinRackInit(){
    try{
    if(DEVMODE_FUNCTION){ var trackingHandle = tracking.start("berater","calcProdMinRackInit"); }
        prodMinRackInit=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodMinRackInit"),"calcProdMinRackInit/prodMinRackInit",[[],{},{},{}]);
        if(!(prodMinRackInit instanceof Array)){ prodMinRackInit=[]; }
        for(var type in prodName){
            if(!prodName.hasOwnProperty(type)){continue;}
            if(type==1){
                if((!prodMinRackInit[type])||(typeof prodMinRackInit[type]!="object")||(prodMinRackInit[type] instanceof Array)){ prodMinRackInit[type]={}; } 
            }else{
                if((!prodMinRackInit[type])||(!(prodMinRackInit[type] instanceof Array))){ prodMinRackInit[type]=[]; } 
            }
            if(!valMinRackMan){ // detail-setting option (else see buildPreise)
                for(var prod in prodName[type]){
                    //GM_log("prodName type:"+type+" prod:"+prod);
                    if(!prodName[type].hasOwnProperty(prod)){continue;}
                    if((!valMinRack[prodTyp[type][prod]])||(prodBlock[type][prod])){ // .match(/t/)
                        prodMinRackInit[type][prod]=0;
                    }else if(prodTyp[type][prod]=="v"){
                        prodMinRackInit[type][prod]=valMinRack[prodTyp[type][prod]]/(valMinRackPlantsize?prodPlantSize[type][prod]:1);
                    }else{
                        prodMinRackInit[type][prod]=valMinRack[prodTyp[type][prod]];
                    }
                }
            }
            // prodMinRackInit[type].sortObj();
        }
        GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodMinRackInit",implode(prodMinRackInit,"calcProdMinRackInit\prodMinRackInit"));
        unsafeData.prodMinRackInit=prodMinRackInit.clone();
        calcProdMinRack();
    if(DEVMODE_FUNCTION){ tracking.end("berater",trackingHandle); }
    }catch(err){ GM_logError("calcProdMinRackInit\ntype="+type+" prod="+prod+"\n"+err); }
}
function calcProdMinRack(caller){
        try{
        if(DEVMODE){ GM_log("begin calcProdMinRack"); }
        prodMinRack=prodMinRackInit.clone();
        // Quest
        var err_trace="quest";
        for(var quTyp in QUESTS){
            if(!QUESTS.hasOwnProperty(quTyp)){ continue; }
            calcTotalQuest(quTyp);
            for(var type in totalQuest[quTyp]){
                if(!totalQuest[quTyp].hasOwnProperty(type)){ continue; }
                for(var prod in totalQuest[quTyp][type]){
                    if(!totalQuest[quTyp][type].hasOwnProperty(prod)){ continue; }
                    if(!prodMinRack[type][prod]){prodMinRack[type][prod]=0;}
                    prodMinRack[type][prod] += totalQuest[quTyp][type][prod];
                }
            }
        }
        // Farmis
        err_trace="farmis";
        if(valMinRackFarmis){
            for(var prod in totalFarmis[0]){
                if(!totalFarmis[0].hasOwnProperty(prod)){ continue; }
                if(!prodMinRack[0][prod]){ prodMinRack[0][prod]=0;}
                prodMinRack[0][prod] += totalFarmis[0][prod];
            }
        }
        if(valMinRackForestryFarmis){
            for(var prod in totalFarmis[1]){
                if(!totalFarmis[1].hasOwnProperty(prod)){ continue; }
                if(!prodMinRack[1][prod]){ prodMinRack[1][prod]=0;}
                prodMinRack[1][prod] += totalFarmis[1][prod];
            }
        }
        // Addons
        err_trace="prodMinRackAddon";
        for(var type in prodMinRackAddon){
            if (!prodMinRackAddon.hasOwnProperty(type)){ continue; }
            for(var prod in prodMinRackAddon[type]){
                if(!prodMinRackAddon[type].hasOwnProperty(prod)){ continue; }
                if(prodMinRackAddon[type][prod]){
                    for(var k in prodMinRackAddon[type][prod]){
                        if(!prodMinRackAddon[type][prod].hasOwnProperty(k)){ continue; }
                        if(!prodMinRack[type][prod]){prodMinRack[type][prod]=0;}
                        prodMinRack[type][prod] += prodMinRackAddon[type][prod][k];
                    }
                }
            }
        }
        // Growing products
        err_trace="growing";
        if(valMinRackGrowing){
            calcTotalErnte();
            for(var type in totalErnte){
                if (!totalErnte.hasOwnProperty(type)){ continue; }
                for(var prod in totalErnte[type]){
                    if(!totalErnte[type].hasOwnProperty(prod)){ continue; }
                    if(!prodMinRack[type][prod]){prodMinRack[type][prod]=0;}
                    prodMinRack[type][prod] -= totalErnte[type][prod];
                }
            }
            for(var prod in totalPowerups){
                if(!totalPowerups.hasOwnProperty(prod)){ continue; }
                if(!prodMinRack[0][prod]){prodMinRack[0][prod]=0;}
                prodMinRack[0][prod] -= totalPowerups[prod];
            }
        }
        err_trace="recursive";
        //GM_log("Before calcTotalRecursive prodMinRack:"+implode(prodMinRack[1]));
        if(valMinRackRecursive){
            calcTotalRecursive(1); // recursive need products calculation
            for(var type in totalRecursive){
                if (!totalRecursive.hasOwnProperty(type)){ continue; }
                for(var prod in totalRecursive[type]){
                    if(!totalRecursive[type].hasOwnProperty(prod)){ continue; }
                    if(!prodMinRack[type][prod]){ prodMinRack[type][prod]=0; }
                    prodMinRack[type][prod] += totalRecursive[type][prod];
                }
            }
        }
        //GM_log("After calcTotalRecursive totalRecursive:"+implode(totalRecursive));
        //GM_log("After calcTotalRecursive prodMinRack:"+implode(prodMinRack[1]));
        //GM_log("After calcTotalRecursive prodStock:"+implode(prodStock[1]));
        
        // delete wrong values
        err_trace="QA";
        for(var type in prodMinRack){
            if (!prodMinRack.hasOwnProperty(type)){ continue; }
            for(var prod in prodMinRack[type]){
                if(!prodMinRack[type].hasOwnProperty(prod)){ continue; }
                try{ 
                    if(prodMinRack[type][prod]<0){ // delete negatives
                        prodMinRack[type][prod]=0;
                    }else if((type==0)&&(prodBlock[0][prod].match(/l/))){ // delete non-availables
                        prodMinRack[type][prod]=0;
                    }
                }catch(err){}
            }
        }

        err_trace="save";
        unsafeData.prodMinRack=prodMinRack.clone();
        unsafeData.prodMinRackSettings = {"valMinRackGrowing":valMinRackGrowing,"valMinRackFarmis":valMinRackFarmis,"valMinRackFarmis":valMinRackFarmis,"valMinRackRecursive":valMinRackRecursive};
        GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodMinRack",implode(prodMinRack));
        doBuyNotepad();
        doRack();
        doFarmis();
        raiseEvent("gameCalcProdMinRack");
        if(DEVMODE){ GM_log("end calcProdMinRack"); }
        }catch(err){ GM_logError("calcProdMinRack ("+err_trace+")\ntype="+type+" prod="+prod+"\n"+err); }
    }

function getQuestBestAlternative(arr){
// item=[prodType,prodId,amount]. arr=item or arr=[item,item,...]
    if(typeof arr[0]=="object"){
        var returnId,minPrice=null,currPrice;
        for(var k=0;k<arr.length;k++){
            if(arr[k][0]!=0){
                currPrice=0;
            }else if(isNaN(NPC[0][arr[k][1]])){
                currPrice=arr[k][2]*gut[arr[k][1]];
            }else{
                currPrice=arr[k][2]*Math.min(gut[arr[k][1]],NPC[0][arr[k][1]]);
            }
            if((minPrice==null)||(currPrice<minPrice)){
                minPrice=currPrice;
                returnId=k;
            }
        }
        return arr[returnId];
    } if(typeof arr=="object"){
        return arr;
    } else {
        GM_logWarning("getQuestBestAlternative bad call arr="+implode(arr));
        return [];
    }
}
unsafeData.getQuestBestAlternative=getQuestBestAlternative;
function setCalcToQuest(type,campaign,nr){
try{
    // GM_log("setCalcToQuest type="+type+" campaign="+campaign+" nr="+nr); 
    if(QUESTS[type]&&QUESTS[type][campaign]&&questData[type][campaign]){
        questData[type][campaign]["calcTo"] = Math.min(nr,QUESTS[type][campaign].length);
        GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_questData",implode(questData));
        unsafeData.questData=questData.clone();     
        // if(farmiLog){ doFarmis(); } //hack bypass early call
        calcProdMinRack();
        handleQuestLine(); 
    }
}catch(err){ GM_logError("setCalcToQuest\n"+err); }
}
unsafeData.setCalcToQuest=setCalcToQuest;
function handleQuestLine(){
try{
    // GM_log("unsafeWindow.quests_status:\n"+print_r(unsafeWindow.quests_status,"",true,"\n"));        
    var div,help;
    for(var type in questData){
        if (!questData.hasOwnProperty(type)){ continue; }
        for(var campaign in questData[type]){
            if(!questData[type].hasOwnProperty(campaign)){continue;}
            // GM_log("questData["+type+"]["+campaign+"]:\n"+print_r(questData[type][campaign],"",true,"\n"));
            if((type=="foodworld")&&unsafeWindow.quests_status&&unsafeWindow.quests_status[type]&&unsafeWindow.quests_status[type][campaign]&&unsafeWindow.quests_status[type][campaign]["data"]){
                unsafeWindow.quests_status[type][campaign]["questid"]=unsafeWindow.quests_status[type][campaign]["data"]["questid"]; //Bugfix
            }
            if(unsafeWindow.quests_status&&unsafeWindow.quests_status[type]&&unsafeWindow.quests_status[type][campaign]){
                help=parseInt(unsafeWindow.quests_status[type][campaign]["questid"],10);
                if(isNaN(help)){ help=1; };
                switch(implode([type,campaign])){
                case implode(["main","2"]):{
                    if(USERLEVEL<31){ help=-1; }
                break;}
                case implode(["forestry","1"]):{
                    if(USERLEVEL<20){ help=-1; }
                break;}
                case implode(["forestry","2"]):{
                    if(questData["forestry"]["1"]["nr"]<35){ help=-1; }
                break;}
                case implode(["foodworld","1"]):{
                    if(USERLEVEL<12){ help=-1; }
                break;}
                }               
                // if((type=="forestry")&&(campaign=="2")){ help++; } // Bugfix
                if(questData[type][campaign]["nr"]!=help){
                    switch(type){
                    case "main":{ logBubble.add(getText("pleaseOpenX").replace(/%1%/,getText("quest"+type+campaign))+" ("+questData[type][campaign]["nr"]+"&ne;"+help+")"); break;}
                    case "forestry":{ logBubble.add(getText("pleaseOpenX").replace(/%1%/,getText("lodge"))+" ("+questData[type][campaign]["nr"]+"&ne;"+help+")"); break;}
                    case "foodworld":{ logBubble.add(getText("pleaseOpenX").replace(/%1%/,getText("foodworld"))+" ("+questData[type][campaign]["nr"]+"&ne;"+help+")"); break;}
                    }
                    if(!QUESTS[type][campaign][questData[type][campaign]["nr"]]){
                        questData[type][campaign]["nr"]=help;
                        questData[type][campaign]["given"] = new Object();
                        questData[type][campaign]["time"] = 0;
                        GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_questData",implode(questData));
                        unsafeData.questData=questData.clone();
                    }
                }
            }else{
                help=QUESTS[type][campaign].length;
                switch(implode([type,campaign])){
                case implode(["main","2"]):{
                    if(USERLEVEL<31){ help=-1; }
                break;}
                case implode(["forestry","1"]):{
                    if(USERLEVEL<20){ help=-1; }
                break;}
                case implode(["forestry","2"]):{
                    if(questData["forestry"]["1"]["nr"]<35){ help=-1; }
                break;}
                case implode(["foodworld","1"]):{
                    if(USERLEVEL<12){ help=-1; }
                break;}
                }
                if(questData[type][campaign]["nr"]!=help){
                    questData[type][campaign]["nr"]=help;
                    questData[type][campaign]["given"] = new Object();
                    questData[type][campaign]["time"] = 0;
                    GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_questData",implode(questData));
                    unsafeData.questData=questData.clone();
                }
            }
            if(div=$("quests_status_bar_"+type+campaign)){
                if(questData[type][campaign]["nr"]==0){
                    div.style.display="block"; // quest number unknown
                    switch(type){
                    case "main":{ logBubble.add(getText("informationIsMissing")+" "+getText("pleaseOpenX").replace(/%1%/,getText("quest"+type+campaign))); break;}
                    case "forestry":{ logBubble.add(getText("informationIsMissing")+" "+getText("pleaseOpenX").replace(/%1%/,getText("lodge"))); break;}
                    case "foodworld":{ logBubble.add(getText("informationIsMissing")+" "+getText("pleaseOpenX").replace(/%1%/,getText("foodworld"))); break;}
                    }                       
                }else if((questData[type][campaign]["nr"]==-1)||(questData[type][campaign]["calcTo"]==-1)){
                    div.style.display="none"; // do not show quest
                }else if(QUESTS[type][campaign][questData[type][campaign]["nr"]]){
                    div.style.display="block"; // quest available
                }else{
                    div.style.display="none"; // all quests done
                }
                if(!unsafeWindow.premium){
                    switch(type){
                    case "forestry":{
                        div.addEventListener("click",function(){ 
                            if((gameLocation[0]=="city")&&(gameLocation[1]==2)){
                                unsafeWindow.close_page();
                                unsafeWindow.showDiv("transp3");
                                unsafeWindow.initCampaigns();
                            }else{
                                document.addEventListener("gameCity2",function(){
                                    document.removeEventListener("gameCity2",arguments.callee,false);
                                    unsafeWindow.close_page();
                                    unsafeWindow.showDiv("transp3");
                                    unsafeWindow.initCampaigns();
                                },false);
                                click($("speedlink_city2"));                                
                            }
                        },false);
                    break;}
                    case "foodworld":{
                        div.addEventListener("click",function(){ 
                            if(gameLocation[0]=="foodworld"){
                                click($("foodworld_questblock"));
                            }else{
                                document.addEventListener("gameFoodworldOpened",function(){
                                    document.removeEventListener("gameFoodworldOpened",arguments.callee,false);
                                    click($("foodworld_questblock"));
                                },false);
                                click($("speedlink_foodworld"));                                
                            }
                        },false);
                    break;}
                    }
                }
            }
        }
    }
    div=null;
}catch(err){GM_logError("handleQuestLine\ntype="+type+"\ncampaign="+campaign+"\n"+err);}
};
//***********************************************************************************************************

function do_shop(){
    if(pageZusatz["s"]=="3"){
        // Decoration - Shop
        npcSaison=explode(GM_getValue(COUNTRY+"_"+SERVER+"_NpcSaison"),"do_shop/npcSaison",INIT_NPC_SAISON);
        for(var v in npcSaison){
            if(!npcSaison.hasOwnProperty(v)){ continue; }
            npcSaison[v]=(document.getElementsByClassName("s"+v).length>0);
        }
        unsafeData.npcSaison=npcSaison.clone();
        GM_setValue(COUNTRY+"_"+SERVER+"_NpcSaison",implode(npcSaison));
    }
}

function do_stats(){
    var canddiv;
    var currStat="1";
    try{ currStat=pageZusatz["type"]; }
    catch(err){ currStat="1"; }
    if (typeof pageZusatz["search"]!="undefined"){ currStat="0"; }
    if (typeof pageZusatz["guildsearch"]!="undefined"){
        unsafeWindow.initGuildsearch();
        $("guildname").value=pageZusatz["guildsearch"];
        unsafeWindow.stats_searchGuild();
    }

    switch (currStat){
    case "0": // Einzelspieler
        try {
            loadProductData();
            var newdiv=$("spielerinfo");
            var newdiv1;
            for(var v=0;v<newdiv.childElementCount;v++){
                newdiv1=createElement("div",{"class":"hoverBgLightblue","style":"height:15px;width:100%;"});
                newdiv.insertBefore(newdiv1,newdiv.children[v]);
                newdiv1.appendChild(newdiv.children[v+1]); // left cell
                newdiv1.appendChild(newdiv.children[v+1]); // right cell
                removeElement(newdiv.children[v+1]); // br node
            }

            canddiv=$("spielerinfo").getElementsByClassName("cright3");
            var thisUser=/(.*?)&nbsp;/.exec(canddiv[0].firstElementChild.innerHTML+"&nbsp;")[1];
            canddiv[0].insertBefore(vertrag(thisUser),canddiv[0].firstElementChild);
            canddiv[0].insertBefore(stats(thisUser),canddiv[0].firstElementChild);
            canddiv[0].insertBefore(igm(thisUser),canddiv[0].firstElementChild);

            var nextQuest=parseInt(canddiv[5].innerHTML,10)+1;
            if(QUESTS["main"]["1"][nextQuest]){
                canddiv[5].parentNode.setAttribute("nextQuest",nextQuest);
                canddiv[5].parentNode.addEventListener("mouseover",function(event){
                    var nextQuest=this.getAttribute("nextQuest");
                    var str="<div style='border-bottom:1px solid black;'>"+getText("quest_farm")+"&nbsp;"+nextQuest+"</div>";
                    for(var i=0;i<QUESTS["main"]["1"][nextQuest][0].length;i++){
                        if(typeof QUESTS["main"]["1"][nextQuest][0][i][0]=="object"){
                            for(var j=0;j<QUESTS["main"]["1"][nextQuest][0][i].length;j++){                 
                                str += "<div>*"+numberFormat(QUESTS["main"]["1"][nextQuest][0][i][j][2])+"&nbsp;"+prodName[QUESTS["main"]["1"][nextQuest][0][i][j][0]][QUESTS["main"]["1"][nextQuest][0][i][j][1]]+"</div>";
                            }
                        }else{
                            str += "<div>"+numberFormat(QUESTS["main"]["1"][nextQuest][0][i][2])+"&nbsp;"+prodName[QUESTS["main"]["1"][nextQuest][0][i][0]][QUESTS["main"]["1"][nextQuest][0][i][1]]+"</div>";
                        }
                    }
                    toolTip.show(event,str);
                },false);
            }
            nextQuest=null;
        } catch(err){}
        break;
    // Spielerlisten
    case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "10": case "11":
        if($("rankinghead")){
            canddiv=createElement("input",{"class":"text","maxlength":"5","style":"margin-left:10px;width:40px;"},$("rankinghead"));
            canddiv.addEventListener("mouseover",function(event){ toolTip.show(event,getText("goToRank")); },false);
            canddiv.addEventListener("change",function(){
                var ranksPerPage=15;
                var targetPage=parseInt(this.value,10);
                if(targetPage>0){
                    targetPage=Math.ceil(targetPage/ranksPerPage);
                    location.href="stats.php?page="+targetPage+"&type="+currStat;
                }else{
                    this.value="";
                }
            },false);
        }

        canddiv=$("rankingcontent").getElementsByClassName("stats_name");
        for(var v=0;v<canddiv.length;v++){
            thisUser=/(.*?)&nbsp;/.exec(canddiv[v].firstElementChild.innerHTML+"&nbsp;")[1];
            thisGuild=/&nbsp;\[(.*?)\]&nbsp;/.exec(canddiv[v].firstElementChild.innerHTML+"&nbsp;");
            var help=canddiv[v].firstElementChild.innerHTML.replace(thisUser,"<a href='stats.php?search=1&searchterm="+thisUser+"'>"+thisUser+"</a>");
            if(thisGuild) help=help.replace(thisGuild[0],"&nbsp;[<a href='stats.php?guildsearch="+thisGuild[1]+"'>"+thisGuild[1]+"</a>]&nbsp;");
            canddiv[v].firstElementChild.innerHTML=help;
            canddiv[v].insertBefore(igm(thisUser),canddiv[v].firstElementChild);
        }
        break;
    }
    canddiv=null;
}

function do_wettbewerb(){ // in .de not used anymore
    var candtd=document.getElementsByTagName("table")[1].getElementsByTagName("td");
    for(var v=6;v<candtd.length;v=v+3){
        var thisUser=/(.*?)&nbsp/.exec(candtd[v].firstElementChild.innerHTML+"&nbsp")[1];
        igm(thisUser,candtd[v]);
    }
    candtd=null;
}

//***********************************************************************************************************

unsafeWindow.buildInfoPanel=function(mode,mode2){
try{
    if(typeof mode2=="undefined"){ mode2=""; }
    var div,div1;
    if(!(div=$("infoPanel"))){
        if(div1=$("garten_komplett")){
            div=createElement("div",{"id":"infoPanel","mode":"","style":"z-index:100;background-color:rgba(0,0,0,0.7);position:absolute;top:0;left:0;width:100%;height:100%;z-index:100;display:none;"},div1);
            div1=createElement("div",{"style":"position:absolute;top:50px;left:20px;width:660px;height:580px;"},div);
        }else{
            div=createElement("div",{"id":"infoPanel","mode":"","style":"z-index:100;background-color:rgba(0,0,0,0.7);position:absolute;top:0;left:0;width:100%;height:100%;z-index:100;display:none;"},ALL);
            div1=createElement("div",{"style":"position:absolute;top:50px;left:100px;width:660px;height:580px;"},div);
        }
        createElement("img",{"src":GFX+"guild/help_back.jpg","style":"position:absolute;top:0;left:0;width:100%;height:100%;z-index:-1;"},div1);
        createElement("div",{"id":"infoPanelInner","style":"position:absolute;top:0;left:0;width:596px;height:516px;margin:32px;overflow:none;"},div1);
        div1=createElement("img",{"id":"infoPanelClose","class":"link","src":GFX+"close.jpg","style":"position:absolute;top:8px;right:8px;width:20px;height:20px;"},div1);
        div1.addEventListener("click",closeInfoPanel,false);
    }
    if((mode==div.getAttribute("mode"))&&(implode(mode2)==div.getAttribute("mode2"))){
        closeInfoPanel();
    }else{
        div.setAttribute("mode",mode);
        div.setAttribute("mode2",implode(mode2));
        div.style.display="block";
        $("infoPanelInner").innerHTML="";
        if(unsafeWindow.buildInfoPanelAutomat){ unsafeWindow.buildInfoPanelAutomat(mode,mode2); }
        switch(mode){
        case "changelog": buildInfoPanelChangelog();  break;
        case "donkey":    buildInfoPanelDonkey();     break;
        case "farmies":   buildInfoPanelFarmies();    break;
        case "formulas":  buildInfoPanelFormulas();   break;
        case "level":     buildInfoPanelLevel();      break;
        case "lottery":   buildInfoPanelLottery();    break;
        case "menu":      unsafeWindow.buildInfoPanelMenu(mode2); break;
        case "profit":    buildInfoPanelProfit();     break;
        case "quests":    buildInfoPanelQuests();     break;
        case "messages":  buildInfoPanelMessages();   break;
        case "stock":     buildInfoPanelStock(mode2); break;
        case "upjersAds": buildInfoPanelUpjersAds();  break;
        case "zones":     buildInfoPanelZones();      break;
        }
        raiseEvent("gameInfoPanelOpen");
        div=null;div1=null;
    }
}catch(err){ GM_logError("buildInfoPanel mode="+implode(mode)+" mode2="+implode(mode2)+"\n"+err); }
}
function closeInfoPanel(){
    try{
        var div;
        if(div=$top("infoPanel")){
            div.setAttribute("mode","");
            div.style.display="none";
        }
        if(div=$top("infoPanelInner")){
            div.innerHTML="";
        }
        div=null;
    } catch(err){ GM_logError("closeInfoPanel\n"+err); }
}
function buildInfoPanelChangelog(){
    try{
        var table,tr,td,div;
        var container=$("infoPanelInner");
        container.innerHTML="";
        // Head
        newdiv=createElement("div",{"class":"borderBottom1Black","style":"height:50px;"},container);
        table=createElement("table",{"border":"0","cellspacing":"0","style":"width:100%;"},newdiv);
        tr=createElement("tr",{},table);
        createElement("td",{"class":"tnormal","style":"color:black;font-weight:bold;text-align:center;height:40px;"},tr,getText("adviser")+" "+VERSION);
        createElement("td",{},tr);
        // Body
        newdiv=createElement("div",{"style":"height:470px;width:100%;overflow:auto;"},container);
        table=createElement("table",{"border":"0","cellspacing":"0","style":"width:100%;"},newdiv);
        tr=createElement("tr",{},table);
        createElement("th",{},tr,getText("version"));
        createElement("th",{},tr,getText("date"));
        createElement("th",{},tr,getText("change"));
        for(var i=CHANGELOG.length-1;i>-1;i--){
            tr=createElement("tr",{"class":"hoverBgCc9 borderBottom1dashedGrey"},table);
            createElement("td",{},tr,CHANGELOG[i][0]);
            createElement("td",{},tr,CHANGELOG[i][1]);
            td=createElement("td",{},tr);
            div=createElement("ul",{},td);
            for(var j=0;j<CHANGELOG[i][2].length;j++){
                createElement("li",{},div,CHANGELOG[i][2][j][LANGUAGE=="de"?0:1]);
            }
        }
        container=null;table=null;tr=null;td=null;div=null;
    }catch(err){GM_logError("buildInfoPanelChangelog\n"+err);}
}
function buildInfoPanelStock(mode){
try{
    var help=mode["filterCategory"];
    var modeDefault={"filterCategories":[{"v":true},{"f1":true},{"r1":true},{"f1":true}],"filterCategory":{"v":true},"page":1,"prodType":0,"showAll":false};
    var modeOld=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeStockTable"),"buildInfoPanelStock/modeOld");
    if(typeof modeOld!="object"){ modeOld=modeDefault; }
    if(typeof mode!="object"){ mode=modeOld; }
    for(var v in modeDefault){
        if(!modeDefault.hasOwnProperty(v)){ continue; }
        if(mode[v]==undefined){ mode[v]=(modeOld[v]==undefined?modeDefault[v]:modeOld[v]); }
    }
    if(mode["prodType"]>0){ mode["page"]=2; }
    if(help){ 
        mode["filterCategories"][mode["prodType"]]=mode["filterCategory"];
    }else{
        mode["filterCategory"]=mode["filterCategories"][mode["prodType"]];
    }
    GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeStockTable",implode(mode,"buildInfoPanelStock/mode"));
    var container=$("infoPanelInner");
    container.innerHTML="";
    //head line
    var newdiv=createElement("div",{"class":"borderBottom1Black","style":"height:50px;width:100%;font-color:black;overflow:none;"},container);
    var newtable=createElement("table",{"border":"0","cellspacing":"0","style":"width:100%;"},newdiv);
    var newtr=createElement("tr",{},newtable);
    // switch price / stock
    var newtd=createElement("td",{"align":"center"},newtr);
    if(mode["prodType"]==0){
        newdiv=createElement("div",{"class":"link naviItem"+(mode["page"]==1?"Active":"")},newtd,getText("prices"));
        newdiv.addEventListener("click",function(){
            buildInfoPanelStock({"page":1});
        },false);
    }else{
        newdiv=createElement("div",{"class":"naviItemInactive"},newtd,getText("prices"));
    }
    newdiv=createElement("div",{"class":"link naviItem"+(mode["page"]==2?"Active":"")},newtd,getText("stock"));
    newdiv.addEventListener("click",function(){
        buildInfoPanelStock({"page":2});
    },false);
    // switch prodType
    newtd=createElement("td",{"align":"left"},newtr);
    newdiv = createElement("select",{},newtd);
    createElement("option",{"value":0},newdiv,getText("farm"));
    createElement("option",{"value":1},newdiv,getText("forestry"));
    createElement("option",{"value":2},newdiv,getText("recipes"));
    createElement("option",{"value":3},newdiv,getText("powerups"));
    newdiv.addEventListener("change",function(){
        buildInfoPanelStock({"prodType":parseInt(this.value,10)});
    },false);
    newdiv.value=mode["prodType"];
    // switch filterCategory
    newtd=createElement("td",{"align":"right"},newtr);

    newdiv=createElement("div",{"style":"-moz-user-select:none;float:right;"},newtd);
    newdiv.addEventListener("mouseover",function(event){
        var mouseOverText=event.target.getAttribute("mouseOverText");
        if(mouseOverText){
            mouseOverText='<div>'+getText("click")+'&nbsp;/&nbsp;'+getText("clickCtrl")+'</div><div>'+mouseOverText+'</div>';
            toolTip.show(event,mouseOverText);
        }
    },false);
    newdiv.addEventListener("click",function(filterCategory){
    return function(event){
        var thisFilter=explode(event.target.getAttribute("filter"),"buildInfoPanelStock\thisFilter");
        if(thisFilter){
            if(event.ctrlKey){
                for(var i=thisFilter.length-1;i>-1;i--){
                    if(filterCategory[thisFilter[i]]){
                        delete filterCategory[thisFilter[i]];
                    }else{
                        filterCategory[thisFilter[i]]=true;
                    }
                }
            }else{
                filterCategory={};
                for(var i=thisFilter.length-1;i>-1;i--){
                    filterCategory[thisFilter[i]]=true;
                }
            }
            buildInfoPanelStock({"filterCategory":filterCategory});
        }
    }}(mode["filterCategory"]),false);
    switch(mode["prodType"]){
    case 0:{
        createElement("div",{"class":"link rackcat1v"+(mode["filterCategory"]["v"]?"_active":""),"filter":'["v"]',"mouseOverText":getText("category_v"),"style":"float:left;"},newdiv);
        createElement("div",{"class":"link rackcat1e"+(mode["filterCategory"]["e"]?"_active":""),"filter":'["e"]',"mouseOverText":getText("category_e"),"style":"float:left;"},newdiv);
        createElement("div",{"class":"link rackcat5"+(mode["filterCategory"]["o"]?"_active":""),"filter":'["o"]',"mouseOverText":getText("category_o"),"style":"float:left;"},newdiv);
        createElement("div",{"class":"link rackcat10"+(mode["filterCategory"]["c"]||mode["filterCategory"]["z"]?"_active":""),"filter":'["c","z"]',"mouseOverText":getText("category_c")+"<br>"+getText("category_z"),"style":"float:left;"},newdiv);
        newdiv1=createElement("div",{"style":"float:left;width:53px;"},newdiv);
        for(var i=1;i<=4;i=i+2){
            createElement("div",{"class":"link rackcat2"+i+(mode["filterCategory"]["fw"+i]?"_active":""),"filter":'["fw'+i+'"]',"mouseOverText":getText("category_fw"+i),"style":"float:left;"},newdiv1);
            if(i==3){ i=0; }
        }
        createElement("div",{"class":"link rackcat30fl"+(mode["filterCategory"]["fl"]?"_active":""),"filter":'["fl"]',"mouseOverText":getText("category_fl"),"style":"float:left;"},newdiv);
        createElement("div",{"class":"link rackcat30fla"+(mode["filterCategory"]["fla"]?"_active":""),"filter":'["fla"]',"mouseOverText":getText("category_fla"),"style":"float:left;"},newdiv);
    } break;
    case 1:{
        for(var i=1;i<=5;i++){
            newdiv1=createElement("div",{"class":"category_f"+i+(mode["filterCategory"]["f"+i]?"_active":"")+" link","filter":'["f'+i+'"]',"mouseOverText":getText("category_f"+i),"style":"display:inline-block;"},newdiv);
        }
    } break;
    case 2:{
        for(var i=0;i<=2;i++){
            newdiv1=createElement("div",{"class":"category_r"+i+(mode["filterCategory"]["r"+i]?"_active":"")+" link","filter":'["r'+i+'"]',"mouseOverText":getText("category_r"+i),"style":"display:inline-block;"},newdiv);
        }
    } break;
    case 3:{
        for(var i=0;i<=2;i++){
            newdiv1=createElement("div",{"class":"category_r"+i+(mode["filterCategory"]["p"+i]?"_active":"")+" link","filter":'["p'+i+'"]',"mouseOverText":getText("category_p"+i),"style":"display:inline-block;"},newdiv);
        }
    } break;
    }

    //the table
    newdiv=createElement("div",{"class":"borderBottom1Black","style":"height:430px;overflow:auto;"},container);
    newtable=createElement("table",{"border":"0","cellspacing":"0","style":"width:100%;"},newdiv);
    newtable.addEventListener("mouseover",function(event){
        var node=event.target;
        var mouseOverText=node.getAttribute("mouseOverText");
        while((node!=this)&&(!mouseOverText)){
            node=node.parentNode;
            mouseOverText=node.getAttribute("mouseOverText");
        }
        if(mouseOverText){ toolTip.show(event,mouseOverText); }
        node=null;mouseOverText=null;
    },false);

    var thead=createElement("thead",{},newtable); // sortable table
    var newtablebody=createElement("tbody",{},newtable);

    var sumwert=0;
    newtr=createElement("tr",{},thead);
    switch(mode["page"]){
    case 1:{
        createElement("th",{"colspan":"2"},newtr,getText("product"));
        createElement("th",{},newtr,getText("inventory"));
        createElement("th",{},newtr,"&nbsp;"+getText("NPCprice"));
        createElement("th",{},newtr,"&nbsp;"+getText("observed"));
        createElement("th",{},newtr,getText("marketPrice"));
        createElement("th",{},newtr,getText("afterFee"));

        var prevTyp=null;
        for(var w=0;w<prodNameSort[mode["prodType"]].length;w++){
        try{
            v=prodNameSort[mode["prodType"]][w];
            if((!prodBlock[mode["prodType"]][v].match(/t/))&&(mode["showAll"]||((!prodBlock[mode["prodType"]][v].match(/l/))&&(!prodBlock[mode["prodType"]][v].match(/q/))))){
                if (mode["filterCategory"][prodTyp[mode["prodType"]][v]]){
                    if(prodTyp[mode["prodType"]][v]!="c"){ sumwert += prodStock[mode["prodType"]][v]*gut[v]; }
                    if((prevTyp!=null)&&(prevTyp!=prodTyp[mode["prodType"]][v])){
                        newtr=createElement("tr",{"class":"hoverBgCc9 borderTop1dashedBlack"},newtablebody);
                    }else{
                        newtr=createElement("tr",{"class":"hoverBgCc9"},newtablebody);
                    }
                    prevTyp=prodTyp[mode["prodType"]][v];
    
                    newdiv=createElement("td",{},newtr);
                    produktPic(mode["prodType"],v,newdiv);
    
                    newdiv=createElement("td",{},newtr);
                    newa=createElement("a",{"prodId":v},newdiv,prodName[mode["prodType"]][v]);
                    if(prodBlock[mode["prodType"]][v].match(/l/)){
                        newtr.setAttribute("mouseOverText",getText("levelXneeded").replace(/%1%/,/l(\d+)/.exec(prodBlock[mode["prodType"]][v])[1]));
                        newa.style.textDecoration="none";
                    }else if(prodBlock[mode["prodType"]][v].match(/t/)){
                        newa.style.textDecoration="none";
                    }else{
                        if(mode["prodType"]==0){
                            newtr.setAttribute("mouseOverText",getText("value")+":&nbsp;"+moneyFormatInt(prodStock[mode["prodType"]][v]*gut[v]));
                            newa.setAttribute("mouseOverText",'<table class="tmenu"><tr><th colspan="2" class="lightBg">'+getText("goToMarketOfX").replace(/%1%/,prodName[mode["prodType"]][v])+'</th></tr><tr><td>'+getText("value")+'</td><td style="text-align:right;">'+moneyFormatInt(prodStock[mode["prodType"]][v]*gut[v])+'</td></table>');
                            newa.setAttribute("class","link");
                            newa.addEventListener("click",function(){showMarket(this.getAttribute("prodId"));},false);
                        }
                    }
    
                    createElement("td",{"style":"text-align:right;"},newtr,prodBlock[mode["prodType"]][v]?"<span style='color:red;'>---</span>":(prodStock[mode["prodType"]][v]?numberFormat(prodStock[mode["prodType"]][v]):"-"));
                    newtd=createElement("td",{"style":"text-align:right;"},newtr);
                    if(NPC[mode["prodType"]][v]){
                        if(!isNaN(NPC[mode["prodType"]][v])){
                            newtd.innerHTML=numberFormat(NPC[mode["prodType"]][v],2);
                        }else if (NPC[mode["prodType"]][v].match(/^f/)){
                            newtd.innerHTML="("+numberFormat(parseFloat(NPC[mode["prodType"]][v].replace("f",""),10),2)+")";
                        }else if (NPC[mode["prodType"]][v].match(/^c/)){
                            coinsFormat(parseInt(NPC[mode["prodType"]][v].replace("c",""),10),newtd);
                        }
                        if((npcSaison[v]!=undefined)&&(!npcSaison[v])){
                            newtd.style.textDecoration="line-through";
                            newtd.setAttribute("class","hoverNoTextDecoration");
                        }
                    }else{
                        newtd.innerHTML="&nbsp;";
                    }
    
                    newtd=createElement("td",{"style":"text-align:right;"},newtr,(gutBeob[v]?numberFormat(gutBeob[v],2):"&nbsp;"));
                    if(preisBeob[v]){
                        if(preisBeob[v][4]>0){
                            newtd.setAttribute("mouseOverText",getFormattedDateStr(preisBeob[v][1])+"&nbsp;"+getDaytimeStr(preisBeob[v][1])+"<br>"+moneyFormat(preisBeob[v][2])+"&nbsp;-&nbsp;"+moneyFormat(preisBeob[v][3])+"<br>#"+numberFormat(preisBeob[v][4]));
                        }else{
                            newtd.setAttribute("mouseOverText",getFormattedDateStr(preisBeob[v][1])+"&nbsp;"+getDaytimeStr(preisBeob[v][1])+"<br>#"+numberFormat(preisBeob[v][4]));
                            newtd.style.textDecoration="line-through";
                            newtd.setAttribute("class","hoverNoTextDecoration");
                        }
                        if(now-preisBeob[v][1]>259200){ // 3 days
                            if(now-preisBeob[v][1]>604800){ // 7 days
                                newtd.style.color="red";
                            }else{
                                newtd.style.color="yellow";
                            }
                        }
                    }else if(!prodBlock[mode["prodType"]][v]){
                        newtd.setAttribute("mouseOverText","---");
                    }
    
                    newtd=createElement("td",{"style":"text-align:right;"},newtr);
                    if(valNimmBeob){
                        newtd.innerHTML=numberFormat(gut[v],2);
                    }else{
                        createElement("span",{"style":"font-size:0;"},newtd,numberFormat(gut[v],2));
                        newinput=createElement("input",{"id":"inp"+v,"tabindex":parseInt(w,10)+1,"value":numberFormat(gut[v],2),"class":"text","size":"10","maxlength":"10","style":"text-align:right; background-color:transparent; color:black;"},newtd);
                        newinput.addEventListener("blur",function(){
                            this.value=numberFormat(gut[this.id.replace("inp","")],2);
                        },false);
                        newinput.addEventListener("change",function(){
                            var currId=this.id.replace("inp","");
                            var preis=Math.max(0,parseFloat(this.value.replace(regDelimThou,"").replace(regDelimDeci,"."),10));
                            var thisNode=this;
                            var yesFkt = function(){
                                gut[currId]=preis;
                                GM_setValue(COUNTRY+"_"+SERVER+"_gut",implode(gut));
                                raiseEventTop("gameChangedGut");
                                thisNode.value=numberFormat(preis,2);
                                thisNode.parentNode.nextSibling.innerHTML=numberFormat(0.9*preis,2);
                                thisNode=null;
                            };
                            var noFkt = function(){
                                thisNode.value=numberFormat(gut[currId],2);
                                thisNode=null;
                            };
                            if(preis==0){
                                alert2(getText("alertSetPriceNone").replace(/%PRODUCT%/,prodName[mode["prodType"]][currId]),getText("yes"),getText("no"),yesFkt,noFkt);
                            }else if((!isNaN(NPC[mode["prodType"]][currId]))&&(preis>NPC[mode["prodType"]][currId])){
                                alert2(getText("alertSetPriceOverNPC").replace(/%PRODUCT%/,prodName[mode["prodType"]][currId]).replace(/%PRICE%/,moneyFormat(preis)).replace(/%NPC%/,moneyFormat(NPC[mode["prodType"]][currId])),getText("yes"),getText("no"),yesFkt,noFkt);
                            }else if ((gutBeob[currId]!=undefined)&&(gutBeob[currId]>0)){
                                if(preis<0.7*gutBeob[currId]){
                                    alert2(getText("alertSetPriceUnderObs").replace(/%PRODUCT%/,prodName[mode["prodType"]][currId]).replace(/%PRICE%/,moneyFormat(preis)).replace(/%OBS%/,moneyFormat(gutBeob[currId])),getText("yes"),getText("no"),yesFkt,noFkt);
                                }else if (1.3*gutBeob[currId]<preis){
                                    alert2(getText("alertSetPriceOverObs").replace(/%PRODUCT%/,prodName[mode["prodType"]][currId]).replace(/%PRICE%/,moneyFormat(preis)).replace(/%OBS%/,moneyFormat(gutBeob[currId])),getText("yes"),getText("no"),yesFkt,noFkt);
                                }else{
                                    yesFkt();
                                }
                            }else{
                                yesFkt();
                            }
                            this.style.backgroundColor="transparent";
                        },false);
                    }
                    createElement("td",{"style":"text-align:right;"},newtr,numberFormat(0.9*gut[v],2));
                }
            }
        }catch(err){ GM_logError("buildInfoPanelStock\nmode="+implode(mode)+"\nv="+v+"\n"+err); }
        }
    break;}
    case 2:{
        var valMinRackMan=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valMinRackMan",false);
        createElement("th",{"align":"center"},newtr,"&nbsp;");
        newtd=createElement("th",{"align":"left","class":"link hoverBgLightblue","sortdir":"Desc"},newtr,getText("product"));
        newtd=createElement("th",{"align":"right","class":"link hoverBgLightblue","sortdir":"Asc"},newtr,getText("inventory"));
        newtd=createElement("th",{"align":"right","class":"link hoverBgLightblue","sortdir":"Asc"},newtr,"&nbsp;"+getText("value"));
        createElement("th",{"align":"right","style":"padding-right:20px"},newtr,"&nbsp;"+getText("minRack"));
        new SortableTable(newtr);

        for(var w=0;w<prodNameSort[mode["prodType"]].length;w++){
        try{
            v=prodNameSort[mode["prodType"]][w];
            if(mode["showAll"]||((!prodBlock[mode["prodType"]][v].match(/l/))&&(!prodBlock[mode["prodType"]][v].match(/q/)))){
                if (mode["filterCategory"][prodTyp[mode["prodType"]][v]]){
                    if((mode["prodType"]==0)&&(prodTyp[mode["prodType"]][v]!="c")){ sumwert+=prodStock[mode["prodType"]][v]*gut[v]; }
                    newtr=createElement("tr",{"class":"hoverBgCc9","v":v},newtablebody);
    
                    newdiv=createElement("td",{},newtr);
                    produktPic(mode["prodType"],v,newdiv);
    
                    newdiv=createElement("td",{"value":w},newtr);
                    newa=createElement("a",{"prodId":v},newdiv,prodName[mode["prodType"]][v]);
                    if(prodBlock[mode["prodType"]][v].match(/l/)){
                        newtr.setAttribute("mouseOverText",getText("levelXneeded").replace(/%1%/,/l(\d+)/.exec(prodBlock[mode["prodType"]][v])[1]));
                        newa.style.textDecoration="none";
                    }else if(prodBlock[mode["prodType"]][v].match(/t/)){
                        newa.style.textDecoration="none";
                    }else if(mode["prodType"]==0){
                        newtr.setAttribute("mouseOverText",getText("marketPrice")+":&nbsp;"+moneyFormat(gut[v])); 
                        newa.setAttribute("mouseOverText",'<table class="tmenu"><tr><th colspan="2" class="lightBg">'+getText("goToMarketOfX").replace(/%1%/,prodName[mode["prodType"]][v])+'</th></tr><tr><td>'+getText("marketPrice")+'</td><td style="text-align:right;">'+moneyFormat(gut[v])+'</td></table>');
                        newa.setAttribute("class","link");
                        newa.addEventListener("click",function(){showMarket(this.getAttribute("prodId"));},false);
                    }
    
                    if(prodBlock[mode["prodType"]][v].match(/l/)){
                        createElement("td",{"align":"right","value":0},newtr,"<span style='color:red;'>---</span>");
                        createElement("td",{"align":"right","value":0},newtr,"<span style='color:red;'>---</span>");
                    }else if(prodStock[mode["prodType"]][v]){
                        createElement("td",{"align":"right","value":prodStock[mode["prodType"]][v]},newtr,numberFormat(prodStock[mode["prodType"]][v]));
                        if(mode["prodType"]==0&&(!prodBlock[mode["prodType"]][v].match(/t/))){
                            createElement("td",{"align":"right","value":prodStock[mode["prodType"]][v]*gut[v]},newtr,numberFormat(prodStock[mode["prodType"]][v]*gut[v])); 
                        }else{
                            createElement("td",{"align":"right","value":0},newtr,"-");
                        }
                    }else{
                        createElement("td",{"align":"right","value":0},newtr,"-");
                        createElement("td",{"align":"right","value":0},newtr,"-");
                    }
    
                    newtd=createElement("td",{"align":"right","style":"padding-right:20px"},newtr);
                    if(valMinRackMan){
                        newinput=createElement("input",{"tabindex":parseInt(w,10)+1,"value":numberFormat(prodMinRackInit[mode["prodType"]][v]),"class":"text","size":"10","maxlength":"10","style":"text-align:right; background-color:transparent; color:black;"},newtd);
                        newinput.addEventListener("blur",function(){
                            this.value=numberFormat(parseInt(this.value.replace(regDelimThou,""),10));
                        },false);
                        newinput.addEventListener("change",function(prodType,currId){ return function(){
                            prodMinRackInit[prodType][currId]=parseInt(this.value.replace(regDelimThou,""),10);
                            GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodMinRackInit",implode(prodMinRackInit));
                            raiseEventTop("gameChangedProdMinRackInit");
                        }}(mode["prodType"],v),false);
                    }else{
                        createElement("span",{},newtd,numberFormat(prodMinRackInit[mode["prodType"]][v]));
                    }
                }
            }
        }catch(err){ GM_logError("buildInfoPanelStock\nmode="+implode(mode)+"\nv="+v+"\n"+err); }
        }
    break;}
    }
    newtablebody.setAttribute("height",Math.min(361,19*newtablebody.childElementCount)+"px");

    //foot line
    newdiv=createElement("div",{},container);
    newtable=createElement("table",{"border":"0","cellspacing":"0","style":"width:100%;"},newdiv);
    newtr=createElement("tr",{},newtable);
    newtd=createElement("td",{"align":"center"},newtr);
    newdiv=createElement("input",{"type":"checkbox","class":"link","checked":mode["showAll"]},newtd);
    newdiv.addEventListener("click",function(){
        buildInfoPanelStock({"showAll":this.checked});
    },false);
    createElement("span",{},newtd,getText("showAll"));
    newtd=createElement("td",{"align":"center"},newtr);
    if((mode["prodType"]==0)&&(mode["page"]==1)&&(!valNimmBeob)){
        newdiv=createElement("button",{"class":"link button_new","style":"margin-right:10px;"},newtd,getText("takeObservedPrices"));
        newdiv.addEventListener("click",function(){
            alert2(getText("confirmUseObservedPrices"),getText("yes"),getText("no"),function(){
                for(var v=0;v<gutBeob.length;v++){
                    gut[v]=gutBeob[v];
                    if(!isNaN(NPC[0][v])){ gut[v]=Math.min(gut[v],NPC[0][v]); }
                }
                GM_setValue(COUNTRY+"_"+SERVER+"_gut",implode(gut));
                raiseEventTop("gameChangedGut");
                buildInfoPanelStock();
            });
        },false);
    }
    newtd=createElement("td",{"align":"center","style":"font-weight:bold;"},newtr,getText("stockValue")+":&nbsp;"+moneyFormatInt(sumwert));
    newtable=null;thead=null;newtablebody=null;newtr=null;newtd=null;newdiv=null;newdiv1=null;
}catch(err){ GM_logError("buildInfoPanelStock\nmode="+implode(mode)+"\n"+err); }
}
function buildInfoPanelProfit(mode){
try{
    var err_trace="init";
    //GM_log("buildInfoPanelProfit "+implode(mode));
    var modeDefault={"perc":0.9,"showAll":false,"sort":"gut","buildingLevel":{},"feed":{},"filterCategory":{"v":true}};
    var modeOld=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeProfittable"),"buildInfoPanelProfit/modeOld");
    if(typeof modeOld!="object"){ modeOld=modeDefault; }
    if(typeof mode!="object"){ mode=modeOld; }
    for(var v in modeDefault){
        if(!modeDefault.hasOwnProperty(v)){ continue; }
        if(mode[v]==undefined){ mode[v]=(modeOld[v]==undefined?modeDefault[v]:modeOld[v]); }
    }   
    if(!mode["buildingLevel"]["1"]){ mode["buildingLevel"]["1"]=1; }
    // [alternative, fully fed(0/1)]
    err_trace="calc array";
    var profit=new Array();
    var c=-1;
    var help, currBuilding, preis, preisBeob, menge, bonus, currInput;
    for(var v=0;v<prodName[0].length;v++){ 
        if((mode["showAll"]||(!prodBlock[0][v]))&&(prodGrowTime[0][v])){
            if(mode["filterCategory"][prodTyp[0][v]]){
                    profit[++c]=new Object();
                    profit[c]["id"]=v;
                    currBuilding=PRODUCT2BUILDING[0][v];
                    if(!mode["buildingLevel"][currBuilding]){ mode["buildingLevel"][currBuilding]=1; }
                    profit[c]["level"]=mode["buildingLevel"][currBuilding];
                    profit[c]["maxlevel"]=BUILDING_UPGRADES[currBuilding].length;
                    if(!mode["showAll"]){
                        while((profit[c]["maxlevel"]>1)&&(USERLEVEL<BUILDING_UPGRADES[currBuilding][profit[c]["maxlevel"]-1][0])){ profit[c]["maxlevel"]--; }
                        profit[c]["level"]=Math.min(profit[c]["level"],profit[c]["maxlevel"]);
                    }
                    bonus=BUILDING_UPGRADES[currBuilding][profit[c]["level"]-1][2];
                    switch(BUILDINGTYPE[currBuilding]){
                    case 1:{ // Fields
                        if(questData["main"]["1"]["nr"]>170){ bonus-=0.05; }
                        profit[c]["input"]=[];
                        profit[c]["input"][0]=[[]];
                        profit[c]["dauer"] = calcProductionTime(1,0,v,bonus);
                        profit[c]["runs"]  = 86400/profit[c]["dauer"];
                        preis=gut[v];
                        preisBeob=(gutBeob[v]?gutBeob[v]:0);
                        if(!isNaN(NPC[0][v])){
                            preis=Math.min(NPC[0][v],preis);
                            preisBeob=Math.min(NPC[0][v],preisBeob); 
                        }
                        menge=profit[c]["runs"]*(BUILDING_SIZE[currBuilding]/prodPlantSize[0][v]);
                        profit[c]["input"][0][0][0]=[v,menge,preis,preisBeob];
                        profit[c]["menge"] = menge*prodYield[0][v];
                        profit[c]["punkte"]= menge*prodPoints[0][v];
                        help=profit[c]["input"][0][0];
                    break;}
                    case 2:{ // Stable
                        if(!mode["feed"][v]){ mode["feed"][v]=[0,0]; }
                        if(typeof mode["feed"][v][0]!="number"){ mode["feed"][v][0]=0; }
                        if(typeof mode["feed"][v][1]!="number"){ mode["feed"][v][1]=0; }
                        profit[c]["input"]=[];
                        help=[];
                        for(var alt=0;alt<BUILDING_INPUT[currBuilding][v].length;alt++){
                            profit[c]["input"][alt]=[[],[]];
                            help[alt]=[[],[]];
                            help[alt][0]=calcProductionTime(2,0,v,bonus,BUILDING_INPUT[currBuilding][v][alt][0][1]/BUILDING_UPGRADES[currBuilding][profit[c]["level"]-1][3]);
                            help[alt][1]=calcProductionTime(2,0,v,bonus,BUILDING_INPUT[currBuilding][v][alt][0][1]/BUILDING_UPGRADES[currBuilding][profit[c]["level"]-1][3],1);
                            for(var i=0;i<BUILDING_INPUT[currBuilding][v][alt].length;i++){
                                currInput=BUILDING_INPUT[currBuilding][v][alt][i];
                                preis=gut[currInput[0]];
                                preisBeob=(gutBeob[currInput[0]]?gutBeob[currInput[0]]:0);
                                if(!isNaN(NPC[0][currInput[0]])){
                                    preis=Math.min(NPC[0][currInput[0]],preis);
                                    preisBeob=Math.min(NPC[0][currInput[0]],preisBeob); 
                                }
                                menge=help[alt][1][1]*86400/help[alt][1][0];
                                profit[c]["input"][alt][1][i]=[currInput[0],menge,preis,preisBeob];
                                menge=help[alt][0][1]*86400/help[alt][0][0];
                                profit[c]["input"][alt][0][i]=[currInput[0],menge,preis,preisBeob];
                            }
                        }
                        if(!help[mode["feed"][v][0]]){ mode["feed"][v][0]=0; }
                        if(!help[mode["feed"][v][0]][mode["feed"][v][1]]){ mode["feed"][v][1]=0; }
                        profit[c]["dauer"] = help[mode["feed"][v][0]][mode["feed"][v][1]][0];
                        profit[c]["runs"]  = 86400/profit[c]["dauer"];
                        profit[c]["menge"] = profit[c]["runs"]*BUILDING_UPGRADES[currBuilding][profit[c]["level"]-1][3]*prodYield[0][v];
                        profit[c]["punkte"]= profit[c]["menge"]*prodPoints[0][v];
                        help=profit[c]["input"][mode["feed"][v][0]][mode["feed"][v][1]];
                    break;}
                    case 3:{ // Factory
                        if(!mode["feed"][v]){ mode["feed"][v]=[0,0]; }
                        if(typeof mode["feed"][v][0]!="number"){ mode["feed"][v][0]=0; }
                        if(typeof mode["feed"][v][1]!="number"){ mode["feed"][v][1]=0; }
                        profit[c]["input"]=[];
                        help=[];
                        for(var alt=0;alt<BUILDING_INPUT[currBuilding][v].length;alt++){
                            profit[c]["input"][alt]=[[]];
                            help[alt]=[[]];
                            help[alt][0][0]=calcProductionTime(3,0,v,bonus);
                            for(var i=0;i<BUILDING_INPUT[currBuilding][v][alt].length;i++){
                                currInput=BUILDING_INPUT[currBuilding][v][alt][i];
                                preis=gut[currInput[0]];
                                preisBeob=(gutBeob[currInput[0]]?gutBeob[currInput[0]]:0);
                                if(!isNaN(NPC[0][currInput[0]])){
                                    preis=Math.min(NPC[0][currInput[0]],preis);
                                    preisBeob=Math.min(NPC[0][currInput[0]],preisBeob); 
                                }                                   
                                menge=currInput[1]*86400/help[alt][0][0];
                                profit[c]["input"][alt][0][i]=[currInput[0],menge,preis,preisBeob];
                            }
                        }
                        if(!help[mode["feed"][v][0]]){ mode["feed"][v][0]=0; }
                        if(!help[mode["feed"][v][0]][mode["feed"][v][1]]){ mode["feed"][v][1]=0; }
                        profit[c]["dauer"] = help[mode["feed"][v][0]][mode["feed"][v][1]][0];
                        profit[c]["runs"]  = 86400/profit[c]["dauer"];
                        profit[c]["menge"] = profit[c]["runs"]*BUILDING_UPGRADES[currBuilding][profit[c]["level"]-1][3]*prodYield[0][v];
                        profit[c]["punkte"]= profit[c]["menge"]*prodPoints[0][v];
                        help=profit[c]["input"][mode["feed"][v][0]][mode["feed"][v][1]];
                    break;}
                    case 4:{ // Foodworld, flowers
                        profit[c]["input"]=[];
                        profit[c]["input"][0]=[[]];
                        profit[c]["dauer"]=calcProductionTime(BUILDINGTYPE[currBuilding],0,v,bonus);
                        profit[c]["runs"]  = 86400/profit[c]["dauer"];
                        for(var i=0;i<prodRequire[0][v].length;i++){
                            currInput=prodRequire[0][v][i];
                            switch(currInput[0]){
                            case -1:{
                                preis=1;
                                preisBeob=1;
                                menge=currInput[1]*profit[c]["runs"];
                                profit[c]["input"][0][0][i]=[-1,menge,preis,preisBeob];
                            break;}
                            case 0:{
                                preis=gut[currInput[1]];
                                preisBeob=(gutBeob[currInput[1]]?gutBeob[currInput[1]]:0);
                                if(!isNaN(NPC[0][currInput[1]])){
                                    preis=Math.min(NPC[0][currInput[1]],preis);
                                    preisBeob=Math.min(NPC[0][currInput[1]],preisBeob); 
                                }
                                menge=currInput[2]*profit[c]["runs"];
                                profit[c]["input"][0][0][i]=[currInput[1],menge,preis,preisBeob];
                            break;}
                            }
                        }
                        profit[c]["menge"] = profit[c]["runs"]*BUILDING_UPGRADES[currBuilding][profit[c]["level"]-1][3]*prodYield[0][v];
                        profit[c]["punkte"]= profit[c]["menge"]*prodPoints[0][v];
                        help=profit[c]["input"][0][0];
                    break;}
                    }
                    menge=profit[c]["menge"];
                    preis=mode["perc"]*gut[v];
                    preisBeob=mode["perc"]*(gutBeob[v]?gutBeob[v]:0);
                    profit[c]["output"]=[v,menge,preis,preisBeob];
                    profit[c]["gut"]=menge*preis
                    profit[c]["gutBeob"]=menge*preisBeob;
                    for(var i=0;i<help.length;i++){
                        profit[c]["gut"]-=help[i][1]*help[i][2];
                        profit[c]["gutBeob"]-=help[i][1]*help[i][3];
                    }
                
                // GM_log(prodName[0][v]+":"+implode(profit[c]));
            }
        }
    }
    profit.sort(function (a,b){return b[mode["sort"]] - a[mode["sort"]];});
    // console.log("variable:\n"+print_r(profit,"",true,"\n"));
   
    //head line
    err_trace="head line";
    var table,newtr,newtd,newspan,newdiv,newtable1,newtr1,newtd1;
    var container=$("infoPanelInner");
    container.innerHTML="";
    newdiv=createElement("div",{"class":"borderBottom1Black","style":"height:50px;"},container);
    table=createElement("table",{"border":"0","cellspacing":"0","style":"width:100%;"},newdiv);
    newtr=createElement("tr",{},table);
    createElement("td",{"class":"tnormal","style":"color:black;font-weight:bold;text-align:center;"},newtr,getText("profitTable"));
    // switch bar to filter category
    newtd=createElement("td",{"align":"right"},newtr);
    newdiv=createElement("div",{"style":"-moz-user-select:none;width:212px;"},newtd);
    newdiv.addEventListener("mouseover",function(event){
        var mouseOverText=event.target.getAttribute("mouseOverText");
        if(mouseOverText){
            mouseOverText='<div>'+getText("click")+'&nbsp;/&nbsp;'+getText("clickCtrl")+'</div><div>'+mouseOverText+'</div>';
            toolTip.show(event,mouseOverText);
        }
    },false);
    newdiv.addEventListener("click",function(filterCategory){
    return function(event){
        var thisFilter=explode(event.target.getAttribute("filter"),"buildInfoPanelProfit\thisFilter");
        if(thisFilter){
            if(event.ctrlKey){
                for(var i=thisFilter.length-1;i>-1;i--){
                    if(filterCategory[thisFilter[i]]){
                        delete filterCategory[thisFilter[i]];
                    }else{
                        filterCategory[thisFilter[i]]=true;
                    }
                }
            }else{
                filterCategory={};
                for(var i=thisFilter.length-1;i>-1;i--){
                    filterCategory[thisFilter[i]]=true;
                }
            }
            buildInfoPanelProfit({"filterCategory":filterCategory});
        }
    }}(mode["filterCategory"]),false);
    createElement("div",{"class":"link rackcat1v"+(mode["filterCategory"]["v"]?"_active":""),"filter":'["v"]',"mouseOverText":getText("category_v"),"style":"float:left;"},newdiv);
    createElement("div",{"class":"link rackcat1e"+(mode["filterCategory"]["e"]?"_active":""),"filter":'["e"]',"mouseOverText":getText("category_e"),"style":"float:left;"},newdiv);
    createElement("div",{"class":"link rackcat5"+(mode["filterCategory"]["o"]?"_active":""),"filter":'["o"]',"mouseOverText":getText("category_o"),"style":"float:left;"},newdiv);
    newdiv1=createElement("div",{"style":"float:left;width:53px;"},newdiv);
    for(var i=1;i<=4;i=i+2){
        createElement("div",{"class":"link rackcat2"+i+(mode["filterCategory"]["fw"+i]?"_active":""),"filter":'["fw'+i+'"]',"mouseOverText":getText("category_fw"+i),"style":"float:left;"},newdiv1);
        if(i==3){ i=0; }
    }
    createElement("div",{"class":"link rackcat30fl"+(mode["filterCategory"]["fl"]?"_active":""),"filter":'["fl"]',"mouseOverText":getText("category_fl"),"style":"float:left;"},newdiv);
    createElement("div",{"class":"link rackcat30fla"+(mode["filterCategory"]["fla"]?"_active":""),"filter":'["fla"]',"mouseOverText":getText("category_fla"),"style":"float:left;"},newdiv);

    // the table
        err_trace="table";
        newdiv=createElement("div",{"class":"borderBottom1Black","style":"height:440px;width:100%;overflow:auto;"},container);
        table=createElement("table",{"border":"0","cellspacing":"0","style":"width:100%;"},newdiv);
        table.addEventListener("mouseover",function(event){
            var node=event.target;
            var mouseOverText=node.getAttribute("mouseOverText");
            while((node!=this)&&(!mouseOverText)){
                node=node.parentNode;
                mouseOverText=node.getAttribute("mouseOverText");
            }
            if(mouseOverText){ toolTip.show(event,mouseOverText); }
            node=null;mouseOverText=null;
        },false);
   
        err_trace="tablehead";
        newtr=createElement("tr",{"style":"color:black;"},table);
        newtd=createElement("th",{"class":"link hoverBgCc9"+(mode["sort"]=="product"?" sortableColDesc":"")},newtr,getText("product"));
        newtd.addEventListener("click",function(){
            buildInfoPanelProfit({"sort":"product"});
        },false);
        newtd=createElement("th",{"class":"link hoverBgCc9"+(mode["sort"]=="dauer"?" sortableColDesc":"")},newtr,getText("duration"));
        newtd.addEventListener("click",function(){
            buildInfoPanelProfit({"sort":"dauer"});
        },false);
        newtd=createElement("th",{"style":"border-bottom:1px dashed black;"},newtr);
        newtd=createElement("th",{"class":"link hoverBgCc9"+(mode["sort"]=="punkte"?" sortableColDesc":"")},newtr,getText("points"));
        newtd.addEventListener("click",function(){
            buildInfoPanelProfit({"sort":"punkte"});
        },false);
        newtd=createElement("th",{"class":"link hoverBgCc9"+(mode["sort"]=="gut"?" sortableColDesc":"")},newtr,getText("prices"));
        newtd.addEventListener("click",function(){
            buildInfoPanelProfit({"sort":"gut"});
        },false);
        newtd=createElement("th",{"class":"link hoverBgCc9"+(mode["sort"]=="gutBeob"?" sortableColDesc":"")},newtr,getText("observed"));
        newtd.addEventListener("click",function(){
            buildInfoPanelProfit({"sort":"gutBeob"});
        },false);
   
        err_trace="tablebody";
        for(var v=0;v<profit.length;v++){
            var buildingNr=PRODUCT2BUILDING[0][profit[v]["id"]];
            var buildingName=getBuildingName(buildingNr);
            newtr=createElement("tr",{"nr":v,"prod":profit[v]["id"],"class":"hoverBgCc9","style":"color:black;"},table);
            newtd=createElement("td",{},newtr);
            newtd=createElement("div",{"style":"position:relative;height:100%;"},newtd);
            produktPic(0,profit[v]["id"],newtd);
                newtable1=createElement("table");
                newtr1=createElement("tr",{},newtable1);
                createElement("td",{},newtr1,getText("dailyYield"));
                createElement("td",{"style":"text-align:right;padding-left:10px;"},newtr1,numberFormat(profit[v]["menge"],1));
                newtr1=createElement("tr",{},newtable1);
                createElement("td",{},newtr1,getText("yield"));
                createElement("td",{"style":"text-align:right;padding-left:10px;"},newtr1,numberFormat(profit[v]["menge"]/profit[v]["runs"]));
                newtr1=createElement("tr",{},newtable1);
                createElement("td",{},newtr1,getText("dailyRuns"));
                createElement("td",{"style":"text-align:right;padding-left:10px;"},newtr1,numberFormat(profit[v]["runs"],3));
            newspan=createElement("span",{"class":"link","data":newtable1.innerHTML},newtd,prodName[0][profit[v]["id"]]);
            newspan.addEventListener("mouseover",function(event){ 
                showGoToMarketToolTip(event,this.parentNode.parentNode.parentNode.getAttribute("prod"),this.getAttribute("data")); 
            },false);
            newspan.addEventListener("click",function(){
                showMarket(this.parentNode.parentNode.parentNode.getAttribute("prod"));
            },false);
            if(typeof profit[v]["level"]=="number"){
                help=mode["buildingLevel"].clone();
                help[buildingNr]=(profit[v]["level"]+1)%(profit[v]["maxlevel"]+1);
                newspan=createElement("span",{"mouseOverText":"<table cellspacing=0><tr><th class='lightBg'>"+buildingName+"</th></tr><tr><td>"+getText("upgradeLevel")+"</td></tr><tr><td>("+getText("clickToChange")+")</td></tr></table>","class":"link","nextLevel":implode(help,"nextLevel")},newtd); // ,"mouseOverText":"max "+profit[v]["maxlevel"]
                for(var w=1;w<=profit[v]["maxlevel"];w++){ createElement("img",{"src":w<=profit[v]["level"]?GFX+"star.png":IMAGES["starGrey"]},newspan); }
                newspan.addEventListener("click",function(){
                    var prod=this.parentNode.parentNode.parentNode.getAttribute("prod");
                    var nextLevel=explode(this.getAttribute("nextLevel"),"nextLevel.click",{});
                    buildInfoPanelProfit({"jumpTo":prod,"buildingLevel":nextLevel});
                },false);
            }
            if(profit[v]["input"]&&(profit[v]["input"].length>1)){
                newspan=produktPic(0,profit[v]["input"][mode["feed"][profit[v]["id"]][0]][mode["feed"][profit[v]["id"]][1]][0][0],newtd);
                newdiv=createElement("div");
                newtable1=createElement("table",{"cellspacing":0},newdiv);
                newtr1=createElement("tr",{},newtable1);
                createElement("th",{"colspan":2,"class":"lightBg"},newtr1,buildingName);
                newtr1=createElement("tr",{},newtable1);
                createElement("td",{"colspan":2},newtr1,getText("feed")+":");
                for(var i=0;i<profit[v]["input"].length;i++){
                    for(var j=0;j<profit[v]["input"][i].length;j++){
                        newtr1=createElement("tr",{},newtable1);
                        var help=((profit[v]["input"].length>1)&&(mode["feed"][profit[v]["id"]][0]==i)&&(mode["feed"][profit[v]["id"]][1]==j))?"background-color:#BB6600;":"";
                        createElement("td",{"style":"text-align:right;"+help},newtr1,numberFormat(profit[v]["input"][i][j][0][1],1));
                        createElement("td",{"style":help},newtr1,prodName[0][profit[v]["input"][i][j][0][0]]);
                    }
                }
                newtr1=createElement("tr",{},newtable1);
                createElement("td",{"colspan":2},newtr1,"("+getText("clickToChange")+")");
                newspan.setAttribute("class",newspan.getAttribute("class")+" link");
                help=mode["feed"].clone();
                if(1+mode["feed"][profit[v]["id"]][1]<profit[v]["input"][mode["feed"][profit[v]["id"]][0]].length){
                    help[profit[v]["id"]]=[help[profit[v]["id"]][0],1+help[profit[v]["id"]][1]];
                }else if(1+mode["feed"][profit[v]["id"]][0]<profit[v]["input"].length){
                    help[profit[v]["id"]]=[1+help[profit[v]["id"]][0],0];
                }else{
                    help[profit[v]["id"]]=[0,0];
                }
                newspan.setAttribute("nextFeed",implode(help,"nextFeed.click"));
                profit[v]["input"][mode["feed"][profit[v]["id"]][0]][mode["feed"][profit[v]["id"]][1]]
                newspan.addEventListener("click",function(){
                    var prod=this.parentNode.parentNode.parentNode.getAttribute("prod");
                    var nextFeed=explode(this.getAttribute("nextFeed"),"nextFeed.click",{});
                    buildInfoPanelProfit({"jumpTo":prod,"feed":nextFeed});
                },false);
                newspan.setAttribute("mouseOverText",newdiv.innerHTML);
            }
            createElement("td",{"style":"text-align:right;"},newtr,getTimeStr(profit[v]["dauer"],1));
   
            createElement("td",{"style":"text-align:right;"},newtr,getDaytimeStr(now+profit[v]["dauer"],1)+"&nbsp;"+getText("shortOClock"));
            newdiv=createElement("div");
            newtable1=createElement("table",{"cellspacing":0},newdiv);
            newtr1=createElement("tr",{},newtable1);
            createElement("th",{"colspan":2,"class":"lightBg"},newtr1,buildingName);
            newtr1=createElement("tr",{},newtable1);
            createElement("td",{},newtr1,getText("points"));
            createElement("td",{"style":"padding-left:10px;"},newtr1,numberFormat(profit[v]["punkte"]/profit[v]["runs"]));
            newtr1=createElement("tr",{},newtable1);
            createElement("td",{},newtr1,getText("dailyRuns"));
            createElement("td",{},newtr1,numberFormat(profit[v]["runs"],3));
            createElement("td",{"style":"text-align:right;padding-left:10px;","mouseOverText":newdiv.innerHTML},newtr,numberFormat(profit[v]["punkte"]));
   
            newdiv=createElement("div");
            newtable1=createElement("table",{"cellspacing":0},newdiv);
            newtr1=createElement("tr",{},newtable1);
            createElement("th",{"colspan":6,"class":"lightBg"},newtr1,buildingName);
            newtr1=createElement("tr",{},newtable1);
            createElement("td",{"colspan":4},newtr1);
            createElement("td",{"colspan":2,"style":"text-align:center;"},newtr1,getText("observed"));
            if(profit[v]["input"]){
                if(profit[v]["input"].length>1){
                    help=profit[v]["input"][mode["feed"][profit[v]["id"]][0]][mode["feed"][profit[v]["id"]][1]];
                }else{
                    help=profit[v]["input"][0][0];
                }
                for(var j=0;j<help.length;j++){
                    newtr1=createElement("tr",{},newtable1);
                    if(prodName[0][help[j][0]]){
                        createElement("td",{"style":"text-align:right;"},newtr1,numberFormat(help[j][1]/profit[v]["runs"]));
                        createElement("td",{},newtr1,prodName[0][help[j][0]]);
                        createElement("td",{"style":"text-align:right;padding-left:10px;"},newtr1,"("+moneyFormat(help[j][2])+")");
                        createElement("td",{"style":"text-align:right;"},newtr1,moneyFormatInt(-help[j][1]*help[j][2]/profit[v]["runs"]));
                        createElement("td",{"style":"text-align:right;padding-left:10px;"},newtr1,"("+moneyFormat(help[j][3])+")");
                        createElement("td",{"style":"text-align:right;"},newtr1,moneyFormatInt(-help[j][1]*help[j][3]/profit[v]["runs"]));
                    }else{
                        createElement("td",{"colspan":3},newtr1);
                        createElement("td",{"style":"text-align:right;"},newtr1,moneyFormatInt(-help[j][1]*help[j][2]/profit[v]["runs"]));
                        createElement("td",{"style":"text-align:right;padding-left:10px;"},newtr1);
                        createElement("td",{"style":"text-align:right;"},newtr1,moneyFormatInt(-help[j][1]*help[j][3]/profit[v]["runs"]));
                    }
                }
            }
            newtr1=createElement("tr",{},newtable1);
            createElement("td",{"style":"text-align:right;"},newtr1,numberFormat(profit[v]["output"][1]/profit[v]["runs"]));
            createElement("td",{},newtr1,prodName[0][profit[v]["output"][0]]);
            createElement("td",{"style":"text-align:right;padding-left:10px;"},newtr1,"("+moneyFormat(profit[v]["output"][2])+")");
            createElement("td",{"style":"border-bottom:1px solid black;text-align:right;"},newtr1,moneyFormatInt(profit[v]["output"][1]*profit[v]["output"][2]/profit[v]["runs"]));
            createElement("td",{"style":"text-align:right;padding-left:10px;"},newtr1,"("+moneyFormat(profit[v]["output"][3])+")");
            createElement("td",{"style":"border-bottom:1px solid black;text-align:right;"},newtr1,moneyFormatInt(profit[v]["output"][1]*profit[v]["output"][3]/profit[v]["runs"]));
            newtr1=createElement("tr",{},newtable1);
            createElement("td",{"style":"border-bottom:1px solid black;","colspan":3},newtr1);
            createElement("td",{"style":"border-bottom:1px solid black;text-align:right;"},newtr1,moneyFormatInt(profit[v]["gut"]/profit[v]["runs"]));
            createElement("td",{"style":"border-bottom:1px solid black;padding-left:10px;"},newtr1);
            createElement("td",{"style":"border-bottom:1px solid black;text-align:right;"},newtr1,moneyFormatInt(profit[v]["gutBeob"]/profit[v]["runs"]));
            newtr1=createElement("tr",{},newtable1);
            createElement("td",{"colspan":2},newtr1,getText("dailyRuns"));
            createElement("td",{"colspan":4,"style":"padding-left:10px;"},newtr1,numberFormat(profit[v]["runs"],3));
            createElement("td",{"style":"text-align:right;","mouseOverText":newdiv.innerHTML},newtr,moneyFormatInt(profit[v]["gut"]));
            createElement("td",{"style":"text-align:right;","mouseOverText":newdiv.innerHTML},newtr,moneyFormatInt(profit[v]["gutBeob"]));
   
            if(mode["jumpTo"]&&(mode["jumpTo"]==profit[v]["id"])){
                delete mode["jumpTo"];
                table.scrollTop=newtr.offsetTop;
                newspan=createElement("div",{"id":"vanishDiv","style":"position:absolute;top:0;left:0;height:15px;width:100%;background-color:blue;opacity:0.7;"},newtr.firstElementChild.firstElementChild);
                var intervalVanishDiv=window.setInterval(function(){
                    try{
                        var div=$("vanishDiv");
                        if(div){
                            var opac=parseFloat(div.style.opacity,10)-0.05;
                            if(opac>0){ div.style.opacity=opac; }
                            else{ 
                                removeElement(div);
                                window.clearInterval(intervalVanishDiv);
                            }
                        }else{ window.clearInterval(intervalVanishDiv); }
                    }catch(err){}
                },100);
            }
        }
   
        // foot line
        err_trace="foot line";
        newdiv=createElement("div",{},container);
        table=createElement("table",{"border":"0","cellspacing":"0","style":"width:100%;"},newdiv);
        newtr=createElement("tr",{},table);
        newtd=createElement("td",{"align":"center"},newtr);
        newspan=createElement("input",{"type":"checkbox","class":"link","checked":mode["showAll"]},newtd);
        newspan.addEventListener("click",function(){
            buildInfoPanelProfit({"showAll":this.checked});
        },false);
        createElement("span",{},newtd,getText("showAll"));    
        
        newtd=createElement("td",{"align":"center"},newtr);
        newspan=createElement("input",{"type":"checkbox","class":"link","checked":(mode["perc"]==0.9)},newtd);
        newspan.addEventListener("click",function(){
            buildInfoPanelProfit({"perc":this.checked?0.9:1});
        },false);
        createElement("span",{},newtd,"90%");    
        
        
        err_trace="saving";
        container=null;table=null;newtr=null;newtd=null;newspan=null;newdiv=null;newtable1=null;newtr1=null;newtd1=null;
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeProfittable",implode(mode,"buildInfoPanelProfit/modeProfittable"));
    }catch(err){ GM_logError("buildInfoPanelProfit ("+err_trace+")\nv="+v+"\n"+err); }
}
function buildInfoPanelQuests(mode){
try{
    var err_trace="init";
    var modeDefault={"type":"main","campaign":"1","sort":"product"};
    var modeOld=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeQuestsTable"),"buildInfoPanelQuests/modeOld");
    if(typeof modeOld!="object"){ modeOld=modeDefault; }
    if(typeof mode!="object"){ mode=modeOld; }
    for(var v in modeDefault){
        if(!modeDefault.hasOwnProperty(v)){ continue; }
        if(mode[v]==undefined){ mode[v]=(modeOld[v]==undefined?modeDefault[v]:modeOld[v]); }
    }   
    if(QUESTS[mode["type"]]==undefined){ mode["type"]="main"; }
    if(QUESTS[mode["type"]][mode["campaign"]]==undefined){ mode["campaign"]="1"; }
  
    //head line
    err_trace="head line";
    var help;
    var table,tr,td,span,div,div1,table1,tr1,td1,tr2,td2;
    var container=$("infoPanelInner");
    container.innerHTML="";
    table=createElement("table",{"border":"0","cellspacing":"0","style":"width:100%;"},container);
    tr=createElement("tr",{},table);
    createElement("td",{"class":"tnormal","style":"color:black;font-weight:bold;text-align:center;"},tr,getText("quests"));
    // switch bar
    td=createElement("td",{},tr);
    td=createElement("div",{"style":"float:right"},td);
    for(var type in QUESTS){
        if(!QUESTS.hasOwnProperty(type)){ continue; }
        for(var campaign in QUESTS[type]){
            if(!QUESTS[type].hasOwnProperty(campaign)){ continue; }
            // createElement("td",{"class":"link hoverBgLightbrown","style":""+((type==mode["type"])&&(campaign==mode["campaign"])?"background-color:lightblue;":"")},tr2,campaign);
            div=createElement("div",{"class":"link quests_status_bar_item quests_status_bar_"+type+campaign+(((type==mode["type"])&&(campaign==mode["campaign"]))?"_active":""),"style":"-moz-user-select:none;display:block;","next":implode({"type":type,"campaign":campaign},"buildInfoPanelQuests/next")},td);
            div.addEventListener("mouseover",function(event){
                var help=explode(this.getAttribute("next"),"buildInfoPanelQuests/next");
                toolTip.show(event,getText("quest"+help["type"]+help["campaign"]));
            },false);
            div.addEventListener("click",function(event){
                buildInfoPanelQuests(explode(this.getAttribute("next"),"buildInfoPanelQuests/next"));
            },false);
            if(questData[type]&&questData[type][campaign]&&(questData[type][campaign]["nr"]==-1)){
                createElement("div",{"class":"rack_lock_page","style":"transform:scale(0.7);"},div);
            }
        }
        // createElement("td",{"style":"width:100px;","colspan":help},tr1,getText(type=="main"?"farm":type));
    }
    // quest table
    err_trace="table";
    div=createElement("div",{"style":"height:300px;width:100%;font-color:black;overflow:auto;border-top:1px solid black;","id":"questTable"},container);
    table=createElement("table",{"border":"0","cellspacing":"0","style":"width:100%;","class":"black"},div);

    err_trace="table.head";
    tr=createElement("tr",{},table);
    td=createElement("th",{},tr,getText("nr"));
    td=createElement("th",{},tr,getText("demand"));
    td=createElement("th",{"colspan":"2"},tr,getText("value"));
    td=createElement("th",{},tr,getText("reward"));
   
    err_trace="table.body";
    var questCurr,item,str,mouseOver;
    var questDone,questTotal={};
    for(var v=1;v<QUESTS[mode["type"]][mode["campaign"]].length;v++){
        if(questCurr=QUESTS[mode["type"]][mode["campaign"]][v]){
            tr=createElement("tr",{"class":"hoverBgCc9 borderBottom1dashedGrey"},table); // white-space:nowrap;
            if((!questData[mode["type"]])||(!questData[mode["type"]][mode["campaign"]])){
                questDone = true;
            }else if(questData[mode["type"]][mode["campaign"]]["nr"]>v){ 
                questDone = true;
                tr.style.opacity=0.6; 
            }else if(questData[mode["type"]][mode["campaign"]]["nr"]==v){ 
                questDone = false;
                tr.style.backgroundColor="lightblue"; 
            }else{
                questDone = false;
            }
            createElement("td",{},tr,v);
            td=createElement("td",{},tr); // icon, name
            td1=createElement("td",{"style":"padding-right:10px;text-align:right;"},tr); // amount
            td2=createElement("td",{"style":"padding-right:10px;text-align:right;"},tr); // value
            for(var i=0;i<questCurr[0].length;i++){
                if(questCurr[0][i]){
                    if(typeof questCurr[0][i][0]=="object"){
                        help=[null,null,];
                        for(var j=0;j<questCurr[0][i].length;j++){
                            item=questCurr[0][i][j];
                            if((item[0]==0)&&(!prodBlock[0][item[1]].match(/t/))){
                                help[2]=(item[2]*gut[item[1]]);
                            }else{
                                help[2]=0;
                            }
                            if((help[1]==null)||(help[2]<help[1])){
                                help[0]=j;
                                help[1]=help[2];
                            }
                        }
                        for(var j=0;j<questCurr[0][i].length;j++){
                            item=questCurr[0][i][j];
                            str="font-style:italic;"
                            if(j!=help[0]){
                                str+="text-decoration:line-through;";
                                mouseOver=false;
                            }else if(questDone){
                                mouseOver=false;
                            }else{
                                if(!questTotal[item[0]]){ questTotal[item[0]]={}; }
                                if(!questTotal[item[0]][item[1]]){ questTotal[item[0]][item[1]]=0; }
                                questTotal[item[0]][item[1]]+=item[2];
                                mouseOver=true;
                            }
                            div=createElement("div",{"prod":item[1],"style":str},td);
                            if(prodBlock[item[0]][item[1]].match(/[lq]/)){
                                div.classList.add("red");
                                div.addEventListener("mouseover",function(event){ toolTip.show(event,getText("levelTooLow")); },false); // TODO: correct text if blocked by quest
                            }else if((item[0]==0)&&(!prodBlock[0][item[1]].match(/t/))){
                                div.classList.add("link");
                                div.addEventListener("mouseover",function(event){ showGoToMarketToolTip(event,this.getAttribute("prod")); },false);
                                div.addEventListener("click",function(){ showMarket(this.getAttribute("prod")); },false);
                            }
                            produktPic(item[0],item[1],div);
                            createElement("span",{"style":str},div,prodName[item[0]][item[1]]);
                            div=createElement("div",{"style":str},td1,numberFormat(item[2]));
                            if(mouseOver){
                                div.style.color=(prodStock[item[0]][item[1]]<questTotal[item[0]][item[1]]?"red":"green");
                                div.setAttribute("data",implode([item,questTotal[item[0]][item[1]]],"buildInfoPanelQuests/data"));
                                div.addEventListener("mouseover",function(event){
                                    var data=explode(this.getAttribute("data"),"buildInfoPanelQuests/data"); 
                                    var container,table,tr;
                                    container=createElement("div");
                                    table=createElement("table",{},container);
                                    tr=createElement("tr",{},table);
                                    createElement("td",{},tr,getText("inventory"));
                                    createElement("td",{"style":"text-align:right;"},tr,numberFormat(prodStock[data[0][0]][data[0][1]]));
                                    tr=createElement("tr",{"class":"borderBottom1Black"},table);
                                    createElement("td",{},tr,getText("total"));
                                    createElement("td",{"style":"text-align:right;"},tr,numberFormat(data[1]));
                                    tr=createElement("tr",{},table);
                                    createElement("td",{},tr);
                                    createElement("td",{"style":"text-align:right;"},tr,numberFormat(prodStock[data[0][0]][data[0][1]]-data[1]));
                                    toolTip.show(event,container.innerHTML);
                                    data=null;
                                    container=null;table=null;tr=null;
                                },false);
                            }
                            createElement("div",{"style":str},td2,item[0]==0?moneyFormatInt(item[2]*gut[item[1]]):"--");
                        }
                    }else{
                        item=questCurr[0][i];
                        if(questDone){
                            mouseOver=false;
                        }else{
                            if(!questTotal[item[0]]){ questTotal[item[0]]={}; }
                            if(!questTotal[item[0]][item[1]]){ questTotal[item[0]][item[1]]=0; }
                            questTotal[item[0]][item[1]]+=item[2];
                            mouseOver=true;
                        }
                        div=createElement("div",{"prod":item[1]},td);
                        if(prodBlock[item[0]][item[1]].match(/[lq]/)){
                            div.classList.add("red");
                            div.addEventListener("mouseover",function(event){ toolTip.show(event,getText("levelTooLow")); },false); // TODO: correct text if blocked by quest
                        }else if((item[0]==0)&&(!prodBlock[0][item[1]].match(/t/))){
                            div.classList.add("link");
                            div.addEventListener("mouseover",function(event){ showGoToMarketToolTip(event,this.getAttribute("prod")); },false);
                            div.addEventListener("click",function(){ showMarket(this.getAttribute("prod")); },false);
                        }
                        produktPic(item[0],item[1],div);
                        createElement("span",{},div,prodName[item[0]][item[1]]);
                        div=createElement("div",{},td1,numberFormat(item[2]));
                        if(mouseOver){
                            div.style.color=(prodStock[item[0]][item[1]]<questTotal[item[0]][item[1]]?"red":"green");
                            div.setAttribute("data",implode([item,questTotal[item[0]][item[1]]],"buildInfoPanelQuests/data"));
                            div.addEventListener("mouseover",function(event){
                                var data=explode(this.getAttribute("data"),"buildInfoPanelQuests/data"); 
                                var container,table,tr;
                                container=createElement("div");
                                table=createElement("table",{},container);
                                tr=createElement("tr",{},table);
                                createElement("td",{},tr,getText("inventory"));
                                createElement("td",{"style":"text-align:right;"},tr,numberFormat(prodStock[data[0][0]][data[0][1]]));
                                tr=createElement("tr",{"class":"borderBottom1Black"},table);
                                createElement("td",{},tr,getText("total"));
                                createElement("td",{"style":"text-align:right;"},tr,numberFormat(data[1]));
                                tr=createElement("tr",{},table);
                                createElement("td",{},tr);
                                createElement("td",{"style":"text-align:right;"},tr,numberFormat(prodStock[data[0][0]][data[0][1]]-data[1]));
                                toolTip.show(event,container.innerHTML);
                                data=null;
                                container=null;table=null;tr=null;
                            },false);
                        }                       
                        createElement("div",{},td2,item[0]==0?moneyFormatInt(item[2]*gut[item[1]]):"--");
                    }
                }
            }
            td=createElement("td",{"style":"white-space:nowrap;"},tr);
            if(questCurr[2]>0){ 
                div=createElement("div",{},td);
                pointsFormat(questCurr[2],"div",div);  // 70ms
            }
            if(questCurr[3]){
                for(var w=0;w<questCurr[3].length;w++){
                    switch(questCurr[3][w][0]){
                    case 0:{
                        createElement("div",{},td,moneyFormat(questCurr[3][w][1]));
                    break;}
                    case 1:{
                        div=createElement("div",{},td);
                        produktPic(questCurr[3][w][1],questCurr[3][w][2],div);
                        createElement("span",{},div,numberFormat(questCurr[3][w][3])+"&nbsp;"+prodName[questCurr[3][w][1]][questCurr[3][w][2]]);
                    break;}
                    case 2:{
                        createElement("div",{},td,getText("activation")+": "+getText("rackX").replace(/%1%/,questCurr[3][w][1]));
                    break;}
                    case 3:{
                        createElement("div",{},td,getText("activation")+": "+getText("farmX").replace(/%1%/,questCurr[3][w][1]));
                    break;}
                    case 4:{
                        div=createElement("div",{},td);
                        produktPic(questCurr[3][w][1],questCurr[3][w][2],div);
                        createElement("span",{},div,getText("productTimeSaving").replace(/%1%/,questCurr[3][w][3]).replace(/%2%/,prodName[questCurr[3][w][1]][questCurr[3][w][2]]));
                    break;}
                    case 5:{
                        div=createElement("div",{},td);
                        createElement("img",{"src":GFX+"adbonus.gif","style":"border:0;height:15px;"},div);
                        createElement("span",{},div,getText("additionalFarmi").replace(/%1%/,questCurr[3][w][1]));
                    break;}
                    case 6:{
                        createElement("div",{},td,getText("additionalLogCapacity").replace(/%1%/,questCurr[3][w][1]));
                    break;}
                    case 7:{
                        createElement("div",{},td,getText("waterBonus").replace(/%1%/,questCurr[3][w][1]));
                    break;}
                    case 8:{
                        if(DATA_zones[questCurr[3][w][1]]["location"]=="farm"){
                            createElement("div",{},td,getText("activation")+": "+getText("farmzone").replace(/%1%/,1+((questCurr[3][w][1]-1)%6)).replace(/%2%/,Math.ceil(questCurr[3][w][1]/6)));
                        }else{
                            createElement("div",{},td,getText("activation")+": "+zones.getBuildingName(questCurr[3][w][1]));
                        }
                    break;}
                    case 9:{
                        div=createElement("div",{},td);
                        createElement("span",{},div,getText("activation")+": ");
                        produktPic(questCurr[3][w][1],questCurr[3][w][2],div);
                        createElement("span",{},div,prodName[questCurr[3][w][1]][questCurr[3][w][2]]);
                    break;}
                    case 10:{
                        createElement("div",{},td,getText("activation")+": "+getText("wateringFeature"));
                    break;}
                    case 11:{
                        div=createElement("div",{},td);
                        createElement("img",{"src":GFX+"adbonus.gif","style":"border:0;height:15px;"},div);
                        createElement("span",{},div,getText("additionalForestFarmiSlot").replace(/%1%/,questCurr[3][w][1]));
                    break;}
                    case 12:{
                        div=createElement("div",{},td);
                        createElement("span",{},div,unsafeWindow.quest_reward_6+": ");
                        createElement("img",{"src":GFX+"farmhouse/thumbs/"+questCurr[3][w][1]+".jpg","style":"border:0;height:30px;width:30px;"},div);
                    break;}
                    case 13:{
                        div=createElement("div",{},td);
                        createElement("span",{},div,getText("shadowboxitem")+": ");
                        createElement("img",{"src":GFX+"gifts/"+questCurr[3][w][1]+".gif","style":"border:0;height:30px;width:30px;"},div);
                    break;}
                    }
                }
            }
        }
    }
    // all quests done
    if(questData[mode["type"]]&&questData[mode["type"]][mode["campaign"]]&&(questData[mode["type"]][mode["campaign"]]["nr"]>=QUESTS[mode["type"]][mode["campaign"]].length)){
        tr=createElement("tr",{"class":"hoverBgCc9 borderBottom1dashedGrey","style":"color:black;"},table);
        tr.style.backgroundColor="lightblue";
        createElement("td",{},tr,questData[mode["type"]][mode["campaign"]]["nr"]);
        createElement("td",{},tr);
        createElement("td",{},tr);
        createElement("td",{},tr);
    }
    // scroll to current quest
    if(questData[mode["type"]][mode["campaign"]]["nr"]>1){
        window.setTimeout(function(scr){        
            $("questTable").scrollTop=scr;
        },0,table.children[Math.min(table.childElementCount,questData[mode["type"]][mode["campaign"]]["nr"])].offsetTop);
    }
    err_trace="select calcTo";
    div=createElement("div",{"style":"height:20px;width:100%;font-color:black;overflow:auto;border-top:1px solid black;"},container);
    createElement("span",{},div,getText("calcTo")+":");
    span = createElement("select",{"id":"selectQuestCalcTo","style":"width:auto;height:18px;margin-left:5px;","mode":implode(mode,"buildInfoPanelQuests/selectQuestCalcTo")},div);
    createElement("option",{"value":-1},span,getText("hide"));
    createElement("option",{"value":0},span,"--");
    for(var i=questData[mode["type"]][mode["campaign"]]["nr"];i<QUESTS[mode["type"]][mode["campaign"]].length;i++){
        createElement("option",{"value":i},span,i);
    }
    span.addEventListener("change",function(){
        if(isNaN(this.value)){return false;}
        var mode=explode(this.getAttribute("mode"),"buildInfoPanelQuests/selectQuestCalcTo");
        setCalcToQuest(mode["type"],mode["campaign"],this.value);
        buildInfoPanelQuestsTotal(mode);
    },false);
    span.value = questData[mode["type"]][mode["campaign"]]["calcTo"];

    err_trace="total table";
    div=createElement("div",{"style":"height:155px;width:100%;overflow:auto;","id":"questTableTotal"},container);
    function buildInfoPanelQuestsTotal(mode){
    try{
        var err_trace="init";
        var modeDefault={"type":"main","campaign":"1","sort":"product"};
        var modeOld=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeQuestsTable"),"buildInfoPanelQuestsTotal/modeOld");
        if(typeof modeOld!="object"){ modeOld=modeDefault; }
        if(typeof mode!="object"){ mode=modeOld; }
        for(var v in modeDefault){
            if(!modeDefault.hasOwnProperty(v)){ continue; }
            if(mode[v]==undefined){ mode[v]=(modeOld[v]==undefined?modeDefault[v]:modeOld[v]); }
        }           
        err_trace="calc object";
        var obj=new Object();
        var questCurr,item,help;
        for(var v=questData[mode["type"]][mode["campaign"]]["nr"];v<=questData[mode["type"]][mode["campaign"]]["calcTo"];v++){
            questCurr=QUESTS[mode["type"]][mode["campaign"]][v];
            if(questCurr){
                for(var i=0;i<questCurr[0].length;i++){
                    if(questCurr[0][i]){
                        if(typeof questCurr[0][i][0]=="object"){
                            help=[null,null,];
                            for(var j=0;j<questCurr[0][i].length;j++){
                                item=questCurr[0][i][j];
                                if((item[0]==0)&&(!prodBlock[0][item[1]].match(/t/))){
                                    help[2]=(item[2]*gut[item[1]]);
                                }else{
                                    help[2]=0;
                                }
                                if((help[1]==null)||(help[2]<help[1])){
                                    help[0]=j;
                                    help[1]=help[2];
                                }
                            }
                            item=questCurr[0][i][help[0]];
                        }else{
                            item=questCurr[0][i];
                        }
                        if(!obj[item[0]]){ obj[item[0]]={}; }
                        if(!obj[item[0]][item[1]]){ obj[item[0]][item[1]]=0; }
                        obj[item[0]][item[1]] += item[2];
                    }
                }
            }
        }
        err_trace="calc array";
        var arr=new Array(); // [type,prodId,amount,amountValue,missing,missingValue]
        for(var type in obj){
            if(!obj.hasOwnProperty(type)){continue;}
            for(var prod in obj[type]){
                if(!obj[type].hasOwnProperty(prod)){continue;}
                help=(prodStock[type][prod]?prodStock[type][prod]:0);
                if((item[0]==0)&&(gut[prod])){
                    arr.push([type,prod,obj[type][prod],obj[type][prod]*gut[prod],(obj[type][prod]-help),(obj[type][prod]-help)*gut[prod]]);
                }else{
                    arr.push([type,prod,obj[type][prod],0,(obj[type][prod]-help),0]);
                }
            }
        }
        err_trace="sort array";
        switch(mode["sort"]){
        case "product": arr.sort(function (a,b){ if(a[0]==b[0]){ return(a[1]-b[1]); }else{ return(a[0]-b[0]); } }); break;
        case "absolute": arr.sort(function (a,b){ return(b[2]-a[2]); }); break;
        case "absoluteValue": arr.sort(function (a,b){ return(b[3]-a[3]); }); break;
        case "relative": arr.sort(function (a,b){ return(b[4]-a[4]); }); break;
        case "relativeValue": arr.sort(function (a,b){ return(b[5]-a[5]); }); break;
        }
        
        // table
        err_trace="table";
        var container,table,tr,td,div;
        container=$("questTableTotal");
        container.innerHTML="";
        table=createElement("table",{"class":"black","border":"0","cellspacing":"0","style":"width:100%;"},container);
        table.addEventListener("mouseover",function(event){
            var node=event.target;
            var mouseOverText=node.getAttribute("mouseOverText");
            while((node!=this)&&(!mouseOverText)){
                node=node.parentNode;
                mouseOverText=node.getAttribute("mouseOverText");
            }
            if(mouseOverText){ toolTip.show(event,mouseOverText); }
            node=null;mouseOverText=null;
        },false);
    
        err_trace="table.head";
        tr=createElement("tr",{"class":"borderBottom1dashedBlack"},table);
        td=createElement("th",{"class":"link hoverBgCc9"+(mode["sort"]=="product"?" sortableColDesc":"")},tr,getText("product"));
        td.addEventListener("click",function(){
            buildInfoPanelQuestsTotal({"sort":"product"});
        },false);       
        td=createElement("th",{"class":"link hoverBgCc9"+(mode["sort"]=="absolute"?" sortableColDesc":"")},tr,getText("absolute"));
        td.addEventListener("click",function(){
            buildInfoPanelQuestsTotal({"sort":"absolute"});
        },false);       
        td=createElement("th",{"class":"link hoverBgCc9"+(mode["sort"]=="absoluteValue"?" sortableColDesc":"")},tr,getText("value"));
        td.addEventListener("click",function(){
            buildInfoPanelQuestsTotal({"sort":"absoluteValue"});
        },false);       
        td=createElement("th",{"class":"link hoverBgCc9"+(mode["sort"]=="relative"?" sortableColDesc":"")},tr,getText("relative"));
        td.addEventListener("click",function(){
            buildInfoPanelQuestsTotal({"sort":"relative"});
        },false);       
        td=createElement("th",{"class":"link hoverBgCc9"+(mode["sort"]=="relativeValue"?" sortableColDesc":"")},tr,getText("value"));
        td.addEventListener("click",function(){
            buildInfoPanelQuestsTotal({"sort":"relativeValue"});
        },false);       
    
        err_trace="table.body";
        help=null;
        for(var i=0;i<arr.length;i++){
            item=arr[i];
            tr=createElement("tr",{"class":"hoverBgCc9","prod":item[1]},table);
            if(mode["sort"]=="product"){
                if(help==null){
                    help=item[0];
                } else if(help!=item[0]){
                    tr.classList.add("borderTop1dashedBlack");
                    help=item[0];
                }
            }
            if(prodBlock[item[0]][item[1]].match(/[lq]/)){
                tr.classList.add("red");
                tr.addEventListener("mouseover",function(event){ toolTip.show(event,getText("levelTooLow")); },false); // TODO: correct text if blocked by quest
            }else if((item[0]==0)&&(!prodBlock[0][item[1]].match(/t/))){
                tr.classList.add("link");
                tr.addEventListener("mouseover",function(event){ showGoToMarketToolTip(event,this.getAttribute("prod")); },false);
                tr.addEventListener("click",function(){ showMarket(this.getAttribute("prod")); },false);
            }
            td=createElement("td",{"style":"white-space:nowrap;"},tr);
            div=createElement("div",{},td);
            produktPic(item[0],item[1],div);
            createElement("span",{},div,prodName[item[0]][item[1]]);
            createElement("td",{"style":"text-align:right;"},tr,numberFormat(item[2]));
            createElement("td",{"style":"text-align:right;"},tr,item[3]==0?"--":moneyFormatInt(item[3]));
            createElement("td",{"style":"text-align:right;"},tr,numberFormat(item[4]));
            createElement("td",{"style":"text-align:right;"},tr,item[5]==0?"--":moneyFormatInt(item[5]));
        }
    
        err_trace="saving";
        container=null;table=null;thead=null;tbody=null;tr=null;td=null;span=null;div=null;table1=null;tr1=null;td1=null;tr2=null;td2=null;
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeQuestsTable",implode(mode,"buildInfoPanelQuestsTotal/modeQuestsTable"));
        }catch(err){ GM_logError("buildInfoPanelQuestsTotal ("+err_trace+")\n"+err); }
    }   
    buildInfoPanelQuestsTotal(mode);
    
    err_trace="saving";
    container=null;table=null;thead=null;tbody=null;tr=null;td=null;span=null;div=null;table1=null;tr1=null;td1=null;tr2=null;td2=null;
    GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeQuestsTable",implode(mode,"buildInfoPanelQuests/modeQuestsTable"));
    }catch(err){ GM_logError("buildInfoPanelQuests ("+err_trace+")\n"+err); }
}
function buildInfoPanelZones(){
    try{
        var container=$("infoPanelInner");
        container.innerHTML="";
        var c,totalPunkte=0,zoneNrF,points,endDay,help;
        createElement("div",{"class":"tnormal borderBottom1Black","align":"center","style":"line-height:30px;font-weight:bold;"},container,getText("overview"));
        container=createElement("div",{"style":"width:595px;height:485px;overflow:auto;"},container);
        // Zones
        newtable=createElement("table",{"style":"width:100%;","border":"1"},container);
        for(var i in ALL_ZONES){
            if(!ALL_ZONES.hasOwnProperty(i)){ continue; }
            c=0;
            newtr=createElement("tr",{},newtable);
            createElement("th",{"colspan":"6"},newtr,getText(i));                           
            for(var j=0;j<ALL_ZONES[i].length;j++){
                zoneNrF=ALL_ZONES[i][j];
                if(zones.isProductional(zoneNrF)&&(!zones.getBlock(zoneNrF))){
                    if(c%3==0){
                        newtr=createElement("tr",{"style":"width:100%;"},newtable); 
                    }
                    newtd=createElement("td",{"style":"width:33%;","colspan":"2","zoneNrF":zoneNrF,"class":"link hoverBgCc9"},newtr);
                    newtd.addEventListener("mouseover",function(event){
                        toolTip.show(event,toolTipZoneProduction(this.getAttribute("zoneNrF")));
                    },false);
                    newtd.addEventListener("click",function(){
                        closeInfoPanel();
                        goToZone(this.getAttribute("zoneNrF"));
                    },false);
                    newdiv=createElement("div",{"style":"position:relative;top:0;height:70px;overflow:hidden;"},newtd);
                    createElement("div",{"class":"zoneBg70_"+zones.getBuilding(zoneNrF),"style":"position:absolute;opacity:0.3;"},newdiv);
                    newdiv1=createElement("div",{"style":"position:absolute;top:0;height:61px;width:100%;overflow:auto;"},newdiv);
                    newdiv=createElement("div",{},newdiv1);
                    help=zones.getEndtime(zoneNrF);
                    if (help!=NEVER){
                        endDay=countDays(now,help);
                        if(endDay==0){ 
                            newdiv.innerHTML=getDaytimeStr(help,1)+"&nbsp;"+getText("shortOClock"); 
                        }else if(getText("day"+endDay)){ 
                            newdiv.innerHTML=getText("day"+endDay)+" "+getDaytimeStr(help,1)+"&nbsp;"+getText("shortOClock");
                        }else{
                            newdiv.innerHTML=new Date(1000*help).toLocaleString();
                        }
                    }else{
                        newdiv.innerHTML=getText("idle");
                    }
                    if (help<now){
                        newdiv.style.textDecoration="blink";
                        newdiv.style.fontWeight="bold";
                    }
                    points=0;
                    if(help=zones.getCrop(zoneNrF)){
                        for(var k=0;k<help.length;k++){
                            newdiv=createElement("div",{"style":"line-height:16px;"},newdiv1);
                            produktPic(help[k][0],help[k][1],newdiv);
                            createElement("div",{"style":"display:inline-block;"},newdiv,numberFormat(help[k][2])+" "+prodName[help[k][0]][help[k][1]]);
                            points += help[k][3];
                        }
                    }else{
                        newdiv=createElement("div",{"style":"line-height:16px;"},newdiv1);
                        createElement("div",{"style":"display:inline-block;"},newdiv,"???");
                    }
                    pointsFormat(points,"div",newdiv1);
                    totalPunkte += points;
                    c++;
                }
            }
        }
        // Total production
        newtable=createElement("table",{"style":"width:100%;margin-top:10px;","border":"1"},container);
        newtr=createElement("tr",{},newtable);
        createElement("th",{},newtr,getText("total"));
        newtd=createElement("th",{"class":"link hoverBgCc9"},newtr,getText("missing"));
        newtd.addEventListener("mouseover",function(event){ toolTip.show(event,getText("toSGH")); },false);
        newtd.addEventListener("click",showSGH,false);
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{},newtr);
        for(var k in totalErnte[0]){
            if(!totalErnte[0].hasOwnProperty(k)){ continue; }
            newdiv=createElement("div",{"style":"height:16px"},newtd);
            produktPic(0,k,newdiv);
            createElement("div",{"style":"display:inline-block;"},newdiv,numberFormat(totalErnte[0][k])+" "+prodName[0][k]);
        }
        pointsFormat(totalPunkte,"div",newtd);
        var newtdfehlt=createElement("td",{},newtr);

        // Farmi overview
        newtable=createElement("table",{"style":"width:100%;margin-top:10px;","border":"1"},container);
        newtr=createElement("tr",{},newtable);
        createElement("th",{},newtr,getText("farmi"));
        createElement("th",{},newtr,getText("products"));
        createElement("th",{},newtr,getText("money"));
        createElement("th",{"colspan":"2"},newtr,getText("value"));
        var farmiNr=-1;
        var farmiCount=0;
        var farmiSum=new Object;
        var farmiCash=0;
        var farmiWert=0;
        while (top.window.wrappedJSObject.farmisinfo[0][++farmiNr]){
            if (!top.window.wrappedJSObject.farmisaway[farmiNr]){
            farmiCount++;
            newtr=createElement("tr",{},newtable);
            newtd=createElement("td",{"class":"link hoverBgCc9","name":farmiNr},newtr);
            var farmiGfxNr=top.window.wrappedJSObject.farmisinfo[0][farmiNr]["pic"];
            createElement("img",{"src":GFX+"verkauf/kunde_"+farmiGfxNr+"_still.gif","style":"width:"+FARMISIZE[farmiGfxNr][0]+"px;height:"+FARMISIZE[farmiGfxNr][1]+"px;"},newtd);
            newtd.addEventListener("click",function(){
                closeInfoPanel();
                if ($("citymaincontainer").style.display=="block"){
                    unsafeWindow.initZones(1);
                    unsafeWindow.showMain();
                }
                unsafeWindow.showCart(parseInt(this.getAttribute("name"),10));
            },false);
            newtd=createElement("td",{},newtr);
            var cash=parseFloat(top.window.wrappedJSObject.farmisinfo[0][farmiNr]["price"],10);
            var wert=0;
            for(var i=1 ; i <= 7 ; i++){ // 7=maxanzahl produkte pro farmi
                var pid=parseInt(top.window.wrappedJSObject.farmisinfo[0][farmiNr]["p"+i],10);
                var amount=parseInt(top.window.wrappedJSObject.farmisinfo[0][farmiNr]["a"+i],10);
                if((pid > 0) && (amount > 0)){
                    newdiv=createElement("div",{},newtd);
                    produktPic(0,pid,newdiv);
                    newdiv1=createElement("div",{"class":"link hoverBgCc9","style":"display:inline-block;"+(prodStock[0][pid]<amount?"color:red;":""),"prod":pid},newdiv,numberFormat(amount)+"&nbsp;"+prodName[0][pid]);
                    newdiv1.addEventListener("mouseover",function(event){ showGoToMarketToolTip(event,this.getAttribute("prod")); },false);
                    newdiv1.addEventListener("click",function(){showMarket(this.getAttribute("prod"));},false);
                    if (farmiSum[pid]) farmiSum[pid] += amount;
                    else farmiSum[pid]=amount;
                    wert += amount*gut[pid];
                }
            }
            farmiCash += cash;
            farmiWert += wert;
            newtd=createElement("td",{"style":"text-align:right;"},newtr);
                createElement("div",{},newtd,moneyFormat(cash));
                createElement("div",{},newtd,numberFormat(100*cash/wert,1)+"%");
            newtd=createElement("td",{"style":"text-align:right;"},newtr);
                newdiv=createElement("div",{},newtd,moneyFormat(wert));
                newdiv.addEventListener("mouseover",function(event){ toolTip.show(event,"100%"); },false);
                newdiv=createElement("div",{},newtd,moneyFormat(0.9*wert));
                newdiv.addEventListener("mouseover",function(event){ toolTip.show(event,"90%"); },false);
            newtd=createElement("td",{"style":"text-align:right;"},newtr);
                newdiv=createElement("div",{},newtd,(cash>wert?"+":"")+moneyFormatInt(cash-wert));
                newdiv.addEventListener("mouseover",function(event){ toolTip.show(event,"100%"); },false);
                newdiv=createElement("div",{},newtd,(cash>0.9*wert?"+":"")+moneyFormatInt(cash-0.9*wert));
                newdiv.addEventListener("mouseover",function(event){ toolTip.show(event,"90%"); },false);
            }
        }
        if (farmiCount>0){
            newtr.setAttribute("class","borderBottom2");
            newtr=createElement("tr",{"class":"borderTop2"},newtable);
            createElement("td",{},newtr);
            newtd=createElement("td",{},newtr);
            for(var v in farmiSum){
                if(!farmiSum.hasOwnProperty(v)){ continue; }
                newdiv=createElement("div",{},newtd);
                produktPic(0,v,newdiv);
                createElement("div",{"style":"display:inline-block;"},newdiv,numberFormat(farmiSum[v])+"&nbsp;"+prodName[0][v]);
            }
            newtd=createElement("td",{"style":"text-align:right;"},newtr);
            createElement("div",{},newtd,moneyFormat(farmiCash));
            createElement("div",{},newtd,numberFormat(100*farmiCash/farmiWert,1)+"%");
            newtd=createElement("td",{"style":"text-align:right;"},newtr);
            newdiv=createElement("div",{},newtd,moneyFormat(farmiWert));
            newdiv.addEventListener("mouseover",function(event){ toolTip.show(event,"100%"); },false);
            newdiv=createElement("div",{},newtd,moneyFormat(0.9*farmiWert));
            newdiv.addEventListener("mouseover",function(event){ toolTip.show(event,"90%"); },false);
            newtd=createElement("td",{"style":"text-align:right;"},newtr);
            newdiv=createElement("div",{},newtd,(farmiCash>farmiWert?"+":"")+moneyFormatInt(farmiCash-farmiWert));
            newdiv.addEventListener("mouseover",function(event){ toolTip.show(event,"100%"); },false);
            newdiv=createElement("div",{},newtd,(farmiCash>0.9*farmiWert?"+":"")+moneyFormatInt(farmiCash-0.9*farmiWert));
            newdiv.addEventListener("mouseover",function(event){ toolTip.show(event,"90%"); },false);
        }else{
            newtr=createElement("tr",{},newtable);
            createElement("td",{"colspan":"6"},newtr,"---");
        }
        for(var w=0;w<prodNameSort[0].length;w++){
            var v=prodNameSort[0][w];
            if((!prodBlock[0][v].match(/t/))&&(!prodBlock[0][v].match(/l/))){
                var amount1=(farmiSum[v]?farmiSum[v]:0)-prodStock[0][v];
                var amount=amount1+prodMinRack[0][v];
                if (amount>0){
                    newdiv=createElement("div",{},newtdfehlt);
                    produktPic(0,v,newdiv);
                    newdiv1=createElement("div",{"style":"display:inline-block;","class":"link hoverBgCc9","name":v},newdiv,numberFormat(amount)+(amount1>0?"&nbsp;("+numberFormat(amount1)+")":"")+"&nbsp;"+prodName[0][v]);
                    newdiv1.addEventListener("mouseover",function(event){showGoToMarketToolTip(event,this.getAttribute("name"));},false);
                    newdiv1.addEventListener("click",function(){showMarket(this.getAttribute("name"));},false);
                }
            }
        }
        newtdfehlt=null;

    }catch(err){GM_logError("buildInfoPanelZones\n"+err);}
}
function buildInfoPanelUpjersAds(){
    try{
        var container=$("infoPanelInner");
        container.innerHTML="";
        createElement("div",{"align":"center","style":"font-weight:bold;line-height:30px;"},container,getText("upjersAdvertising"));
        for(var v=0;v<upjersAds.length;v++){
            createElement("div",{"style":"padding:5px;margin:5px;border:1px solid black;"},container,upjersAds[v]);
        }
    }catch(err){GM_logError("buildInfoPanelUpjersAds\n"+err);}
}
function buildInfoPanelLottery(mode){
    try{
        var modeDefault={"total":false};
        var modeOld=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeInfoPanelLottery"),"buildInfoPanelLottery/modeOld");
        if(typeof modeOld!="object"){ modeOld=modeDefault; }
        if(typeof mode!="object"){ mode=modeOld; }
        for(var v in modeDefault){
            if(!modeDefault.hasOwnProperty(v)){ continue; }
            if(mode[v]==undefined){ mode[v]=(modeOld[v]==undefined?modeDefault[v]:modeOld[v]); }
        }
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeInfoPanelLottery",implode(mode,"buildInfoPanelLottery/mode"));    
        // implode data older than last month
        var stichtag=new Date();
        stichtag=Math.round(((new Date(stichtag.getFullYear(),stichtag.getMonth()-1,1)).getTime())/1000);
        var month;
        for(var v=lotteryLog.length-1;v>=0;v--){
            if(lotteryLog[v][0].match(/\d+\.\d+\.\d+/)){
                if(getTime(lotteryLog[v][0])<stichtag){
                    month=/\d+\.(\d+)\.(\d+)/.exec(lotteryLog[v][0]);
                    if(month[1].length==1){
                        month=month[2]+"-0"+month[1];
                    }else{
                        month=month[2]+"-"+month[1];
                    }
                    for(var w=0;w<lotteryLog.length;w++){
                        if(lotteryLog[w][0]==month){ break; }
                    }
                    if(!lotteryLog[w]){
                        lotteryLog[w]=[month,[],[],{},[]];
                    }
                    if(lotteryLog[v][1]>0){
                        if(lotteryLog[v][2]&&(!lotteryLog[v][2].isEmpty())){
                            if(!lotteryLog[w][2][lotteryLog[v][1]]){ lotteryLog[w][2][lotteryLog[v][1]]=0; }
                            lotteryLog[w][2][lotteryLog[v][1]]++;
                            for(var p in lotteryLog[v][2]){
                                if(!lotteryLog[v][2].hasOwnProperty(p)){ continue; }
                                if(!lotteryLog[w][3][p]){ lotteryLog[w][3][p]=0; }
                                lotteryLog[w][3][p] += lotteryLog[v][2][p];
                            }
                        }else{
                            if(!lotteryLog[w][1][lotteryLog[v][1]]){ lotteryLog[w][1][lotteryLog[v][1]]=0; }
                            lotteryLog[w][1][lotteryLog[v][1]]++;
                        }
                    }
                    // lotteryLog[w][2].sortObj(sortObjFunctions["productId"]);
                    if(lotteryLog[v][3]){
                        for(var p=0;p<lotteryLog[v][3].length;p++){
                            if(!lotteryLog[w][4][lotteryLog[v][3][p]]){ lotteryLog[w][4][lotteryLog[v][3][p]]=0; }
                            lotteryLog[w][4][lotteryLog[v][3][p]]++;
                        }
                    }
                    lotteryLog.splice(v,1);
                }
            }
        }
        lotteryLog.sort(sortObjFunctions["date"]);
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_lotteryLog",implode(lotteryLog));

        var container,newdiv,newtable,newtable1,newtr,newtr1,newtd,newinput;
        container=$("infoPanelInner");
        container.innerHTML="";
        // Head
        newdiv=createElement("div",{"class":"borderBottom1Black","style":"height:30px;"},container);
        newtable=createElement("table",{"class":"tnormal","style":"font-weight:bold;width:100%;"},newdiv);
        newtr=createElement("tr",{},newtable);
        createElement("td",{"class":"tnormal","style":"font-weight:bold;text-align:center;"},newtr,getText("lotteryLog"));
        newtd=createElement("td",{},newtr);
        newdiv=createElement("div",{"class":"link naviItem"+(!mode["total"]?"Active":"")},newtd,getText("detail"));
        newdiv.addEventListener("click",function(){
            buildInfoPanelLottery({"total":false});
        },false);
        newdiv=createElement("div",{"class":"link naviItem"+(mode["total"]?"Active":"")},newtd,getText("total"));
        newdiv.addEventListener("click",function(){
            buildInfoPanelLottery({"total":true});
        },false);
        // Content
        newdiv=createElement("div",{"style":"height:485px;overflow:auto;"},container);
        newtable=createElement("table",{"style":"line-height:16px;width:100%","border":"1"},newdiv);
        newtr=createElement("tr",{},newtable);
        if(mode["total"]){
            // prepare data
            var lotteryLogTotal=[[],[],{},[]];
            for(var v=lotteryLog.length-1;v>=0;v--){
                if(lotteryLog[v][0].match(/\d+\.\d+\.\d+/)){
                    if(lotteryLog[v][1]>0){
                        if(lotteryLog[v][2]&&(!lotteryLog[v][2].isEmpty())){
                            if(!lotteryLogTotal[1][lotteryLog[v][1]]){ lotteryLogTotal[1][lotteryLog[v][1]]=0; }
                            lotteryLogTotal[1][lotteryLog[v][1]]++;
                            for(var p in lotteryLog[v][2]){
                                if(!lotteryLog[v][2].hasOwnProperty(p)){ continue; }
                                if(!lotteryLogTotal[2][p]){ lotteryLogTotal[2][p]=0; }
                                lotteryLogTotal[2][p] += lotteryLog[v][2][p];
                            }
                        }else{
                            if(!lotteryLogTotal[0][lotteryLog[v][1]]){ lotteryLogTotal[0][lotteryLog[v][1]]=0; }
                            lotteryLogTotal[0][lotteryLog[v][1]]++;
                        }
                    }
                    // lotteryLogTotal[2].sortObj(sortObjFunctions["productId"]);
                    if(lotteryLog[v][3]){
                        for(var p=0;p<lotteryLog[v][3].length;p++){
                            if(!lotteryLogTotal[3][lotteryLog[v][3][p]]){ lotteryLogTotal[3][lotteryLog[v][3][p]]=0; }
                            lotteryLogTotal[3][lotteryLog[v][3][p]]++;
                        }
                    }
                }else{
                    for(var j=0;j<4;j++){
                    if(j==2){ continue; }
                        for(var i=0;i<lotteryLog[v][j+1].length;i++){
                            if(lotteryLog[v][j+1][i]>0){
                                if(!lotteryLogTotal[j][i]){ lotteryLogTotal[j][i]=0; }
                                lotteryLogTotal[j][i] += lotteryLog[v][j+1][i];
                            }
                        }
                    }

                    for(var prod in lotteryLog[v][3]){
                        if(!lotteryLog[v][3].hasOwnProperty(prod)){ continue; }
                        if(!lotteryLogTotal[2][prod]){ lotteryLogTotal[2][prod]=0; }
                        lotteryLogTotal[2][prod] += lotteryLog[v][3][prod];
                    }
                }
            }
            // plot table
            createElement("th",{"style":"white-space:nowrap;"},newtr,getText("dailyTicket"));
            createElement("th",{"style":"white-space:nowrap;"},newtr,getText("boughtTickets"));

            newtr=createElement("tr",{},newtable);
            newtd=createElement("td",{},newtr);
            newdiv=createElement("div",{"style":"margin-bottom:3px;"},newtd);
            newdiv.addEventListener("mouseover",function(event){ toolTip.show(event,getText("keptLots")); },false);
            var c=0;
            for(var i=0;i<lotteryLogTotal[0].length;i++){
                if(lotteryLogTotal[0][i]>0){
                    c += lotteryLogTotal[0][i];
                    newdiv1=createElement("div",{"style":"position:relative;display:inline-block;margin-right:2px;"},newdiv);
                    createElement("img",{"style":"width:20px;border:0;","src":GFX+"city/"+i+".jpg"},newdiv1);
                    createElement("span",{},newdiv1,lotteryLogTotal[0][i]);
                }
            }
            if(c>0){ createElement("div",{"style":"position:relative;display:inline-block;"},newdiv,"&nbsp;=&nbsp;"+c+sign_mult); }

            var changedLots=0;
            newdiv=createElement("div",{"style":""},newtd);
            newdiv.addEventListener("mouseover",function(event){ toolTip.show(event,getText("exchangedLots")); },false);
            for(var i=0;i<lotteryLogTotal[1].length;i++){
                if(lotteryLogTotal[1][i]>0){
                    changedLots += lotteryLogTotal[1][i];
                    newdiv1=createElement("div",{"style":"position:relative;display:inline-block;margin-right:2px;"},newdiv);
                    createElement("img",{"style":"width:20px;border:0;","src":GFX+"city/"+i+".jpg"},newdiv1);
                    createElement("span",{},newdiv1,lotteryLogTotal[1][i]);
                }
            }
            if(changedLots>0){ createElement("div",{"style":"position:relative;display:inline-block;"},newdiv,"&nbsp;=&nbsp;"+changedLots+sign_mult); }

            var c,sum=0;
            newtable1=createElement("table",{"style":"display:inline-block;padding-right:5px;margin-right:5px;","border":"0","cellspacing":"0"},newtd);
            for(var prod in lotteryLogTotal[2]){
                if(!lotteryLogTotal[2].hasOwnProperty(prod)){ continue; }
                newtr1=createElement("tr",{"class":"link hoverBgLightblue","prod":prod},newtable1);
                newtr1.addEventListener("mouseover",function(event){ showGoToMarketToolTip(event,this.getAttribute("prod")); },false);
                newtr1.addEventListener("click",function(){showMarket(this.getAttribute("prod"));},false);
                produktPic(0,prod,createElement("td",{},newtr1));
                createElement("td",{"style":"text-align:right;"},newtr1,numberFormat(lotteryLogTotal[2][prod]));
                createElement("td",{"style":"padding-right:5px;"},newtr1,prodName[0][prod]);
                c=lotteryLogTotal[2][prod]*gut[prod];
                sum += c;
                createElement("td",{"style":"text-align:right;"},newtr1,moneyFormat(c));
            }
            newtr1=createElement("tr",{},newtable1);
            createElement("td",{"colspan":"2"},newtr1);
            createElement("td",{"style":"border-top:1px solid black;"},newtr1,sign_sum);
            createElement("td",{"style":"border-top:1px solid black;text-align:right;"},newtr1,moneyFormat(sum));
            newtr1=createElement("tr",{},newtable1);
            createElement("td",{"colspan":"2"},newtr1);
            createElement("td",{},newtr1,sign_average);
            createElement("td",{"style":"text-align:right;"},newtr1,moneyFormat(sum/changedLots));

            c=0;
            newtd=createElement("td",{},newtr);
            for(var i=0;i<lotteryLogTotal[3].length;i++){
                if(lotteryLogTotal[3][i]>0){
                    c += lotteryLogTotal[3][i];
                    newdiv1=createElement("div",{"style":"position:relative;display:inline-block;margin-right:2px;"},newdiv);
                    createElement("img",{"style":"width:20px;border:0;","src":GFX+"city/"+i+".jpg"},newdiv1);
                    createElement("span",{},newdiv1,lotteryLogTotal[3][i]);
                }
            }
            if(c>0){ createElement("div",{"style":"position:relative;display:inline-block;"},newdiv,"&nbsp;=&nbsp;"+c+sign_mult); }
        }else{
            createElement("th",{"style":"white-space:nowrap;"},newtr,getText("day"));
            createElement("th",{"style":"white-space:nowrap;"},newtr,getText("dailyTicket"));
            createElement("th",{"style":"white-space:nowrap;"},newtr,getText("boughtTickets"));

            for(var v=lotteryLog.length-1;v>=0;v--){
                newtr=createElement("tr",{},newtable);
                createElement("td",{},newtr,lotteryLog[v][0]);

                if(lotteryLog[v][0].match(/\d+\.\d+\.\d+/)){
                    newtd=createElement("td",{},newtr);
                    newdiv=createElement("div",{"style":"display:inline-block;margin-right:3px;vertical-align:top;"},newtd);
                    if(lotteryLog[v][1]>0){ createElement("img",{"style":"width:20px;border:0;","src":GFX+"city/"+lotteryLog[v][1]+".jpg"},newdiv); }
                    if(lotteryLog[v][2]){
                        var c,sum=0;
                        newtable1=createElement("table",{"style":"display:inline-block;border-right:1px solid black;padding-right:5px;margin-right:5px;","border":"0","cellspacing":"0"},newtd);
                        for(var prod in lotteryLog[v][2]){
                            if(!lotteryLog[v][2].hasOwnProperty(prod)){ continue; }
                            newtr1=createElement("tr",{"class":"link hoverBgLightblue","prod":prod},newtable1);
                            newtr1.addEventListener("mouseover",function(event){ showGoToMarketToolTip(event,this.getAttribute("prod")); },false);
                            newtr1.addEventListener("click",function(){showMarket(this.getAttribute("prod"));},false);
                            produktPic(0,prod,createElement("td",{},newtr1));
                            createElement("td",{"style":"text-align:right;"},newtr1,numberFormat(lotteryLog[v][2][prod]));
                            createElement("td",{"style":"padding-right:5px;"},newtr1,prodName[0][prod]);
                            c=lotteryLog[v][2][prod]*gut[prod];
                            sum += c;
                            createElement("td",{"style":"text-align:right;"},newtr1,moneyFormat(c));
                        }
                        createElement("div",{"style":"display:inline-block;vertical-align:bottom;"},newtd,moneyFormat(sum));
                    }

                    newtd=createElement("td",{},newtr);
                    if(lotteryLog[v][3]){
                        for(var w=0;w<lotteryLog[v][3].length;w++){
                            createElement("img",{"style":"width:20px;border:0;","src":GFX+"city/"+lotteryLog[v][3][w]+".jpg"},newtd);
                        }
                    }
                }else{
                    newtd=createElement("td",{},newtr);
                    newdiv=createElement("div",{"style":"margin-bottom:3px;"},newtd);
                    newdiv.addEventListener("mouseover",function(event){ toolTip.show(event,getText("keptLots")); },false);
                    var c=0;
                    for(var i=0;i<lotteryLog[v][1].length;i++){
                        if(lotteryLog[v][1][i]>0){
                            c += lotteryLog[v][1][i];
                            newdiv1=createElement("div",{"style":"position:relative;display:inline-block;margin-right:2px;"},newdiv);
                            createElement("img",{"style":"width:20px;border:0;","src":GFX+"city/"+i+".jpg"},newdiv1);
                            createElement("span",{},newdiv1,lotteryLog[v][1][i]);
                        }
                    }
                    if(c>0){ createElement("div",{"style":"position:relative;display:inline-block;"},newdiv,"&nbsp;=&nbsp;"+c+sign_mult); }

                    var changedLots=0;
                    newdiv=createElement("div",{"style":""},newtd);
                    newdiv.addEventListener("mouseover",function(event){ toolTip.show(event,getText("exchangedLots")); },false);
                    for(var i=0;i<lotteryLog[v][2].length;i++){
                        if(lotteryLog[v][2][i]>0){
                            changedLots += lotteryLog[v][2][i];
                            newdiv1=createElement("div",{"style":"position:relative;display:inline-block;margin-right:2px;"},newdiv);
                            createElement("img",{"style":"width:20px;border:0;","src":GFX+"city/"+i+".jpg"},newdiv1);
                            createElement("span",{},newdiv1,lotteryLog[v][2][i]);
                        }
                    }
                    if(changedLots>0){ createElement("div",{"style":"position:relative;display:inline-block;"},newdiv,"&nbsp;=&nbsp;"+changedLots+sign_mult); }

                    var sum=0;
                    for(var prod in lotteryLog[v][3]){
                        if(!lotteryLog[v][3].hasOwnProperty(prod)){ continue; }
                        newdiv=createElement("div",{"class":"link hoverBgLightblue","prod":prod,"style":"position:relative;display:inline-block;margin-right:3px;"},newtd);
                        newdiv.addEventListener("mouseover",function(event){ showGoToMarketToolTip(event,this.getAttribute("prod")); },false);
                        newdiv.addEventListener("click",function(){showMarket(this.getAttribute("prod"));},false);
                        produktPic(0,prod,newdiv);
                        createElement("span",{"style":"text-align:right;"},newdiv,numberFormat(lotteryLog[v][3][prod]));
                        c=lotteryLog[v][3][prod]*gut[prod];
                        sum += c;
                    }
                    createElement("div",{},newtd,moneyFormat(sum)+"&nbsp;("+sign_average+moneyFormat(sum/changedLots)+")");

                    c=0;
                    newtd=createElement("td",{},newtr);
                    for(var i=0;i<lotteryLog[v][4].length;i++){
                        if(lotteryLog[v][4][i]>0){
                            c += lotteryLog[v][4][i];
                            newdiv1=createElement("div",{"style":"position:relative;display:inline-block;margin-right:2px;"},newdiv);
                            createElement("img",{"style":"width:20px;border:0;","src":GFX+"city/"+i+".jpg"},newdiv1);
                            createElement("span",{},newdiv1,lotteryLog[v][4][i]);
                        }
                    }
                    if(c>0){ createElement("div",{"style":"position:relative;display:inline-block;"},newdiv,"&nbsp;=&nbsp;"+c+sign_mult); }
                }
            }
        }
        container=null;newdiv=null;newtable=null;newtable1=null;newtr=null;newtr1=null;newtd=null;newinput=null;
    }catch(err){GM_logError("buildInfoPanelLottery\n"+err);}
}
function buildInfoPanelDonkey(mode){
    try{
        var modeDefault={"total":false};
        var modeOld=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeInfoPanelDonkey"),"buildInfoPanelDonkey/modeOld");
        if(typeof modeOld!="object"){ modeOld=modeDefault; }
        if(typeof mode!="object"){ mode=modeOld; }
        for(var v in modeDefault){
            if(!modeDefault.hasOwnProperty(v)){ continue; }
            if(mode[v]==undefined){ mode[v]=(modeOld[v]==undefined?modeDefault[v]:modeOld[v]); }
        }
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeInfoPanelDonkey",implode(mode,"buildInfoPanelDonkey/mode"));  
        // implode data older than last month
    try{
        var stichtag=new Date();
        stichtag=Math.round(((new Date(stichtag.getFullYear(),stichtag.getMonth()-1,1)).getTime())/1000);
        var month;
        for(var v=logDonkey.length-1;v>=0;v--){
            for(var w=logDonkey[v][2].length-1;w>=0;w--){
                if(!logDonkey[v][2][w][3]){ logDonkey[v][2][w][3]=1; }
            }
        }
        for(var v=logDonkey.length-1;v>=0;v--){
            if(logDonkey[v][0].match(/\d+\.\d+\.\d+/)){
                if(getTime(logDonkey[v][0])<stichtag){
                    month=/\d+\.(\d+)\.(\d+)/.exec(logDonkey[v][0]);
                    if(month[1].length==1){
                        month=month[2]+"-0"+month[1];
                    }else{
                        month=month[2]+"-"+month[1];
                    }
                    for(var w=0;w<logDonkey.length;w++){
                        if(logDonkey[w][0]==month){ break; }
                    }
                    if(!logDonkey[w]){
                        logDonkey[w]=[month,0,[]];
                    }
                    logDonkey[w][1]+=logDonkey[v][1];
                    for(var i=logDonkey[v][2].length-1;i>=0;i--){
                        for(var j=logDonkey[w][2].length-1;j>=0;j--){
                            if((logDonkey[v][2][i][0]==logDonkey[w][2][j][0])&&(logDonkey[v][2][i][1]==logDonkey[w][2][j][1])&&(logDonkey[v][2][i][2]==logDonkey[w][2][j][2])){
                                logDonkey[w][2][j][3]+=logDonkey[v][2][i][3];
                                break;
                            }
                        }
                        if(j<0){
                            logDonkey[w][2].push(logDonkey[v][2][i]);
                        }
                    }
                    logDonkey.splice(v,1);
                }
            }
        }
        logDonkey.sort(sortObjFunctions["date"]);
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_logDonkey",implode(logDonkey));
    }catch(err){GM_logError("buildInfoPanelWaltraud (old data)\nv="+v+"\n"+err);}
    
        var container,newdiv,newtable,newtr,newtd;
        container=$("infoPanelInner");
        container.innerHTML="";
        // Head
        newdiv=createElement("div",{"class":"borderBottom1Black","style":"height:30px;"},container);
        newtable=createElement("table",{"class":"tnormal","style":"font-weight:bold;width:100%;"},newdiv);
        newtr=createElement("tr",{},newtable);
        createElement("td",{"class":"tnormal","style":"font-weight:bold;text-align:center;"},newtr,getText("logDonkey"));
        newtd=createElement("td",{},newtr);
        newdiv=createElement("div",{"class":"link naviItem"+(!mode["total"]?"Active":"")},newtd,getText("detail"));
        newdiv.addEventListener("click",function(){
            buildInfoPanelDonkey({"total":false});
        },false);
        newdiv=createElement("div",{"class":"link naviItem"+(mode["total"]?"Active":"")},newtd,getText("total"));
        newdiv.addEventListener("click",function(){
            buildInfoPanelDonkey({"total":true});
        },false);
        // Content
        newdiv=createElement("div",{"style":"height:485px;overflow:auto;"},container);
        newtable=createElement("table",{"style":"line-height:16px;width:100%","border":"1"},newdiv);
        newtr=createElement("tr",{},newtable);
        if(mode["total"]){
        /*
            // prepare data
            var lotteryLogTotal=[[],[],{},[]];
            for(var v=lotteryLog.length-1;v>=0;v--){
                if(lotteryLog[v][0].match(/\d+\.\d+\.\d+/)){
                    if(lotteryLog[v][1]>0){
                        if(lotteryLog[v][2]&&(!lotteryLog[v][2].isEmpty())){
                            if(!lotteryLogTotal[1][lotteryLog[v][1]]){ lotteryLogTotal[1][lotteryLog[v][1]]=0; }
                            lotteryLogTotal[1][lotteryLog[v][1]]++;
                            for(var p in lotteryLog[v][2]){
                                if(!lotteryLog[v][2].hasOwnProperty(p)){ continue; }
                                if(!lotteryLogTotal[2][p]){ lotteryLogTotal[2][p]=0; }
                                lotteryLogTotal[2][p] += lotteryLog[v][2][p];
                            }
                        }else{
                            if(!lotteryLogTotal[0][lotteryLog[v][1]]){ lotteryLogTotal[0][lotteryLog[v][1]]=0; }
                            lotteryLogTotal[0][lotteryLog[v][1]]++;
                        }
                    }
                    // lotteryLogTotal[2].sortObj(sortObjFunctions["productId"]);
                    if(lotteryLog[v][3]){
                        for(var p=0;p<lotteryLog[v][3].length;p++){
                            if(!lotteryLogTotal[3][lotteryLog[v][3][p]]){ lotteryLogTotal[3][lotteryLog[v][3][p]]=0; }
                            lotteryLogTotal[3][lotteryLog[v][3][p]]++;
                        }
                    }
                }else{
                    for(var j=0;j<4;j++){
                    if(j==2){ continue; }
                        for(var i=0;i<lotteryLog[v][j+1].length;i++){
                            if(lotteryLog[v][j+1][i]>0){
                                if(!lotteryLogTotal[j][i]){ lotteryLogTotal[j][i]=0; }
                                lotteryLogTotal[j][i] += lotteryLog[v][j+1][i];
                            }
                        }
                    }

                    for(var prod in lotteryLog[v][3]){
                        if(!lotteryLog[v][3].hasOwnProperty(prod)){ continue; }
                        if(!lotteryLogTotal[2][prod]){ lotteryLogTotal[2][prod]=0; }
                        lotteryLogTotal[2][prod] += lotteryLog[v][3][prod];
                    }
                }
            }
            // plot table
            createElement("th",{"style":"white-space:nowrap;"},newtr,getText("dailyTicket"));
            createElement("th",{"style":"white-space:nowrap;"},newtr,getText("boughtTickets"));

            newtr=createElement("tr",{},newtable);
            newtd=createElement("td",{},newtr);
            newdiv=createElement("div",{"style":"margin-bottom:3px;"},newtd);
            newdiv.addEventListener("mouseover",function(event){ toolTip.show(event,getText("keptLots")); },false);
            var c=0;
            for(var i=0;i<lotteryLogTotal[0].length;i++){
                if(lotteryLogTotal[0][i]>0){
                    c += lotteryLogTotal[0][i];
                    newdiv1=createElement("div",{"style":"position:relative;display:inline-block;margin-right:2px;"},newdiv);
                    createElement("img",{"style":"width:20px;border:0;","src":GFX+"city/"+i+".jpg"},newdiv1);
                    createElement("span",{},newdiv1,lotteryLogTotal[0][i]);
                }
            }
            if(c>0){ createElement("div",{"style":"position:relative;display:inline-block;"},newdiv,"&nbsp;=&nbsp;"+c+sign_mult); }

            var changedLots=0;
            newdiv=createElement("div",{"style":""},newtd);
            newdiv.addEventListener("mouseover",function(event){ toolTip.show(event,getText("exchangedLots")); },false);
            for(var i=0;i<lotteryLogTotal[1].length;i++){
                if(lotteryLogTotal[1][i]>0){
                    changedLots += lotteryLogTotal[1][i];
                    newdiv1=createElement("div",{"style":"position:relative;display:inline-block;margin-right:2px;"},newdiv);
                    createElement("img",{"style":"width:20px;border:0;","src":GFX+"city/"+i+".jpg"},newdiv1);
                    createElement("span",{},newdiv1,lotteryLogTotal[1][i]);
                }
            }
            if(changedLots>0){ createElement("div",{"style":"position:relative;display:inline-block;"},newdiv,"&nbsp;=&nbsp;"+changedLots+sign_mult); }

            var c,sum=0;
            newtable1=createElement("table",{"style":"display:inline-block;padding-right:5px;margin-right:5px;","border":"0","cellspacing":"0"},newtd);
            for(var prod in lotteryLogTotal[2]){
                if(!lotteryLogTotal[2].hasOwnProperty(prod)){ continue; }
                newtr1=createElement("tr",{"class":"link hoverBgLightblue","prod":prod},newtable1);
                newtr1.addEventListener("mouseover",function(event){ showGoToMarketToolTip(event,this.getAttribute("prod")); },false);
                newtr1.addEventListener("click",function(){showMarket(this.getAttribute("prod"));},false);
                produktPic(0,prod,createElement("td",{},newtr1));
                createElement("td",{"style":"text-align:right;"},newtr1,numberFormat(lotteryLogTotal[2][prod]));
                createElement("td",{"style":"padding-right:5px;"},newtr1,prodName[0][prod]);
                c=lotteryLogTotal[2][prod]*gut[prod];
                sum += c;
                createElement("td",{"style":"text-align:right;"},newtr1,moneyFormat(c));
            }
            newtr1=createElement("tr",{},newtable1);
            createElement("td",{"colspan":"2"},newtr1);
            createElement("td",{"style":"border-top:1px solid black;"},newtr1,sign_sum);
            createElement("td",{"style":"border-top:1px solid black;text-align:right;"},newtr1,moneyFormat(sum));
            newtr1=createElement("tr",{},newtable1);
            createElement("td",{"colspan":"2"},newtr1);
            createElement("td",{},newtr1,sign_average);
            createElement("td",{"style":"text-align:right;"},newtr1,moneyFormat(sum/changedLots));

            c=0;
            newtd=createElement("td",{},newtr);
            for(var i=0;i<lotteryLogTotal[3].length;i++){
                if(lotteryLogTotal[3][i]>0){
                    c += lotteryLogTotal[3][i];
                    newdiv1=createElement("div",{"style":"position:relative;display:inline-block;margin-right:2px;"},newdiv);
                    createElement("img",{"style":"width:20px;border:0;","src":GFX+"city/"+i+".jpg"},newdiv1);
                    createElement("span",{},newdiv1,lotteryLogTotal[3][i]);
                }
            }
            if(c>0){ createElement("div",{"style":"position:relative;display:inline-block;"},newdiv,"&nbsp;=&nbsp;"+c+sign_mult); }
        */
        }else{
            createElement("th",{"style":"white-space:nowrap;"},newtr,getText("day"));
            createElement("th",{"style":"white-space:nowrap;"},newtr,getText("points"));
            createElement("th",{"style":"white-space:nowrap;"},newtr,getText("goods"));

            for(var v=logDonkey.length-1;v>=0;v--){
                newtr=createElement("tr",{},newtable);
                createElement("td",{},newtr,logDonkey[v][0]);
                newtd=createElement("td",{},newtr);
                pointsFormat(logDonkey[v][1],"span",newtd);
                newtd=createElement("td",{},newtr);
                if(logDonkey[v][2]){
                    for(var w=0;w<logDonkey[v][2].length;w++){
                        switch(logDonkey[v][2][w][0]){
                        case 1:{
                            newdiv=createElement("div",{"class":"hoverBgLightblue","prod":logDonkey[v][2][w][2]},newtd);
                            if(logDonkey[v][2][w][1]==0){
                                newdiv.classList.add("link");
                                newdiv.addEventListener("mouseover",function(event){ showGoToMarketToolTip(event,this.getAttribute("prod")); },false);
                                newdiv.addEventListener("click",function(){showMarket(this.getAttribute("prod"));},false);
                            }
                            produktPic(logDonkey[v][2][w][1],logDonkey[v][2][w][2],newdiv);
                            createElement("span",{},newdiv,numberFormat(logDonkey[v][2][w][3])+"&nbsp;"+prodName[logDonkey[v][2][w][1]][logDonkey[v][2][w][2]]);
                            if((logDonkey[v][2][w][1]==0)&&(gut[logDonkey[v][2][w][2]])){
                                createElement("span",{"style":"padding-left:5px;"},newdiv,"("+moneyFormat(logDonkey[v][2][w][3]*gut[logDonkey[v][2][w][2]])+")");
                            }
                        break;}
                        case 5:{
                            newdiv=createElement("div",{},newtd);
                            createElement("img",{"src":GFX+"adbonus.gif","style":"border:0;height:15px;"},newdiv);
                            createElement("span",{},newdiv,unsafeWindow.t_donkey_farmiadd);
                            if(logDonkey[v][2][w][3]>1){
                                createElement("span",{},newdiv," ("+logDonkey[v][2][w][3]+"x)");
                            }
                        break;}
                        case 12:{
                            newdiv=createElement("div",{},newtd);
                            createElement("span",{},newdiv,unsafeWindow.quest_reward_6+": ");
                            createElement("img",{"src":GFX+"farmhouse/thumbs/"+logDonkey[v][2][w][1]+".jpg","style":"border:0;height:50px;width:50px;"},newdiv);
                            if(logDonkey[v][2][w][3]>1){
                                createElement("span",{},newdiv," ("+logDonkey[v][2][w][3]+"x)");
                            }
                        break;}
                        case 13:{
                            newdiv=createElement("div",{},newtd);
                            createElement("span",{},newdiv,getText("shadowboxitem")+": ");
                            createElement("img",{"src":GFX+"gifts/"+logDonkey[v][2][w][1]+".gif","style":"border:0;height:50px;width:50px;"},newdiv);
                            if(logDonkey[v][2][w][3]>1){
                                createElement("span",{},newdiv," ("+logDonkey[v][2][w][3]+"x)");
                            }
                        break;}
                        }
                    }
                }
            }
        }
        container=null;newdiv=null;newtable=null;newtr=null;newtd=null;
    }catch(err){GM_logError("buildInfoPanelWaltraud\n"+err);}
}
function buildInfoPanelFarmies(mode){
    try{
        var modeDefault={"limit":95};
        var modeOld=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeInfoPanelFarmies"),"buildInfoPanelFarmies/modeOld");
        if(typeof modeOld!="object"){ modeOld=modeDefault; }
        if(typeof mode!="object"){ mode=modeOld; }
        for(var v in modeDefault){
            if(!modeDefault.hasOwnProperty(v)){ continue; }
            if(mode[v]==undefined){ mode[v]=(modeOld[v]==undefined?modeDefault[v]:modeOld[v]); }
        }
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeInfoPanelFarmies",implode(mode,"buildInfoPanelFarmies/mode"));    
        var newFarmiumsatz=new Object();
        var totalPrice=0;
        var totalWert=0;
        var totalPriceOk=0;
        var totalWertOk=0;
        var countFarmisOk=0;
        var countFarmisAll=0;
        var totalProducts=new Object();

        var container,newdiv,newtable,newtr,newtd;
        container=$("infoPanelInner");
        container.innerHTML="";
        newdiv=createElement("div",{"style":"height:100%;width:565px;overflow:auto;"},container);
        newtable=createElement("table",{"style":"width:100%","border":"1"},newdiv);
        newtable.addEventListener("mouseover",function(event){
            var node=event.target;
            var mouseOverText=node.getAttribute("mouseOverText");
            while((node!=this)&&(!mouseOverText)){
                node=node.parentNode;
                mouseOverText=node.getAttribute("mouseOverText");
            }
            if(mouseOverText){ toolTip.show(event,mouseOverText); }
            node=null;mouseOverText=null;
        },false);

        // selection bar on the right side
        newdiv1=createElement("div",{"class":"link","style":"position:absolute;top:0;right:0;border:1px solid black;"},container);
        newdiv1.addEventListener("mouseover",function(event){
            var node=event.target;
            var mouseOverText=node.getAttribute("mouseOverText");
            while((node!=this)&&(!mouseOverText)){
                node=node.parentNode;
                mouseOverText=node.getAttribute("mouseOverText");
            }
            if(mouseOverText){ toolTip.show(event,mouseOverText); }
            node=null;mouseOverText=null;
        },false);
        for(var v=200;v>-1;v--){
            newdiv=createElement("div",{"class":"hoverBgRed","style":"width:20px;height:2.5px;","mouseOverText":v+"%"},newdiv1);
            if (v<=mode["limit"]){ newdiv.style.backgroundColor="blue"; }
            if (v==90||v==100) newdiv.style.borderTop="1px solid black";
            newdiv.addEventListener("click",function(){
                buildInfoPanelFarmies({"limit":parseInt(this.getAttribute("mouseOverText"),10)});
            },false);
        }

        // Farmi table
        newtr=createElement("tr",{},newtable);
        createElement("th",{"style":"border-bottom:2px solid black;"},newtr,"");
        createElement("th",{"style":"border-bottom:2px solid black;"},newtr,getText("products"));
        createElement("th",{"style":"border-bottom:2px solid black;"},newtr,getText("money"));
        createElement("th",{"style":"border-bottom:2px solid black;","colspan":"2"},newtr,getText("value"));

        var borderTop;
        var c=0;
        var prev=null;
        for(var v=0;v<farmiLog.length;v++){
            countFarmisAll++;
            newtr=createElement("tr",{"class":"hoverBgCc9"},newtable);
            if (prev==null){
                borderTop="2px solid black;";
                newtd1=createElement("td",{"style":"border-top:"+borderTop},newtr,farmiLog[v][1]);
                c=1;
            }else if (farmiLog[v][1]!=farmiLog[prev][1]){
                borderTop="2px solid black;";
                newtd1.innerHTML += "<br>("+c+")";
                newtd1=createElement("td",{"style":"border-top:"+borderTop},newtr,farmiLog[v][1]);
                c=1;
            }else{
                borderTop="1px solid black;";
                newtd1.rowSpan=++c;
            }
            newtd=createElement("td",{"style":"border-top:"+borderTop},newtr);
            var wert=0;
            for(var w in farmiLog[v][3]){
                if(!farmiLog[v][3].hasOwnProperty(w)){ continue; }
                newdiv=createElement("div",{"style":"line-height:16px;"},newtd);
                produktPic(0,w,newdiv);
                createElement("div",{"style":"display:inline-block;"},newdiv,numberFormat(farmiLog[v][3][w])+"&nbsp;"+prodName[0][w]);
                wert += farmiLog[v][3][w]*gut[w];
            }
            totalPrice += farmiLog[v][2];
            totalWert += wert;
            newtd=createElement("td",{"style":"text-align:right;border-top:"+borderTop},newtr);
                createElement("div",{},newtd,moneyFormatInt(farmiLog[v][2]));
                newdiv=createElement("div",{},newtd,numberFormat(100*farmiLog[v][2]/wert,1)+"%");
                if (100*farmiLog[v][2]>mode["limit"]*wert){
                    countFarmisOk++;
                    for(var w in farmiLog[v][3]){
                        if(!farmiLog[v][3].hasOwnProperty(w)){ continue; }
                        if(totalProducts[w]==undefined){ totalProducts[w]=[0,0]; }
                        totalProducts[w][0]++;
                        totalProducts[w][1]+=farmiLog[v][3][w];
                    }
                    totalPriceOk += farmiLog[v][2];
                    totalWertOk += wert;

                }else{ newdiv.style.backgroundColor="red"; }
            newtd=createElement("td",{"style":"text-align:right;border-top:"+borderTop},newtr);
                createElement("div",{"mouseOverText":"100%"},newtd,moneyFormatInt(wert));
                createElement("div",{"mouseOverText":"90%"},newtd,moneyFormatInt(0.9*wert));
            newtd=createElement("td",{"style":"text-align:right;border-top:"+borderTop},newtr);
                createElement("div",{"mouseOverText":"100%"},newtd,(farmiLog[v][2]>wert?"+":"")+moneyFormatInt(farmiLog[v][2]-wert));
                createElement("div",{"mouseOverText":"90%"},newtd,(farmiLog[v][2]>0.9*wert?"+":"")+moneyFormatInt(farmiLog[v][2]-0.9*wert));
            if(!newFarmiumsatz[farmiLog[v][1]]){ newFarmiumsatz[farmiLog[v][1]]=0; }
            newFarmiumsatz[farmiLog[v][1]] += farmiLog[v][2];
            prev=v;
        }
        if(countFarmisAll>0){ newtd1.innerHTML += "<br>("+c+")"; }
        for(var v in newFarmiumsatz){
            if(!newFarmiumsatz.hasOwnProperty(v)){ continue; }
            newFarmiumsatz[v]=Math.round(100*newFarmiumsatz[v])/100;
            for(var w=0;w<levelLog.length;w++){
                if(levelLog[w][0]==v){ levelLog[w][5]=newFarmiumsatz[v]; break; } //dont override all because data could be joined to monthly
            }
        }
        GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_levelLog",implode(levelLog),70);
        for(var v in totalProducts){
            if(!totalProducts.hasOwnProperty(v)){ continue; }
            totalProducts[v][2]=totalProducts[v][1]/totalProducts[v][0];
        }

        if(countFarmisAll>0){
            newtr=createElement("tr");
            newtable.insertBefore(newtr,newtable.children[1]);
            createElement("td",{},newtr,getText("total")+"<br>("+countFarmisOk+")");
            newtd=createElement("td",{"id":"tdTotalProducts"},newtr);
            function buildTotalProducts(mode){
                $("tdTotalProducts").innerHTML="";
                var newtable=createElement("table",{cellspacing:"0",cellpadding:"0"},$("tdTotalProducts"));
                var newtr=createElement("tr",{},newtable);
                var newtd=createElement("td",{"class":"link hoverBgLightblue","style":"text-align:center;padding-right:3px;border-bottom:1px solid black;"},newtr,getText("product"));
                if (mode==0){
                    newtd.style.backgroundColor="lightblue";
                    totalProducts.sortObj(sortObjFunctions["int"],true);
                }else{
                    newtd.addEventListener("click",function(){buildTotalProducts(0);},false);
                    totalProducts.sortObj(function(mode){return function(a,b){return (a[1][mode-1]-b[1][mode-1]);}}(mode),true);
                }
                newtd=createElement("td",{"class":"link hoverBgLightblue","style":"text-align:center;border-left:1px solid black;border-bottom:1px solid black;padding-left:3px;padding-right:3px;"},newtr,sign_mult);
                if (mode==1){ newtd.style.backgroundColor="lightblue"; }
                else{
                    newtd.addEventListener("click",function(){buildTotalProducts(1);},false);
                }
                newtd=createElement("td",{"class":"link hoverBgLightblue","style":"text-align:center;border-left:1px solid black;border-bottom:1px solid black;padding-left:3px;padding-right:3px;"},newtr,sign_sum);
                if (mode==2){ newtd.style.backgroundColor="lightblue"; }
                else{
                    newtd.addEventListener("click",function(){buildTotalProducts(2);},false);
                }
                newtd=createElement("td",{"class":"link hoverBgLightblue","style":"text-align:center;border-left:1px solid black;border-bottom:1px solid black;padding-left:3px;padding-right:3px;"},newtr,sign_sum+"/"+sign_mult);
                if (mode==3){ newtd.style.backgroundColor="lightblue"; }
                else{
                    newtd.addEventListener("click",function(){buildTotalProducts(3);},false);
                }
                for(var i=0;i<totalProducts.order.length;i++){
                    var v=totalProducts.order[i];
                    //newdiv=createElement("div",{"style":"line-height:16px;"},newtd);
                    newtr=createElement("tr",{"class":"hoverBgCc9"},newtable);
                    newtd=createElement("td",{"style":"padding-right:3px;"},newtr);
                    produktPic(0,v,newtd);
                    createElement("div",{"style":"display:inline-block;"},newtd,prodName[0][v]);
                    createElement("td",{"style":"text-align:right;border-left:1px solid black;padding-left:3px;padding-right:3px;"},newtr,numberFormat(totalProducts[v][0]));
                    createElement("td",{"style":"text-align:right;border-left:1px solid black;padding-left:3px;padding-right:3px;"},newtr,numberFormat(totalProducts[v][1]));
                    createElement("td",{"style":"text-align:right;border-left:1px solid black;padding-left:3px;padding-right:3px;"},newtr,numberFormat(totalProducts[v][2]));
                }
                newtable=null;newtr=null;newtd=null;
            }
            buildTotalProducts(0);
            newtd=createElement("td",{"style":"text-align:right;"},newtr);
                createElement("div",{},newtd,moneyFormatInt(totalPriceOk));
                createElement("div",{},newtd,numberFormat(100*totalPriceOk/totalWertOk,1)+"%");
            newtd=createElement("td",{"style":"text-align:right;"},newtr);
                createElement("div",{"mouseOverText":"100%"},newtd,moneyFormatInt(totalWertOk));
                createElement("div",{"mouseOverText":"90%"},newtd,moneyFormatInt(0.9*totalWertOk));
            newtd=createElement("td",{"style":"text-align:right;"},newtr);
                createElement("div",{"mouseOverText":"100%"},newtd,(totalPriceOk>totalWertOk?"+":"")+moneyFormatInt(totalPriceOk-totalWertOk));
                createElement("div",{"mouseOverText":"90%"},newtd,(totalPriceOk>0.9*totalWertOk?"+":"")+moneyFormatInt(totalPriceOk-0.9*totalWertOk));

            newtr=createElement("tr",{"class":"hoverBgCc9"});
            newtable.insertBefore(newtr,newtable.children[2]);
            newtd=createElement("td",{},newtr);
                createElement("div",{},newtd,sign_average+" ("+countFarmisOk+")");
            newtd=createElement("td",{},newtr,"");
                createElement("div",{},newtd,">"+numberFormat(mode["limit"])+"%");
            newtd=createElement("td",{"style":"text-align:right;"},newtr);
                createElement("div",{},newtd,moneyFormatInt(totalPriceOk/countFarmisOk));
            newtd=createElement("td",{"style":"text-align:right;"},newtr);
                createElement("div",{"mouseOverText":"100%<br>"+sign_average+"[>"+numberFormat(mode["limit"])+"%]"},newtd,moneyFormatInt(totalWertOk/countFarmisOk));
                createElement("div",{"mouseOverText":" 90%<br>"+sign_average+"[>"+numberFormat(mode["limit"])+"%]"},newtd,moneyFormatInt(0.9*totalWertOk/countFarmisOk));
                createElement("div",{"mouseOverText":"100%<br>"+sign_sum+"[>"+numberFormat(mode["limit"])+"%]/"+getText("all"),"style":"border-top:1px solid black;"},newtd,moneyFormatInt(totalWertOk/countFarmisAll));
                createElement("div",{"mouseOverText":" 90%<br>"+sign_sum+"[>"+numberFormat(mode["limit"])+"%]/"+getText("all")},newtd,moneyFormatInt(0.9*totalWertOk/countFarmisAll));
            newtd=createElement("td",{"style":"text-align:right;"},newtr);
                createElement("div",{"mouseOverText":"100%"},newtd,(totalPriceOk>totalWertOk?"+":"")+moneyFormatInt((totalPriceOk-totalWertOk)/countFarmisOk));
                createElement("div",{"mouseOverText":" 90%"},newtd,(totalPriceOk>0.9*totalWertOk?"+":"")+moneyFormatInt((totalPriceOk-0.9*totalWertOk)/countFarmisOk));
                createElement("div",{"mouseOverText":"100%","style":"border-top:1px solid black;"},newtd,(totalPriceOk>totalWertOk?"+":"")+moneyFormatInt((totalPriceOk-totalWertOk)/countFarmisAll));
                createElement("div",{"mouseOverText":" 90%"},newtd,(totalPriceOk>0.9*totalWertOk?"+":"")+moneyFormatInt((totalPriceOk-0.9*totalWertOk)/countFarmisAll));

            newtr=createElement("tr",{"class":"hoverBgCc9"});
            newtable.insertBefore(newtr,newtable.children[3]);
            newtd=createElement("td",{},newtr);
                createElement("div",{},newtd,sign_average+" ("+countFarmisAll+")");
            newtd=createElement("td",{},newtr);
                createElement("div",{},newtd,getText("all"));
            newtd=createElement("td",{"style":"text-align:right;"},newtr);
                createElement("div",{},newtd,moneyFormatInt(totalPrice/countFarmisAll));
            newtd=createElement("td",{"style":"text-align:right;"},newtr);
                createElement("div",{"mouseOverText":"100%"},newtd,moneyFormatInt(totalWert/countFarmisAll));
                createElement("div",{"mouseOverText":"90%"},newtd,moneyFormatInt(0.9*totalWert/countFarmisAll));
            newtd=createElement("td",{"style":"text-align:right;"},newtr);
                createElement("div",{"mouseOverText":"100%"},newtd,(totalPrice>totalWert?"+":"")+moneyFormatInt((totalPrice-totalWert)/countFarmisAll));
                createElement("div",{"mouseOverText":"90%"},newtd,(totalPrice>0.9*totalWert?"+":"")+moneyFormatInt((totalPrice-0.9*totalWert)/countFarmisAll));
        }
        container=null;newdiv=null;newtable=null;newtr=null;newtd=null;
    }catch(err){GM_logError("buildInfoPanelFarmies\n"+err);}
}
function buildInfoPanelFormulas(mode){
    try{
        // unsafeWindow.formulas[0][id]:
        // 0: id
        // 1: needed level
        // 2: name
        // 3: ingredients [[id,amount],[id,amount],[id,amount]]
        // 4: baking time in sek
        // 5: gain [0|[prod,amount],0|[prod,+val,time in sek],0|[prod,+pts,time in sek]]
        // 6: price money
        // 7: price coins
        // 8: points for baking
        // 9: [0,1,2,3,4,5,6]
        //10: ?
        //endremain: time to end
        //end: date until recipe is buyable 
        var modeDefault={"showAll":false,"filterType":"0,1,2,"};
        var modeOld=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeInfoPanelFormulas"),"buildInfoPanelFormulas/modeOld");
        if(typeof modeOld!="object"){ modeOld=modeDefault; }
        if(typeof mode!="object"){ mode=modeOld; }
        for(var v in modeDefault){
            if(!modeDefault.hasOwnProperty(v)){ continue; }
            if(mode[v]==undefined){ mode[v]=(modeOld[v]==undefined?modeDefault[v]:modeOld[v]); }
        }
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeInfoPanelFormulas",implode(mode,"buildInfoPanelFormulas/mode"));  
        var container=$("infoPanelInner");
        container.innerHTML="";
        var newdiv,newdiv1,newtable,newtr,newtd,newtd1,newinput;
        newdiv=createElement("div",{"class":"borderBottom1Black","style":"height:50px;"},container);
        newtable=createElement("table",{"style":"width:100%;","border":0,"cellspacing":0},newdiv);
        newtr=createElement("tr",{},newtable);
        createElement("td",{"class":"tnormal","style":"font-weight:bold;text-align:center;"},newtr,getText("recipes"));
        newtd=createElement("td",{},newtr);
        newinput=createElement("input",{"type":"checkbox","class":"link","checked":mode["showAll"]},newtd);
        newinput.addEventListener("click",function(){
            buildInfoPanelFormulas({"showAll":this.checked});
        },false);
        createElement("span",{"style":"margin-right:10px;"},newtd,getText("showAll"));
        newtd=createElement("td",{"align":"right"},newtr);
        newtd.addEventListener("click",function(filterType){
        return function(event){
            var thisFilter=event.target.getAttribute("filter");
            if(thisFilter){
                if(!event.ctrlKey){
                    filterType=thisFilter;
                }else if(filterType.search(thisFilter)!=-1){
                    filterType.replace(thisFilter,"")
                }else{
                    filterType+=thisFilter;
                }
                buildInfoPanelFormulas({"filterType":filterType});
            }
        }}(mode["filterType"]),false);
        newtd.addEventListener("mouseover",function(event){
            var mouseOverText=event.target.getAttribute("mouseOverText");
            if(mouseOverText){
                mouseOverText='<div>'+getText("click")+'&nbsp;/&nbsp;'+getText("clickCtrl")+'</div><div>'+mouseOverText+'</div>';
                toolTip.show(event,mouseOverText);
            }
        },false);       
        for(var v=0;v<=2;v++){
            createElement("div",{"class":"link category_r"+v+(mode["filterType"].search(v+",")!=-1?"_active":""),"filter":v+",","style":"display:inline-block;","mouseOverText":getText("category_r"+v)},newtd);
        }
    
        newdiv=createElement("div",{"style":"height:465px;width:100%;overflow:auto;"},container);
        newtable=createElement("table",{"style":"line-height:16px;width:100%","border":"1","cellspacing":0},newdiv);
        var thead=createElement("thead",{},newtable); // sortable table
        var newtbody=createElement("tbody",{},newtable);
    
        newtr=createElement("tr",{"class":"borderBottom2"},thead);
        createElement("th",{"sortdir":"Asc","class":"link"},newtr,getText("nr"));
        createElement("th",{"sortdir":"Asc","class":"link"},newtr,getText("lvl"));
        createElement("th",{"sortdir":"Asc","class":"link"},newtr,getText("title"));
        createElement("th",{"sortdir":"Asc","class":"link"},newtr,getText("ingredients"));
        createElement("th",{"sortdir":"Asc","class":"link"},newtr,getText("time"));
        createElement("th",{"sortdir":"Asc","class":"link"},newtr,getText("gain"));
        createElement("th",{"sortdir":"Asc","class":"link"},newtr,getText("price"));
        new SortableTable(newtr);
    
        for(var v in unsafeWindow.formulas[0]){
            if(!unsafeWindow.formulas[0].hasOwnProperty(v)){ continue; }
            if(mode["showAll"]||((USERLEVEL>=unsafeWindow.formulas[0][v][1])&&(unsafeWindow.formulas[0][v]["endremain"]>=0))){
                if(((mode["filterType"].search("0,")!=-1)&&(unsafeWindow.formulas[0][v][5][0]!=0))||((mode["filterType"].search("1,")!=-1)&&(unsafeWindow.formulas[0][v][5][1]!=0))||((mode["filterType"].search("2,")!=-1)&&(unsafeWindow.formulas[0][v][5][2]!=0))){
                    newtr=createElement("tr",{"class":"hoverBgCc9"},newtbody);
                    createElement("td",{"value":unsafeWindow.formulas[0][v][0],"style":(unsafeWindow.formulas[0][v]["endremain"]>=0?"":"background-color:red;")},newtr,unsafeWindow.formulas[0][v][0]);
                    createElement("td",{"value":unsafeWindow.formulas[0][v][1],"style":(USERLEVEL>=unsafeWindow.formulas[0][v][1]?"":"background-color:red;")},newtr,unsafeWindow.formulas[0][v][1]);
                    // Title
                    newtd1=createElement("td",{},newtr,unsafeWindow.formulas[0][v][2]);
                    // Ingredients
                    newtd=createElement("td",{},newtr);
                    var sum1=0;
                    var sumPts=0;
                    var preis=0;
                    for(var w=0;w<unsafeWindow.formulas[0][v][3].length;w++){
                        preis=!isNaN(NPC[0][unsafeWindow.formulas[0][v][3][w][0]])?Math.min(NPC[0][unsafeWindow.formulas[0][v][3][w][0]],gut[unsafeWindow.formulas[0][v][3][w][0]]):gut[unsafeWindow.formulas[0][v][3][w][0]];
                        sum1 += unsafeWindow.formulas[0][v][3][w][1]*preis;
                        newdiv=createElement("div",{"class":"link hoverBgLightblue","prod":unsafeWindow.formulas[0][v][3][w][0],"value":preis*unsafeWindow.formulas[0][v][3][w][1]},newtd);
                        newdiv.addEventListener("mouseover",function(event){showGoToMarketToolTip(event,this.getAttribute("prod"),null,'<tr><td>'+sign_sum+'</td><td style="text-align:right;">'+moneyFormatInt(parseInt(this.getAttribute("value"),10))+'</td></tr>');},false);
                        newdiv.addEventListener("click",function(){showMarket(this.getAttribute("prod"));},false);
                        produktPic(0,unsafeWindow.formulas[0][v][3][w][0],newdiv);
                        newdiv=createElement("span",{},newdiv,numberFormat(unsafeWindow.formulas[0][v][3][w][1]));
                    }
                    newtd.setAttribute("value",sum1);
                    createElement("div",{},newtd,"("+moneyFormatInt(sum1)+")");
                    var sum=-sum1;
                    // Time
                    createElement("td",{"value":unsafeWindow.formulas[0][v][4]},newtr,getTimeStr(unsafeWindow.formulas[0][v][4],1)+getText("shortHours"));
                    // Gain
                    newtd=createElement("td",{"style":"width:80px;"},newtr);
                    if(unsafeWindow.formulas[0][v][5][0]!=0){
                        // Products
                        preis=!isNaN(NPC[0][unsafeWindow.formulas[0][v][5][0][0]])?Math.min(NPC[0][unsafeWindow.formulas[0][v][5][0][0]],gut[unsafeWindow.formulas[0][v][5][0][0]]):gut[unsafeWindow.formulas[0][v][5][0][0]];
                        sum1=unsafeWindow.formulas[0][v][5][0][1]*preis;
                        sum += sum1;
                        newdiv=createElement("div",{"class":"link hoverBgLightblue","prod":unsafeWindow.formulas[0][v][5][0][0],"value":sum1},newtd);
                        newdiv.addEventListener("mouseover",function(event){showGoToMarketToolTip(event,this.getAttribute("prod"));},false);
                        newdiv.addEventListener("click",function(){showMarket(this.getAttribute("prod"));},false);
                        produktPic(0,unsafeWindow.formulas[0][v][5][0][0],newdiv);
                        createElement("span",{},newdiv,unsafeWindow.formulas[0][v][5][0][1]);
                        createElement("div",{},newtd,"("+moneyFormatInt(sum1)+")");
                    }else if(unsafeWindow.formulas[0][v][5][1]!=0){
                        // Crop amount boost
                        createElement("div",{},newtd,getTimeStr(unsafeWindow.formulas[0][v][5][1][2],1)+getText("shortHours"));
                        newdiv=createElement("div",{"class":"link hoverBgLightblue","prod":unsafeWindow.formulas[0][v][5][1][0],"style":"white-space:nowrap;"},newtd);
                        newdiv.addEventListener("mouseover",function(event){showGoToMarketToolTip(event,this.getAttribute("prod"));},false);
                        newdiv.addEventListener("click",function(){showMarket(this.getAttribute("prod"));},false);
                        produktPic(0,unsafeWindow.formulas[0][v][5][1][0],newdiv);
                        createElement("span",{},newdiv,"+"+unsafeWindow.formulas[0][v][5][1][1]+"val&nbsp;(+"+numberFormat(100*unsafeWindow.formulas[0][v][5][1][1]/(prodYield[0][unsafeWindow.formulas[0][v][5][1][0]]-1))+"%)");
                        preis=!isNaN(NPC[0][unsafeWindow.formulas[0][v][5][1][0]])?Math.min(NPC[0][unsafeWindow.formulas[0][v][5][1][0]],gut[unsafeWindow.formulas[0][v][5][1][0]]):gut[unsafeWindow.formulas[0][v][5][1][0]];
                        sum1=0;
                        for(var i=0;i<ALL_ZONES["farm"].length;i++){
                            if((zones.getBuilding(ALL_ZONES["farm"][i])==1)&&(!zones.getBlock(ALL_ZONES["farm"][i]))){
                                sum1 += preis*unsafeWindow.formulas[0][v][5][1][1]*Math.ceil(calcGrowTimes(60*prodGrowTime[0][unsafeWindow.formulas[0][v][5][1][0]],unsafeWindow.formulas[0][v][5][1][2],1-(zones.getBonus(ALL_ZONES["farm"][i])/100)))*BUILDING_SIZE["1"]/prodPlantSize[0][unsafeWindow.formulas[0][v][5][1][0]];
                            }
                        }
                        sum += sum1;
                        createElement("div",{},newtd,"("+moneyFormatInt(sum1)+")");
                        newtd.setAttribute("value",sum1);
                    }else if(unsafeWindow.formulas[0][v][5][2]!=0){
                        // Crop points boost
                        createElement("div",{},newtd,getTimeStr(unsafeWindow.formulas[0][v][5][2][2],1)+getText("shortHours"));
                        newdiv=createElement("div",{"class":"link hoverBgLightblue","prod":unsafeWindow.formulas[0][v][5][2][0],"style":"white-space:nowrap;"},newtd);
                        newdiv.addEventListener("mouseover",function(event){showGoToMarketToolTip(event,this.getAttribute("prod"));},false);
                        newdiv.addEventListener("click",function(){showMarket(this.getAttribute("prod"));},false);
                        produktPic(0,unsafeWindow.formulas[0][v][5][2][0],newdiv);
                        createElement("span",{},newdiv,"+");
                        pointsFormat(unsafeWindow.formulas[0][v][5][2][1],"span",newdiv);
                        createElement("span",{},newdiv,"&nbsp;(+"+numberFormat(100*unsafeWindow.formulas[0][v][5][2][1]/prodPoints[0][unsafeWindow.formulas[0][v][5][2][0]])+"%)");
                        sum1=0;
                        for(var i=0;i<ALL_ZONES["farm"].length;i++){
                            if((zones.getBuilding(ALL_ZONES["farm"][i])==1)&&(!zones.getBlock(ALL_ZONES["farm"][i]))){
                                sum1 += unsafeWindow.formulas[0][v][5][2][1]*Math.ceil(calcGrowTimes(60*prodGrowTime[0][unsafeWindow.formulas[0][v][5][2][0]],unsafeWindow.formulas[0][v][5][2][2],1-(zones.getBonus(ALL_ZONES["farm"][i])/100)))*BUILDING_SIZE["1"]/prodPlantSize[0][unsafeWindow.formulas[0][v][5][2][0]];
                            }
                        }
                        sumPts=sum1;
                        newdiv=createElement("div",{},newtd);
                        createElement("span",{},newdiv,"(");
                        pointsFormat(sum1,"span",newdiv);
                        createElement("span",{},newdiv,")");
                        newtd.setAttribute("value",0);
                    }
                    pointsFormat(unsafeWindow.formulas[0][v][8],"div",newtd);
                    sumPts += unsafeWindow.formulas[0][v][8];
                    // Price
                    newtd=createElement("td",{},newtr);
                    if(unsafeWindow.formulas[0][v][6]>0){
                        sum1=unsafeWindow.formulas[0][v][6];
                        sum -= sum1;
                        newspan=createElement("div",{},newtd,moneyFormatInt(sum1));
                        newtd.setAttribute("value",sum1);
                    }
                    if(unsafeWindow.formulas[0][v][7]>0){
                        sum1=unsafeWindow.formulas[0][v][7]*gut[0];
                        sum -= sum1;
                        newspan=createElement("div",{"class":"link hoverBgLightblue"},newtd,coinsFormat(unsafeWindow.formulas[0][v][7],createElement("div")).parentNode.innerHTML);
                        newspan.addEventListener("mouseover",function(event){showGoToMarketToolTip(event,"0");},false);
                        newspan.addEventListener("click",function(){showMarket("0");},false);
                        createElement("div",{"style":"clear:both;"},newtd,"("+moneyFormatInt(sum1)+")");
                        newtd.setAttribute("value",sum1);
                    }
                    //createElement("td",{},newtr,unsafeWindow.formulas[0][v][8]);
                    //createElement("td",{},newtr,unsafeWindow.formulas[0][v][9]);
                    // Title
                    createElement("div",{},newtd1,moneyFormatInt(sum));
                    newtd1.setAttribute("value",sum);
                    pointsFormat(sumPts,"div",newtd1);
                }
            }
        }
        container=null;
        newtable=null;thead=null;newtbody=null;newtr=null;newtd=null;newtd1=null;newdiv=null;newinput=null;
    }catch(err){GM_logError("buildInfoPanelFormulas\n"+err);}
}
unsafeWindow.buildInfoPanelMenu=function(mode){
    try{
        var container,newdiv,newdiv1;
        container=$("infoPanelInner");
        container.innerHTML="";
        newdiv=createElement("div",{"id":"infoPanelL","style":"position:absolute;left:0;width:105px;overflow:auto;height:515px;border-right:2px solid #685338;padding-right:5px;"},container);
        newdiv1=createElement("div",{"style":"padding-top:5px;border-bottom:1px solid #685338;font-weight:bold;float:left;width:100%;"},newdiv,getText("adviser"));
        newdiv1.addEventListener("mouseover",function(event){
            toolTip.show(event,getText("showChangelog")); 
        },false);
        newdiv1.classList.add("link");
        newdiv1.addEventListener("click",function(event){
            unsafeWindow.buildInfoPanel("changelog");
        },false);
        if(USERNAME){
            newdiv1=createElement("div",{"id":"infoPanelNaviOptions","class":"link naviItem","style":"margin-top:5px;width:95px;"},newdiv,getText("options"));
            newdiv1.addEventListener("click",function(event){ unsafeWindow.buildInfoPanelMenu("options"); },false);
        }else{
            createElement("div",{"id":"infoPanelNaviOptions","class":"naviItemInactive","style":"margin-top:5px;width:95px;"},newdiv,getText("options"));
        }
        newdiv1=createElement("div",{"id":"infoPanelNaviAccounts","class":"link naviItem","style":"margin-top:5px;width:95px;"},newdiv,getText("accounts"));
        newdiv1.addEventListener("click",function(event){ unsafeWindow.buildInfoPanelMenu("accounts"); },false);
        newdiv1=createElement("div",{"id":"infoPanelNaviHotkeys","class":"link naviItem","style":"margin-top:5px;width:95px;"},newdiv,getText("hotkeys"));
        newdiv1.addEventListener("click",function(event){ unsafeWindow.buildInfoPanelMenu("hotkeys"); },false);
        if(USERNAME){
            newdiv1=createElement("div",{"id":"infoPanelNaviCss","class":"link naviItem","style":"margin-top:5px;width:95px;"},newdiv,"CSS");
            newdiv1.addEventListener("click",function(event){ unsafeWindow.buildInfoPanelMenu("css"); },false);
            newdiv1=createElement("div",{"id":"infoPanelNaviImport","class":"link naviItem","style":"margin-top:5px;width:95px;"},newdiv,"Import/Export");
            newdiv1.addEventListener("click",function(event){ unsafeWindow.buildInfoPanelMenu("import"); },false);
        }else{
            createElement("div",{"id":"infoPanelNaviCss","class":"naviItemInactive","style":"margin-top:5px;width:95px;"},newdiv,"CSS");
            createElement("div",{"id":"infoPanelNaviImport","class":"naviItemInactive","style":"margin-top:5px;width:95px;"},newdiv,"Import/Export");
        }
        createElement("div",{"id":"infoPanelR","style":"position:absolute;left:115px;width:480px;overflow:auto;height:515px;"},container);
        // paypal
        newdiv=createElement("div",{"style":"position:absolute;left:0;bottom:0;"},container);
        newdiv1=createElement("form",{"id":"paypalForm","target":"_blank","action":"https://www.paypal.com/cgi-bin/webscr","method":"post"},newdiv);
        createElement("input",{"type":"hidden","name":"cmd","value":"_donations"},newdiv1);
        createElement("input",{"type":"hidden","name":"business","value":"jessicakanaan@web.de"},newdiv1);
        createElement("input",{"type":"hidden","name":"lc","value":((LANGUAGE=="de")?"DE":"US")},newdiv1);
        createElement("input",{"type":"hidden","name":"item_name","value":"MyFreeFarm Script"},newdiv1);
        createElement("input",{"type":"hidden","name":"no_note","value":"0"},newdiv1);
        createElement("input",{"type":"hidden","name":"currency_code","value":"EUR"},newdiv1);
        createElement("input",{"type":"hidden","name":"bn","value":"PP-DonationsBF:btn_donate_LG.gif:NonHostedGuest"},newdiv1);
        createElement("input",{"type":"image","style":"border:none;background:transparent;","src":"https://www.paypalobjects.com/"+((LANGUAGE=="de")?"de_DE/DE":"en_US")+"/i/btn/btn_donate_LG.gif","name":"submit","alt":"PayPal"},newdiv1);
        createElement("img",{"alt":"","border":"0","src":"https://www.paypalobjects.com/en_US/i/scr/pixel.gif","width":"1","height":"1"},newdiv1);
        // call automat
        if(unsafeWindow.buildInfoPanelAutomatMenu){ unsafeWindow.buildInfoPanelAutomatMenu(mode); }
        // switch call
        switch(mode){
        case "options": buildInfoPanelOptions(); break;
        case "accounts": buildInfoPanelAccounts(false); break;
        case "hotkeys": buildInfoPanelHotkeys(); break;
        case "css": buildInfoPanelCss(); break;
        case "import": buildInfoPanelImport(); break;
        }
        container=null;newdiv=null;newdiv1=null;
    }catch(err){GM_logError("buildInfoPanelMenu\n"+err);}
}
function buildInfoPanelOptions(){
    try{
        var container,newdiv,newtable,newtr,newtd,newtr,newtd1,newinput;
        newdiv=$("infoPanelNaviOptions");
        newdiv.classList.remove("naviItem");
        newdiv.classList.add("naviItemActive");
        container=$("infoPanelR");
        newtable=createElement("table",{"style":"width:100%;","border":"1","class":"hoverRowBgCc9"},container);
        newtr=createElement("tr",{},newtable);
        newtd=createElement("th",{"colspan":"3"},newtr,getText("farm"));
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"type":"checkbox","class":"link","checked":valAutoWater["farm"]},newtd);
        newinput.addEventListener("click",function(){
            valAutoWater["farm"]=this.checked;
            unsafeData.valAutoWater=valAutoWater;
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valAutoWater",implode(valAutoWater),9);
        },false);
        createElement("td",{},newtr,getText("settings_valAutoWater")[0]);
        createElement("td",{},newtr,getText("settings_valAutoWater")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"type":"checkbox","class":"link","checked":valAutoCrop["farm"]},newtd);
        newinput.addEventListener("click",function(){
            valAutoCrop["farm"]=this.checked;
            unsafeData.valAutoCrop=valAutoCrop;
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valAutoCrop",implode(valAutoCrop),11);
        },false);
        createElement("td",{},newtr,getText("settings_valAutoCrop")[0]);
        createElement("td",{},newtr,getText("settings_valAutoCrop")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"type":"checkbox","class":"link","checked":valAssumeWater["farm"]},newtd);
        newinput.addEventListener("click",function(){
            valAssumeWater["farm"]=this.checked;
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valAssumeWater",implode(valAssumeWater),10);
        },false);
        createElement("td",{},newtr,getText("settings_valAssumeWater")[0]);
        createElement("td",{},newtr,getText("settings_valAssumeWater")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"type":"checkbox","class":"link","checked":valWaterNeeded["farm"]},newtd);
        newinput.addEventListener("click",function(){
            valWaterNeeded["farm"]=this.checked;
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valWaterNeeded",implode(valWaterNeeded),12);
        },false);
        createElement("td",{},newtr,getText("settings_valWaterNeeded")[0]);
        createElement("td",{},newtr,getText("settings_valWaterNeeded")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalErnteMsg","type":"checkbox","class":"link","checked":valErnteMsg},newtd);
        newinput.addEventListener("click",function(){
            valErnteMsg=this.checked;
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valErnteMsg", valErnteMsg,13);
        },false);
        createElement("td",{},newtr,getText("settings_valCropMsg")[0]);
        createElement("td",{},newtr,getText("settings_valCropMsg")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"value":valLimitEmptyFields["1"],"class":"text","maxlength":"2","size":"2px","style":"background-color:transparent;text-align:center;"},newtd);
        newinput.addEventListener("focus",function(){this.style.backgroundColor="lightblue";},false);
        newinput.addEventListener("blur",function(){this.style.backgroundColor="transparent";},false);
        newinput.addEventListener("keyup",function(){
            var help=parseInt(this.value,10);
            if(isNaN(help)||(help<0)){
                this.value="";
            }else{
                this.value=help;
                valLimitEmptyFields["1"]=help;
                GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valLimitEmptyFields",implode(valLimitEmptyFields),14);
                for(var v=0;v<ALL_ZONES["farm"].length;v++){ 
                    if(zones.getBuilding(ALL_ZONES["farm"][v])==1){
                        zones.processProduction(ALL_ZONES["farm"][v]); 
                    }
                }
            }
        },false);
        createElement("td",{},newtr,getText("settings_valLimitEmptyFields")[0]);
        createElement("td",{},newtr,getText("settings_valLimitEmptyFields")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"type":"checkbox","class":"link","checked":valGlobaltimeShowCroppedZone["farm"]},newtd);
        newinput.addEventListener("click",function(){
            valGlobaltimeShowCroppedZone["farm"]=this.checked;
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valGlobaltimeShowCroppedZone",implode(valGlobaltimeShowCroppedZone),16);
        },false);
        createElement("td",{},newtr,getText("settings_valGlobaltimeShowCroppedZone")[0]);
        createElement("td",{},newtr,getText("settings_valGlobaltimeShowCroppedZone")[1]);
        
        newtr=createElement("tr",{},newtable);
        createElement("td",{"align":"center"},newtr);
        createElement("td",{},newtr,getText("settings_valMoveAnimals")[0]);
        newtd=createElement("td",{},newtr,getText("settings_valMoveAnimals")[1]);
        for(var v=0;v<ANIMAL_MOVE.length;v++){ if(ANIMAL_MOVE[v]){
            newspan=createElement("span",{"style":"display:inline-block;margin-right:15px;"},newtd);
            produktPic(0,BUILDING2PRODUCT[v][0],newspan);
            newinput=createElement("input",{"id":"inputvalMoveAnimals"+v,"type":"checkbox","class":"link","checked":valMoveAnimals[v]},newspan);
            newinput.addEventListener("click",function(){
                valMoveAnimals[this.id.replace("inputvalMoveAnimals","")]=this.checked;
                GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valMoveAnimals", implode(valMoveAnimals),15);
            },false);
        }}
        
        // ***********************************************************************
        newtr=createElement("tr",{},newtable);
        newtd=createElement("th",{"colspan":"3"},newtr,getText("farmis"));
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newdiv=createElement("div",{"style":"white-space:nowrap;"},newtd);
        newinput=createElement("input",{"id":"inputvalFarmiLimits0","value":valFarmiLimits[0],"class":"text","maxlength":"3","size":"3px","style":"background-color:transparent;text-align:center;"},newdiv);
        newinput.addEventListener("focus",function(){this.style.backgroundColor="lightblue";},false);
        newinput.addEventListener("blur",function(){this.style.backgroundColor="transparent";},false);
        newinput.addEventListener("change",function(){
            var help=parseInt(this.value,10);
            if (isNaN(help)){
                this.value="";
            }else{
                help=Math.max(0,Math.min(999,Math.min(help,valFarmiLimits[1])));
                valFarmiLimits[0]=help;
                doFarmis();
                this.value=help;
                GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valFarmiLimits", implode(valFarmiLimits),19);
                unsafeData.valFarmiLimits=valFarmiLimits.clone();
            }
        },false);
        createElement("span",{},newdiv,"%");
        newdiv=createElement("div",{"style":"white-space:nowrap;"},newtd);
        newinput=createElement("input",{"id":"inputvalFarmiLimits1","value":valFarmiLimits[1],"class":"text","maxlength":"3","size":"3px","style":"background-color:transparent;text-align:center;"},newdiv);
        newinput.addEventListener("focus",function(){this.style.backgroundColor="lightblue";},false);
        newinput.addEventListener("blur",function(){this.style.backgroundColor="transparent";},false);
        newinput.addEventListener("change",function(){
            var help=parseInt(this.value,10);
            if (isNaN(help)){
                this.value="";
            }else{
                help=Math.max(0,Math.min(999,Math.max(help,valFarmiLimits[0])));
                valFarmiLimits[1]=help;
                doFarmis();
                this.value=help;
                GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valFarmiLimits", implode(valFarmiLimits),20);
                unsafeData.valFarmiLimits=valFarmiLimits.clone();
            }
        },false);
        createElement("span",{},newdiv,"%");
        createElement("td",{},newtr,getText("settings_valFarmiLimits")[0]);
        createElement("td",{},newtr,getText("settings_valFarmiLimits")[1]+" ("+getText("default")+":&nbsp;90,100)");
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalFarmiMiniInfo","type":"checkbox","class":"link","checked":valFarmiMiniInfo},newtd);
        newinput.addEventListener("click",function(){
            valFarmiMiniInfo=this.checked;
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valFarmiMiniInfo", valFarmiMiniInfo,21);
            doFarmis();
        },false);
        createElement("td",{},newtr,getText("settings_valFarmiMiniInfo")[0]);
        createElement("td",{},newtr,getText("settings_valFarmiMiniInfo")[1]);
    
        // ***********************************************************************
        newtr=createElement("tr",{},newtable);
        newtd=createElement("th",{"colspan":"3"},newtr,getText("farmersmarket"));

        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"value":valLimitEmptyFields["fl1"],"class":"text","maxlength":"2","size":"2px","style":"background-color:transparent;text-align:center;"},newtd);
        newinput.addEventListener("focus",function(){this.style.backgroundColor="lightblue";},false);
        newinput.addEventListener("blur",function(){this.style.backgroundColor="transparent";},false);
        newinput.addEventListener("keyup",function(){
            var help=parseInt(this.value,10);
            if(isNaN(help)||(help<0)){
                this.value="";
            }else{
                this.value=help;
                valLimitEmptyFields["fl1"]=help;
                GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valLimitEmptyFields",implode(valLimitEmptyFields),14);
                zones.processProduction("farmersmarket-1"); 
            }
        },false);
        createElement("td",{},newtr,getText("settings_valLimitEmptyFields")[0]);
        createElement("td",{},newtr,getText("settings_valLimitEmptyFields")[1]);        
        
        newtd1=null;
        for(var j=0;j<ALL_ZONES["farmersmarket"].length;j++){
            zoneNrF=ALL_ZONES["farmersmarket"][j];
            if(zones.isProductional(zoneNrF)){
                newtr=createElement("tr",{},newtable);
                newtd=createElement("td",{"align":"center"},newtr);
                newinput=createElement("input",{"zoneNrF":zoneNrF,"type":"checkbox","class":"link","checked":zoneAddToGlobalTime[zoneNrF]},newtd);
                if(zones.getBlock(zoneNrF)){ newinput.disabled=true; }
                newinput.addEventListener("click",function(){
                    var zoneNrF=this.getAttribute("zoneNrF");
                    zoneAddToGlobalTime[zoneNrF]=this.checked;
                    unsafeData.zoneAddToGlobalTime=zoneAddToGlobalTime[zoneNrF];
                    GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valGlobalTimeAdd", implode(zoneAddToGlobalTime));
                    zones.processProduction(zoneNrF);
                },false);
                newtd=createElement("td",{},newtr);
                if(zones.getBlock(zoneNrF)){ newtd.style.opacity="0.6"; }
                createElement("span",{},newtd,zones.getBuildingName(zoneNrF));
                if(newtd1==null){
                    newtd1=createElement("td",{"rowspan":1},newtr,getText("settings_valzoneAddToGlobalTime")[1]);
                }else{
                    newtd1.rowSpan++;
                }
            }
        }
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"type":"checkbox","class":"link","checked":valGlobaltimeShowCroppedZone["farmersmarket"]},newtd);
        newinput.addEventListener("click",function(){
            valGlobaltimeShowCroppedZone["farmersmarket"]=this.checked;
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valGlobaltimeShowCroppedZone",implode(valGlobaltimeShowCroppedZone),16);
        },false);
        createElement("td",{},newtr,getText("settings_valGlobaltimeShowCroppedZone")[0]);
        createElement("td",{},newtr,getText("settings_valGlobaltimeShowCroppedZone")[1]);
        
        // ***********************************************************************
        newtr=createElement("tr",{},newtable);
        newtd=createElement("th",{"colspan":"3"},newtr,getText("windmill"));

        newtd1=null;
        for(var j=0;j<ALL_ZONES["city"].length;j++){
            zoneNrF=ALL_ZONES["city"][j];
            if(zones.isProductional(zoneNrF)){
                newtr=createElement("tr",{},newtable);
                newtd=createElement("td",{"align":"center"},newtr);
                newinput=createElement("input",{"zoneNrF":zoneNrF,"type":"checkbox","class":"link","checked":zoneAddToGlobalTime[zoneNrF]},newtd);
                if(zones.getBlock(zoneNrF)){ newinput.disabled=true; }
                newinput.addEventListener("click",function(){
                    var zoneNrF=this.getAttribute("zoneNrF");
                    zoneAddToGlobalTime[zoneNrF]=this.checked;
                    unsafeData.zoneAddToGlobalTime=zoneAddToGlobalTime[zoneNrF];
                    GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valGlobalTimeAdd", implode(zoneAddToGlobalTime));
                    zones.processProduction(zoneNrF);
                },false);
                newtd=createElement("td",{},newtr);
                if(zones.getBlock(zoneNrF)){ newtd.style.opacity="0.6"; }
                createElement("span",{},newtd,zones.getBuildingName(zoneNrF));
                if(newtd1==null){
                    newtd1=createElement("td",{"rowspan":1},newtr,getText("settings_valzoneAddToGlobalTime")[1]);
                }else{
                    newtd1.rowSpan++;
                }
            }
        }

        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"type":"checkbox","class":"link","checked":valGlobaltimeShowCroppedZone["windmill"]},newtd);
        newinput.addEventListener("click",function(){
            valGlobaltimeShowCroppedZone["windmill"]=this.checked;
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valGlobaltimeShowCroppedZone",implode(valGlobaltimeShowCroppedZone),16);
        },false);
        createElement("td",{},newtr,getText("settings_valGlobaltimeShowCroppedZone")[0]);
        createElement("td",{},newtr,getText("settings_valGlobaltimeShowCroppedZone")[1]);
        
        // ***********************************************************************
        newtr=createElement("tr",{},newtable);
        newtd=createElement("th",{"colspan":"3"},newtr,getText("forestry"));
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        var newinput=createElement("input",{"id":"inputvalGiess","type":"checkbox","class":"link","checked":valAutoWater["forestry"]},newtd);
        newinput.addEventListener("click",function(){
            valAutoWater["forestry"]=this.checked;
            unsafeData.valAutoWater=valAutoWater;
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valAutoWater",implode(valAutoWater),9);
        },false);
        createElement("td",{},newtr,getText("settings_valAutoWater")[0]);
        createElement("td",{},newtr,getText("settings_valAutoWater")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"type":"checkbox","class":"link","checked":valAutoCrop["forestry"]},newtd);
        newinput.addEventListener("click",function(){
            valAutoCrop["forestry"]=this.checked;
            unsafeData.valAutoCrop=valAutoCrop;
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valAutoCrop",implode(valAutoCrop),11);
        },false);
        createElement("td",{},newtr,getText("settings_valAutoCrop")[0]);
        createElement("td",{},newtr,getText("settings_valAutoCrop")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"type":"checkbox","class":"link","checked":valAssumeWater["forestry"]},newtd);
        newinput.addEventListener("click",function(){
            valAssumeWater["forestry"]=this.checked;
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valAssumeWater",implode(valAssumeWater),10);
        },false);
        createElement("td",{},newtr,getText("settings_valAssumeWater")[0]);
        createElement("td",{},newtr,getText("settings_valAssumeWater")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"type":"checkbox","class":"link","checked":valWaterNeeded["forestry"]},newtd);
        newinput.addEventListener("click",function(){
            valWaterNeeded["forestry"]=this.checked;
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valWaterNeeded",implode(valWaterNeeded),12);
        },false);
        createElement("td",{},newtr,getText("settings_valWaterNeeded")[0]);
        createElement("td",{},newtr,getText("settings_valWaterNeeded")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"value":valLimitEmptyFields["forest"],"class":"text","maxlength":"2","size":"2px","style":"background-color:transparent;text-align:center;"},newtd);
        newinput.addEventListener("focus",function(){this.style.backgroundColor="lightblue";},false);
        newinput.addEventListener("blur",function(){this.style.backgroundColor="transparent";},false);
        newinput.addEventListener("keyup",function(){
            var help=parseInt(this.value,10);
            if(isNaN(help)||(help<0)){
                this.value="";
            }else{
                this.value=help;
                valLimitEmptyFields["forest"]=help;
                GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valLimitEmptyFields",implode(valLimitEmptyFields));
                zones.processProduction("forest");
            }
        },false);
        createElement("td",{},newtr,getText("settings_valLimitEmptyFields_forest")[0]);
        createElement("td",{},newtr,getText("settings_valLimitEmptyFields_forest")[1]);
        
        newtd1=null;
        for(var j=0;j<ALL_ZONES["forestry"].length;j++){
            zoneNrF=ALL_ZONES["forestry"][j];
            if(zones.isProductional(zoneNrF)){
                newtr=createElement("tr",{},newtable);
                newtd=createElement("td",{"align":"center"},newtr);
                newinput=createElement("input",{"zoneNrF":zoneNrF,"type":"checkbox","class":"link","checked":zoneAddToGlobalTime[zoneNrF]},newtd);
                if(zones.getBlock(zoneNrF)){ newinput.disabled=true; }
                newinput.addEventListener("click",function(){
                    var zoneNrF=this.getAttribute("zoneNrF");
                    zoneAddToGlobalTime[zoneNrF]=this.checked;
                    unsafeData.zoneAddToGlobalTime=zoneAddToGlobalTime[zoneNrF];
                    GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valGlobalTimeAdd", implode(zoneAddToGlobalTime));
                    zones.processProduction(zoneNrF);
                },false);
                newtd=createElement("td",{},newtr);
                if(zones.getBlock(zoneNrF)){ newtd.style.opacity="0.6"; }
                createElement("span",{},newtd,zones.getBuildingName(zoneNrF));
                if(newtd1==null){
                    newtd1=createElement("td",{"rowspan":1},newtr,getText("settings_valzoneAddToGlobalTime")[1]);
                }else{
                    newtd1.rowSpan++;
                }
            }
        }
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"type":"checkbox","class":"link","checked":valGlobaltimeShowCroppedZone["forestry"]},newtd);
        newinput.addEventListener("click",function(){
            valGlobaltimeShowCroppedZone["forestry"]=this.checked;
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valGlobaltimeShowCroppedZone",implode(valGlobaltimeShowCroppedZone),16);
        },false);
        createElement("td",{},newtr,getText("settings_valGlobaltimeShowCroppedZone")[0]);
        createElement("td",{},newtr,getText("settings_valGlobaltimeShowCroppedZone")[1]);
        
        // **********************************************************************
        newtr=createElement("tr",{},newtable);
        newtd=createElement("th",{"colspan":"3"},newtr,unsafeWindow.foodworld_title);
        
        newtd1=null;
        for(var j=0;j<ALL_ZONES["foodworld"].length;j++){
            zoneNrF=ALL_ZONES["foodworld"][j];
            if(zones.isProductional(zoneNrF)){
                newtr=createElement("tr",{},newtable);
                newtd=createElement("td",{"align":"center"},newtr);
                newinput=createElement("input",{"zoneNrF":zoneNrF,"type":"checkbox","class":"link","checked":zoneAddToGlobalTime[zoneNrF]},newtd);
                if(zones.getBlock(zoneNrF)){ newinput.disabled=true; }
                newinput.addEventListener("click",function(){
                    var zoneNrF=this.getAttribute("zoneNrF");
                    zoneAddToGlobalTime[zoneNrF]=this.checked;
                    unsafeData.zoneAddToGlobalTime=zoneAddToGlobalTime[zoneNrF];
                    GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valGlobalTimeAdd", implode(zoneAddToGlobalTime));
                    zones.processProduction(zoneNrF);
                },false);
                newtd=createElement("td",{},newtr);
                if(zones.getBlock(zoneNrF)){ newtd.style.opacity="0.6"; }
                createElement("span",{},newtd,zones.getBuildingName(zoneNrF));
                if(newtd1==null){
                    newtd1=createElement("td",{"rowspan":1},newtr,getText("settings_valzoneAddToGlobalTime")[1]);
                }else{
                    newtd1.rowSpan++;
                }
            }
        }
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"type":"checkbox","class":"link","checked":valGlobaltimeShowCroppedZone["foodworld"]},newtd);
        newinput.addEventListener("click",function(){
            valGlobaltimeShowCroppedZone["foodworld"]=this.checked;
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valGlobaltimeShowCroppedZone",implode(valGlobaltimeShowCroppedZone),16);
        },false);
        createElement("td",{},newtr,getText("settings_valGlobaltimeShowCroppedZone")[0]);
        createElement("td",{},newtr,getText("settings_valGlobaltimeShowCroppedZone")[1]);
        
        // **********************************************************************
        newtr=createElement("tr",{},newtable);
        newtd=createElement("th",{"colspan":"3"},newtr,getText("minRackamount"));
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalMinRackMan","type":"checkbox","class":"link","checked":valMinRackMan},newtd);
        newinput.addEventListener("click",function(){
            valMinRackMan=this.checked;
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valMinRackMan",valMinRackMan,22);
            var cand=$("infoPanelR").getElementsByClassName("minRackConfig");
            if(valMinRackMan){
                for(var v=0;v<cand.length;v++){
                    cand[v].disabled=true;
                    cand[v].parentNode.parentNode.style.opacity=0.6;
                }
            }else{
                for(var v=0;v<cand.length;v++){
                    cand[v].disabled=false;
                    cand[v].parentNode.parentNode.style.opacity=1;
                }
                calcProdMinRackInit();
            }
            cand=null;
        },false);
        createElement("td",{},newtr,getText("settings_valMinRackMan")[0]);
        newtd=createElement("td",{"class":"link"},newtr,getText("settings_valMinRackMan")[1]);
        newtd.addEventListener("click",function(){
            unsafeWindow.buildInfoPanel("stock",{"page":2});
        },false);
        
        newTd1=null;
        for(var v in valMinRack){
            if(!valMinRack.hasOwnProperty(v)){ continue; }
            newtr=createElement("tr",{},newtable);
            newtd=createElement("td",{"align":"center"},newtr);
            newinput=createElement("input",{"id":"inputvalMinRack_"+v,"class":"text minRackConfig","value":valMinRack[v],"maxlength":"4","size":"5px","style":"background-color:transparent;text-align:center;"},newtd);
            if(valMinRackMan){
                newinput.disabled=true;
                newtr.style.opacity=0.6;
            }
            newinput.addEventListener("focus",function(){this.style.backgroundColor="lightblue";},false);
            newinput.addEventListener("blur",function(){this.style.backgroundColor="transparent";},false);
            newinput.addEventListener("keyup",function(){
                var help=parseInt(this.value,10);
                if (isNaN(help)){
                    this.value="";
                }else{
                    this.value=help;
                    valMinRack[this.id.replace("inputvalMinRack_","")]=help;
                    GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valMinRack",implode(valMinRack,"valMinRack"));
                    calcProdMinRackInit();
                }
            },false);
            createElement("td",{},newtr,getText("category_"+v));
            if(newTd1==null){
                newTd1=createElement("td",{},newtr,getText("settings_valMinRack")[1]);
            } else {
                newTd1.rowSpan++;
            }
        }
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"class":"text minRackConfig","type":"checkbox","checked":valMinRackPlantsize},newtd);
        if(valMinRackMan){
            newinput.disabled=true;
            newtr.style.opacity=0.6;
        }
        newinput.addEventListener("click",function(){
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valMinRackPlantsize",this.checked,24);
            calcProdMinRackInit();
        },false);
        createElement("td",{},newtr,getText("settings_valMinRackPlantsize")[0]);
        createElement("td",{},newtr,getText("settings_valMinRackPlantsize")[1]);
        
        // newtr=createElement("tr",{},newtable);
        // newtd=createElement("th",{"colspan":"3"},newtr,getText("minRackamount"));
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalMinRackGrowing","type":"checkbox","class":"link","checked":valMinRackGrowing},newtd);
        newinput.addEventListener("click",function(){
            valMinRackGrowing=this.checked;
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valMinRackGrowing",valMinRackGrowing,26);
            calcProdMinRack();
        },false);
        createElement("td",{},newtr,getText("settings_valMinRackGrowing")[0]);
        createElement("td",{},newtr,getText("settings_valMinRackGrowing")[1]);
        
        newTd1=null;
        for(var typ in questData){
            if(!questData.hasOwnProperty(typ)){ continue; }
            for(var camp in questData[typ]){
                if(!questData[typ].hasOwnProperty(camp)){ continue; }
                newtr=createElement("tr",{},newtable);
                newtd=createElement("td",{"align":"center"},newtr);
                var newsel = createElement("select",{"id":"selectQuestCalcTo_"+typ+"_"+camp,"style":"width:auto;height:18px;margin-left:5px;"},newtd);
                createElement("option",{"value":-1},newsel,getText("hide"));
                createElement("option",{"value":0},newsel,"--");
                for(var i=questData[typ][camp]["nr"];i<QUESTS[typ][camp].length;i++){
                    createElement("option",{"value":i},newsel,i);
                }
                newsel.addEventListener("change",function(){
                    if(isNaN(this.value)){return false;}
                    var help=this.id.split("_");
                    setCalcToQuest(help[1],help[2],this.value);
                },false);
                newsel.value = questData[typ][camp]["calcTo"];
                newtd=createElement("td",{},newtr,getText(typ=="main"?"farm":typ)+" "+camp);
                if(newTd1==null){
                    newTd1=createElement("td",{},newtr,getText("settings_valMinRackQuest")[1]);
                } else {
                    newTd1.rowSpan++;
                }
            }
        }
        newsel=null;i=null;
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalMinRackRecursive","type":"checkbox","class":"link","checked":valMinRackRecursive},newtd);
        newinput.addEventListener("click",function(){
            valMinRackRecursive=this.checked;
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valMinRackRecursive",valMinRackRecursive,29);
            calcProdMinRack();
        },false);
        createElement("td",{},newtr,getText("settings_valMinRackRecursive")[0]);
        createElement("td",{},newtr,getText("settings_valMinRackRecursive")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalMinRackFarmis","type":"checkbox","class":"link","checked":valMinRackFarmis},newtd);
        newinput.addEventListener("click",function(){
            valMinRackFarmis=this.checked;
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valMinRackFarmis",valMinRackFarmis,30);
            calcProdMinRack();
        },false);
        createElement("td",{},newtr,getText("settings_valMinRackFarmis")[0]);
        createElement("td",{},newtr,getText("settings_valMinRackFarmis")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalMinRackForestryFarmis","type":"checkbox","class":"link","checked":valMinRackForestryFarmis},newtd);
        newinput.addEventListener("click",function(){
            valMinRackForestryFarmis=this.checked;
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valMinRackForestryFarmis",valMinRackForestryFarmis,31);
            calcProdMinRack();
        },false);
        createElement("td",{},newtr,getText("settings_valMinRackForestryFarmis")[0]);
        createElement("td",{},newtr,getText("settings_valMinRackForestryFarmis")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalProtectMinRack","type":"checkbox","class":"link","checked":GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valProtectMinRack",false)},newtd);
        newinput.addEventListener("click",function(){
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valProtectMinRack",this.checked,32);
        },false);
        createElement("td",{},newtr,getText("settings_protectMinRack")[0]);
        createElement("td",{},newtr,getText("settings_protectMinRack")[1]);
        
        // *******************************************************************
        newtr=createElement("tr",{},newtable);
        newtd=createElement("th",{"colspan":"3"},newtr,getText("market"));
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalKauflimit00","value":valKauflimit[0][0],"class":"text","maxlength":"3","size":"2px","style":"background-color:transparent;text-align:center;"},newtd);
        newinput.addEventListener("focus",function(){this.style.backgroundColor="lightblue";},false);
        newinput.addEventListener("blur",function(){this.style.backgroundColor="transparent";},false);
        newinput.addEventListener("keyup",function(){
            var help=parseInt(this.value,10);
            if (isNaN(help)){
                this.value="";
            }else{
                valKauflimit[0][0]=help;
                this.value=valKauflimit[0][0];
                GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valKauflimit",implode(valKauflimit),33);
            }
        },false);
        createElement("span",{},newtd,"%");
        createElement("td",{},newtr,getText("settings_valBuyingLimitDown")[0]);
        newtd=createElement("td",{},newtr,getText("settings_valBuyingLimitDown")[1]);
        newinput=createElement("input",{"id":"inputvalKauflimit01","value":valKauflimit[0][1],"class":"text","maxlength":"6","size":"10px","style":"background-color:#"+valKauflimit[0][1]+";color:#F0FFEF;"},newtd);
        newinput.addEventListener("keyup",function(){
            this.value=this.value.replace(/[^0-9a-f]/ig,"");
            this.style.backgroundColor="#"+this.value;
        },false);
        newinput.addEventListener("change",function(){
            var color=this.value;
            if(!color.match(/^([0-9a-f]{3}){1,2}$/i)){
                color="990000";
                this.value=color;
            }
            this.style.backgroundColor="#"+this.value;
            valKauflimit[0][1]=this.value;
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valKauflimit",implode(valKauflimit),34);
        },false);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalKauflimit1","value":valKauflimit[1],"class":"text","maxlength":"3","size":"2px","style":"background-color:transparent;text-align:center;"},newtd);
        newinput.addEventListener("focus",function(){this.style.backgroundColor="lightblue";},false);
        newinput.addEventListener("blur",function(){this.style.backgroundColor="transparent";},false);
        newinput.addEventListener("keyup",function(){
            var help=parseInt(this.value,10);
            if (isNaN(help)){
                this.value="";
            }else{
                if(help<0){ help*=-1; }
                valKauflimit[1]=help;
                this.value=valKauflimit[1];
                GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valKauflimit",implode(valKauflimit),35);
            }
        },false);
        createElement("span",{},newtd,"%");
        createElement("td",{},newtr,getText("settings_valBuyingLimit")[0]);
        createElement("td",{},newtr,getText("settings_valBuyingLimit")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalKauflimitNPC","type":"checkbox","class":"link","checked":GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valKauflimitNPC",true)},newtd);
        newinput.addEventListener("click",function(){
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valKauflimitNPC",this.checked,36);
        },false);
        createElement("td",{},newtr,getText("settings_valBuyingLimitNPC")[0]);
        createElement("td",{},newtr,getText("settings_valBuyingLimitNPC")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newdiv=createElement("div",{},newtd);
        newinput=createElement("input",{"id":"inputvalVerkaufLimitDown","value":GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valVerkaufLimitDown",95),"class":"text","maxlength":"3","size":"2px","style":"background-color:transparent;text-align:center;"},newdiv);
        newinput.addEventListener("focus",function(){this.style.backgroundColor="lightblue";},false);
        newinput.addEventListener("blur",function(){this.style.backgroundColor="transparent";},false);
        newinput.addEventListener("change",function(){
            var valVerkaufLimitDown=parseInt(this.value,10);
            var valVerkaufLimitUp=parseInt($("inputvalVerkaufLimitUp").value,10);
            valVerkaufLimitDown=Math.min(valVerkaufLimitDown,valVerkaufLimitUp);
            if (isNaN(valVerkaufLimitDown)){
                this.value="";
            }else{
                this.value=valVerkaufLimitDown;
                GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valVerkaufLimitDown", valVerkaufLimitDown,37);
            }
        },false);
        createElement("span",{},newdiv,"%");
        newdiv=createElement("div",{},newtd);
        newinput=createElement("input",{"id":"inputvalVerkaufLimitUp","value":GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valVerkaufLimitUp",130),"class":"text","maxlength":"3","size":"2px","style":"background-color:transparent;text-align:center;"},newdiv);
        newinput.addEventListener("focus",function(){this.style.backgroundColor="lightblue";},false);
        newinput.addEventListener("blur",function(){this.style.backgroundColor="transparent";},false);
        newinput.addEventListener("change",function(){
            var valVerkaufLimitDown=parseInt($("inputvalVerkaufLimitDown").value,10);
            var valVerkaufLimitUp=parseInt(this.value,10);
            valVerkaufLimitUp=Math.max(valVerkaufLimitDown,valVerkaufLimitUp);
            if (isNaN(valVerkaufLimitUp)){
                this.value="";
            }else{
                this.value=valVerkaufLimitUp;
                GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valVerkaufLimitUp", valVerkaufLimitUp,38);
            }
        },false);
        createElement("span",{},newdiv,"%");
        createElement("td",{},newtr,getText("settings_valSellingLimit")[0]);
        createElement("td",{},newtr,getText("settings_valSellingLimit")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalJoinPreise","type":"checkbox","class":"link","checked":GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valJoinPreise",false)},newtd);
        newinput.addEventListener("click",function(){ GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valJoinPreise", this.checked,39); },false);
        createElement("td",{},newtr,getText("settings_valJoinPrices")[0]);
        createElement("td",{},newtr,getText("settings_valJoinPrices")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalQuicklinks","type":"checkbox","class":"link","checked":GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valQuicklinks",true)},newtd);
        newinput.addEventListener("click",function(){GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valQuicklinks", this.checked,40);},false);
        createElement("td",{},newtr,getText("settings_valQuicklinks")[0]);
        createElement("td",{},newtr,getText("settings_valQuicklinks")[1]);
        
        function drawDivHighlightUser(name,color,parent){
            newdiv=createElement("div",{},parent);
            newinput=createElement("input",{"value":name,"class":"text","maxlength":"20","size":"25px","style":"background-color:transparent;"},newdiv);
            newinput.addEventListener("focus",function(){this.style.backgroundColor="lightblue";},false);
            newinput.addEventListener("blur",function(){this.style.backgroundColor="transparent";},false);
            newinput=createElement("input",{"value":color,"class":"text","maxlength":"6","size":"10px","style":"background-color:#"+color+";color:#F0FFEF;"},newdiv);
            newinput.addEventListener("keyup",function(){
                this.value=this.value.replace(/[^0-9a-f]/ig,"");
                this.style.backgroundColor="#"+this.value;
            },false);
            newdiv.addEventListener("change",function(){
                var tableCell=this.parentNode;
                var candinput=tableCell.getElementsByTagName("input");
                var highlightUser=new Object();
                for(var v=0;v<candinput.length;v+=2){
                    var name=candinput[v].value;
                    if(highlightUser[name]){
                        // remove duplicate
                        removeElement(candinput[v].parentNode);
                        v-=2;
                    }else{
                        var color=candinput[v+1].value;
                        if(!color.match(/^([0-9a-f]{3}){1,2}$/i)){
                            color="20b2aa";
                            candinput[v+1].value=color;
                            candinput[v+1].style.backgroundColor="#"+color;
                        }
                        highlightUser[name]=color;
                    }
                }
                if(highlightUser[""]==undefined){
                    drawDivHighlightUser("","20b2aa",tableCell);
                }else{
                    delete highlightUser[""];
                }
                GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_highlight",implode(highlightUser),41);
                candinput=null;tableCell=null;
            },false);
        }
        var highlightUser=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_highlight","{}"),"buildInfoPanel/options/highlightUser",{});
        highlightUser[""]="20b2aa";
        newtr=createElement("tr",{},newtable);
        createElement("td",{"align":"center"},newtr);
        createElement("td",{},newtr,getText("highlightUser"));
        newtd=createElement("td",{},newtr);
        for(var name in highlightUser){
            if(!highlightUser.hasOwnProperty(name)){ continue; }
            drawDivHighlightUser(name,highlightUser[name],newtd);
        }
        
        newtr=createElement("tr",{},newtable);
        createElement("td",{"align":"center"},newtr);
        createElement("td",{},newtr,getText("highlightProducts"));
        newtd=createElement("td",{},newtr);
        newdiv=createElement("div",{},newtd);
        newinput=createElement("input",{"type":"checkbox","class":"link","checked":highlightProducts[0]},newdiv);
        newinput.addEventListener("click",function(){
            highlightProducts[0]=this.checked;
            $("highlightProducts0").disabled=highlightProducts[0];
            $("highlightProducts1").disabled=highlightProducts[0];
            if(highlightProducts[0]){
                // todo calc highlightProducts[1]
                $("highlightProducts0").value=-1;
                $("highlightProducts1").value=-1;
            } else {
                var i=0;
                for(var prod in highlightProducts[1]){
                    if(!highlightProducts[1].hasOwnProperty(prod)){ continue; }
                    if(i>1){continue;}
                    $("highlightProducts"+i).value=prod;
                    i++;
                }
            }
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_highlightProducts",implode(highlightProducts),42);
        },false);
        createElement("span",{},newdiv,getText("useQuestProducts"));
        for(var i=0;i<2;i++){
            newinput=createElement("select",{"id":"highlightProducts"+i,"class":"link2"},newtd);
            createElement("option",{"value":"-1"},newinput,"--");
            for(var v=0;v<prodNameSort[0].length;v++){
                if((!prodBlock[0][prodNameSort[0][v]].match(/t/))&&(!prodBlock[0][prodNameSort[0][v]].match(/l/))){
                    createElement("option",{"value":prodNameSort[0][v]},newinput,prodName[0][prodNameSort[0][v]]);
                }
            }
            if(highlightProducts[0]){
                newinput.disabled=true; 
                newinput.value=-1;
            }
            newinput.addEventListener("change",function(){
                highlightProducts[1]={};
                highlightProducts[1][$("highlightProducts0").value]=true;
                highlightProducts[1][$("highlightProducts1").value]=true;
                GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_highlightProducts",implode(highlightProducts),43);
            },false);
        }
        if(!highlightProducts[0]){
            var i=0;
            for(var prod in highlightProducts[1]){
                if(!highlightProducts[1].hasOwnProperty(prod)){ continue; }
                if(i>1){continue;}
                $("highlightProducts"+i).value=prod;
                i++;
            }
        }
            
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalNimmBeob","type":"checkbox","class":"link","checked":GM_getValue(COUNTRY+"_"+SERVER+"_valNimmBeob",false)},newtd);
        newinput.addEventListener("click",function(){ GM_setValue2(COUNTRY+"_"+SERVER+"_valNimmBeob",this.checked,44); },false);
        createElement("td",{},newtr,getText("settings_valUseObservedPrices")[0]);
        createElement("td",{},newtr,getText("settings_valUseObservedPrices")[1]);
        
        // ********************************************************************
        newtr=createElement("tr",{},newtable);
        newtd=createElement("th",{"colspan":"3"},newtr,getText("messages"));
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalNachr","value":GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valPrivNachr",100),"class":"text","maxlength":"5","size":"5px","style":"background-color:transparent;text-align:center;"},newtd);
        newinput.addEventListener("focus",function(){this.style.backgroundColor="lightblue";},false);
        newinput.addEventListener("blur",function(){this.style.backgroundColor="transparent";},false);
        newinput.addEventListener("keyup",function(){
            var valPrivNachr=parseInt(this.value,10);
            if (isNaN(valPrivNachr)){
                this.value="";
            }else{
                this.value=valPrivNachr;
                GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valPrivNachr", valPrivNachr,45);
            }
        },false);
        createElement("td",{},newtr,getText("settings_valPrivateMessages")[0]);
        createElement("td",{},newtr,getText("settings_valPrivateMessages")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalNachr","value":GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valNachr",100),"class":"text","maxlength":"5","size":"5px","style":"background-color:transparent;text-align:center;"},newtd);
        newinput.addEventListener("focus",function(){this.style.backgroundColor="lightblue";},false);
        newinput.addEventListener("blur",function(){this.style.backgroundColor="transparent";},false);
        newinput.addEventListener("keyup",function(){
            var valNachr=parseInt(this.value,10);
            if (isNaN(valNachr)){
                this.value="";
            }else{
                this.value=valNachr;
                GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valNachr", valNachr,46);
            }
        },false);
        createElement("td",{},newtr,getText("settings_valMarketMessages")[0]);
        createElement("td",{},newtr,getText("settings_valMarketMessages")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalMessageRe","type":"checkbox","checked":GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valMessageRe",true),"class":"link"},newtd);
        newinput.addEventListener("click",function(){ GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valMessageRe", this.checked,47); },false);
        createElement("td",{},newtr,getText("settings_valMessageRe")[0]);
        createElement("td",{},newtr,getText("settings_valMessageRe")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalContractLogAmount","value":GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valContractLogAmount",200),"class":"text","maxlength":"5","size":"5px","style":"background-color:transparent;text-align:center;"},newtd);
        newinput.addEventListener("focus",function(){this.style.backgroundColor="lightblue";},false);
        newinput.addEventListener("blur",function(){this.style.backgroundColor="transparent";},false);
        newinput.addEventListener("keyup",function(){
            var valContractLogAmount=parseInt(this.value,10);
            if (isNaN(valContractLogAmount)){
                this.value="";
            }else{
                this.value=valContractLogAmount;
                GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valContractLogAmount", valContractLogAmount,17);
            }
        },false);
        createElement("td",{},newtr,getText("settings_valContractLogAmount")[0]);
        createElement("td",{},newtr,getText("settings_valContractLogAmount")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"type":"checkbox","checked":valMessagesSystemMarkRead,"class":"link"},newtd);
        newinput.addEventListener("click",function(){ GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valMessagesSystemMarkRead", this.checked,47); },false);
        createElement("td",{},newtr,getText("settings_valMessagesSystemMarkRead")[0]);
        createElement("td",{},newtr,getText("settings_valMessagesSystemMarkRead")[1]);
            
        // *********************************************************************
        newtr=createElement("tr",{},newtable);
        newtd=createElement("th",{"colspan":"3"},newtr,getText("general"));
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalAutoLogin","type":"checkbox","class":"link","checked":GM_getValue("valAutoLogin",false)},newtd);
        newinput.addEventListener("click",function(){GM_setValue2("valAutoLogin", this.checked,48);},false);
        createElement("td",{},newtr,getText("settings_valAutoLogin")[0]);
        createElement("td",{},newtr,getText("settings_valAutoLogin")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalUpdate","type":"checkbox","class":"link","checked":GM_getValue("valUpdate",true)},newtd);
        newinput.addEventListener("click",function(){GM_setValue2("valUpdate", this.checked,49);},false);
        createElement("td",{},newtr,getText("settings_valUpdate")[0]);
        createElement("td",{},newtr,getText("settings_valUpdate")[1]);
        
        if (STAT_SERVER[COUNTRY]){
            newtr=createElement("tr",{},newtable);
            newtd=createElement("td",{"align":"center"},newtr);
            newinput=createElement("input",{"id":"inputvalStatistik","type":"checkbox","class":"link","checked":valStatistik},newtd);
            newinput.addEventListener("click",function(){
                valStatistik=this.checked;
                GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valStatistik", valStatistik,50);
            },false);
            createElement("td",{},newtr,getText("settings_valSendStatistics")[0]);
            createElement("td",{},newtr,getText("settings_valSendStatistics")[1]);
        }
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{},newtr);
        createElement("td",{},newtr,getText("settings_valServerTimeOffset")[0]);
        newtd=createElement("td",{},newtr);
        newinput=createElement("button",{"type":"button","class":"link2"},newtd,"-");
        newinput.addEventListener("click",function(){
            valServerTimeOffset=Math.max(-86400,valServerTimeOffset-3600);
            GM_setValue(COUNTRY+"_valServerTimeOffset",valServerTimeOffset);
            nowServerOff=unsafeWindow.Zeit.Server+valServerTimeOffset;
            this.parentNode.children[1].innerHTML=(valServerTimeOffset<0?"":"+")+Math.round(valServerTimeOffset/3600)+getText("shortHours");
            this.parentNode.children[3].innerHTML=getFormattedDateStr(nowServerOff)+"&nbsp;"+getDaytimeStr(nowServerOff);
        },false);
        createElement("span",{"style":"margin-right:5px;"},newtd,(valServerTimeOffset<0?"":"+")+Math.round(valServerTimeOffset/3600)+getText("shortHours"));
        newinput=createElement("button",{"type":"button","class":"link2"},newtd,"+");
        newinput.addEventListener("click",function(){
            valServerTimeOffset=Math.min(86400,valServerTimeOffset+3600);
            GM_setValue(COUNTRY+"_valServerTimeOffset",valServerTimeOffset);
            nowServerOff=unsafeWindow.Zeit.Server+valServerTimeOffset;
            this.parentNode.children[1].innerHTML=(valServerTimeOffset<0?"":"+")+Math.round(valServerTimeOffset/3600)+getText("shortHours");
            this.parentNode.children[3].innerHTML=getFormattedDateStr(nowServerOff)+"&nbsp;"+getDaytimeStr(nowServerOff);
        },false);
        createElement("span",{"style":"margin-left:10px;"},newtd,getFormattedDateStr(nowServerOff)+"&nbsp;"+getDaytimeStr(nowServerOff));
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalGamecursor","type":"checkbox","class":"link","checked":GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valGamecursor",true)},newtd);
        newinput.addEventListener("click",function(){GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valGamecursor", this.checked,51);},false);
        createElement("td",{},newtr,getText("settings_valGamecursor")[0]);
        createElement("td",{},newtr,getText("settings_valGamecursor")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalDrag","type":"checkbox","class":"link","checked":GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valDrag",false)},newtd);
        newinput.addEventListener("click",function(){GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valDrag", this.checked,52);},false);
        createElement("td",{},newtr,getText("settings_valDrag")[0]);
        createElement("td",{},newtr,getText("settings_valDrag")[1]);
        
        /*
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalDrag","type":"checkbox","class":"link","checked":valClickErrorbox},newtd);
        newinput.addEventListener("click",function(){
            valClickErrorbox=this.checked;
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valClickErrorbox", valClickErrorbox,53);
        },false);
        createElement("td",{},newtr,getText("settings_valClickErrorbox")[0]);
        createElement("td",{},newtr,getText("settings_valClickErrorbox")[1]);
        */
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputvalHotkey","type":"checkbox","class":"link","checked":GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valHotkey",true)},newtd);
        newinput.addEventListener("click",function(){GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valHotkey", this.checked,54);},false);
        createElement("td",{},newtr,getText("settings_valHotkeys")[0]);
        createElement("td",{},newtr,getText("settings_valHotkeys")[1]);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"colspan":"2","align":"center"},newtr);
        newinput=createElement("button",{"type":"button","class":"link2"},newtd,getText("settings_cacheReset")[0]);
        newinput.addEventListener("click",function(){
            alert2(getText("settings_cacheReset")[1],getText("yes"),getText("no"),function(){
                for(var i=1000; i >=0; --i){unsafeWindow.clearInterval(i);}
                window.setTimeout(function(){
                    var protect={"kauf":1,"farmiLog":1,"vertraegeIn":1,"vertraegeOut":1,"levelLog":1,"nachrichten":1};
                    var help=cloneInto(GM_listValues(), unsafeWindow);
                    for(var v=help.length-1;v>-1;v--){
                    if(help[v].match(COUNTRY+"_"+SERVER+"_"+USERNAME+"_")){
                        var curr=help[v].replace(COUNTRY+"_"+SERVER+"_"+USERNAME+"_","");
                        if(!protect[curr]){ GM_deleteValue(help[v]); }
                    }
                    }
                    top.location.href=top.location.href;
                },500);
            });
        },false);
        createElement("td",{},newtr,getText("settings_cacheReset")[1]);
        
        // *****
        newtr=createElement("tr",{},newtable);
        newtd=createElement("th",{"colspan":"3"},newtr,"Developing");
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputDevmode","type":"checkbox","class":"link","checked":DEVMODE},newtd);
        newinput.addEventListener("click",function(){GM_setValue2("devmode",DEVMODE=this.checked,55);},false);
        createElement("td",{},newtr,"Developer Mode");
        createElement("td",{},newtr);
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputDevmodeEvents","type":"checkbox","class":"link","checked":DEVMODE_EVENTS},newtd);
        newinput.addEventListener("click",function(){GM_setValue2("devmode_events",DEVMODE_EVENTS=this.checked,56);},false);
        createElement("td",{},newtr,"Developer Mode");
        createElement("td",{},newtr,"Show events (reload page)");
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputDevmodeFunctions","type":"checkbox","class":"link","checked":DEVMODE_FUNCTION},newtd);
        newinput.addEventListener("click",function(){GM_setValue2("devmode_function",DEVMODE_FUNCTION=this.checked);},false);
        createElement("td",{},newtr,"Developer Function");
        createElement("td",{},newtr,"Show function calls");
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputDevmodeLogWarning","type":"checkbox","class":"link","checked":DEVMODE_LOG_WARNING},newtd);
        newinput.addEventListener("click",function(){GM_setValue2("devmode_log_warning",DEVMODE_LOG_WARNING=this.checked);},false);
        createElement("td",{"rowspan":"2"},newtr,"Logging");
        createElement("td",{},newtr,"Show warnings in screen");
        
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"align":"center"},newtr);
        newinput=createElement("input",{"id":"inputDevmodeLogWarning","type":"checkbox","class":"link","checked":DEVMODE_LOG_ERROR},newtd);
        newinput.addEventListener("click",function(){GM_setValue2("devmode_log_error",DEVMODE_LOG_ERROR=this.checked);},false);
        createElement("td",{},newtr,"Show errors in screen");
        
        newtable=null;newtr=null;newtd=null;newdiv=null;newinput=null;
        
    }catch(err){GM_logError("buildInfoPanelOptions\n"+err);}
}
function buildInfoPanelAccounts(showPW){
    try{
        var container,newtable,newtr,newtd,newinput,newselect,newdiv;
        newdiv=$("infoPanelNaviAccounts");
        newdiv.classList.remove("naviItem");
        newdiv.classList.add("naviItemActive");
        var logindata=explode(GM_getValue("logindata","[]"),"buildInfoPanelAccounts/logindata",[]);
        container=$("infoPanelR");
        container.innerHTML="";
        newtable=createElement("table",{"align":"center"},container);
        newtr=createElement("tr",{},newtable);
        createElement("th",{},newtr);
        createElement("th",{},newtr,getText("server"));
        createElement("th",{},newtr,getText("name"));
        createElement("th",{},newtr,getText("password"));
        createElement("th",{"colspan":2},newtr);
        for(var v=0;v<logindata.length;v++){
            newtr=createElement("tr",{"v":v},newtable);
            newtd=createElement("td",{},newtr);
            newinput=createElement("input",{"type":"checkbox","class":"link","checked":logindata[v][4]},newtd);
            newinput.addEventListener("mouseover",function(event){ toolTip.show(event,getText("accountActive")); },false);
            newinput.addEventListener("change",function(){
                logindata[this.parentNode.parentNode.getAttribute("v")][4]=this.checked;
                GM_setValueCache("logindata",implode(logindata),57);
            },false);
            newtd=createElement("td",{},newtr);
            newinput=createElement("input",{"class":"text","style":"width:20px","maxlength":"2"},newtd);
            if (isNaN(logindata[v][1])){ logindata[v][1]="0";}
            if (logindata[v][1]!="0"){ newinput.value=logindata[v][1]; }
            newinput.addEventListener("change",function(){
                var readin=parseInt(this.value,10);
                if (isNaN(readin) || (readin<1)){
                    alert2(getText("invalidServer"),getText("ok")); this.value="";
                }else{
                    this.value=readin;
                    logindata[this.parentNode.parentNode.getAttribute("v")][1]=readin;
                    GM_setValueCache("logindata",implode(logindata),57);
                }
            },false);
            newselect=createElement("select",{},newtd);
            for(var w in GAMEPAGES){
                if(!GAMEPAGES.hasOwnProperty(w)){ continue; }
                createElement("option",{"value":w},newselect,w);
            }
            newselect.value=logindata[v][0];
            newselect.addEventListener("change",function(){
                logindata[this.parentNode.parentNode.getAttribute("v")][0]=this.value;
                GM_setValueCache("logindata",implode(logindata),57);
            },false);

            newtd=createElement("td",{},newtr);
            newinput=createElement("input",{"value":logindata[v][2],"class":"text","style":"width:140px","maxlength":"20"},newtd);
            newinput.addEventListener("change",function(){
                logindata[this.parentNode.parentNode.getAttribute("v")][2]=this.value;
                GM_setValueCache("logindata",implode(logindata),57);
            },false);

            newtd=createElement("td",{},newtr);
            newinput=createElement("input",{"value":enc(logindata[v][3],-4242),"class":"text","style":"width:140px","maxlength":"20"},newtd);
            if (!showPW){ newinput.type="password"; }
            newinput.addEventListener("change",function(){
                logindata[this.parentNode.parentNode.getAttribute("v")][3]=enc(this.value,4242);
                GM_setValueCache("logindata",implode(logindata),57);
            },false);

            newtd=createElement("td",{},newtr);
            if (v>0){
                newdiv=createElement("div",{"class":"link2","style":"width:14px;height:10px;"},newtd);
                createElement("img",{"src":GFX+"quest_up.gif","style":"width:14px;height:10px;"},newdiv);
                newdiv.addEventListener("mouseover",function(){this.style.backgroundColor="blue";},false);
                newdiv.addEventListener("mouseout",function(){this.style.backgroundColor="transparent";},false);
                newdiv.addEventListener("click",function(showPW){ return function(){
                    var currLine=parseInt(this.parentNode.parentNode.getAttribute("v"),10);
                    logindata.splice(currLine-1,2,logindata[currLine],logindata[currLine-1]);
                    GM_setValueCache("logindata",implode(logindata),57);
                    buildInfoPanelAccounts(showPW);
                }}(showPW),false);
            }
            if (v<logindata.length-1){
                newdiv=createElement("div",{"class":"link2","style":"width:14px;height:10px;"},newtd);
                createElement("img",{"src":GFX+"quest_down.gif","style":"width:14px;height:10px;"},newdiv);
                newdiv.addEventListener("mouseover",function(){this.style.backgroundColor="blue";},false);
                newdiv.addEventListener("mouseout",function(){this.style.backgroundColor="transparent";},false);
                newdiv.addEventListener("click",function(showPW){ return function(){
                    var currLine=parseInt(this.parentNode.parentNode.getAttribute("v"),10);
                    logindata.splice(currLine,2,logindata[currLine+1],logindata[currLine]);
                    GM_setValueCache("logindata",implode(logindata),57);
                    buildInfoPanelAccounts(showPW);
                }}(showPW),false);
            }

            newtd=createElement("td",{},newtr);
            createElement("img",{"src":GFX+"popin/contracts/anullieren.gif","class":"link2","style":"width: 16px;height: 16px;"},newtd);
            newtd.addEventListener("mouseover",function(event){
                toolTip.show(event,getText("delete"));
                this.style.backgroundColor="blue";
            },false);
            newtd.addEventListener("mouseout",function(){this.style.backgroundColor="transparent";},false);
            newtd.addEventListener("click",function(showPW){ return function(){
                var currLine=parseInt(this.parentNode.getAttribute("v"),10);
                logindata.splice(currLine,1);
                GM_setValueCache("logindata",implode(logindata),57);
                buildInfoPanelAccounts(showPW);
            }}(showPW),false);
        }
        newtr=createElement("tr",{},newtable);
        newtd=createElement("td",{"colspan":"5","class":"link","style":"font-weight:bold;font-size:16px;text-align:right;"},newtr,"+");
        newtd.addEventListener("mouseover",function(){this.style.backgroundColor="blue";},false);
        newtd.addEventListener("mouseout",function(){this.style.backgroundColor="transparent";},false);
        newtd.addEventListener("click",function(showPW){ return function(){
            logindata.push([COUNTRY,"0","","",false]); // new empty line
            GM_setValueCache("logindata",implode(logindata),57);
            buildInfoPanelAccounts(showPW);
        }}(showPW),false);
        newdiv=createElement("div",{"align":"center"},container);
        newinput=createElement("input",{"type":"checkbox","class":"link","checked":showPW},newdiv);
        newinput.addEventListener("click",function(){buildInfoPanelAccounts(this.checked);},false);
        createElement("span",{},newdiv,getText("showPasswords"));
        container=null;newtable=null;newtr=null;newtd=null;newinput=null;newselect=null;newdiv=null;
    }catch(err){GM_logError("buildInfoPanelAccounts\n"+err);}
}
function buildInfoPanelHotkeys(){
    try{
        var container,newtable,newtr,newtd,newinput,newdiv;
        newdiv=$("infoPanelNaviHotkeys");
        newdiv.classList.remove("naviItem");
        newdiv.classList.add("naviItemActive");
        container=$("infoPanelR");
        newtable=createElement("table",{"align":"center","border":"1","class":"hoverRowBgCc9"},container);
        for(var tr in getText("settings_hotkeymap")){
            if(!getText("settings_hotkeymap").hasOwnProperty(tr)){ continue; }
            newtr=createElement("tr",{},newtable);
            newtd=createElement("td",{},newtr);
            newinput=createElement("input",{"id":"hotkey"+tr,"value":getKeySymbol(hotkeymap[tr]),"class":"text","style":"width:80px;"},newtd);
            newinput.addEventListener("keyup",function(event){
                this.value=getKeySymbol(event.keyCode);
                hotkeymap[this.id.replace("hotkey","")]=event.keyCode;
                GM_setValue2("hotkeymap",implode(hotkeymap),58);
            },false);
            createElement("td",{},newtr,getText("settings_hotkeymap")[tr]);
        }
        container=null;newtable=null;newtr=null;newtd=null;newinput=null;newdiv=null;
    }catch(err){GM_logError("buildInfoPanelHotkeys\n"+err);}
}
function buildInfoPanelCss(){
    try{
        var container,newtable,newtr,newtd,newinput,newdiv;
        newdiv=$("infoPanelNaviCss");
        newdiv.classList.remove("naviItem");
        newdiv.classList.add("naviItemActive");
        container=$("infoPanelR");
        newtable=createElement("table",{"align":"center"},container);
        for(var v in css_styles){
            if(!css_styles.hasOwnProperty(v)){ continue; }
            newtr=createElement("tr",{},newtable);
            createElement("td",{},newtr,v);
            newtd=createElement("td",{},newtr);
            var help=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_"+v,css_styles[v][1]);
            newinput=createElement("input",{"name":v,"value":help,"class":"text","style":"width:250px;"},newtd);
            newinput.addEventListener("keyup",function(){
                var v=this.getAttribute("name");
                if(this.value==""){ this.value=INIT_CSS_STYLES[v][1]; }
                css_styles[v][1]=this.value;
                var help=css_styles[v][1];
                for(var w=0;w<css_styles[v][0].length;w++){
                    help=css_styles[css_styles[v][0][w]][1]+help;
                }
                this.parentNode.nextSibling.firstElementChild.setAttribute("style",help);
                GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_css_styles",implode(css_styles));
            },false);
            newtd=createElement("td",{},newtr);
            for(var w=0;w<css_styles[v][0].length;w++){
                help=css_styles[css_styles[v][0][w]][1]+help;
            }
            newdiv=createElement("div",{"style":help},newtd,"test");
        }
        container=null;newtable=null;newtr=null;newtd=null;newinput=null;newdiv=null;
    }catch(err){GM_logError("buildInfoPanelCss\n"+err);}
}
function buildInfoPanelImport(mode,showData,onlyThisAccount){
    try{
        var container,newtable,newtr,newtd,newinput,newdiv;
        newdiv=$("infoPanelNaviImport");
        newdiv.classList.remove("naviItem");
        newdiv.classList.add("naviItemActive");
        container=$("infoPanelR");
        container.innerHTML="";
        newdiv=createElement("div",{"style":"left:0px;position:absolute;width:450px;"},container);
        newinput=createElement("div",{"class":"link naviItem"+(mode=="export"?"Active":""),"style":"width:40%;"},newdiv,"Export");
        newinput.addEventListener("click",function(){
            buildInfoPanelImport("export",false,true);
        },false);
        newinput=createElement("div",{"class":"link naviItem"+(mode=="import"?"Active":""),"style":"width:40%;"},newdiv,"Import");
        newinput.addEventListener("click",function(){
            buildInfoPanelImport("import",false,true);
        },false);
        container=createElement("div",{"id":"beraterDataImportContainer","style":"position:absolute;top:30px;left:5px;height:485px;width:475px;overflow:auto;"},container);
        switch(mode){
        case "export":{
            // if (showData&&(!onlyThisAccount)){
            //  if(!confirm("Attention! Showing all data of all accounts can slow down your browser. Continue?")){
            //      showData=false;
            //  }
            // }
            createElement("div",{},container,"Click the lines to remove them.");

            var newdiv=createElement("div",{},container);
            var newinput=createElement("input",{"type":"checkbox","checked":showData},newdiv);
            newinput.addEventListener("click",function(){
                showExportData(this.checked,onlyThisAccount);
            },false);
            createElement("span",{},newdiv,"Show the data");

            newdiv=createElement("div",{},container);
            newinput=createElement("input",{"type":"checkbox","checked":onlyThisAccount},newdiv);
            newinput.addEventListener("click",function(){
                showExportData(showData,this.checked);
            },false);
            createElement("span",{},newdiv,"Only this account");

            newinput=createElement("button",{"class":"link"},container,"Create string!");
            newinput.addEventListener("click",function(){
                var save="";
                var help=$("beraterDataImportContainer").getElementsByTagName("tr");
                for(var v=0;v<help.length;v++){
                    var help2=help[v].getElementsByTagName("td");
                    save += help2[0].innerHTML+":"+help2[1].innerHTML+":"+help2[2].firstElementChild.innerHTML+"::";
                }
                prompt("Copy this string to a text-file", save.slice(0,save.length-2));
            },false);
            var newtable=createElement("table",{"border":"1","class":"hoverRowBgCc9","style":"width:100%"},container);
            var newtr,newtd;
            var help=cloneInto(GM_listValues(), unsafeWindow);
            help.sort();
            if(onlyThisAccount){
                for(var v=0;v<help.length;v++){
                    if(help[v].search(COUNTRY+"_"+SERVER+"_"+USERNAME)!=-1){
                        var help2=GM_getValue(help[v]);
                        var help3="s";
                        if(help2==""){ help2=" "; }
                        if(typeof help2=="number"){ help3="n"; }
                        else if(typeof help2=="boolean"){ help3="b"; }
                        else{ help2=help2.replace(/(:+)/g,":"); }
                        newtr=createElement("tr",{},newtable);
                        newtr.addEventListener("click",function(){ removeElement(this); },false);
                        createElement("td",{},newtr,help[v].replace(COUNTRY+"_"+SERVER+"_"+USERNAME+"_",""));
                        createElement("td",{},newtr,help3);
                        newtd=createElement("td",{"style":(showData?"":"display:none;")},newtr);
                        createElement("div",{"style":"max-height:100px;width:270px;overflow:auto;"},newtd,help2);
                    }
                }
            }else{
                for(var v=0;v<help.length;v++){
                    var help2=GM_getValue(help[v]);
                    var help3="s";
                    if(help2==""){ help2=" "; }
                    if(typeof help2=="number"){ help3="n"; }
                    else if(typeof help2=="boolean"){ help3="b"; }
                    else{ help2=help2.replace(/(:+)/g,":"); }
                    newtr=createElement("tr",{},newtable);
                    newtr.addEventListener("click",function(){ removeElement(this); },false);
                    createElement("td",{},newtr,help[v]);
                    createElement("td",{},newtr,help3);
                    newtd=createElement("td",{"style":(showData?"":"display:none;")},newtr);
                    createElement("div",{"style":"max-height:100px;width:270px;overflow:auto;"},newtd,help2);
                }
            }
            container=null;newdiv=null;newtable=null;newtr=null;newtd=null;newinput=null;
        break;}
        case "import":{
            createElement("div",{},container,"Click the lines to remove them.");

            var newdiv=createElement("div",{},container);
            var newinput=createElement("input",{"type":"checkbox","checked":showData},newdiv);
            newinput.addEventListener("click",function(){
                showImportData(this.checked,onlyThisAccount);
            },false);
            createElement("span",{},newdiv,"Show the data");

            newdiv=createElement("div",{},container);
            newinput=createElement("input",{"type":"checkbox","checked":onlyThisAccount},newdiv);
            newinput.addEventListener("click",function(){
                showImportData(showData,this.checked);
            },false);
            createElement("span",{},newdiv,"Only this account");

            newinput=createElement("button",{"class":"link"},container,"Enter data-string");
            newinput.addEventListener("click",function(){
                var promptdata=prompt("Please enter the data-string","");
                if(promptdata){
                    var container=$("beraterDataImportContainer");
                    var newtable=container.getElementsByTagName("table");
                    if(newtable[0]){ removeElement(newtable[0]); }
                    newtable=createElement("table",{"border":"1","class":"hoverRowBgCc9","style":"width:100%"},container);
                    var newtr,newtd;
                    var help=promptdata.split("::");
                    for(var v=0;v<help.length;v++){
                        var help2=help[v].split(":");
                        var impName=(onlyThisAccount?COUNTRY+"_"+SERVER+"_"+USERNAME+"_":"")+help2.splice(0,1)[0];
                        var impType=help2.splice(0,1)[0];
                        var impContent=help2.join(":");
                        if(impContent==" "){ impContent=""; }
                        if((impType=="n")||(impType=="b")||(impType=="s")){
                            newtr=createElement("tr",{},newtable);
                            newtr.addEventListener("click",function(){ removeElement(this); },false);
                            createElement("td",{},newtr,impName);
                            createElement("td",{},newtr,impType);
                            newtd=createElement("td",{"style":(showData?"":"display:none;")},newtr);
                            createElement("div",{"style":"max-height:100px;width:280px;overflow:auto;"},newtd,impContent);
                        }
                    }
                    container=null;newtable=null;newtr=null;newtd=null;
                }
            },false);
            newinput=createElement("button",{"class":"link"},container,"Import this!");
            newinput.addEventListener("click",function(){
                var help=$("beraterDataImportContainer").getElementsByTagName("tr");
                for(var v=0;v<help.length;v++){
                    var help2=help[v].getElementsByTagName("td");
                    switch(help2[1].innerHTML){
                    case "n": GM_setValue2(help2[0].innerHTML,parseInt(help2[2].getElementsByTagName("div")[0].innerHTML,10),59);break;
                    case "b": GM_setValue2(help2[0].innerHTML,help2[2].getElementsByTagName("div")[0].innerHTML=="true",60);break;
                    case "s": GM_setValue2(help2[0].innerHTML,help2[2].getElementsByTagName("div")[0].innerHTML,61);break;
                    }
                }
                alert2("done",getText("ok"));
            },false);
        break;}
        }
        container=null;newtable=null;newtr=null;newtd=null;newinput=null;newdiv=null;
    }catch(err){GM_logError("buildInfoPanelImport\n"+err);}
}
function buildInfoPanelLevel(){
    try{
        var container=$("infoPanelInner");
        container.innerHTML="";
        // GM_log("levelLog:\n"+print_r(levelLog,"",true,"\n"));
        newdiv=createElement("div",{"style":"height:400px;overflow:auto;color:black;"},container);
        // todayStr=getDateStr(now,2,false);
        levelLog[levelLogId][1]=parseInt($("pkt").innerHTML.replace(/\D/g,""),10);
        var totalumsatz=[0,0,[0,0]];
        var day,days;

        newtable=createElement("table",{"border":"1","style":"width:100%;"},newdiv);
        thead=createElement("thead",{},newtable); // sortable table
        newtbody=createElement("tbody",{"class":"hoverRowBgCc9"},newtable);
        newtfoot=createElement("tfoot",{},newtable);

        newtr=createElement("tr",{"class":"borderBottom2"},thead);
        createElement("th",{"class":"link","sortdir":"Asc","style":"border-right:2px solid black;"},newtr,getText("day"));
        createElement("th",{"class":"link","sortdir":"Asc"},newtr,getText("points"));
        createElement("th",{"class":"link","sortdir":"Asc"},newtr,"+");
        createElement("th",{"class":"link","sortdir":"Asc","style":"border-right:2px solid black;"},newtr,getText("rank"));
        createElement("th",{"class":"link","sortdir":"Asc"},newtr,getText("market"));
        createElement("th",{"class":"link","sortdir":"Asc"},newtr,getText("contract"));
        createElement("th",{"class":"link","sortdir":"Asc"},newtr,unsafeWindow.customerarecalled.replace(/%FARMI%/,""));
        new SortableTable(newtr);

        for(var v=levelLog.length-1;v>=0;v--){
            if(levelLog[v][0].match(/^\d+-\d+$/)){
                day=/^(\d+)-(\d+)$/.exec(levelLog[v][0]);
                day.swap(2,3);
                day[0]=1;
                day[1]=parseInt(day[1],10);
                day[2]=parseInt(day[2],10);
                days=(new Date(day[2],day[1],0)).getDate();
            }else{
                day=levelLog[v][0].split(/\./);
                day[0]=parseInt(day[0],10);
                day[1]=parseInt(day[1],10);
                day[2]=parseInt(day[2],10);
                days=1;
                // doubling with month-entry
                day[3]=day[2]+(day[1]<10?"0":"")+day[1];
                for(var w=levelLog.length-1;w>=0;w--){
                    if(levelLog[w][0]==day[3]){ days=0;break; } 
                }
            } 
            day=(new Date(day[2],day[1]-1,day[0]));

            newtr=createElement("tr",{"align":"right"},newtbody);

            // Sundays
            if (day.getDay()==0){
                newtr.setAttribute("class","borderBottom2");
            }

            createElement("td",{"value":day.getTime(),"style":"text-align:right;border-right:2px solid black;"},newtr,levelLog[v][0]==todayServerStr?getText("day0"):levelLog[v][0]);
            createElement("td",{"value":levelLog[v][1]},newtr,numberFormat(levelLog[v][1]));
            if(v==0){
                createElement("td",{"value":0},newtr);
            }else{
                createElement("td",{"value":(levelLog[v][1]-levelLog[v-1][1])},newtr,numberFormat(levelLog[v][1]-levelLog[v-1][1]));
            }
            createElement("td",{"value":levelLog[v][2],"style":"border-right:2px solid black;"},newtr,levelLog[v][2]?numberFormat(levelLog[v][2]):"");
            for(var w=0;w<=1;w++){
                createElement("td",{"value":levelLog[v][w+3]},newtr,numberFormat(levelLog[v][w+3]));
                totalumsatz[w] += levelLog[v][w+3];
            }
            if(levelLog[v][5]>0){
                createElement("td",{"value":levelLog[v][5]},newtr,numberFormat(levelLog[v][5]));
                totalumsatz[2][0] += days;
                totalumsatz[2][1] += levelLog[v][5];
            }else{
                createElement("td",{"value":0},newtr,"-");
            }
        }
        newtbody.scrollTop=newtbody.scrollHeight;
        //if (newdiv.scrollTop ==0) newdiv.scrollTop=(newdiv.scrollHeight < newdiv.clientHeight)?0:newdiv.scrollHeight - newdiv.clientHeight;

        newtr=createElement("tr",{"class":"borderTop2","align":"right"},newtfoot);
        createElement("td",{"style":"border-right:2px solid black;"},newtr,sign_average);
        createElement("td",{},newtr);
        if(v>1){
            var daycount=1+Math.round((now-getTime(levelLog[1][0]))/86400);
            createElement("td",{},newtr,numberFormat((levelLog[v-1][1]-levelLog[0][1])/daycount));
        }else{
            createElement("td",{},newtr);
        }
        createElement("td",{"style":"border-right:2px solid black;"},newtr);
        var daycount=1+Math.round((now-getTime(levelLog[0][0]))/86400);
        for(var w=0;w<2;w++){
            createElement("td",{},newtr,numberFormat(totalumsatz[w]/daycount));
        }
        createElement("td",{},newtr,numberFormat(totalumsatz[2][1]/totalumsatz[2][0]));

        newdiv=createElement("div",{"style":"height:106px;margin-top:10px;overflow:auto;color:black;"},container);
        for(var w=0;w<prodNameSort[0].length;w++){
            var v=prodNameSort[0][w];
            if((!prodBlock[0][v].match(/t/))&&(buyNotePadShowBlocked||((!prodBlock[0][v].match(/l/))&&(!prodBlock[0][v].match(/q/))))){
                if(0<prodMinRack[0][v]){
                    if (prodStock[0][v]==0){
                        newdiv1=createElement("div",{"class":"link hoverBgCc9","prod":v,"style":"line-height:16px;"},newdiv);
                        newdiv1.addEventListener("mouseover",function(event){ showGoToMarketToolTip(event,this.getAttribute("prod")); },false);
                        newdiv1.addEventListener("click",function(){ showMarket(this.getAttribute("prod")); },false);
                        produktPic(0,v,newdiv1);
                        createElement("span",{"style":"font-weight:bold;"},newdiv1,getText("stockXmissing").replace(/%1%/,prodName[0][v]));
                    }else if(prodStock[0][v]<prodMinRack[0][v]){
                        newdiv1=createElement("div",{"class":"link hoverBgCc9","prod":v,"style":"line-height:16px;"},newdiv);
                        newdiv1.addEventListener("mouseover",function(event){ showGoToMarketToolTip(event,this.getAttribute("prod")); },false);
                        newdiv1.addEventListener("click",function(){ showMarket(this.getAttribute("prod")); },false);
                        produktPic(0,v,newdiv1);
                        createElement("span",{"style":"font-weight:bold;"},newdiv1,getText("stockXlow").replace(/%1%/,prodName[0][v])+" ("+numberFormat(prodStock[0][v])+")");
                    }
                }
            }
        }
    }catch(err){GM_logError("buildInfoPanelLevel\n"+err);}
}
function buildInfoPanelMessages(mode){
try{
    var modeDefault={"type":1,"filterProduct":-1,"filterPlayer":""};
    var modeOld=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeInfoPanelMessages"),"buildInfoPanelMessages/modeOld");
    if(typeof modeOld!="object"){ modeOld=modeDefault; }
    if(typeof mode!="object"){ mode=modeOld; }
    for(var v in modeDefault){
        if(!modeDefault.hasOwnProperty(v)){ continue; }
        if(mode[v]==undefined){ mode[v]=(modeOld[v]==undefined?modeDefault[v]:modeOld[v]); }
    }
    GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeInfoPanelMessages",implode(mode,"buildInfoPanelMessages/mode"));  
    if(!logSales){
        logSales=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_logSales","[]"),"buildInfoPanelMessages/logSales",[]);
        logSales.sort(sortObjFunctions["int"],true);
        logSalesId=new Object();
        for(var v=logSales.length-1;v>=0;v--){
            logSalesId[logSales[v][0]]=v;
        }
    }
    var plotLogSales=new Array();
    var soldProducts=new Array();
    var sumTurnover=0,sumProfit=0,help,help1;
    if(mode["filterPlayer"]){
        var regFilterPlayer=new RegExp("^"+mode["filterPlayer"].replace(/\./g,"\\.").replace(/\*/g,".*")+"$","i");
    }else{
        var regFilterPlayer=/./;
    }
    var container,newtable,newtr,newtd,cell,div;
    container=$("infoPanelInner");
    container.innerHTML="";
    // head
    div=createElement("div",{"class":"borderBottom1Black","style":"height:45px;"},container);
    newtable=createElement("table",{"style":"width:100%;"},div);
    newtr=createElement("tr",{},newtable);
    newtd=createElement("td",{"class":"tnormal","style":"font-weight:bold;text-align:center;"},newtr,getText("salesLog"));
    newtd=createElement("td",{},newtr);
    div=createElement("div",{"class":"link naviItem"+(mode["type"]==1?"Active":"")},newtd,getText("detail"));
    div.addEventListener("click",function(){
        buildInfoPanelMessages({"type":1});
    },false);
    div=createElement("div",{"class":"link naviItem"+(mode["type"]==2?"Active":"")},newtd,getText("goods"));
    div.addEventListener("click",function(){
        buildInfoPanelMessages({"type":2});
    },false);
    div=createElement("div",{"class":"link naviItem"+(mode["type"]==3?"Active":"")},newtd,getText("buyers"));
    div.addEventListener("click",function(){
        buildInfoPanelMessages({"type":3});
    },false);
    // content
    div=createElement("div",{"class":"borderBottom1Black","style":"overflow-y:scroll;overflow-x:hidden;height:425px;"},container);
    newtable=createElement("table",{"style":"width:100%;","cellspacing":0},div);
    newtr=createElement("tr",{},newtable);

    switch(mode["type"]){
    case 1:{
        for(var v=logSales.length-1;v>-1;v--){
            if(logSales[v][2].match(regFilterPlayer)){
                help=false;
                if(typeof logSales[v][3][0]!="object"){
                    soldProducts[logSales[v][3][0]]=true;
                    if((mode["filterProduct"]==-1)||(mode["filterProduct"]==logSales[v][3][0])){
                        sumTurnover+=logSales[v][4];
                        sumProfit+=0.9*logSales[v][4];
                        plotLogSales.push([v,Math.round(100*logSales[v][4]/logSales[v][3][1])/100]);
                    }
                }else if(logSales[v][3].length==1){
                    soldProducts[logSales[v][3][0][0]]=true;
                    if((mode["filterProduct"]==-1)||(mode["filterProduct"]==logSales[v][3][0][0])){
                        sumTurnover+=logSales[v][4];
                        sumProfit+=logSales[v][4];
                        plotLogSales.push([v,[Math.round(100*logSales[v][4]/logSales[v][3][0][1])/100]]);
                    }
                }else{
                    help=false;help1=0;
                    for(var i=logSales[v][3].length-1;i>-1;i--){
                        soldProducts[logSales[v][3][i][0]]=true;
                        help1+=logSales[v][3][i][1]*gut[logSales[v][3][i][0]];
                        if((mode["filterProduct"]==-1)||(mode["filterProduct"]==logSales[v][3][i][0])){ help=true; }
                    }
                    if(help){
                        help=[v,[]];
                        for(var i=logSales[v][3].length-1;i>-1;i--){
                            help[1][i]=Math.round(100*logSales[v][4]*gut[logSales[v][3][i][0]]/help1)/100;
                            if((mode["filterProduct"]==-1)||(mode["filterProduct"]==logSales[v][3][i][0])){
                                sumTurnover+=logSales[v][3][i][1]*help[1][i];
                                sumProfit+=logSales[v][3][i][1]*help[1][i];
                            }
                        }
                        plotLogSales.push(help);
                    }
                }
            }
        }
        createElement("th",{},newtr,getText("buyers"));
        createElement("th",{},newtr,getText("products"));
        createElement("th",{},newtr,getText("price"));
        createElement("th",{},newtr,getText("turnover"));
        createElement("th",{},newtr,getText("profit")); 
        eventListenerScroll=function(){
            if((parseInt(this.scrollTop,10)+parseInt(this.style.height,10))>0.95*parseInt(this.scrollHeight,10)){
                plot();
            }
        }
        div.addEventListener("scroll",eventListenerScroll,false);
        function plot(){
        try{
            var newtable=$("infoPanelInner").getElementsByTagName("table")[1];
            var start=newtable.childElementCount-1;
            var end=start+100;
            if(plotLogSales.length<=end){
                end=plotLogSales.length;
                newtable.parentNode.removeEventListener("scroll",eventListenerScroll,false);
            }
            var newtr,newtd,newtd1,newtd2,newtd3,newdiv;
            var help;
            for(var w=start;w<end;w++){
                var v=plotLogSales[w][0];
                newtr=createElement("tr",{"class":"hoverBgCc9","v":v},newtable);
                if(typeof logSales[v][3][0]=="object"){ newtr.style.fontStyle="italic"; }
                newtr.addEventListener("mouseover",function(event){ 
                    toolTip.show(event,toolTipSales(this.getAttribute("v")));
                },false);
                newtd=createElement("td",{"class":"link"},newtr,logSales[v][2]);
                newtd.addEventListener("click",function(){
                    buildInfoPanelMessages({"filterPlayer":logSales[this.parentNode.getAttribute("v")][2]});
                },false);
                newtd=createElement("td",{"style":"height:16px"},newtr);
                newtd1=createElement("td",{"style":"height:16px;padding-left:20px;"},newtr);
                newtd2=createElement("td",{"style":"height:16px;padding-left:20px;"},newtr);
                newtd3=createElement("td",{"style":"height:16px;padding-left:20px;"},newtr);
                if(typeof logSales[v][3][0]!="object"){
                    newdiv=createElement("div",{"class":"link","prod":logSales[v][3][0]},newtd);
                    newdiv.addEventListener("click",function(){
                        buildInfoPanelMessages({"filterProduct":this.getAttribute("prod")});
                    },false);                   
                    produktPic(0,logSales[v][3][0],newdiv);
                    createElement("span",{},newdiv,numberFormat(logSales[v][3][1])+" "+prodName[0][logSales[v][3][0]]);
                    createElement("div",{"style":"text-align:right;"},newtd1,moneyFormat(plotLogSales[w][1]));
                    createElement("div",{"style":"text-align:right;"},newtd2,moneyFormat(logSales[v][4]));                  
                    createElement("div",{"style":"text-align:right;"},newtd3,moneyFormat(0.9*logSales[v][4]));                  
                }else if(logSales[v][3].length==1){
                    newdiv=createElement("div",{"class":"link","prod":logSales[v][3][0][0]},newtd);
                    newdiv.addEventListener("click",function(){
                        buildInfoPanelMessages({"filterProduct":this.getAttribute("prod")});
                    },false);                   
                    produktPic(0,logSales[v][3][0][0],newdiv);
                    createElement("span",{},newdiv,numberFormat(logSales[v][3][0][1])+" "+prodName[0][logSales[v][3][0][0]]);
                    createElement("div",{"style":"text-align:right;"},newtd1,moneyFormat(plotLogSales[w][1][0]));
                    createElement("div",{"style":"text-align:right;"},newtd2,moneyFormat(logSales[v][4]));
                    createElement("div",{"style":"text-align:right;"},newtd3,moneyFormat(logSales[v][4]));
                }else{
                    help=[0,0];
                    for(var i=logSales[v][3].length-1;i>-1;i--){
                        if((mode["filterProduct"]==-1)||(mode["filterProduct"]==logSales[v][3][i][0])){
                            newdiv=createElement("div",{"class":"link","prod":logSales[v][3][i][0]},newtd);
                            newdiv.addEventListener("click",function(){
                                buildInfoPanelMessages({"filterProduct":this.getAttribute("prod")});
                            },false);                   
                            produktPic(0,logSales[v][3][i][0],newdiv);
                            createElement("span",{},newdiv,numberFormat(logSales[v][3][i][1])+" "+prodName[0][logSales[v][3][i][0]]);
                            createElement("div",{"style":"text-align:right;"},newtd1,"* "+moneyFormat(plotLogSales[w][1][i]));
                            createElement("div",{"style":"text-align:right;"},newtd2,"* "+moneyFormat(plotLogSales[w][1][i]*logSales[v][3][i][1]));
                            createElement("div",{"style":"text-align:right;"},newtd3,"* "+moneyFormat(plotLogSales[w][1][i]*logSales[v][3][i][1]));
                            help[0]++;
                            help[1]+=plotLogSales[w][1][i]*logSales[v][3][i][1];
                        }
                    }
                    if(help[0]>1){
                        createElement("div",{},newtd,"&nbsp;");
                        createElement("div",{},newtd1,"&nbsp;");
                        createElement("div",{"style":"text-align:right;border-top:1px solid black;"},newtd2,moneyFormat(help[1]));
                        createElement("div",{"style":"text-align:right;border-top:1px solid black;"},newtd3,moneyFormat(help[1]));
                    }
                }               
            }
            $("kaufDataCount").innerHTML=numberFormat(end)+"/"+numberFormat(plotLogSales.length);
            newtable=null;newtr=null;newtd=null;newdiv=null;
        }catch(err){GM_logError("buildInfoPanelMessages plot\n"+err);}      
        }
    break;}
    case 2:{
        for(var v=logSales.length-1;v>-1;v--){
            if(logSales[v][2].match(regFilterPlayer)){
                if(typeof logSales[v][3][0]!="object"){
                    if(!plotLogSales[logSales[v][3][0]]){ plotLogSales[logSales[v][3][0]]=[logSales[v][3][0],0,0,0]; }
                    plotLogSales[logSales[v][3][0]][1]+=logSales[v][3][1];
                    plotLogSales[logSales[v][3][0]][2]+=logSales[v][4];
                    plotLogSales[logSales[v][3][0]][3]+=0.9*logSales[v][4];
                }else if(logSales[v][3].length==1){
                    if(!plotLogSales[logSales[v][3][0][0]]){ plotLogSales[logSales[v][3][0][0]]=[logSales[v][3][0][0],0,0,0]; }
                    plotLogSales[logSales[v][3][0][0]][1]+=logSales[v][3][0][1];
                    plotLogSales[logSales[v][3][0][0]][2]+=logSales[v][4];
                    plotLogSales[logSales[v][3][0][0]][3]+=logSales[v][4];
                }else{
                    help1=0;
                    for(var i=logSales[v][3].length-1;i>-1;i--){
                        help1+=logSales[v][3][i][1]*gut[logSales[v][3][i][0]];
                    }
                    for(var i=logSales[v][3].length-1;i>-1;i--){
                        help=Math.round(100*logSales[v][3][i][1]*logSales[v][4]*gut[logSales[v][3][i][0]]/help1)/100;
                        if(!plotLogSales[logSales[v][3][i][0]]){ plotLogSales[logSales[v][3][i][0]]=[logSales[v][3][i][0],0,0,0]; }
                        plotLogSales[logSales[v][3][i][0]][1]+=logSales[v][3][i][1];
                        plotLogSales[logSales[v][3][i][0]][2]+=help;
                        plotLogSales[logSales[v][3][i][0]][3]+=help;
                    }
                }
            }
        }   
        plotLogSales.sort(function(a,b){return a[3]-b[3];});
        createElement("th",{},newtr,getText("product"));
        createElement("th",{},newtr,getText("quantity"));
        createElement("th",{},newtr,getText("turnover"));
        createElement("th",{},newtr,sign_average);
        createElement("th",{},newtr,getText("profit"));
        createElement("th",{},newtr,sign_average);
        for(var v=plotLogSales.length-1;v>-1;v--){
            if(!plotLogSales[v]){ continue; }
            sumTurnover+=plotLogSales[v][2];
            sumProfit+=plotLogSales[v][3];
            newtr=createElement("tr",{"class":"hoverBgCc9 link","prod":plotLogSales[v][0]},newtable);
            newtr.addEventListener("click",function(){
                buildInfoPanelMessages({"type":1,"filterProduct":this.getAttribute("prod")});
            },false);           
            newtd=createElement("td",{},newtr);
            produktPic(0,plotLogSales[v][0],newtd);
            createElement("span",{},newtd,prodName[0][plotLogSales[v][0]]);
            createElement("td",{"align":"right","style":"padding-right:3px;border-right:1px solid black"},newtr,numberFormat(plotLogSales[v][1],0));
            createElement("td",{"align":"right"},newtr,moneyFormat(plotLogSales[v][2]));
            createElement("td",{"align":"right","style":"padding-right:3px;border-right:1px solid black"},newtr,moneyFormat(plotLogSales[v][2]/plotLogSales[v][1],2));
            createElement("td",{"align":"right"},newtr,moneyFormat(plotLogSales[v][3]));
            createElement("td",{"align":"right","style":"padding-right:20px;"},newtr,moneyFormat(plotLogSales[v][3]/plotLogSales[v][1],2));
        }
    break;}
    case 3:{
        plotLogSales=new Object();
        for(var v=logSales.length-1;v>-1;v--){
            if(typeof logSales[v][3][0]!="object"){
                soldProducts[logSales[v][3][0]]=true;
                if((mode["filterProduct"]==-1)||(mode["filterProduct"]==logSales[v][3][0])){            
                    if(!plotLogSales[logSales[v][2]]){ plotLogSales[logSales[v][2]]=[logSales[v][2],{},0,0]; }
                    if(!plotLogSales[logSales[v][2]][1][logSales[v][3][0]]){ plotLogSales[logSales[v][2]][1][logSales[v][3][0]]=0; }
                    plotLogSales[logSales[v][2]][1][logSales[v][3][0]]+=logSales[v][3][1];
                    plotLogSales[logSales[v][2]][2]+=logSales[v][4];
                    plotLogSales[logSales[v][2]][3]+=0.9*logSales[v][4];
                }
            }else if(logSales[v][3].length==1){
                soldProducts[logSales[v][3][0][0]]=true;                
                if((mode["filterProduct"]==-1)||(mode["filterProduct"]==logSales[v][3][0][0])){
                    if(!plotLogSales[logSales[v][2]]){ plotLogSales[logSales[v][2]]=[logSales[v][2],{},0,0]; }
                    if(!plotLogSales[logSales[v][2]][1][logSales[v][3][0][0]]){ plotLogSales[logSales[v][2]][1][logSales[v][3][0][0]]=0; }
                    plotLogSales[logSales[v][2]][1][logSales[v][3][0][0]]+=logSales[v][3][0][1];
                    plotLogSales[logSales[v][2]][2]+=logSales[v][4];
                    plotLogSales[logSales[v][2]][3]+=logSales[v][4];
                }
            }else{
                help1=0;
                for(var i=logSales[v][3].length-1;i>-1;i--){
                    help1+=logSales[v][3][i][1]*gut[logSales[v][3][i][0]];
                }
                for(var i=logSales[v][3].length-1;i>-1;i--){
                    soldProducts[logSales[v][3][i][0]]=true;
                    if((mode["filterProduct"]==-1)||(mode["filterProduct"]==logSales[v][3][i][0])){
                        help=Math.round(100*logSales[v][3][i][1]*logSales[v][4]*gut[logSales[v][3][i][0]]/help1)/100;
                        if(!plotLogSales[logSales[v][2]]){ plotLogSales[logSales[v][2]]=[logSales[v][2],{},0,0]; }
                        if(!plotLogSales[logSales[v][2]][1][logSales[v][3][i][0]]){ plotLogSales[logSales[v][2]][1][logSales[v][3][i][0]]=0; }
                        plotLogSales[logSales[v][2]][1][logSales[v][3][i][0]]+=logSales[v][3][i][1];
                        plotLogSales[logSales[v][2]][2]+=help;
                        plotLogSales[logSales[v][2]][3]+=help;
                    }
                }
            }
        }
        help=[];
        for(var i in plotLogSales){
            if(!plotLogSales.hasOwnProperty(i)){ continue; }
            help.push(plotLogSales[i]);
        }
        plotLogSales=help.clone();
        plotLogSales.sort(function(a,b){return a[3]-b[3];});
        createElement("th",{},newtr,getText("buyers"));
        createElement("th",{},newtr,getText("products"));
        createElement("th",{},newtr,getText("turnover"));
        createElement("th",{},newtr,getText("profit"));
        for(var v=plotLogSales.length-1;v>-1;v--){
            if(!plotLogSales[v]){ continue; }
            sumTurnover+=plotLogSales[v][2];
            sumProfit+=plotLogSales[v][3];
            newtr=createElement("tr",{"class":"hoverBgCc9 link","player":plotLogSales[v][0]},newtable);
            newtr.addEventListener("click",function(){
                buildInfoPanelMessages({"type":1,"filterPlayer":this.getAttribute("player")});
            },false);           
            createElement("td",{},newtr,plotLogSales[v][0]);
            newtd=createElement("td",{},newtr);
            for(var i in plotLogSales[v][1]){
                if(!plotLogSales[v][1].hasOwnProperty(i)){ continue; }
                div=createElement("div",{},newtd);
                produktPic(0,i,div);
                createElement("span",{},div,numberFormat(plotLogSales[v][1][i])+" "+prodName[0][i]);
            }
            createElement("td",{"align":"right"},newtr,moneyFormat(plotLogSales[v][2]));
            createElement("td",{"align":"right"},newtr,moneyFormat(plotLogSales[v][3]));
        }
    break;}
    }
    // foot
    div=createElement("div",{"style":"height:45px;"},container);
    newtable=createElement("table",{"style":"width:100%;"},div);
    newtr=createElement("tr",{},newtable);
    createElement("td",{"id":"kaufDataCount"},newtr);
    newtd=createElement("td",{},newtr);
    if((mode["type"]==1)||(mode["type"]==3)){
        createElement("span",{"style":"padding-left:10px;"},newtd,getText("goods")+":");
        cell=createElement("div",{"class":"clearFilter link","style":"display:inline-block;"},newtd);
        cell.addEventListener("mouseover",function(event){ toolTip.show(event,getText("clearFilter")); },false);
        cell.addEventListener("click",function(){
            buildInfoPanelMessages({"filterProduct":-1});
        },false);
        cell=createElement("select",{"class":"link"},newtd);
        createElement("option",{"value":-1},cell,"---");
        for(var v=0;v<prodNameSort[0].length;v++){
            if(soldProducts[prodNameSort[0][v]]){
                createElement("option",{"value":prodNameSort[0][v]},cell,prodName[0][prodNameSort[0][v]]);
            }
        }
        cell.value=mode["filterProduct"];
        cell.addEventListener("change",function(){
            buildInfoPanelMessages({"filterProduct":this.value});
        },false);
    }
    createElement("td",{},newtr,getText("turnover")+": ");
    createElement("td",{"align":"right"},newtr,moneyFormat(sumTurnover));
    newtr=createElement("tr",{},newtable);
    newtd=createElement("td",{},newtr);
    newtd=createElement("td",{},newtr);
    if((mode["type"]==1)||(mode["type"]==2)){
        createElement("span",{"style":"padding-left:10px;"},newtd,getText("buyers")+":");
        cell=createElement("div",{"class":"clearFilter link","style":"display:inline-block;"},newtd);
        cell.addEventListener("mouseover",function(event){ toolTip.show(event,getText("clearFilter")); },false);
        cell.addEventListener("click",function(){
            buildInfoPanelMessages({"filterPlayer":""});
        },false);   
        cell=createElement("input",{"value":mode["filterPlayer"],"class":"link","style":"width:100px;","maxlength":"20"},newtd);
        cell.addEventListener("mouseover",function(event){ toolTip.show(event,getText("useWildcard")); },false);
        cell.addEventListener("change",function(){ 
            buildInfoPanelMessages({"filterPlayer":this.value});
        },false);
    }
    createElement("td",{},newtr,getText("profit")+": ");
    createElement("td",{"align":"right"},newtr,moneyFormat(sumProfit));
    if(mode["type"]==1){ plot(); }
    container=null;newtable=null;newtr=null;newtd=null;cell=null;div=null;
    }catch(err){GM_logError("buildInfoPanelMessages\n"+err);}   
}

function goToZone(zoneNrF){
    try{
        var currLocation=zones.getLocation(zoneNrF);        
        var div;
        switch(currLocation.location){
        case "farm":{
            if((gameLocation[0]==currLocation.location)&&(gameLocation[1]==currLocation.farmNr)){
                if(div=$("farm"+(1+currLocation.farmNr)+"_pos"+currLocation.zoneNr+"_click")){ 
                    click(div);
                }
            }else if(div=$("speedlink_farm"+(1+currLocation.farmNr))){
                document.addEventListener("gameFarmOpened",function(zoneNrF){
                return function(){
                    document.removeEventListener("gameFarmOpened",arguments.callee,false);
                    window.setTimeout(goToZone,100,zoneNrF);
                }
                }(zoneNrF),false);
                click(div); 
            }           
        break;}
        case "city":{
            if((gameLocation[0]==currLocation.location)&&(gameLocation[1]==currLocation.cityNr)){
                if((currLocation.zoneNr!=undefined)&&(div=$("cityzone_"+currLocation.cityNr+"_"+currLocation.zoneNr))){ 
                    click(div);
                }
            }else if(div=$("speedlink_city"+currLocation.cityNr)){
                document.addEventListener("gameCity"+currLocation.cityNr,function(zoneNrF,currLocation){
                return function(){
                    document.removeEventListener("gameCity"+currLocation.cityNr,arguments.callee,false);
                    window.setTimeout(goToZone,100,zoneNrF);
                }
                }(zoneNrF,currLocation),false);
                click(div); 
            }
        break;}
        case "forestry":{
            if(gameLocation[0]==currLocation.location){
                if((currLocation.zoneNr!=undefined)&&(div=$("forestry_building_click"+currLocation.zoneNr))){ 
                    click(div);
                }
            }else if(div=$("speedlink_forestry")){
                document.addEventListener("gameOpenForestry",function(zoneNrF){
                return function(){
                    document.removeEventListener("gameOpenForestry",arguments.callee,false);
                    window.setTimeout(goToZone,100,zoneNrF);
                }
                }(zoneNrF),false);
                click(div); 
            }
        break;}
        case "foodworld":{
            if(gameLocation[0]==currLocation.location){
                if((currLocation.zoneNr!=undefined)&&(div=$("food_pos"+currLocation.zoneNr))){ 
                    click(div);
                }
            }else if(div=$("speedlink_foodworld")){
                document.addEventListener("gameFoodworldOpened",function(zoneNrF){
                return function(){
                    document.removeEventListener("gameFoodworldOpened",arguments.callee,false);
                    window.setTimeout(goToZone,100,zoneNrF);
                }
                }(zoneNrF),false);
                click(div); 
            }
        break;}
        case "farmersmarket":{
            if(gameLocation[0]==currLocation.location){
                if((currLocation.zoneNr!=undefined)&&(div=$("farmersmarket_pos"+currLocation.zoneNr+"_click"))){ 
                    click(div);
                }
            }else if(div=$("speedlink_farmersmarket")){
                document.addEventListener("gameFarmersmarketOpened",function(zoneNrF){
                return function(){
                    document.removeEventListener("gameFarmersmarketOpened",arguments.callee,false);
                    window.setTimeout(goToZone,100,zoneNrF);
                }
                }(zoneNrF),false);
                click(div); 
            }           
        break;}
        }
        div=null;
    }catch(err){GM_logError("goToZone zoneNrF="+zoneNrF+"\n"+err);}
}
function calcAllSlots(){
try{
    ALL_SLOTS={};
    for(var i in ALL_ZONES){
        if(!ALL_ZONES.hasOwnProperty(i)){ continue; }
        for(var j=0;j<ALL_ZONES[i].length;j++){
            if(zones.isMultiSlot(ALL_ZONES[i][j])){
                for(var slot=1;slot<=3;slot++){
                    ALL_SLOTS[ALL_ZONES[i][j]+"."+slot]=i;
                }
            }else{
                ALL_SLOTS[ALL_ZONES[i][j]]=i;
            }
        }
    }
    unsafeData.ALL_SLOTS=ALL_SLOTS.clone();
}catch(err){ GM_logError("calcAllSlots\n"+err); }
}
function toolTipZoneProduction(zoneNrS){
    try{
        var currLocation=zones.getLocation(zoneNrS);
        var content=createElement("div");
        var time,endDay,table,tr,td;
        var help;
        table=createElement("table",{"border":"0","cellspacing":"0","cellpadding":"0"},content);
        // part: head
        tr=createElement("tr",{},table);
        td=createElement("th",{"class":"lightBg","colspan":2},tr);
        if(currLocation.location=="farm"){
            td.innerHTML=getText("farm")+" "+(1+currLocation.farmNr)+"."+currLocation.zoneNr+" ("+zones.getBuildingName(zoneNrS)+")";
        }else{
            td.innerHTML=zones.getBuildingName(zoneNrS);
        }
        // part: time
        time=zones.getEndtime(zoneNrS);
        tr=createElement("tr",{},table);
        if(time==NEVER){
            createElement("td",{"colspan":2},tr,getText("idle"));
        }else{
            time+=unsafeWindow.Zeit.Verschiebung;
            if (time<now){
                if(time+20*60*60<now){
                    createElement("td",{"colspan":2},tr,getText("readySinceX").replace(/%1%/,getFormattedDateStr(time)));
                }else{
                    createElement("td",{"colspan":2},tr,getText("readySinceX").replace(/%1%/,getDaytimeStr(time)+"&nbsp;"+getText("shortOClock")));
                }               
            } else if ((endDay=countDays(now,time))==0){
                createElement("td",{"colspan":2},tr,getText("readyAtX").replace(/%1%/,getDaytimeStr(time)+"&nbsp;"+getText("shortOClock")));
            } else if (getText("readyAtX_day"+endDay)){
                createElement("td",{"colspan":2},tr,getText("readyAtX_day"+endDay).replace(/%1%/,getDaytimeStr(time)+"&nbsp;"+getText("shortOClock")));
            } else{ 
                createElement("td",{"colspan":2},tr,getText("readyAtX").replace(/%1%/,new Date(1000*time).toLocaleString())); 
            }
        }
        // part: production
        tr=createElement("tr",{"style":"border-top:1px solid black;"},table);
        createElement("td",{"style":"border-top:1px solid black;","colspan":2},tr,getText("yield")+":");
        if(help=zones.getCrop(zoneNrS)){
            if(help.length==0){
                tr=createElement("tr",{},table);
                td=createElement("td",{"colspan":2},tr,"---");
            }else{
                for(var k=0;k<help.length;k++){
                    tr=createElement("tr",{},table);
                    td=createElement("td",{},tr);
                    produktPic(help[k][0],help[k][1],td);
                    createElement("span",{},td,numberFormat(help[k][2])+"&nbsp;"+prodName[help[k][0]][help[k][1]]);
                    td=createElement("td",{"style":"padding-left:5px;"},tr);
                    if(help[k][3]>0){ pointsFormat(help[k][3],"div",td); }
                }
            }
        }else{
            tr=createElement("tr",{},table);
            td=createElement("td",{"colspan":2},tr,"???");
        }
        table=null;tr=null;td=null;time=null;endDay=null;
        return content.innerHTML;
    }catch(err){GM_logError("toolTipZoneProduction\n"+err);}    
}
function toolTipSales(nr){
    try{
        var content=createElement("div");
        var table,tr,td;
        var time;
        if(logSales[nr]){
            time=logSales[nr][1]-valServerTimeOffset;
            table=createElement("table",{"border":"0","cellspacing":"0","cellpadding":"0"},content);
            if(typeof logSales[nr][3][0]=="object"){
                // contract
                tr=createElement("tr",{},table);
                createElement("th",{"class":"lightBg","colspan":3},tr,getText("contract"));
                tr=createElement("tr",{},table);
                createElement("td",{"colspan":3},tr,getFormattedDateStr(time,1)+",&nbsp;"+getDaytimeStr(time,1)+"&nbsp;"+getText("shortOClock"));
                tr=createElement("tr",{},table);
                createElement("td",{"colspan":3},tr,logSales[nr][2]);
                tr=createElement("tr",{"class":"borderBottom1Black"},table);
                createElement("td",{"colspan":3},tr,moneyFormat(logSales[nr][4]));              
                for(var v=0;v<logSales[nr][3].length;v++){
                    tr=createElement("tr",{},table);
                    createElement("td",{},table,numberFormat(logSales[nr][3][v][1]));
                    createElement("td",{},table,prodName[0][logSales[nr][3][v][0]]);
                    td=createElement("td",{},table);
                    if(logSales[nr][3].length==1){
                        td.innerHTML="("+moneyFormat(logSales[nr][4]/logSales[nr][3][v][1])+")"
                    }
                }
            }else{
                // marketplace
                tr=createElement("tr",{},table);
                createElement("th",{"class":"lightBg","colspan":3},tr,getText("marketplace"));
                tr=createElement("tr",{},table);
                createElement("td",{"colspan":3},tr,getFormattedDateStr(time,1)+",&nbsp;"+getDaytimeStr(time,1)+"&nbsp;"+getText("shortOClock"));
                tr=createElement("tr",{},table);
                createElement("td",{"colspan":3},tr,logSales[nr][2]);
                tr=createElement("tr",{"class":"borderBottom1Black"},table);
                createElement("td",{"colspan":3},tr,moneyFormat(logSales[nr][4]));              
                tr=createElement("tr",{},table);
                createElement("td",{},table,numberFormat(logSales[nr][3][1]));
                createElement("td",{},table,prodName[0][logSales[nr][3][0]]);
                createElement("td",{},table,"("+moneyFormat(logSales[nr][4]/logSales[nr][3][1])+")");
            }
        }

        table=null;tr=null;td=null;
        return content.innerHTML;
    }catch(err){GM_logError("toolTipSales\n"+err);} 
}

function showMarket(pid){
    try{
        if((gameLocation[0]!="city")||(gameLocation[1]!=1)){
            document.addEventListener("gameCity1",function(pid){ return function(){
                document.removeEventListener("gameCity1",arguments.callee,false);
                showMarket(pid);
            };}(pid),false);
            click($("speedlink_city1"));
        }else if($("market").style.display!="block"){
            document.addEventListener("gameOpenMarket",function(pid){ return function(){
                document.removeEventListener("gameOpenMarket",arguments.callee,false);
                showMarket(pid);
            };}(pid),false);
            unsafeWindow.close_page(); 
            unsafeWindow.hideDiv("shop");               
            unsafeWindow.hideDiv("wbwcontainer");               
            unsafeWindow.hideDiv("adcolumn");               
            $("transp3").style.visibility = "visible"; 
            unsafeWindow.showDiv("transp3"); 
            unsafeWindow.marketAction("marketinit");
        }else{
            closeInfoPanel();
            unsafeWindow.market_filter_name="";
            unsafeWindow.market_filter_pid=parseInt(pid,10);
            unsafeWindow.market_filter_own=0;
            unsafeWindow.market_guild_filter=0;
            unsafeWindow.showOffers();          
        }
    }catch(err){ GM_logError("showMarket pid="+pid+"\n"+err); }
}
function showMarketStall(){
    try{
        if((gameLocation[0]!="city")||(gameLocation[1]!=1)){
            document.addEventListener("gameCity1",function(){
                document.removeEventListener("gameCity1",arguments.callee,false);
                showMarketStall();
            },false);
            click($("speedlink_city1"));
        }else if($("market").style.display!="block"){
            document.addEventListener("gameOpenMarket",function(){
                document.removeEventListener("gameOpenMarket",arguments.callee,false);
                showMarketStall();
            },false);
            unsafeWindow.close_page(); 
            unsafeWindow.showDiv("transp3"); 
            unsafeWindow.$("transp3").style.visibility = "visible"; 
            unsafeWindow.marketAction("marketinit");
        }else{
            unsafeWindow.setMarketNavi(3);
            unsafeWindow.market_guild_filter = 0;
            unsafeWindow.market_filter_pid = -1;
            unsafeWindow.market_filter_own = 1;
            unsafeWindow.showOffers();              
        }
    }catch(err){ GM_logError("showMarketStall\n"+err); }
}
function quicklinks(){
    try{
        if (GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valQuicklinks",true)){
            var newdiv=$("market_navi5");
            if(newdiv){
                newdiv.addEventListener("mouseover",function(event){
                    $("quicklinks").style.display="block";
                },false);
                newdiv.addEventListener("mouseout",function(event){
                    $("quicklinks").style.display="none";
                },false);
        
                var highlightProducts=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_highlightProducts","[false,{}]"),"quicklinks/highlightProducts",[false,{}]);
                var divquick=createElement("div",{"id":"quicklinks","style":"display:none;position:absolute;right:-75px;top:67px;width:600px;background-color:white;z-index:10;"},newdiv);
                // if(self!=top){
                //  divquick.addEventListener("mouseover",function(){this.style.left="290px";},false);
                //  divquick.addEventListener("mouseout",function(){this.style.left="620px";},false);
                // }
    
                var newtable=createElement("table",{"border":"3px solid black;"},divquick);
                var newtr=createElement("tr",{},newtable);
                var newtd=createElement("td",{},newtr);
    
                // newdiv=createElement("div",{"style":"float:right;height:30px;padding:2px;margin-right:20px;"},newtd);
                // createElement("div",{"class":"v88"},newdiv);
                // var newa=createElement("a",{"class":"link2","href":"markt.php","style":"position:relative;top:-30px;"},newdiv);
                // newdiv=createElement("div",{"style":"width:30px;height:30px;background-color:green;opacity:0;"},newa);
                // newdiv.addEventListener("mouseover",function(){this.style.opacity="0.3";$("quicklinksName").innerHTML=getText("currentOffers");},false);
                // newdiv.addEventListener("mouseout",function(){this.style.opacity="0";$("quicklinksName").innerHTML="";},false);
                createElement("div",{"id":"quicklinksName","style":"color:black;font-weight:bold;float:right;line-height:30px;padding:2px;margin-right:170px;"},newtd);
    
                var prodTypOld="c";
                for(var w=0;w<prodNameSort[0].length;w++){
                    var v=prodNameSort[0][w];
                    if((!prodBlock[0][v].match(/t/))&&(!prodBlock[0][v].match(/l/))){
                        if (prodTypOld!=prodTyp[0][v]){
                            newtr=createElement("tr",{},newtable);
                            newtd=createElement("td",{},newtr);
                            prodTypOld=prodTyp[0][v];
                        }
                        newdiv=createElement("div",{"style":"float:left;height:30px;"+(highlightProducts[1][v]?"border:2px solid blue;border-radius:10px;":"padding:2px;")},newtd);
                        createElement("div",{"class":"v"+v},newdiv);
                        newdiv=createElement("div",{"v":v,"style":"position:relative;top:-30px;width:30px;height:30px;background-color:blue;opacity:0;"},newdiv);
                        newdiv.addEventListener("click",function(event){
                            event.stopPropagation ? event.stopPropagation() : (event.cancelBubble=true); // stop bubbling
                            showMarket(this.getAttribute("v"));
                            $("quicklinks").style.display="none";
                        },false);
                        newdiv.addEventListener("mouseover",function(){this.style.opacity="0.3";$("quicklinksName").innerHTML=prodName[0][this.getAttribute("v")];},false);
                        newdiv.addEventListener("mouseout",function(){this.style.opacity="0";$("quicklinksName").innerHTML="";},false);
                    }
                }
                divquick=null;newtable=null;newtr=null;newtd=null;newa=null;
            }
            newdiv=null;
        }
    }catch(err){ GM_logError("quicklinks\n"+err); }             
}
var timer=new function(){
    var running=[];
    this.add=function(name,node,endtime,callback){
        try{
            timer.remove(name);
            running.push([name,node,endtime,callback]);
            timer.run(name);
        }catch(err){GM_logError("timer.add name="+name+"\n"+err);}
    }
    this.remove=function(name){
        try{
            for(var i=running.length-1;i>=0;i--){
                if(running[i][0]==name){
                    running.splice(i,1);
                }
            }
        }catch(err){GM_logError("timer.remove\n"+err);}
    }
    this.run=function(){
        try{
            for(var i=running.length-1;i>=0;i--){
                if(unsafeWindow.Zeit.Server<running[i][2]){
                    running[i][1].innerHTML=getTimeStr(running[i][2]-unsafeWindow.Zeit.Server);
                }else{
                    running[i][3]();
                    running.splice(i,1);
                }
            }
        }catch(err){GM_logError("timer.run\n"+err);}
    }
}
var clocks=new function(){
    var running=[];
    this.add=function(name,node,time){
        try{
            clocks.remove(name);
            running.push([name,node,time]);
            clocks.run(name);
        }catch(err){GM_logError("clocks.add name="+name+"\n"+err);}
    }
    this.remove=function(name){
        try{
            for(var i=running.length-1;i>=0;i--){
                if(running[i][0]==name){
                    running.splice(i,1);
                }
            }
        }catch(err){GM_logError("clocks.remove\n"+err);}
    }
    this.run=function(){
        try{
            for(var i=running.length-1;i>=0;i--){
                if(running[i][1]){
                    running[i][1].innerHTML=getDaytimeStr(running[i][2]+now);
                }else{
                    running.splice(i,1);
                }
            }
        }catch(err){GM_logError("clocks.run\n"+err);}
    }
}
function createZoneTimer(name,zoneNrS,type,style,append){ // type="zonetimer" || "zonetimerWater"
    try{
        if(!$(name)){
            var div=createElement("div",{"id":name,"zoneNrS":zoneNrS,"type":type,"style":style},append);
            div.addEventListener("mouseover",function(event){
            try{
                var zoneNrS=this.getAttribute("zoneNrS");
                var type=this.getAttribute("type");
                showBlase(zoneNrS);
                if(type=="zonetimer"){
                    toolTip.show(event,toolTipZoneProduction(zoneNrS));
                }else{ // zonetimerWater
                    var newDiv1=createElement("div");
                    var newTable=createElement("table",{"border":"0","cellspacing":"0","cellpadding":"0"},newDiv1);
                    var newTr=createElement("tr",{},newTable);
                    var newTd=createElement("th",{"class":"lightBg","colspan":2},newTr,zones.getBuildingName(zoneNrS));
                    var time = zones.getWatertime(zoneNrS);
                    if(time!=NEVER){ time+=unsafeWindow.Zeit.Verschiebung; }
                    var endDay=countDays(now,time);
                    newTr=createElement("tr",{},newTable);
                    if(time==NEVER){
                        createElement("td",{"colspan":2},newTr,"---");
                    } else if(time<now){
                        createElement("td",{"colspan":2},newTr,getText("waterNeeded"));
                    } else if (endDay==0){
                        createElement("td",{},newTr,getText("waterNeededAtX").replace(/%1%/,getDaytimeStr(time)+"&nbsp;"+getText("shortOClock")));
                    } else if ((endDay==1)&&(getText("waterNeededAtX_day1"))){
                        createElement("td",{},newTr,getText("waterNeededAtX_day1").replace(/%1%/,getDaytimeStr(time)+"&nbsp;"+getText("shortOClock")));
                    } else{ 
                        createElement("td",{},newTr,getText("waterNeededAtX").replace(/%1%/,new Date(1000*time).toLocaleString())); 
                    }
                    toolTip.show(event,newDiv1.innerHTML);
                    newDiv1=null;newTable=null;newTr=null;newTd=null;
                    time=null;endDay=null;
                }
                zoneNrS=null;type=null;
            }catch(err){GM_logError("createTimer.mouseover\n"+err);}            
            },false);
            div.addEventListener("mouseout",hideBlase,false);
            div=null;
        }
        updateZoneTimer(name,zoneNrS,type)
    }catch(err){GM_logError("createZoneTimer\nname="+name+"\n"+err);}
}
function updateZoneTimer(name,zoneNrS,type){
    try{
        var div;
        if(div=$(name)){
            if(zones.getBlock(zoneNrS)){
                removeZoneTimer(name,type);
            }else if(type=="zonetimer"){
                var time=zones.getEndtime(zoneNrS);
                if (time==NEVER){ // empty
                    div.setAttribute("class","zoneTimer");
                    timer.remove(name);
                    div.innerHTML="---";
                }else if(time<=unsafeWindow.Zeit.Server){ // ready
                    div.setAttribute("class","zoneTimerReady blinking");
                    timer.remove(name);
                    div.innerHTML=getText("finished").toUpperCase()+"!";
                }else{ // running
                    div.setAttribute("class","zoneTimer");
                    timer.add(name,div,time,function(name,zoneNrS,type){ return function(){ updateZoneTimer(name,zoneNrS,type); }}(name,zoneNrS,type));
                }
            }else{
                var time=zones.getWatertime(zoneNrS);
                if ((time==NEVER)||(time<=unsafeWindow.Zeit.Server)){ // watering not possible or needed
                    removeZoneTimer(name,type);
                }else{ // wait for watering
                    div.setAttribute("class","zoneTimerWater");
                    timer.add(name,div,time,function(name,zoneNrS,type){ return function(){ updateZoneTimer(name,zoneNrS,type); }}(name,zoneNrS,type));
                }
            }
            div=null;
        }
    }catch(err){GM_logError("updateZoneTimer name:"+name+" zoneNrS:"+zoneNrS+"\n"+err);}
}
function removeZoneTimer(name){
    try{
        timer.remove(name);
        var div;
        if(div=$(name)){
            removeElement(div);
            div=null;
        }
    }catch(err){GM_logError("removeZoneTimer name:"+name+"\n"+err);}
}   
function showBlase(zoneNrF){
    try{
        $("sprcontent").style.display="none";
        var bubble=$("sprcontent2");
        bubble.style.display="";
        bubble.innerHTML="";
        if (zones.getBlock(zoneNrF).match(/p/)){
            createElement("div",{"class":"tnormal"},bubble,unsafeWindow.inforequirepremium);
        }else if (zones.getBlock(zoneNrF).match(/q/)){
            createElement("div",{"class":"tnormal"},bubble,unsafeWindow.questblock);
        }else if(!zones.getBuilding(zoneNrF)){
            // blocked
        }else if(BUILDINGTYPE[zones.getBuilding(zoneNrF)]==0){
            createElement("div",{"class":"tnormal","style":"font-weight:bold;"},bubble,unsafeWindow.buildinginfos[0][zones.getBuilding(zoneNrF)][10]);
        }else{
            var time=zones.getEndtime(zoneNrF);
            if(time==NEVER){
                createElement("font",{"class":"tmenu","style":"font-weight:bold;"},bubble,zones.getBuildingName(zoneNrF)+" "+getText("idle"));
                // createElement("font",{"class":"tnormal","style":"font-weight:bold;"},bubble,getText("emptyField"));
            }else{
                time+=unsafeWindow.Zeit.Verschiebung;
                var prod = zones.getEndproduct(zoneNrF);
                if(prod!=null){
                    switch(zones.getLocation(zoneNrF).location){
                    case "windmill":
                        createElement("div",{"class":"fm"+prod,"style":"position:absolute;top:5px;left:0;"},bubble);
                        newdiv=createElement("div",{"style":"position:absolute;top:5px;left:55px;"},bubble);
                        createElement("font",{"class":"tmenu","style":"font-weight:bold;"},createElement("div",{},newdiv),prodName[3][prod]); // unsafeWindow.formulas[0][prod][2]
                    break;
                    case "forestry":
                        createElement("div",{"class":"f_symbol"+prod,"style":"position:absolute;top:5px;left:0;"},bubble);
                        newdiv=createElement("div",{"style":"position:absolute;top:5px;left:55px;"},bubble);
                        createElement("font",{"class":"tmenu","style":"font-weight:bold;"},createElement("div",{},newdiv),prodName[1][prod]);
                    break;
                    default:
                        createElement("div",{"class":"tt"+prod,"style":"position:absolute;top:5px;left:0;"},bubble);
                        newdiv=createElement("div",{"style":"position:absolute;top:5px;left:55px;"},bubble);
                        createElement("font",{"class":"tmenu","style":"font-weight:bold;"},createElement("div",{},newdiv),prodName[0][prod]);
                    }
                }

                var newfont=createElement("font",{"class":"tmenu"},createElement("div",{},newdiv));
                if (time<now){
                    if(time+20*60*60<now){
                        newfont.innerHTML=getText("readySinceX").replace(/%1%/,getFormattedDateStr(time));
                    }else{
                        newfont.innerHTML=getText("readySinceX").replace(/%1%/,getDaytimeStr(time)+"&nbsp;"+getText("shortOClock"));
                    }
                }else if (time<NEVER){
                    var endDay=countDays(now,time);
                    if (endDay==0){
                        newfont.innerHTML=getText("readyAtX").replace(/%1%/,getDaytimeStr(time)+"&nbsp;"+getText("shortOClock"));
                    }else if ((endDay==1)&&(getText("readyAtX_day1"))){
                        newfont.innerHTML=getText("readyAtX_day1").replace(/%1%/,getDaytimeStr(time)+"&nbsp;"+getText("shortOClock"));
                    }else if ((endDay==2)&&(getText("readyAtX_day2"))){
                        newfont.innerHTML=getText("readyAtX_day2").replace(/%1%/,getDaytimeStr(time)+"&nbsp;"+getText("shortOClock"));
                    }else{
                        newfont.innerHTML=new Date(1000*time).toLocaleString();
                    }
                }
                newfont=null;
            }
        }
        bubble=null;newdiv=null;
    }catch(err){ GM_logError("showBlase zoneNrF="+zoneNrF+"\n"+err); }
}
function hideBlase(){
    try{
        $("sprcontent").style.display="";
        $("sprcontent2").style.display="none";
    }catch(err){ GM_logError("hideBlase\n"+err); }
}

var modeBuyNotepad=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeBuyNotepad",0);
function doBuyNotepad(){
try{
    var err_trace="init";
    if(!show["buyNotepad"]){ return false; } // no calculation if table is hidden
    var newdiv=$("buyNotepad");
    if(newdiv){
    /* rack type 0 (farm) */
        err_trace="type 0";
        var prodMissing=new Array();
        var drawProductLines=false;
        // calculate missing products
        err_trace="type 0, missing products";
        for(var v=0;v<prodNameSort[0].length;v++){
            var prod=prodNameSort[0][v];
            if((!prodBlock[0][prod].match(/t/))&&(!prodBlock[0][prod].match(/l/))){
                var amount=prodMinRack[0][prod]-prodStock[0][prod];
                if (amount>0){
                    prodMissing.push([prod,amount,amount*(gut[prod]?gut[prod]:0)]);
                }
            }
        }
        // sorting
        err_trace="type 0, sorting";
        switch(modeBuyNotepad){
        case 0: drawProductLines=true; 
        prodMissing.sort(sortObjFunctions["productId"]);
        break;
        case 1: drawProductLines=true;
        prodMissing.sort(function(a,b){
            if(prodTyp[0][a[0]]==prodTyp[0][b[0]]){
                return(b[1][0]-a[1][0]);
            }else{
                return({"c":0,"v":1,"e":2,"o":3,"fw1":4,"fw2":5,"fw3":6,"fw4":7,"z":8}[prodTyp[0][a[0]]]-{"c":0,"v":1,"e":2,"o":3,"fw1":4,"fw2":5,"fw3":6,"fw4":7,"z":8}[prodTyp[0][b[0]]]);
            }
        }); break;
        case 2: drawProductLines=true;
        prodMissing.sort(function(a,b){
            if(prodTyp[0][a[0]]==prodTyp[0][b[0]]){
                return(a[1][0]-b[1][0]);
            }else{
                return({"c":0,"v":1,"e":2,"o":3,"fw1":4,"fw2":5,"fw3":6,"fw4":7,"z":8}[prodTyp[0][a[0]]]-{"c":0,"v":1,"e":2,"o":3,"fw1":4,"fw2":5,"fw3":6,"fw4":7,"z":8}[prodTyp[0][b[0]]]);
            }
        }); break;
        case 3: prodMissing.sort(function(a,b){return (a[1][0]-b[1][0]);}); break;
        case 4: prodMissing.sort(function(a,b){return (a[1][0]-b[1][0]);},true); break;
        case 5: prodMissing.sort(function(a,b){return (a[1][1]-b[1][1]);}); break;
        case 6: prodMissing.sort(function(a,b){return (a[1][1]-b[1][1]);},true); break;
        case 7: prodMissing.sort(function(a,b){return (a[0]-b[0]);},true); break;
        }
        // creating table
        err_trace="type 0, table";
        newdiv.innerHTML="";
        var newtable=createElement("table",{"border":"0","cellspacing":"0","cellpadding":"0"},newdiv);
        var newtr=createElement("tr",{"class":"link"},newtable);
        newtr.addEventListener("click",function(){
            modeBuyNotepad=(modeBuyNotepad+1)%7;
            GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeBuyNotepad",modeBuyNotepad);
            doBuyNotepad();
        },false);
        newtr.addEventListener("mouseover",function(event){toolTip.show(event,"Sortingmode: "+["Producttype, id","Producttype, amount","Producttype, amount descending","amount","amount descending","value","value descending","id"][modeBuyNotepad]+"<br>Click to change");},false);
        var newtd=createElement("td",{"colspan":"4","style":"border-bottom:1px solid black;text-align:center;"},newtr,getText("missing"));

        var oldType=null;
        var newType=null;
        var help=0; //TODO review
        for(var i=0;i<prodMissing.length;i++){
            var prod=prodMissing[i][0];
            var amountForFarmis=valMinRackFarmis?((totalFarmis[0]&&totalFarmis[0][prod]?totalFarmis[0][prod]:0)-(prodStock[0]&&prodStock[0][prod]?prodStock[0][prod]:0)):0;
            var str='<table>';
            str += '<tr><th colspan="3" class="lightBg">'+getText("goToMarketOfX").replace(/%1%/,prodName[0][prod])+'</th></tr>';
            str += '<tr><td>'+getText("minRack")+'</td><td></td><td style="text-align:right;">'+numberFormat(prodMinRackInit[0][prod])+'</td></tr>';
            for(var k in totalQuest){
                if(!totalQuest.hasOwnProperty(k)){ continue; }
                if(totalQuest[k][0][prod]){
                    str += '<tr><td>'+getText("quest_"+k)+'</td><td>+</td><td style="text-align:right;">'+numberFormat(totalQuest[k][0][prod])+'</td></tr>'; 
                }
            }
            if(valMinRackRecursive&&totalRecursive[0]&&totalRecursive[0][prod]){ 
                str += '<tr><td>'+getText("recursive")+'</td><td>+</td><td style="text-align:right;">'+numberFormat(totalRecursive[0][prod])+'</td></tr>'; 
            }
            if(valMinRackFarmis&&totalFarmis[0]&&totalFarmis[0][prod]){ str += '<tr><td>'+unsafeWindow.customerarecalled.replace(/%FARMI%/,"")+'</td><td>+</td><td style="text-align:right;">'+numberFormat(totalFarmis[0][prod])+'</td></tr>'; }
            str += '<tr><td>'+getText("inventory")+'</td><td>-</td><td style="text-align:right;">'+numberFormat(prodStock[0][prod])+'</td></tr>';
            if(valMinRackGrowing){
                if(totalErnte[0][prod]){
                    amountForFarmis -= totalErnte[0][prod];
                    str += '<tr><td>'+getText("production")+'</td><td>-</td><td style="text-align:right;">'+numberFormat(totalErnte[0][prod])+'</td></tr>';
                }
                if(totalPowerups[prod]){
                    amountForFarmis -= totalPowerups[prod];
                    str += '<tr><td>'+getText("powerups")+'</td><td>-</td><td style="text-align:right;">'+numberFormat(totalPowerups[prod])+'</td></tr>';
                }
            }
            if(prodMinRackAddon[0][prod]){
                for(var k in prodMinRackAddon[0][prod]){
                    if(!prodMinRackAddon[0][prod].hasOwnProperty(k)){ continue; }
                    str += '<tr><td>'+k+'</td><td>'+(prodMinRackAddon[0][prod][k]>0?'+':'-')+'</td><td style="text-align:right;">'+numberFormat(prodMinRackAddon[0][prod][k])+'</td></tr>';
                }
            }
            str += '<tr><td colspan="3" style="border-bottom:1px solid black;"></td></tr>';
            str += '<tr><td>'+getText("marketPrice")+'</td><td></td><td style="text-align:right;">'+moneyFormat(gut[prod])+'</td></tr>';
            str += '<tr><td>'+getText("value")+'</td><td></td><td style="text-align:right;">'+moneyFormatInt(prodMissing[i][2])+'</td></tr>';
            if(prodRequire[0][prod]){
                str += '<tr><th colspan="3" class="lightBg">'+getText("requirementPerProduction")+'</th></tr>';
                for(j in prodRequire[0][prod]){
                    if(!prodRequire[0][prod].hasOwnProperty(j)){continue;}
                    if(prodRequire[0][prod][j][0]>-1){
                        str += '<tr><td>';
                        str += prodName[prodRequire[0][prod][j][0]][prodRequire[0][prod][j][1]];
                        str += '</td><td></td><td style="text-align:right;">'+numberFormat(prodRequire[0][prod][j][2])+'</td></tr>';
                    }
                }
                if(prodYield[0][prod]){
                    str += '<tr><th colspan="3" class="lightBg">'+getText("yieldPerProduction")+'</th></tr>';
                    str += '<tr><td>'+prodName[0][prod]+'</td><td></td><td style="text-align:right;">'+numberFormat(prodYield[0][prod])+'</td></tr>';
                }
            }
            str += '</table>';
            newType=prodTyp[0][prod];
            newtr=createElement("tr",{"class":"link hoverBgCc9"+((drawProductLines&&(oldType!=null)&&(oldType!=newType))?" borderTop1dashedBlack":""),"prod":prod,"mouseOverText":str},newtable);
            oldType=newType;
            newtr.addEventListener("click",function(){showMarket(this.getAttribute("prod"));},false);
            newtr.addEventListener("mouseover",function(event){toolTip.show(event,this.getAttribute("mouseOverText"));},false);
            newtd=createElement("td",{},newtr);
            produktPic(0,prod,newtd);
            createElement("td",{"style":"text-align:right;"},newtr,numberFormat(prodMissing[i][1]));
            if(amountForFarmis>0){
                createElement("td",{"style":"padding-left:3px;text-align:right;"},newtr,"("+numberFormat(amountForFarmis)+")");
            }else{
                createElement("td",{},newtr);
            }
            createElement("td",{"style":"padding-left:3px;"},newtr,prodName[0][prod]);
        }
        help=null;
        
        if(newtable.childElementCount==1){
            newtr=createElement("tr",{},newtable);
            createElement("td",{"colspan":"3","style":"text-align:center;"},newtr,"---");
        }

    /* rack type 1 (forestry) */
        err_trace="type 1";
        var newtr=createElement("tr",{},newtable);
        var newtd=createElement("td",{"colspan":"4","style":"border-bottom:1px solid black;text-align:center;width:100%;"},newtr);
        drawProductLines=false;
        prodMissing=new Array();
        // calculate missing products
        err_trace="type 1, missing products";
        for(var prod in prodMinRack[1]){
            if(!prodMinRack[1].hasOwnProperty(prod)){ continue; }
            var amount=prodMinRack[1][prod]-(prodStock[1][prod]?prodStock[1][prod]:0);
            if (amount>0){
                prodMissing.push([prod,amount,0]); //'0'==price
            }
        }
        // sorting
        err_trace="type 1, sorting";
        switch(modeBuyNotepad){
        case 0: drawProductLines=true;
        prodMissing.sort(function(a,b){
            if(prodTyp[1][a[0]]==prodTyp[1][b[0]]){
                return(a[0]-b[0]);
            }else{
                return({"c":0,"v":1,"e":2,"o":3,"fw1":4,"fw2":5,"fw3":6,"fw4":7,"z":8}[prodTyp[1][a[0]]]-{"c":0,"v":1,"e":2,"o":3,"fw1":4,"fw2":5,"fw3":6,"fw4":7,"z":8}[prodTyp[1][b[0]]]);
            }
        }); break;
        case 1: drawProductLines=true;
        prodMissing.sort(function(a,b){
            if(prodTyp[1][a[0]]==prodTyp[1][b[0]]){
                return(b[1][0]-a[1][0]);
            }else{
                return({"f1":0,"f2":1,"f3":2,"f4":3,"f5":4}[prodTyp[1][a[0]]]-{"f1":0,"f2":1,"f3":2,"f4":3,"f5":4}[prodTyp[1][b[0]]]);
            }
        }); break;
        case 2: drawProductLines=true;
        prodMissing.sort(function(a,b){
            if(prodTyp[1][a[0]]==prodTyp[1][b[0]]){
                return(a[1][0]-b[1][0]);
            }else{
                return({"f1":0,"f2":1,"f3":2,"f4":3,"f5":4}[prodTyp[1][a[0]]]-{"f1":0,"f2":1,"f3":2,"f4":3,"f5":4}[prodTyp[1][b[0]]]);
            }
        }); break;
        case 3: prodMissing.sort(function(a,b){return (a[1][0]-b[1][0]);}); break;
        case 4: prodMissing.sort(function(a,b){return (a[1][0]-b[1][0]);},true); break;
        case 5: prodMissing.sort(function(a,b){return (a[1][1]-b[1][1]);}); break;
        case 6: prodMissing.sort(function(a,b){return (a[1][1]-b[1][1]);},true); break;
        case 7: prodMissing.sort(function(a,b){return (a[0]-b[0]);},true); break;
        }
        //prodMissing.sortObj();
        err_trace="type 1, table";
        oldType=null;
        newType=null;
        for(var i=0;i<prodMissing.length;i++){
            var prod=prodMissing[i][0];
            var amountForForestryFarmis=valMinRackForestryFarmis?((totalFarmis[1]&&totalFarmis[1][prod]?totalFarmis[1][prod]:0)-(prodStock[1]&&prodStock[1][prod]?prodStock[1][prod]:0)):0;

            var str='<table>';
            str += '<tr><th colspan="3" class="lightBg">'+prodName[1][prod]+'</th></tr>';
            str += '<tr><td>'+getText("minRack")+'</td><td></td><td style="text-align:right;">'+numberFormat(prodMinRackInit[1][prod])+'</td></tr>';
            if(totalQuest["main"]&&totalQuest["main"][1][prod]){ 
                str += '<tr><td>'+getText("quest_farm")+'</td><td>+</td><td style="text-align:right;">'+numberFormat(totalQuest["main"][1][prod])+'</td></tr>'; 
            }
            if(totalQuest["forestry"]&&totalQuest["forestry"][1][prod]){
                str += '<tr><td>'+getText("quest_forestry")+'</td><td>+</td><td style="text-align:right;">'+numberFormat(totalQuest["forestry"][1][prod])+'</td></tr>';
            }
            if(valMinRackRecursive&&totalRecursive[1]&&totalRecursive[1][prod]){ str += '<tr><td>'+getText("recursive")+'</td><td>+</td><td style="text-align:right;">'+numberFormat(totalRecursive[1][prod])+'</td></tr>'; }
            if(valMinRackForestryFarmis&&totalFarmis[1]&&totalFarmis[1][prod]){ str += '<tr><td>'+unsafeWindow.customerarecalled.replace(/%FARMI%/,"")+'</td><td>+</td><td style="text-align:right;">'+numberFormat(totalFarmis[1][prod])+'</td></tr>'; }
            str += '<tr><td>'+getText("inventory")+'</td><td>-</td><td style="text-align:right;">'+numberFormat(prodStock[1][prod])+'</td></tr>';

            if(valMinRackGrowing){
                if(totalErnte[1][prod]){
                    amountForForestryFarmis -= totalErnte[1][prod];
                    str += '<tr><td>'+getText("production")+'</td><td>-</td><td style="text-align:right;">'+numberFormat(totalErnte[1][prod])+'</td></tr>';
                }
            }
            if(prodMinRackAddon[1][prod]){
                for(var k in prodMinRackAddon[1][prod]){
                    if(!prodMinRackAddon[1][prod].hasOwnProperty(k)){ continue; }
                    str += '<tr><td>'+k+'</td><td>'+(prodMinRackAddon[1][prod][k]>0?'+':'-')+'</td><td style="text-align:right;">'+numberFormat(prodMinRackAddon[1][prod][k])+'</td></tr>';
                }
            }
            if(prodRequire[1][prod]){
                str += '<tr><th colspan="3" class="lightBg">'+getText("requirementPerProduction")+'</th></tr>';
                for(j in prodRequire[1][prod]){
                    if(!prodRequire[1][prod].hasOwnProperty(j)){continue;}
                    if(prodRequire[1][prod][j][0]>-1){
                        str += '<tr><td>';
                        str += prodName[prodRequire[1][prod][j][0]][prodRequire[1][prod][j][1]];
                        str += '</td><td></td><td style="text-align:right;">'+numberFormat(prodRequire[1][prod][j][2])+'</td></tr>';
                    }
                }
            }
            if(prodYield[1][prod]){
                str += '<tr><th colspan="3" class="lightBg">'+getText("yieldPerProduction")+'</th></tr>';
                str += '<tr><td>'+prodName[1][prod]+'</td><td></td><td style="text-align:right;">'+numberFormat(prodYield[1][prod])+'</td></tr>';
            }
            str += '</table>';

            newType=prodTyp[1][prod];
            newtr=createElement("tr",{"class":"hoverBgCc9"+((drawProductLines&&(oldType!=null)&&(oldType!=newType))?" borderTop1dashedBlack":""),"iProd":prod,"mouseOverText":str,"style":(prodBlock[1][prod].match(/b/)?"color:red;":"")},newtable);//TODO color
            oldType=newType;
            newtr.addEventListener("mouseover",function(event){toolTip.show(event,this.getAttribute("mouseOverText"));},false);
            newtd=createElement("td",{},newtr);
            produktPic(1,prod,newtd);
            createElement("td",{"style":"text-align:right;"+(prodBlock[1][prod].match(/[lq]/)&&prodBlock[1][prod].match(/t/)?"color:red;":"")},newtr,numberFormat(prodMissing[i][1]));
            if(amountForForestryFarmis>0){
                createElement("td",{"style":"padding-left:3px;text-align:right;"+(prodBlock[1][prod].match(/[lq]/)&&prodBlock[1][prod].match(/t/)?"color:red;":"")},newtr,"("+numberFormat(amountForForestryFarmis)+")");
            }else{
                createElement("td",{},newtr);
            }
            createElement("td",{"style":"padding-left:3px;"+(prodBlock[1][prod].match(/[lq]/)&&prodBlock[1][prod].match(/t/)?"color:red;":"")},newtr,prodName[1][prod]);
        }

        if(newtable.childElementCount==2){
            newtr=createElement("tr",{},newtable);
            createElement("td",{"colspan":"4","style":"text-align:center;"},newtr,"---");
        }
        newtable=null;newtr=null;newtd=null;
    }
    newdiv=null;
}catch(err){ GM_logError("doBuyNotepad ("+err_trace+")\nprod="+prod+" \n"+err); }       
}
function doMarketoffersNotepad(){
    try{
        if(!show["marketoffersNotepad"]){ return false; } // no calculation if table is hidden
        var newdiv=$("marketoffersNotepad");
        if(newdiv){
            newdiv.innerHTML="";
            var newtable=createElement("table",{"border":"0","cellspacing":"0","cellpadding":"0"},newdiv);
            var newtr=createElement("tr",{"class":"link"},newtable);
            var newtd=createElement("td",{"colspan":"5","style":"border-bottom:1px solid black;text-align:center;"},newtr,getText("marketstall"));
            newtr.addEventListener("mouseover",function(event){
                var str='<table>';
                str += '<tr><th colspan="2" class="lightBg">'+getText("goToMarketstall")+'</th></tr>';
                str += '<tr><td>'+sign_sum+'</td><td style="text-align:right;">'+moneyFormatInt(parseInt(this.getAttribute("value"),10))+'</td></tr>';
                str += '</table>';
                toolTip.show(event,str);
            },false);
            newtr.addEventListener("click",function(){showMarketStall();},false);

            var sumTotal=0;
            var oldType=null;
            var newType=null;
            for(var i=0;i<ownMarketOffers.length;i++){
                var prod=ownMarketOffers[i][0];
                var price=ownMarketOffers[i][1];
                var amount=ownMarketOffers[i][2];
                newType=prodTyp[0][prod];
                sumTotal += amount*price;
                newtr=createElement("tr",{"class":"link hoverBgCc9"+(((oldType!=null)&&(oldType!=newType))?" borderTop1dashedBlack":""),"prod":prod,"value":(amount*price)},newtable);
                oldType=newType;
                newtr.addEventListener("mouseover",function(event){
                    showGoToMarketToolTip(event,this.getAttribute("prod"),null,'<tr><td>'+sign_sum+'</td><td style="text-align:right;">'+moneyFormatInt(parseInt(this.getAttribute("value"),10))+'</td></tr>');
                },false);
                newtr.addEventListener("click",function(){showMarket(this.getAttribute("prod"));},false);
                newtd=createElement("td",{},newtr);
                produktPic(0,prod,newtd);
                createElement("td",{"style":"text-align:right;"},newtr,numberFormat(amount));
                createElement("td",{"style":"padding-left:3px;"},newtr,prodName[0][prod]);
                createElement("td",{"style":"padding-left:3px;text-align:right;"},newtr,numberFormat(Math.floor(price)));
                createElement("td",{"style":""},newtr,numberFormat(price,2).slice(-3).replace("00","--"));
            }

            newtable.firstElementChild.setAttribute("value",sumTotal);
            if(newtable.childElementCount==1){
                newtr=createElement("tr",{},newtable);
                createElement("td",{"colspan":"5","style":"text-align:center;"},newtr,"---");
            }
            newtable=null;newtr=null;newtd=null;
        }
        newdiv=null;
    }catch(err){ GM_logError("doMarketoffersNotepad\nprod="+prod+"\n"+err); }
    }
function doRack(){
    try{
        var cand=$("rackItems").getElementsByClassName("tklein2");
        for(var v=0;v<cand.length;v++){
            var currProd=parseInt(cand[v].parentNode.id.replace("rackitem",""),10);
            var cell=$(cand[v].parentNode.id+"format");
            if(!cell){
                cell=cand[v].parentNode.parentNode;
                cell.setAttribute("class",(cell.getAttribute("class")+" link").replace(/(^|\s+)link\s+/g," ").replace(/^\s+/,""));
                cand[v].style.display="none";
                cell=createElement("div",{"id":"rackitem"+currProd+"format"},cand[v].parentNode);
            }
            var str=numberFormatPrefixed(prodStock[0][currProd]);
            if(cell.innerHTML!=str){ cell.innerHTML=str; }
            str=cand[v].getAttribute("class")+(prodStock[0][currProd]<prodMinRack[0][currProd]?" lowrack":""); // .replace("tklein2","formattedRackItem")
            if(cell.getAttribute("class")!=str){ cell.setAttribute("class",str); }
            cell=null;
        }
        cand=null;
    }catch(err){ GM_logError("doRack\nv="+v+"\n"+err); }
}
function doFarmis(){
    try{
    if(DEVMODE_FUNCTION){ var trackingHandle = tracking.start("berater","doFarmis"); }
        var err_trace="init";
        // GM_log("farmiLog=\n"+print_r(farmiLog,"",true,"\n"));
        // TODO: Questproduct is not calculated in at first run. Fixed now I believe
        // this can't go in the above loop because the amountMinRack are needed to be calculated first
        var missing,belowMinRack,belowMinRackInit;
        for(var farmiNr=0;farmiNr<$("customerline").childElementCount;farmiNr++){
            missing=0;belowMinRack=0;belowMinRackInit=false;
            for(var i=1;i<=7;i++){ // 7=max-amount of products per farmi
                var pid=unsafeWindow.farmisinfo[0][farmiNr]["p"+i];
                var amount=parseInt(unsafeWindow.farmisinfo[0][farmiNr]["a"+i],10);
                if((pid > 0) && (amount > 0)){
                    if(prodStock[0][pid]<amount){ missing++; }
                    if((prodStock[0][pid]-amount)<prodMinRack[0][pid]-((valMinRackFarmis&&totalFarmis[0]&&totalFarmis[0][pid])?totalFarmis[0][pid]:0)){ belowMinRack++; }
                    if((prodStock[0][pid]-amount)<prodMinRackInit[0][pid]){ belowMinRackInit++; }
                }
            }
            unsafeWindow.farmisinfo[0][farmiNr]["missing"]=missing;
            unsafeWindow.farmisinfo[0][farmiNr]["belowMinRack"]=belowMinRack;
            unsafeWindow.farmisinfo[0][farmiNr]["belowMinRackInit"]=belowMinRackInit;
        }
        missing=null;belowMinRack=null;belowMinRackInit=null;
        var cell,customerline,str;
        if(customerline=$("customerline")){
            err_trace="customerline";
            for(var farmiNr=0;farmiNr<customerline.childElementCount;farmiNr++){
                if (!$("farmiInfo"+farmiNr)){ // assure that this code is run only once per farmi. else eventlisteners are stacked
                    // prepare the additional farmi-info-bubble
                    createElement("div",{"id":"farmiInfo"+farmiNr,"class":"farmiInfo"},$("blase"+farmiNr));
                    createElement("div",{"id":"farmiMiniInfo"+farmiNr,"class":"farmiMiniInfo"},$("kunde_"+farmiNr));
                    //createElement("div",{"id":"farmiInfo"+farmiNr,"style":"position:absolute;height:35px;top:-47px;border-radius:5px;padding:5px;color:black;font-size:0.8em;"},$("blase"+farmiNr));
                    //createElement("div",{"id":"farmiMiniInfo"+farmiNr,"style":"position:absolute;top:45px;right:15px;height:7px;width:7px;display:block;border-radius:5px;"},$("kunde_"+farmiNr));
                    // fill the bubble when shown
                    $("kunde_"+farmiNr).addEventListener("mouseover",function(event){
                        var farmiNr=this.id.replace("kunde_","");
                        // toolTip.show(event,print_r(unsafeWindow.farmisinfo[0][farmiNr],"",true));
                        var cash=parseFloat(unsafeWindow.farmisinfo[0][farmiNr]["price"],10);
                        var wert = parseFloat(unsafeWindow.farmisinfo[0][farmiNr]["marketValue"],10);
                        var cell=$("blase"+farmiNr).firstElementChild.firstElementChild;
                        var ppid, amount;
                        for(var i=1;i<=7;i++){ // 7=maxanzahl produkte pro farmi
                            if(cell.style.clear=="both"){ // line break after 4 products
                                cell=cell.nextElementSibling;
                                if(!cell){ break; }
                            }
                            pid=unsafeWindow.farmisinfo[0][farmiNr]["p"+i];
                            amount=parseInt(unsafeWindow.farmisinfo[0][farmiNr]["a"+i],10);
                            if((pid>0)&&(amount>0)){
                                if(prodStock[0][pid]<amount){
                                    // not enough in rack
                                    cell.setAttribute("style",css_styles["prod_border_missing"][1]+"overflow:hidden; margin-right:2px; marign-bottom:2px; float:left; width:15px; height:15px;border-radius:4px;");
                                }else if(prodStock[0][pid]-amount<prodMinRack[0][pid]-((valMinRackFarmis&&totalFarmis[0]&&totalFarmis[0][pid])?totalFarmis[0][pid]:0)){
                                    // selling this farmi will push the rack below the min-value
                                    cell.setAttribute("style",css_styles["prod_border_lowamount"][1]+"overflow:hidden; margin-right:2px; marign-bottom:2px; float:left; width:15px; height:15px;border-radius:4px;");
                                }else{
                                    cell.style.border="1px solid white";
                                    //css_styles["prod_border_none"][[],"1px solid white","1px solid white"];
                                    //cell.setAttribute("style",css_styles["prod_border_none"][1]+"overflow:hidden; margin-right:2px; marign-bottom:2px; float:left; width:15px; height:15px;border-radius:4px;");
                                }
                            }
                            cell=cell.nextElementSibling;
                            if(!cell){ break; }
                        }
                        cell=$("farmiInfo"+farmiNr);
                        if(!unsafeWindow.farmisinfo[0][farmiNr]["costQuotient"]){
                            // a price is missing. can't calculate, so display white
                            cell.innerHTML=moneyFormatInt(cash);
                            cell.setAttribute("style",css_styles["cloud_back_noprice"][1]+css_styles["cloud_border_noprice"][1]);
                        }else if(unsafeWindow.farmisinfo[0][farmiNr]["costQuotient"]<valFarmiLimits[0]){
                            // low case
                            cell.innerHTML=moneyFormatInt(cash)+"<br>"+numberFormat(unsafeWindow.farmisinfo[0][farmiNr]["costQuotient"],1)+"&nbsp;%<br>"+moneyFormatInt(cash-wert)+"&nbsp;|&nbsp;"+moneyFormatInt(cash-0.9*wert);
                            cell.setAttribute("style",css_styles["cloud_back_below"][1]+css_styles["cloud_border_below"][1]);
                        }else if(unsafeWindow.farmisinfo[0][farmiNr]["costQuotient"]<valFarmiLimits[1]){
                            // middle case
                            cell.innerHTML=moneyFormatInt(cash)+"<br>"+numberFormat(unsafeWindow.farmisinfo[0][farmiNr]["costQuotient"],1)+"&nbsp;%<br>"+moneyFormatInt(cash-wert)+"&nbsp;|&nbsp;+"+moneyFormatInt(cash-0.9*wert);
                            cell.setAttribute("style",css_styles["cloud_back_between"][1]+css_styles["cloud_border_between"][1]);
                        }else{
                            // high case
                            cell.innerHTML=moneyFormatInt(cash)+"<br>"+numberFormat(unsafeWindow.farmisinfo[0][farmiNr]["costQuotient"],1)+"&nbsp;%<br>+"+moneyFormatInt(cash-wert)+"&nbsp;|&nbsp;+"+moneyFormatInt(cash-0.9*wert);
                            cell.setAttribute("style",css_styles["cloud_back_above"][1]+css_styles["cloud_border_above"][1]);
                        }
                        cell=null;
                    },false);
                    // farmi is new=not in the FarmiLog
                    var farmi_id=parseInt(unsafeWindow.farmisinfo[0][farmiNr]["id"],10);                    
                    var farmiLog_id=farmiLog.length;
                    for(var v=0;v<farmiLog.length;v++){
                        if (farmiLog[v][0]==farmi_id){
                            farmiLog_id=v;
                            break;
                        }
                    }
                    if (farmiLog_id==farmiLog.length){
                        raiseEvent("gameFarmiNew");
                        //todayStr=getDateStr(now,2,false);
                        // add this new farmi
                        farmiLog.push([farmi_id,todayStr,parseFloat(unsafeWindow.farmisinfo[0][farmiNr]["price"],10),{}]);
                        for(var w=1;w<8;w++){
                            if (unsafeWindow.farmisinfo[0][farmiNr]["p"+w]!="0"){
                                farmiLog[farmiLog_id][3][unsafeWindow.farmisinfo[0][farmiNr]["p"+w]]=parseInt(unsafeWindow.farmisinfo[0][farmiNr]["a"+w],10);
                            }
                        }
                        levelLog[levelLogId][5]+=farmiLog[farmiLog_id][2];
                        levelLog[levelLogId][5]=Math.round(100*levelLog[levelLogId][5])/100;
                        // sorting
                        farmiLog.sort(function(a,b){return (getTime(b[1])-getTime(a[1]));});
                        // saving
                        GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_farmiLog",implode(farmiLog));
                        GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_levelLog",implode(levelLog));
                        window.setTimeout(doBuyNotepad,0);
                    }
                }
                if(valFarmiMiniInfo){
                    // Price
                    if(!unsafeWindow.farmisinfo[0][farmiNr]["costQuotient"]){ // unknown case
                        str = css_styles["farmi_price_unknown"][1];
                    }else if(unsafeWindow.farmisinfo[0][farmiNr]["costQuotient"]<valFarmiLimits[0]){ // low case
                        str = css_styles["farmi_price_low"][1];
                    }else if(unsafeWindow.farmisinfo[0][farmiNr]["costQuotient"]<valFarmiLimits[1]){ // middle case
                        str = css_styles["farmi_price_between"][1];
                    }else{ // high case
                        str = css_styles["farmi_price_above"][1];
                    }
                    // Rackamount
                    if(unsafeWindow.farmisinfo[0][farmiNr]["missing"]>0){
                        str += ' '+ css_styles["farmi_amount_missing"][1];
                    }else if(unsafeWindow.farmisinfo[0][farmiNr]["belowminvalue"]>0){
                        str += ' '+ css_styles["farmi_amount_low"][1];
                    }else{
                        str += ' '+ css_styles["farmi_amount_above"][1];
                    }
                    
                    cell=$("farmiMiniInfo"+farmiNr);
                    if(cell.getAttribute("style")!=str){ cell.setAttribute("style",str); }
                }
            }
            err_trace="alertAdvertEnd";
            if((unsafeWindow.customerstats)&&(unsafeWindow.customerstats["adstart"])&&(unsafeWindow.adrun)){
               var endDay = getDateStr(getTime(unsafeWindow.customerstats["adstart"])+4*86400-1);
                if((unsafeWindow.customerstats[endDay])&&(parseInt(unsafeWindow.customerstats[endDay]["count"],10)>=(farmiDailyCount+2*unsafeWindow.adrun))){
                    if(!(cell=$("alertAdvertEnd"))){
                        createElement("div",{"id":"alertAdvertEnd","style":"position:absolute;top:65px;left:0;color:white;font-weight:bold;background-color:red;padding:2px;white-space:nowrap;"},$("customerstats"),getText("advertisingEnds"));
                        window.setTimeout(function(){
                            var newdiv;
                            if(newdiv=$("alertAdvertEnd")){ removeElement(newdiv); }
                            newdiv=null;
                        },1000*(getTime(getDateStr(now,2,false))+86400-now)); // time till midnight
                    }
                }else{
                    if(cell=$("alertAdvertEnd")){ removeElement(cell); }
                }
                endDay = null;
            }else{
                if(cell=$("alertAdvertEnd")){ removeElement(cell); }
            }
        }else{
            err_trace="no customerline";
            if(cell=$("alertAdvertEnd")){ removeElement(cell); }
        }
        cell=null;str=null;
    if(DEVMODE_FUNCTION){ tracking.end("berater",trackingHandle); }
    }catch(err){ GM_logError("doFarmis ("+err_trace+")\n"+err); }
}

function do_main(){
try{
    function calcObservedPrice(mode,data){
        // data=[[amount1,price1],[amount2,price2],...]
        switch(mode){
        case 1:{ // normal mode. fast market
            data=data.clone();
            // kick upper 20% quantile
            var sum=0;
            for(var v=0;v<data.length;v++){
                sum += data[v][0];
            }
            sum=Math.floor(0.2*sum);
            for(var v=data.length-1;0<=v;v--){
                if(data[v][0]<sum){
                    sum -= data[v][0];
                    data.splice(v,1);
                }else{
                    data[v][0] -= sum;
                    sum=0;
                    break;
                }
            }
    
            // calc weighted mean
            var weights=[3,3,3,3,2,2,2,2,1,1,1,1];
            var count1=0;
            var count2=0;
            for(var v=0;v<data.length;v++){
                if (weights[v]!=undefined){
                    count1 += weights[v]*data[v][0]*data[v][1];
                    count2 += weights[v]*data[v][0];
                }
            }
            if(count2>0){
                return (Math.round(100*count1/count2)/100);
            }else{
                return 0;
            }
        break;}
        case 2:{ // decorations. slow market
            if(data.length>1){
                return data[1][1];
            }else if(data.length==1){
                return data[0][1];
            }else{
                return 0;
            }
        break;}
        }
    }
    
    var err_trace="Session";
    if(DEVMODE){ logBubble.add("Berater started"); }
    // Check if username is known
    if (!USERNAME){
        GM_log("Username is not known. Login again with running script.")
        location.href="http://www."+GAMEPAGES[COUNTRY]+"/login.php?start=1";
        return false;
    }
    // Check if browser is uptodate
    var newdiv,newdiv1,container,help;
    if(!createElement("div").children){
        newdiv=createElement("div",{"class":"alertbubble tbig link"},ALL,"Your browser could be too old.<br>This script uses functions which need Gecko&nbsp;1.9.1 (Firefox&nbsp;3.5).<br>You will get errors.");
        newdiv.addEventListener("click",function(){ removeElement(this); },false);
    }
    // Save session-id
    if (unsafeWindow.rid){  GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_session",unsafeWindow.rid); }
    // Show changelog of new version
    err_trace="Changelog of new version";
    if(CHANGELOG[CHANGELOG.length-1][0]!=GM_getValue("changelogShownVersion","")){
        container=createElement("div");
        createElement("div",{},container,getText("confirmChangelogVersion").replace("%1%",CHANGELOG[CHANGELOG.length-1][0]));
        newdiv=createElement("ul",{},container);
        for(var i=0;i<CHANGELOG[CHANGELOG.length-1][2].length;i++){
            createElement("li",{},newdiv,CHANGELOG[CHANGELOG.length-1][2][i][LANGUAGE=="de"?0:1]);
        }
        alert2(container.innerHTML,getText("ok"),getText("showChangelog"),
        function(){
            GM_setValueCache("changelogShownVersion",CHANGELOG[CHANGELOG.length-1][0]);
        },
        function(){
            GM_setValueCache("changelogShownVersion",CHANGELOG[CHANGELOG.length-1][0]);
            unsafeWindow.buildInfoPanel("changelog");
        });
    }
            
    // Container Divs
    err_trace="Container";
    var nodes=new Object();
    ALL.style.margin="5px";
    var upjersToolbarHeight=($("uptoolbar")&&$("uptoolbar").style.display!="none")?30:0;
    var content_table=document.getElementsByClassName("content_table")[0];
    container=createElement("div",{"id":"gameArea","align":"center","style":"margin-top:"+upjersToolbarHeight+"px;"},ALL);
    newdiv=createElement("div",{"id":"divBeraterButtons","style":"position:fixed;left:0;top:"+(upjersToolbarHeight+50)+"px;width:40px;border:1px groove #4D240E;border-radius:0 10px 10px 0;z-index:500;background:url(\""+GFX+"guild/help_back.jpg\") -25px -25px;"},container);
    newdiv.addEventListener("mouseover",function(event){
        var node=event.target;
        var mouseOverText=node.getAttribute("mouseOverText");
        while((node!=this)&&(!mouseOverText)){
            node=node.parentNode;
            mouseOverText=node.getAttribute("mouseOverText");
        }
        if(mouseOverText){ toolTip.show(event,mouseOverText); }
        node=null;mouseOverText=null;
    },false);
    newdiv1=createElement("div",{"id":"divBeraterButtonsOptionen","class":"link beraterButtonIcon hoverBgGreen","mouseOverText":getText("options")},newdiv);
    createElement("img",{"src":IMAGES["settings"],"style":"position:relative;top:-3px;left:-1px;;width:32px;height:32px;"},newdiv1);
    newdiv1.addEventListener("click",function(){ unsafeWindow.buildInfoPanel("menu","options"); },false);
    newdiv1=createElement("div",{"id":"divGame","style":"position:relative;top:0;margin-left:45px;"},container);
    newdiv1.appendChild(content_table);
    if(newdiv=document.querySelector('a[href="https://de.upjers.com/imprint"]')){
        newdiv=newdiv.parentNode;
        container.appendChild(newdiv);
        newdiv.style.position="relative";
        newdiv.style.top=0;
        newdiv.style.left=0;
        newdiv.style.margin=0;
    }   
    content_table.style.position = "relative";
    createElement("div",{"id":"statisticArea","align":"center","style":"margin-top:"+upjersToolbarHeight+"px;display:none;"},ALL);
    if (window.innerWidth<1180){ content_table.style.paddingRight="176px"; }
    if (window.innerHeight>830){ ALL.style.overflowY="hidden"; }
    if(newdiv=$("errorboxgarden")){
        newdiv.style.left="600px";
        newdiv.style.top="105px";
    }else if(DEVMODE){
        GM_logWarning("#errorboxgarden not found");
    }
    if(newdiv=$("popup_garden")){
        newdiv.style.top="";
    }else if(DEVMODE){
        GM_logWarning("#popup_garden not found");
    }

    err_trace="Container - divRightBorder - divMiddleBorder";
    newdiv1=$("questbarcontrol").parentNode;
    removeElement(newdiv1.firstElementChild);
    newdiv=createElement("div",{"id":"divRightBorder"},newdiv1);
    if(container=$("gamearea_spacer")){
        container.innerHTML="";
        container=createElement("div",{"id":"divMiddleBorder","style":"position:relative;height:100%;"},container);
        for(var i=0;i+1<newdiv1.childElementCount;){
            if(newdiv1.children[i].id.match(/questbarcontrol|farm_production_checker_icon/)){
                newdiv.appendChild(newdiv1.children[i]);
            }else{
                container.appendChild(newdiv1.children[i]);
            }
        }
    }

    err_trace="Container - fixedDivRight";
    newdiv=createElement("div",{"id":"fixedDivRight","style":"position:fixed;right:0;top:"+(upjersToolbarHeight)+"px;z-index:500;"},$("divGame"));
    createElement("div",{"id":"timeHolder"},newdiv);
    nodes["containerPowerupSymbols"]=new Object();
    nodes["containerPowerupSymbols"]["node"]=createElement("div",{"id":"containerPowerupSymbols"},newdiv);
    
    err_trace="Container - headercontainer";
    newdiv=createElement("div",{"style":"position:absolute;top:2px;left:210px;color:#f7bb87;z-index:10;"},$("headercontainer"));
    nodes["serverTime"]=new Object();
    nodes["serverTime"]["node"]=createElement("div",{"id":"serverTime","style":"float:left;margin-left:2px;"},newdiv);
    nodes["serverTime"]["node"].addEventListener("mouseover",function(event){ toolTip.show(event,getText("serverTime")); },false);
    function do_relogin(){
        window.setTimeout(function(){
            var help=explode(GM_getValue(COUNTRY+"_pagedataLogin","{}"),"clickListener@divSessionEnd/pagedataLogin",{});
            if(!(help["doserver"]&&(typeof help["doserver"]=="object"))){
                help["doserver"]=new Object();
            }
            help["doserver"][SERVER]=true;
            GM_setValue(COUNTRY+"_pagedataLogin",implode(help));
            if($("logoutbutton")){
                click($("logoutbutton"));
            } else {
                location.href="http://www."+GAMEPAGES[COUNTRY]+"/login.php?start=1";
            }
        },0);
    }
    nodes["sessionTimeLeft"]=new Object();
    nodes["sessionTimeLeft"]["node"]=createElement("div",{"id":"sessionTimeLeft","class":"link","style":"float:left;margin-left:2px;"},newdiv);
    nodes["sessionTimeLeft"]["node"].addEventListener("mouseover",function(event){ toolTip.show(event,getText("sessionEnd").replace(/%1%/,getDaytimeStr(valSessionEndtime))); },false);
    nodes["sessionTimeLeft"]["node"].addEventListener("click",do_relogin,false);
    nodes["sessionTimeNow"]=new Object();
    nodes["sessionTimeNow"]["node"]=createElement("div",{"id":"sessionTimeNow","style":"float:left;margin-left:2px;"},newdiv);
    nodes["sessionTimeNow"]["node"].addEventListener("mouseover",function(event){ toolTip.show(event,getText("localTime")); },false);

    USERLEVEL=parseInt(unsafeWindow.currentuserlevel,10);
    /*
    var new_PRODUCT2BUILDING=PRODUCT2BUILDING.clone();
    new_PRODUCT2BUILDING[0][154]=1;
    GM_log(implode(new_PRODUCT2BUILDING));
    */
    show=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_show","{}"),"do_main/show",{}); // buyNotepad,marketoffersNotepad
    if((typeof show!="object")||(show instanceof Array)){ show = new Object(); }
    questData=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_questData"),"questData",INIT_questData);
    if((typeof questData!="object")||(questData instanceof Array)){ questData = INIT_questData.clone(); }
    // Check structure of questData
    for(var t in questData){
        if(!questData.hasOwnProperty(t)){continue;}
        if(INIT_questData[t]){
            for(var c in questData[t]){
                if(!questData[t].hasOwnProperty(c)){continue;}
                if(!INIT_questData[t][c]){ delete questData[t][c]; }
            }
        }else{
            delete questData[t];
        }
    }
    for(var t in INIT_questData){
        if(!INIT_questData.hasOwnProperty(t)){continue;}
        if(questData[t]){ 
            for(var c in INIT_questData[t]){
                if(!INIT_questData[t].hasOwnProperty(c)){continue;}
                if(!questData[t][c]){ questData[t]=INIT_questData[t]; }
            }
        }else{
            questData[t]=INIT_questData[t];
        }
    }
    // Check quest requirements
    if(USERLEVEL<31){ questData["main"]["2"]["nr"]=-1; }
    if(USERLEVEL<20){ questData["forestry"]["1"]["nr"]=-1; }
    if(questData["forestry"]["1"]["nr"]<35){ questData["forestry"]["2"]["nr"]=-1; }
    if(USERLEVEL<12){ questData["foodworld"]["1"]["nr"]=-1; }
    unsafeData.questData=questData.clone();

    for(var t in questData){
        if(!questData.hasOwnProperty(t)){continue;}
        for(var c in questData[t]){
            if(!questData[t].hasOwnProperty(c)){continue;}
            if((0<questData[t][c]["calcTo"])&&(questData[t][c]["calcTo"]<questData[t][c]["nr"])){
                setCalcToQuest(t,c,questData[t][c]["nr"]);
            }
        }
    }
    valServerTimeOffset=GM_getValue(COUNTRY+"_valServerTimeOffset",0);
    todayStr=getDateStr(now,2,false);
    nowServerOff=unsafeWindow.Zeit.Server+valServerTimeOffset;
    todayServerStr=getDateStr(nowServerOff,2,false);

    buyNotePadShowBlocked=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_buyNotePadShowBlocked",false);//TODO make option
    loadProductData();
    updateProductDataFarm();
    updateProductDataForestry();
    updateProductDataWindmill();
    updateProductDataPowerup();

    err_trace="Show Data";
    // SHOW DATA: BUILDING_INPUT
    /*
    for(var zone=0;zone<BUILDING_INPUT.length;zone++){
        if(!BUILDING_INPUT[zone]){continue;}
        for(var output in BUILDING_INPUT[zone]){
        if(!BUILDING_INPUT[zone].hasOwnProperty(output)){continue;}
            for(var alt=0;alt<BUILDING_INPUT[zone][output].length;alt++){
                var str="Zone "+zone+": ";
                for(var input=0;input<BUILDING_INPUT[zone][output][alt].length;input++){
                    if(input>0){ str+=", "; }
                    str+=numberFormat(BUILDING_INPUT[zone][output][alt][input][1])+" "+prodName[0][BUILDING_INPUT[zone][output][alt][input][0]]
                }
                str+=" -> "+prodName[0][output];
                GM_log(str);
            }
        }
    }   
    */

/*  
        var div=createElement("div",{"style":"z-index:950;position:fixed;top:0;background-color:white;height:800px;overflow:auto;padding-right:40px;"},ALL);
        var newimg=createElement("img",{"class":"link","src":GFX+"close.jpg","style":"position:absolute;top:8px;right:0px;width:20px;height:20px;"},div);
        newimg.addEventListener("click",function(){ removeElement(this.parentNode); },false);

        var tr,td,table=createElement("table",{"border":"1"},div);
        for(var campaign in QUESTS["forestry"]){
        if(!QUESTS["forestry"].hasOwnProperty(campaign)){continue;} 
            for(var v=1;v<QUESTS["forestry"][campaign].length;v++){
                tr = createElement("tr",{},table);
                if(questData["forestry"][campaign]["nr"]==v){ tr.style.backgroundColor="#FBB"; }
                createElement("td",{},tr,campaign);
                createElement("td",{},tr,v);
                for(var w=0;w<6;w++){
                    td = createElement("td",{"style":"white-space:nowrap;"},tr);
                    if(QUESTS["forestry"][campaign][v][0][w]){
                        produktPic(QUESTS["forestry"][campaign][v][0][w][0],QUESTS["forestry"][campaign][v][0][w][1],td);
                        createElement("span",{},td,numberFormat(QUESTS["forestry"][campaign][v][0][w][2]));
                        td.setAttribute("mouseovertext",numberFormat(QUESTS["forestry"][campaign][v][0][w][2])+" "+prodName[QUESTS["forestry"][campaign][v][0][w][0]][QUESTS["forestry"][campaign][v][0][w][1]]);
                        td.addEventListener("mouseover",function(event){ toolTip.show(event,this.getAttribute("mouseovertext")); },false);
                    }
                }
                createElement("td",{},tr,QUESTS["forestry"][campaign][v][1]);
                td=createElement("td",{},tr);
                    if(QUESTS["forestry"][campaign][v][2]){ pointsFormat(QUESTS["forestry"][campaign][v][2],"div",td); }
                td=createElement("td",{},tr);
                    if(QUESTS["forestry"][campaign][v][3]){ createElement("div",{},td,implode(QUESTS["forestry"][campaign][v][3])); }
            }
        }
        div=null;newimg=null;
        table=null;tr=null;td=null;
    });
*/
    // SHOW BUILDING DATA
    GM_registerMenuCommand(getText("adviser")+" "+"Show Data: Buildings", function(){
    try{
        var container=createElement("div",{"style":"z-index:995;position:absolute;top:0;left:0;background-color:white;height:100%;"},ALL);
        var div=createElement("img",{"class":"link","src":GFX+"close.jpg","style":"position:absolute;top:0;right:0;width:20px;height:20px;margin:5px;"},container);
        div.addEventListener("click",function(){ removeElement(this.parentNode); },false);
        div=createElement("div",{"style":"height:100%;padding-right:20px;margin-right:30px;overflow:auto;"},container);
        var table=createElement("table",{"border":"1"},div);
        var tr=createElement("tr",{},table);
        var td;
        createElement("th",{},tr);
        for(var w=1;w<unsafeWindow.buildinginfos[0][1].length;w++){
            createElement("th",{},tr,w);
        }
        createElement("th",{},tr,"BUILDING_UPGRADES");
        createElement("th",{},tr,"BUILDINGTYPE");
        createElement("th",{},tr,"COUNT");
        for(var v in unsafeWindow.buildinginfos[0]){
            if(!unsafeWindow.buildinginfos[0].hasOwnProperty(v)){continue;}     
            tr=createElement("tr",{},table);
            createElement("td",{},tr,v);
            for(var w=1;w<unsafeWindow.buildinginfos[0][v].length;w++){
                createElement("td",{},tr,implode(unsafeWindow.buildinginfos[0][v][w]));
            }
            createElement("td",{},tr,implode(BUILDING_UPGRADES[v]));
            createElement("td",{},tr,implode(BUILDINGTYPE[v]));
            createElement("td",{},tr,implode(totalZones[v]));
        }
        for(var i=1;i<=4;i++){
            v="fw"+i;
            tr=createElement("tr",{},table);
            createElement("td",{},tr,v);
            for(var w=1;w<=12;w++){
                td=createElement("td",{},tr);
                switch(w){
                case 10: td.innerHTML=getBuildingName(v); break;
                }
            }
            createElement("td",{},tr,implode(BUILDING_UPGRADES[v]));
            createElement("td",{},tr,implode(BUILDINGTYPE[v]));
            createElement("td",{},tr,implode(totalZones[v]));
        }
        for(var i=1;i<=6;i++){
            v="fl"+i;
            tr=createElement("tr",{},table);
            createElement("td",{},tr,v);
            for(var w=1;w<=12;w++){
                td=createElement("td",{},tr);
                switch(w){
                case 10: td.innerHTML=getBuildingName(v); break;
                }
            }
            createElement("td",{},tr,implode(BUILDING_UPGRADES[v]));
            createElement("td",{},tr,implode(BUILDINGTYPE[v]));
            createElement("td",{},tr,implode(totalZones[v]));
        }
        container=null;div=null;
        table=null;tr=null;td=null;
    }catch(err){ GM_logError("show building data\n"+err); }
    });
    
    valMinRackMan=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valMinRackMan",false);
    valMinRack=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valMinRack"),"do_main/valMinRack");
    bChanged=false;
    if((typeof valMinRack=="object")&&!(valMinRack instanceof Array)){ 
        for(var v in valMinRack){
            if(!valMinRack.hasOwnProperty(v)){continue;}
            if(INIT_valMinRack[v]==undefined){ delete valMinRack[v];bChanged=true; }
            else if(typeof valMinRack[v]!="number"){ valMinRack[v]=INIT_valMinRack[v];bChanged=true; }
        }
        for(var v in INIT_valMinRack){
            if(!INIT_valMinRack.hasOwnProperty(v)){continue;}
            if(valMinRack[v]==undefined){ valMinRack[v]=INIT_valMinRack[v];bChanged=true; }
        }
    }else{
        valMinRack=INIT_valMinRack.clone();bChanged=true;
    }
    if(bChanged){ GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valMinRack",implode(valMinRack,"valMinRack")); }
    valMinRackPlantsize=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valMinRackPlantsize",false); //Use plant ratio
    valMinRackFarmis=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valMinRackFarmis",true);
    valMinRackForestryFarmis=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valMinRackForestryFarmis",true);
    valMinRackGrowing=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valMinRackGrowing",true);
    valMinRackRecursive=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valMinRackRecursive",false);
    valFarmiLimits=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valFarmiLimits","[90,100]"),"do_main/valFarmiLimits",[90,100]);
    unsafeData.valFarmiLimits=valFarmiLimits.clone();
    valFarmiMiniInfo=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valFarmiMiniInfo",true);

    unsafeOverwriteFunction("createAdvancedProductResponse",function(response,e,c){
        try{
            unsafeWindow._createAdvancedProductResponse(response,e,c);
        }catch(err){GM_logError("_createAdvancedProductResponse\n"+err);}
        try{
            raiseEvent("gameStartFactory");
        }catch(err){GM_logError("createAdvancedProductResponse\n"+err);}
    });
    // Farmis
    err_trace="farmis";
    if(newdiv=$("customerstats")){
        newdiv.setAttribute("class","link");
        newdiv.addEventListener("click",function(){unsafeWindow.buildInfoPanel("farmies");},false);
    }
    // farmiLog[farmiId]=[date,money,{prod1:amount,...}]
    farmiLog=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_farmiLog","[]"),"do_main/farmiLog",[]);
    if(!(farmiLog instanceof Array)){ farmiLog=[]; }
    // kick farmis older than 1 month, set this value optional?
    var dayLastMonth=new Date();
    dayLastMonth=Math.round(((new Date(dayLastMonth.getFullYear(),dayLastMonth.getMonth()-1,dayLastMonth.getDate())).getTime())/1000);
    for(var v=farmiLog.length-1;v>=0;v--){
        if (getTime(farmiLog[v][1])<=dayLastMonth){
            farmiLog.splice(v,1);
        }
    }

    function calcFarmiCost(){ //done on price change, on load and on a new farmi
    try{
    if(DEVMODE_FUNCTION){ var trackingHandle = tracking.start("berater","calcFarmiCost"); }
        // calculate costs of the farmis
        for(var farmiNr in unsafeWindow.farmisinfo[0]){
            if(!unsafeWindow.farmisinfo[0].hasOwnProperty(farmiNr)){ continue; }
            var wert=0;
            var priceMissing=0;
            for(var i=1;i<=7;i++){ // 7=max-amount of products per farmi
                var pid=unsafeWindow.farmisinfo[0][farmiNr]["p"+i];
                var amount=parseInt(unsafeWindow.farmisinfo[0][farmiNr]["a"+i],10);
                if((pid>0)&&(amount>0)){
                    if(gut[pid]>0){
                        wert += amount*gut[pid];
                    }else{
                        priceMissing++;
                    }
                }
            }
            unsafeWindow.farmisinfo[0][farmiNr]["costQuotient"]=(priceMissing>0?null:(100*parseFloat(unsafeWindow.farmisinfo[0][farmiNr]["price"],10)/wert));
            unsafeWindow.farmisinfo[0][farmiNr]["marketValue"]=(priceMissing>0?0:wert);
        }
    if(DEVMODE_FUNCTION){ tracking.end("berater",trackingHandle); }
    }catch(err){ GM_logError("calcFarmiCost\n"+err); }
    }
    // Foodworld
    err_trace="Foodworld";
    // Foodworld-Farmi
/*
    unsafeOverwriteFunction("showFoodworldFarmiCart",function(id){
        unsafeWindow._showFoodworldFarmiCart(id);
        try{
            var newdiv, sum=0, prodId, priceMissing=false;
            if(newdiv=$("food_cart_products")){
                for(var i=0;i<newdiv.childElementCount;i++){
                    prodId=parseInt(newdiv.children[i].firstElementChild.getAttribute("class").replace(/\D+/g,""),10);
                    newdiv.children[i].setAttribute("prodId",prodId);
                    newdiv.children[i].classList.add("link");
                    newdiv.children[i].addEventListener("mouseover",function(event){ showGoToMarketToolTip(event,this.getAttribute("prodId")); },false);
                    newdiv.children[i].addEventListener("click",function(event){ showMarket(this.getAttribute("prodId")); },false);
                    if(gut[prodId]){
                        sum+=gut[prodId]*unsafeWindow.foodworldfarmis[id]["products"][prodId];
                    }else{
                        newdiv.children[i].style.backgroundColor="red";
                        priceMissing=true;
                    }
                }
            }
            if(newdiv=$("food_cart_cost")){
                newdiv.innerHTML="100%:&nbsp;"+moneyFormatInt(sum)+"&nbsp;|&nbsp;90%:&nbsp;"+moneyFormatInt(0.9*sum);
            }
            if(newdiv=$("food_cart_perc")){
                if(priceMissing){
                    newdiv.style.border="4px inset #336";
                    newdiv.style.color="#336";
                    newdiv.style.backgroundColor="transparent";
                    newdiv.innerHTML="--%";
                }else{
                    var price=parseInt(unsafeWindow.foodworldfarmis[id]["price"],10);
                    if(100*price<valFarmiLimits[0]*sum){ var col="red";var col2="#fcc"; }
                    else if(100*price<valFarmiLimits[1]*sum){ var col="#d80";var col2="#ff9"; }
                    else{ var col="green";var col2="#80ff80"; }
                    newdiv.style.border="4px inset "+col;
                    newdiv.style.color=col;
                    newdiv.style.backgroundColor=col2;
                    newdiv.innerHTML=Math.round(100*price/sum)+"%";
                }
            }
            newdiv=null;
        }catch(err){ GM_logError("showFoodworldFarmiCart\n"+err); }
    });
*/
    unsafeOverwriteFunction("showFoodworldFarmiCart",function(farmi){
    try{
        unsafeWindow._showFoodworldFarmiCart(farmi);
    }catch(err){GM_logError("_showFoodworldFarmiCart\n"+err);}
    try{
        // get farmi data
        var prod,menge;
        var thisFarmiData=new Object();
        thisFarmiData["cart"]=new Array();
        thisFarmiData["money"]=parseFloat(unsafeWindow.foodworldfarmis[farmi]["price"],10);
        for(var i in unsafeWindow.foodworldfarmis[farmi]["products"]){
            if(!unsafeWindow.foodworldfarmis[farmi]["products"].hasOwnProperty(i)){ continue; }
            prod=parseInt(i,10);
            menge=unsafeWindow.foodworldfarmis[farmi]["products"][i];
            thisFarmiData["cart"].push([prod,menge,menge*gut[prod]]);
        }
        // (re-)build the table
        function buildTable(){
        try{
            var cartContent,newtable,newtr,newtd,span;
            cartContent=$("food_cart_products");
            cartContent.innerHTML="";
            var prod,menge,wert,sum=0,priceMissing=false;
            thisFarmiData["cart"].sort(function(a,b){return (b[2]-a[2]);});
            newtable=createElement("table",{"border":"0","cellspacing":"0","cellpadding":"2","style":"margin:0 auto;"},cartContent);
            for(var v=0;v<thisFarmiData["cart"].length;v++){
                prod=thisFarmiData["cart"][v][0];
                menge=thisFarmiData["cart"][v][1];
                wert=thisFarmiData["cart"][v][2];
                sum += wert;
                newtr=createElement("tr",{"class":((prodStock[0][prod]<menge)?("farmicart_missing"):((prodStock[0][prod]-menge<prodMinRack[0][prod]-((valMinRackFarmis&&totalFarmis[0]&&totalFarmis[0][prod])?totalFarmis[0][prod]:0))?"farmicart_lowrack":"")),"prod":prod},newtable);
                produktPic(0,prod,createElement("td",{},newtr));
                createElement("td",{"style":"text-align:right;font-size:16px;font-weight:bold;"},newtr,numberFormat(menge));
                newtd=createElement("td",{"class":"link","style":"width:170px;"},newtr);
                newtd.addEventListener("mouseover",function(event){ showGoToMarketToolTip(event,this.parentNode.getAttribute("prod")); },false);
                newtd.addEventListener("click",function(){showMarket(this.parentNode.getAttribute("prod"));},false);
                span=createElement("span",{"style":"font-size:16px;font-weight:bold;white-space:nowrap;"},newtd,prodName[0][prod]);
                span.style.fontSize=16*Math.min(1,170/span.offsetWidth)+"px";
                newtd=createElement("td",{"class":"link","nr":v,"style":"width:82px;text-align:right;font-size:14px;"},newtr);
                if(wert>0){
                    newtd=createElement("div",{"style":"position:relative;height:100%;padding-left:5px;padding-right:5px;"},newtd);
                    createElement("div",{"style":"position:absolute;left:0;height:100%;width:"+Math.ceil(100*wert/thisFarmiData["cart"][0][2])+"%;background-color:grey;opacity:0.6;z-index:-1;"},newtd);
                    createElement("span",{"style":"width:100%;"},newtd,moneyFormatInt(wert));
                }else{
                    newtd.style.backgroundColor="red";
                    priceMissing=true;
                }
                newtd.addEventListener("mouseover",function(event){ toolTip.show(event,getText("editPrice")); },false);
                newtd.addEventListener("click",function(){
                    var cell,newtable,newt,newtdr
                    cell=this;
                    while(cell.nodeName!="TD"){ cell=cell.parentNode; }
                    var v=cell.getAttribute("nr");
                    cell=$("cartcontentEditPrice");
                    if(cell){ removeElement(cell); }
                    newtable=createElement("div",{"id":"cartcontentEditPrice","style":"z-index:10;position:absolute;right:0;top:0;display:block;border-radius:5px;","class":"blackbox"},$("food_cart_products"));
                    newtable=createElement("table",{"cellspacing":"0","cellpadding":"0","border":"0","nr":v},newtable);
                    newtr=createElement("tr",{},newtable);
                    createElement("td",{"colspan":"2","style":"color:black;text-align:center;padding-bottom:2px;white-space:nowrap;"},newtr,getText("editPrice"));
                    newtr=createElement("tr",{},newtable);
                    createElement("td",{"colspan":"2","style":"color:black;border-bottom:1px solid black;text-align:center;padding-bottom:2px;white-space:nowrap;"},newtr,numberFormat(thisFarmiData["cart"][v][1])+"&nbsp;"+prodName[0][thisFarmiData["cart"][v][0]]);
                    newtr=createElement("tr",{},newtable);
                    createElement("td",{"style":"color:black;text-align:left;padding-top:2px;padding-right:10px;"},newtr,getText("marketPrice"));
                    createElement("td",{"style":"color:black;text-align:right;padding-top:2px;"},newtr,moneyFormat(gut[thisFarmiData["cart"][v][0]]));
                    newtr=createElement("tr",{},newtable);
                    createElement("td",{"style":"color:black;text-align:left;padding-right:10px;"},newtr,getText("NPCprice"));
                    createElement("td",{"style":"color:black;text-align:right;"},newtr,isNaN(NPC[0][thisFarmiData["cart"][v][0]])?"-":moneyFormat(NPC[0][thisFarmiData["cart"][v][0]]));
                    newtr=createElement("tr",{"style":"height:22px;"},newtable);
                    createElement("td",{"style":"color:black;text-align:left;padding-right:10px;"},newtr,getText("single"));
                    newtd=createElement("td",{},newtr);
                    cell=createElement("input",{"class":"text","type":"text","style":"color:black;text-align:right;width:60px;","value":numberFormat(thisFarmiData["cart"][v][2]/thisFarmiData["cart"][v][1],2),"maxlength":"8"},newtd);
                    cell.addEventListener("change",function(){
                        var help=parseFloat(this.value.replace(regDelimThou,"").replace(regDelimDeci,"."),10);
                        if(!isNaN(help)){
                            if(help<0){ help*=-1; }
                            help=Math.round(100*help)/100;
                            this.value=numberFormat(help,2);
                            var v=this.parentNode.parentNode.parentNode.getAttribute("nr");
                            thisFarmiData["cart"][v][2]=help*thisFarmiData["cart"][v][1];
                            this.parentNode.parentNode.nextElementSibling.children[1].firstElementChild.value=numberFormat(thisFarmiData["cart"][v][2],2);
                        }
                    },false);
                    newtr=createElement("tr",{"style":"height:22px;"},newtable);
                    createElement("td",{"style":"color:black;text-align:left;padding-right:10px;"},newtr,getText("total"));
                    newtd=createElement("td",{},newtr);
                    cell=createElement("input",{"class":"text","type":"text","style":"color:black;text-align:right;width:60px;","value":numberFormat(thisFarmiData["cart"][v][2],2),"maxlength":"9"},newtd);
                    cell.addEventListener("change",function(){
                        var help=parseFloat(this.value.replace(regDelimThou,"").replace(regDelimDeci,"."),10);
                        if(!isNaN(help)){
                            if(help<0){ help*=-1; }
                            help=Math.round(100*help)/100;
                            this.value=numberFormat(help,2);
                            var v=this.parentNode.parentNode.parentNode.getAttribute("nr");
                            thisFarmiData["cart"][v][2]=help;
                            this.parentNode.parentNode.previousElementSibling.children[1].firstElementChild.value=numberFormat(thisFarmiData["cart"][v][2]/thisFarmiData["cart"][v][1],2);
                        }
                    },false);
                    newtr=createElement("tr",{"style":"height:22px;"},newtable);
                    newtd=createElement("td",{"colspan":"2","style":"color:black;border-top:1px solid black;text-align:center;padding-top:2px;"},newtr);
                    cell=createElement("button",{"class":"link","type":"button","style":"color:black;"},newtd,getText("ok"));
                    cell.addEventListener("click",function(){
                        removeElement(this.parentNode.parentNode.parentNode.parentNode);
                        buildTable();
                    },false);
                    cell=null;newtable=null;newtr=null;newtd=null;
                },false);
            }

            newtr=createElement("tr",{},newtable);
            createElement("td",{"colspan":"3"},newtr);
            newtd=createElement("td",{"style":"padding-left:5px;padding-right:5px;border-top:1px solid #336;text-align:right;color:#336;font-size:14px;","mouseOverText":"90%: "+moneyFormatInt(0.9*sum)},newtr,moneyFormatInt(sum));
            newtd.addEventListener("mouseover",function(event){ toolTip.show(event,this.getAttribute("mouseOverText")); },false);

            newtd=$("food_cart_perc");
            if(priceMissing){
                newtd.style.border="4px inset #336";
                newtd.style.color="#336";
                newtd.style.backgroundColor="transparent";
                newtd.innerHTML="--%";
            }else{
                if(100*thisFarmiData["money"]<valFarmiLimits[0]*sum){ var col="red";var col2="#fcc"; }
                else if(100*thisFarmiData["money"]<valFarmiLimits[1]*sum){ var col="#d80";var col2="#ff9"; }
                else{ var col="green";var col2="#80ff80"; }
                newtd.style.border="4px inset "+col;
                newtd.style.color=col;
                newtd.style.backgroundColor=col2;
                newtd.innerHTML=Math.round(100*thisFarmiData["money"]/sum)+"%";
            }
            cartContent=null;newtable=null;newtr=null;newtd=null;span=null;
        }catch(err){GM_logError("showCart.buildTable\n"+err);}  
        }
        buildTable();
    }catch(err){GM_logError("showFoodworldFarmiCart\n"+err);}   
    });
    unsafeOverwriteFunction("createFoodworldFarmis",function(){
        try{
            unsafeWindow._createFoodworldFarmis();
        }catch(err){GM_logError("_createFoodworldFarmis\n"+err);}
        try{
            var div,input;
            if(div=$("food_farmis")){
                div=createElement("div",{"style":"position:absolute;bottom:-20px;"},div);
                input=createElement("input",{"type":"checkbox","checked":valFoodworldFarmiPlacing,"class":"link"},div);
                input.addEventListener("click",function(){
                    valFoodworldFarmiPlacing=this.checked;
                    GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valFoodworldFarmiPlacing",valFoodworldFarmiPlacing); 
                },false);
                div.addEventListener("mouseover",function(event){
                    toolTip.show(event,getText("settings_valFoodworldFarmiPlacing")[1]);
                },false);
            }
        }catch(err){GM_logError("createFoodworldFarmis\n"+err);}
    });
    unsafeOverwriteFunction("dragFoodworldFarmiTouch",function(id){
        try{
            unsafeWindow._dragFoodworldFarmiTouch(id);
        }catch(err){GM_logError("_dragFoodworldFarmiTouch\n"+err);}
        try{
            if(valFoodworldFarmiPlacing){
                loop:
                for(var b=0;b<=4;b++){
                    if(unsafeWindow.foodworldtables[b]&&(!unsafeWindow.foodworldtables[b]["block"])&&(!unsafeWindow.foodworldtables[b]["locked"])){
                        for(var a=1;a<=2;a++) {
                            if(!(unsafeWindow.foodworldtables[b]["chairs"]&&unsafeWindow.foodworldtables[b]["chairs"][a]&&unsafeWindow.foodworldtables[b]["chairs"][a]["id"])){
                                if(div=$("foodworldchair"+b+"_"+a+"_touch")){
                                    click(div);
                                    div=null;
                                    break loop;
                                }
                            }
                        }
                    }
                }               
            }
        }catch(err){GM_logError("dragFoodworldFarmiTouch\n"+err);}
    });
    if(newdiv=$("food_cart")){
        createElement("div",{"id":"food_cart_cost","style":"position:absolute;bottom:130px;left:135px;font-size:12px;color:#463824;"},newdiv);
        createElement("div",{"id":"food_cart_perc","style":"position:absolute;bottom:105px;left:375px;width:70px;padding:2px;text-align:right;font-size:20px;font-weight:bold;"},newdiv);       
    }
    // Foodworld-Zones
    function doFoodworld(){
    try{
        gameLocation=["foodworld",null];
        unsafeData.gameLocation=gameLocation.clone();
        var nowServer=unsafeWindow.Zeit.Server;
        var zoneNrF,zoneNrS,tempZoneProductionData,tempZoneProductionDataSlot,currBlock;
        // Buildings
        var err_trace="Buildings";
        zoneNrF="foodworld-4";
        zones.setBlock(zoneNrF,"blpqs");
        if(unsafeWindow.foodworldbuildings){
            var res,iProd,iTime,iAmount,iPoints,iSlotCount;
            for(var building in unsafeWindow.foodworldbuildings){
                if(!unsafeWindow.foodworldbuildings.hasOwnProperty(building)){continue;}
                res=unsafeWindow.foodworldbuildings[building];
                zoneNrF="foodworld-"+building;
                currBlock=(unsafeWindow.foodworldbuildings[building]["cost"]?"b":""); // foodworld building locked due to missing payment
                currBlock+=(unsafeWindow.foodworldbuildings[building]["block"]?"l":""); // foodworld building locked due to level requirement               
                zones.setBlock(zoneNrF,currBlock);
                if(zones.isMultiSlot(zoneNrF)){
                    iSlotCount=3;
                    if(!currBlock){
                        for(var slot=1;slot<=iSlotCount;slot++){
                            zoneNrS=zoneNrF+"."+slot;
                            zones.setBlock(zoneNrS,res["slots"]&&res["slots"][slot]&&res["slots"][slot]["block"]?"b":"");
                        }
                    }
                }else{
                    iSlotCount=0;
                }
                if(!currBlock){
                    zones.setBonus(zoneNrF,0); // TODO // unsafeWindow.forestry_user_buildings[building]["boni"]?unsafeWindow.forestry_user_buildings[building]["boni"]:0;
                    res=(unsafeWindow.foodworldbuildings[building]&&unsafeWindow.foodworldbuildings[building]["slots"])?unsafeWindow.foodworldbuildings[building]["slots"]:{};
                    
                    tempZoneProductionData=[[{},{}],0,0,true];
                    for(var slot=1;slot<=(iSlotCount==0?1:iSlotCount);slot++){
                        if(DEVMODE){ GM_log("doFoodworld zoneNrF="+zoneNrF+" slot="+slot+" res["+slot+"]="+implode(res[slot],"res")); }
                        if(iSlotCount>0){
                            zoneNrS=zoneNrF+"."+slot;
                        }else{
                            zoneNrS=zoneNrF;
                        }
                        if(!zones.getBlock(zoneNrS)){
                            tempZoneProductionDataSlot=[[{},{}],0,0,true];
                            if(res[slot]){
                                iProd=(res[slot]["pid"]?parseInt(res[slot]["pid"],10):null);
                                if(isNaN(iProd)){ iProd=null; }
                                if((iProd!=null)&&(res[slot]["ready"])){ // production ready
                                    iTime=nowServer;
                                }else if((iProd!=null)&&(res[slot]["remain"])){ // production busy
                                    iTime=nowServer+res[slot]["remain"]; 
                                }else{
                                    iTime=NEVER;
                                    tempZoneProductionData[1]++;
                                    tempZoneProductionDataSlot[1]++;
                                }
                                // iAmount=(res[slot]["amount"]?res[slot]["amount"]:null);
                                tempZoneProductionData[2]++;
                                tempZoneProductionDataSlot[2]++;
                                if(iProd!=null){
                                    iAmount=prodYield[0][iProd];
                                    iPoints=iAmount*prodPoints[0][iProd];                               
                                    if(!tempZoneProductionData[0][0][iProd]){ tempZoneProductionData[0][0][iProd]=[]; }
                                    tempZoneProductionData[0][0][iProd].push([iAmount,iPoints,iTime,NEVER]);
                                    if(!tempZoneProductionDataSlot[0][0][iProd]){ tempZoneProductionDataSlot[0][0][iProd]=[]; }
                                    tempZoneProductionDataSlot[0][0][iProd].push([iAmount,iPoints,iTime,NEVER]);
                                }
                            }
                            if(iSlotCount>0){
                                zones.setProduction(zoneNrS,tempZoneProductionDataSlot.clone());
                            }
                        }
                    }
                    zones.setProduction(zoneNrF,tempZoneProductionData.clone());
                    //auto-cropping
                    // if(iSlotCount=0){
                    //  var div;
                    //  if((top.unsafeData.autoAction==null) && valAutoCrop["forestry"] && (zones.getEndtime(zoneNrF)<=unsafeWindow.Zeit.Server) && (div=$("forestry_building_click"+building))){
                    //      top.unsafeData.autoAction="berater: forestry building crop";
                    //      document.addEventListener("gameOpenGlobalCommitBox",function(){
                    //          document.removeEventListener("gameOpenGlobalCommitBox",arguments.callee,false);
                    //          window.setTimeout(function(){ 
                    //              click($("globalcommitboxfooter").firstElementChild);
                    //              top.unsafeData.autoAction=null;
                    //          },500);
                    //      });
                    //      window.setTimeout(function(div){ click(div); },500,div);
                    //  }
                    //  div=null;
                    // }
                    createZoneTimer("zoneTimer_"+zoneNrF,zoneNrF,"zonetimer","position:absolute;top:-20px;left:0px;",$("food_pos"+building));
                }
            }
            building=null;res=null;iProd=null;iTime=null;maxCapacity=null;
        }
        calcTotalZones();
        // Quest
        handleQuestDataFoodworld();
        if((newdiv=$("foodworld_questblock"))&&(!newdiv.classList.contains("mouseOver"))){
            newdiv.classList.add("mouseOver");
            newdiv.addEventListener("mouseover",function(event){
                toolTip.show(event,questLineMouseOver("foodworld","1"));
            },false);
        }
        zoneNrF=null;tempZoneProductionData=null;tempZoneProductionDataSlot=null;

        err_trace="saving";
        publishProductData();
    }catch(err){GM_logError("doFoodworld ("+err_trace+")\n"+err);}
    }
    unsafeOverwriteFunction("foodworldActionResponse",function(request,action,id,table,chair){
        try{
            unsafeWindow._foodworldActionResponse(request,action,id,table,chair);
        }catch(err){GM_logError("_foodworldActionResponse\n"+err);}
        try{
            var result = checkRequest(request);
            if((result!=0)&&(result[0]!=0)){
                doFoodworld();
                switch(action){
                case "crop": raiseEvent("gameFoodworldCropped"); break;
                case "init": raiseEvent("gameFoodworldOpened"); break;
                case "open": raiseEvent("gameFoodworldOpened" + id); break
                case "production": raiseEvent("gameFoodworldStarted"); break
                // logBubble.add("gameLocation = " + gameLocation + "id = " + id);
                }           
            }
            result=null;
        }catch(err){GM_logError("foodworldActionResponse\n"+err);}
    });
    unsafeOverwriteFunction("openFoodworldBuildingSelect",function(position,slot){
        try{
            unsafeWindow._openFoodworldBuildingSelect(position,slot);
        }catch(err){GM_logError("_openFoodworldBuildingSelect\n"+err);}
        try{
            raiseEvent("gameFoodworldSlotOpened")
        }catch(err){GM_logError("openFoodworldBuildingSelect\n"+err);}
    });
        
    // Addons
    err_trace="Addons";
    // TODO remove
    document.addEventListener("gameBotStarted",function(){
        try{
            valAutoWater["farm"]=unsafeData.botConfigData[0];
            valAutoCrop["farm"]=unsafeData.botConfigData[1];
            valWaterNeeded["farm"]=unsafeData.botConfigData[2];
            for(var z in unsafeData.readyZone){
                if(!unsafeData.readyZone.hasOwnProperty(z)){continue;}
                unsafeData.readyZone[z][2]=true;
            }
        }catch(err){}
    },false);
    document.addEventListener("gameBotStopped",function(){
        window.setTimeout(function(){
        try{
            valAutoWater=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valAutoWater"),"valAutoWater",{"farm":false,"forestry":true});
            valAutoCrop=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valAutoCrop"),"valAutoCrop",{"farm":false,"forestry":true});
            valWaterNeeded=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valWaterNeeded"),"valWaterNeeded",{"farm":true,"forestry":true});
        }catch(err){}
        },0);
    },false);   
    unsafeWindow.prodMinRackAddon.add = function(type,pid,reason,amount){
    try{
        type=parseInt(type,10);
        pid=parseInt(pid,10);
        amount=parseInt(amount,10);
        if(isNaN(type)||isNaN(pid)||isNaN(amount)){
            GM_log("prodMinRackAddon.add wrong arguments:");
            GM_log([type,pid,reason,amount]);
            return false;
        }
        unsafeWindow.prodMinRackAddon.newdata.push([type,pid,reason,amount]);
        raiseEvent("gameChangedProdMinRackAddon");
    }catch(err){ GM_logError("prodMinRackAddon.add\n"+err); }
    };
    unsafeWindow.prodMinRackAddon.remove = function(type,pid,reason){
    try{
        unsafeWindow.prodMinRackAddon.newdata.push([type,pid,reason,null]);
        raiseEvent("gameChangedProdMinRackAddon");
    }catch(err){ GM_logError("prodMinRackAddon.remove\n"+err); }
    };
    unsafeWindow.prodMinRackAddon.removeAll = function(type,reason){
    try{
        for(var p in prodMinRackAddon[type]){
            if(!prodMinRackAddon[type].hasOwnProperty(p)){ continue; }
            if(prodMinRackAddon[type][p]&&prodMinRackAddon[type][p][reason]){
                unsafeWindow.prodMinRackAddon.newdata.push([type,parseInt(p,10),reason,null]);
            }
        }
        raiseEvent("gameChangedProdMinRackAddon");
    }catch(err){ GM_logError("prodMinRackAddon.removeAll\n"+err); }
    };
    document.addEventListener("gameChangedProdMinRackAddon",function(){
    try{
        // test if calculation is running
        if(unsafeWindow.prodMinRackAddon.busy){ return false; }
        // set flag
        unsafeWindow.prodMinRackAddon.busy=true;
        // get data inside
        var helper=unsafeWindow.prodMinRackAddon.newdata;
        unsafeWindow.prodMinRackAddon.newdata=new Array();
        // calculate
        var type,prod,reason,amount;
        for(var k=0;k<helper.length;k++){
            type  =helper[k][0];
            prod=helper[k][1];
            reason=helper[k][2];
            amount=helper[k][3];
            if(prodMinRackAddon[type][prod]){
                if(prodMinRackAddon[type][prod][reason]){
                    if(amount==null){ // delete existing entry
                        delete prodMinRackAddon[type][prod][reason];
                    }else if(prodMinRackAddon[type][prod][reason]!=amount){ // update existing entry
                        prodMinRackAddon[type][prod][reason]=amount;
                    } // else the entry is correct
                }else if(amount!=null){
                    prodMinRackAddon[type][prod][reason]=amount;
                }
            }else if(amount!=null){ // create new entry
                prodMinRackAddon[type][prod]=new Object();
                prodMinRackAddon[type][prod][reason]=amount;
            } // else a non-existing entry should be deleted
        }
        calcProdMinRack();
        // remove flag
        unsafeWindow.prodMinRackAddon.busy=false;
        // restart if new data meanwhile arrived
        if(unsafeWindow.prodMinRackAddon.newdata.length>0){
            arguments.callee();
        }
    }catch(err){ GM_logError("listener gameChangedProdMinRackAddon\n"+err); }
    },false);

    GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_farmname",FARMNAME);
    var documentTitle=" - "+FARMNAME+" - s"+SERVER+" - "+document.title;
    var lastGiess=null;
    var lastErnte=null;

    err_trace="zones";
    zones.init();
    for(var j=0;j<ALL_ZONES["farm"].length;j++){
        help=zones.getBlock(ALL_ZONES["farm"][j]);
        if((!help.match(/b/))&&(unsafeWindow.farmamount<Math.ceil(ALL_ZONES["farm"][j]/6))){
            GM_log("Blocking zone because farmamount is too low: "+ALL_ZONES["farm"][j]);
            zones.setBlock(ALL_ZONES["farm"][j],help+"b");
        }
    }
    zones.setBlock("windmill",USERLEVEL>=8?"":"l");
    calcAllSlots();
    calcTotalZones();
    calcTotalAnimals();

    zoneAddToGlobalTime=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valGlobalTimeAdd","{}"),"do_main/zoneAddToGlobalTime",{}); //TODO name change

    totalErnte=new Array(new Object(),new Object(),new Object()); // Value of products the farm currently produces
    totalFarmis=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_totalFarmis","[{},{}]"),"do_main/totalFarmis",[{},{}]); // Value of products the farmis want
    totalPowerups=new Object(); // Value of powerups creating products
    totalQuest=new Object(); // Value of products the quests need: totalQuest[questType][prodType][prodId]=amount
    totalRecursive=new Array(new Object(), new Object());
    
    /*
    function findRecursiveNeededProducts(type,iProd,amount,addto){ //addto=new Array(new Object(), new Object());
        if(prodRequire[type]&&prodRequire[type][iProd]){
            //if(DEVMODE_FUNCTION){GM_log("Begin findRecursiveNeededProducts name:"+prodName[type][iProd]+" iProd:"+iProd+" amount:"+amount+" totalRecursive:"+implode(totalRecursive,"findRecursiveNeededProducts\totalRecursive"));}
            var help;
            for(var i in prodRequire[type][iProd]){
                if (!prodRequire[type][iProd].hasOwnProperty(i)){ continue; }
                help=prodRequire[type][iProd][i];
                if (help[0]==type&&help[1]==iProd){continue;}
                pAmount = Math.ceil((parseInt(help[2],10)*amount)/(prodYield[type][iProd]?prodYield[type][iProd]:1));
                if(!addto){
                    if(!totalRecursive[help[0]][help[1]]){totalRecursive[help[0]][help[1]]=0;}
                    totalRecursive[help[0]][help[1]]+=pAmount;
                }else{
                    if(!addto[help[0]][help[1]]){addto[help[0]][help[1]]=0;}
                    addto[help[0]][help[1]]+=pAmount;
                }
                if(prodRequire[help[0]][help[1]]){//&&!(help[0]==type&&help[1]==iProd)){
                    findRecursiveNeededProducts(help[0],parseInt(help[1],10),pAmount,addto);
                }
            }
            help=null;
            //if(DEVMODE_FUNCTION){GM_log("End findRecursiveNeededProducts name:"+prodName[type][iProd]+" iProd:"+iProd+" amount:"+amount+" totalRecursive:"+implode(totalRecursive,"findRecursiveNeededProducts/totalRecursive"));}
        }
    }
    */
    calcTotalPowerups();
    // Value of active powerup for a field
    // currentPowerup[plantNr]=[time,+value,+points]
    var currentPowerup=new Object;
    function calcCurrentPowerup(){
    try{
        currentPowerup=new Object;
        if(unsafeWindow.poweruprack){
            for(var i in unsafeWindow.poweruprack){
                if(!unsafeWindow.poweruprack.hasOwnProperty(i)){continue;}
                var item=unsafeWindow.poweruprack[i];
                if((item[5])&&(item["remain"]>0)){
                    if(item[5][1]){
                        currentPowerup[item[5][1][0]]=[item["remain"]+unsafeWindow.Zeit.Server,item[5][1][1],0];
                        var newdiv=$("powerupSymbol"+item["0"]);
                        if(!newdiv){
                            newdiv=createElement("div",{"id":"powerupSymbol"+item["0"],"style":"position:relative;width:60px;height:87px;margin-bottom:5px;","end":item["remain"]+unsafeWindow.Zeit.Server},nodes["containerPowerupSymbols"]["node"]);
                            newdiv.addEventListener("mouseover",function(event){
                                var end=parseInt(this.getAttribute("end"),10);
                                var endDay=countDays(now,end);
                                toolTip.show(event,(getText("day"+endDay)?getText("day"+endDay):(new Date(1000*end).toLocaleString()))+"<br>"+getDaytimeStr(end));
                            },false);
                            createElement("img",{"src":GFX+"powerup2.png","border":"0"},newdiv);
                            createElement("div",{"style":"position:absolute;top:3px;left:6px;","class":"kp"+item[5][1][0]},newdiv);
                            createElement("div",{"style":"position:absolute;top:3px;left:22px;font-weight:bold;color:black;"},newdiv,"+"+item[5][1][1]);
                            createElement("div",{"style":"position:absolute;top:64px;right:0;font-weight:bold;","class":"blackbox"},newdiv,getTimeStr(item["remain"]));
                        }
                        newdiv=null;
                    }
                    if(item[5][2]){
                        currentPowerup[item[5][2][0]]=[item["remain"]+unsafeWindow.Zeit.Server,0,item[5][2][1]];
                        var newdiv=$("powerupSymbol"+item["0"]);
                        if(!newdiv){
                            newdiv=createElement("div",{"id":"powerupSymbol"+item["0"],"style":"position:relative;width:60px;height:87px;margin-bottom:5px;","end":item["remain"]+unsafeWindow.Zeit.Server},nodes["containerPowerupSymbols"]["node"]);
                            newdiv.addEventListener("mouseover",function(event){
                                var end=parseInt(this.getAttribute("end"),10);
                                var endDay=countDays(now,end);
                                toolTip.show(event,(getText("day"+endDay)?getText("day"+endDay):(new Date(1000*end).toLocaleString()))+"<br>"+getDaytimeStr(end));
                            },false);
                            createElement("img",{"src":GFX+"powerup3.png","border":"0"},newdiv);
                            createElement("div",{"style":"position:absolute;top:3px;left:6px;","class":"kp"+item[5][2][0]},newdiv);
                            createElement("div",{"style":"position:absolute;top:3px;left:22px;font-weight:bold;color:black;"},newdiv,"+"+item[5][2][1]);
                            createElement("div",{"style":"position:absolute;top:64px;right:0;font-weight:bold;","class":"blackbox"},newdiv,getTimeStr(item["remain"]));
                        }
                        newdiv=null;
                    }
                }
            }
        }
        unsafeData.currentPowerup=currentPowerup.clone();
    }catch(err){ GM_logError("calcCurrentPowerup\n"+err); }
    }
    calcCurrentPowerup();

    // powerup-data is updated
    // function isnt available anymore?
    unsafeOverwriteFunction("handlePowerups",function(page){
        try{
            unsafeWindow._handlePowerups(page);
        }catch(err){ GM_logError("_handlePowerups\n"+err); }
        try{
            // GM_log("unsafeWindow.poweruprack:\n"+implode(unsafeWindow.poweruprack));         
            calcTotalPowerups();
            updateProductDataPowerup();
            window.setTimeout(saveProductData,0);
            raiseEvent("gamePoweruprackUpdated");
        }catch(err){ GM_logError("handlePowerups\n"+err); }
    });

    unsafeOverwriteFunction("activatePowerup",function(formula){
        try{
            unsafeWindow._activatePowerup(formula);
        }catch(err){ GM_logError("_activatePowerup\n"+err); }
        try{
            document.addEventListener("gamePoweruprackUpdated",function(){
            try{
                calcCurrentPowerup();
                for(var v=0;v<ALL_ZONES["farm"].length;v++){ zones.processProduction(ALL_ZONES["farm"][v]); } //TODO
                calcProdMinRack();
                raiseEvent("gamePowerupActivated");
                this.removeEventListener("gamePoweruprackUpdated",arguments.callee,false);
            }catch(err){ GM_logError("listener gamePoweruprackUpdated\n"+err); }
            },false);
        }catch(err){ GM_logError("activatePowerup\n"+err); }
    });
    err_trace="valAutoWater";
    valAutoWater=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valAutoWater"),"valAutoWater",null); // TODO set true when automat handles it
    if(valAutoWater==null){
        valAutoWater={"farm":false,"forestry":true};
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valAutoWater",implode(valAutoWater,"valAutoWater"));
    }
    unsafeData.valAutoWater=valAutoWater;
    valWaterNeeded=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valWaterNeeded"),"valWaterNeeded",null);
    if(valWaterNeeded==null){
        valWaterNeeded={"farm":true,"forestry":true};
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valWaterNeeded",implode(valWaterNeeded,"valWaterNeeded"));
    }
    unsafeData.valWaterNeeded=valWaterNeeded;
    valAssumeWater=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valAssumeWater"),"valAssumeWater",null);
    if(valAssumeWater==null){
        valAssumeWater={"farm":true,"forestry":true};
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valAssumeWater",implode(valAssumeWater,"valAssumeWater"));
    }
    valAutoCrop=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valAutoCrop"),"valAutoCrop",null);
    if(valAutoCrop==null){
        valAutoCrop={"farm":false,"forestry":true};
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valAutoCrop",implode(valAutoCrop,"valAutoCrop"));
    }
    unsafeData.valAutoCrop=valAutoCrop;
    valErnteMsg=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valErnteMsg",false);
    valLimitEmptyFields=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valLimitEmptyFields"),"valLimitEmptyFields",null);
    if(valLimitEmptyFields==null){
        valLimitEmptyFields={"1":3,"fl1":0,"forest":1};
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valLimitEmptyFields",implode(valLimitEmptyFields,"valLimitEmptyFields"));
    }
    if(typeof GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valKauflimit",110)=="number"){ GM_deleteValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valKauflimit"); }
    valKauflimit=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valKauflimit","[[85,'990000'],110]"),"do_main/valKauflimit",[[85,'990000'],110]);
    valMessagesSystemMarkRead=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valMessagesSystemMarkRead",true);
    valFoodworldFarmiPlacing=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valFoodworldFarmiPlacing",true);
    valStatistik=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valStatistik",true);
    // valClickErrorbox=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valClickErrorbox",false);
    valGlobaltimeShowCroppedZone=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valGlobaltimeShowCroppedZone"),"valGlobaltimeShowCroppedZone",null);
    if(!valGlobaltimeShowCroppedZone||(typeof valGlobaltimeShowCroppedZone!="object")||(valGlobaltimeShowCroppedZone instanceof Array)){ 
        valGlobaltimeShowCroppedZone={"farm":true,"windmill":true,"forestry":true};
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valGlobaltimeShowCroppedZone",implode(valGlobaltimeShowCroppedZone,"valGlobaltimeShowCroppedZone"));
    } 
    unsafeData.readyZone=new Object;
    unsafeData.zoneAddToGlobalTime=zoneAddToGlobalTime.clone();

    // Werbung
    err_trace="Advertisement";
    upjersAds=new Array();
    for(var v in unsafeWindow.welcomeblurb){
        if(!unsafeWindow.welcomeblurb.hasOwnProperty(v)){ continue; }
        if(v!="1"){
            upjersAds.push(unsafeWindow.welcomeblurb[v]);
            delete unsafeWindow.welcomeblurb[v];
        }
    }
    unsafeWindow.gclr();
    newdiv=createElement("img",{"style":"position:absolute;top:0;right:0;height:15px;width:15px;","class":"link","src":GFX+"points.gif"},$("headercontainer"));
    newdiv.addEventListener("mouseover",function(event){ toolTip.show(event,getText("upjersAdvertising")); },false);
    newdiv.addEventListener("click",function(){ unsafeWindow.buildInfoPanel("upjersAds"); },false);
    $("notepad").style.zIndex=111; // Notizen on top
    unsafeWindow.shredderCommit = function(){return;}; // Schredder weg

    // Dragging
    err_trace="Dragging";
    if(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valDrag",false)){
        $("gameArea").style.position="absolute";
        $("gameArea").style.top="5px";
        $("gameArea").style.left="5px";
        makeDraggable($("notepad"));
        makeDraggable($("divGame"),true,false);
        //makeDraggable("gardenmaincontainer");
        //makeDraggable("innermaincontainer");
        $("globaltransp").style.height="0";
        //$("transp").style.height="0";
    }

    // speedlinks
    err_trace="speedlinks";
    if(unsafeWindow.premium!=1){
        unsafeOverwriteFunction("speedLinks",function(){
            try{
                unsafeWindow._speedLinks();
            }catch(err){GM_logError("_speedLinks\n"+err);}
            try{  // taken from game-js and modified to run without premium
                var err_trace="init";
                if (!unsafeWindow.premium){
                    unsafeWindow.showDiv("farm_speedlinks");
                    var a = ["farm1", "farm2", "farm3", "farm4", "city1", "city2", "guild", "forestry", "foodworld"];
                    for (var b = 0; b <= a.length; b++) {
                        if ($("speedlink_" + a[b])) {
                            unsafeWindow.hideDiv($("speedlink_" + a[b]));
                            $("speedlink_" + a[b]).className = "speedlink link speedlink_" + a[b];
                            $("speedlink_" + a[b]).onclick = new Function("")
                        }
                    }
                    err_trace="farm";
                    for (var b = 1; b <= unsafeWindow.farmamount; b++) {
                        if (unsafeWindow.farm == b) {
                            $("speedlink_farm" + b).classList.remove("speedlink_farm" + b);
                            $("speedlink_farm" + b).classList.add("speedlink_farm" + b + "_active")
                        }
                        unsafeWindow.showDiv("speedlink_farm" + b);
                        $("speedlink_farm" + b).onclick = new Function("unsafeWindow.farm=" + b + "; unsafeWindow.farmMove(" + b + "); unsafeWindow.showMain();")
                    }
                    err_trace="city";
                    for (var b = 1; b <= 2; b++) {
                        if (unsafeWindow.city == b) {
                            $("speedlink_city" + b).classList.remove("speedlink_city" + b);
                            $("speedlink_city" + b).classList.add("speedlink_city" + b + "_active")
                        }
                        unsafeWindow.showDiv("speedlink_city" + b);
                            if(b == 1){
                                $("speedlink_city" + b).onclick = new Function("unsafeWindow.close_page();unsafeWindow.showDiv('transp3');unsafeWindow.initCity(1);");
                                
                            }else{
                                $("speedlink_city" + b).onclick = new Function("unsafeWindow.travel2City2();")
                            }           
                        if (b == 2 && unsafeWindow.currentuserlevel < 8) {
                            unsafeWindow.hideDiv("speedlink_city" + b)
                        } else {
                            unsafeWindow.showDiv("speedlink_city" + b)
                        }
                    }
                        err_trace="player_guild";
                    if (unsafeWindow.player_guild) {
                        if (unsafeWindow.inguild) {
                            $("speedlink_guild").classList.remove("speedlink_guild");
                            $("speedlink_guild").classList.add("speedlink_guild_active")
                        }
                        unsafeWindow.showDiv("speedlink_guild");
                        $("speedlink_guild").onclick = new Function("unsafeWindow.inguild=1; unsafeWindow.showMain(); unsafeWindow.initGuild();")
                    }
                        err_trace="forestry";
                    if (unsafeWindow.forestry_unlock == 1) {
                        if (unsafeWindow.forestry_quicknavi) {
                            $("speedlink_forestry").classList.remove("speedlink_forestry");
                            $("speedlink_forestry").classList.add("speedlink_forestry_active")
                        }
                        unsafeWindow.showDiv("speedlink_forestry");
                        $("speedlink_forestry").onclick = new Function("unsafeWindow.travel2forestry();")
                    }
                        err_trace="foodworld";
                    if (unsafeWindow.currentuserlevel >= 11) {
                        if (unsafeWindow.foodworld_quicknavi) {
                            $("speedlink_foodworld").classList.remove("speedlink_foodworld");
                            $("speedlink_foodworld").classList.add("speedlink_foodworld_active")
                        }
                        unsafeWindow.showDiv("speedlink_foodworld");
                        $("speedlink_foodworld").onclick = new Function("unsafeWindow.travel2foodworld();")
                    }
                        err_trace="newarea";
                    unsafeWindow.hideDiv("speedlink_farmersmarket");
                    if (unsafeWindow.farmersmarket_data) {
                        unsafeWindow.showDiv("speedlink_farmersmarket");
                        $("speedlink_farmersmarket").onclick = new Function("unsafeWindow.travel2farmersmarket();")
                    }
                }       
            }catch(err){GM_logError("speedLinks ("+err_trace+")\n"+err);}
        });
        unsafeWindow.speedLinks();
        unsafeWindow.travel2City2 = function(){
        try{
            switch(gameLocation[0]){
            case "city": unsafeWindow.initCity(2); break;
            case "forestry": 
            case "foodworld": unsafeWindow.initCity(2,0,1); break;
            default:{
                document.addEventListener("gameCity1",function(){
                    unsafeWindow.travel2City2();
                    document.removeEventListener("gameCity1",arguments.callee,false);
                },false);
                unsafeWindow.initCity(1);
            }
            }
        }catch(err){GM_logError("travel2City2\n"+err);}     
        };
        unsafeWindow.travel2forestry = function(){
        try{
            if((gameLocation[0]=="forestry")||((gameLocation[0]=="city")&&(gameLocation[1]==2))){
                unsafeWindow.farm=0; 
                unsafeWindow.city=0; 
                unsafeWindow.forestry_quicknavi=1;
                unsafeWindow.initForestry();
            }else{
                document.addEventListener("gameCity2",function(){
                    unsafeWindow.travel2forestry();
                    document.removeEventListener("gameCity2",arguments.callee,false);
                },false);
                unsafeWindow.travel2City2();
            }
        }catch(err){GM_logError("travel2forestry\n"+err);}
        };
        unsafeWindow.travel2foodworld = function(){
        try{
            if((gameLocation[0]=="foodworld")||((gameLocation[0]=="city")&&(gameLocation[1]==2))){
                unsafeWindow.farm=0; 
                unsafeWindow.city=0; 
                unsafeWindow.foodworld_quicknavi=1;
                unsafeWindow.foodworldAction('init');
            }else{
                document.addEventListener("gameCity2",function(){
                    unsafeWindow.travel2foodworld();
                    document.removeEventListener("gameCity2",arguments.callee,false);
                },false);
                unsafeWindow.travel2City2();
            }
        }catch(err){GM_logError("travel2foodworld\n"+err);}
        };
        unsafeWindow.travel2farmersmarket = function(){
        try{
            switch(gameLocation[0]){
            case "farm": case "farmersmarket":{
                unsafeWindow.farmMove(99);
            break;}
            case "city":{
                document.addEventListener("gameFarmOpened",function(){
                    unsafeWindow.travel2farmersmarket();
                    document.removeEventListener("gameFarmOpened",arguments.callee,false);
                },false);
                unsafeWindow.showTravel2Farm(1);
            break;}
            default:{
                document.addEventListener("gameCity2",function(){
                    unsafeWindow.travel2farmersmarket();
                    document.removeEventListener("gameCity2",arguments.callee,false);
                },false);
                unsafeWindow.initCity(2,0,1);;
            }
            }
        }catch(err){GM_logError("travel2farmersmarket\n"+err);}
        };
        
    }
    // andere ServerAccounts
    err_trace="Other accounts on server";
    var farmNamen=explode(GM_getValue(COUNTRY+"_"+SERVER+"_farmNamen","{}"),"do_main/farmNamen",{});
    farmNamen[USERNAME]=FARMNAME;
    if(farmNamen[USERNAME].toLowerCase()!=USERNAME){
        newdiv=createElement("div",{"class":"userinfositem link","style":"font-weight: bold;"});
        newdiv.innerHTML="("+USERNAME+")";
        newdiv1=$("userinfoscontainer");
        newdiv1.insertBefore(newdiv,newdiv1.children[1]);
    }
    GM_setValue(COUNTRY+"_"+SERVER+"_farmNamen",implode(farmNamen));

    var otherAccs=new Array();
    function calcOtherAccs(){
    try{
        otherAccs=new Array();
        var help=explode(GM_getValue("logindata","[]"),"do_main/logindata",[]);
        var help2;
        for(var v=0;v<help.length;v++){
            if((help[v][4]) && (help[v][0]==COUNTRY) && (help[v][1]==SERVER)){
                help2=[v,help[v][2],NEVER];
                if(help2[1].toLowerCase()==USERNAME){ // this account
                    help2[0]=-1;
                }else{
                    try{
                        help2[2]=GM_getValue(help[v][0]+"_"+help[v][1]+"_"+help[v][2].toLowerCase()+"_totalEndtime");
                    }catch(err){}
                }
                otherAccs.push(help2);
            }
            if(!farmNamen[help[v][2]]){ farmNamen[help[v][2]]=help[v][2]; }
        }
    }catch(err){GM_logError("calcOtherAccs\n"+err);}
    }
    calcOtherAccs();
    function testOtherAccReady(){
    try{
        var found=null;
        for(var v=0;v<otherAccs.length;v++){ if(otherAccs[v][0]>-1){
            if (otherAccs[v][2]+unsafeWindow.Zeit.Verschiebung<now){
                found=v;
                break;
            }
        }}
        if(found!=null){
            var cell=$("bubble_adtext");
            if(!cell){ cell=$("sprcontent"); }
            cell.innerHTML="";
            cell=createElement("a",{"id":"linkOtherAccReady","class":"link","dologin":otherAccs[found][0],"href":"#","style":"font-weight:bold;"},createElement("div",{"style":"height:50px;"},cell),farmNamen[otherAccs[found][1]]+" "+getText("finished").toLowerCase()+"!");
            cell.addEventListener("click",function(){
            try{
                var dologin=parseInt(this.getAttribute("dologin"),10);
                window.setTimeout(function(dologin){
                try{
                    var help=explode(GM_getValue(COUNTRY+"_pagedataLogin","{}"),"testOtherAccReady/pagedataLogin",{});
                    if(!(help["dologin"]&&(typeof help["dologin"]=="object"))){
                        help["dologin"]=new Object();
                    }
                    help["dologin"][dologin]=true;
                    GM_setValue(COUNTRY+"_pagedataLogin",implode(help));
                    if($("logoutbutton")){
                        click($("logoutbutton"));
                    } else if(GAMEPAGES[COUNTRY]){
                        location.href="http://www."+GAMEPAGES[COUNTRY]+"/login.php?start=1";
                    }
                }catch(err){ GM_logError("listener linkOtherAccReady.click\n"+err); }
                },0,dologin);
            }catch(err){ GM_logError("listener linkOtherAccReady.click\n"+err); }
            },false);
            cell=null;
            raiseEvent("gameOtherAccReady");
        }else{
            window.setTimeout(testOtherAccReady,5000);
        }
    }catch(err){GM_logError("testOtherAccReady\n"+err);}
    }
    if (otherAccs.length>1){
        newdiv=createElement("div",{"id":"divOtherAccountsTimes","class":"blackbox","style":"position:absolute;top:5px;right:150px;border:2px solid black;padding:2px;z-index:300;display:none;"},$("headercontainer"));
        newdiv.addEventListener("mouseout",function(){this.style.display="none";},false);
        newdiv.addEventListener("mouseover",function(){this.style.display="";},false);
        newdiv=createElement("div",{"style":"position:absolute;top:4px;right:220px;font-size:11px;color:#f7bb87;","class":"link"},$("headercontainer"));
        createElement("div",{"style":"display:inline-block;margin-bottom:2px;margin-right:2px;text-decoration:underline;vertical-align:top;font-size:11px;"},newdiv,getText("login"));
        newdiv1=createElement("div",{"style":"display:inline-block;"},newdiv);
        createElement("img",{"border":"0","src":GFX+"menu/logout.gif"},newdiv1);
        newdiv.addEventListener("mouseout",function(){$("divOtherAccountsTimes").style.display="none";},false);
        function fillDivOtherAccountsTimes(){
            divOtherAccountsTimes=$("divOtherAccountsTimes");
            if(divOtherAccountsTimes.style.display=="none"){
                divOtherAccountsTimes.innerHTML="";
            }else{
                var newtable=createElement("table",{"cellspacing":"0"},newdiv);
                var newtr,newtd;
                for(var v=0;v<otherAccs.length;v++){
                    if(otherAccs[v][0]>-1){
                        newtr=createElement("tr",{"class":"link hoverBgCc9","dologin":otherAccs[v][0]},newtable);
                        newtr.addEventListener("click",function(){
                            var dologin=parseInt(this.getAttribute("dologin"),10);
                            window.setTimeout(function(dologin){
                                var help=explode(GM_getValue(COUNTRY+"_pagedataLogin","{}"),"fillDivOtherAccountsTimes/pagedataLogin",{});
                                if(!(help["dologin"]&&(typeof help["dologin"]=="object"))){
                                    help["dologin"]=new Object();
                                }
                                help["dologin"][dologin]=true;
                                GM_setValue(COUNTRY+"_pagedataLogin",implode(help));
                                if($("logoutbutton")){
                                    click($("logoutbutton"));
                                } else if(GAMEPAGES[COUNTRY]){
                                    location.href="http://www."+GAMEPAGES[COUNTRY]+"/login.php?start=1";
                                }
                            },0,dologin);
                        },false);
                    }else{
                        newtr=createElement("tr",{"class":"fontWeightBold"},newtable);
                        otherAccs[v][2]=totalEndtime;
                    }
                    createElement("td",{},newtr,farmNamen[otherAccs[v][1]]);
                    newtd=createElement("td",{"style":"padding-left:5px;"},newtr);
                    var help=unsafeWindow.Zeit.Verschiebung+otherAccs[v][2];
                    if (help>now){ newtd.innerHTML=getTimeStr(help-now); }
                    else{ newtd.innerHTML=getText("finished").toLowerCase()+"!"; }
                }
                divOtherAccountsTimes.innerHTML="";
                divOtherAccountsTimes.appendChild(newtable);
                newtable=null;newtr=null;newtd=null;
                window.setTimeout(fillDivOtherAccountsTimes,1000);
            }
            divOtherAccountsTimes=null;
        }
        newdiv.addEventListener("mouseover",function(){
            $("divOtherAccountsTimes").style.display="";
            fillDivOtherAccountsTimes();
        },false);
        help=NEVER;
        for(var v=otherAccs.length-1;v>=0;v--){
            if(otherAccs[v][0]>-1){
                help=Math.min(help,otherAccs[v][2]);
            }
        }
        if(help<NEVER){
            window.setTimeout(testOtherAccReady,Math.max(0,help+unsafeWindow.Zeit.Verschiebung-now));
        }
    }

    // SessionEnd
    err_trace="SessionEnd";
    //window.setTimeout('top.location.href="main.php?page=logout";','4457000');  in the gamepage
    function timerSessionEnd(sec){
    try{
        if(sec<1){
            var help=explode(GM_getValue(COUNTRY+"_pagedataLogin","{}"),"timerSessionEnd/pagedataLogin",{});
            if(!(help["doserver"]&&(typeof help["doserver"]=="object"))){
                help["doserver"]=new Object();
            }
            help["doserver"][SERVER]=true;
            GM_setValue(COUNTRY+"_pagedataLogin",implode(help));
            if($("logoutbutton")){
                click($("logoutbutton"));
            } else if(GAMEPAGES[COUNTRY]){
                location.href="http://www."+GAMEPAGES[COUNTRY]+"/login.php?start=1";
            }
        }else{
            window.setTimeout(function(){ timerSessionEnd(sec-1); },1000);
            $("divSessionEndTime").innerHTML=getTimeStr(sec);
        }
    }catch(err){ GM_logError("timerSessionEnd\n"+err); }
    }
    var valSessionEndtime=null;
    if (unsafeWindow.logout_remain){
        valSessionEndtime=Math.floor(now+unsafeWindow.logout_remain);
        window.setTimeout(function(){
            var newdiv=createElement("div",{"id":"divSessionEnd","class":"alertbubble tbig link"},ALL,getText("relogin").replace(/%1%/,"<span id='divSessionEndTime'>0</span>"));
            newdiv.addEventListener("click",do_relogin,false);
            timerSessionEnd(Math.max(0,valSessionEndtime-now-30));
            newdiv=null;
            raiseEvent("gameSessionEnds");
        },Math.max(1,1000*unsafeWindow.logout_remain-getRandom(600000,1800000)));
    }

    // Statistik
    err_trace="Statistic";
    if (STAT_SERVER[COUNTRY]){
        function buildStatistik(mode){
        try{
            var modeDefault={"category":"c","npc":true,"showAll":false,"time":120};
            var modeOld=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeStatistic"),"buildStatistik/modeOld");
            if(typeof modeOld!="object"){ modeOld=modeDefault; }
            if(typeof mode!="object"){ mode=modeOld; }
            for(var v in modeDefault){
                if(!modeDefault.hasOwnProperty(v)){ continue; }
                if(mode[v]==undefined){ mode[v]=(modeOld[v]==undefined?modeDefault[v]:modeOld[v]); }
            }
            GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeStatistic",implode(mode,"buildStatistik/mode"));      
            var container=$("statisticArea");
            container.innerHTML="";

            // Header
            var newdiv=createElement("div",{"style":"position:fixed;width:90%;margin-left:5%;z-index:10;border:2px solid black;color:black;background-color:#ccf;"},container);
            var newselect=createElement("select",{"class":"link","style":"margin-right:20px;"},newdiv);
            createElement("option",{"value":"24"},newselect,getText("stat_days1"));
            createElement("option",{"value":"72"},newselect,getText("stat_days3"));
            createElement("option",{"value":"120"},newselect,getText("stat_days5"));
            createElement("option",{"value":"168"},newselect,getText("stat_days7"));
            newselect.value=mode["time"];
            newselect.addEventListener("change",function(){
                buildStatistik({"time":parseInt(this.value,10)});
            },false);

            newselect=createElement("input",{"type":"checkbox","class":"link","checked":mode["npc"]},newdiv);
            newselect.addEventListener("click",function(){
                buildStatistik({"npc":this.checked});
            },false);
            createElement("span",{"style":"margin-right:20px;"},newdiv,getText("NPC"));

            newselect=createElement("input",{"type":"checkbox","class":"link","checked":mode["showAll"]},newdiv);
            newselect.addEventListener("click",function(){
                buildStatistik({"showAll":this.checked});
            },false);
            createElement("span",{"style":"margin-right:20px;"},newdiv,getText("showAll"));

            var help={};
            for (var v=0;v<prodBlock[0].length;v++){
                if(prodBlock[0][v]==undefined){ continue; }
                if((!prodBlock[0][v].match(/t/))&&(mode["showAll"]||!prodBlock[0][v].match(/[lq]/))){
                    help[prodTyp[0][v]]=true;
                }
            }
            newselect=createElement("select",{"class":"link","style":"margin-right:20px;"},newdiv);
            for(var v in help){
                if(!help.hasOwnProperty(v)){ continue; }
                createElement("option",{"value":v},newselect,getText("category_"+v));
            }
            newselect.value=mode["category"];
            newselect.addEventListener("change",function(){
                buildStatistik({"category":this.value});
            },false);
            newselect=createElement("img",{"class":"link","src":GFX+"close.jpg","style":"position:absolute;top:8px;right:8px;width:20px;height:20px;"},newdiv);
            newselect.addEventListener("click",function(){
                $("gameArea").style.display="block";
                $("statisticArea").style.display="none";
                $("statisticArea").innerHTML="";
            },false);
            

            // Body
            newdiv=createElement("div",{"style":"overflow-y:auto;overflow-x:hidden;color:black;padding-top:30px;"},container);
            var newdiv1,newimg,newobject;
            for (var v=0;v<prodName[0].length;v++){
                if(prodName[0][v]==undefined){ continue; }
                if ((prodTyp[0][v]==mode["category"])&&(!prodBlock[0][v].match(/t/))&&(mode["showAll"]||!prodBlock[0][v].match(/[lq]/))){
                    newdiv1=createElement("div",{"id":"stat"+v,"class":"link smallStatistic"},newdiv);
                    if(prodBlock[0][v]){
                        createElement("div",{"style":"height:14px;font-weight:bold;color:red;"},newdiv1,prodName[0][v]+", "+moneyFormat(gut[v]));
                    }else{
                        createElement("div",{"style":"height:14px;font-weight:bold;"},newdiv1,prodName[0][v]+", "+numberFormat(prodStock[0][v],0)+", "+moneyFormat(gut[v])+", "+moneyFormat(gutBeob[v]));
                    }
                    var url=STAT_SERVER[COUNTRY]+"/chart.php?w=400&h=200&t=h"+mode["time"]+"&shownpc="+(mode["npc"]?1:0)+"&clip=1&lng1="+COUNTRY+"&server1="+SERVER+"&product1="+v+"&color1=green";
                    newobject=createElement("object",{"data":url,"type":"type=image/svg+xml","width":"400px","height":"200px"},newdiv1);
                    createElement("param",{"name":"src","value":url},newobject);
                    createElement("div",{"class":"v"+v,"style":"position:absolute;bottom:10px;left:10px;z-index:2;"},newdiv1);
                    createElement("div",{"style":"position:absolute;top:0;left:0;width:100%;height:100%;z-index:2;"},newdiv1);
                    newdiv1.addEventListener("click",function(){
                        showStatisticFullscreen(this.id.replace("stat",""));
                    },false);
                } 
            }
            /*
            if (isNaN(mode)){
            }else{
                newdiv1=createElement("div",{"style":"margin:5px;"},newdiv);
                createElement("div",{"style":"font-weight:bold"},newdiv1,prodName[0][mode]+", "+numberFormat(prodStock[0][mode],0)+", "+moneyFormat(gut[mode])+", "+moneyFormat(gutBeob[mode]));
                var breit=(window.innerWidth-60);
                var hoch=(window.innerHeight-130);
                var url=STAT_SERVER[COUNTRY]+"/chart.php?w="+breit+"&h="+hoch+"&t=h"+mode["time"]+"&shownpc="+(mode["npc"]?1:0)+"&clip=1&lng1="+COUNTRY+"&server1="+SERVER+"&product1="+mode+"&color1=green";
                newobject=createElement("object",{data:url,"type":type="image/svg+xml","width":breit+"px","height":hoch+"px"},newdiv1);
                createElement("param",{"name":"src","value":url},newobject);
                createElement("div",{"class":"v"+mode,"style":"position:relative;top:-40px;left:10px;z-index:2"},newdiv1);
            }
            */
            newdiv1=null;newimg=null;newobject=null;

            container=null;newdiv=null;newselect=null;newselect=null;
        }catch(err){ GM_logError("buildStatistik\nmode="+implode(mode)+"\n"+err); }
        }
        function sendStatData (){
        try{
            if(STAT_SERVER[COUNTRY]){
                var prodStr="";
                var preisBeob=explode(GM_getValue(COUNTRY+"_"+SERVER+"_preisBeob","[]"),"sendStatData/preisBeob",[]); //isNotSent,time,min,max,amount
                var bChanged=false;
                if(!(preisBeob instanceof Array)){
                    preisBeob=new Array();
                    bChanged=true;
                }
                gutBeob=explode(GM_getValue(COUNTRY+"_"+SERVER+"_gutBeob","[]"),"sendStatData/gutBeob",[]);
                var c=0;
                var neededTime=now-300; // Data max 5min old
                for(var v=0;v<preisBeob.length;v++){
                    if(preisBeob[v] && preisBeob[v][0] && (neededTime<preisBeob[v][1]) && (0<preisBeob[v][2]) && (preisBeob[v][2]<=gutBeob[v]) && (gutBeob[v]<=preisBeob[v][3])){
                        prodStr += ',\"product'+(++c)+'\":{\"product_id\":'+v+',\"avg_price\":'+gutBeob[v]+',\"min_price\":'+preisBeob[v][2]+',\"max_price\":'+preisBeob[v][3]+'}';
                        preisBeob[v][0]=false;
                        bChanged=true;
                    }
                }
                if(bChanged){
                    GM_setValue2(COUNTRY+"_"+SERVER+"_preisBeob",implode(preisBeob),8);
                    raiseEventTop("gameChangedBeobPrice");
                }
    
                if (c>0){
                    logBubble.add(getText("sendingXObservedPricesToServer").replace(/%1%/,c));
                    // GM_log("sendStatData sending:\n" + STAT_SERVER[COUNTRY]+'/add.php?json={\"server\":'+SERVER+',\"COUNTRY\":'+COUNTRY+',\"productcount\":'+c+prodStr+'}')
                    GM_xmlhttpRequest({
                    method: "POST",
                    url: STAT_SERVER[COUNTRY]+"/add.php",
                    data: 'json={\"server\":'+SERVER+',\"COUNTRY\":\"'+COUNTRY+'\",\"productcount\":'+c+prodStr+'}',
                    headers: {
                        "Content-Type": "application/x-www-form-urlencoded"
                    },
                    onload: function(c){
                        return function(response){
                            try{
                                logBubble.add(getText("sendingXObservedPricesToServer").replace(/%1%/,c)+" "+response.responseText)
                            }catch(err){GM_logError("sendStatData.onload\n"+err);}          
                        }
                    }(c),
                    onerror: function(response){
                        GM_logError("sendStatData.onerror\n"+response.responseText);
                    },
                    timeout: function(response){
                        GM_logError("sendStatData.timeout\n"+response.responseText);
                    }           
                    });
                    c=null;
                }
            }
        }catch(err){ GM_logError("sendStatData\n"+err); }
        }
        if(STAT_VIEW && STAT_VIEW[COUNTRY]){
            newdiv=createElement("div",{"id":"divBeraterButtonsStatistic","class":"link beraterButtonIcon hoverBgGreen","mouseOverText":getText("stat_stats")},$("divBeraterButtons"));
            createElement("img",{"src":IMAGES["graph"],"style":"position:relative;top:2px;left:0;width:25px;height:25px;"},newdiv);
            newdiv.addEventListener("click",function(){
                $("gameArea").style.display="none";
                $("statisticArea").style.display="block";
                buildStatistik();
            },false);
        }
        if (valStatistik && STAT_SERVER && STAT_SERVER[COUNTRY]){
            sendStatData();
            window.setInterval(function (){
                sendStatData();
            },310000);
        }
    }
    
    err_trace="Rack bottom";
    if(newdiv=$("canvassracklink")){
        newdiv.style.height = "55px";
    }
    if(newdiv=$("forumracklink")){
        newdiv.style.height = "55px";
    }
    if(newdiv=$("rackBottom")){
        // Spieler suchen
        newinput=createElement("input",{"value":getText("searchPlayer"),"class":"text","style":"position:absolute;top:60px;left:125px;width:85px;background:transparent;border:1px solid black;"},newdiv);
        newinput.addEventListener("click",function(){this.value="";},false);
        newinput.addEventListener("blur",function(){this.value=getText("searchPlayer");},false);
        newinput.addEventListener("keyup",function(event){
            try{
                if (event.keyCode==13){
                    // showShopframePage("http://s"+SERVER+"."+GAMEPAGES[COUNTRY]+"/stadt/stats.php?search=1&searchterm="+this.value);
                }
            }catch(err){ GM_logError("listener searchPlayer.keyup\n"+err); }
        },false);
        // Farmpedia
        newinput=createElement("a",{"href":getText("farmpediaUrl"),"target":"_blank","style":"position:absolute;top:55px;left:100px;z-index:2;","class":"link"},newdiv);
        createElement("img",{"style":"width:25px;height:25px;border:none;","src":GFX+"points.gif"},newinput);
        newinput.addEventListener("mouseover",function(event){ toolTip.show(event,getText("farmpedia")); },false);
    }

    // InfoPanel
    err_trace="InfoPanel";
    if (newdiv=$("speedlinks")){ newdiv.addEventListener("click",closeInfoPanel,false); }
    if (newdiv=$("cityline")){ newdiv.addEventListener("click",closeInfoPanel,false); }

    // Profit
    err_trace="Profit";
    newdiv=createElement("div",{"id":"divBeraterButtonsProfit","class":"link beraterButtonIcon hoverBgGreen","mouseOverText":getText("profitTable")},$("divBeraterButtons"));
    createElement("img",{"src":GFX+"farmhouse/items/76_1.png","style":"position:relative;top:-5px;left:-5px;width:40px;height:40px;"},newdiv);
    newdiv.addEventListener("click",function(){ unsafeWindow.buildInfoPanel("profit"); },false);
    
    // Preise
    err_trace="Prices";
    newdiv=createElement("div",{"id":"divBeraterButtonsPreise","class":"link beraterButtonIcon hoverBgGold","mouseOverText":getText("prices")},$("divBeraterButtons"));
    createElement("img",{"src":GFX+"money.gif","style":"width:30px;height:30px;"},newdiv);
    newdiv.addEventListener("click",function(){ unsafeWindow.buildInfoPanel("stock",{"page":1}); },false);

    // Recipes and Powerups
    err_trace="Recipes and Powerups";
    if(unsafeWindow.formulas){
        newdiv=createElement("div",{"id":"divBeraterButtonsFormulas","class":"link beraterButtonIcon hoverBgBlue","mouseOverText":getText("recipes")},$("divBeraterButtons"));
        createElement("img",{"src":GFX+"farmhouse/catalogue.gif","style":"position:relative;top:3px;left:0;width:24px;height:24px;"},newdiv);
        newdiv.addEventListener("click",function(){unsafeWindow.buildInfoPanel("formulas");},false);

        if(unsafeWindow.showPowerUps){ // hofix 13.03.2013
            unsafeOverwriteFunction("showPowerUps",function(){
                try{
                    unsafeWindow._showPowerUps();
                }catch(err){GM_logError("_showPowerUps\n"+err);}
                try{
                    var cand=$("powerselectorcontent").getElementsByClassName("blackbox");
                    for(var v=0;v<cand.length;v++){
                        if(cand[v].id.match(/^formulatimer\d+$/)){
                            cand[v].style.top="47px";
                        }
                    }
                    cand=null;
                }catch(err){GM_logError("showPowerUps\n"+err);}
            });
            unsafeWindow.showPowerUps();
        }

    }

    // Uebersicht
    err_trace="Overview";
    newdiv=$("titlepig");
    if(!newdiv){ newdiv = createElement("div",{"id":"titlepig","style":"top:12px;left:218px;width:97px;height:100px;position:absolute;"},$("headercontainer")) };
    newdiv.setAttribute("class","link");
    newdiv.addEventListener("click",function(){ unsafeWindow.buildInfoPanel("zones"); },false);
    newdiv.addEventListener("mouseover",function(event){ toolTip.show(event,getText("overview")); },false);

    // Quest
    err_trace="Quest - MouseOver";
/*
    questdata={ 
    "questid":quest number,
    "remain":seconds to the start,
    "data":{    "0":2,
                "1":{"0":{"prodId1":amountNeeded,
                          "prodId2":{"prod2a":amountNeeded,
                                     "prod2a":amountNeeded}},
                     "1":0,
                     "2":0,
                     "3":0},
                "2":{"0":points,"1":money,"2":0,"3":flagRack,"4":flagFarm","5":object,"6":0}, //Rewards
                "3":??,
                "4":??,
                "5":??,
                "6":"Short Description",
                "7":"Long Description",
                "8":waitingTime (before or after?),
                "9":??,
                "10":??},
    "entries":{"prodId1":"amountGiven","prodId2":"amountGiven"},
    "solved":0,
    "farmi":flagFarmiRewarded,
    "end":flagQuestsEnded}
*/
    highlightProducts=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_highlightProducts","[false,{}]"),"do_main/highlightProducts",[false,{}]);
    for(var type in QUESTS){
    if(!QUESTS.hasOwnProperty(type)){continue;} 
        for(var campaign in QUESTS[type]){
        if(!QUESTS[type].hasOwnProperty(campaign)){continue;}
            if(newdiv=$("quests_status_bar_"+type+campaign)){
                newdiv.setAttribute("type",implode([type,campaign],"QuestStatusBar"));
                newdiv.addEventListener("mouseover",function(event){
                    var help=explode(this.getAttribute("type"),"QuestStatusBar");
                    toolTip.show(event,questLineMouseOver(help[0],help[1]));
                },false);
            }
        }
    }
    err_trace="Quest - BeraterButton";
    newdiv=createElement("div",{"id":"divBeraterButtonsQuests","class":"link beraterButtonIcon hoverBgBlack","mouseOverText":getText("quests")},$("divBeraterButtons"));
    createElement("img",{"src":IMAGES["exclamationMark"],"style":"position:relative;top:4px;left:0;width:24px;height:24px;"},newdiv);
    newdiv.addEventListener("click",function(){unsafeWindow.buildInfoPanel("quests",null);},false);
    err_trace="Quest - Farmi amount bonus";
    farmiDailyCount=6;
    for(var v=1;v<questData["main"]["1"]["nr"];v++){
        if(QUESTS["main"]["1"][v]&&QUESTS["main"]["1"][v][3]){
            for(var w=0;w<QUESTS["main"]["1"][v][3].length;w++){
                if(QUESTS["main"]["1"][v][3][w][0]==5){
                    farmiDailyCount+=QUESTS["main"]["1"][v][3][w][1];
                }
            }
        }
    }       
    if(div=$("foodworld_questblock")){ div.removeAttribute("onclick"); }
    function calcQuestData(quTyp,campaign){
        try{
            var err_trace = "Set current data";
            // Quest data
            if(QUESTS[quTyp][campaign][questData[quTyp][campaign]["nr"]]){
                questData[quTyp][campaign]["data"]=QUESTS[quTyp][campaign][questData[quTyp][campaign]["nr"]].clone();
                for(var i=questData[quTyp][campaign]["data"][0].length-1;i>=0;i--){
                    // Alternative: if product is already given, reduce to this one
                    if(typeof questData[quTyp][campaign]["data"][0][i][0]=="object"){
                        for(var j=0;j<questData[quTyp][campaign]["data"][0][i].length;j++){
                            if(questData[quTyp][campaign]["given"][questData[quTyp][campaign]["data"][0][i][j][0]]&&questData[quTyp][campaign]["given"][questData[quTyp][campaign]["data"][0][i][j][0]][questData[quTyp][campaign]["data"][0][i][j][1]]){
                                questData[quTyp][campaign]["data"][0][i]=questData[quTyp][campaign]["data"][0][i][j];
                            }
                        }
                    }
                    // Mark the cheapest items. important at alternatives
                    if(typeof questData[quTyp][campaign]["data"][0][i][0]=="object"){
                        help=[];
                        for(var k=0;k<questData[quTyp][campaign]["data"][0][i].length;k++){
                            if(questData[quTyp][campaign]["data"][0][i][k][0]!=0){
                                help[k]=0;
                            }else if(isNaN(NPC[questData[quTyp][campaign]["data"][0][i][k][0]][questData[quTyp][campaign]["data"][0][i][k][1]])){
                                help[k]=questData[quTyp][campaign]["data"][0][i][k][2]*gut[questData[quTyp][campaign]["data"][0][i][k][1]];
                            }else{
                                help[k]=questData[quTyp][campaign]["data"][0][i][k][2]*Math.min(gut[questData[quTyp][campaign]["data"][0][i][k][1]],NPC[questData[quTyp][campaign]["data"][0][i][k][0]][questData[quTyp][campaign]["data"][0][i][k][1]]);
                            }
                            questData[quTyp][campaign]["data"][0][i][k][3]=true;
                            for(var l=0;l<k;l++){
                                if(help[k]<help[l]){ questData[quTyp][campaign]["data"][0][i][l][3]=false; }
                                else { questData[quTyp][campaign]["data"][0][i][k][3]=false; }
                            }
                        }
                        help=questData[quTyp][campaign]["data"][0].splice(i,1)
                        questData[quTyp][campaign]["data"][0]=questData[quTyp][campaign]["data"][0].concat(help[0]);
                    }else{
                        questData[quTyp][campaign]["data"][0][i][3]=true;
                    }
                }
            }else{
                questData[quTyp][campaign]["data"]=[];
            }
            // GM_log("questData["+quTyp+"]["+campaign+"]="+implode(questData[quTyp][campaign]));
            // GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_questData",implode(questData));
            // unsafeData.questData=questData.clone();
        }catch(err){ GM_logError("calcQuestData ("+err_trace+")\n"+err); }
    }
    function handleQuestData(){
        // GM_log("setQuest newQuestNr="+newQuestNr);
        try{
            var err_trace = "Get questdata";    
            if(unsafeWindow.questdata){
                // GM_log("unsafeWindow.questdata:\n"+print_r(unsafeWindow.questdata,"",true,"\n"));
                for(var campaign in QUESTS["main"]){
                    if(!QUESTS["main"].hasOwnProperty(campaign)){continue;}
                    if(unsafeWindow.questdata[campaign]){
                        if(!questData["main"][campaign]){ questData["main"][campaign]=INIT_questData["main"][campaign].clone(); }
                        if(unsafeWindow.questdata[campaign]["end"]&&(unsafeWindow.questdata[campaign]["end"]==1)){
                            questData["main"][campaign]["nr"]=QUESTS["main"][campaign].length;
                            questData["main"][campaign]["given"] = new Object();
                            questData["main"][campaign]["time"] = 0;
                        }else{
                            // if(!questData["main"][campaign]){continue;}
                            // Quest number
                            questData["main"][campaign]["nr"]=unsafeWindow.questdata[campaign]["questid"];
                            // Given
                            questData["main"][campaign]["given"] = new Object();
                            if(unsafeWindow.questdata[campaign]["entries"]){
                                for(var t in unsafeWindow.questdata[campaign]["entries"]){
                                    if(!unsafeWindow.questdata[campaign]["entries"].hasOwnProperty(t)){continue;}
                                    var prod = parseInt(t,10);
                                    var type = 0;
                                    if(!questData["main"][campaign]["given"][type]){ questData["main"][campaign]["given"][type] = new Object(); }
                                    if(!questData["main"][campaign]["given"][type][prod]){ questData["main"][campaign]["given"][type][prod] = 0; }
                                    questData["main"][campaign]["given"][type][prod] += parseInt(unsafeWindow.questdata[campaign]["entries"][t],10);
                                }
                            }
                            // Time
                            questData["main"][campaign]["time"] = now+unsafeWindow.questdata[campaign]["remain"];
                        }
                        calcQuestData("main",campaign);
                    }
                }
                // GM_log("questdata:\n"+print_r(questData["main"],"",true,"\n"));
                GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_questData",implode(questData));
                unsafeData.questData=questData.clone();
            }
            err_trace = "Calc highlightProducts"; 
            if(highlightProducts[0]){ // TODO: For all quests. Not if all given.
                highlightProducts[1]={};
                if(questData["main"]["1"]["data"]){
                    for(var j=0;j<questData["main"]["1"]["data"][0].length;j++){
                        if(questData["main"]["1"]["data"][0][j][3]){
                            highlightProducts[1][questData["main"]["1"]["data"][0][j][1]]=true;
                        }
                    }               
                }
                GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_highlightProducts",implode(highlightProducts));
            }
            handleQuestLine();
        }catch(err){ GM_logError("handleQuestData ("+err_trace+")\n"+err); }
    }
    unsafeOverwriteFunction("questInitGo",function(response,mode,b,h,l){
        try{
            unsafeWindow._questInitGo(response,mode,b,h,l);
        }catch(err){GM_logError("_questInitGo\n"+err);}
        try{
            handleQuestData();
        }catch(err){GM_logError("questInitGo\n"+err);}
    });
    function handleQuestDataFoodworld(){
        // GM_log("setQuest newQuestNr="+newQuestNr);
        try{
            var err_trace = "Get questdata";    
            if(unsafeWindow.foodworld_quest){
                // GM_log("unsafeWindow.foodworld_quest:\n"+print_r(unsafeWindow.foodworld_quest,"",true,"\n"));
                if(!questData["foodworld"]){ questData["foodworld"]={}; }
                for(var campaign in QUESTS["foodworld"]){
                    if(!QUESTS["foodworld"].hasOwnProperty(campaign)){continue;}
                    if(!questData["foodworld"][campaign]){ 
                        questData["foodworld"][campaign]=INIT_questData["foodworld"][campaign].clone(); 
                    }
                    if(campaign==unsafeWindow.foodworld_quest["campaignid"]){
                        if(unsafeWindow.foodworld_quest["questid"]){
                            // Quest number
                            questData["foodworld"][campaign]["nr"]=unsafeWindow.foodworld_quest["questid"];
                            // Given
                            questData["foodworld"][campaign]["given"] = new Object();
                            if(unsafeWindow.foodworld_quest["entries"]){
                                for(var t in unsafeWindow.foodworld_quest["entries"]){
                                    if(!unsafeWindow.foodworld_quest["entries"].hasOwnProperty(t)){continue;}
                                    var prod = parseInt(t,10);
                                    var type = 0;
                                    if(!questData["foodworld"][campaign]["given"][type]){ questData["foodworld"][campaign]["given"][type] = new Object(); }
                                    if(!questData["foodworld"][campaign]["given"][type][prod]){ questData["foodworld"][campaign]["given"][type][prod] = 0; }
                                    questData["foodworld"][campaign]["given"][type][prod] += parseInt(unsafeWindow.foodworld_quest["entries"][t],10);
                                }
                            }
                            // Time
                            questData["foodworld"][campaign]["time"] = now+unsafeWindow.foodworld_quest["remain"];
                        }else{
                            questData["foodworld"][campaign]["nr"]=QUESTS["foodworld"][campaign].length;
                            questData["foodworld"][campaign]["given"] = new Object();
                            questData["foodworld"][campaign]["time"] = 0;
                        }
                    }else{
                        questData["foodworld"][campaign]["nr"]=QUESTS["foodworld"][campaign].length;
                        questData["foodworld"][campaign]["given"] = new Object();
                        questData["foodworld"][campaign]["time"] = 0;
                    }
                    calcQuestData("foodworld",campaign);
                // GM_log("questdata:\n"+print_r(questData["foodworld"],"",true,"\n"));
                }
                GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_questData",implode(questData));
                unsafeData.questData=questData.clone();
            }
            div=null;
        }catch(err){ GM_logError("handleQuestData ("+err_trace+")\n"+err); }
    }

    // mouseover showing quest data
    function questLineMouseOver(questType,campaign){
        try{
            var container=createElement("div");
            var questDataCurr = questData[questType][campaign];
            var questCurr = QUESTS[questType][campaign][questDataCurr["nr"]];
            var questStarted = (questDataCurr["time"]<now);
            var table=createElement("table",{"border":"0","cellspacing":"0","cellpadding":"3","style":"line-height:16px;"},container);
            var tr=createElement("tr",{},table);
            var td=createElement("td",{"colspan":"3","style":"text-align:center;border-bottom:1px solid black;font-weight:bold;"},tr,getText("quest"+questType+campaign)+"<br>"+getText("nr")+" "+questDataCurr["nr"]);
            if(questStarted){ createElement("td",{"colspan":"2","style":"text-align:center;border-bottom:1px solid black;border-left:1px solid black;"},tr,getText("given")); }
            createElement("td",{"colspan":"2","style":"text-align:center;border-bottom:1px solid black;border-left:1px solid black;"},tr,getText("missing"));
            createElement("td",{"colspan":"2","style":"text-align:center;border-bottom:1px solid black;border-left:1px solid black;"},tr,getText("total"));
            var sumWert=[0,0,0]; //given,needed,total
            var menge,item,preis;
            for(var v=0;v<questDataCurr["data"][0].length;v++){
                item=questDataCurr["data"][0][v];
                menge=[,,item[2]];
                if(questStarted){ menge[0]=(questDataCurr["given"]&&questDataCurr["given"][item[0]]&&questDataCurr["given"][item[0]][item[1]])?questDataCurr["given"][item[0]][item[1]]:0; }
                else{ menge[0]=0; }
                menge[1]=Math.max(0,menge[2]-menge[0]-prodStock[item[0]][item[1]]);
                preis=null;
                if(item[0]==0){
                    preis=gut[item[1]]; 
                    if(!isNaN(NPC[item[0]][item[1]])){ preis=Math.min(preis,NPC[item[0]][item[1]]); }
                }
                tr=createElement("tr",{},table);
                if(!item[3]){ tr.style.textDecoration="line-through"; }
                td=createElement("td",{},tr);
                produktPic(item[0],item[1],td);
                createElement("td",{},tr,prodName[item[0]][item[1]]);
                createElement("td",{"style":"text-align:right;"},tr,numberFormat(100*(menge[2]-menge[1])/menge[2])+"%");
                for(var i=0;i<3;i++){
                    if((i==0)&&(!questStarted)){ continue; }
                    if(item[3]&&(preis!=null)){ sumWert[i] += menge[i]*preis; }
                    createElement("td",{"style":"text-align:right;border-left:1px solid black;"},tr,numberFormat(menge[i]));
                    createElement("td",{"style":"text-align:right;padding-left:10px;"},tr,preis!=null?moneyFormatInt(menge[i]*preis):"--");
                }
            }

            tr=createElement("tr",{},table);
            createElement("td",{"colspan":"2","style":"border-top:1px solid black;"},tr);
            createElement("td",{"style":"text-align:right;border-top:1px solid black;"},tr,numberFormat(100*(sumWert[2]-sumWert[1])/(sumWert[2]))+"%");
            for(var i=0;i<3;i++){
                if((i==0)&&(!questStarted)){ continue; }
                createElement("td",{"style":"text-align:right;border-top:1px solid black;","colspan":"2"},tr,moneyFormatInt(sumWert[i]));
            }
            
            table=createElement("table",{"border":"0","cellspacing":"0","cellpadding":"3","style":"line-height:16px;"},container);
            tr=createElement("tr",{},table);
            createElement("td",{"style":"vertical-align:top;"},tr,getText("reward")+":");
            td=createElement("td",{},tr);
            var div;
            if(questCurr[2]>0){
                pointsFormat(questCurr[2],"div",td);
            }
            if(questCurr[3]){
                for(var w=0;w<questCurr[3].length;w++){
                    switch(questCurr[3][w][0]){
                    case 0:{
                        createElement("div",{},td,moneyFormat(questCurr[3][w][1]));
                    break;}
                    case 1:{
                        div=createElement("div",{},td);
                        produktPic(questCurr[3][w][1],questCurr[3][w][2],div);
                        createElement("span",{},div,numberFormat(questCurr[3][w][3])+"&nbsp;"+prodName[questCurr[3][w][1]][questCurr[3][w][2]]);
                    break;}
                    case 2:{
                        createElement("div",{},td,getText("activation")+": "+getText("rackX").replace(/%1%/,questCurr[3][w][1]));
                    break;}
                    case 3:{
                        createElement("div",{},td,getText("activation")+": "+getText("farmX").replace(/%1%/,questCurr[3][w][1]));
                    break;}
                    case 4:{
                        div=createElement("div",{},td);
                        produktPic(questCurr[3][w][1],questCurr[3][w][2],div);
                        createElement("span",{},div,getText("productTimeSaving").replace(/%1%/,questCurr[3][w][3]).replace(/%2%/,prodName[questCurr[3][w][1]][questCurr[3][w][2]]));
                    break;}
                    case 5:{
                        div=createElement("div",{},td);
                        createElement("img",{"src":GFX+"adbonus.gif","style":"border:0;height:15px;"},div);
                        createElement("span",{},div,getText("additionalFarmi").replace(/%1%/,questCurr[3][w][1]));
                    break;}
                    case 6:{
                        createElement("div",{},td,getText("additionalLogCapacity").replace(/%1%/,questCurr[3][w][1]));
                    break;}
                    case 7:{
                        createElement("div",{},td,getText("waterBonus").replace(/%1%/,questCurr[3][w][1]));
                    break;}
                    case 8:{
                        if(DATA_zones[questCurr[3][w][1]]["location"]=="farm"){
                            createElement("div",{},td,getText("activation")+": "+getText("farmzone").replace(/%1%/,1+((questCurr[3][w][1]-1)%6)).replace(/%2%/,Math.ceil(questCurr[3][w][1]/6)));
                        }else{
                            createElement("div",{},td,getText("activation")+": "+zones.getBuildingName(questCurr[3][w][1]));
                        }
                    break;}
                    case 9:{
                        div=createElement("div",{},td);
                        createElement("span",{},div,getText("activation")+": ");
                        produktPic(questCurr[3][w][1],questCurr[3][w][2],div);
                        createElement("span",{},div,prodName[questCurr[3][w][1]][questCurr[3][w][2]]);
                    break;}
                    case 10:{
                        createElement("div",{},td,getText("activation")+": "+getText("wateringFeature"));
                    break;}
                    case 11:{
                        div=createElement("div",{},td);
                        createElement("img",{"src":GFX+"adbonus.gif","style":"border:0;height:15px;"},div);
                        createElement("span",{},div,getText("additionalForestFarmiSlot").replace(/%1%/,questCurr[3][w][1]));
                    break;}
                    }
                }
            }
            tr=createElement("tr",{},table);
            createElement("td",{},tr,getText("start")+": ");
            createElement("td",{},tr,getDateText(questDataCurr["time"])+" "+getDaytimeStr(questDataCurr["time"]));
            
            div=null;
            table=null;tr=null;td=null;
            return container.innerHTML;
        }catch(err){
            GM_logError("questLineMouseOver\n"+err);
            try{
                switch(questType){
                case "main":{ return (getText("informationIsMissing")+" "+getText("pleaseOpenX").replace(/%1%/,getText("quest"+questType+campaign))); break;}
                case "forestry":{ return (getText("informationIsMissing")+" "+getText("pleaseOpenX").replace(/%1%/,getText("lodge"))); break;}
                case "foodworld":{ return (getText("informationIsMissing")+" "+getText("pleaseOpenX").replace(/%1%/,getText("foodworld"))); break;}
                }
            }catch(err){}
            return null; 
        }
    }
    unsafeOverwriteFunction("showQuestBox",function(c){
        try{
            unsafeWindow._showQuestBox(c);
        }catch(err){GM_logError("_showQuestBox\n"+err);}
        try{
            var cand=$("questboxobjects").getElementsByClassName("questboxbarout");
            for(var i=0;i<cand.length;i++){
                var questWare = parseInt(cand[i].children[0].id.replace("questboxbarin",""),10);
                var menge = [0,0,0]; //given,stock,total
                for(var v in unsafeWindow.questdata[c]["data"][1][0]){
                    if(!unsafeWindow.questdata[c]["data"][1][0].hasOwnProperty(v)){ continue; }
                    if(typeof unsafeWindow.questdata[c]["data"][1][0][v]=="object"){
                        if(unsafeWindow.questdata[c]["data"][1][0][v][questWare]){
                            menge[2] = unsafeWindow.questdata[c]["data"][1][0][v][questWare];
                        }
                    }else{
                        if(v==questWare){
                            menge[2] = unsafeWindow.questdata[c]["data"][1][0][v];
                        }
                    }
                }
                menge[0]=((unsafeWindow.questdata[c]["entries"]&&unsafeWindow.questdata[c]["entries"][questWare])?parseInt(unsafeWindow.questdata[c]["entries"][questWare],10):0);
                menge[1]=Math.min(menge[2]-menge[0],prodStock[0][questWare]);
                createElement("div",{"style":"width:"+Math.floor(200*menge[1]/menge[2])+"px;left:"+Math.floor(200*(menge[0])/menge[2])+"px;","class":"questboxbarinPoss"},cand[i]);
                // better number-formatting
                $("questboxobj"+questWare+"_current").innerHTML = numberFormat(menge[0]);
                $("questboxobj"+questWare+"_need").innerHTML = numberFormat(menge[2]);
            }
        }catch(err){ GM_logError("showQuestBox\n"+err); }       
    });
    unsafeOverwriteFunction("questsHandler",function(status){
        try{
            unsafeWindow._questsHandler(status);
        }catch(err){GM_logError("_questsHandler\n"+err);}
        try{
            handleQuestLine();
        }catch(err){GM_logError("questsHandler\n"+err);}
    });
/* todo:
    raiseEvent("gameQuestSolvable");
    raiseEvent("gameQuestNewAvailable");
    raiseEvent("gameQuestFinished");
    raiseEvent("gameQuestAccepted");
*/
    unsafeOverwriteFunction("showQuestBoxLine",function(){
        try{
            unsafeWindow._showQuestBoxLine();
        }catch(err){GM_logError("_showQuestBoxLine\n"+err);}
        try{
            handleQuestLine();
        }catch(err){GM_logError("showQuestBoxLine\n"+err);}
    });
    function updateQuestLineTimer(){
    try{
return false;   
        for(var type in QUESTS){
            if (!QUESTS.hasOwnProperty(type)){ continue; }
            if (type=="main"){ continue; }
            for(var campaign in QUESTS[type]){
                if (!QUESTS[type].hasOwnProperty(campaign)){ continue; }
                if(nodes["questline_"+type+"_"+campaign]&&nodes["questline_"+type+"_"+campaign]["node"]){
                    if(now<questData[type][campaign]["time"]){
                        nodes["questline_"+type+"_"+campaign]["node"].children[1].innerHTML = getTimeStr(questData[type][campaign]["time"]-now,false)+" "+getText("shortHours");
                    }else{
                        handleQuestLine();
                    }
                }
            }
        }
    }catch(err){GM_logError("updateQuestLineTimer\ntype="+type+"\ncampaign="+campaign+"\n"+err);}
    }
    handleQuestData(); // --> handleQuestLine
    
    // SHOW RACK DATA
    err_trace="Show rack data";
    function showDataAllProducts(){
    try{
        var container=createElement("div",{"style":"z-index:995;position:absolute;top:0;left:0;background-color:white;height:100%;"},ALL);
        var div=createElement("img",{"class":"link","src":GFX+"close.jpg","style":"position:absolute;top:0;right:0;width:20px;height:20px;margin:5px;"},container);
        div.addEventListener("click",function(){ removeElement(this.parentNode); },false);
        div=createElement("div",{"style":"height:100%;padding-right:20px;margin-right:30px;overflow:auto;"},container);
        var table=createElement("table",{"border":"1"},div);
        var tr,td,newDiv1;
        for(var type in prodName){
        try{
            if(!prodName.hasOwnProperty(type)){continue;}
            tr=createElement("tr",{"style":"background-color:orange;color:black;"},table);
            createElement("th",{"colspan":"16"},tr,type+": "+["farm","forestry","recipes","powerups"][type]);
            tr=createElement("tr",{"style":"background-color:orange;color:black;"},table);
            createElement("th",{"style":"white-space:nowrap;"},tr,"id");
            createElement("th",{"style":"white-space:nowrap;"},tr,"Name");
            createElement("th",{},tr,"Typ");
            createElement("th",{},tr,"Stock");
            createElement("th",{},tr,"MaxStock");
            createElement("th",{},tr,"MinRack");
            createElement("th",{},tr,"MinRackInit");
            createElement("th",{},tr,"PlantSize");
            createElement("th",{},tr,"Block");
            createElement("th",{},tr,"Require");
            createElement("th",{},tr,"Yield");
            createElement("th",{},tr,"GrowTime");
            createElement("th",{},tr,"Points");
            createElement("th",{},tr,"NPC");
            createElement("th",{},tr,"gut");
            createElement("th",{},tr,"loc");
            for(var v in prodName[type]){
            try{
                if(!prodName[type].hasOwnProperty(v)){continue;}
                tr=createElement("tr",{},table);
                createElement("td",{},tr,v);
                td=createElement("td",{"style":"white-space:nowrap;"},tr);
                    produktPic(type,v,td);
                    createElement("span",{},td,prodName[type][v]);
                td=createElement("td",{},tr,prodTyp[type][v]);
                td=createElement("td",{},tr,numberFormat(prodStock[type][v]));
                td=createElement("td",{},tr,numberFormat(prodStockMax[type][v]));
                td=createElement("td",{},tr,numberFormat(prodMinRack[type][v]));
                td=createElement("td",{},tr,numberFormat(prodMinRackInit[type][v]));
                td=createElement("td",{},tr,prodPlantSize[type][v]);
                td=createElement("td",{},tr,prodBlock[type][v]);
                td=createElement("td",{},tr);
                if(typeof prodRequire[type][v]=="object"){
                    for(var i=0;i<prodRequire[type][v].length;i++){
                        if(i>0){ createElement("div",{"style":"display:inline-block;white-space:nowrap;"},td,";&nbsp;"); }
                        if(prodRequire[type][v][i][0]>-1){
                            newDiv1=createElement("div",{"style":"display:inline-block;white-space:nowrap;","class":"hoverBgLightblue","prodType":prodRequire[type][v][i][0],"prodId":prodRequire[type][v][i][1]},td);
                            newDiv1.addEventListener("mouseover",function(event){
                                toolTip.show(event,prodName[this.getAttribute("prodType")][this.getAttribute("prodId")]);
                                //toolTip.show(event,prodName[parseInt(this.getAttribute("prodType"),10)][parseInt(this.getAttribute("prodId"),10)]);
                            },false);
                            produktPic(prodRequire[type][v][i][0],prodRequire[type][v][i][1],newDiv1);
                            createElement("span",{},newDiv1,numberFormat(prodRequire[type][v][i][2]));
                        }else{
                            newDiv1=createElement("div",{"style":"display:inline-block;white-space:nowrap;","class":"hoverBgLightblue"},td);
                            createElement("span",{},newDiv1,moneyFormat(prodRequire[type][v][i][1]));
                        }
                    }
                }
                td=createElement("td",{},tr,prodYield[type][v]);
                td=createElement("td",{},tr,prodGrowTime[type][v]>0?getTimeStr(60*prodGrowTime[type][v],true):"");
                td=createElement("td",{},tr,prodPoints[type][v]==undefined?"-":numberFormat(prodPoints[type][v]));
                td=createElement("td",{},tr);
                if(!NPC[type][v]){
                    createElement("span",{},td,"-");
                }else if(!isNaN(NPC[type][v])){
                    createElement("span",{},td,moneyFormat(NPC[type][v]));
                }else if (NPC[type][v].match(/^f/)){
                    createElement("span",{},td,"*"+moneyFormat(parseFloat(NPC[type][v].replace("f",""),10)));
                }else if (NPC[type][v].match(/^c/)){
                    coinsFormat(parseInt(NPC[type][v].replace("c",""),10),td);
                }
                td=createElement("td",{},tr,gut[v]==undefined||type>0?"-":moneyFormat(gut[v]));
                td=createElement("td",{},tr,PRODUCT2BUILDING[type][v]);
            }catch(err){ GM_logError("showDataAllProducts type="+type+" v="+v+"\n"+err); }
            }
        }catch(err){ GM_logError("showDataAllProducts type="+type+"\n"+err); }
        }
        container=null;div=null;
        table=null;tr=null;td=null;newDiv1=null;
    }catch(err){ GM_logError("showDataAllProducts\n"+err); }
    }
    GM_registerMenuCommand(getText("adviser")+" "+"Show Data: Products", showDataAllProducts);
    
    // SHOW ZONE DATA
    err_trace="Show zone data";
    function showDataAllZones(){
    try{
        var prType,zoneNrS,allZones=[],currZoneType,help;
        var style="";
        for(var i in ALL_ZONES){
            if(!ALL_ZONES.hasOwnProperty(i)){ continue; }
            for(var j=0;j<ALL_ZONES[i].length;j++){
                allZones.push(ALL_ZONES[i][j].toString());
                if(zones.isMultiSlot(ALL_ZONES[i][j])){
                    for(var slot=1;slot<=3;slot++){
                        allZones.push(ALL_ZONES[i][j]+"."+slot);
                    }
                }
            }
        }
        var container=createElement("div",{"style":"z-index:995;position:absolute;top:0;left:0;background-color:white;height:100%;"},ALL);
        var div=createElement("img",{"class":"link","src":GFX+"close.jpg","style":"position:absolute;top:0;right:0;width:20px;height:20px;margin:5px;"},container);
        div.addEventListener("click",function(){ removeElement(this.parentNode); },false);
        div=createElement("div",{"style":"height:100%;padding-right:20px;margin-right:30px;overflow:auto;"},container);
        var table=createElement("table",{"border":"1"},div);
        var tr=createElement("tr",{},table);
        var td=createElement("td",{},tr,"Nr");
        createElement("td",{},tr,"Type(building,BUILDINGTYPE)");
        createElement("td",{},tr,"Block");
        createElement("td",{},tr,"AddToGlobalTime");
        createElement("td",{},tr,"Animals");
        createElement("td",{},tr,"Bonus");
        createElement("td",{},tr,"BonusSpecial");
        createElement("td",{},tr,"EndProduct");
        createElement("td",{},tr,"EndTime");
        createElement("td",{},tr,"WaterTime");
        createElement("td",{},tr,"Ernte");
        createElement("td",{},tr,"FieldData");

        
        for(var i=0;i<allZones.length;i++){
        try{
            zoneNrS=allZones[i];
            style="color:"+(zones.getBlock(zoneNrS)?"lightgrey;":"black;");
            tr=createElement("tr",{},table);
            createElement("td",{"style":style},tr,zoneNrS);
            switch(zones.getLocation(zoneNrS).location){
            case "windmill":{ prType=3; } break;
            case "forestry":{ prType=1; } break;
            default:{ prType=0; }
            }
            if(currZoneType=zones.getBuilding(zoneNrS)){
                createElement("td",{"style":style},tr,getBuildingName(currZoneType)+" ("+currZoneType+","+BUILDINGTYPE[currZoneType]+")");
            }else{
                createElement("td",{"style":style},tr,"");
            }
            createElement("td",{"style":style},tr,zones.getBlock(zoneNrS));
            createElement("td",{"style":style},tr,(isNaN(zoneNrS)?!!zoneAddToGlobalTime[zoneNrS]:true).toString());
            createElement("td",{"style":style},tr,isNaN(zones.getAnimals(zoneNrS))?"":numberFormat(zones.getAnimals(zoneNrS)));
            createElement("td",{"style":style},tr,isNaN(zones.getBonus(zoneNrS))?"":(numberFormat(zones.getBonus(zoneNrS))+"%"));
            td=createElement("td",{"style":style},tr);
            if(zones.getBonusSpecial(zoneNrS)){
                createElement("span",{},td,numberFormat(zones.getBonusSpecial(zoneNrS)[1])+"%");
                produktPic(0,zones.getBonusSpecial(zoneNrS)[0],td);
                createElement("span",{},td,"("+numberFormat(zones.getBonusSpecial(zoneNrS)[0])+")");
            }
            td=createElement("td",{"style":style},tr);
            if(help=zones.getEndproduct(zoneNrS)){
                produktPic(prType,help,td);
                createElement("span",{},td,"("+prType+","+help+")");
            }
            help=zones.getEndtime(zoneNrS);
            td=createElement("td",{"style":style+(help<now?"font-weight:bold;":"")},tr);
            if(help){
                if(help==NEVER){
                    createElement("div",{},td,"NEVER");
                } else {
                    createElement("div",{},td,getDateText(help));
                    createElement("div",{},td,getDaytimeStr(help,false,true));
                }
            }
            help=zones.getWatertime(zoneNrS);
            td=createElement("td",{"style":style+(help<now?"font-weight:bold;":"")},tr);
            if(help){
                if(help==NEVER){
                    createElement("div",{},td,"NEVER");
                } else {
                    createElement("div",{},td,getDateText(help));
                    createElement("div",{},td,getDaytimeStr(help,false,true));
                }
            }
            td=createElement("td",{"style":style},tr);
            if(help=zones.getCrop(zoneNrS)){
                for(var j=0;j<help.length;j++){
                    div=createElement("div",{"style":"white-space:nowrap;"},td);
                    produktPic(help[j][0],help[j][1],div);
                    createElement("span",{},div,numberFormat(help[j][2])+"(");
                    pointsFormat(help[j][3],"span",div);
                    createElement("span",{},div,")");
                }
            }
            td=createElement("td",{"style":style},tr);
            if(help=zones.getProduction(zoneNrS)){
                createElement("div",{"style":"white-space:nowrap;"},td,print_r(help));
            }
        }catch(err){ GM_logError("showDataAllZones row zoneNrS="+zoneNrS+"\n"+err); }
        }
        container=null;div=null;
        table=null;tr=null;td=null;
    }catch(err){ GM_logError("showDataAllZones\n"+err); }
    }
    GM_registerMenuCommand(getText("adviser")+" "+"Show Data: Zones", showDataAllZones);

    /*
    function showDataForestryFarmi(){
        var div=createElement("div",{"style":"z-index:995;position:fixed;top:0;background-color:white;height:800px;overflow:auto;padding-right:40px;"},ALL);
        var newimg=createElement("img",{"class":"link","src":GFX+"close.jpg","style":"position:absolute;top:8px;right:0px;width:20px;height:20px;"},div);
        newimg.addEventListener("click",function(){ removeElement(this.parentNode); },false);
        var table=createElement("table",{"border":"1"},div);
        var tr=createElement("tr",{},table);
        createElement("td",{"style":"max-width:120px;"},tr,"ID");
        for(var k in prodName[1]){
            if(!prodName[1].hasOwnProperty(k)){continue;}
            if(k>=500){continue;}
            produktPic(1,k,createElement("td",{"style":"max-width:120px;"},tr));
        }
        createElement("td",{"style":"max-width:120px;"},tr,"price");
        createElement("td",{"style":"max-width:120px;"},tr,"points");

        var tr=createElement("tr",{},table);
        createElement("td",{"style":"max-width:120px;"},tr,"ID");
        for(var k in prodName[1]){
            if(!prodName[1].hasOwnProperty(k)){continue;}
            if(k>=500){continue;}
            createElement("td",{"style":"max-width:120px;"},tr,k);
        }

        if(unsafeWindow.forestry_production_products.length>0){
            var tr=createElement("tr",{},table);
            createElement("td",{"style":"max-width:120px;"},tr,"{1}");
            for(var k in prodName[1]){
                if(!prodName[1].hasOwnProperty(k)){continue;}
                if(k>=500){continue;}
                createElement("td",{"style":"max-width:120px;"},tr,unsafeWindow.forestry_production_products[prodTyp[1][k].replace("f","")][k]?unsafeWindow.forestry_production_products[prodTyp[1][k].replace("f","")][k][1]:"-");
            }
            var tr=createElement("tr",{},table);
            createElement("td",{"style":"max-width:120px;"},tr,"{7}");
            for(var k in prodName[1]){
                if(!prodName[1].hasOwnProperty(k)){continue;}
                if(k>=500){continue;}
                createElement("td",{"style":"max-width:120px;"},tr,unsafeWindow.forestry_production_products[prodTyp[1][k].replace("f","")][k]?unsafeWindow.forestry_production_products[prodTyp[1][k].replace("f","")][k][7]:"-");
            }
        }

        var farmies=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_forestry_farmies","{}"),"showDataForestryFarmi/forestry_farmies",{});
        for(var v in farmies){
            if(!farmies.hasOwnProperty(v)){continue;}
            tr=createElement("tr",{},table);
            createElement("td",{},tr,v);
            farmies[v]["products"].sort(function(a,b){return -1*((parseInt(b["product"],10)>parseInt(a["product"],10))-(parseInt(b["product"],10)<parseInt(a["product"],10)));});
            for(var k in prodName[1]){
                if(!prodName[1].hasOwnProperty(k)){continue;}
                if(k>=500){continue;}
                td=createElement("td",{"style":"white-space:nowrap;"},tr);
                for(var i in farmies[v]["products"]){
                    if(!farmies[v]["products"].hasOwnProperty(i)){continue;}
                    if(farmies[v]["products"][i]["product"]==k){
                        createElement("span",{},td,farmies[v]["products"][i]["amount"]);
                        //createElement("span",{},td," x ");
                        //createElement("span",{},td,farmies[v]["products"][i]["product"]);
                        produktPic(1,farmies[v]["products"][i]["product"],td);
                    }

                }
            }
            createElement("td",{"style":"white-space:nowrap;"},tr,farmies[v]["price"]);
            createElement("td",{"style":"white-space:nowrap;"},tr,farmies[v]["points"]);
        }
        farmies=null;

        var tr=createElement("tr",{},table);
        createElement("td",{"style":"max-width:120px;"},tr,"ID");
        for(var k in prodName[1]){
            if(!prodName[1].hasOwnProperty(k)){continue;}
            if(k>=500){continue;}
            produktPic(1,k,createElement("td",{"style":"max-width:120px;"},tr));
        }
        createElement("td",{"style":"max-width:120px;"},tr,"price");
        createElement("td",{"style":"max-width:120px;"},tr,"points");

        var tr=createElement("tr",{},table);
        createElement("td",{"style":"max-width:120px;"},tr,"ID");
        for(var k in prodName[1]){
            if(!prodName[1].hasOwnProperty(k)){continue;}
            if(k>=500){continue;}
            createElement("td",{"style":"max-width:120px;"},tr,k);
        }

        if(unsafeWindow.forestry_production_products.length>0){
            var tr=createElement("tr",{},table);
            createElement("td",{"style":"max-width:120px;"},tr,"{1}");
            for(var k in prodName[1]){
                if(!prodName[1].hasOwnProperty(k)){continue;}
                if(k>=500){continue;}
                createElement("td",{"style":"max-width:120px;"},tr,unsafeWindow.forestry_production_products[prodTyp[1][k].replace("f","")][k]?unsafeWindow.forestry_production_products[prodTyp[1][k].replace("f","")][k][1]:"-");
            }
            var tr=createElement("tr",{},table);
            createElement("td",{"style":"max-width:120px;"},tr,"{7}");
            for(var k in prodName[1]){
                if(!prodName[1].hasOwnProperty(k)){continue;}
                if(k>=500){continue;}
                createElement("td",{"style":"max-width:120px;"},tr,unsafeWindow.forestry_production_products[prodTyp[1][k].replace("f","")][k]?unsafeWindow.forestry_production_products[prodTyp[1][k].replace("f","")][k][7]:"-");
            }
        }
    }
    GM_registerMenuCommand(getText("adviser")+" "+"Show Data: forestry Farmi", showDataForestryFarmi);
    */

    // NPC-shop
    err_trace="NPC shop";
    // TODO: function not existing anymore
    unsafeOverwriteFunction("shopDialog",function(e,d){
        try{
            unsafeWindow._shopDialog(e,d);
        }catch(err){GM_logError("_shopDialog\n"+err);}
        try{
            $("shopdialog_amount").addEventListener("keyup",function(event){
                try{
                    if (event.keyCode==13){
                        click(this.nextElementSibling);
                    }
                }catch(err){ GM_logError("listener searchPlayer.keyup\n"+err); }
            },false);
        }catch(err){GM_logError("shopDialog\n"+err);}
    });
    // Market
    err_trace="Market";
    valKauflimit=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valKauflimit","[[85,'990000'],110]"),"do_main/valKauflimit",[[85,'990000'],110]);
    valKauflimitNPC=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valKauflimitNPC",true);
    highlightProducts=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_highlightProducts","[false,{}]"),"do_main/highlightProducts",[false,{}]);
    highlightUser=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_highlight","{}"),"do_main/highlightUser",{});
    highlightUser[FARMNAME]="104e8b";
    valNimmBeob=GM_getValue(COUNTRY+"_"+SERVER+"_valNimmBeob",false);

    valVerkaufLimitDown=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valVerkaufLimitDown",95);
    valVerkaufLimitUp=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valVerkaufLimitUp",130);
    valJoinPreise=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valJoinPreise",false);
    lastOffer=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_lastOffer","[]"),"do_main/lastOffer",[]);
    protectMinRack=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valProtectMinRack",false);
    ownMarketOffers=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_ownMarketOffers","[]"),"do_main/ownMarketOffers",[]);
    
    // var mode=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeMarket","cveoz");
    function do_market(){
    // GM_log("function do_market");
    try{
        var err_trace="Init";

    
        // Berater Information Line
        err_trace="market_beraterline";
        var market_beraterline=$("market_beraterline");
        if(!market_beraterline){
            market_beraterline=createElement("div",{"id":"market_beraterline","style":"position:absolute;width:630px;height:40px;bottom:-40px;padding:0 20px 20px 20px;background:url('"+GFX+"market/market_back.jpg') repeat scroll 0px -470px transparent;"},$("market"));
        }
        market_beraterline.innerHTML="";
        for(var i=0;i<7;i++){
            createElement("div",{"style":"float:left;height:40px;width:90px;"},market_beraterline);
        }
        
        // loadProductData();
        var candtable; //document.getElementsByTagName("table");
        var candtr; //candtable[0].getElementsByTagName("tr");
        var row,row_title,canddiv,canda,candtd,newa,newinput,newspan,newdiv,newdiv1;
    
        /*
        var marktButtons=new Array();
        marktButtons[0]=document.querySelector('div[onclick*="\'marktstand.php\'"]'); // market stall
        marktButtons[1]=document.querySelector('div[onclick*="\'markt.php?filter=1&guild=1\'"]');   // club offers
        marktButtons[2]=document.querySelector('div[onclick*="\'markt.php?show=overview\'"]');  // overview
        marktButtons[3]=document.querySelector('div[onclick*="\'markt.php\'"]');    // current offers
        for(var v=0;v<marktButtons.length;v++){
            if(marktButtons[v]){
                marktButtons[v].setAttribute("class","link hoverBlack");
                marktButtons[v].id="marketButton_"+["marktstand","guild","overview","current"][v];
            }
        }
        */
        /*
        // Market mode
        newdiv=createElement("div",{"id":"offertypeselector","style":"position:absolute;top:0;left:500px;-moz-user-select:none;"},ALL);
        newdiv.addEventListener("mouseover",function(event){
            var mouseOverText=event.target.getAttribute("mouseOverText");
            if(mouseOverText){
                mouseOverText='<div>'+getText("click")+'&nbsp;/&nbsp;'+getText("clickCtrl")+'</div><div>'+mouseOverText+'</div>';
                toolTip.show(event,mouseOverText);
            }
        },false);
        var newdiv1=createElement("div",{"mouseOverText":getText("category_v"),"class":"link","style":"display:inline-block;height:20px;width:26px;background:url('"+GFX+"racksort2.jpg') repeat scroll -10px 0px transparent;"},newdiv);
        if (mode.match(/v/)){
            newdiv1.style.backgroundPosition="-10px -20px";
        }else{
            newdiv1.addEventListener("mouseout",function(){this.style.backgroundPosition="-10px 0px";},false);
            newdiv1.addEventListener("mouseover",function(){this.style.backgroundPosition="-10px -20px";},false);
        }
        newdiv1.addEventListener("click",function(event){
            if(event.ctrlKey){
                if(mode.match(/v/)){mode=mode.replace(/v/,"");}
                else{mode += "v";}}
            else{mode="v";}
            GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeMarket",mode);
            location.href=location.href;
        },false);
    
        newdiv1=createElement("div",{"mouseOverText":getText("category_c")+"<br>"+getText("category_e"),"class":"link","style":"display:inline-block;height:20px;width:26px;background:url('"+GFX+"racksort2.jpg') repeat scroll -62px 0px transparent;"},newdiv);
        if (mode.match(/c/)&&mode.match(/e/)){
            newdiv1.style.backgroundPosition="-62px -20px";
        }else{
            newdiv1.addEventListener("mouseout",function(){this.style.backgroundPosition="-62px 0px";},false);
            newdiv1.addEventListener("mouseover",function(){this.style.backgroundPosition="-62px -20px";},false);
        }
        newdiv1.addEventListener("click",function(event){
            if(event.ctrlKey){
                if(mode.match(/ce/)){mode=mode.replace(/ce/,"");}
                else{mode += "ce";}}
            else{mode="ce";}
            GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeMarket",mode);
            location.href=location.href;
        },false);
    
        newdiv1=createElement("div",{"mouseOverText":getText("category_o"),"class":"link","style":"display:inline-block;height:20px;width:26px;background:url('"+GFX+"racksort2.jpg') repeat scroll -62px 0px transparent;"},newdiv);
        if (mode.match(/o/)&&mode.match(/o/)){
            newdiv1.style.backgroundPosition="-62px -20px";
        }else{
            newdiv1.addEventListener("mouseout",function(){this.style.backgroundPosition="-62px 0px";},false);
            newdiv1.addEventListener("mouseover",function(){this.style.backgroundPosition="-62px -20px";},false);
        }
        newdiv1.addEventListener("click",function(event){
            if(event.ctrlKey){
                if(mode.match(/o/)){mode=mode.replace(/o/,"");}
                else{mode += "o";}}
            else{mode="o";}
            GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeMarket",mode);
            location.href=location.href;
        },false);
    
        newdiv1=createElement("div",{"mouseOverText":getText("category_z"),"class":"link","style":"display:inline-block;height:20px;width:26px;background:url('"+GFX+"racksort2.jpg') repeat scroll -36px 0px transparent;"},newdiv);
        if (mode.match(/z/)){
            newdiv1.style.backgroundPosition="-36px -20px";
        }else{
            newdiv1.addEventListener("mouseout",function(){this.style.backgroundPosition="-36px 0px";},false);
            newdiv1.addEventListener("mouseover",function(){this.style.backgroundPosition="-36px -20px";},false);
        }
        newdiv1.addEventListener("click",function(event){
            if(event.ctrlKey){
                if(mode.match(/z/)){mode=mode.replace(/z/,"");}
                else{mode += "z";}}
            else{mode="z";}
            GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_modeMarket",mode);
            location.href=location.href;
        },false);
        */
        var pageId=unsafeWindow.market_filter_pid;
        var userId=unsafeWindow.market_filter_name;
        var marktoffers_rows=$("marktoffers_rows");
        if(unsafeWindow.market_filter_own==0){
            // Market page
            err_trace="Market page";
            var nothingToBuy=true;
    
            // Page of a single product
            if((pageId!=-1)&&(userId=="")&&(unsafeWindow.market_guild_filter==0)){
                err_trace="Market page, single product";
                var preisKlasse=0;
                // $("offertypeselector").style.display="none";
    
                newdiv1=createElement("div",{"prod":pageId},market_beraterline.children[0]);
                newdiv1.addEventListener("mouseover",function(event){ showGoToMarketToolTip(event,this.getAttribute("prod")); },false);             
                produktPic(0,pageId,newdiv1);
                newspan=createElement("div",{"style":"display:inline-block;"},newdiv1,numberFormat(prodStock[0][pageId],0));
    
                // NPC price
                newdiv1=createElement("div",{},market_beraterline.children[0]);
                err_trace="Market page, single product, NPC";
                if(NPC[0][pageId]){
                    if(!isNaN(NPC[0][pageId])){
                        newspan=createElement("span",{},newdiv1,"NPC&nbsp;"+numberFormat(NPC[0][pageId],2));
                    }else if (NPC[0][pageId].match(/^f/)){
                        newspan=createElement("span",{},newdiv1,"*NPC*&nbsp;"+numberFormat(parseFloat(NPC[0][pageId].replace("f",""),10),2));
                    }else if (NPC[0][pageId].match(/^c/)){
                        newspan=createElement("span",{},newdiv1,"NPC&nbsp;<span style='display:inline-block;vertical-align:bottom;'>"+coinsFormat(parseInt(NPC[0][pageId].replace("c",""),10)).innerHTML+"</span>");
                        //coinsFormat(parseInt(NPC[0][pageId].replace("c",""),10),newdiv).style.cssFloat="right";
                    }
                    if((npcSaison[pageId]!=undefined)&&(!npcSaison[pageId])){
                        newspan.style.textDecoration="line-through";
                        newspan.setAttribute("class","hoverNoTextDecoration");
                    }
                }else{
                    createElement("span",{},newdiv1,"NPC&nbsp;--");
                }
                // Link to previous/next product
                err_trace="Market page, single product, prev/next";
                var c=0;
                while ((c<prodNameSort[0].length)&&(prodNameSort[0][c]!=pageId)){ c++; }
                var pageIdVor=c-1;
                if(pageIdVor<0){ pageIdVor+=prodNameSort[0].length; }
                while(prodBlock[0][prodNameSort[0][pageIdVor]].match(/t/)||prodBlock[0][prodNameSort[0][pageIdVor]].match(/l/)){
                    pageIdVor--;
                    if(pageIdVor<0){ pageIdVor+=prodNameSort[0].length; }
                }
                pageIdVor=prodNameSort[0][pageIdVor];
                var pageIdNach=c+1;
                if(pageIdNach>prodNameSort[0].length-1){ pageIdNach=0; }
                while(prodBlock[0][prodNameSort[0][pageIdNach]].match(/t/)||prodBlock[0][prodNameSort[0][pageIdNach]].match(/l/)){
                    pageIdNach++;
                    if(pageIdNach>prodNameSort[0].length-1){ pageIdNach=0; }
                }
                pageIdNach=prodNameSort[0][pageIdNach];
                newdiv1=createElement("div",{},market_beraterline.children[0]);
                newspan=createElement("div",{"class":"link2","style":"display:inline-block;padding-right:2px;","prod":pageIdVor},newdiv1,"<<");
                newspan.addEventListener("click",function(event){ showMarket(this.getAttribute("prod")); },false);
                newspan.addEventListener("mouseover",function(event){ showGoToMarketToolTip(event,this.getAttribute("prod")); },false);
                newspan=createElement("div",{"class":"link2","style":"display:inline-block;","prod":pageIdNach},newdiv1,">>");
                newspan.addEventListener("click",function(event){ showMarket(this.getAttribute("prod")); },false);
                newspan.addEventListener("mouseover",function(event){ showGoToMarketToolTip(event,this.getAttribute("prod")); },false);
    
                // Total amount of all offers
                // newtd=createElement("td",{"align":"right","style":"border-top:1px solid;"});
                // newtd.innerHTML=numberFormat(sumTotal,0);
                // candtr[candtr.length-1].insertBefore(newtd,candtr[candtr.length-1].firstElementChild);
    
                // Set price field
                err_trace="Market page, single product, set price";
                newdiv1=createElement("div",{},market_beraterline.children[1]);
                newinput=createElement("input",{"id":"marketButton_price","value":numberFormat(gut[pageId],2),"class":"text","maxlength":"10","style":"width:65px;text-align:right;background-color:#589456;"},newdiv1);
                newinput.addEventListener("mouseover",function(event){ toolTip.show(event,getText("price")+"<br>"+getText("observed")+":&nbsp;"+moneyFormat(gutBeob[pageId])); },false);
                if(valNimmBeob){
                    newinput.readOnly=true;
                }else{
                    newinput.addEventListener("focus",function(){
                        this.style.backgroundColor="white";
                        unsafeWindow.clearMarketTimer();
                    },false);
                    newinput.addEventListener("blur",function(){
                        this.style.backgroundColor="#589456";
                        if(!unsafeWindow.market_timer['update']){ unsafeWindow.market_timer['update'] = unsafeWindow.setInterval("marketTimer()",1000); }
                    },false);
                    newinput.addEventListener("change",function(){
                        var currId=unsafeWindow.market_filter_pid;
                        var preis=Math.max(0,parseFloat(this.value.replace(regDelimThou,"").replace(regDelimDeci,"."),10));
                        var thisNode=this;
                        var yesFkt = function(){
                            gut[currId]=preis;
                            GM_setValueCache(COUNTRY+"_"+SERVER+"_gut",implode(gut));
                            raiseEventTop("gameChangedGut");
                            unsafeWindow.showOffers();
                            if(!unsafeWindow.market_timer['update']){ unsafeWindow.market_timer['update'] = unsafeWindow.setInterval("marketTimer()",1000); }
                        };
                        var noFkt = function(){
                            thisNode.value=numberFormat(gut[currId],2);
                            thisNode=null;
                        };
                        if(preis==0){
                            alert2(getText("alertSetPriceNone").replace(/%PRODUCT%/,prodName[0][currId]),getText("yes"),getText("no"),yesFkt,noFkt);
                        }else if((!isNaN(NPC[0][currId]))&&(preis>NPC[0][currId])){
                            alert2(getText("alertSetPriceOverNPC").replace(/%PRODUCT%/,prodName[0][currId]).replace(/%PRICE%/,moneyFormat(preis)).replace(/%NPC%/,moneyFormat(NPC[0][currId])),getText("yes"),getText("no"),yesFkt,noFkt);
                        }else if ((gutBeob[currId]!=undefined)&&(gutBeob[currId]>0)){
                            if(preis<0.7*gutBeob[currId]){
                                alert2(getText("alertSetPriceUnderObs").replace(/%PRODUCT%/,prodName[0][currId]).replace(/%PRICE%/,moneyFormat(preis)).replace(/%OBS%/,moneyFormat(gutBeob[currId])),getText("yes"),getText("no"),yesFkt,noFkt);
                            }else if (1.3*gutBeob[currId]<preis){
                                alert2(getText("alertSetPriceOverObs").replace(/%PRODUCT%/,prodName[0][currId]).replace(/%PRICE%/,moneyFormat(preis)).replace(/%OBS%/,moneyFormat(gutBeob[currId])),getText("yes"),getText("no"),yesFkt,noFkt);
                            }else{
                                yesFkt();
                            }
                        }else{
                            yesFkt();
                        }
                    },false);
                }

                // Statistic server
                err_trace="Market page, single product, Statistic";
                if (STAT_VIEW && STAT_VIEW[COUNTRY]){
                    newdiv1=createElement("div",{"id":"marketButton_stats","class":"link2 hoverBlack","style":"position:relative;width:80px;height:40px;background: url('"+GFX+"stadt/uebersicht.gif') repeat scroll 0% 0% transparent;"},market_beraterline.children[2]);
                    createElement("div",{"style":"position:absolute;top:13px;width:80px;font-weight:bold;text-align:center;"},newdiv1,getText("statistics"));
                    newdiv1.addEventListener("click",function(){
                        showStatisticFullscreen(unsafeWindow.market_filter_pid);
                    },false);
                }
            }else{
                var preisKlasse=2;
            }
    
            if(pageId!=-1){
                //Link to NPC-Shop
                err_trace="Link to NPC";
                if(nothingToBuy && (unsafeWindow.marketlist_currentpage==1) && (prodTyp[0][pageId]=="v") && $top("shop")){
                    newdiv1=createElement("div",{"id":"marketButton_npc","class":"link2 hoverBlack","style":"position:relative;width:80px;height:40px;background: url('"+GFX+"stadt/uebersicht.gif') repeat scroll 0 0 transparent;"},market_beraterline.children[3]);
                    createElement("div",{"style":"position:absolute;top:13px;width:80px;font-weight:bold;text-align:center;"},newdiv1,getText("SGH"));
                    newdiv1.addEventListener("click",showSGH,false);
                }
            }
    
            // Page of a single user
            /*
            if(userId!=""){
                canda=candtr[3].getElementsByTagName("a");
                if(canda[1]){ var thisUser=canda[1].innerHTML; }
                newtr=createElement("tr",{},candtable[0]);
                newtd=createElement("td",{},newtr);
                if (thisUser){igm(thisUser,newtd);}
                stats(userId,newtd);
            }
            */
        }
        
        // Redesign of table
        err_trace="Redesign";
        var currId, currOffer, time, sum=[0,0];
        for(var v=0;v<marktoffers_rows.childElementCount;v++){
            err_trace="Redesign, row "+v;
            row=marktoffers_rows.children[v];
            if(row.childElementCount<6){ continue; }
            currId=/market_price_tt(\d+)/.exec(row.children[2].getAttribute("onmouseover"))[1];
            currOffer=null;
            for(var i=0;i<unsafeWindow.market_offers.length;i++){
                if(currId==unsafeWindow.market_offers[i].id){
                    currOffer=unsafeWindow.market_offers[i];
                    break;
                }
            }
            if(!currOffer){ continue; }
            row.children[3].removeAttribute("onmouseover");
            row_title=$("market_amount_tt"+currOffer["id"]);
            help=createElement("div",{},false,row_title.innerHTML);
            row_title.innerHTML="";
            row_title.appendChild(help);
            // TODO(Seberoth): What is time now?
            if(currOffer["zeit"]){
                time=parseInt(currOffer["zeit"],10)+0;
                if(countDays(time,now)==0){
                    createElement("div",{},row_title,getText("sinceX").replace(/%1%/,getDaytimeStr(time,false,true)+"&nbsp;"+getText("shortOClock")));
                }else{
                    createElement("div",{},row_title,getText("sinceX").replace(/%1%/,getFormattedDateStr(time,2,false)+",&nbsp;"+getDaytimeStr(time,false,true)+"&nbsp;"+getText("shortOClock")));
                }
            }
            var prodId=parseInt(currOffer["p"],10);
            var menge=parseInt(currOffer["a"],10);
            var preis=parseFloat(currOffer["pr"],10);
            if((pageId!=-1)&&(userId=="")&&(unsafeWindow.market_guild_filter==0)){
                createElement("div",{},row_title,getText("above")+": "+numberFormat(sum[0]));
            }
            sum[0] += menge;
            sum[1] += menge*preis;
            row.children[2].innerHTML=numberFormat(preis,2);
            row.setAttribute("offerId",currOffer["id"]);
            //GutPreis zeigen
            newdiv=createElement("div",{},false,numberFormat(gut[prodId],2));
            row.insertBefore(newdiv,row.children[6]);
            // own offers
            if((unsafeWindow.market_filter_own==0)&&(currOffer["s"])){
                row.children[5].setAttribute("class","market_buy market_noicon");
                row.children[5].setAttribute("onclick","");
            }
            if(NPC[0][prodId]&&((npcSaison[prodId]==undefined)||(npcSaison[prodId]))&&(preis>=NPC[0][prodId])){
                if(preisKlasse<1){
                    preisKlasse++;
                    row.style.borderTop="2px solid white";
                }
                if(valKauflimitNPC&&row.children[5]){ //zu teuer Link entfernen (NPC)
                    if(unsafeWindow.market_filter_own==0){
                        row.children[5].setAttribute("class","market_buy market_noicon");
                        row.children[5].setAttribute("onclick","");
                    }
                    createElement("div",{},row_title,getText("overNPCprice")+" ("+numberFormat(NPC[0][prodId],2)+")");
                }
                row.style.opacity="0.5";
                row.children[5].style.fontStyle="italic";
                if (0.9*preis>NPC[0][prodId]){ //111% NPC
                    row.style.fontStyle="italic";
                    if(preisKlasse<2){
                        preisKlasse++;
                        row.style.borderTop="2px dashed white";
                    }
                }
            }else if(gut[prodId]!=0){
                var help=100*preis/gut[prodId];
                if(help<=valKauflimit[0][0]){
                    if(row.children[5]){ row.children[5].style.backgroundColor="#"+valKauflimit[0][1]; } //billig Angebot highlight
                }else if(help>valKauflimit[1]){ //zu teuer Link entfernen (Limit)
                    if(row.children[5]){
                        if(unsafeWindow.market_filter_own==0){
                            row.children[5].setAttribute("class","market_buy market_noicon");
                            row.children[5].setAttribute("onclick","");
                        }
                        createElement("div",{},row_title,getText("overX").replace(/%1%/,valKauflimit[1]+"%"));
                    }
                    row.style.opacity="0.7";
                }
            }
            if(row.children[5].getAttribute("class").search(/market_noicon/)==-1){ nothingToBuy=false; }
            
            if (row.children[4].children[0]&&(highlightUser[row.children[4].children[0].innerHTML.replace(/[ ]\[.*\]/,"")])){
                row.children[4].children[0].style.backgroundColor="#"+highlightUser[row.children[4].children[0].innerHTML.replace(/[ ]\[.*\]/,"")];
            }
            if (highlightProducts[1][prodId]){
                row.children[1].style.backgroundColor="#20b2aa";
            }
            row.addEventListener("mouseover",function(event){ toolTip.show(event,$("market_amount_tt"+this.getAttribute("offerId")).innerHTML); },false);
        }
        if((unsafeWindow.market_filter_own==1)&&(userId=="")&&(unsafeWindow.market_guild_filter==0)){
            createElement("div",{},market_beraterline.children[0],sign_sum+"&nbsp;"+moneyFormatLimit(sum[1],100000));
        }
        // No offers
        if(sum[0]==0){
            // Page of a single product
            if((unsafeWindow.market_filter_own==0)&&(pageId!=-1)&&(userId=="")&&(unsafeWindow.market_guild_filter==0)){
                newdiv=createElement("div",{"style":"padding:2px;"},marktoffers_rows);
                createElement("div",{"style":"float:left;","class":"kp"+pageId},newdiv);
                createElement("div",{"onclick":"market_filter_name=''; market_filter_pid="+pageId+"; showOffers();","class":"market_product underline link","title":prodName[0][pageId]},newdiv,prodName[0][pageId]);
                if(NPC[0][pageId]){
                    if((npcSaison[pageId]!=undefined)&&(!npcSaison[pageId])){
                        createElement("div",{"class":"market_price"},newdiv);
                        createElement("div",{"class":"market_amount"},newdiv);
                        createElement("div",{"class":"market_seller"},newdiv);
                    }else if(!isNaN(NPC[0][pageId])){
                        createElement("div",{"class":"market_price"},newdiv,numberFormat(NPC[0][pageId],2));
                        createElement("div",{"class":"market_amount"},newdiv,"0");
                        newdiv1=createElement("div",{"class":"market_seller"},newdiv);
                        createElement("span",{},newdiv1,"NPC");
                    }else if (NPC[0][pageId].match(/^f/)){
                        createElement("div",{"class":"market_price"},newdiv,numberFormat(3*parseFloat(NPC[0][pageId].replace("f",""),10),2));
                        createElement("div",{"class":"market_amount"},newdiv,"0");
                        newdiv1=createElement("div",{"class":"market_seller"},newdiv);
                        createElement("span",{},newdiv1,"*NPC*");
                    }else{
                        createElement("div",{"class":"market_price"},newdiv);
                        createElement("div",{"class":"market_amount"},newdiv);
                        createElement("div",{"class":"market_seller"},newdiv);
                    }
                }else{
                    createElement("div",{"class":"market_price"},newdiv);
                    createElement("div",{"class":"market_amount"},newdiv);
                    createElement("div",{"class":"market_seller"},newdiv);
                }           
            }
        }
        marktoffers_rows=null;
        // Buttons
        err_trace="buttons";
        /*
        newdiv=createElement("div",{"id":"marketButton_current","class":"link hoverBlack","style":"position:absolute;top:475px;left:545px;width:80px;height:40px;font-size:8pt;background: url('"+GFX+"stadt/uebersicht.gif') repeat scroll 0% 0% transparent;"},ALL);
        newdiv.addEventListener("click",function(){showMarket();},false);
        createElement("div",{"style":"position:absolute;top:7px;left:7px;width:67px;color:white;font-weight: bold;"},newdiv,getText("currentOffers"));
        */
        newdiv1=createElement("div",{"id":"marketButton_tablePrices","class":"link2 hoverBlack","style":"position:relative;width:80px;height:40px;background:url('"+GFX+"stadt/uebersicht.gif') repeat scroll 0% 0% transparent;"},market_beraterline.children[4]);
        newdiv1.addEventListener("click",function(){
            unsafeWindow.buildInfoPanel("stock",{"page":1,"prodType":0,"filterCategory":unsafeWindow.market_filter_pid?prodTyp[0][unsafeWindow.market_filter_pid]:null});
        },false);
        createElement("div",{"style":"position:absolute;top:13px;width:80px;font-weight:bold;text-align:center;"},newdiv1,getText("prices"));
    
        newdiv1=createElement("div",{"id":"marketButton_tableStock","class":"link2 hoverBlack","style":"position:relative;width:80px;height:40px;background:url('"+GFX+"stadt/uebersicht.gif') repeat scroll 0% 0% transparent;"},market_beraterline.children[5]);
        newdiv1.addEventListener("click",function(){
            unsafeWindow.buildInfoPanel("stock",{"page":2,"prodType":0,"filterCategory":unsafeWindow.market_filter_pid?prodTyp[0][unsafeWindow.market_filter_pid]:null});
        },false);
        createElement("div",{"style":"position:absolute;top:13px;width:80px;font-weight:bold;text-align:center;"},newdiv1,getText("stock"));
    
        market_beraterline=null;
        canda=null;candtable=null;candtr=null;candtd=null;canddiv=null;newa=null;newinput=null;newspan=null;newdiv=null;newdiv1=null;
    }catch(err){ GM_logError("do_market ("+err_trace+")\n"+err); }
    }
    unsafeOverwriteFunction("showOffers",function(page){
        try{
            unsafeWindow._showOffers(page);
        }catch(err){GM_logError("_showOffers\n"+err);}
        try{
            do_market();
            // GM_log("unsafeWindow.market_offers:\n"+print_r(unsafeWindow.market_offers,"",true,"\n"));        
            raiseEvent("gameOpenMarket");
        }catch(err){GM_logError("showOffers\n"+err);}
    });
    unsafeOverwriteFunction("openMarketNewOffer",function(){
        try{
            unsafeWindow._openMarketNewOffer();
        }catch(err){GM_logError("_openMarketNewOffer\n"+err);}
        try{
            var err_trace="Init";
            var currId=unsafeWindow.market_filter_pid;
            if(currId!=-1){
                if(lastOffer[currId]){
                    $("marketnewoffer_amount").value=lastOffer[currId][0];
                    $("marketnewoffer_price1").value=lastOffer[currId][1];
                    $("marketnewoffer_price2").value=(lastOffer[currId][2]<10?"0":"")+lastOffer[currId][2];
                    if($("marketnewoffer_price_comb")){ $("marketnewoffer_price_comb").value=lastOffer[currId][1]+delimDeci+(lastOffer[currId][2]<10?"0":"")+lastOffer[currId][2]; }
                }else{
                    $("marketnewoffer_amount").value=0;
                }
                keyup($("marketnewoffer_amount"));
        
                /*
                if ($("produkt_preis1")){
                    $("lbl_produkt_max").setAttribute("class",$("lbl_produkt_max").getAttribute("class")+" link");
                    $("lbl_produkt_max").addEventListener("click",function(){
                        $("produkt_anzahl").value=this.innerHTML.replace(regDelimThou,"");
                        keyup($("produkt_anzahl"));
                    },false);
                    $("produkt_anzahl").addEventListener("focus",checkPreis,false); // fired when offer-div opens
                    $("preisschild").addEventListener("keyup",function(event){
                        checkPreis();
                        if (event.keyCode==13){
                            var submitButton=$("preisschild").querySelector("#verkaufe_markt");
                            if(submitButton.style.display!="none"){ click(submitButton); }
                            submitButton=null;
                        }
                    },false);
                    if(valJoinPreise){
                        $("produkt_preis1").setAttribute("tabindex","0");
                        $("produkt_preis2").setAttribute("tabindex","0");
                        var newinput=createElement("input",{"id":"produkt_preis_ganz","type":"text","style":"position:absolute;left:0;top:0;background-color:#002300;color:#f0ffef;width:131px;text-align:right;border:1px solid #555;","tabindex":"2","maxlength":"9","name":"p_preis_ganz","class":"text thuge"},$("produkt_preis1").parentNode);
                        newinput.addEventListener("keyup",function(event){
                            if (event.keyCode==13){
                                var submitButton=$("preisschild").querySelector("#verkaufe_markt");
                                if(submitButton.style.display!="none"){ click(submitButton); }
                                submitButton=null;
                            }else{
                                var preis=this.value.replace(regDelimThou,"").replace(regDelimDeci,".");
                                var preis1=parseInt(preis,10);
                                var preis2=(preis.search(/\./)!=-1?(preis+"00").substr(1+preis.search(/\./),2):"00");
                                $("produkt_preis1").value=preis1;
                                $("produkt_preis2").value=preis2;
                                keyup($("produkt_preis1"));
                            }
                        },false);
                        newinput=null;
                    }
                }
                */
                
                // coins
                function checkPreisCoins(){
                    //GM_log("checkPreisCoins "+oldPricesInserted);
                    window.setTimeout(function(){ // first let finish the functions
                        if(oldPricesInserted==0){ //old offer set
                            lastOffer[0]=[parseInt($("coinsanzahl").value,10),parseInt($("coinspreis").value,10),$("coinssollpreis").checked];
                            try{
                                GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_lastOffer",implode(lastOffer));
                            }catch(err){ GM_log("checkPreisCoins: 0 not saved!\n"+err); }
                        }else{
                            oldPricesInserted=0;
                            if(lastOffer[0]){
                                $("coinsanzahl").value=lastOffer[0][0];
                                $("coinspreis").value=lastOffer[0][1];
                                $("coinssollpreis").checked=lastOffer[0][2];
                                unsafeWindow.chkAmount();
                                unsafeWindow.calcMarketPrice();
                            }
                        }
                        var currPreis=parseInt($("coinsmarktpreis").innerHTML,10);
                        var currAnzahl=parseInt($("coinsanzahl").value,10);
                        var currUserPreis=parseInt($("coinsuserpreis").innerHTML,10);
            
                        if(protectMinRack){ //rack amount protection
                            prodStock[0][0]=parseInt($("lbl_produkt_max").innerHTML.replace(regDelimThou,""),10);
                            if(currAnzahl>prodStock[0][0]-prodMinRack[0][0]){
                                currAnzahl=Math.max(0,prodStock[0][0]-prodMinRack[0][0]);
                                $("coinsanzahl").value=currAnzahl;
                            }
                        }
                        var newtable=createElement("table");
                        var newtr;
                        $("divBerInfoCoins").replaceChild(newtable,$("divBerInfoCoins").getElementsByTagName("table")[0]);
                        if (gut[0]){
                            $("coinspreisschild").querySelector("#verkaufe_markt").style.display=(((100*currPreis>valVerkaufLimitDown*gut[0]) && (100*currPreis<valVerkaufLimitUp*gut[0]))?"":"none");
                            newtr=createElement("tr",{},newtable);
                            createElement("td",{"style":"color:#f0ffef;font-weight:bold;"},newtr,getText("price")+": ");
                            createElement("td",{"style":"color:#f0ffef;font-weight:bold;text-align:right;"},newtr,moneyFormatLimit(gut[0],100));
                        }
            
                        newtr=createElement("tr",{},newtable);
                        createElement("td",{"style":"color:#f0ffef;font-weight:bold;"},newtr,getText("value")+": ");
                        createElement("td",{"style":"color:#f0ffef;font-weight:bold;text-align:right;"},newtr,moneyFormatLimit(currUserPreis*currAnzahl,100));
            
                        newtr=createElement("tr",{},newtable);
                        createElement("td",{"style":"color:#f0ffef;font-weight:bold;"},newtr,getText("commission")+": ");
                        createElement("td",{"style":"color:#f0ffef;font-weight:bold;text-align:right;"},newtr,numberFormat(((currPreis-currUserPreis)/currUserPreis)*100,1)+"%");
                        if (preisBeob[0]){
                            newtr=createElement("tr",{},newtable);
                            createElement("td",{"style":"color:#f0ffef;font-weight:bold;"},newtr,"min: ");
                            createElement("td",{"style":"color:#f0ffef;font-weight:bold;text-align:right;"},newtr,moneyFormatLimit(preisBeob[0][2],100));
                        }
                        if (gutBeob[0]){
                            newtr=createElement("tr",{},newtable);
                            createElement("td",{"style":"color:#f0ffef;font-weight:bold;"},newtr,getText("observed")+": ");
                            createElement("td",{"style":"color:#f0ffef;font-weight:bold;text-align:right;"},newtr,moneyFormatLimit(gutBeob[0],100));
                        }
                        newtable=null;newtr=null;
                    },200);
                }
            /*
                if($("coinsauflager")){
                    $("coinsauflager").setAttribute("class",$("coinsauflager").getAttribute("class")+" link");
                    $("coinsauflager").addEventListener("click",function(){
                        $("coinsanzahl").value=this.innerHTML;
                        keyup($("coinsanzahl"));
                    },false);
                }
                if($("coinspreisschild")){
                    var newdiv=createElement("div",{"style":"position:absolute;top:0;left:330px;width:150px"},$("coinspreisschild"));
                    newdiv=createElement("div",{"id":"divBerInfoCoins","style":"float:left;padding:3px;background-color:#002300;border:5px solid #594230;color:#f0ffef;font-weight:bold;"},newdiv);
                    createElement("table",{},newdiv);
                    newdiv=null;
            
                    $("coinsanzahl").addEventListener("keyup",function(){ this.value=this.value.replace(/\D/g,""); },false);
                    $("coinspreis").addEventListener("keyup",function(){ this.value=this.value.replace(/\D/g,""); },false);
                    $("coinspreisschild").addEventListener("click",checkPreisCoins,false);
                    $("coinspreisschild").addEventListener("keyup",function(event){
                        checkPreisCoins();
                        if (event.keyCode==13){
                            var submitButton=$("preisschild").querySelector("#verkaufe_markt");
                            if(submitButton.style.display!="none"){ click(submitButton); }
                            submitButton=null;
                        }
                    },false);
            
                    // bugfix: no focus when coinspreisschild opens
                    $("coinspreisschild").addEventListener("DOMAttrModified",function(event){
                        if((event.target.id=="coinspreisschild")&&(event.attrName=="style")){
                            if(event.newValue.match(/display\:\s*block/)){
                                if(oldPricesInserted!=0){
                                    checkPreisCoins(); // fired when offer-div opens
                                }
                            }else{
                                if(oldPricesInserted==0){ oldPricesInserted=-1; }
                            }
                        }
                    }, false);
                }
            
                cand=null;candtable=null;
*/      
            }
        }catch(err){ GM_logError("openMarketNewOffer ("+err_trace+")\n"+err); }
    });
    unsafeOverwriteFunction("calcMarketFee",function(){
        try{
            unsafeWindow._calcMarketFee();
        }catch(err){GM_logError("_calcMarketFee\n"+err);}
        try{
            var err_trace="Init";
            var berater_box=$("marketnewoffer_berater");
            if(!berater_box){
                berater_box=createElement("div",{"style":"position:absolute;top:0px;width:175px;right:-160px;background-position:-140px 0px;","class":"market_popup"});
                newdiv=$("marketnewoffer");
                newdiv.insertBefore(berater_box,newdiv.lastElementChild);
                berater_box=createElement("div",{"id":"marketnewoffer_berater","style":"position:relative;margin-top:35px;"},berater_box);
            }
            berater_box.innerHTML="";
            var currId=unsafeWindow.market_filter_pid;
            if(currId!=-1){
                var currPreis=parseFloat($("marketnewoffer_price1").value+"."+$("marketnewoffer_price2").value,10);
                var currAnzahl=parseInt($("marketnewoffer_amount").value,10);
                // Stock amount
                err_trace="Stock amount";
                var newdiv;
                if(newdiv=$("marketcreateoffer_stockamount")){
                    newdiv.innerHTML=numberFormat(prodStock[0][currId]);
                }               
                // Rack amount protection
                err_trace="Rack amount protection";
                if(protectMinRack){ 
                    if(currAnzahl>prodStock[0][currId]-prodMinRack[0][currId]){
                        currAnzahl=Math.max(0,prodStock[0][currId]-prodMinRack[0][currId]);
                        $("marketnewoffer_amount").value=currAnzahl;
                    }
                }
                // Block Submit Button
                err_trace="Submit Button";
                var submitButton = $("market_new_button");
                if(submitButton){
                    var help=null;
                    if(NPC[0][currId]){
                        if(!isNaN(NPC[0][currId])){
                            if(100*currPreis<20*NPC[0][currId]){ help=3; }
                            else if(100*currPreis>300*NPC[0][currId]){ help=4; }
                        }else if (NPC[0][currId].match(/^f/)){
                            if(100*currPreis<2*parseFloat(NPC[0][currId].replace("f",""),10)){ help=3; }
                            else if(100*currPreis>300*parseFloat(NPC[0][currId].replace("f",""),10)){ help=4; }
                        }
                    }
                    if((help!=null)&&gut[currId]){
                        if(100*currPreis<valVerkaufLimitDown*gut[currId]){ help=1; }
                        else if(100*currPreis>valVerkaufLimitUp*gut[currId]){ help=2; }
                    };
                    if(help==null){
                        submitButton.style.display="block";
                        newdiv = $("market_new_button_block");
                        if(newdiv){ newdiv.style.display="none"; }
                    }else{
                        submitButton.style.display="none";
                        newdiv = $("market_new_button_block");
                        if(!newdiv){
                            newdiv=createElement("div",{"id":"market_new_button_block","class":"alertbox","style":"padding:2px;width:100%;text-align:center;"});
                            insertAfter(newdiv,submitButton);
                        }
                        newdiv.style.display="block";
                        switch(help){
                        case 1: newdiv.innerHTML = "Too cheap"; break;
                        case 2: newdiv.innerHTML = "Too expensive"; break;
                        case 3: newdiv.innerHTML = "Not allowed - Too cheap"; break;
                        case 4: newdiv.innerHTML = "Not allowed - Too expensive"; break;
                        }
                    }
                    help=null;
                }
                submitButton=null;
                // Info Boards
                err_trace="berater_box";
                var newtable=createElement("table",{},berater_box);
                var newtr;
                newtr=createElement("tr",{},newtable);
                createElement("td",{"style":"color:#f0ffef;font-weight:bold;"},newtr,getText("price")+": ");
                if(gut[currId]){
                    createElement("td",{"style":"color:#f0ffef;font-weight:bold;text-align:right;"},newtr,moneyFormatLimit(gut[currId],100));
                } else {
                    createElement("td",{"style":"color:#f0ffef;font-weight:bold;text-align:right;"},newtr,"--");
                }
                newtr=createElement("tr",{},newtable);
                createElement("td",{"style":"color:#f0ffef;font-weight:bold;"},newtr,getText("value")+": ");
                createElement("td",{"style":"color:#f0ffef;font-weight:bold;text-align:right;"},newtr,moneyFormatLimit(currPreis*currAnzahl,100));
                newtr=createElement("tr",{},newtable);
                createElement("td",{"style":"color:#f0ffef;font-weight:bold;"},newtr,"min: ");
                if (preisBeob[currId]){
                    createElement("td",{"style":"color:#f0ffef;font-weight:bold;text-align:right;"},newtr,moneyFormatLimit(preisBeob[currId][2],100));
                }else{
                    createElement("td",{"style":"color:#f0ffef;font-weight:bold;text-align:right;"},newtr,"--");
                }
                newtr=createElement("tr",{},newtable);
                createElement("td",{"style":"color:#f0ffef;font-weight:bold;"},newtr,getText("observed")+": ");
                if (gutBeob[currId]){
                    createElement("td",{"style":"color:#f0ffef;font-weight:bold;text-align:right;"},newtr,moneyFormatLimit(gutBeob[currId],100));
                }else{
                    createElement("td",{"style":"color:#f0ffef;font-weight:bold;text-align:right;"},newtr,"--");
                }
                newtr=createElement("tr",{},newtable);
                createElement("td",{"style":"color:#f0ffef;font-weight:bold;"},newtr,getText("NPCprice")+": ");
                if(!NPC[0][currId]){
                    createElement("td",{"style":"color:#f0ffef;font-weight:bold;text-align:right;"},newtr,"--");
                }else if(!isNaN(NPC[0][currId])){
                    createElement("td",{"style":"color:#f0ffef;font-weight:bold;text-align:right;"},newtr,moneyFormatLimit(NPC[0][currId],100));
                }else if (NPC[0][currId].match(/^f/)){
                    createElement("td",{"style":"color:#f0ffef;font-weight:bold;text-align:right;"},newtr,"*"+moneyFormatLimit(parseFloat(NPC[0][currId].replace("f",""),10),100));
                }else if (NPC[0][currId].match(/^c/)){
                    coinsFormat(parseInt(NPC[0][currId].replace("c",""),10),createElement("td",{"style":"color:#f0ffef;font-weight:bold;text-align:right;"},newtr));
                }
                newtable=null;newtr=null;newdiv=null;
            }
            currId=null;
        
        }catch(err){ GM_logError("calcMarketFee\n"+err); }
    });
    unsafeOverwriteFunction("buyMarketOffer",function(id){
        try{
            unsafeWindow._buyMarketOffer(id);
        }catch(err){GM_logError("_buyMarketOffer\n"+err);}
        try{
            for(var i=0;i<unsafeWindow.market_offers.length;i++){
                if(id==unsafeWindow.market_offers[i].id){
                    var money=parseFloat($("bar").innerHTML.replace(getText("gamecurrency"),"").replace(/\s+/g,"").replace(regDelimThou,"").replace(regDelimDeci,"."),10);
                    $("marketbuyofferamount").value = Math.min(unsafeWindow.market_offers[i].a,Math.floor(money/unsafeWindow.market_offers[i].pr));
                    window.setTimeout(function() {
                        $("marketbuyofferamount").select();
                    }, 50);
                    unsafeWindow.calcMarketOfferCost();
                    money=null;
                    break;
                }
            }   
        }catch(err){ GM_logError("buyMarketOffer\n"+err); }
    });
    unsafeOverwriteFunction("marketAction",function(action,id,open){
        try{
            unsafeWindow._marketAction(action,id,open);
        }catch(err){GM_logError("_marketAction\n"+err);}
        try{
            if(action=="marketcreateoffer"){
                var currId=unsafeWindow.market_filter_pid;
                var amount=parseInt($("marketnewoffer_amount").value,10);
                var price1=parseInt($("marketnewoffer_price1").value,10);
                var price2=parseInt($("marketnewoffer_price2").value,10);
                lastOffer[currId]=[amount,price1,price2];
                GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_lastOffer",implode(lastOffer));
                currId=null;amount=null;price1=null;price2=null;
            }
        }catch(err){ GM_logError("marketAction\n"+err); }
    });
    unsafeOverwriteFunction("marketActionResponse",function(request,action,id,open){
        try{
            var result = checkRequest(request)
            if((result!=0)&&(result[0]!=0)&&(result[1]["offers"])){
                //GM_log("marketActionResponse "+result[1]["offers"].length);                   
                // Save own offers
                var err_trace="Save own offers";
                var _ownMarketOffers=new Array();
                var marketOffersArr=new Array();
                var row,prod,preis,menge,menge_sum;
                err_trace="Save own offers";
                for(var v=0;v<result[1]["offers"].length;v++){
                    row=result[1]["offers"][v];
                    prod=parseInt(row["p"],10);
                    preis=parseFloat(row["pr"],10);
                    menge=parseInt(row["a"],10);
                    if(row["s"]){
                        _ownMarketOffers.push([prod,preis,menge]);
                    }
                    if(!marketOffersArr[prod]){ marketOffersArr[prod]=new Array(); }
                    // TODO(Seberoth): What is time again?
                    // marketOffersArr[prod].push([menge,preis,parseInt(row["zeit"],10)]);
                    marketOffersArr[prod].push([menge,preis]);
                }
                // sort the ownMarketOffers-data
                _ownMarketOffers.sort(function(a,b){
                    if(a[0]==b[0]){
                        return(a[1]-b[1]);
                    } else if(prodTyp[0][a[0]]==prodTyp[0][b[0]]){
                        return(a[0]-b[0]);
                    } else {
                        return({"c":0,"v":1,"e":2,"o":3,"fw1":4,"fw2":5,"fw3":6,"fw4":7,"z":8}[prodTyp[0][a[0]]]-{"c":0,"v":1,"e":2,"o":3,"fw1":4,"fw2":5,"fw3":6,"fw4":7,"z":8}[prodTyp[0][b[0]]]);
                    }
                });
                ownMarketOffers=_ownMarketOffers;

                GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_ownMarketOffers",implode(ownMarketOffers));
                doMarketoffersNotepad();
                // calculate all observed prices
                err_trace="Observing prices";
                for(var v=0;v<prodBlock[0].length;v++){
                    if(prodBlock[0][v]==undefined){ continue; }
                    if((!prodBlock[0][v].match(/t/))&&(!prodBlock[0][v].match(/l/))){
                        if(marketOffersArr[v]){
                            // sort offers
                            marketOffersArr[v].sort(function(a,b){
                                return((a[1]==b[1])?(a[2]-b[2]):(a[1]-b[1]));
                            });
                            marketOffersArr[v]=marketOffersArr[v].slice(0,18);
                            menge_sum=0;
                            for(var w=0;w<marketOffersArr[v].length;w++){
                                menge_sum += marketOffersArr[v][w][0];
                            }
                            gutBeob[v]=calcObservedPrice((prodTyp[0][v]=="z"?2:1),marketOffersArr[v]);
                            if (valNimmBeob){
                                if(!isNaN(NPC[0][v])){
                                    gut[v]=Math.min(gutBeob[v],NPC[0][v]);
                                }else{
                                    gut[v]=gutBeob[v];
                                }
                            }
                            if(!(preisBeob instanceof Array)){ preisBeob=new Array(); }
                            preisBeob[v]=[true,now,marketOffersArr[v][0][1],marketOffersArr[v][marketOffersArr[v].length-1][1],menge_sum];
                        }else{
                            // no offers
                            if (valNimmBeob){
                                if(!isNaN(NPC[0][v])){
                                    gut[v]=NPC[0][v];
                                }else{
                                    gut[v]=0;
                                }
                            }
                            if(!(preisBeob instanceof Array)){ preisBeob=new Array(); }
                            if(!(preisBeob[v]&&preisBeob[v][0])){
                                preisBeob[v]=[false,now,,,0];
                            }               
                        }
                    }
                }
                _ownMarketOffers=null;marketOffersArr=null;
                row=null;prod=null;preis=null;menge=null;menge_sum=null;
                if (valNimmBeob){
                    GM_setValueCache(COUNTRY+"_"+SERVER+"_gut",implode(gut));
                    raiseEventTop("gameChangedGut");
                }
                GM_setValueCache(COUNTRY+"_"+SERVER+"_gutBeob",implode(gutBeob));
                GM_setValueCache(COUNTRY+"_"+SERVER+"_preisBeob",implode(preisBeob));
                raiseEventTop("gameChangedBeobPrice");
            }
        }catch(err){GM_logError("marketActionResponse ("+err_trace+")\nv="+v+"\n"+err);}
        try{
            unsafeWindow._marketActionResponse(request,action,id,open);
        }catch(err){GM_logError("_marketActionResponse\n"+err);}
    });
    quicklinks();
    // Buy offer by pressing Enter
    if(newdiv=$("marketbuyofferamount")){
        newdiv.addEventListener("keyup",function(event){
            if(event.keyCode==13){
                unsafeWindow.calcMarketOfferCost();
                var newdiv=$("marketbuyofferbutton");
                if(newdiv.style.display=="block"){
                    click(newdiv);
                }
                newdiv=null;
            }
        },false);
    }
    // Create offer enter stock amount
    if(newdiv=$("marketcreateoffer_stockamount")){
        newdiv.setAttribute("class","link");
        newdiv.addEventListener("click",function(event){
            var newdiv=$("marketnewoffer_amount");
            if(newdiv){
                newdiv.value=prodStock[0][unsafeWindow.market_filter_pid];
                keyup(newdiv);
            }
            newdiv=null;
        },false);
    }   
    
    // Notepad for Non-Premium
    err_trace="Notepad for Non-Premium";
    if((newdiv=$("sub_notepad"))&&(newdiv.style.display=="none")){
        newdiv=insertAfter(createElement("div",{"id":"beraterNotepad","class":"submenueitem link","style":"display:block;"}),newdiv);
        createElement("img",{"src":GFX+"guild/contract.gif","style":"width:15px;height:15px;"},newdiv);
        newdiv.addEventListener("mouseover",function(event){ toolTip.show(event,unsafeWindow.lng_t_notizen); },false);
        newdiv.addEventListener("click",function(){
            $("notepadentry").value=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_notepad","");
            unsafeWindow.calcNotepadLetters();
            unsafeWindow.showDiv("notepad");
        },false);
        newdiv=$("notepadheader");
        newdiv.getElementsByTagName("img")[0].removeAttribute("onclick");
        newdiv.getElementsByTagName("img")[0].addEventListener("click",function(){
            GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_notepad",$("notepadentry").value,72);
            unsafeWindow.hideDiv("notepad");
        },false);
    }

    // BuyNotepad
    err_trace="BuyNotepad";
    newdiv=createElement("div",{"style":"position:relative;margin-top:5px;display:block;white-space:nowrap;"},$("divRightBorder"));
    newdiv1=createElement("div",{"class":"opener link","style":"display:inline-block;vertical-align:top;background-position:0px "+(show["buyNotepad"]?-20:0)+"px;"},newdiv);
    newdiv1.addEventListener("click",function(){
        show["buyNotepad"]=!show["buyNotepad"];
        GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_show",implode(show));
        if(show["buyNotepad"]){
            this.style.backgroundPosition="0px -20px";
            $("buyNotepad").style.display="inline-block";
            doBuyNotepad();
        }else{
            this.style.backgroundPosition="0px 0px";
            $("buyNotepad").style.display="none";
        }
    },false);
    createElement("div",{"id":"buyNotepad","style":"display:"+(show["buyNotepad"]?"inline-block":"none")+";"},newdiv);

    // MarketoffersNotepad
    err_trace="MarketoffersNotepad";
    newdiv=createElement("div",{"style":"position:relative;margin-top:5px;display:block;white-space:nowrap;"},$("divRightBorder"));
    newdiv1=createElement("div",{"class":"opener link","style":"display:inline-block;vertical-align:top;background-position:0px "+(show["marketoffersNotepad"]?-20:0)+"px;"},newdiv);
    newdiv1.addEventListener("click",function(){
        show["marketoffersNotepad"]=!show["marketoffersNotepad"];
        GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_show",implode(show));
        if(show["marketoffersNotepad"]){
            this.style.backgroundPosition="0px -20px";
            $("marketoffersNotepad").style.display="inline-block";
        }else{
            this.style.backgroundPosition="0px 0px";
            $("marketoffersNotepad").style.display="none";
        }
        doMarketoffersNotepad();
    },false);
    createElement("div",{"id":"marketoffersNotepad","style":"display:"+(show["marketoffersNotepad"]?"inline-block":"none")+";"},newdiv);
    doMarketoffersNotepad();

    document.addEventListener("gameChangedOwnMarketOffers",function(){
        window.setTimeout(function(){
            ownMarketOffers=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_ownMarketOffers"),"event:gameChangedOwnMarketOffers/ownMarketOffers",{});
            doMarketoffersNotepad();
        },0);
    },false);
    // Points and level.  levelLog[day]=[points,rank,market sales,contract sales,farmi money]
    err_trace="Points and level";
    levelLog=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_levelLog","[]"),"do_main/levelLog",[]);
    if(!(levelLog instanceof Array)){ levelLog = []; }
    function setLevelLogId(){
        levelLog.sort(sortObjFunctions["date"]);
        for(levelLogId=levelLog.length-1;levelLogId>=0;levelLogId--){
            if(levelLog[levelLogId][0]==todayServerStr){ return; }
        }
        levelLog.push([todayServerStr,0,null,0,0,0]);
        setLevelLogId();
    }
    setLevelLogId();
    function getDailyRanking(){
    try{
        if(!levelLog[levelLogId][2]){
            logBubble.add(getText("requestingUserStatistic"));
            GM_xmlhttpRequest({
                method: "GET",
                url: "http://s"+SERVER+"."+GAMEPAGES[COUNTRY]+"/city/ajax.php?mode=stats&type=pkt&page=1&findme=1&rid="+unsafeWindow.rid,
                headers: {"Content-type": "application/x-www-form-urlencoded"},
                onload: function(response){
                    try{
                        var result=checkRequest(response);
                        if(result){
                            for(var i in result[1]["data"]){
                                if(!result[1]["data"].hasOwnProperty(i)){ continue; }
                                if(result[1]["data"][i]["own"]){
                                    levelLog[levelLogId][2]=((result[1].page-1)*result[1].max)+parseInt(i,10);
                                    GM_setValue2(COUNTRY+"_"+SERVER+"_"+USERNAME+"_levelLog",implode(levelLog),73);
                                    logBubble.add(getText("youAreOnRankX").replace(/%1%/,levelLog[levelLogId][2]));
                                    return;
                                }
                            }
                            logBubble.add(getText("couldNotGetPlace"));
                        }else{
                            logBubble.add(getText("couldNotGetPlace")+" ("+response.responseText+")");
                        }
                    }catch(err){ GM_logError("getDailyRanking.onload\n"+err); }
                },
                onerror: function(response){
                    GM_logError("getDailyRanking.onerror\n"+response.responseText);
                },
                timeout: function(response){
                    GM_logError("getDailyRanking.timeout\n"+response.responseText);
                }
            });
        }
    }catch(err){ GM_logError("getDailyRanking\n"+err); }
    }
    getDailyRanking();
    function plotLevelProgressBar(){
    try{
        var help;
        // data quality
        levelLog.sort(sortObjFunctions["date"]);
        if(help=$("pkt")){ 
            help=parseInt(help.innerHTML.replace(/\D/g,""),10);
            levelLog[levelLogId][1]=help;
            for(var v=levelLog.length-1;v>=0;v--){
                if(help<levelLog[v][1]){ levelLog[v][1]=0; } // points limited by current points
            }
        }
        help=0;
        for(var v=0;v<levelLog.length;v++){
            if(levelLog[v][1]<help){ levelLog[v][1]=help; } // monotony
            help=levelLog[v][1];
        }
        var month,stichtag=new Date();
        stichtag=Math.round(((new Date(stichtag.getFullYear(),stichtag.getMonth()-2,1)).getTime())/1000);
        for(var v=levelLog.length-1;v>=0;v--){
            if(levelLog[v][0].match(/^\d+\.\d+\.\d+$/)){
                if(getTime(levelLog[v][0])<stichtag){
                    // save full data for the last 3 months, else join data to monthly
                    month=/^(\d+)\.(\d+)\.(\d+)$/.exec(levelLog[v][0]);
                    if(month[2].length==1){ month[2]="0"+month[2]; }
                    month = month[3]+"-"+month[2];
                    for(var w=0;w<levelLog.length;w++){
                        if(levelLog[w][0]==month){ break; }
                    }
                    if(levelLog[w]==undefined){
                        levelLog[w]=[month,0,,0,0,0];
                    }
                    if(levelLog[w][1]<levelLog[v][1]){
                        levelLog[w][1]=levelLog[v][1];
                        levelLog[w][2]=levelLog[v][2];
                    }
                    levelLog[w][3] += levelLog[v][3];
                    levelLog[w][4] += levelLog[v][4];
                    levelLog[w][5] += levelLog[v][5];
                    levelLog.splice(v,1);
                }
            }
        }
        setLevelLogId();
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_levelLog",implode(levelLog));

        // plotting level log bar
        if(USERLEVEL<LEVEL_POINTS.length){
            var levelSize=959;
            var levelsum=LEVEL_POINTS[USERLEVEL+1]-LEVEL_POINTS[USERLEVEL-1];
            var newdiv=$("levelProgressBar");
            if(newdiv){ removeElement(newdiv); }
            newdiv=createElement("div",{"class":"link","id":"levelProgressBar","style":"float:left;width:"+levelSize+"px;position:relative;top:-2px;left:18px;"},content_table.firstElementChild.children[2].firstElementChild);
            newdiv.addEventListener("click",function(){unsafeWindow.buildInfoPanel("level");},false);
            newdiv.addEventListener("mouseover",function(event){
                var node=event.target;
                var mouseOverText=node.getAttribute("mouseOverText");
                while((node!=this)&&(!mouseOverText)){
                    node=node.parentNode;
                    mouseOverText=node.getAttribute("mouseOverText");
                }
                if(mouseOverText){ toolTip.show(event,mouseOverText); }
                node=null;mouseOverText=null;
            },false);

            var newdiv1=bar(levelSize*(LEVEL_POINTS[USERLEVEL]-LEVEL_POINTS[USERLEVEL-1])/levelsum,1,1);
            newdiv1.style.cssFloat="left";
            newdiv1.setAttribute("mouseOverText",getText("level")+" "+(USERLEVEL-1)+": "+numberFormat(LEVEL_POINTS[USERLEVEL-1],0)+"-"+numberFormat(LEVEL_POINTS[USERLEVEL],0));
            newdiv.appendChild(newdiv1);

            newdiv1=bar(levelSize*(LEVEL_POINTS[USERLEVEL+1]-LEVEL_POINTS[USERLEVEL])/levelsum,levelLog[levelLogId][1]-LEVEL_POINTS[USERLEVEL],LEVEL_POINTS[USERLEVEL+1]-LEVEL_POINTS[USERLEVEL]);
            newdiv1.style.cssFloat="left";
            newdiv1.style.marginLeft=Math.ceil(2+levelSize*(LEVEL_POINTS[USERLEVEL]-LEVEL_POINTS[USERLEVEL-1])/levelsum)+"px";
            newdiv1.setAttribute("mouseOverText",getText("level")+" "+(USERLEVEL)+": "+numberFormat(LEVEL_POINTS[USERLEVEL],0)+"-"+numberFormat(LEVEL_POINTS[USERLEVEL+1],0));
            newdiv.appendChild(newdiv1);

            for(var v=levelLog.length-1;v>=0;v--){
                if(levelLog[v][0].match(/^\d+\.\d+\.\d+$/)){
                    newdiv1=createElement("div",{"mouseOverText":levelLog[v][0]+"<br>"+numberFormat(levelLog[v][1]),"style":"position:absolute;width:0;margin-top:2px;height:12px;border-right:1px solid white;"},newdiv);
                    if (levelLog[v][1]<LEVEL_POINTS[USERLEVEL]){ 
                        newdiv1.style.marginLeft=Math.floor(2+levelSize*(levelLog[v][1]-LEVEL_POINTS[USERLEVEL-1])/levelsum)+"px"; 
                    } else {
                        newdiv1.style.marginLeft=Math.floor(4+levelSize*(levelLog[v][1]-LEVEL_POINTS[USERLEVEL-1])/levelsum)+"px";
                    }
                    help=levelLog[v][0].split(".");
                    if (new Date(parseInt(help[2],10),parseInt(help[1],10)-1,parseInt(help[0],10)).getDay()=="0"){ 
                        newdiv1.style.borderColor="red"; 
                    }
                }
            }
            newdiv1=null;newdiv=null;
        }
    }catch(err){ GM_logError("plotLevelProgressBar\nlevelLog["+v+"]="+implode(levelLog[v])+"\n"+err); }
    }
    plotLevelProgressBar();
    unsafeOverwriteFunction("updateMenuGo",function(){
        try{
            unsafeWindow._updateMenuGo();
        }catch(err){GM_logError("_updateMenuGo\n"+err);}
        window.setTimeout(function(){
        try{
            // calcTotalFarmis();
            // loadProductData();
            updateProductDataFarm();
            plotLevelProgressBar();
            calcProdMinRack();
            // calcProdMinRackInit();
            if(USERLEVEL<parseInt(unsafeWindow.currentuserlevel,10)){
                raiseEvent("gameUserlevelUp");
            }
            USERLEVEL=parseInt(unsafeWindow.currentuserlevel,10);
        }catch(err){ GM_logError("updateMenuGo\n"+err); }
        },0);
    });
    // Removing Advertising end on Advertising Abort
    unsafeOverwriteFunction("cancelAdResponse",function(response){
        try{
            var cell=$("alertAdvertEnd");
            if(cell){ removeElement(cell); }
            cell=null;
        }catch(err){GM_logError("cancelAdResponse\n"+err);}
        try{
            unsafeWindow._cancelAdResponse(response);
        }catch(err){GM_logError("_cancelAdResponse\n"+err);}
    });
    // Sprechblase
    err_trace="Bubble";
    createElement("div",{"id":"sprcontent2","style":"position:absolute;top:20px;left:323px;z-index:100;width:200px;height:90px;overflow:auto;display:none;"},$("sprcontent").parentNode);//same style as #sprcontent

    // Lager / Rack
    err_trace="Rack";
    newdiv=createElement("div",{"style":"display:none;"},$("lager_info"));//position:absolute;top:50px;left:58px;display:none;
    createElement("img",{"src":GFX+"adtime.gif","style":"float:left;width:14px;height:14px;margin-left:5px;"},newdiv);
    createElement("div",{"id":"lager_zeit_ziel","class":"tnormal","style":"float:left;margin-left:5px;"},newdiv);
    newdiv=createElement("div",{"id":"sendStockingContract","class":"link playerContract","style":"position:absolute;top:155px;left:10px;"},$("lager").firstElementChild);
    createElement("div",{},newdiv);
    newdiv.addEventListener("mouseover",function(event){
        try{
            if(unsafeWindow.selected&&(!prodBlock[0][unsafeWindow.selected].match(/t/))){
                toolTip.show(event,getText("storeXinContract").replace(/%1%/,prodName[0][unsafeWindow.selected]));
            }else{
                toolTip.show(event,"---");
            }
        }catch(err){ GM_logError("listener sendStockingContract.mouseover\n"+err); }
    },false);
    newdiv.addEventListener("click",function(event){
        try{
            if(unsafeWindow.selected&&(!prodBlock[0][unsafeWindow.selected].match(/t/))){
                var thisdata=new Object();
                thisdata["to"]=FARMNAME;
                thisdata["fillContract"]=new Object();
                thisdata["fillContract"][unsafeWindow.selected]=[prodStock[0][unsafeWindow.selected],1];
                GM_setValue(COUNTRY+"_"+SERVER+"_pagedataVertraegeNew",implode(thisdata));
                showMultiframePage("vertraege/new.php");
            }
        }catch(err){ GM_logError("listener sendStockingContract.click\n"+err); }
    },false);
    function showLagerZeitZiel(zoneNrF){
    try{
        // if(gameLocation[0]!="farm"){ return false; }
        var divLagerZeitZiel=$("lager_zeit_ziel");
        var growtime,help;
        switch(zones.getBuilding(zoneNrF)){
        case 1:{
            if ((unsafeWindow.mode==0)&&(prodTyp[0][unsafeWindow.selected]=="v")){
                var bonus=zones.getBonus(zoneNrF);
                if((help=zones.getBonusSpecial(zoneNrF))&&(unsafeWindow.selected==help[0])){ 
                    bonus += help[1]; 
                }
                bonus=1-(bonus/100);
                growtime=calcGrowDuration(60*prodGrowTime[0][unsafeWindow.selected],bonus);
            }
        break;}
        case "fl1":{
            if ((unsafeWindow.mode==0)&&(prodTyp[0][unsafeWindow.selected]=="fl")){
                var bonus=1-(zones.getBonus(zoneNrF)/100);
                if((help=zones.getBonusSpecial(zoneNrF))&&(unsafeWindow.selected==help[0])){
                    bonus *= 1-(help[1]/100); 
                }
                growtime=calcGrowDuration(60*prodGrowTime[0][unsafeWindow.selected],bonus);
            }
        break;}
        }
        if(growtime){
            $("lager_zeit").innerHTML=getTimeStr(growtime)+"&nbsp;"+getText("shortHours");
            if(divLagerZeitZiel.parentNode.style.display!="block"){
                divLagerZeitZiel.parentNode.style.display="block"; 
            }
            divLagerZeitZiel.innerHTML="=&nbsp;"+getDaytimeStr(now+growtime)+"&nbsp;"+getText("shortOClock");
        }else{
            hideLagerZeitZiel();
        }
        divLagerZeitZiel=null;
    }catch(err){ GM_logError("showLagerZeitZiel zoneNrF="+zoneNr+"\n"+err); }
    }
    function hideLagerZeitZiel(){
    try{
        var divLagerZeitZiel=$("lager_zeit_ziel");
        if(divLagerZeitZiel.parentNode.style.display!="none"){
            divLagerZeitZiel.parentNode.style.display="none";
        }
        divLagerZeitZiel=null;
    }catch(err){ GM_logError("hideLagerZeitZiel\n"+err); }
    }
    unsafeOverwriteFunction("selectRackItem",function(id,b){
        try{
            unsafeWindow._selectRackItem(id,b);
        }catch(err){GM_logError("selectRackItem id="+id+"\n"+err);}
        try{
            if($("gardenmaincontainer").style.display=="block"){
                var zoneNr=/parent.cache_me\((\d+?),120/.exec($("gardenarea").innerHTML);
                if(zoneNr){
                    zoneNr=parseInt(zoneNr[1],10);
                    showLagerZeitZiel(zoneNr+6*gameLocation[1]);
                }
            }else if($("farmersmarket_pos1_inner").style.display=="block"){
                showLagerZeitZiel("farmersmarket-1");
            }
        }catch(err){GM_logError("selectRackItem id="+id+"\n"+err);}
    });

    valMoveAnimals=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valMoveAnimals","[]"),"do_main/valMoveAnimals",[]);
    // executed,speedvert,top,bottom,speedhor,left,right
    function moveAnimals(mode){
        //GM_log("moveAnimals "+mode);
        if(($("innermaincontainer").style.display == "block")&&($("animalline"+mode))){
            var cand=$("animalline"+mode).getElementsByTagName("img");
            for(var v=0;v<cand.length;v++){
                cand[v].style.top=(Math.max(ANIMAL_MOVE[mode][2],Math.min(ANIMAL_MOVE[mode][3],parseInt(cand[v].style.top,10)+ANIMAL_MOVE[mode][1]*getRandom(-1,1))))+"px";
                cand[v].style.left=(Math.max(ANIMAL_MOVE[mode][5],Math.min(ANIMAL_MOVE[mode][6],parseInt(cand[v].style.left,10)+ANIMAL_MOVE[mode][4]*getRandom(-1,1))))+"px";
            }
            cand=null;
            window.setTimeout(function(){moveAnimals(mode);},100);
        }else{
            ANIMAL_MOVE[mode][0]=false;
        }
    }

    // events general =============================================================================
    err_trace="events general";
    // rack
    for(var v in prodName[0]){
        if(!prodName[0].hasOwnProperty(v)){ continue; }
        if(v==0){ continue; } // Coins
        if (!unsafeWindow.rackElement[v]){ prodStock[0][v]=0; } // not available
        // else if ("undefined" === typeof(unsafeWindow.rackElement[v].id)){ prodStock[0][v]=0; } // empty elements
        else if ("undefined" === typeof(unsafeWindow.rackElement[v].number)){ prodStock[0][v]=0; } // no stock available
        else if (!unsafeWindow.rackElement[v].number){ prodStock[0][v]=0; } // no stock available
        else { prodStock[0][v]=parseInt(unsafeWindow.rackElement[v].number,10); }
    }
    GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodStock",implode(prodStock));
    unsafeWindow.updateRackBusy=false;
    unsafeOverwriteFunction("updateRack",function(rack,init){
        try{
            var cell=$("divUpdateRack");
            if(!cell){
                cell=createElement("div",{"id":"divUpdateRack","class":"blackbox","style":"position:absolute;top:20%;left:50%;font-weight:bold;"},$("rackItems"),"Rack updating");
                cell.style.marginLeft=(-(cell.offsetWidth)/2)+"px";
            }
            cell.style.display="block";
            cell=null;
            unsafeWindow.updateRackBusy=true;
        }catch(err){GM_logError("updateRack\n"+err);}
        try{
            unsafeWindow._updateRack(rack,init);
        }catch(err){GM_logError("_updateRack\n"+err);}
    });
    unsafeOverwriteFunction("sortRackNew",function(type){
        try{
            unsafeWindow._sortRackNew(type);
        }catch(err){GM_logError("_sortRackNew\n"+err);}
        try{
            // save rack amounts
            for(var v in prodName[0]){
                if(!prodName[0].hasOwnProperty(v)){ continue; }
                if(v==0){ continue; } // Coins
                if (!unsafeWindow.rackElement[v]){ prodStock[0][v]=0; } // not available
                // else if ("undefined" === typeof(unsafeWindow.rackElement[v].id)){ prodStock[0][v]=0; } // empty elements
                else if ("undefined" === typeof(unsafeWindow.rackElement[v].number)){ prodStock[0][v]=0; } // no stock available
                else if (!unsafeWindow.rackElement[v].number){ prodStock[0][v]=0; } // no stock available
                else { prodStock[0][v]=parseInt(unsafeWindow.rackElement[v].number,10); }
            }       
            GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodStock",implode(prodStock));
            var cell=$("divUpdateRack");
            if(cell){ cell.style.display="none"; }
            cell=null;
            window.setTimeout(function(){
                calcProdMinRack(); // -> doBuyNotepad,doRack
                unsafeWindow.updateRackBusy=false;
                raiseEvent("gameUpdateRack");
            },0);
        }catch(err){GM_logError("sortRackNew type="+type+"\n"+err);}
    });
    /*
    function doRackNavi(){
    try{
        if(unsafeWindow.racktype!=2){  // Oil: no navi
            if(unsafeWindow.userracks>1){
                if(unsafeWindow._currRack=="0"){
                    // Left arrow to last rack
                    var div = unsafe$("racknavileft");
                    div.className = "link racknavi";
                    div.onmouseover = function(e) { unsafeWindow.showDiv("racknavileftinfo"); }
                    div.onmouseout = function(e) { unsafeWindow.hideDiv("racknavileftinfo"); }
                    div.onclick = function(e) { unsafeWindow.updateRack(Math.min(unsafeWindow.userracks,(unsafeWindow.premium==1?3:2))-1); }
                    $("racknavileftinfo").innerHTML = unsafeWindow.rack_tt_info+"&nbsp;"+Math.min(unsafeWindow.userracks,(unsafeWindow.premium==1?3:2));
                    div=null;
                } else if (parseInt(unsafeWindow._currRack,10)==Math.min(unsafeWindow.userracks,(unsafeWindow.premium==1?3:2))-1){
                    // Right arrow to first rack
                    var div = unsafe$("racknaviright");
                    div.className = "link racknavi";
                    div.onmouseover = function(e) { unsafeWindow.showDiv("racknavirightinfo"); }
                    div.onmouseout = function(e) { unsafeWindow.hideDiv("racknavirightinfo"); }
                    div.onclick = function(e) { unsafeWindow.updateRack("0"); }
                    $("racknavirightinfo").innerHTML = unsafeWindow.rack_tt_info+"&nbsp;1";
                    div=null;
                }
            }
        }
    }catch(err){ GM_logError("doRackNavi\n"+err); }
    }
    doRackNavi();   
    unsafeOverwriteFunction("initRackNavi",function(){
        unsafeWindow._initRackNavi();
        doRackNavi();
    });
    */
    if(newdiv=$("rackItems")){
        newdiv.addEventListener("dblclick",function(event){
            try{
                //GM_log("dblclick on "+event.target+" id="+event.target.id+" parentNode.id="+event.target.parentNode.id);
                var currId=null;
                var node=event.target;
                while((currId==null)&&(node!=this)){
                    if(node.id.match(/rackitem\d+/)){
                        currId=/rackitem(\d+)/.exec(node.id)[1];            
                    }else{
                        node=node.parentNode;
                    }
                }
                if((currId!=null)&&(!prodBlock[0][currId].match(/t/))){ showMarket(currId); }
            }catch(err){GM_logError("listener #rackItems.dblclick\n"+err);}
        },false);
    }
    /* TODO: function is not existing anymore
    unsafeOverwriteFunction("linfo",function(title,amount,id,offset,felder,kategorie){
        unsafeWindow._linfo(title,amount,id,offset,felder,kategorie);
        var newdiv;
        var rackPopup=$("rackPopup");
        if (!isNaN(NPC[0][id])){
            newdiv=createElement("div",{"class":"tmenu","style":"position:relative;height:13px;width:172px;top:-75px;padding-left:20px;background: url('"+GFX+"lager/flaeche.gif') left top transparent;background-position:0px -155px;"},rackPopup);
            createElement("span",{"style":"float:left;width:60px;"},newdiv,getText("NPCprice")+": ");
            createElement("span",{"style":"float:left;width:100px;text-align:right;"},newdiv,moneyFormat(NPC[0][id]));
        }
        if(!prodBlock[0][id].match(/t/)){
            newdiv=createElement("div",{"class":"tmenu","style":"position:relative;height:13px;width:172px;top:-75px;padding-left:20px;background: url('"+GFX+"lager/flaeche.gif') left top transparent;background-position:0px -155px;"},rackPopup);
            createElement("div",{"style":"display:inline-block;width:60px;"},newdiv,getText("marketPrice")+": ");
            createElement("div",{"style":"display:inline-block;width:100px;text-align:right;"},newdiv,moneyFormat(gut[id]));
            newdiv=createElement("div",{"class":"tmenu","style":"position:relative;height:13px;width:172px;top:-75px;padding-left:20px;background: url('"+GFX+"lager/flaeche.gif') left top transparent;background-position:0px -155px;"},rackPopup);
            createElement("div",{"style":"display:inline-block;width:60px;"},newdiv,getText("value")+": ");
            createElement("div",{"style":"display:inline-block;width:100px;text-align:right;"},newdiv,moneyFormatInt(gut[id]*prodStock[0][id]));
            newdiv=createElement("div",{"class":"tmenu","style":"position:relative;height:25px;width:172px;top:-75px;padding-left:20px;background: url('"+GFX+"lager/flaeche.gif') left top transparent;background-position:0px -155px;"},rackPopup);
            createElement("div",{"style":"width:160px;"},newdiv,getText("clickDouble")+": "+getText("goToMarket"));
        }
        newdiv=null;rackPopup=null;
    });
    */
    unsafeOverwriteFunction("globalcommitbox",function(content,onclick,onclick2){
        try{
            unsafeWindow._globalcommitbox(content,onclick,onclick2);
        }catch(err){GM_logError("_globalcommitbox\n"+err);}
        try{
            raiseEvent("gameOpenGlobalCommitBox");
        }catch(err){GM_logError("globalcommitbox\n"+err);}
    });
    unsafeOverwriteFunction("globalBox",function(f,a,e,c,b){
        try{
            unsafeWindow._globalBox(f,a,e,c,b);
        }catch(err){GM_logError("_globalBox\n"+err);}
        try{
            raiseEvent("gameOpenGlobalBox");
        }catch(err){GM_logError("globalBox\n"+err);}
    });

    if(newdiv=$("coins")){
        newdiv1=newdiv.cloneNode(true);
        insertAfter(newdiv1,newdiv);
        newdiv1.id="coinsFormat";
        newdiv1.innerHTML=numberFormat(prodStock[0][0]);
        newdiv.style.display="none";
        newdiv.parentNode.setAttribute("class","link");
        newdiv.parentNode.addEventListener("mouseover",function(event){ showGoToMarketToolTip(event,0); },false);
        newdiv.parentNode.addEventListener("click",function(){ showMarket(0); },false);
    }

    if(COUNTRY=="SE"){ $("bar").innerHTML=$("bar").innerHTML.replace(/\.(\d\d) /,",$1 "); }
    unsafeOverwriteFunction("updatePlayerInfo",function(money,coins,points,level,deco){
        try{
            unsafeWindow._updatePlayerInfo(money,coins,points,level,deco);
        }catch(err){GM_logError("_updatePlayerInfo\n"+err);}
        try{
            // GM_log("updatePlayerInfo money="+money+" coins="+coins+" points="+points+" level="+level+" deco="+deco);
            if(money){
                if(COUNTRY=="SE"){
                    money=money.replace(/\.(\d\d) /,",$1 ");
                    $("bar").innerHTML=money;
                }
                money=parseFloat(money.replace(getText("gamecurrency"),"").replace(/\s+/g,"").replace(regDelimThou,"").replace(regDelimDeci,"."));
                unsafeData.money=money;
                GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_bargeld",money);
            }
            if(coins){
                var c=parseInt(coins,10);
                if(!isNaN(c)){
                    prodStock[0][0]=c;
                    $("coinsFormat").innerHTML=numberFormat(c);
                    GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodStock",implode(prodStock));
                }
            }
        }catch(err){GM_logError("updatePlayerInfo\n"+err);} 
    });
    document.addEventListener("gameDoGetData",function(){
        window.setTimeout(loadProductData,0);
    },false);
    document.addEventListener("gameChangedBeobPrice",function(){
        window.setTimeout(function(){
            // GM_log("publish GMpreisBeob");
            top.unsafeData.preisBeob=explode(GM_getValue(COUNTRY+"_"+SERVER+"_preisBeob","[]"),"eventListener@gameChangedBeobPrice/preisBeob",[]).clone();
        },0);
    },false);
    document.addEventListener("gameChangedGut",function(){
        window.setTimeout(function(){
            gut=explode(GM_getValue(COUNTRY+"_"+SERVER+"_gut","[]"),"eventListener@gameChangedGut/gut",[]);
            top.unsafeData.gut=gut.clone();
            calcFarmiCost();
        },0);
    },false);
    document.addEventListener("gameChangedLevelLog",function(){
        window.setTimeout(function(){
            levelLog=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_levelLog","[]"),"eventListener@gameChangedLevelLog/levelLog",[]);
            setLevelLogId();
        },0);
    },false);
    document.addEventListener("gameChangedProdMinRackInit",function(){
        window.setTimeout(function(){
            //if(valMinRackMan){ prodMinRackInit=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodMinRackInit","[]")); }
            calcProdMinRackInit();
        },0);
    },false);

    // messages
    unsafeOverwriteFunction("messagesActionResponse",function(request,mode,id){
        try{
            unsafeWindow._messagesActionResponse(request,mode,id);
        }catch(err){GM_logError("_messagesActionResponse\n"+err);}
        try{
            if(checkRequest(request,mode)){
                switch(mode){
                case "system": window.setTimeout(messagesSystem,0); break;
                }
            }
        }catch(err){GM_logError("messagesActionResponse\n"+err);}
    });
    // market: [id,time,name,[prod,amount],money]
    // contract: [id,time,name,[[prod,amount],...],money]
    function messagesSystem(){
    try{
        if(!logSales){
            logSales=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_logSales","[]"),"messagesSystem/logSales",[]);
            logSales.sort(sortObjFunctions["int"],true);
            logSalesId=new Object();
            for(var v=logSales.length-1;v>=0;v--){
                logSalesId[logSales[v][0]]=v;
            }
        }
        var j,help,help2,help3,help4,currMsg,sender,betreff,time,amount,prod,money,dayStr,price;
        var div,span;
        var countRequest=0;
        for(var i=unsafeWindow.messages_data.length-1;i>=0;i--){
            currMsg=unsafeWindow.messages_data[i];
            help=currMsg.body.replace(/\s+/g," ");
            if(help2=regMsgFriend.exec(currMsg.subject)){
                //Friendship message
                // GM_log("messagesSystem: friendship message\nmessages_data["+i+"]:\n"+print_r(unsafeWindow.messages_data[i],"",true,"\n"));
                sender=help[1];
            }else if (help2=regMsgMarketsaleContent.exec(help)){ // Market sale
                // GM_log("messages_data["+i+"] MARKET:\n"+print_r(unsafeWindow.messages_data[i],"",true,"\n"));
                switch(COUNTRY){
                case "TR":{
                    help2.push(help2.splice(2,1).toString());
                break;}
                case "SE":{
                    help2[4]=help2[4].replace(/\.(\d\d) /,",$1 ");
                    help2[4]=help2[4].replace(/\.(\d\d)$/,",$1");
                break;}
                }
                sender=help2[1];
                betreff=(getText("marketplace")+": "+help2[3]).replace(/&nbsp;/g," ");
                time=getTime(currMsg.time);
                prod=prodId[0][help2[3]];
                amount=parseInt(help2[2],10);
                money=parseFloat(help2[4].replace(regDelimThou,"").replace(regDelimDeci,"."),10);
                price=Math.round(100*money/amount)/100;
                if(logSalesId[currMsg.nnr]==undefined){
                    logSalesId[currMsg.nnr]=logSales.push([currMsg.nnr])-1;
                    dayStr=getDateStr(time,2,false);
                    for(var v=levelLog.length-1;v>=0;v--){
                        if(levelLog[v][0]==dayStr){ break; }
                    }
                    if(v<0){ v=levelLog.push([dayStr,0,null,0,0,0])-1; }
                    levelLog[v][3]+=money;
                    levelLog[v][3]=Math.round(100*levelLog[v][3])/100;

                    help3 = amount;
                    while(help3>0){
                        for(var v=ownMarketOffers.length-1;v>=0;v--){
                            if((ownMarketOffers[v][0]==prod)&&(ownMarketOffers[v][1]==price)){
                                help4 = Math.min(ownMarketOffers[v][2],help3);
                                ownMarketOffers[v][2] -= help4;
                                if(ownMarketOffers[v][2]<1){ ownMarketOffers.splice(v,1); }
                                help3 -= help4;
                                break;
                            }
                        }
                        if(v<0){ help3=0; }
                    }
                }
                j=logSalesId[currMsg.nnr];
                logSales[j][1]=time;
                logSales[j][2]=sender;
                logSales[j][3]=[prod,amount];
                logSales[j][4]=money;
                if(valMessagesSystemMarkRead&&(currMsg.read=="0")){
                    window.setTimeout(unsafeWindow.messagesAction,500*(++countRequest),"unread",i);
                }
                if(div=$("messages_list_subject"+currMsg.nnr)){
                    div.setAttribute("j",j);
                    div.addEventListener("mouseover",function(event){
                        toolTip.show(event,toolTipSales(this.getAttribute("j")));
                    },false);
                    div.classList.add("systemMsg_marketsale");
                    div.innerHTML="";
                    igm(sender,div,betreff);
                    createElement("div",{"style":"display:inline-block;width:125px;margin-right:5px;"},div,sender);
                    span=createElement("div",{"style":"display:inline-block;width:145px;margin-right:5px;text-align:right;"},div,numberFormat(amount)+"&nbsp;"+prodName[0][prod]+"&nbsp;");
                    produktPic(0,prod,span);
                    createElement("div",{"style":"display:inline-block;width:75px;margin-right:5px;text-align:right;"},div,moneyFormatInt(money));
                }
            }else if (help2=regMsgContractsaleContent.exec(help)){// Contract sale
                if(COUNTRY=="SE"){
                    help2[3]=help2[3].replace(/\.(\d\d) /,",$1 ");
                    help2[3]=help2[3].replace(/\.(\d\d)$/,",$1");
                }
                sender=help2[1];
                money=parseFloat(help2[3].replace(regDelimThou,"").replace(regDelimDeci,"."),10);
                time=getTime(currMsg.time);
                if(logSalesId[currMsg.nnr]==undefined){
                    logSalesId[currMsg.nnr]=logSales.push([currMsg.nnr])-1;
                    var dayStr=getDateStr(time,2,false);
                    for(var v=levelLog.length-1;v>=0;v--){
                        if(levelLog[v][0]==dayStr){ break; }
                    }
                    if(v<0){ v=levelLog.push([dayStr,0,null,0,0,0])-1; }
                    levelLog[v][4]+=money;
                    levelLog[v][4]=Math.round(100*levelLog[v][4])/100;
                }
                j=logSalesId[currMsg.nnr];
                logSales[j][1]=time;
                logSales[j][2]=sender;
                logSales[j][3]=new Array();
                help4=new Array();
                while(help3=regMsgContractsaleList.exec(help2[2])){
                    help2[2]=help2[2].replace(help3[0],"");
                    logSales[j][3].push([prodId[0][help3[2]],parseInt(help3[1],10)]);
                }
                betreff=getText("contract");
                if(logSales[j][3].length==1){
                    prod=logSales[j][3][0][0];
                    amount=logSales[j][3][0][1];
                    betreff+=": "+prodName[0][prod];
                }
                logSales[j][4]=money;
                if(valMessagesSystemMarkRead&&(currMsg.read=="0")){
                    window.setTimeout(unsafeWindow.messagesAction,500*(++countRequest),"unread",i);
                }
                if(div=$("messages_list_subject"+currMsg.nnr)){
                    div.setAttribute("j",j);
                    div.addEventListener("mouseover",function(event){
                        toolTip.show(event,toolTipSales(this.getAttribute("j")));
                    },false);               
                    div.classList.add("systemMsg_contractsale");
                    div.innerHTML="";
                    igm(sender,div,betreff);
                    createElement("div",{"style":"display:inline-block;width:125px;margin-right:5px;"},div,sender);
                    span=createElement("div",{"style":"display:inline-block;width:145px;margin-right:5px;text-align:right;"},div);
                    if(logSales[j][3].length==1){
                        span.innerHTML=numberFormat(amount)+"&nbsp;"+prodName[0][prod]+"&nbsp;";
                        produktPic(0,prod,span);
                    }else{
                        span.innerHTML="...";
                    }
                    createElement("div",{"style":"display:inline-block;width:75px;margin-right:5px;text-align:right;"},div,moneyFormatInt(money));
                }
            }else{
                GM_log("messagesSystem: unknown message type\nmessages_data["+i+"]:\n"+print_r(unsafeWindow.messages_data[i],"",true,"\n"));
            }
        }
        if(countRequest>0){
            if(div=$("messageAlertReadingAll")){
                removeElement(div);
            }
            if(div=$("messages_main")){
                createElement("div",{"id":"messageAlertReadingAll","class":"alertbubble","style":"left:50%;margin-left:-200px;top:100px;text-align:center;font-weight:bold;"},div,getText("pleaseWait"));
                window.setTimeout(function(){
                    removeElement($("messageAlertReadingAll"));
                },500*(++countRequest));
            }
        }
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_levelLog",implode(levelLog));
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_ownMarketOffers",implode(ownMarketOffers));
        doMarketoffersNotepad();
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_logSales",implode(logSales));
        }catch(err){GM_logError("messagesSystem\n"+err);}
    };
    if(newdiv=$("messages_list_check")){
        newdiv2=createElement("button",{"class":"link button_new","type":"button","style":"margin-right:5px;"},false,getText("salesLog"));
        newdiv.insertBefore(newdiv2, newdiv.firstElementChild);
        newdiv2.addEventListener("click",function(){ unsafeWindow.buildInfoPanel("messages"); },false);
    }   
    // events farm ================================================================================
    err_trace="events farm";
    unsafeOverwriteFunction("farmMove",function(b){
        try{
            unsafeWindow._farmMove(b);
        }catch(err){GM_logError("_farmMove\n"+err);}
        try{
            if(b==99){
                gameLocation=["farmersmarket"];
                unsafeData.gameLocation=gameLocation.clone();
                raiseEvent("gameFarmersmarketOpened");
            }else{
                gameLocation=["farm",unsafeWindow.farm-1];
                unsafeData.gameLocation=gameLocation.clone();
                raiseEvent("gameFarmOpened");
            }
        }catch(err){GM_logError("farmMove\n"+err);}
    });
    function doFarmZone(farmNR,zoneNr){
        try{    
            var divZone,divZoneInfo,div;
            var help,zoneNrF,data,currZoneType;
            if(divZone=$("farm"+farmNR+"_pos"+zoneNr)){
                zoneNrF=zoneNr+6*(farmNR-1);
                // zone is blocked
                divZone.style.opacity=(zones.getBlock(zoneNrF).match(/[pq]/)?0.5:1);
                if(!zones.getBlock(zoneNrF)){
                    data=unsafeWindow.farms_data.farms[farmNR][zoneNr];
                    currZoneType=parseInt(data.buildingid,10);
                    // Upgrade button
                    if(BUILDING_UPGRADES[currZoneType]&&BUILDING_UPGRADES[currZoneType][data.level]){
                        if(data.upgrade&&(!data.premiumblock)){
                            div=$("farm_upgrade_tt"+farmNR+"_"+zoneNr);
                        }else{
                            div=$("farm_buttons"+farmNR+"_"+zoneNr);
                            div=createElement("div",{"id":"farm_button_upgrade"+farmNR+"_"+zoneNr,"class":"farm_button_upgrade button_upgrade link"},div);
                            div=createElement("div",{"id":"farm_upgrade_tt"+farmNR+"_"+zoneNr,"class":"ttbox farm_button_tt"},div);
                            createElement("div",{},div,unsafeWindow.infoupdatebuilding);
                            if(isNaN(BUILDING_UPGRADES[currZoneType][data.level][1])){
                                createElement("div",{},div,BUILDING_UPGRADES[currZoneType][data.level][1].replace("c","")+"&nbsp;"+getText("coins"));
                            }else{
                                createElement("div",{},div,moneyFormatInt((1-unsafeData.carpentry_bonus/100)*BUILDING_UPGRADES[currZoneType][data.level][1]));
                            }
                            if(USERLEVEL<BUILDING_UPGRADES[currZoneType][data.level][0]){
                                createElement("div",{"class":"bonusinfo important"},div,unsafeWindow.error1005.replace("%LEVEL%",BUILDING_UPGRADES[currZoneType][data.level][0]));
                            }                           
                        }
                        if(div){
                            var help2=BUILDING_UPGRADES[currZoneType][data.level-1][2]-BUILDING_UPGRADES[currZoneType][data.level][2];
                            if(help2>0){
                                if(currZoneType==1){
                                    if(data.level>3){
                                        createElement("div",{"style":"margin-top:10px;"},div,unsafeWindow.updatetext[7].replace(/%MORE%/,numberFormat(100*help2))); // water bonus on product
                                    }else{
                                        createElement("div",{"style":"margin-top:10px;"},div,unsafeWindow.updatetext[6].replace(/%MORE%/,numberFormat(100*(1-BUILDING_UPGRADES[currZoneType][data.level][2])))); // general water bonus
                                    }
                                }else{
                                    createElement("div",{"style":"margin-top:10px;"},div,unsafeWindow.updatetext[2].replace(/%MORE%/,numberFormat(100*help2))); // reduction of time
                                }
                            }
                            help2=BUILDING_UPGRADES[currZoneType][data.level][3]-BUILDING_UPGRADES[currZoneType][data.level-1][3];
                            if(help2>0){ // more animals
                                var animalCost=0;
                                for(var nr=1;nr<=help2;nr++){
                                    animalCost += Math.round(ANIMALCOST[currZoneType][0]+(totalAnimals[currZoneType]+nr)*ANIMALCOST[currZoneType][1]);
                                }
                                createElement("div",{"style":"margin-top:10px;"},div,unsafeWindow.updatetext[1].replace(/%MORE%/,numberFormat(BUILDING_UPGRADES[currZoneType][data.level][3]))+" (+"+help2+",&nbsp;"+moneyFormatInt(animalCost)+")");
                            }
                        }
                    }
                    // Zone mouseover showing possible production
                    if(BUILDINGTYPE[currZoneType]!=0){
                        // Replace Level-Stars (else it blocks zone mouseover)
                        divZone.querySelector(".farm_pos_back").appendChild(divZone.querySelector(".farm_pos_level"));
                        divZone.querySelector(".farm_pos_click").addEventListener("mouseover",function(event){
                            var help=/^farm(\d+)_pos(\d+)_click$/.exec(this.id);
                            var farmNR=parseInt(help[1],10);
                            var zoneNr=parseInt(help[2],10);
                            var zoneNrF=zoneNr+6*(farmNR-1);
                            var currZoneType=zones.getBuilding(zoneNrF);
                            var currAnimals=zones.getAnimals(zoneNrF);
                            if(currZoneType==1){ 
                                showLagerZeitZiel(zoneNrF); 
                            }else{
                                var buildinginfo = this.querySelector(".tt");
                                if(!buildinginfo){
                                    buildinginfo=createElement("div",{"class":"tt","style":"display:none;"},this);
                                    var table,tr,td,div;
                                    table=createElement("table",{"border":"0","cellspacing":"0","cellpadding":"0"},buildinginfo);
                                    switch(BUILDINGTYPE[currZoneType]){
                                    case 2:{
                                        help="";
                                        for(var output in BUILDING_INPUT[currZoneType]){
                                            if(!BUILDING_INPUT[currZoneType].hasOwnProperty(output)){ continue; }
                                            if(prodBlock[0][output]){ continue; }
                                            tr=createElement("tr",{},table);
                                            td=createElement("td",{"style":help+"padding-right:5px;"},tr);
                                            div=createElement("div",{"style":"line-height:16px;white-space:nowrap;"},td);
                                            produktPic(0,output,div);
                                            createElement("span",{},div,numberFormat(prodYield[0][output]*currAnimals)+" "+prodName[0][output]);
                                            pointsFormat(prodYield[0][output]*currAnimals*prodPoints[0][output],"div",td);
                                            // 60*prodGrowTime[0][output]*(100-zones.getBonus(zoneNrF))/100
                                            var time=[];
                                            time[0]=calcProductionTime(2,0,output,1-zones.getBonus(zoneNrF)/100,BUILDING_INPUT[currZoneType][output][0][0][1]/currAnimals)[0];
                                            time[1]=calcProductionTime(2,0,output,1-zones.getBonus(zoneNrF)/100,BUILDING_INPUT[currZoneType][output][0][0][1]/currAnimals,1)[0];
                                            for(var alt=1;alt<BUILDING_INPUT[currZoneType][output].length;alt++){
                                                time[0]=Math.min(time[0],calcProductionTime(2,0,output,1-zones.getBonus(zoneNrF)/100,BUILDING_INPUT[currZoneType][output][alt][0][1]/currAnimals)[0]);
                                                time[1]=Math.max(time[1],calcProductionTime(2,0,output,1-zones.getBonus(zoneNrF)/100,BUILDING_INPUT[currZoneType][output][alt][0][1]/currAnimals,1)[0]);
                                            }
                                            createElement("div",{"style":"line-height:16px;white-space:nowrap;"},td,getTimeStr(time[0])+" - "+getTimeStr(time[1]));
                                            for(var alt=0;alt<BUILDING_INPUT[currZoneType][output].length;alt++){
                                                td=createElement("td",{"style":help+"border-left:1px dashed black;padding:0 5px;"},tr);
                                                for(var i=0;i<BUILDING_INPUT[currZoneType][output][alt].length;i++){
                                                    div=createElement("div",{"style":"line-height:16px;white-space:nowrap;"},td);
                                                    produktPic(0,BUILDING_INPUT[currZoneType][output][alt][i][0],div);
                                                    createElement("span",{},div,"1 - "+numberFormat(calcProductionTime(2,0,output,1-zones.getBonus(zoneNrF)/100,BUILDING_INPUT[currZoneType][output][alt][0][1]/currAnimals)[1])+" "+prodName[0][BUILDING_INPUT[currZoneType][output][alt][i][0]]);
                                                    createElement("div",{"style":"line-height:16px;white-space:nowrap;"},td,getTimeStr(BUILDING_INPUT[currZoneType][output][alt][i][1]/currAnimals));
                                                }
                                            }
                                            help="border-top:1px solid black;";
                                        }
                                    break;}
                                    case 3:{
                                        help="";
                                        for(var output in BUILDING_INPUT[currZoneType]){
                                            if(!BUILDING_INPUT[currZoneType].hasOwnProperty(output)){ continue; }
                                            if(prodBlock[0][output]){ continue; }
                                            tr=createElement("tr",{},table);
                                            td=createElement("td",{"style":help+"padding-right:10px;"},tr);
                                            div=createElement("div",{"style":"line-height:16px;white-space:nowrap;"},td);
                                            produktPic(0,output,div);
                                            createElement("span",{},div,numberFormat(prodYield[0][output])+" "+prodName[0][output]);
                                            pointsFormat(prodYield[0][output]*prodPoints[0][output],"div",td);
                                            createElement("div",{"style":"line-height:16px;white-space:nowrap;"},td,getTimeStr(60*prodGrowTime[0][output]*(100-zones.getBonus(zoneNrF))/100));
                                            for(var alt=0;alt<BUILDING_INPUT[currZoneType][output].length;alt++){
                                                td=createElement("td",{"style":help+"border-left:1px dashed black;padding:0 5px;"},tr);
                                                for(var i=0;i<BUILDING_INPUT[currZoneType][output][alt].length;i++){
                                                    div=createElement("div",{"style":"line-height:16px;white-space:nowrap;"},td);
                                                    produktPic(0,BUILDING_INPUT[currZoneType][output][alt][i][0],div);
                                                    createElement("span",{},div,numberFormat(BUILDING_INPUT[currZoneType][output][alt][i][1])+" "+prodName[0][BUILDING_INPUT[currZoneType][output][alt][i][0]]);
                                                }
                                            }
                                            help="border-top:1px solid black;"
                                        }
                                    break;}
                                    }
                                    table=null;tr=null;td=null;div=null;
                                }
                                toolTip.show(event,buildinginfo.innerHTML,this);
                                buildinginfo=null;
                            }
                            help=null;
                        },false);
                        
                    }
                    // Zone info - show current production
                    divZoneInfo=divZone.querySelector(".farm_pos_production");
                    if(!divZoneInfo){
                        divZoneInfo=createElement("div",{"class":"farm_pos_production"},divZone);
                    }
                    divZoneInfo.addEventListener("mouseover",function(event){
                        var help=/^farm(\d+)_pos(\d+)$/.exec(this.parentNode.id);
                        help=parseInt(help[2],10)+6*(parseInt(help[1],10)-1);
                        toolTip.show(event,toolTipZoneProduction(help));
                    },false);
                    // Mouseover
                    divZone.addEventListener("mouseout",function(){
                        hideBlase();
                        hideLagerZeitZiel();
                    },false);
                    divZone.addEventListener("mouseover",function(){
                        var help = /^farm(\d+)_pos(\d+)$/.exec(this.id);
                        help=parseInt(help[2],10)+6*(parseInt(help[1],10)-1)
                        showBlase(help);
                        showLagerZeitZiel(help);
                    },true);
                    // Mouseover by tooltip
                    if(div=divZone.querySelector(".farm_button_autoplant")){
                        div.addEventListener("mouseover",function(event){
                            toolTip.show(event,this.querySelector(".farm_button_tt").innerHTML,this);
                        },false);
                    }
                    if(div=divZone.querySelector(".farm_button_upgrade")){
                        div.addEventListener("mouseover",function(event){
                            toolTip.show(event,this.querySelector(".farm_button_tt").innerHTML,this);
                        },false);
                    }                       
                    if(div=divZone.querySelector(".farm_button_gardenspeedup")){
                        div.addEventListener("mouseover",function(event){
                            toolTip.show(event,this.querySelector(".farm_button_tt").innerHTML,this);
                        },false);
                    }
                    // Specific things
                    switch(currZoneType){
                    case 1:{ // field
                        // percentage of garbaged area
                        if((help=zones.getProduction(zoneNrF))&&help[2]&&(help[2][1]<BUILDING_SIZE["1"])){
                            createElement("div",{"id":"garbagePerc_"+zoneNrF,"class":"blackbox","style":"position:absolute;top:50px;left:50px;padding:4px;font-weight:bold;"},divZone.querySelector(".farm_pos_back"),numberFormat(100*help[2][1]/BUILDING_SIZE["1"])+"%");
                        }
                        // Production
                        if(div=$("farm_production_running"+farmNR+"_"+zoneNr)){
                            createElement("div",{"class":"v"+zones.getMainproduct(zoneNrF),"style":"position:absolute;"},div);
                        }
                        // Watering timer
                        createZoneTimer("zoneTimerWater_"+zoneNrF,zoneNrF,"zoneTimerWater","top:20px;left:5px;",divZone);
                    break;}
                    case 2:{ // chicken
                        // more animals
                        createElement("img",{"src":GFX+"chickenmapani2.gif","style":"position:absolute;top:30px;left:10px;"},divZone.firstElementChild.firstElementChild);
                        createElement("img",{"src":GFX+"chickenmapani2.gif","style":"position:absolute;top:30px;left:50px;"},divZone.firstElementChild.firstElementChild);
                        createElement("img",{"src":GFX+"chickenmapani1.gif","style":"position:absolute;top:50px;left:70px;"},divZone.firstElementChild.firstElementChild);
                        createElement("img",{"src":GFX+"chickenmapani1.gif","style":"position:absolute;top:60px;left:30px;"},divZone.firstElementChild.firstElementChild);
                        createElement("img",{"src":GFX+"chickenmapani1.gif","style":"position:absolute;top:80px;left:30px;"},divZone.firstElementChild.firstElementChild);
                        createElement("img",{"src":GFX+"chickenmapani2.gif","style":"position:absolute;top:100px;left:50px;"},divZone.firstElementChild.firstElementChild);
                    break;}
                    case 4:{ // sheep
                        // more animals
                        createElement("img",{"src":GFX+"sheep_ani01.gif","style":"position:absolute;top:60px;left:30px;"},divZone.firstElementChild.firstElementChild);
                        createElement("img",{"src":GFX+"sheep_ani02.gif","style":"position:absolute;top:30px;left:10px;"},divZone.firstElementChild.firstElementChild);
                    break;}
                    case 12:{ // goats
                        // more animals
                        createElement("img",{"src":GFX+"goat_ani_01.gif","style":"position:absolute;top:105px;left:50px;"},divZone.firstElementChild.firstElementChild);
                        createElement("img",{"src":GFX+"goat_ani_02.gif","style":"position:absolute;top:75px;left:30px;"},divZone.firstElementChild.firstElementChild);
                    break;}
                    case 13:{ // oil
                        if(div=$("farm_production_current13_"+zoneNr)){ divZone.appendChild(div); }
                    }
                    case 14:{ // special oil
                        if(div=$("farm_production_current14_"+zoneNr)){ divZone.appendChild(div); }
                    }
                    }                       
                }
                divZone=null;divZoneInfo=null;div=null;
            }   
        }catch(err){GM_logError("doFarmZone\nfarmNR="+farmNR+" zoneNr="+zoneNr+"\n"+err);}  
    }
    unsafeData.carpentry_bonus=parseInt($("carpentry_icon_currentbonus").innerHTML,10);
    unsafeOverwriteFunction("farmBuildPositions",function(){
        try{
            unsafeWindow._farmBuildPositions();
        }catch(err){GM_logError("_farmBuildPositions\n"+err);}
        try{
            var farmNr,zoneNr,zoneNrF,data,currZoneType,currBlock,currBonus,currBonusSpecial;
            totalAnimals=[];
            if(!unsafeData.carpentry_bonus){ unsafeData.carpentry_bonus=0; }
            for (var d in unsafeWindow.farms_data.farms) {
                if(!unsafeWindow.farms_data.farms.hasOwnProperty(d)){ continue; }
                if (d > unsafeWindow.farms_data.count) { break; }
                for (var c in unsafeWindow.farms_data.farms[d]) {
                    if(!unsafeWindow.farms_data.farms[d].hasOwnProperty(c)){ continue; }
                    data=unsafeWindow.farms_data.farms[d][c];
                    farmNr=parseInt(d,10);
                    zoneNr=parseInt(c,10);
                    zoneNrF=zoneNr+6*(farmNr-1);
                    currZoneType=parseInt(data.buildingid,10);
                    currBlock="";
                    if(BUILDINGTYPE[currZoneType]==0){
                        currBlock+="t"; //blocked by type (Club & Carpentry)
                    }
                    if(data.bulldoze&&data.bulldoze.quest){
                        currBlock+="q"; //blocked by quest
                    }
                    if(data.bulldoze&&data.bulldoze.cost){
                        currBlock+="b"; //blocked by payment
                    }
                    if(data.status=="0"){
                        currBlock+="s"; //blocked by status
                    }
                    if ((unsafeWindow.premium!=1)&&(data.premium==1)){
                        currBlock+="p"; //premium-zone but no premium-account
                    }
                    currBonus=((BUILDING_UPGRADES[currZoneType]&&BUILDING_UPGRADES[currZoneType][data.level-1])?Math.round(100*(1-BUILDING_UPGRADES[currZoneType][data.level-1][2])):0);
                    currBonusSpecial=null;
                    if (currZoneType==1){ // Field
                        if(questData["main"]["1"]["nr"]>170){ currBonus+=5; } // global bonus gained by quest 170
                        if(data.product){
                            currBonusSpecial=[parseInt(data.product,10),10]; // the id of special plant, additional bonus for special plant
                        }
                    }
                    zones.setBuilding(zoneNrF,currZoneType);
                    zones.setBlock(zoneNrF,currBlock);
                    zones.setBonus(zoneNrF,currBonus);
                    zones.setBonusSpecial(zoneNrF,currBonusSpecial);
                    if(currBlock){
                        zones.setProduction(zoneNrF,[[],0,0,true]);
                        if(zones.isMultiSlot(zoneNrF)){
                            for(var slot=1;slot<=3;slot++){ // TODO dynamic slot-amount
                                zones.setProduction(zoneNrF+"."+slot,[[],0,0,true]);
                            }
                        }
                    }
                    if(data.animals){
                        zones.setAnimals(zoneNrF,parseInt(data.animals,10));
                    }                           
                }
            }
            for (var d in unsafeWindow.farms_data.farms) {
                if(!unsafeWindow.farms_data.farms.hasOwnProperty(d)){ continue; }
                if (d > unsafeWindow.farms_data.count) { break; }
                for (var c in unsafeWindow.farms_data.farms[d]) {
                    if(!unsafeWindow.farms_data.farms[d].hasOwnProperty(c)){ continue; }
                    doFarmZone(parseInt(d,10),parseInt(c,10));
                }
            }
            calcTotalZones();
            lastGiess=null;
            lastErnte=null;
            // Event
            raiseEvent("gameFarmLoaded");
        }catch(err){GM_logError("farmBuildPositions\nzoneNrF="+zoneNrF+"\n"+err);}
    });
    // Farm filling
    // initZones > getUserFarmInfos > userFarmInfosResponse > getTimeEvents >
    // unsafeOverwriteFunction("initZones",function(farmid){
    //  unsafeWindow._initZones(farmid);
    // });

    function drawZoneNavi(zoneNrF,container){
    try{
        // logBubble.add("drawZoneNavi zoneNrF="+zoneNrF);
        var newdiv=$("zoneNavi");
        if(newdiv){ removeElement(newdiv); }
        newdiv=createElement("div",{"id":"zoneNavi"},container);
        var newdiv1;
        var c=[null,null,null];
        for(var i=0;i<ALL_ZONES["farm"].length;i++){
            if(ALL_ZONES["farm"][i]==zoneNrF){
                c[1]=i;break;
            }
        }
        if(c[1]!=null){
            c[2]=((c[1]+1)%ALL_ZONES["farm"].length);
            while(zones.getBlock(ALL_ZONES["farm"][c[2]])||(zones.getBuilding(ALL_ZONES["farm"][c[2]])!=zones.getBuilding(zoneNrF))){
                c[2]=((c[2]+1)%ALL_ZONES["farm"].length);
            }
            if (c[1]!=c[2]){
                c[0]=((c[1]+ALL_ZONES["farm"].length-1)%ALL_ZONES["farm"].length);
                while(zones.getBlock(ALL_ZONES["farm"][c[0]])||(zones.getBuilding(ALL_ZONES["farm"][c[0]])!=zones.getBuilding(zoneNrF))){
                    c[0]=((c[0]+ALL_ZONES["farm"].length-1)%ALL_ZONES["farm"].length);
                }
                if (c[0]!=c[2]){
                newdiv1=createElement("div",{"class":"link leftarrow","zone":ALL_ZONES["farm"][c[0]]},newdiv);
                newdiv1.addEventListener("click",function(){
                    if(this.parentNode){ removeElement(this.parentNode); }
                    goToZone(this.getAttribute("zone"));
                },false);
                newdiv1.addEventListener("mouseover",function(event){ 
                    var zone=parseInt(this.getAttribute("zone"),10);
                    toolTip.show(event,getText("goToZoneX").replace(/%1%/,Math.ceil(zone/6)+"."+(1+((zone-1)%6))));
                    zone=null;
                },false);
                }
                newdiv1=createElement("div",{"class":"link rightarrow","zone":ALL_ZONES["farm"][c[2]]},newdiv);
                newdiv1.addEventListener("click",function(){
                    if(this.parentNode){ removeElement(this.parentNode); }
                    goToZone(this.getAttribute("zone"));
                },false);
                newdiv1.addEventListener("mouseover",function(event){ 
                    var zone=parseInt(this.getAttribute("zone"),10);
                    toolTip.show(event,getText("goToZoneX").replace(/%1%/,Math.ceil(zone/6)+"."+(1+((zone-1)%6))));
                    zone=null;
                },false);
            }
        }
        newdiv=null;newdiv1=null;
    }catch(err){GM_logError("drawZoneNavi zoneNrF="+zoneNrF+"\n"+err);}
    }

    // field
    function checkFieldTimes(){
    try{
    if(DEVMODE_FUNCTION){ var trackingHandle = tracking.start("berater","checkFieldTimes"); }
        var zoneNr=parseInt(/parent.cache_me\((\d+?),120/.exec($("gardenarea").innerHTML)[1],10);
        var zoneNrF=zoneNr+6*gameLocation[1];
        var newData=[[{}],[,0,0,,0],[,0,0,,0],true];

        // save garden-informations
        var helpArray=new Array();//planted fields
        var helpArray2=new Array();//empty fields
        var z,p,w,iAmount,iPoints,help;
        for(var v=1;v<=BUILDING_SIZE["1"];v++){
            z=parseInt(unsafeWindow.garten_zeit[v],10);
            p=unsafeWindow.garten_prod[v];
            switch(unsafeWindow.garten_kategorie[v]){
            case "v":{ // plants
                helpArray[v]=true;
                helpArray2[v]=false;
                if (z>0){
                    iAmount=(prodYield[0][p]+((currentPowerup[p]&&(z<currentPowerup[p][0]))?currentPowerup[p][1]:0)); 
                    iPoints=(prodPoints[0][p]+((currentPowerup[p]&&(z<currentPowerup[p][0]))?currentPowerup[p][2]:0));
                
                    if ((unsafeWindow.garten_x[v]==1)&&(unsafeWindow.garten_y[v]==1)){ // only first part of a plant
                        w=parseInt(unsafeWindow.garten_wasser[v],10)+86400;
                        w=((w==86400)?1:(w<z?w:NEVER)); // watertime
                        if(!newData[0][0][p]){ newData[0][0][p]=new Array(); }
                        var notfound=true;
                        for(var i=0;i<newData[0][0][p].length;i++){
                            if((newData[0][0][p][i][2]==z)&&(newData[0][0][p][i][3]==w)){
                                newData[0][0][p][i][0]+=iAmount;
                                newData[0][0][p][i][1]+=iPoints;
                                notfound=false;break;
                            }
                        }
                        if(notfound){ newData[0][0][p].push([iAmount,iPoints,z,w]); }
                    }
                    // only show one sprinkler
                    if ((unsafeWindow.garten_x[v]==2)||(unsafeWindow.garten_y[v]!=unsafeWindow.garten_max_y[v])){
                        if ($("w"+v).style.display!="none") $("w"+v).style.display="none";
                    }else{
                        if ($("w"+v).style.display!="") $("w"+v).style.display="";
                    }
                }else{
                    helpArray[v]=true;
                    helpArray2[v]=true;
                }
            break;}
            case "z":{ // decorations
                helpArray[v]=false;
                helpArray2[v]=false;
                if ((unsafeWindow.garten_x[v]==1)&&(unsafeWindow.garten_y[v]==1)){ // only first part
                    if(!newData[0][0][p]){ newData[0][0][p]=new Array(); }
                    var notfound=true;
                    for(var i=0;i<newData[0][0][p].length;i++){
                        if((newData[0][0][p][i][2]==z)){
                            newData[0][0][p][i][0]++;
                            notfound=false;break;
                        }
                    }
                    if(notfound){ newData[0][0][p].push([1,0,z]); }
                }
            break;}
            case "u":{ // garbage
                helpArray[v]=false;
                helpArray2[v]=false;
                if(!newData[0][0][p]){ newData[0][0][p]=1; }
                else{ newData[0][0][p]++; }
            break;}
            default:{ // empty fields , p==0
                helpArray[v]=true;
                helpArray2[v]=true;
            break;}
            }
        }
        // calculate current space
        for(var v=1;v<helpArray2.length;v++){
            if(helpArray2[v]){ newData[1][1]++; }
        }
        help=helpArray2.clone();
        for(var v=1;v<help.length;v++){
            if((v%12!=0)&&help[v]&&help[v+1]){
                help[v+1]=false;
                newData[1][2]++;
            }
        }
        help=helpArray2.clone();
        for(var v=1;v<help.length;v++){
            if((v%12!=0)&&help[v]&&help[v+1]&&help[v+12]&&help[v+13]){
                help[v+1]=false;
                help[v+12]=false;
                help[v+13]=false;
                newData[1][4]++;
            }
        }
        // calculate possible space
        for(var v=1;v<helpArray.length;v++){
            if(helpArray[v]){ newData[2][1]++; }
        }
        help=helpArray.clone();
        for(var v=1;v<help.length;v++){
            if((v%12!=0)&&help[v]&&help[v+1]){
                help[v+1]=false;
                newData[2][2]++;
            }
        }
        help=helpArray.clone();
        for(var v=1;v<help.length;v++){
            if((v%12!=0)&&help[v]&&help[v+1]&&help[v+12]&&help[v+13]){
                help[v+1]=false;
                help[v+12]=false;
                help[v+13]=false;
                newData[2][4]++;
            }
        }
        // calculate garden-informations
        zones.setProduction(zoneNrF,newData.clone());
        newData=null;
        // auto-watering
        if((top.unsafeData.autoAction==null)&&valAutoWater["farm"] && (zones.getWatertime(zoneNrF)<unsafeWindow.Zeit.Server) && (lastGiess!=zoneNrF) && $("tooltipwaterall") && $("waterall")){
            top.unsafeData.autoAction="berater: field water";
            lastGiess=zoneNrF;
            window.setTimeout(function(div){
                click(div);
                top.unsafeData.autoAction=null;
            },500,$("waterall").firstElementChild);
        }
        //auto-cropping
        if((top.unsafeData.autoAction==null)&&valAutoCrop["farm"] && (zones.getEndtime(zoneNrF)<unsafeWindow.Zeit.Server) && (lastErnte!=zoneNrF) && $("tooltipcropall") && $("cropall")){
            top.unsafeData.autoAction="berater: field crop";
            lastErnte=zoneNrF;
            window.setTimeout(function(div){
                click(div);
                top.unsafeData.autoAction=null;
            },500,$("cropall").firstElementChild);
        }
        // update zone-icons
        // TODO!
        // show croppings of this field
        var cell=$("currentFieldZoneErnte");
        var newdiv;
        if(cell){ cell.innerHTML=""; }
        else{ cell=createElement("div",{"id":"currentFieldZoneErnte","style":"position:absolute;top:40px;left:0;","class":"blackbox"},$("gardenmaincontainer")); }
        help=zones.getCrop(zoneNrF);
        for(var k=0;k<help.length;k++){
            newdiv=createElement("div",{"style":"height:15px"},cell);
            produktPic(help[k][0],help[k][1],newdiv);
            createElement("span",{},newdiv,numberFormat(help[k][2])+"&nbsp;"+prodName[help[k][0]][help[k][1]]);
        }
        cell=null;newdiv=null;
    if(DEVMODE_FUNCTION){ tracking.end("berater",trackingHandle); }
    }catch(err){ GM_logError("checkFieldTimes\n"+err); }
    }

    unsafeOverwriteFunction("getGardenInfoResponse",function(request,zoneNr){
        try{
            unsafeWindow._getGardenInfoResponse(request,zoneNr);
        }catch(err){GM_logError("_getGardenInfoResponse\n"+err);}
        try{
            // GM_log("getGardenInfoResponse zoneNr="+zoneNr+"\n"+print_r(eval('('+response+')'),"",true,"\n"));
            //waterlog GM_log("getGardenInfoResponse zoneNr="+zoneNr+"\nwater: "+print_r(eval('('+response+')')["water"],"",true,"\n"));
            zoneNr=parseInt(zoneNr,10);
            var zoneNrF=zoneNr+6*gameLocation[1];
            if (!$("divErnteInfo")){ createElement("div",{"id":"divErnteInfo"},$("gardenmaincontainer")); }
            $("gardenmaincontainer").setAttribute("zoneNr",zoneNr);
            drawZoneNavi(zoneNrF,$("gardenmaincontainer"));
            showLagerZeitZiel(zoneNrF);
        
            //Klon des Anpflanzautomaten
            /*
            var newdiv;
            if($("gardencancel").childElementCount==1 && $("autoplantbutton"+zoneNr)){
                newdiv=$("autoplantbutton"+zoneNr).parentNode.cloneNode(true);
                newdiv.addEventListener("click",function(){$("gardenmaincontainer").setAttribute("style","display:none");},false);
                $("gardencancel").appendChild(newdiv);
            }
            newdiv=null;
            */
            checkFieldTimes();
        }catch(err){GM_logError("getGardenInfoResponse\n"+err);}    
    });
    unsafeOverwriteFunction("farmAction",function(mode,farm,position,s,d,b,a){
        try{
            switch(mode){
            case "dailydonkey":{
                // Only consider opening donkeyInfoPanel, if donkey is bought
                if (unsafeWindow.donkey_isset) {
                    var showDonkeyPanel=false;
                    for(var i=logDonkey.length-1;i>=0;i--){
                        if(logDonkey[i][0]==todayServerStr){ 
                            showDonkeyPanel=true;
                            break;
                        }
                    }
                
                    if(showDonkeyPanel){
                        unsafeWindow.buildInfoPanel("donkey");
                        return false;
                    }
                }
            break;}
            }
        }catch(err){GM_logError("farmAction (pre)\n"+err);}
        try{
            unsafeWindow._farmAction(mode,farm,position,s,d,b,a);
        }catch(err){GM_logError("_farmAction\n"+err);}
    });
    unsafeOverwriteFunction("farmActionResponse",function(request,mode,farmNR,zoneNr,z,d,b,a){
        try{
            unsafeWindow._farmActionResponse(request,mode,farmNR,zoneNr,z,d,b,a);
        }catch(err){GM_logError("_farmActionResponse\n"+err);}
        try{
            var r = checkRequest(request, mode);
            if((r!=0)&&(r[0]!=0)){
                var zoneNrF = zoneNr+6*(farmNR-1);
                if(zones.getBuilding(zoneNrF)==1){
                    switch(mode){
                    case "gardeninit": raiseEvent("gameFieldOpened"); break;
                    case "autoplant": raiseEvent("gameFieldPlanted"); break;
                    case "watergarden": raiseEvent("gameFieldWatered"); break;
                    case "cropgarden": raiseEvent("gameFieldCropped"); break;
                    }
                }
                switch(mode){
                case "dogbonus": doDogBen(); break;
                case "flowerarea_harvest_all": raiseEvent("gameFarmersmarketCropped"); break;
                case "flowerarea_autoplant": raiseEvent("gameFarmersmarketStarted"); break;
                case "flowerarea_water_all": raiseEvent("gameFarmersmarketWatered"); break;
                case "megafield_tour": raiseEvent("gameMegafieldTourStarted"); break;
                case "nursery_harvest": raiseEvent("gameFarmersmarketCropped"); break;
                case "nursery_startproduction": raiseEvent("gameFarmersmarketStarted"); break;
                case "sellfarmi":{
                    calcFarmiCost();
                    calcTotalFarmis();
                    doFarmis();
                    raiseEvent("gameFarmiResponse");
                break;}
                }
            } else {
                switch(mode) {
                    case "dailydonkey":
                        raiseEvent("gameDonkeyResponse");
                        if (unsafeWindow.donkey_isset && r!=0 && r[0]==0) {
                            for(var i=logDonkey.length-1;i>=0;i--){
                                if(logDonkey[i][0]==todayServerStr){
                                    return; // Don't save dummy, if entry for today found
                                }
                            }
                            // Save dummy for today's donkey log
                            var newElem=[todayServerStr,0,[]];
                            logDonkey.push(newElem);
                            GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_logDonkey",implode(logDonkey));
                            hideGoToDonkey();
                        }
                        break;
                }
            }
        }catch(err){GM_logError("farmActionResponse\n"+err);}
    });
    unsafeOverwriteFunction("PflanzResponse",function(request){
        try{
            unsafeWindow._PflanzResponse(request);
        }catch(err){GM_logError("_PflanzResponse\n"+err);}
        try{
            if((request.readyState==4)&&(request.status==200)){
                checkFieldTimes();
                raiseEvent("gameFieldPlanted");
            }
        }catch(err){GM_logError("PflanzResponse\n"+err);}
    });
    unsafeOverwriteFunction("WasserResponse",function(request){
        try{
            unsafeWindow._WasserResponse(request);
        }catch(err){GM_logError("_WasserResponse\n"+err);}
        try{
            if((request.readyState==4)&&(request.status==200)){
                checkFieldTimes();
                raiseEvent("gameFieldWatered");
            }
        }catch(err){GM_logError("WasserResponse\n"+err);}
    });
    unsafeOverwriteFunction("ErnteResponse",function(request){
        try{
            unsafeWindow._ErnteResponse(request);
        }catch(err){GM_logError("_ErnteResponse\n"+err);}
        try{
            if((request.readyState==4)&&(request.status==200)){
                checkFieldTimes();
                raiseEvent("gameFieldCropped");
            }
        }catch(err){GM_logError("ErnteResponse\n"+err);}
    });
    unsafeOverwriteFunction("AbrissResponse",function(request){
        try{
            unsafeWindow._AbrissResponse(request);
        }catch(err){GM_logError("_AbrissResponse\n"+err);}
        try{
            if((request.readyState==4)&&(request.status==200)){
                checkFieldTimes();
                raiseEvent("gameFieldDemolished");
            }
        }catch(err){GM_logError("AbrissResponse\n"+err);}
    });
    unsafeOverwriteFunction("killGardenTimeruns",function(){
        try{
            unsafeWindow._killGardenTimeruns();
        }catch(err){GM_logError("_killGardenTimeruns\n"+err);}
        try{        
            lastGiess=null;
            lastErnte=null;
            if ($("divErnteInfo")){ removeElement($("divErnteInfo")); }
            if ($("zoneNavi")){ removeElement($("zoneNavi")); }
            //if ($("lager_zeit_ziel").parentNode.style.display == "") $("lager_zeit_ziel").parentNode.style.display="none";
        }catch(err){GM_logError("killGardenTimeruns\n"+err);}
    });
    unsafeOverwriteFunction("errorboxgarden",function(text,onclick){
        try{
            unsafeWindow._errorboxgarden(text,onclick);
        }catch(err){GM_logError("_errorboxgarden\n"+err);}
        try{
            // Fix(Seberoth)
            // $("divErnteInfo").innerHTML=$("errorboxcontentgarden").innerHTML;
            $("divErnteInfo").innerHTML=document.getElementsByClassName('cropall_dialog_product')[0].innerHTML;
            $("divErnteInfo").style.display="block";
            if (valErnteMsg){
                // Fix(Seberoth)
                // $("errorboxgarden").style.display="none"; 
                $("globalbox").style.display="none";
                $("globaltransp").style.display="none";
            }
            // Fix(Seberoth)
            // var zoneNr=/refreshGarden\((\d)\)/.exec($("errorboxfootergarden").parentNode.innerHTML);
            var zoneNr=/refreshGarden\((\d)\)/.exec($("globalbox_button1").parentNode.innerHTML);
            if(zoneNr){
                zoneNr=zoneNr[1];
                unsafeWindow.refreshGarden(zoneNr);
            }
        }catch(err){GM_logError("errorboxgarden\n"+err);}
    });

    // Farmhouse
    unsafeOverwriteFunction("initFarmhouseResponse",function(response){
        try{
            unsafeWindow._initFarmhouseResponse(response);
        }catch(err){GM_logError("_initFarmhouseResponse\n"+err);}
        try{
            if(unsafeWindow.reallocatebuildinghead&&!$("reallocatebuildingbutton")){
                var newdiv=createElement("div",{"onclick":"initReallocateBuilding();showDiv('transp');","style":"position:absolute;top:70px;right:20px;","class":"link"},$("farmhousecontainer"));
                createElement("img",{"id":"reallocatebuildingbutton","onmouseout":"this.src=_GFX+'reallocatebuildingbutton_off.png';hideDiv('reallocatebuildinginfo');","onmouseover":"this.src=_GFX+'reallocatebuildingbutton_on.png';showDiv('reallocatebuildinginfo');","src":GFX+"reallocatebuildingbutton_off.png","class":"link","style":"width:25px;height:25px;"},newdiv);
                createElement("div",{"id":"reallocatebuildinginfo","style":"display:none;position:absolute;top:70px;right:50px;","class":"blackbox"},$("farmhousecontainer"),unsafeWindow.reallocatebuildinghead);
                newdiv=null;
            }
        }catch(err){GM_logError("initFarmhouseResponse\n"+err);}
    });
    // Dog Ben
    function doDogBen(){
        try{
            unsafeWindow.farmdog_harvest=1;
            var zoneNrF,zoneNrS,iProd,item,tempZoneProductionData;
            var allZones=[];
            var nowServer=unsafeWindow.Zeit.Server;
            for(var i=ALL_ZONES["farm"].length-1;i>=0;i--){
                zoneNrF=ALL_ZONES["farm"][i];
                if(!zones.getBlock(zoneNrF)){
                    allZones.push(zoneNrF);
                    if(zones.isMultiSlot(zoneNrF)){
                        for(var j=1;j<3;j++){
                            zoneNrS=zoneNrF+"."+j;
                            if(!zones.getBlock(zoneNrS)){
                                allZones.push(zoneNrS);
                            }
                        }
                    }
                }
            }
            for(var j=allZones.length-1;j>=0;j--){
                zoneNrS=allZones[j];
                tempZoneProductionData=zones.getProduction(zoneNrS);
                if(tempZoneProductionData&&tempZoneProductionData[0]){
                    for(var iType=0;iType<tempZoneProductionData[0].length;iType++){
                        for(var iProdStr in tempZoneProductionData[0][iType]){
                            if(!tempZoneProductionData[0][iType].hasOwnProperty(iProdStr)){ continue; }
                            iProd = parseInt(iProdStr,10);
                            if((prodTyp[iType][iProd]!="u")&&(prodTyp[iType][iProd]!="z")){ // only products
                                item=tempZoneProductionData[0][iType][iProdStr];
                                for(var i=0;i<item.length;i++){
                                    item[i][2]=Math.max(item[i][2]-600,nowServer);
                                    if(item[i][2]<item[i][3]){ item[i][3]=NEVER; }
                                }
                            }
                        }
                    }
                }
                zones.setProduction(zoneNrS,tempZoneProductionData.clone());
            }
        }catch(err){GM_logError("doDogBen\n"+err);}
    }

    // Stable
    function doStable(farmNr,zoneNr){
    try{
        var zoneNrF=zoneNr+6*(farmNr-1);
        drawZoneNavi(zoneNrF,$("building_inner"));
        if (valAutoCrop["farm"]&&(div=$("commitboxcrop"))&&(div.style.display=="block")&&(div=$("commitboxfootercrop"))){
            window.setTimeout(function(div){ click(div); },500,div.firstElementChild);
        }
        for(var v=0;v<ANIMAL_MOVE.length;v++){ if((valMoveAnimals[v])&&(!ANIMAL_MOVE[v][0])&&($("animalline"+v))){
            ANIMAL_MOVE[v][0]=true;
            moveAnimals(v);
            break;
        }}
        var data=unsafeWindow.buildingdata[farmNr][zoneNr];
        var tempZoneProductionData=[[{}],0,0,true];
        tempZoneProductionData[2]=1;
        if(data.remain==undefined){ // empty
            tempZoneProductionData[1]=1;
        }else if(data.remain>0){ // running 
                var iPrTyp=0;
                var iProd=data.pid;
                var iTime=data.remain+now-unsafeWindow.Zeit.Verschiebung;
                var iAmount=data.crop;
                var iPoints=data.crop*prodPoints[iPrTyp][iProd];
                if(!tempZoneProductionData[0][iPrTyp][iProd]){ tempZoneProductionData[0][iPrTyp][iProd]=[]; }
                tempZoneProductionData[0][iPrTyp][iProd].push([iAmount,iPoints,iTime,NEVER]);
        }else{ // done
                var iPrTyp=0;
                var iProd=data.pid;
                var iTime=zones.getEndtime(zoneNrF);
                var iAmount=data.crop;
                var iPoints=data.crop*prodPoints[iPrTyp][iProd];
                if(!tempZoneProductionData[0][iPrTyp][iProd]){ tempZoneProductionData[0][iPrTyp][iProd]=[]; }
                tempZoneProductionData[0][iPrTyp][iProd].push([iAmount,iPoints,iTime,NEVER]);               
        }
        zones.setProduction(zoneNrF,tempZoneProductionData.clone());
        tempZoneProductionData=null;
    }catch(err){GM_logError("doStable\n"+err);}
    }
    unsafeOverwriteFunction("rewriteBuildingInnerFeed",function(e,a){
        try{
            unsafeWindow._rewriteBuildingInnerFeed(e,a);
        }catch(err){GM_logError("_rewriteBuildingInnerFeed\n"+err);}
        try{
            var d = unsafeWindow.buildingdata[e][a];
            var div;
            for (var b in d.feed) {
                if(!d.feed.hasOwnProperty(b)){ continue; }
                if(div=$("feed_item"+b)){
                    var currProd=parseInt(b,10);
                    var str="blackbox"+(prodStock[0][currProd]<prodMinRack[0][currProd]?" lowrack":"");
                    createElement("div",{"id":"feed_item"+b+"_rackamount","class":str,"style":"position:absolute;top:-25px;left:-2px;font-weight:bold;"},div,numberFormatPrefixed(prodStock[0][currProd]));
                }
            }       
        }catch(err){GM_logError("rewriteBuildingInnerFeed\n"+err);}
    }); 
    unsafeOverwriteFunction("buildingInnerActionResponse",function(request,action,farm,position){
        try{
            unsafeWindow._buildingInnerActionResponse(request,action,farm,position);
        }catch(err){GM_logError("_buildingInnerActionResponse\n"+err);}
        try{
            if(checkRequest(request)){
                // logBubble.add("buildingInnerActionResponse "+action+":"+farm+":"+position);
                switch(action){
                case "init": raiseEvent("gameOpenStable"); break;
                default:
                }
            }
        }catch(err){GM_logError("buildingInnerActionResponse\n"+err);}
    });
    unsafeOverwriteFunction("newBuildingInner",function(farm,position){
        try{
            unsafeWindow._newBuildingInner(farm,position);
        }catch(err){GM_logError("_newBuildingInner\n"+err);}
        try{
            doStable(farm,position);
        }catch(err){GM_logError("newBuildingInner\n"+err);}
    }); 
    // Factory
    function doFactory(zoneNr){
        try{
        var zoneNrF=zoneNr+6*gameLocation[1];
        showBlase(zoneNrF);
        drawZoneNavi(zoneNrF,$("innermaincontainer"));
        var cand,newdiv;
        var data=unsafeWindow.farms_data.farms[unsafeWindow.farm][zoneNr];
        var tempZoneProductionData=[[{}],0,0,true];
        if (data.production&&data.production["0"]&&data.production["0"].pid){
            var iPrTyp=0;
            var iProd=parseInt(data.production["0"].pid,10);
            var iAmount=prodYield[iPrTyp][iProd];
            var iPoints=iAmount*prodPoints[iPrTyp][iProd];              
            if(data.production["0"].remain>0){ // running
                var iTime=data.production["0"].remain+now-unsafeWindow.Zeit.Verschiebung;
            }else{ // done
                var iTime=zones.getEndtime(zoneNrF);
            }
            if(!tempZoneProductionData[0][iPrTyp][iProd]){ tempZoneProductionData[0][iPrTyp][iProd]=[]; }
            tempZoneProductionData[0][iPrTyp][iProd].push([iAmount,iPoints,iTime,NEVER]);
        }else{ // empty
            tempZoneProductionData[1]=1;
        }
        tempZoneProductionData[2]=1;
        zones.setProduction(zoneNrF,tempZoneProductionData.clone());
        tempZoneProductionData=null;
        
        if(!$("articleline"+unsafeWindow.locationinfo[6])){
            cand=createElement("div",{"id":"articleline"+unsafeWindow.locationinfo[6]},$("innercontent"));
            for(var prodNr=0;prodNr<unsafeWindow.locationinfo["in"].length;prodNr++){
                newdiv=createElement("div",{"id":(gameLocation[1]+1)+"_"+zoneNr+"_article"+unsafeWindow.locationinfo["in"][prodNr],"class":"feedproduct","style":"position:absolute;top:54px;left:"+(55+60*prodNr)+"px;border:2px solid black;z-index:11;","prodNr":prodNr},cand);
                createElement("div",{"id":"articleimg"+unsafeWindow.locationinfo["in"][prodNr],"style":"position:absolute;","class":"l"+unsafeWindow.locationinfo["in"][prodNr]},createElement("div",{"style":"position:absolute;top:5px;left:5px;width:40px;height:40px;overflow:hidden;"},newdiv));
                newdiv.addEventListener("mouseover",function(event){ 
                    var prodNr = parseInt(this.getAttribute("prodNr"),10);
                    toolTip.show(event,unsafeWindow.locationinfo["need"][prodNr]+"x "+prodName[0][unsafeWindow.locationinfo["in"][prodNr]]);
                },false);
            }
        }

        var cand=$("innercontent").getElementsByClassName("feedproduct");
        for(var v=0;v<cand.length;v++){
            var currProd=parseInt(cand[v].getElementsByTagName("div")[1].getAttribute("class").replace("l",""),10);
            var str="blackbox"+(prodStock[0][currProd]<prodMinRack[0][currProd]?" lowrack":"");
            if(!$(cand[v].id+"_rackamount")){ createElement("div",{"id":cand[v].id+"_rackamount","style":"position:absolute;top:-25px;left:-2px;font-weight:bold;"},cand[v]); }
            newdiv=$(cand[v].id+"_rackamount");
            if(newdiv.getAttribute("class")!=str){ newdiv.setAttribute("class",str); }
            newdiv.innerHTML=numberFormatPrefixed(prodStock[0][currProd]);
        }
        if (valAutoCrop["farm"]&&(div=$("commitboxcrop"))&&(div.style.display=="block")&&(div=$("commitboxfootercrop"))){
            window.setTimeout(function(div){ click(div); },500,div.firstElementChild);
        }
        cand=null;newdiv=null;
        raiseEvent("gameOpenFactory");
        }catch(err){GM_logError("doFactory\n"+err);}    
    }
    // Oil factory, special oil factory
    function doFactoryOil(zoneNr){
        //GM_log("doFactoryOil "+unsafeWindow.currentposition);
        var zoneNrF=zoneNr+6*gameLocation[1];
        showBlase(zoneNrF);
        drawZoneNavi(zoneNrF,$("innermaincontainer"));
        raiseEvent("gameOpenFactoryOil");
    }
    unsafeOverwriteFunction("buildOilpressInner",function(position,buildingid,info){
        try{
            unsafeWindow._buildOilpressInner(position,buildingid,info);
        }catch(err){GM_logError("_buildOilpressInner\n"+err);}
        try{
            var zoneNr=position;
            var zoneNrF=zoneNr+6*gameLocation[1];
            var zoneNrS;
            var data=unsafeWindow.oilproduction;
            var newDiv,newDiv1;
            var tempZoneProductionData=[[{}],0,0,true];
            var tempZoneProductionDataSlot;
            for(var slot=1;slot<=3;slot++){
                zoneNrS=zoneNrF+"."+slot;
                if((slot==1)||(!unsafeWindow.oilslots[slot]["block"])){
                    zones.setBlock(zoneNrS,"");
                    tempZoneProductionDataSlot=[[{}],0,0,true];
                    tempZoneProductionData[1]++;
                    tempZoneProductionData[2]++;
                    tempZoneProductionDataSlot[1]++;
                    tempZoneProductionDataSlot[2]++;
                    if(data[slot]){
                        var iPrTyp=0;
                        var iProd=parseInt(data[slot].pid,10);
                        var iAmount=data[slot].amount;
                        var iPoints=data[slot].amount*prodPoints[iPrTyp][iProd];
                        var iTime=now+data[slot].remain;
                        var endDay=countDays(now,iTime);
                        newDiv=createElement("div",{"class":"blackbox","id":"oil_slot"+slot+"_prodinfo","style":"position:absolute;left:225px;top:25px;white-space:nowrap;"},$("oil_slot"+slot));
                        if(iTime<now){
                            if(iTime+20*60*60<now){
                                createElement("div",{},newDiv,getText("readySinceX").replace(/%1%/,getFormattedDateStr(iTime)));
                            }else{
                                createElement("div",{},newDiv,getText("readySinceX").replace(/%1%/,getDaytimeStr(iTime)+"&nbsp;"+getText("shortOClock")));
                            }               
                        } else if (endDay==0){
                            createElement("div",{},newDiv,getText("readyAtX").replace(/%1%/,getDaytimeStr(iTime)+"&nbsp;"+getText("shortOClock")));
                        } else if ((endDay==1)&&(getText("readyAtX_day1"))){
                            createElement("div",{},newDiv,getText("readyAtX_day1").replace(/%1%/,getDaytimeStr(iTime)+"&nbsp;"+getText("shortOClock")));
                        } else if ((endDay==2)&&(getText("readyAtX_day2"))){
                            createElement("div",{},newDiv,getText("readyAtX_day2").replace(/%1%/,getDaytimeStr(iTime)+"&nbsp;"+getText("shortOClock")));
                        } else{ 
                            createElement("div",{},newDiv,getText("readyAtX").replace(/%1%/,new Date(1000*iTime).toLocaleString())); 
                        }
                        newDiv1=$("oil_slot"+slot+"_img_tt_time");
                        if(newDiv1){ newDiv.appendChild(newDiv1); }
                        newDiv1=createElement("div",{},newDiv); 
                        produktPic(iPrTyp,iProd,newDiv1);
                        createElement("span",{},newDiv1,numberFormat(iAmount)+" "+prodName[iPrTyp][iProd]); 
                        pointsFormat(iPoints,"div",newDiv1);
            
                        iTime-=unsafeWindow.Zeit.Verschiebung;
                        tempZoneProductionData[1]--;
                        if(!tempZoneProductionData[0][iPrTyp][iProd]){ tempZoneProductionData[0][iPrTyp][iProd]=[]; }
                        tempZoneProductionData[0][iPrTyp][iProd].push([iAmount,iPoints,iTime,NEVER]);
                        tempZoneProductionDataSlot[1]--;
                        if(!tempZoneProductionDataSlot[0][iPrTyp][iProd]){ tempZoneProductionDataSlot[0][iPrTyp][iProd]=[]; }
                        tempZoneProductionDataSlot[0][iPrTyp][iProd].push([iAmount,iPoints,iTime,NEVER]);
                        //auto-cropping
                        if((top.unsafeData.autoAction==null)&&valAutoCrop["farm"] && (newDiv=$("oil_slot"+slot+"_cropbutton")) && (newDiv.style.display=="block")){
                            top.unsafeData.autoAction="berater: oil crop";
                            window.setTimeout(function(div){
                                click(div);
                                top.unsafeData.autoAction=null;
                            },500,newDiv);
                        }
                    }
                    zones.setProduction(zoneNrF+"."+slot,tempZoneProductionDataSlot.clone());
                } else {
                    zones.setBlock(zoneNrS,"b");
                }
            }
            zones.setProduction(zoneNrF,tempZoneProductionData.clone());
            var tempZoneProductionData=null;newDiv=null;newDiv1=null;
        }catch(err){GM_logError("buildOilpressInner\n"+err);}
    });
    // Knitting
    unsafeOverwriteFunction("strickereiAjaxActionResponse",function(request,pos,mode){
        try{
            unsafeWindow._strickereiAjaxActionResponse(request,pos,mode);
        }catch(err){GM_logError("_strickereiAjaxActionResponse\n"+err);}
        try{
            var result = checkRequest(request);
            if((result!=0)&&(result[0]!=0)){
                switch(mode){
                case "buy": break;
                case "cancel": break;
                case "crop": raiseEvent("gameFactoryKnittingCropped"); break;
                case "speedup": break;
                case "start": raiseEvent("gameFactoryKnittingStarted"); break;
                default:
                }
            }
        }catch(err){GM_logError("strickereiAjaxActionResponse\n"+err);}
    });
    unsafeOverwriteFunction("strickereiSelection",function(a,c,slot){
        try{
            unsafeWindow._strickereiSelection(a,c,slot);
        }catch(err){GM_logError("_strickereiSelection\n"+err);}
        try{
            raiseEvent("gameFactoryKnittingDialogStart");
        }catch(err){GM_logError("strickereiSelection\n"+err);}
    });
    unsafeOverwriteFunction("buildStrickereiInner",function(position,buildingid){
        try{
            unsafeWindow._buildStrickereiInner(position,buildingid);
        }catch(err){GM_logError("_buildStrickereiInner\n"+err);}        
        try{
            var zoneNr=position;
            var zoneNrF=zoneNr+6*gameLocation[1];
            var zoneNrS;
            showBlase(zoneNrF);
            drawZoneNavi(zoneNrF,$("innermaincontainer"));
            var newDiv,newDiv1;
            var tempZoneProductionData=[[{}],0,0,true];
            var tempZoneProductionDataSlot;
            var data=unsafeWindow.strickerei_data;
            for(var slot=1;slot<=3;slot++){
                zoneNrS=zoneNrF+"."+slot;
                if((slot==1)||(!data.slots[slot]["block"])){
                    zones.setBlock(zoneNrS,"");
                    tempZoneProductionDataSlot=[[{}],0,0,true];
                    tempZoneProductionData[1]++;
                    tempZoneProductionData[2]++;
                    tempZoneProductionDataSlot[1]++;
                    tempZoneProductionDataSlot[2]++;
                    if(data.slots[slot]){
                        var iPrTyp=0;
                        var iProd=data.slots[slot].pid;
                        if(iProd){
                            var iAmount=data.slots[slot].amount;
                            var iPoints=iAmount*prodPoints[iPrTyp][iProd];
                            if(data.slots[slot].ready){
                                var iTime=zones.getEndtime(zoneNrF);
                            } else{
                                var iTime=now+data.slots[slot].remain-unsafeWindow.Zeit.Verschiebung;
                            }
                            newDiv=$("strickerei_slot"+slot).children[1];
                            newDiv1=createElement("div",{},newDiv);
                            pointsFormat(iPoints,"div",newDiv1);
                            tempZoneProductionData[1]--;
                            if(!tempZoneProductionData[0][iPrTyp][iProd]){ tempZoneProductionData[0][iPrTyp][iProd]=[]; }
                            tempZoneProductionData[0][iPrTyp][iProd].push([iAmount,iPoints,iTime,NEVER]);
                            tempZoneProductionDataSlot[1]--;
                            if(!tempZoneProductionDataSlot[0][iPrTyp][iProd]){ tempZoneProductionDataSlot[0][iPrTyp][iProd]=[]; }
                            tempZoneProductionDataSlot[0][iPrTyp][iProd].push([iAmount,iPoints,iTime,NEVER]);
                            //auto-cropping
                            if(data.slots[slot].ready&&(top.unsafeData.autoAction==null)&&valAutoCrop["farm"]&&(newDiv=$("strickerei_slot"+slot))){
                                top.unsafeData.autoAction="berater: knitting crop";
                                window.setTimeout(function(div){
                                    click(div);
                                    top.unsafeData.autoAction=null;
                                },500,newDiv);
                            }
                        }
                    }
                    zones.setProduction(zoneNrF+"."+slot,tempZoneProductionDataSlot.clone());
                } else {
                    zones.setBlock(zoneNrS,"b");
                }
            }
            zones.setProduction(zoneNrF,tempZoneProductionData.clone());
            var tempZoneProductionData=null;newDiv=null;newDiv1=null;
            raiseEvent("gameOpenFactoryKnitting");
        }catch(err){GM_logError("buildStrickereiInner\n"+err);}
    });
    unsafeOverwriteFunction("innerInfosResponse",function(zoneNr){
    // oil, knitting, factory, pony
        try{
            unsafeWindow._innerInfosResponse(zoneNr);
        }catch(err){GM_logError("_innerInfosResponse\n"+err);}
        try{
            $("innermaincontainer").setAttribute("zoneNr",zoneNr);
            if(unsafeWindow.locationinfo["buildingid"]){ 
                switch(unsafeWindow.locationinfo["buildingid"]){
                case "13": doFactoryOil(zoneNr); break; // Oil
                case "14": doFactoryOil(zoneNr); break; // Special Oil
                case "16":  // Knitting
                case "17":  // Carpentry
                case "18":  // Pony
                case "19":  // Megafield
                default: 
                }
            }else{ 
            // }else if(unsafeWindow.locationinfo["in"]){ 
                doFactory(zoneNr); 
            }
        }catch(err){GM_logError("innerInfosResponse\n"+err);}
    });
    // Megafield
    err_trace="Megafield";
    // Remembering of latest vehicle. ["harvest", "fertilize"]
    megafieldVehicle = explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_megafieldVehicle"),"do_main/megafieldVehicle",[]);
    unsafeData.megafieldVehicle=megafieldVehicle.clone();
    function doMegafieldData(){
/*  megafield:
    "points": STRING(INTEGER), 
    "count": STRING(INTEGER),
    "count_buy": null,
    "area": {   "1": {  "pid": INTEGER,
                        "time": DATETIME of planting,
                        "duration": INTEGER,
                        "remain": INTEGER
                }, ...
    },
    "area_free": {  "1": DATETIME of unlocking
                    , ...
    },
    "job": {    "products": [   {   "pid": INTEGER,
                                    "quality": INTEGER,
                                    "need": INTEGER,
                                    "have": INTEGER,
                                    "amount": INTEGER,
                                    "harvest": INTEGER,
                                    "duration": INTEGER
                                }, ...
                ],
                "remain": INTEGER
    },
    "job_start": STRING(DATETIME),
    "job_endtime": "0",
    "vehicles": {   "1": {  "time": DATETIME of purchase,
                            "durability": INTEGER,
                            "range": INTEGER
                    }, ...
    },
    "vehicles_unlock": {    "1": {  "time": DATETIME of unlocking  }
                            , ...
    },
    "tour": [],
    "tutorial_step": STRING(INTEGER),
    "level": INTEGER,
    "level_rest": INTEGER,
    "level_percent": INTEGER,
    "exchangecoins": INTEGER,
    "next_tiles": { "cost": INTEGER,
                    "tiles": [INTEGER, INTEGER, ...]
    },
    "vehicle_slots": {  "1": {  "type": "harvest"|"fertilize",
                                "name": STRING,
                                "size": INTEGER,
                                "level": INTEGER,
                                "unlock": INTEGER,
                                "durability": INTEGER,
                                "range": INTEGER,
                                "duration": INTEGER,
                                "money": INTEGER
                        }, ...
    },
    "reward_info": {    "quality": INTEGER,
                        "points": INTEGER,
                        "money": INTEGER,
                        "license": INTEGER,
                        "difficultybonus_points": INTEGER,
                        "difficultybonus_money": INTEGER,
                        "difficultybonus_license": INTEGER,
                        "timebonus_points": INTEGER,
                        "timebonus_money": INTEGER,
                        "timebonus_license": INTEGER
    }
}*/        
        try{
            if(unsafeWindow.megafield_data&&unsafeWindow.megafield_data.area_free){
/*                 var str="";
                for(var i in unsafeWindow.megafield_data.vehicles){
                    str+=i+":"+getDateStr(unsafeWindow.megafield_data.vehicles[i].time)+" "+getDaytimeStr(unsafeWindow.megafield_data.vehicles[i].time)+"\n";
                }
                GM_log(str); */
                
                var zoneNrF=null;
                for(var i=0;i<ALL_ZONES["farm"].length;i++){
                    if(zones.getBuilding(ALL_ZONES["farm"][i])==19){
                        zoneNrF=ALL_ZONES["farm"][i];
                        break;
                    }
                }
                if(zoneNrF==null){
                    throw("Location of Megafield not found.");
                }
                var tempZoneProductionData=[[{}],0,0,true];
                var iPrTyp=0,iProd,iTime;
                for(var i=BUILDING_SIZE["19"][0]*BUILDING_SIZE["19"][1];i>=1;i--){
                    if(unsafeWindow.megafield_data.area_free[i]){
                        tempZoneProductionData[1]++;
                        tempZoneProductionData[2]++;
                        if(unsafeWindow.megafield_data.area[i]){
                            iProd=unsafeWindow.megafield_data.area[i].pid;
                            iTime=unsafeWindow.megafield_data.area[i].time+unsafeWindow.megafield_data.area[i].duration;
                            iTime-=unsafeWindow.Zeit.Verschiebung;
                            tempZoneProductionData[1]--;
                            if(!tempZoneProductionData[0][iPrTyp][iProd]){ tempZoneProductionData[0][iPrTyp][iProd]=[]; }
                            tempZoneProductionData[0][iPrTyp][iProd].push([1,0,iTime,NEVER]);
                        }
                    }
                }
                zones.setProduction(zoneNrF,tempZoneProductionData.clone());
            }
        }catch(err){GM_logError("_megafieldHandler\n"+err);}
    }
    doMegafieldData();
    unsafeOverwriteFunction("megafieldHandler",function(a){
        try{
            unsafeWindow._megafieldHandler(a);
        }catch(err){GM_logError("_megafieldHandler\n"+err);}
        try{
            doMegafieldData();
        }catch(err){GM_logError("megafieldHandler\n"+err);}
    });
    unsafeOverwriteFunction("buildMegafield",function(){
        try{
            unsafeWindow._buildMegafield();
        }catch(err){GM_logError("_buildMegafield\n"+err);}
        try{
            if(megafieldVehicle[0]&&(!unsafeWindow.megafield_vehicle_id)){
                unsafeWindow.megafield_move_position=2;
                unsafeWindow._setTourVehicleMegafield(megafieldVehicle[0]);
            }
            raiseEvent("gameOpenMegafield");
        }catch(err){GM_logError("buildMegafield\n"+err);}
    });
    unsafeOverwriteFunction("setTourVehicleMegafield",function(b){
        try{
            unsafeWindow._setTourVehicleMegafield(b);
        }catch(err){GM_logError("_setTourVehicleMegafield\n"+err);}
        try{
            var a;
            if(b&&(a=unsafeWindow.megafield_data.vehicle_slots[b])&&(!a.block)&&(!a.unlockable)){
                megafieldVehicle[{"harvest":0,"fertilize":1}[a.type]]=b;
                unsafeData.megafieldVehicle=megafieldVehicle.clone();                
                GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_megafieldVehicle",implode(megafieldVehicle,"setTourVehicleMegafield\megafieldVehicle"));
            }
        }catch(err){GM_logError("setTourVehicleMegafield\n"+err);}
    });
    
    // Club
    err_trace="Club";
    // Clubquest direct show
    var lastGuildQuestRequest=0;
    function clubQuestToolTip(data){
    try{
        var container=$("guildlink_tt_quest");
        container.innerHTML="";
        var newdiv=createElement("div",{"style":"position:absolute;top:5px;left:5px;"},container);
        var newspan=createElement("span",{"style":"margin-right:2px;"},newdiv);
        if(data!=0){
            createElement("img",{"src":GFX+'adtime.gif'},newspan);
            createElement("span",{"style":"font-weight:bold;"},newdiv,getTimeStr(data['remain']));
            if(data['questtype'] == 1 || data['questtype'] == 2){  // produkte oder geld in vorgegebener zeit
                var top=25;
                var left=0;
                var newdiv1;
                for(var i=1 ; i <= 2 ; i++){
                    if(data['product' + i] > 0){
                        data['sum' + i]=parseInt(data['sum' + i],10);
                        data['amount' + i]=parseInt(data['amount' + i],10);
                        var barleft=parseInt(Math.round((data['sum' + i] * 100) / data['amount' + i])-100,10);

                        if(data['questtype'] == 2){
                            data['sum' + i]=moneyFormat(data['sum' + i]);
                            data['amount' + i]=moneyFormat(data['amount' + i]);
                        }

                        newdiv=createElement("div",{"style":'position:absolute; top:' + top + 'px; left:' + left + 'px;width:40px;height:15px;'},container);
                        if(data['questtype'] == 1){
                            newdiv1=createElement("div",{"style":"position:absolute; top:0; left:5px;height:15px;width:15px; overflow:hidden;"},newdiv);
                            createElement("img",{"class":"kp" + data['product' + i], "style":"position:absolute;"},newdiv1);
                        }
                        else if(data['questtype'] == 2){
                            newdiv1=createElement("div",{"style":"position:absolute; top:0; left:5px;height:15px;width:15px;"},newdiv);
                            createElement("img",{"src":GFX+"money.gif","height":"15","width":"15"},newdiv1);
                        }
                        newdiv1=createElement("div",{"style":"position:absolute;top:0;left:23px;border:1px solid #000;background-color:#fff;width:100px;height:15px;overflow:hidden;"},newdiv);
                        createElement("div",{"style":"position:absolute;top:0;left:"+barleft+"px;background-color:#f00;width:100px;height:25px;"},newdiv1);
                        createElement("div",{"style":"position:absolute;top:0;left:0;width:100px;height:15px;color:black;font-weight:bold;text-align:center;"},newdiv1,numberFormat(data['sum' + i]));
                        createElement("div",{"style":"position:absolute;top:20px;white-space:nowrap;left:5px;"},newdiv,(data['amount' + i]==data['sum' + i])?"":('<b>' + numberFormat(data['amount' + i]-data['sum' + i]) + '/' + numberFormat(data['amount' + i]) + '</b>'));
                top += 40;
                }   }
                newdiv1=null;
            }
        }else{
            newspan.innerHTML="---";
        }
        container=null;newdiv=null;newspan=null;
    }catch(err){GM_logError("clubQuestToolTip\ndata="+implode(data)+"\n"+err);}
    }
    if((newdiv=$("speedlink_guild"))&&(newdiv1=$("speedlink_guild_tt"))){
        var str=newdiv1.innerHTML;
        newdiv1.innerHTML="";
        createElement("div",{"style":"border-bottom:1px solid black;"},newdiv1,str);
        createElement("div",{"id":"guildlink_tt_quest","style":"position:relative;width:130px;height:100px;"},newdiv1,"---");
        /* TODO: review needed. request has changed.
        newdiv.addEventListener("mouseover",function(){
            if (now-lastGuildQuestRequest>30){ // 30 seconds delay to next request
                lastGuildQuestRequest=now;
                GM_xmlhttpRequest({
                    method: "GET",
                    url: "http://s"+SERVER+"."+GAMEPAGES[COUNTRY]+"/guild/ajax/initguild.php?rid="+unsafeWindow.rid,
                    headers: {"Content-type": "application/x-www-form-urlencoded"},
                    onload: function(response){
                        if(response.responseText!=0){
                            var result=eval('(' + response.responseText + ')');
                            if(result[0]!=0){
                                clubQuestToolTip(result[0][2]);
                            }
                        }
                    }
                });
            }
        },false);
        */
    }

    // Clubquest updated
    /* TODO: function is not existing anymore
    unsafeOverwriteFunction("setGuildQuestResponse",function(request){
        unsafeWindow._setGuildQuestResponse(request);
        var result=checkRequest(request);
        if(result){
            lastGuildQuestRequest=now;
            clubQuestToolTip(result[1]);
        }
    });
    */
    
    // Clubdata loaded
    unsafeOverwriteFunction("initGuildResponse",function(response){
        try{
            unsafeWindow._initGuildResponse(response);
        }catch(err){GM_logError("_initGuildResponse\n"+err);}
        try{
            lastGuildQuestRequest=now;
            clubQuestToolTip(response[0][2]);
        }catch(err){GM_logError("initGuildResponse\n"+err);}
    });

    // Memberlist
    unsafeOverwriteFunction("openMultiBox",function(id){
        try{
            if(id==5){
                $('guildmultiboxheader').innerHTML='<img class="link" src="' + unsafeWindow.imgpath + 'button_cancel_off.png" onclick="hideDiv(\'transp9\'); hideDiv(\'guildmultibox\');" onmouseover="this.src=\'' + unsafeWindow.imgpath + 'button_cancel_on.png\';" onmouseout="this.src=\'' + unsafeWindow.imgpath + 'button_cancel_off.png\';"></div>';
                $('guildmultiboxcontent').innerHTML='';
                unsafeWindow.showGuildQuestStats(2,1,0);
                for(var i=1;i<=3;i++){
                    $('guildmultiboxmenue'+i).style.backgroundImage="url(" + unsafeWindow.imgpath + "leer.gif)";
                }
                $('guildmultiboxmenue4').style.backgroundImage="url(" + unsafeWindow.imgpath + "multiscreen_reiter4.jpg)";
                $('guildmultiboxheadline').innerHTML=unsafeWindow.guildmultibox_headline4;
                unsafeWindow.hideDiv('guildnewsticker');
                unsafeWindow.showDiv('transp9');
                unsafeWindow.showDiv('guildmultibox');
            }else{
                try{
                    unsafeWindow._openMultiBox(id);
                }catch(err){GM_logError("_openMultiBox\n"+err);}
            }
        }catch(err){GM_logError("openMultiBox\n"+err);}
    });
    $("guildmultiboxmenue4").setAttribute("onclick","openMultiBox(5)");

    unsafeOverwriteFunction("getGuildMembersResponse",function(request){
        try{
            unsafeWindow._getGuildMembersResponse(request);
        }catch(err){GM_logError("_getGuildMembersResponse\n"+err);}
        try{
            if(request.readyState == 4 && request.status == 200){
                var canddiv=Array.prototype.slice.call($("guildmultiboxcontent").getElementsByClassName("guildmemberlist_even")).concat(Array.prototype.slice.call($("guildmultiboxcontent").getElementsByClassName("guildmemberlist_uneven")));
                var newdiv,newspan,newa;
                for(var v=0;v<canddiv.length;v++){
                    newdiv=canddiv[v].children[1].firstElementChild;
                    var thisUser=/(.*?)&nbsp;/.exec(newdiv.innerHTML);
                    newdiv.innerHTML=newdiv.innerHTML.replace(thisUser[0],"");
                    newspan=createElement("span");
                    newspan.innerHTML="&nbsp;";
                    newdiv.insertBefore(newspan,newdiv.firstElementChild);
                    newa=createElement("a",{"class":"link2"});
                    newa.innerHTML=thisUser[1];
                    newdiv.insertBefore(newa,newdiv.firstElementChild);
                    newa.addEventListener("click",function(){
                        showShopframePage("http://s"+SERVER+"."+GAMEPAGES[COUNTRY]+"/stadt/stats.php?search=1&searchterm="+this.innerHTML);
                    },false);
                    //newdiv.insertBefore(igm(thisUser[1]),newdiv.firstElementChild);
                }
                newdiv=null;newspan=null;newa=null;canddiv=null;
            }
        }catch(err){GM_logError("getGuildMembersResponse\n"+err);}
    });
    // Questhistory
    unsafeOverwriteFunction("showGuildQuestStatsResponse",function(request,type,page,self){
        try{
            unsafeWindow._showGuildQuestStatsResponse(request,type,page,self);
        }catch(err){GM_logError("_showGuildQuestStatsResponse\n"+err);}
        try{
            var result=checkRequest(request);
            if(result&&result[0]!=0){
                window.setTimeout(function(){
                    if(DEVMODE){ GM_log("showGuildQuestStatsResponse "+request+":"+type+"("+typeof type+"):"+page+"("+typeof page+"):"+self+"("+typeof self+")"); };
    
                    var newdiv=$("chg_guildqueststats");
                    newdiv.setAttribute("onchange","");
                    newdiv.addEventListener("change",function(){
                        var type=parseInt($("chg_guildqueststats").value,10);
                        if(type<4){
                            unsafeWindow.showGuildQuestStats(type,1,0);
                        }else{
                            showGuildQuestStatsLastDays(7);
                        }
                    },false);
                    createElement("option",{"value":"4"},newdiv,getText("stat_days7"));
                    if(type>3){
                        newdiv.value=type;
                        newdiv.nextElementSibling.style.display="none";
                    }
    
                    //todayStr=getDateStr(now,2,false);
                    var clubmemberLog=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_clubmemberLog","[]"),"showGuildQuestStatsResponse/clubmemberLog",[]);
                    for(var u=0;u<clubmemberLog.length;u++){
                        if(typeof clubmemberLog[u][0]!="string"){
                            clubmemberLog.splice(u,1);
                            u--;continue;
                        }
                        if(!clubmemberLog[u][1] instanceof Array){
                            clubmemberLog[u][1]=[];
                        }
                        for(var v=0;v<clubmemberLog[u][1].length;v++){
                            if((typeof clubmemberLog[u][0][v][0]!="string")||(typeof clubmemberLog[u][0][v][1]!="number")){
                                clubmemberLog[u][1].splice(v,1);
                                v--;continue;
                            }
                            if(!clubmemberLog[u][1][v][2] instanceof Array){
                                clubmemberLog[u][1][v][2]=[];
                            }
                            if(clubmemberLog[u][1][v][0]=="0"){ continue; }
                            // join old data
                            var w=null;
                            if(clubmemberLog[u][1][v][0].match(/^\d+\.\d+\.\d+$/)){
                                if(now-getTime(clubmemberLog[u][1][v][0])>604800){ // 1 week (7*86400)
                                    for(var x=0;x<clubmemberLog[u][1].length;x++){
                                        if(clubmemberLog[u][1][x][0]==clubmemberLog[u][1][v][0].replace(/^(\d+\.)/,"")){
                                            w=x; break;
                                        }
                                    }
                                    if(w==null){
                                        w=clubmemberLog[u].length;
                                        clubmemberLog[u].push([0,[]]);
                                    }                           }
                            }else if(clubmemberLog[u][1][v][0].match(/^\d+\.\d+$/)){
                                if(now-getTime(clubmemberLog[u][1][v][0])>16070400){ // 6 months (6*31*86400)
                                    for(var x=0;x<clubmemberLog[u].length;x++){
                                        if(clubmemberLog[u][1][x][0]==clubmemberLog[u][1][v][0].replace(/^(\d+\.)/,"")){
                                            w=x; break;
                                        }
                                    }
                                    if(w==null){
                                        w=clubmemberLog[u].length;
                                        clubmemberLog[u].push([0,[]]);
                                    }
                                }
                            }
                            if(w!=null){
                                clubmemberLog[u][1][w][1] += clubmemberLog[u][1][v][1];
                                for(var x=0;x<clubmemberLog[u][1][v][2].length;x++){
                                    for(var y=0;y<clubmemberLog[u][1][w][2].length;y++){
                                        if(clubmemberLog[u][1][v][2][x]==clubmemberLog[u][1][w][2][y]){
                                            break;
                                        }
                                    }
                                    if(clubmemberLog[u][1][w][2][y]){
                                        clubmemberLog[u][1][w][2][y][1] += clubmemberLog[u][1][v][2][x][1];
                                    } else {
                                        clubmemberLog[u][1][w][2].push(clubmemberLog[u][1][v][2][x]);
                                    }
                                }
                                clubmemberLog[u][1].splice(v,1);
                                clubmemberLog[u][1].sort(sortObjFunctions["date"]);
                            }
                        }
                    }
    
                    var clubmembers=new Object();
                    var clubmemberLogSum=new Object();
                    for(var i=0;i<clubmemberLog.length;i++){
                        var u=clubmemberLog[i][0];
                        clubmemberLogSum[u]=[0,{}];
                        for(var j=0;j<clubmemberLog[i][1].length;j++){
                            var v=clubmemberLog[i][1][j][0];
                            if(v==todayStr){ continue; }
                            clubmemberLogSum[u][0] += clubmemberLog[i][1][j][1];
                            for(var k=0;k<clubmemberLog[i][1][j][2].length;k++){
                                var w=clubmemberLog[i][1][j][2][k][0];
                                if(clubmemberLogSum[u][1][w]==undefined){
                                    clubmemberLogSum[u][1][w]=0;
                                    clubmemberLogSum[u][1].sortObj(sortObjFunctions["productId"]);
                                }
                                clubmemberLogSum[u][1][w] += clubmemberLog[i][1][j][2][k][1];
                            }
                        }
                    }
                    var container=$("guildmultiboxcontent");
                    var newtable,newtable1,newtr,newtr1,newtd,newdiv1,cell;
                    for(var v=0;v<container.childElementCount;v++){
                        if(container.children[v].id.match(/^line\d+$/)){
                            var lineNr=parseInt(/^line(\d+)$/.exec(container.children[v].id)[1],10);
    
                            var thisUser=container.children[v].children[1].innerHTML;
                            var thisPoints=parseInt(container.children[v].children[3].innerHTML,10);
                            container.children[v].children[3].innerHTML=numberFormat(thisPoints);
    
                            clubmembers[thisUser]=[thisPoints,{}];
    
                            // reformat of info bubble
                            cell=$("bartt"+lineNr);
                            cell.style.whiteSpace="nowrap";
                            cell.style.left="";
                            cell.style.right="30px";
                            for(var w=0;w+1<cell.childElementCount;w++){
                                if(cell.children[w].style.clear == "both"){ continue; }
                                var help=parseInt(cell.children[w].getAttribute("class").replace(/kp/,""),10);
                                var help1=parseInt(cell.children[++w].innerHTML.replace(/&nbsp;/g,""),10);
                                clubmembers[thisUser][1][help]=help1;
                            }
                            cell.innerHTML="";
    
                            clubmembers[thisUser][1].sortObj(sortObjFunctions["productId"]);
    
                            newtable=createElement("table",{"cellspacing":"0","style":"display:inline-block;vertical-align:top;"},cell);
                            var c=2;
                            for(var w in clubmembers[thisUser][1]){
                                if(!clubmembers[thisUser][1].hasOwnProperty(w)){ continue; }
                                if(c==2){
                                    c=0;
                                    newtr=createElement("tr",{},newtable);
                                }
                                c++;
                                newtd=createElement("td",{"class":"link hoverBgDarkgreen","style":"text-align:right;padding-right:5px;","prod":w},newtr);
                                newtd.addEventListener("mouseover",function(event){
                                    showGoToMarketToolTip(event,this.getAttribute("prod"));
                                },false);
                                newtd.addEventListener("click",function(){
                                    showMarket(this.getAttribute("prod"));
                                },false);
                                produktPic(0,w,newtd).style.cssFloat="left";
                                createElement("span",{},newtd,numberFormat(clubmembers[thisUser][1][w]));
                            }
    
                            var clubmemberLogId = null;
                            for(var x=0;x<clubmemberLog.length;x++){
                                if(clubmemberLog[x][0]==thisUser){
                                    clubmemberLogId=x; break;
                                }
                            }
                            if(!clubmemberLog[clubmemberLogId]){
                                clubmemberLogId=clubmemberLog.length;
                                clubmemberLog.push([thisUser,["0",0,[]]]);
                                clubmemberLogSum[thisUser]=clubmembers[thisUser];
                            }
                            if(type==2){ // all quests
                                var clubmemberLogDateId = null;
                                for(var x=0;x<clubmemberLog[clubmemberLogId][1].length;x++){
                                    if(clubmemberLog[clubmemberLogId][1][x][0]==todayStr){
                                        clubmemberLogDateId=x; break;
                                    }
                                }
                                if(!clubmemberLog[clubmemberLogId][1][clubmemberLogDateId]){
                                    clubmemberLogDateId=clubmemberLog[clubmemberLogId][1].length;
                                    clubmemberLog[clubmemberLogId][1].push([todayStr,0,[]]);
                                }
                                clubmemberLog[clubmemberLogId][1][clubmemberLogDateId][0]=thisPoints-clubmemberLogSum[thisUser][0];
                                for(var w in clubmembers[thisUser][1]){
                                    if(!clubmembers[thisUser][1].hasOwnProperty(w)){ continue; }
                                    var help=clubmembers[thisUser][1][w]-(clubmemberLogSum[thisUser][1][w]==undefined?0:clubmemberLogSum[thisUser][1][w]);
                                    for(var x=0;x<clubmemberLog[clubmemberLogId][1][clubmemberLogDateId][1].length;x++){
                                        if(clubmemberLog[clubmemberLogId][1][clubmemberLogDateId][1][x][0]==w){
                                            break;
                                        }
                                    }                               
                                    if(help>0){
                                        if(!clubmemberLog[clubmemberLogId][1][clubmemberLogDateId][1][x]){
                                            clubmemberLog[clubmemberLogId][1][clubmemberLogDateId][1][x].push([w,help]);
                                            clubmemberLog[clubmemberLogId][1][clubmemberLogDateId][1].sort(sortObjFunctions["productId"]);
                                        }else{
                                            clubmemberLog[clubmemberLogId][1][clubmemberLogDateId][1][x][1]=help;
                                        }
                                    }
                                }
                                clubmemberLog[clubmemberLogId][1].sort(sortObjFunctions["date"]);
                            }
                            newtable=createElement("table",{"cellspacing":"0","style":"display:inline-block;margin-left:5px;vertical-align:top;"},cell);
                            var sum=0;
                            for(var i=0;i<clubmemberLog[clubmemberLogId][1].length;i++){
                                sum += clubmemberLog[clubmemberLogId][1][i][1];
                                if(clubmemberLog[clubmemberLogId][1][0]=="0"){ continue; }
                                newtr=createElement("tr",{"class":"hoverBgDarkgreen"});
                                newtable.insertBefore(newtr,newtable.firstElementChild);
                                newdiv=createElement("div");
                                newtable1=createElement("table",{"cellspacing":"0","style":"display:inline-block;vertical-align:top;"},newdiv);
                                var c=2;
                                //var pkte=0;
                                    for(var j=0;j<clubmemberLog[clubmemberLogId][1][i][2].length;j++){
                                        var prod=clubmemberLog[clubmemberLogId][1][i][2][j][0];
                                        var amount=clubmemberLog[clubmemberLogId][1][i][2][j][1];
                                        if(c==2){
                                            c=0;
                                            newtr1=createElement("tr",{},newtable1);
                                        }
                                        newtd=createElement("td",{"style":"text-align:right;padding-right:5px;"},newtr1);
                                        c++;
                                        produktPic(0,prod,newtd).style.cssFloat="left";
                                        createElement("span",{},newtd,numberFormat(amount));
                                        //pkte += POINTS[0][prod]*clubmemberLog[thisUser][w][1][prod];
                                    }
                                    //createElement("div",{},newdiv,numberFormat(0.05*Math.round(pkte)));
                                if(newtable1.childElementCount>0){
                                    newtr.setAttribute("mouseOverText",newdiv.innerHTML);
                                    newtr.addEventListener("mouseover",function(event){ toolTip.show(event,this.getAttribute("mouseOverText")); },false);
                                }
                                createElement("td",{"style":"text-align:right;padding-right:5px;border-left:1px solid black;"},newtr,clubmemberLog[clubmemberLogId][1][i][0]);
                                createElement("td",{"style":"text-align:right;padding-right:5px;"},newtr,numberFormat(sum));
                                createElement("td",{"style":"text-align:right;padding-right:5px;"},newtr,(clubmemberLog[clubmemberLogId][1][i][1]>0)?("+"+numberFormat(clubmemberLog[clubmemberLogId][1][i][1])):"");
                            }
                        }
                    }
                    cell=null;newtable=null;newtable1=null;newtr=null;newtr1=null;newtd=null;newdiv1=null;
                    GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_clubmemberLog",implode(clubmemberLog));
                    container=null;newdiv=null;
                },0);
            }
        }catch(err){GM_logError("showGuildQuestStatsResponse\n"+err);}
    });
    // New mode for questhistory
    function showGuildQuestStatsLastDays(days){
    //GM_log("showGuildQuestStatsLastDays "+days);
        //todayStr=getDateStr(now,2,false);
        var startDay=new Date();
        startDay=((new Date(startDay.getFullYear(),startDay.getMonth(),startDay.getDate()-days)).getTime())/1000;

        var obj=[0,[],0,1,0];
        var clubmemberLog=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_clubmemberLog","{}"),"showGuildQuestStatsLastDays/clubmemberLog",{});
        var clubmemberLogSum=new Object();
        for(var u in clubmemberLog){
            if(!clubmemberLog.hasOwnProperty(u)){ continue; }
            var p=0;
            var help=new Object();
            for(var v in clubmemberLog[u]){
                if(!clubmemberLog[u].hasOwnProperty(v)){ continue; }
                if(v=="0"){ continue; }
                if(startDay<=getTime(v)){
                    p += clubmemberLog[u][v][0];
                    for(var w in clubmemberLog[u][v][1]){
                        if(!clubmemberLog[u][v][1].hasOwnProperty(w)){ continue; }
                        help[w]=(help[w]==undefined?0:help[w])+clubmemberLog[u][v][1][w];
                    }

                }
            }
            var help2=new Array();
            for(var w in help){
                if(!help.hasOwnProperty(w)){ continue; }
                help2.push({"p":w,"a":help[w]});
            }
            obj[0]=1;
            obj[1].push({"n":u,"p":p,"products":help2,"c":(u==FARMNAME?1:0)});
            obj[2]++;
            obj[4]=Math.max(obj[4],p);
        }
        if(obj[0]==0){
            obj[1]="No data";
        }else{
            obj[1].sort(function(a,b){return (b["p"]-a["p"]);});
        }

        var request=new Object();
        request.readyState=4;
        request.status=200;
        request.responseText=implode(obj);
        //GM_log("responseText= "+implode(obj));
        unsafeWindow.showGuildQuestStatsResponse(request,4,1,0); //type,page,self
        /*
        request: [1,[
            {"n":"name1","p":17049,"products":[{"p":"id","a":amount},...],"c":1},
            ...
        ],nameCounter,pageNr,highestPoints]
        on error: [0,text]
        */
    }

    // Clubquest reformat
    unsafeOverwriteFunction("setGuildQuestRun",function(r){
        try{
            unsafeWindow._setGuildQuestRun(r);
        }catch(err){GM_logError("_setGuildQuestRun\n"+err);}
        try{
            if(!$("guildquestboxBerater")){
                createElement("h1",{"id":"guildquestboxBerater","style":"display:none;"},$("guildquestboxcontent"));
                var cand=$("questobjectives").getElementsByClassName("link");
                var newdiv;
                for(var v=0;v<cand.length;v++){
                    newdiv=cand[v].getElementsByTagName("b")[0];
                    var help=/(\d+)\/(\d+)/.exec(newdiv.innerHTML.replace(regDelimThou,""));
                    help[1]=parseInt(help[1],10);
                    help[2]=parseInt(help[2],10);
                    newdiv.innerHTML=((help[1]==help[2])?"":(numberFormat(help[2]-help[1])+"/"+numberFormat(help[2])));
                    createElement("div",{"style":"position:absolute;top:0;left:0;width:100px;height:15px;color:black;font-weight:bold;text-align:center;"},cand[v].getElementsByTagName("div")[2],numberFormat(help[1]));
                }
                cand=null;newdiv=null;
            }
        }catch(err){GM_logError("setGuildQuestRun\n"+err);}
    });
    // Clubquest product submitting
    unsafeOverwriteFunction("commitboxguild",function(c,a,d,b,e){
        try{
            unsafeWindow._commitboxguild(c,a,d,b,e);
        }catch(err){GM_logError("_commitboxguild\n"+err);}
        try{
            if(!$("commitboxguildBerater")){
                createElement("h1",{"id":"commitboxguildBerater","style":"display:none;"},$("commitboxcontentguild"));
                if((help=$("commitboxguildokbutton").getAttribute("onclick")).match(/guildQuestAddProducts\((\d+)\)/)){
                    var currProd=/guildQuestAddProducts\((\d+)\)/.exec(help)[1];
                    var cand=$("commitboxcontentguild").getElementsByTagName("input")[0];
                    cand.setAttribute("prod",currProd);
                    // maximal value according to minRack
                    cand.value=Math.max(0,Math.min(cand.value,prodStock[0][currProd]-prodMinRack[0][currProd]));
                    createElement("div",{"id":"commitboxguildLowrack","class":"blackbox alertbox","style":"display:none;position:absolute;top:135px;left:0;"},$("commitboxcontentguild"),getText("alertWillLowRack"));
                    cand.addEventListener("keyup",function(){
                        // warning if more than minRack allows
                        var currProd=this.getAttribute("prod");
                        var help=(prodStock[0][currProd]-parseInt(this.value,10)<prodMinRack[0][currProd]?"block":"none");
                        var cell=$("commitboxguildLowrack");
                        if(cell.style.display!=help){ cell.style.display=help; }
                        cell=null;
                    },false);
                    cand=null;
                }
            }
        }catch(err){GM_logError("commitboxguild\n"+err);}
    });

    /*
    // wanna see all clubhouses ? ^^
    unsafeOverwriteFunction("setBeauties",function setBeauties(){
        for(var v=0;v<15;v++){ // <- edit the 18 (=max) to see the steps
            unsafeWindow.guilddata[4][v]=v+1;
        }
        unsafeWindow._setBeauties();
    });
    */

    // Friendslist
    unsafeOverwriteFunction("showfriendslist",function(status){
        try{
            unsafeWindow._showfriendslist(status);
        }catch(err){GM_logError("_showfriendslist\n"+err);}
        try{
            var cand=$("friendslistcon").getElementsByClassName("friendslinename");
            // for(var v=0;v<cand.length;v++){
            //  var player=cand[v].getElementsByTagName("div")[0].innerHTML.replace(/&nbsp;.*/g,"");
            //  newspan=vertrag(player,cand[v].nextSibling);
            // }
            cand=$("friendslistcon").getElementsByTagName("img");
            for(var v=0;v<cand.length;v++){
                if(cand[v].getAttribute("src").match(/\/guild\/1\.gif/)){
                    cand[v].addEventListener("mouseover",function(event){ toolTip.show(event,unsafeWindow.guildrank[1]); },false);
                }else if(cand[v].getAttribute("src").match(/\/guild\/2\.gif/)){
                    cand[v].addEventListener("mouseover",function(event){ toolTip.show(event,unsafeWindow.guildrank[2]); },false);
                }else if(cand[v].getAttribute("src").match(/\/star\.png/)){
                    cand[v].addEventListener("mouseover",function(event){ toolTip.show(event,unsafeWindow.lng_t_premium); },false);
                }
            }
            cand=null;
        }catch(err){GM_logError("showfriendslist\n"+err);}
    });

    // Friendpage loaded
    err_trace="Friendpage";
    unsafeOverwriteFunction("setFriendInfoContent",function(status,sel){
        try{
            unsafeWindow._setFriendInfoContent(status,sel);
        }catch(err){GM_logError("_setFriendInfoContent\n"+err);}
        try{
            if(status == 1){
                var container=$("friendlistinfoblock");
                var cand=container.getElementsByTagName("li");
                var nextQuest=parseInt(cand[5].children[1].innerHTML,10)+1;
                if(QUESTS["main"]["1"][nextQuest]){
                    cand[5].setAttribute("nextQuest",nextQuest);
                    cand[5].addEventListener("mouseover",function(event){
                        var nextQuest=this.getAttribute("nextQuest");
                        var str="<div style='border-bottom:1px solid black;'>"+getText("quest_farm")+"&nbsp;"+nextQuest+"</div>";
                        for(var i=0;i<QUESTS["main"]["1"][nextQuest][0].length;i++){
                            if(typeof QUESTS["main"]["1"][nextQuest][0][i][0]=="object"){
                                for(var j=0;j<QUESTS["main"]["1"][nextQuest][0][i].length;j++){                 
                                    str += "<div>*"+numberFormat(QUESTS["main"]["1"][nextQuest][0][i][j][2])+"&nbsp;"+prodName[QUESTS["main"]["1"][nextQuest][0][i][j][0]][QUESTS["main"]["1"][nextQuest][0][i][j][1]]+"</div>";
                                }
                            }else{
                                str += "<div>"+numberFormat(QUESTS["main"]["1"][nextQuest][0][i][2])+"&nbsp;"+prodName[QUESTS["main"]["1"][nextQuest][0][i][0]][QUESTS["main"]["1"][nextQuest][0][i][1]]+"</div>";
                            }
                        }
                        
                        toolTip.show(event,str);
                    },false);
                }
                cand=null;container=null;
            }
        }catch(err){GM_logError("setFriendInfoContent\n"+err);}
    });

    // Farmis
    err_trace="Farmis";
    // Buylist opening
    unsafeOverwriteFunction("showCart",function(farmi,type){
    try{
        unsafeWindow._showCart(farmi,type);
    }catch(err){GM_logError("_showCart\n"+err);}
    try{
        // get farmi data
        var prod,menge;
        var thisFarmiData=new Object();
        thisFarmiData["cart"]=new Array();
        switch(type){
        case 1:{
            for (var j=unsafeWindow.farmersmarket_data.farmis.length-1;j>-1;j--){
                if(unsafeWindow.farmersmarket_data.farmis[j].id==farmi){
                    thisFarmiData["money"]=parseFloat(unsafeWindow.farmersmarket_data.farmis[j]["price"],10);
                    thisFarmiData["points"]=parseFloat(unsafeWindow.farmersmarket_data.farmis[j]["points"],10);
                    for (var i=unsafeWindow.farmersmarket_data.farmis[j].cart.length-1;i>-1;i--){
                        prod=unsafeWindow.farmersmarket_data.farmis[j].cart[i]["pid"];
                        menge=unsafeWindow.farmersmarket_data.farmis[j].cart[i]["amount"];
                        thisFarmiData["cart"].push([prod,menge,menge*gut[prod]]);
                    }
                    break;
                }
            }
        break;}
        default:{
            thisFarmiData["money"]=parseFloat(unsafeWindow.farmisinfo[0][farmi]["price"],10);
            for(var i=1;i<=7;i++){
                prod=parseInt(unsafeWindow.farmisinfo[0][farmi]["p"+i],10);
                menge=parseInt(unsafeWindow.farmisinfo[0][farmi]["a"+i],10);
                if((prod>0)&&(menge>0)){
                    thisFarmiData["cart"].push([prod,menge,menge*gut[prod]]);
                }
            }
        }
        }
        // extend cart
        var cand=$top("cartheader").getElementsByTagName("span")[0];
        cand.style.fontWeight="bold";
        cand.setAttribute("class","link");
        cand.addEventListener("mouseover",function(event){ toolTip.show(event,getText("toSGH")); },false);
        cand.addEventListener("click",showSGH,false);
        cand=$("cartsubmit");
        createElement("div",{"id":"cartsubmitPerc","style":"position:absolute;top:-35px;width:70px;padding:2px;text-align:right;font-size:20px;font-weight:bold;"},cand);
        if(type==1){
            cand=cand.querySelector(".farmcartsumamount").parentNode;
            cand.id="cartsubmitPoints";
            cand.addEventListener("mouseover",function(event){ toolTip.show(event,this.getAttribute("mouseOverText")); },false);
        }
        cand=null;
        // (re-)build the table
        function buildTable(){
        try{
            var cartContent,newtable,newtr,newtd,span;
            cartContent=$("cartcontent");
            cartContent.innerHTML="";
            var prod,menge,wert,sum=0,priceMissing=false;
            thisFarmiData["cart"].sort(function(a,b){return (b[2]-a[2]);});
            newtable=createElement("table",{"border":"0","cellspacing":"0","cellpadding":"2","style":"margin:0 auto;"},cartContent);
            for(var v=0;v<thisFarmiData["cart"].length;v++){
                prod=thisFarmiData["cart"][v][0];
                menge=thisFarmiData["cart"][v][1];
                wert=thisFarmiData["cart"][v][2];
                sum += wert;
                newtr=createElement("tr",{"class":((prodStock[0][prod]<menge)?("farmicart_missing"):((prodStock[0][prod]-menge<prodMinRack[0][prod]-((valMinRackFarmis&&totalFarmis[0]&&totalFarmis[0][prod])?totalFarmis[0][prod]:0))?"farmicart_lowrack":"")),"prod":prod},newtable);
                produktPic(0,prod,createElement("td",{},newtr));
                createElement("td",{"style":"width:34px;text-align:right;font-size:16px;font-weight:bold;"},newtr,numberFormat(menge));
                newtd=createElement("td",{"class":"link","style":"width:200px;"},newtr);
                newtd.addEventListener("mouseover",function(event){ showGoToMarketToolTip(event,this.parentNode.getAttribute("prod")); },false);
                newtd.addEventListener("click",function(){showMarket(this.parentNode.getAttribute("prod"));},false);
                span=createElement("span",{"style":"font-size:16px;font-weight:bold;white-space:nowrap;"},newtd,prodName[0][prod]);
                span.style.fontSize=16*Math.min(1,200/span.offsetWidth)+"px";
                newtd=createElement("td",{"class":"link","nr":v,"style":"width:82px;text-align:right;font-size:14px;"},newtr);
                if(wert>0){
                    newtd=createElement("div",{"style":"position:relative;height:100%;padding-left:5px;padding-right:5px;"},newtd);
                    createElement("div",{"style":"position:absolute;left:0;height:100%;width:"+Math.ceil(100*wert/thisFarmiData["cart"][0][2])+"%;background-color:grey;opacity:0.6;z-index:-1;"},newtd);
                    createElement("span",{"style":"width:100%;"},newtd,moneyFormatInt(wert));
                }else{
                    newtd.style.backgroundColor="red";
                    priceMissing=true;
                }
                newtd.addEventListener("mouseover",function(event){ toolTip.show(event,getText("editPrice")); },false);
                newtd.addEventListener("click",function(){
                    var cell,newtable,newt,newtdr
                    cell=this;
                    while(cell.nodeName!="TD"){ cell=cell.parentNode; }
                    var v=cell.getAttribute("nr");
                    cell=$("cartcontentEditPrice");
                    if(cell){ removeElement(cell); }
                    newtable=createElement("div",{"id":"cartcontentEditPrice","style":"z-index:10;position:absolute;right:0;top:0;display:block;border-radius:5px;","class":"blackbox"},$("cartcontent"));
                    newtable=createElement("table",{"cellspacing":"0","cellpadding":"0","border":"0","nr":v},newtable);
                    newtr=createElement("tr",{},newtable);
                    createElement("td",{"colspan":"2","style":"color:black;text-align:center;padding-bottom:2px;white-space:nowrap;"},newtr,getText("editPrice"));
                    newtr=createElement("tr",{},newtable);
                    createElement("td",{"colspan":"2","style":"color:black;border-bottom:1px solid black;text-align:center;padding-bottom:2px;white-space:nowrap;"},newtr,numberFormat(thisFarmiData["cart"][v][1])+"&nbsp;"+prodName[0][thisFarmiData["cart"][v][0]]);
                    newtr=createElement("tr",{},newtable);
                    createElement("td",{"style":"color:black;text-align:left;padding-top:2px;padding-right:10px;"},newtr,getText("marketPrice"));
                    createElement("td",{"style":"color:black;text-align:right;padding-top:2px;"},newtr,moneyFormat(gut[thisFarmiData["cart"][v][0]]));
                    newtr=createElement("tr",{},newtable);
                    createElement("td",{"style":"color:black;text-align:left;padding-right:10px;"},newtr,getText("NPCprice"));
                    createElement("td",{"style":"color:black;text-align:right;"},newtr,isNaN(NPC[0][thisFarmiData["cart"][v][0]])?"-":moneyFormat(NPC[0][thisFarmiData["cart"][v][0]]));
                    newtr=createElement("tr",{"style":"height:22px;"},newtable);
                    createElement("td",{"style":"color:black;text-align:left;padding-right:10px;"},newtr,getText("single"));
                    newtd=createElement("td",{},newtr);
                    cell=createElement("input",{"class":"text","type":"text","style":"color:black;text-align:right;width:60px;","value":numberFormat(thisFarmiData["cart"][v][2]/thisFarmiData["cart"][v][1],2),"maxlength":"8"},newtd);
                    cell.addEventListener("change",function(){
                        var help=parseFloat(this.value.replace(regDelimThou,"").replace(regDelimDeci,"."),10);
                        if(!isNaN(help)){
                            if(help<0){ help*=-1; }
                            help=Math.round(100*help)/100;
                            this.value=numberFormat(help,2);
                            var v=this.parentNode.parentNode.parentNode.getAttribute("nr");
                            thisFarmiData["cart"][v][2]=help*thisFarmiData["cart"][v][1];
                            this.parentNode.parentNode.nextElementSibling.children[1].firstElementChild.value=numberFormat(thisFarmiData["cart"][v][2],2);
                        }
                    },false);
                    newtr=createElement("tr",{"style":"height:22px;"},newtable);
                    createElement("td",{"style":"color:black;text-align:left;padding-right:10px;"},newtr,getText("total"));
                    newtd=createElement("td",{},newtr);
                    cell=createElement("input",{"class":"text","type":"text","style":"color:black;text-align:right;width:60px;","value":numberFormat(thisFarmiData["cart"][v][2],2),"maxlength":"9"},newtd);
                    cell.addEventListener("change",function(){
                        var help=parseFloat(this.value.replace(regDelimThou,"").replace(regDelimDeci,"."),10);
                        if(!isNaN(help)){
                            if(help<0){ help*=-1; }
                            help=Math.round(100*help)/100;
                            this.value=numberFormat(help,2);
                            var v=this.parentNode.parentNode.parentNode.getAttribute("nr");
                            thisFarmiData["cart"][v][2]=help;
                            this.parentNode.parentNode.previousElementSibling.children[1].firstElementChild.value=numberFormat(thisFarmiData["cart"][v][2]/thisFarmiData["cart"][v][1],2);
                        }
                    },false);
                    newtr=createElement("tr",{"style":"height:22px;"},newtable);
                    newtd=createElement("td",{"colspan":"2","style":"color:black;border-top:1px solid black;text-align:center;padding-top:2px;"},newtr);
                    cell=createElement("button",{"class":"link","type":"button","style":"color:black;"},newtd,getText("ok"));
                    cell.addEventListener("click",function(){
                        removeElement(this.parentNode.parentNode.parentNode.parentNode);
                        buildTable();
                    },false);
                    cell=null;newtable=null;newtr=null;newtd=null;
                },false);
            }

            newtr=createElement("tr",{},newtable);
            createElement("td",{"colspan":"3"},newtr);
            newtd=createElement("td",{"style":"padding-left:5px;padding-right:5px;border-top:1px solid #336;text-align:right;color:#336;font-size:14px;","mouseOverText":"90%: "+moneyFormatInt(0.9*sum)},newtr,moneyFormatInt(sum));
            newtd.addEventListener("mouseover",function(event){ toolTip.show(event,this.getAttribute("mouseOverText")); },false);

            newtd=$("cartsubmitPerc");
            if(priceMissing){
                newtd.style.border="4px inset #336";
                newtd.style.color="#336";
                newtd.style.backgroundColor="transparent";
                newtd.innerHTML="--%";
            }else{
                if(100*thisFarmiData["money"]<valFarmiLimits[0]*sum){ var col="red";var col2="#fcc"; }
                else if(100*thisFarmiData["money"]<valFarmiLimits[1]*sum){ var col="#d80";var col2="#ff9"; }
                else{ var col="green";var col2="#80ff80"; }
                newtd.style.border="4px inset "+col;
                newtd.style.color=col;
                newtd.style.backgroundColor=col2;
                newtd.innerHTML=Math.round(100*thisFarmiData["money"]/sum)+"%";
            }
            if(thisFarmiData["points"]){
                span=$("cartsubmitPoints");
                if(thisFarmiData["money"]<sum){
                    newtable=createElement("div",{});
                    newtable=createElement("table",{},newtable);
                    newtr=createElement("tr",{},newtable);
                    newtd=createElement("td",{"style":"text-align:right;"},newtable,"100%: ");
                    newtd=createElement("td",{"style":"text-align:right;"},newtable,numberFormat(1000*(sum-thisFarmiData["money"])/thisFarmiData["points"]));
                    newtd=createElement("td",{},newtable,getText("gamecurrency")+"/"+numberFormat(1000)+getText("points"));
                    newtr=createElement("tr",{},newtable);
                    newtd=createElement("td",{"style":"text-align:right;"},newtable,"90%: ");
                    if(thisFarmiData["money"]<0.9*sum){
                        newtd=createElement("td",{"style":"text-align:right;"},newtable,numberFormat(1000*(0.9*sum-thisFarmiData["money"])/thisFarmiData["points"]));
                        newtd=createElement("td",{},newtable,getText("gamecurrency")+"/"+numberFormat(1000)+getText("points"));
                    }else{
                        newtd=createElement("td",{"colspan":2},newtable,"---");
                    }
                    span.setAttribute("mouseOverText",newtable.parentNode.innerHTML);
                }else{
                    span.setAttribute("mouseOverText","-");
                }
            }
            cartContent=null;newtable=null;newtr=null;newtd=null;span=null;
        }catch(err){GM_logError("showCart.buildTable\n"+err);}  
        }
        buildTable();
    }catch(err){GM_logError("showCart\n"+err);} 
    });
    // Farmis displayed
    unsafeOverwriteFunction("setFarmis",function(){
        try{
            unsafeWindow._setFarmis();
        }catch(err){GM_logError("_setFarmis\n"+err);}
        try{
            calcFarmiCost();
            calcTotalFarmis();
            doFarmis();
        }catch(err){GM_logError("setFarmis\n"+err);}    
    });

    // Reallocate Buildings
    err_trace="Reallocate Buildings";
    unsafeOverwriteFunction("reallocateBuilding",function(set){
        try{
            unsafeWindow._reallocateBuilding(set);
        }catch(err){GM_logError("_reallocateBuilding\n"+err);}
        try{
            //reallocateBuilding('farm1,zone1,farm2,zone2');
            var building1=(6*set[0])+set[1];
            var building2=(6*set[2])+set[3];
            zones.swap(building1,building2);        
            unsafeData.reallocateBuildingSet=[building1,building2];
            raiseEvent("gameReallocateBuilding");
        }catch(err){GM_logError("reallocateBuilding\n"+err);}
    });
    
    // Farmersmarket
    function doFarmersMarketData(){
        try{
            var err_trace="zones";
            var nowServer=unsafeWindow.Zeit.Server;
            var item,zoneNrF,zoneNrS,tempZoneProductionData,tempZoneProductionDataSlot,iProd,iTime,iWaterTime,iPoints,iAmount,currBlock;
            if(unsafeWindow.farmersmarket_data){
                if(unsafeWindow.farmersmarket_data.flower_slots){
                    zoneNrF="farmersmarket-0";
                    zones.setBlock(zoneNrF,"");
                    zones.setBonus(zoneNrF,0);
    
                    tempZoneProductionData=[[{}],BUILDING_SIZE[zones.getBuilding(zoneNrF)],BUILDING_SIZE[zones.getBuilding(zoneNrF)],true];
                    if(unsafeWindow.farmersmarket_data.flower_slots.slots){
                        for(var slot in unsafeWindow.farmersmarket_data.flower_slots.slots){
                            if(!unsafeWindow.farmersmarket_data.flower_slots.slots.hasOwnProperty(slot)){continue;}
                            item=unsafeWindow.farmersmarket_data.flower_slots.slots[slot];
                            iProd=parseInt(item["pid"],10);
                            if(item["remain"]){
                                tempZoneProductionData[1]--;
                                if(item["remain"]>0){
                                    iTime=nowServer+parseInt(item["remain"],10);
                                    iWaterTime=nowServer+parseInt(item["waterremain"],10);
                                }else{
                                    iTime=nowServer+parseInt(item["remain"],10);
                                    iWaterTime=NEVER;
                                }
                            }else{
                                iTime=NEVER;
                                iWaterTime=NEVER;
                            }
                            iAmount=1;
                            iPoints=parseInt(item["points"],10);
                            if(tempZoneProductionData[0][0][iProd]){
                                var notfound=true;
                                for(var i=0;i<tempZoneProductionData[0][0][iProd].length;i++){
                                    if((tempZoneProductionData[0][0][iProd][i][2]==iTime)&&(tempZoneProductionData[0][0][iProd][i][3]==iWaterTime)){
                                        tempZoneProductionData[0][0][iProd][i][0]+=iAmount;
                                        tempZoneProductionData[0][0][iProd][i][1]+=iPoints;
                                        notfound=false;break;
                                    }
                                }
                                if(notfound){ tempZoneProductionData[0][0][iProd].push([iAmount,iPoints,iTime,iWaterTime]); }
                            }else{
                                tempZoneProductionData[0][0][iProd]=[[iAmount,iPoints,iTime,iWaterTime]];
                            }
                        }
                    }
                    zones.setProduction(zoneNrF,tempZoneProductionData.clone());
                }
                zoneNrF="farmersmarket-1";
                if(unsafeWindow.farmersmarket_data.flower_bonus&&unsafeWindow.farmersmarket_data.flower_bonus.pid&&(unsafeWindow.farmersmarket_data.flower_bonus.remain>0)){
                    zones.setBonusSpecial(zoneNrF,[unsafeWindow.farmersmarket_data.flower_bonus.pid,parseInt(unsafeWindow.flowerarea_dailybonus_percent,10)]);
                }else{
                    zones.setBonusSpecial(zoneNrF,null);
                }
                if(unsafeWindow.farmersmarket_data.pos){
                    for(var w=1;w<=6;w++) {
                        if(item=unsafeWindow.farmersmarket_data.pos[w]){
                            zoneNrF="farmersmarket-"+w;
                            currBlock=(item["block"]&&item["cost"]?"b":""); // locked due to missing payment
                            currBlock+=(item["block"]&&item["level"]?"l"+item["level"]:""); // locked due to level requirement
                            switch(w){
                            case 1:{ // Flower meadow
                                tempZoneProductionData=[[{}],BUILDING_SIZE[zones.getBuilding(zoneNrF)],BUILDING_SIZE[zones.getBuilding(zoneNrF)],true];
                                zones.setBonus(zoneNrF,5);
                                if(unsafeWindow.farmersmarket_data.flower_area){
                                    for(var slot in unsafeWindow.farmersmarket_data.flower_area){
                                        if(!unsafeWindow.farmersmarket_data.flower_area.hasOwnProperty(slot)){continue;}
                                        item=unsafeWindow.farmersmarket_data.flower_area[slot];
                                        iProd=parseInt(item["pid"],10);
                                        if(item["remain"]){
                                            tempZoneProductionData[1]--;
                                            if(item["remain"]>0){ //production busy, "duration" is reduced by watering
                                                iTime=parseInt(item["duration"],10)+parseInt(item["createdate"],10);
                                                if(zones.getBonus(zoneNrF)>0){
                                                    iWaterTime=parseInt(item["waterdate"],10);
                                                    iWaterTime=((item["water_remain"]<0)?parseInt(item["createdate"],10):(item["water_remain"]<item["remain"]?item["water_remain"]+nowServer:NEVER));
                                                }else{
                                                    iWaterTime=NEVER;
                                                }
                                            }else{
                                                iTime=parseInt(item["duration"],10)+parseInt(item["createdate"],10);
                                                iWaterTime=NEVER;
                                            }
                                        }else{
                                            iTime=NEVER;
                                            iWaterTime=NEVER;
                                        }
                                        iAmount=prodYield[0][iProd];
                                        iPoints=prodPoints[0][iProd];                
                                        if(tempZoneProductionData[0][0][iProd]){
                                            var notfound=true;
                                            for(var i=0;i<tempZoneProductionData[0][0][iProd].length;i++){
                                                if((tempZoneProductionData[0][0][iProd][i][2]==iTime)&&(tempZoneProductionData[0][0][iProd][i][3]==iWaterTime)){
                                                    tempZoneProductionData[0][0][iProd][i][0]+=iAmount;
                                                    tempZoneProductionData[0][0][iProd][i][1]+=iPoints;
                                                    notfound=false;break;
                                                }
                                            }
                                            if(notfound){ tempZoneProductionData[0][0][iProd].push([iAmount,iPoints,iTime,iWaterTime]); }
                                        }else{
                                            tempZoneProductionData[0][0][iProd]=[[iAmount,iPoints,iTime,iWaterTime]];
                                        }
                                    }
                                }
                                zones.setProduction(zoneNrF,tempZoneProductionData.clone());
                            break;}
                            case 2:{ // Flower workshop
                                zones.setBonus(zoneNrF,0);
                                if((!currBlock)&&(unsafeWindow.farmersmarket_data.nursery&&unsafeWindow.farmersmarket_data.nursery.slots)){
                                    tempZoneProductionData=[[{},{}],0,0,true];
                                    for(var slot=1;slot<=3;slot++){
                                        zoneNrS=zoneNrF+"."+slot;
                                        zones.setBlock(zoneNrS,"");
                                        tempZoneProductionDataSlot=[[{},{}],0,0,true];
                                        if(item=unsafeWindow.farmersmarket_data.nursery.slots[slot]){
                                            if(item["block"]){
                                                zones.setBlock(zoneNrS,"b");
                                            }else{
                                                iProd=(item["pid"]?parseInt(item["pid"],10):null);
                                                if(isNaN(iProd)){ iProd=null; }
                                                if((iProd!=null)&&(item["ready"])){ // production ready
                                                    iTime=nowServer;
                                                }else if((iProd!=null)&&(item["remain"])){ // production busy
                                                    iTime=nowServer+item["remain"]; 
                                                }else{
                                                    iTime=NEVER;
                                                    tempZoneProductionData[1]++;
                                                    tempZoneProductionDataSlot[1]++;
                                                }
                                                tempZoneProductionData[2]++;
                                                tempZoneProductionDataSlot[2]++;
                                                if(iProd!=null){
                                                    iAmount=prodYield[0][iProd];
                                                    iPoints=iAmount*prodPoints[0][iProd];                               
                                                    if(!tempZoneProductionData[0][0][iProd]){ tempZoneProductionData[0][0][iProd]=[]; }
                                                    tempZoneProductionData[0][0][iProd].push([iAmount,iPoints,iTime,NEVER]);
                                                    if(!tempZoneProductionDataSlot[0][0][iProd]){ tempZoneProductionDataSlot[0][0][iProd]=[]; }
                                                    tempZoneProductionDataSlot[0][0][iProd].push([iAmount,iPoints,iTime,NEVER]);
                                                }
                                            }
                                        }
                                        zones.setProduction(zoneNrS,tempZoneProductionDataSlot.clone());
                                    }
                                    zones.setProduction(zoneNrF,tempZoneProductionData.clone());
                                }
                            break;}
                            default:{
                                currBlock="blpqs";
                            }
                            }
                            zones.setBlock(zoneNrF,currBlock);
                        }
                    }
                }
            }
            calcTotalZones();
        }catch(err){GM_logError("doFarmersMarketData ("+err_trace+")\n"+err);}
    };
    if(unsafeWindow.farmersmarket_data){ doFarmersMarketData(); }
    unsafeOverwriteFunction("farmersMarketHandler",function(response){
        try{
            unsafeWindow._farmersMarketHandler(response);
        }catch(err){GM_logError("_farmersMarketHandler\n"+err);}
        try{
            doFarmersMarketData()
        }catch(err){GM_logError("farmersMarketHandler\n"+err);}
    });
    function doFarmersMarket(){
        try{
            var div,div1,divZone;
            var zoneNrF;
            for(var w=1;w<=6;w++){
                zoneNrF="farmersmarket-"+w;
                divZone=$("farmersmarket_pos"+w);
                if(!divZone.classList.contains("listenerMouseOver")){
                    divZone.classList.add("listenerMouseOver");
                    divZone.addEventListener("mouseout",function(){
                        hideBlase();
                        hideLagerZeitZiel();
                    },false);
                    divZone.addEventListener("mouseover",function(){
                        var help = /^farmersmarket_pos(\d+)$/.exec(this.id);
                        help="farmersmarket-"+help[1];
                        showBlase(help);
                        showLagerZeitZiel(help);
                    },true);
                }
                if(div=$("farmersmarket_pos"+w+"_progress")){
                    if(!div.classList.contains("listenerMouseOver")){
                        div.classList.add("listenerMouseOver");
                        div.addEventListener("mouseover",function(event){
                            var help=/^farmersmarket_pos(\d+)_progress$/.exec(this.id);
                            help="farmersmarket-"+help[1];
                            toolTip.show(event,toolTipZoneProduction(help));
                        },false);
                    }
                }               
                switch(w){
                case 1:{ // Flower meadow
                    // Production
                    if(!(div=$("farmersmarket_pos"+w+"_running"))){
                        if(div1=$("farmersmarket_pos"+w+"_progress")){
                            div1.style.display="block";
                            div=createElement("div",{"id":"farmersmarket_pos"+w+"_running","style":"position:absolute;right:0px;top:10px;"},div1);
                        }
                    }
                    if(div){
                        div.setAttribute("class","v"+zones.getMainproduct(zoneNrF));
                    }
                break;}
                }
            }
            div=null;
        }catch(err){GM_logError("doFarmersMarket\n"+err);}
    }
    if($("farmersmarket_pos1")){ doFarmersMarket(); }
    unsafeOverwriteFunction("setFarmersMarket",function(){
        try{
            unsafeWindow._setFarmersMarket();
        }catch(err){GM_logError("_setFarmersMarket\n"+err);}
        try{
            doFarmersMarket();
        }catch(err){GM_logError("setFarmersMarket\n"+err);}
    });
    unsafeOverwriteFunction("initFlowerArea",function(){
        try{
            unsafeWindow._initFlowerArea();
        }catch(err){GM_logError("_initFlowerArea\n"+err);}
        try{
            showLagerZeitZiel("farmersmarket-1");
            raiseEvent("gameFarmersmarketOpened1");
        }catch(err){GM_logError("initFlowerArea\n"+err);}
    });
    unsafeOverwriteFunction("closeFlowerArea",function(){
        try{
            unsafeWindow._closeFlowerArea();
        }catch(err){GM_logError("_closeFlowerArea\n"+err);}
        try{
            hideLagerZeitZiel("farmersmarket-1");
        }catch(err){GM_logError("closeFlowerArea\n"+err);}
    });
    unsafeOverwriteFunction("initNursery",function(){
        try{
            unsafeWindow._initNursery();
        }catch(err){GM_logError("_initNursery\n"+err);}
        try{
            raiseEvent("gameFarmersmarketOpened2");
        }catch(err){GM_logError("initNursery\n"+err);}
    });
    unsafeOverwriteFunction("dialogNursery",function(mode,c,t,h){
        try{
            unsafeWindow._dialogNursery(mode,c,t,h);
        }catch(err){GM_logError("_dialogNursery\n"+err);}
        try{
            switch(mode){
            case "production": raiseEvent("gameFarmersmarketSlotOpened");
            case "production_commit": raiseEvent("gameFarmersmarketDialogCommit");
            }
        }catch(err){GM_logError("dialogNursery\n"+err);}
    });
    unsafeOverwriteFunction("dialogFlowerArea",function(mode,l){
        try{
            unsafeWindow._dialogFlowerArea(mode,l);
        }catch(err){GM_logError("_dialogFlowerArea\n"+err);}
        try{
            switch(mode){
            case "autoplant": raiseEvent("gameFarmersmarketDialogStart");
            }
        }catch(err){GM_logError("dialogFlowerArea\n"+err);}
    });
    // events forestry ==============================================================================
    err_trace="events forestry";

    /*
    $("globalcommitbox").addEventListener ("DOMAttrModified", function(event){
        try{
        var help;
        if ((this==event.target)&&(this.style.display == "block") && (help=$("forestry_questentry_value"))){
            var max = $("globalcommitbox").innerHTML.match(/chkForestryQuestEntryValue\(\d+,\d+,(\d+)\)/i);
            GM_log("max:"+implode(max));
            if (max && max[1]){
                help.value = max[1];
                keyup(help);
            }
        }
    }catch(err){GM_logError("globalcommitbox \n"+err);}
    },false);
    
    Arrays:
    forestry_area_run       : >0 if growing
    forestry_area_time      : seconds till end of growing
    forestry_area_watertime : seconds till next watering (<=0 if water needed)
    forestry_area_name      : Name of tree if growing
    forestry_area_pid       : tree id {1,2,3,...}
    */
/*
    unsafeOverwriteFunction("forestryAjaxAction",function(action,position,pid,slot){
        // GM_log("forestryAjaxAction action="+action+" position="+position+" pid="+pid+" slot="+slot);
        // GM_log("currentslot="+unsafeWindow.currentslot);
        // open menu again
        // if((position==1)||(position==2)){
        if(position==2){
            if((action=="startproduction")||(action=="cancelproduction")||(action=="cropproduction")){
                document.addEventListener("gameOpenForestry",function(position){ return function(){
                    document.removeEventListener("gameOpenForestry",arguments.callee,false);
                    var div=$("forestry_building_click"+position);
                    if(div){ click(div); }
                    div=null;
                }}(position),false);
            }
        }
        unsafeWindow._forestryAjaxAction(action,position,pid,slot);
    });
*/
    unsafeOverwriteFunction("initForestryResponse",function(request,mode,C,r,type){
        try{
            if(DEVMODE_FUNCTION){ var trackingHandle = tracking.start("berater","initForestryResponse"); }
            unsafeWindow._initForestryResponse(request,mode,C,r,type);
            // initForestryResponse(request,uprack,upmenu,action,pos,tutorialstep,position);
            var result = checkRequest(request);
            if(result && result[0]!=0){
                unsafeWindow.farm=""; //Hack for the scripts
                unsafeWindow.city=""; //Hack for the scripts
                // GM_log("forestry: result:\n"+implode(result));
                if(unsafeWindow.forestry_unlock){
                    try{
                        /* forestry_production_products{stock}{iProd}
                        {0} = 36000 // Time
                        {1}{1}{1} = 30 //points you get with harwisting this product
                        {1}{1}{2} = 1 //amount it will produce
                        {1}{1}{3} = 1 //stock number
                        {1}{1}{4}{0} = 1 //campain number after which it can be used
                        {1}{1}{4}{1} = 3 //quest number after which it can be used
                        {1}{1}{5} = 21 //What can i make of this: stock 2 =[{0:product,1:amount}]; stock 1 = product; stock 3,4 = 0;
                        {1}{1}{6} = 0 //What do i need for this: stock 4 =[{0:product,1:amount}]; stock 1 to 3 = 0
                        {1}{1}{7} = 3 //something with the price.. but this could change dayly
                        {1}{1}{8} = 0 //stock 5: [prod,amount] to be payed to get this forestry_area[][block] of the field.
                        {1}{1}{9} = Fijnspar //NAME
                        {1}{1}{10}{0} = 1 //only at stock 1
                        {1}{1}{10}{1} = 2 //only at stock 1
                        {1}{1}{11} = 0 ->stock 3: fid needed to produce
                        {1}{1}{12} = 0 //item for in the farmbuilding
                        */
                    
                        //make prodName[1] && prodYield[1] && prodRequire[1] = [[type,fId,amount]]
                        var store,stock,fId,bChanged=false,help,building;
                        for(var stock in result[4]){ //forestry_production_products==initForestryResponce->result[4]
                            if (!result[4].hasOwnProperty(stock)){ continue; }
                            for(var fId in result[4][stock]){
                                if (!result[4][stock].hasOwnProperty(fId)){ continue; }
                                help=result[4][stock][fId];
                                // if (!prodName[1][fId]){
                                //  prodName[1][fId] = help[9]; // set prodName[1]
                                //  //GM_log("initForestryResponse ADD prodName production fId:"+fId+" name:"+prodName[1][fId]);
                                //  bChanged=true;
                                // }
                                prodTyp[1][fId]="f"+stock;
                                prodPoints[1][fId]=help[1];
                                //GM_log("prodYield fId:"+fId+" [5]:"+typeof help[5]);
                                building=getForestryUserBuilding(stock-1);
                                prodStockMax[1][fId]=building?unsafeWindow.forestry_user_buildings[building]["capacity"]:0;
                                if(stock==1){
                                    prodYield[1][fId]=1;
                                    prodYield[1][help[5]]=1;
                                    delete prodRequire[1][fId]; //[[1,parseInt(fId,10),1]];
                                    prodRequire[1][help[5]]=[[1,parseInt(fId,10),1]];
                                    prodGrowTime[1][fId]=help[0]/60;
                                }else if(stock==2){//forestry
                                    // [4]{2}{23}[5][0][0] = 47 //id
                                    // [4]{2}{23}[5][0][1] = 7 //#
                                    // for(var i=0;i<help[5].length;i++){
                                        //prodYield[1][help[5][i][0]]=help[5][i][1];
                                        //prodRequire[1][help[5][i][0]]=[[1,parseInt(fId,10),1]];
                                    // }
                                }else if(stock==3){//sawmill
                                    prodYield[1][fId]=help[2];
                                    prodRequire[1][fId]=[[1,help[11],1]];
                                    building=getForestryUserBuilding(1);
                                    if(!prodGrowTime[1][fId]){
                                        if(building&&unsafeWindow.forestry_user_buildings[building]["boni"]){
                                            prodGrowTime[1][fId]=((help[0]*100)/(100-unsafeWindow.forestry_user_buildings[building]["boni"]))/60;
                                        }else{
                                            prodGrowTime[1][fId]=help[0]/60;
                                        }
                                    }
                                }else if(stock==4){//carpentry
                                    //[4]{4}{101}[6][0][0] = 41 //id
                                    //[4]{4}{101}[6][0][1] = 4 //#
                                    prodYield[1][fId]=1;
                                    prodRequire[1][fId]=new Array();
                                    for(var i=0;i<help[6].length;i++){
    
                                        prodRequire[1][fId].push([1,help[6][i][0],help[6][i][1]]);
                                    }
                                    building=getForestryUserBuilding(2);
                                    if(!prodGrowTime[1][fId]){
                                        if(building&&unsafeWindow.forestry_user_buildings[building]["boni"]){
                                            prodGrowTime[1][fId]=((help[0]*100)/(100-unsafeWindow.forestry_user_buildings[building]["boni"]))/60;
                                        }else{
                                            prodGrowTime[1][fId]=help[0]/60;
                                        }
                                    }
                                }
                            }
                        }
                        stock=null;fId=null;help=null;
                        // prodPoints[1].sortObj();
                        // GM_log("initForestryResponse prodPoints:"+implode(prodPoints,"prodPoints"));
                        GM_setValueCache(COUNTRY+"_"+SERVER+"_prodPoints",implode(prodPoints,"initForestryResponse\prodPoints"));
                        // prodTyp[1].sortObj();
                        // GM_log("initForestryResponse prodTyp:"+implode(prodTyp,"prodTyp"));
                        GM_setValueCache(COUNTRY+"_"+SERVER+"_prodTyp",implode(prodTyp,"initForestryResponse\prodTyp"));
                        // prodYield[1].sortObj();
                        // GM_log("initForestryResponse prodYield:"+implode(prodYield,"prodYield"));
                        GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodYield",implode(prodYield,"initForestryResponse\prodYield"));
                        // prodRequire[1].sortObj();
                        // GM_log("initForestryResponse prodRequire:"+implode(prodRequire,"prodRequire"));
                        GM_setValueCache(COUNTRY+"_"+SERVER+"_prodRequire",implode(prodRequire,"initForestryResponse\prodRequire"));
                        // prodGrowTime[1].sortObj();
                        // GM_log("initForestryResponse prodGrowTime:"+implode(prodGrowTime,"prodGrowTime"));
                        GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodGrowTime",implode(prodGrowTime,"initForestryResponse\prodGrowTime"));
                        // prodStockMax[1].sortObj();
                        // GM_log("initForestryResponse prodStockMax:"+implode(prodStockMax,"prodStockMax"));
                        GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodStockMax",implode(prodStockMax,"initForestryResponse\prodStockMax"));
                        // make prodName[1] && forestry_stock
                        prodStock[1]=new Object();
                        for(store in result[3]){ //forestry_stock
                            if (!result[3].hasOwnProperty(store)){ continue; }
                            for(fId in result[3][store]){
                                if (!result[3][store].hasOwnProperty(fId)){ continue; }
                                // if (!prodName[1][fId]){
                                //  prodName[1][fId] = result[3][store][fId]["name"]; // set prodName[1]
                                //  //GM_log("initForestryResponse ADD prodName stock fId:"+fId+" name:"+prodName[1][fId]);
                                //  bChanged=true;
                                // }
                                if(!prodStock[1][fId]) prodStock[1][fId]=0;
                                prodStock[1][fId] += parseInt(result[3][store][fId]["amount"],10);
                            }
                        }
                        for(fId in prodName[1]){
                            if (!prodName[1].hasOwnProperty(fId)){ continue; }
                            if(!prodStock[1][fId]){ prodStock[1][fId]=0; }
                        }
                        //GM_log("initForestryResponse prodStock:"+implode(prodStock,"prodStock"));
                        GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodStock",implode(prodStock,"initForestryResponse\prodStock"));
    
                        for(fId in prodName[1]){
                            if(!prodName[1].hasOwnProperty(fId)){continue;}
    
                            stock=prodTyp[1][fId].replace("f","");
                            if(!!prodTyp[1][fId]&&!(result[4][stock]&&result[4][stock][fId])&&!prodBlock[1][fId].match(/b/)){
                                prodBlock[1][fId]+="b";
                            }
                        }
                        store=null;fId=null;
                        // prodStock[1].sortObj();
                        GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodStock",implode(prodStock));
    
                        //forestry_farmis
                        var farmi, i;
                        totalFarmis[1]=new Object();
                        for(farmi in result[5]){ //forestry_farmis==initForestryResponce->result[5]
                            if (!result[5].hasOwnProperty(farmi)){ continue; }
                            for(i in result[5][farmi]["products"]){
                                if (!result[5][farmi]["products"].hasOwnProperty(i)){ continue; }
                                fId = result[5][farmi]["products"][i]["product"];
                                // if (!prodName[1][fId]){
                                //  prodName[1][fId] = result[5][farmi]["products"][i]["name"]; // set prodName[1]
                                //  //GM_log("initForestryResponse ADD prodName farmis fId:"+fId+" name:"+prodName[1][fId]);
                                //  bChanged=true;
                                // }
                                if(!totalFarmis[1][fId]) totalFarmis[1][fId]=0;
                                totalFarmis[1][fId] += parseInt(result[5][farmi]["products"][i]["amount"],10);
                            }
                        }
                        // totalFarmis[1].sortObj();
                        // GM_log("initForestryResponse totalFarmis:"+implode(totalFarmis));
                        GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_totalFarmis",implode(totalFarmis));
    
                        if(bChanged){
                            // prodName[1].sortObj();
                            // GM_log("initForestryResponse bChanged:"+ bChanged+" prodName:"+implode(prodName));
                            GM_setValueCache(COUNTRY+"_"+SERVER+"_prodName",implode(prodName));
                        }
                    }catch(err){GM_logError("initForestryResponse \n"+err);}
                    var zoneNrF;
                    switch(type){
                    case 1: zoneNrF="sawmill"; break;
                    case 2: zoneNrF="carpentry"; break;
                    }
                    updateProductDataForestry();
                    doForestry();
                    switch(mode){
                    case "cropproduction": raiseEvent("game"+zoneNrF.capitalize()+"Cropped"); break;
                    case "startproduction": raiseEvent("game"+zoneNrF.capitalize()+"Started"); break;
                    default: raiseEvent("gameOpenForestry");
                    }
                }
                calcProdMinRack();
            }
            if(DEVMODE_FUNCTION){ tracking.end("berater",trackingHandle); }
        }catch(err){GM_logError("initForestryResponse \n"+err);}
    });

    /*
    var container = $("forestry_sawmill_productbox");
    var treeContainer, el1, el2;
    // Redesign sawmill
    for(var treeId=1;treeId<=5;treeId++){
        treeContainer = createElement("div",{"id":"forestry_sawmill_productbox_tree"+treeId,"style":"height:40px;"},container);
        el1 = createElement("div",{"id":"forestry_sawmill_productbox_log"+treeId,"class":"forestry_slot_product f_symbol"+(20+treeId),"style":"display:block;border-right:2px solid black;"},treeContainer);
        createElement("div",{"id":"forestry_sawmill_productbox_log"+treeId+"_amount","style":"position:absolute;top:-13px;"},el1)               
        for(var i=-2;i<=0;i++){
            if(el1=$("forestry_slot_products"+(treeId*3+i))){
                treeContainer.appendChild(el1);
                createElement("div",{"id":"forestry_slot_products"+(treeId*3+i)+"_amount","style":"position:absolute;top:-13px;"},el1);
                if(el2=$("forestry_slot_products_name"+(treeId*3+i))){
                    el1.addEventListener("mouseover",function(){
                        // $(this.id+"_endtime").innerHTML=0;
                        var nr=this.id.replace("forestry_slot_products","");
                        var div=$("forestry_slot_products"+nr+"_endtime");
                        if(!div){
                            if(div=$("forestry_slot_products_name"+nr)){
                                div=createElement("div",{},div);
                                createElement("img",{"src":GFX+"adtime.gif","style":"width:14px;height:14px;vertical-align:text-bottom;margin-right:5px;"},div);
                                div=createElement("div",{"id":"forestry_slot_products"+nr+"_endtime","style":"display:inline-block;"},div);
                            }
                        }
                        if(div){
                            var iProd = parseInt(/f_symbol(\d+)/.exec(this.getAttribute("class"))[1],10);
                            var iTime=calcProductionTime("sawmill",1,iProd,1-zones.getBonus("sawmill")/100);
                            div.innerHTML=getDaytimeStr(now+iTime)+"&nbsp;"+getText("shortOClock");
                            iProd=null;iTime=null;
                        }
                        nr=null;div=null;
                    },false);
                }
            }
        }
    }
    // Redesign Carpentry
    for(var i=1;i<=20;i++){
        el1=$("forestry_productiondialog_content_item_amount"+i);
        if(el1){
            el1.style.width = "150px";
            container = el1.parentNode; // $("forestry_productiondialog_content_item_con"+i);
            container.style.position = "relative";
            container.style.height = "28px";
            container.style.marginBottom = "5px";
            container.className = "hoverBgLightbrown";
            container.addEventListener("mouseover",function(evt){
                try{
                    var prod = parseInt(/f_symbol(\d+)/.exec($(this.id.replace("forestry_productiondialog_content_item_con","forestry_productiondialog_content_item")).getAttribute("class"))[1],10);
                    var container,newTable,newTr,newTd;
                    container=createElement("div");
                    newTable=createElement("table",{},container);
                    // name
                    newTr=createElement("tr",{},newTable);
                    newTd=createElement("th",{"colspan":"2"},newTr,prodName[1][prod]);
                    if(prodTyp[1][prod]=="f5"){
                        newTr=createElement("tr",{},newTable);
                        newTd=createElement("td",{"colspan":"2","style":"font-weight:bold;"},newTr,unsafeWindow.forestry_production_farmhouseitem_info_head);
                    }else{
                        // rack amount
                        newTr=createElement("tr",{},newTable);
                        newTd=createElement("td",{},newTr,getText("stock"));
                        newTd=createElement("td",{},newTr,numberFormat(prodStock[1][prod]));
                    }
                    toolTip.show(evt,container.innerHTML);
                }catch(err){ GM_logError("listener carpentryItem.mouseover\nprod="+prod+"\n"+err); }
            },false);
            // createElement("div",{"id":"forestry_productiondialog_content_item_rackamount"+i,"style":"position:absolute;top:25px;left:0px;"},container,"0");
            el1=insertAfter(createElement("div",{"class":"forestry_productiondialog_content_item_main_amount","style":"width:150px;"}),el1);
            el2=createElement("div",{"style":"display:inline-block;height:15px;width:15px;margin-right:1px;"},el1);
            createElement("img",{"src":GFX+"lager/wachstum.gif","style":"width:14px;height:14px;vertical-align:text-bottom;"},el2);
            createElement("div",{"id":"forestry_productiondialog_content_item_times"+i,"style":"display:inline-block;width:58px;"},el1,"0");
            el2=createElement("div",{"style":"display:inline-block;height:15px;width:15px;margin-left:2px;margin-right:1px;"},el1);
            createElement("img",{"src":GFX+"adtime.gif","style":"width:14px;height:14px;vertical-align:text-bottom;"},el2);
            createElement("div",{"id":"forestry_productiondialog_content_item_endtimes"+i,"style":"display:inline-block;width:58px;"},el1,"0");
        }
    }
    container=null;treeContainer=null;el1=null;el2=null;
    */
    // Redesign Forest Stock
    var div,div2,span,iProd,iTime;
    for(var v=1;v<=8;v++){
        if(div=$("f_stock_item"+v)){
            iProd=parseInt(/f_symbol(\d+)/.exec(div.firstElementChild.className)[1],10);
            if(iProd&&(div=$("f_stock_growing_"+v))){
                iTime=calcProductionTime("forest",1,iProd,1-zones.getBonus("forest")/100);
                div.innerHTML=getTimeStr(iTime,true)+"&nbsp;"+getText("shortHours");
                div.parentNode.parentNode.style.height="44px";
                div2=createElement("div",{"style":"float:left;height:15px;width:15px;margin-right:5px;"},div.parentNode);
                createElement("img",{"src":GFX+"adtime.gif","style":"width:14px;height:14px;"},div2);
                div2=createElement("div",{"class":"forestry_stockitem_time"},div.parentNode);
                span=createElement("span",{},div2);
                clocks.add("forestItem_"+iProd,span,iTime);
                createElement("span",{},div2,"&nbsp;"+getText("shortOClock"));
                createElement("div",{"class":"clear"},div.parentNode);
            }
        }
    }
    
    unsafeOverwriteFunction("showForestryProductionBox",function(type){
        try{
            unsafeWindow._showForestryProductionBox(type);
        }catch(err){GM_logError("_showForestryProductionBox\n"+err);}
        try{
            if(DEVMODE){ GM_log("showForestryProductionBox type="+type); }
return; 
            switch(type){
            case 1:{// sawmill
                var container,prod,classStr,flagDisplay,div;
                var zoneNrF="sawmill";
                for(var treeId=1;treeId<=5;treeId++){
                    try{
                        container = $("forestry_sawmill_productbox_tree"+treeId);
                        classStr = container.children[0].getAttribute("class");
                        prod = parseInt(/f_symbol(\d+)/.exec(classStr)[1],10);
                        $(container.children[0].id+"_amount").innerHTML = numberFormat(prodStock[1][prod]);
                        flagDisplay = "none";
                        for(var i=1;i<=3;i++){
                            if(container.children[i].style.display!="none"){
                                flagDisplay = "block"; 
                                classStr = container.children[i].getAttribute("class");
                                prod = parseInt(/f_symbol(\d+)/.exec(classStr)[1],10);
                                if(!classStr.match(/ link$/)){ container.children[i].setAttribute("class",classStr+" link"); }
                                $(container.children[i].id+"_amount").innerHTML = numberFormat(prodStock[1][prod]);
                            }
                        }
                        container.style.display = flagDisplay;
                    }catch(err){ GM_logError("showForestryProductionBox sawmill\ntreeId="+treeId+"\n"+err); }
                }
                //auto-cropping
                for(var slot=1;slot<=3;slot++){
                    try{
                        if((top.unsafeData.autoAction==null) && valAutoCrop["forestry"] && (div=$("forestry_slot_crop"+slot)) && (div.style.display=="block")){
                            top.unsafeData.autoAction="berater: sawmill crop";
                            document.addEventListener("gameOpenGlobalCommitBox",function(){
                                document.removeEventListener("gameOpenGlobalCommitBox",arguments.callee,false);
                                window.setTimeout(function(){ 
                                    click($("globalcommitboxfooter").firstElementChild); 
                                    top.unsafeData.autoAction=null;
                                },500);
                            });
                            window.setTimeout(function(div){ click(div); },500,div);
                        }
                        div=null;
                    }catch(err){ GM_logError("showForestryProductionBox sawmill\nslot="+slot+"\n"+err); }
                }
                container=null;prod=null;classStr=null;flagDisplay=null;
                raiseEvent("gameSawmillOpened");
            break;}
            case 2:{ // carpentry
                var container,icon,prod,help;
                for(var i=1;i<=20;i++){
                    try{            
                    container=$("forestry_productiondialog_content_item_con"+i);
                    icon=$("forestry_productiondialog_content_item"+i);
                    if(container&&icon&&(container.style.display=="block")){
                        prod = parseInt(/f_symbol(\d+)/.exec(icon.getAttribute("class"))[1],10);
                        // show rack amount
                        // $("forestry_productiondialog_content_item_rackamount"+i).innerHTML = numberFormat(prodStock[1][prod]);
                        // check required products
                        help=true;
                        for(var j=0;j<prodRequire[1][prod].length;j++){
                            if(prodStock[1][prodRequire[1][prod][j][1]]<prodRequire[1][prod][j][2]){ help=false; }
                        }
                        if(help){
                            if(icon.childElementCount>0){ removeElement(icon.children[0]); }
                        } else {
                            if(icon.childElementCount==0){ createElement("img",{"alt":"X","style":"width:25px;height:25px;","src":GFX+"cursors/cursor_forbidden.gif"},icon); }
                        }
                        // show times
                        help=calcProductionTime("carpentry",1,prod,1-zones.getBonus("carpentry")/100);
                        if(icon=$("forestry_productiondialog_content_item_amount"+i)){
                            icon.innerHTML = prodName[1][prod];
                        }
                        if(icon=$("forestry_productiondialog_content_item_times"+i)){
                            icon.innerHTML = getTimeStr(help,true)+"&nbsp;"+getText("shortHours");
                        }
                        if(icon=$("forestry_productiondialog_content_item_endtimes"+i)){
                            icon.innerHTML = getDaytimeStr(now+help,true,true)+"&nbsp;"+getText("shortOClock");
                        }
                    }
                    }catch(err){ GM_logError("showForestryProductionBox carpentry\ni="+i+"\n"+err); }
                }
                //auto-cropping
                for(var slot=1;slot<=3;slot++){
                    try{
                        if((top.unsafeData.autoAction==null) && valAutoCrop["forestry"] && (div=$("forestry_slot_crop"+slot)) && (div.style.display=="block")){
                            top.unsafeData.autoAction="berater: carpentry crop";
                            document.addEventListener("gameOpenGlobalCommitBox",function(){
                                document.removeEventListener("gameOpenGlobalCommitBox",arguments.callee,false);
                                window.setTimeout(function(){
                                    click($("globalcommitboxfooter").firstElementChild);
                                    top.unsafeData.autoAction=null;
                                },500);
                            });
                            window.setTimeout(function(div){ click(div); },500,div);
                        }
                        div=null;
                    }catch(err){ GM_logError("showForestryProductionBox carpentry\nslot="+slot+"\n"+err); }
                }
                container=null;icon=null;prod=null;help=null;
                raiseEvent("gameCarpentryOpened");
            break;}
            }
        }catch(err){GM_logError("showForestryProductionBox\n"+err);}
    });
    unsafeOverwriteFunction("showForestrySelection",function(type,slot){
        try{
            unsafeWindow._showForestrySelection(type,slot);
        }catch(err){GM_logError("_showForestrySelection\n"+err);}
        try{
            if(!type){ type=1; }
            if(!slot){ slot=1; }
            var container,div;
            var zoneNrF,iProd,iTime;
            switch(type){
            case 1: zoneNrF="sawmill"; break;
            case 2: zoneNrF="carpentry"; break;
            }
            container=$("forestry_selectproduction_scrollcontent");
            for(var i=container.childElementCount-1;i>=0;i--){
                div=container.children[i].firstElementChild;
                iProd=parseInt(/f_symbol(\d+)/.exec(div.className)[1],10);
                iTime=calcProductionTime(zoneNrF,1,iProd,1-zones.getBonus(zoneNrF)/100);
                div2=createElement("div",{"style":"float:left;margin-right:10px;"});
                div.parentNode.insertBefore(div2,div);
                div.removeAttribute("style");
                div2.appendChild(div);
                createElement("div",{},div2,numberFormat(prodStock[1][iProd]));
                div=container.children[i].children[1].children[1];
                div.innerHTML="";
                div.style.height="14px";
                div2=createElement("div",{"class":"forestry_growing"},div);
                createElement("div",{"style":"float:left;margin-right:5px;"},div,getTimeStr(iTime,true)+"&nbsp;"+getText("shortHours"));
                div2=createElement("div",{"style":"float:left;height:15px;width:15px;margin-right:5px;"},div);
                createElement("img",{"src":GFX+"adtime.gif","style":"width:14px;height:14px;"},div2);
                div2=createElement("div",{"style":"float:left;"},div);
                clocks.add("forestrySelection_"+iProd,div2,iTime);
            }
            raiseEvent("game"+zoneNrF.capitalize()+"SlotOpened");
        }catch(err){GM_logError("showForestrySelection\n"+err);}
    });
    unsafeOverwriteFunction("showForestryBuildingInner",function(type){
        try{
            unsafeWindow._showForestryBuildingInner(type);
        }catch(err){GM_logError("_showForestryBuildingInner\n"+err);}
        try{
            switch(type){
            case 1:{// sawmill
                raiseEvent("gameSawmillOpened");
            break;}
            case 2:{ // carpentry
                raiseEvent("gameCarpentryOpened");
            break;}
            }
        }catch(err){GM_logError("showForestryBuildingInner\n"+err);}
    });
    /*
    createElement("div",{"id":"analyzediv","style":"position: fixed; top: 0px; right: 0px; z-index: 995; display: block;","class":"blackbox"},ALL);
    $("analyzediv").addEventListener("click",function(){this.innerHTML="";},false);
    unsafeOverwriteFunction("forestrySetStatus",function(position,status,product){
        unsafeWindow._forestrySetStatus(position,status,product);
        var str = 'forestry_area_run       = '+unsafeWindow.forestry_area_run      [position]+'<br>'+
                  'forestry_area_time      = '+unsafeWindow.forestry_area_time     [position]+'<br>'+
                  'forestry_area_watertime = '+unsafeWindow.forestry_area_watertime[position]+'<br>'+
                  'forestry_area_name      = '+unsafeWindow.forestry_area_name     [position]+'<br>'+
                  'forestry_area_pid       = '+unsafeWindow.forestry_area_pid      [position];
        for(var j = 0 ; j < unsafeWindow.forestry_area.length ; j++)    {
            if(unsafeWindow.forestry_area[j])   {
                if(unsafeWindow.forestry_area[j]['position'] == position){
                    str ="forestry_area["+j+"]="+implode(unsafeWindow.forestry_area[j]);
                }
            }
        }
        GM_log(str);
        $("analyzediv").innerHTML=str;
    });
    */


    function doForestry(){
    try{
        gameLocation=["forestry",null];
        unsafeData.gameLocation=gameLocation.clone();
        var nowServer=unsafeWindow.Zeit.Server;
        var zoneNrF,zoneNrS,tempZoneProductionData,tempZoneProductionDataSlot,currBlock,currBonus;
        // GM_log("forestry_slots:\n"+print_r(unsafeWindow.forestry_slots,"",true,"\n"));
        // Sawmill and carpentry
        var err_trace="forestry_user_buildings";
        if(unsafeWindow.forestry_user_buildings){
            var res,iProd,iAmount,iPoints,iTime,maxCapacity,iSlotCount;
            for(var building in unsafeWindow.forestry_user_buildings){ //forestry_user_buildings==initForestryResponce->result[2]
                if(!unsafeWindow.forestry_user_buildings.hasOwnProperty(building)){continue;}
                switch(building){
                case "1": zoneNrF="sawmill";break;
                case "2": zoneNrF="carpentry";break;
                default: continue;
                }
                // GM_log("forestry_user_buildings["+building+"]:\n"+print_r(unsafeWindow.forestry_user_buildings[building],"",true,"\n"));
                //building=getForestryUserBuilding(i);
                currBlock=(unsafeWindow.forestry_user_buildings[building]["locked"]?"q":"");
                zones.setBlock(zoneNrF,currBlock);
                if(zones.isMultiSlot(zoneNrF)){
                    iSlotCount=3;
                    if(!currBlock){
                        for(var slot=1;slot<=3;slot++){
                            zoneNrS=zoneNrF+"."+slot;
                            zones.setBlock(zoneNrS,((slot==1)||(unsafeWindow.forestry_slots[building]&&unsafeWindow.forestry_slots[building][slot]))?"":"b");
                        }
                    }
                }else{
                    iSlotCount=0;
                }
                if(!currBlock){
                    zones.setBonus(zoneNrF,unsafeWindow.forestry_user_buildings[building]["boni"]?unsafeWindow.forestry_user_buildings[building]["boni"]:0);
                    // maxCapacity=unsafeWindow.forestry_user_buildings[building]?unsafeWindow.forestry_user_buildings[building]["capacity"]:100;
                    res=(unsafeWindow.forestry_user_buildings[building]&&unsafeWindow.forestry_user_buildings[building]["slots"])?unsafeWindow.forestry_user_buildings[building]["slots"]:{};
                    
                    tempZoneProductionData=[[{},{}],0,0,true];
                    for(var slot=1;slot<=(iSlotCount==0?1:iSlotCount);slot++){
                        if(DEVMODE){ GM_log("doForestry zoneNrF="+zoneNrF+" slot="+slot+" res["+slot+"]="+implode(res[slot],"res")); }
                        if(iSlotCount>0){
                            zoneNrS=zoneNrF+"."+slot;
                        }else{
                            zoneNrS=zoneNrF;
                        }
                        if(!zones.getBlock(zoneNrS)){
                            tempZoneProductionDataSlot=[[{},{}],0,0,true];
                            if(res[slot]){
                                iProd=(res[slot]["productid"]?parseInt(res[slot]["productid"],10):null);
                                if(isNaN(iProd)){ iProd=null; }
                                    // &&maxCapacity<(prodStock[1][iProd]+((iStock+1)*prodYield[1][iProd]))){
                                    // tempZoneProductionData["block"][slot]=true;
                                    // if(tempZoneProductionData["block"].length()==1){
                                    //  logBubble.add("Max stock capacity reached for<br>"+prodName[1][iProd],10,"red");
                                    // }
                                if((iProd!=null)&&(res[slot]["ready"]==2)){ // production busy
                                    iTime=nowServer+res[slot]["remain"]; 
                                }else if((iProd!=null)&&(res[slot]["ready"]==1)){ // production ready
                                    iTime=nowServer;
                                }else{
                                    iTime=NEVER;
                                    tempZoneProductionData[1]++;
                                    tempZoneProductionDataSlot[1]++;
                                }
                                tempZoneProductionData[2]++;
                                tempZoneProductionDataSlot[2]++;
                                if(iProd!=null){
                                    iAmount=prodYield[1][iProd];
                                    iPoints=iAmount*prodPoints[1][iProd];
                                    if(!tempZoneProductionData[0][1][iProd]){ tempZoneProductionData[0][1][iProd]=[]; }
                                    tempZoneProductionData[0][1][iProd].push([iAmount,iPoints,iTime,NEVER]);
                                    if(!tempZoneProductionDataSlot[0][1][iProd]){ tempZoneProductionDataSlot[0][1][iProd]=[]; }
                                    tempZoneProductionDataSlot[0][1][iProd].push([iAmount,iPoints,iTime,NEVER]);
                                }
                            }
                            if(iSlotCount>0){
                                zones.setProduction(zoneNrS,tempZoneProductionDataSlot.clone());
                            }
                        }
                    }
                    zones.setProduction(zoneNrF,tempZoneProductionData.clone());
                    //auto-cropping
                    if(iSlotCount=0){
                        var div;
                        if((top.unsafeData.autoAction==null) && valAutoCrop["forestry"] && (zones.getEndtime(zoneNrF)<=unsafeWindow.Zeit.Server) && (div=$("forestry_building_click"+building))){
                            top.unsafeData.autoAction="berater: forestry building crop";
                            document.addEventListener("gameOpenGlobalCommitBox",function(){
                                document.removeEventListener("gameOpenGlobalCommitBox",arguments.callee,false);
                                window.setTimeout(function(){ 
                                    click($("globalcommitboxfooter").firstElementChild);
                                    top.unsafeData.autoAction=null;
                                },500);
                            });
                            window.setTimeout(function(div){ click(div); },500,div);
                        }
                        div=null;
                    }
                    createZoneTimer("zoneTimer_"+zoneNrF,zoneNrF,"zonetimer","position:absolute;top:5px;left:50px;",$("forestry_building"+building));
                }
            }
            building=null;res=null;iProd=null;iTime=null;maxCapacity=null;
        }
        // Forest
        zoneNrF="forest";
        err_trace="forest";
        if(unsafeWindow.forestry_unlock){
            var res,zoneNrF,iProd,iProd2,iTime,iWaterTime,building,maxCapacity,div;
            //GM_log("doForestry zoneNrF:"+zoneNrF);
            //maxCapacity=((building=getForestryUserBuilding(1))&&unsafeWindow.forestry_user_buildings[building])?unsafeWindow.forestry_user_buildings[building]['capacity']:100;
            tempZoneProductionData=[[{},{}],BUILDING_SIZE["forest"],BUILDING_SIZE["forest"],true];
            zones.setBlock(zoneNrF,"");
            currBonus=((div=$("forestry_forest_button1_info_locked"))&&(div.style.display=="block")?0:5);
            if(questData["forestry"]["1"]["nr"]>75){ currBonus+=5; }
            zones.setBonus(zoneNrF,currBonus);
            for(var slot in unsafeWindow.forestry_area){ //forestry_area==initForestryResponce->result[1]
                if(!unsafeWindow.forestry_area.hasOwnProperty(slot)){continue;}
                //if(DEVMODE){ GM_log("doFestry zoneNrF:"+zoneNrF+" slot:"+slot+" res:"+implode(res,"res")); }
                res=unsafeWindow.forestry_area[slot];
                iProd=parseInt(res["productid"],10); // the saplings
                if(unsafeWindow.forestry_production_products[res["category"]]){
                    iProd2=unsafeWindow.forestry_production_products[res["category"]][iProd][5]; // the tree
                }else{
                    iProd2=null;
                }
                if(res["category"]==0){ // garbage
                    if(!tempZoneProductionData[0][1][iProd]){ tempZoneProductionData[0][1][iProd]=0; }
                    tempZoneProductionData[0][1][iProd]++;
                    tempZoneProductionData[1]--;
                    tempZoneProductionData[2]--;
                }else{
                    // if(maxCapacity<(prodStock[1][iProd2]+((iStock+1)*prodYield[1][iProd2]))){
                    //  //TODO maybe maxCapacity needed for wood-cuttings
                    //  iTime=NEVER;
                    //  iWaterTime=NEVER;
                    //  if(tempZoneProductionData["block"].length()==1){
                    //      logBubble.add("Max stock capacity reached for<br>"+prodName[1][iProd2],10,"red");
                    //  }
                    if(res["block"]>0){ //production has animal on it
                        tempZoneProductionData[1]--;
                        iTime=NEVER;
                        iWaterTime=NEVER;
                    }else if(res["ready"]){
                        tempZoneProductionData[1]--;
                        if(res["ready"]==2){ //production busy, "duration" is reduced by watering
                            iTime=parseInt(res["duration"],10)+parseInt(res["createdate"],10);
                            if(zones.getBonus(zoneNrF)>0){
                                iWaterTime=parseInt(res["waterdate"],10);
                                iWaterTime=((iWaterTime==0)?parseInt(res["createdate"],10):(iWaterTime+86400<iTime?iWaterTime+86400:NEVER));
                            }else{
                                iWaterTime=NEVER;
                            }
                        }else if(res["ready"]==1){ //production ready
                            iTime=parseInt(res["duration"],10)+parseInt(res["createdate"],10);
                            iWaterTime=NEVER;
                        }else{
                            // does this case exist?
                            iTime=NEVER;
                            iWaterTime=NEVER;
                        }
                    }else{
                        iTime=NEVER;
                        iWaterTime=NEVER;
                    }
                    iAmount=prodYield[1][iProd];
                    iPoints=iAmount*prodPoints[1][iProd];                
                    if(tempZoneProductionData[0][1][iProd]){
                        var notfound=true;
                        for(var i=0;i<tempZoneProductionData[0][1][iProd].length;i++){
                            if((tempZoneProductionData[0][1][iProd][i][2]==iTime)&&(tempZoneProductionData[0][1][iProd][i][3]==iWaterTime)){
                                tempZoneProductionData[0][1][iProd][i][0]+=iAmount;
                                tempZoneProductionData[0][1][iProd][i][1]+=iPoints;
                                notfound=false;break;
                            }
                        }
                        if(notfound){ tempZoneProductionData[0][1][iProd].push([iAmount,iPoints,iTime,iWaterTime]); }
                    }else{
                        tempZoneProductionData[0][1][iProd]=[[iAmount,iPoints,iTime,iWaterTime]];
                    }
                    if(iProd2!=null){
                        iAmount=prodYield[1][iProd2];
                        iPoints=iAmount*prodPoints[1][iProd2];                  
                        if(tempZoneProductionData[0][1][iProd2]){
                            var notfound=true;
                            for(var i=0;i<tempZoneProductionData[0][1][iProd2].length;i++){
                                if((tempZoneProductionData[0][1][iProd2][i][2]==iTime)&&(tempZoneProductionData[0][1][iProd2][i][3]==iWaterTime)){
                                    tempZoneProductionData[0][1][iProd2][i][0]+=iAmount;
                                    tempZoneProductionData[0][1][iProd2][i][1]+=iPoints;
                                    notfound=false;break;
                                }
                            }
                            if(notfound){ tempZoneProductionData[0][1][iProd2].push([iAmount,iPoints,iTime,iWaterTime]); }
                        }else{
                            tempZoneProductionData[0][1][iProd2]=[[iAmount,iPoints,iTime,iWaterTime]];
                        }
                    }
                }
            }
            zones.setProduction(zoneNrF,tempZoneProductionData.clone());
            // auto-watering
            if((top.unsafeData.autoAction==null)&&valAutoWater["forestry"]&&(zones.getWatertime(zoneNrF)<=unsafeWindow.Zeit.Server)&&(zones.getBonus(zoneNrF)>0)&&(zones.getProduction(zoneNrF)[1]==0)&&(div=$("forestry_forest_button1"))){
                top.unsafeData.autoAction="berater: forest water";
                window.setTimeout(function(div){
                    click(div);
                    top.unsafeData.autoAction=null;
                },500,div);
            }
            //auto-cropping
            if((top.unsafeData.autoAction==null)&&valAutoCrop["forestry"]&&(zones.getEndtime(zoneNrF)<=unsafeWindow.Zeit.Server) && (!((div=$("forestry_forest_button2_premium"))&&(div.style.display=="block")))&&(div=$("forestry_forest_button2"))){
                top.unsafeData.autoAction="berater: forest crop";
                window.setTimeout(function(div){ 
                    click(div);
                    top.unsafeData.autoAction=null;
                },500,div.firstElementChild);
            }
            //zonetimer
            div=$("forestry_forest");
            createZoneTimer("zoneTimer_"+zoneNrF,zoneNrF,"zonetimer","position:absolute;top:-20px;right:0;",div);
            if(zones.getBonus(zoneNrF)>0){ createZoneTimer("zoneTimerWater_"+zoneNrF,zoneNrF,"zoneTimerWater","position:absolute;top:-40px;right:0;",div); }
            // stock
            unsafeWindow.forestrySetStockItem(1,Math.max(1,unsafeWindow.forestry_plant),Math.max(1,unsafeWindow.forestry_plant));
            for(var v=1;v<=8;v++){
                if(div=$("f_stock_item"+v)){
                    iProd=parseInt(/f_symbol(\d+)/.exec(div.firstElementChild.className)[1],10);
                    if(iProd&&(div=$("f_stock_growing_"+v))){
                        iTime=calcProductionTime("forest",1,iProd,1-zones.getBonus("forest")/100);
                        div.innerHTML=getTimeStr(iTime,true)+"&nbsp;"+getText("shortHours");
                    }
                }
            }           
            // farmies
            for(var i=0;i<unsafeWindow.forestry_farmis.length;i++){
                // GM_log("unsafeWindow.forestry_farmis["+i+"]:\n"+print_r(unsafeWindow.forestry_farmis[i],"",true,"\n"));
                iTime=[0,0];
                for(var j=0;j<unsafeWindow.forestry_farmis[i]["products"].length;j++){
                    iProd = unsafeWindow.forestry_farmis[i]["products"][j]["product"];
                    if(prodTyp[1][iProd]=="f3"){
                        iTime[0]+=calcProductionTime("sawmill",1,iProd,1-zones.getBonus("sawmill")/100)*unsafeWindow.forestry_farmis[i]["products"][j]["amount"]/prodYield[1][iProd];
                    } else if(prodTyp[1][iProd]=="f4"){
                        iTime[1]+=calcProductionTime("carpentry",1,iProd,1-zones.getBonus("carpentry")/100)*unsafeWindow.forestry_farmis[i]["products"][j]["amount"]/prodYield[1][iProd];
                    }
                    if(typeof prodRequire[1][iProd]=="object"){
                        for(var k=0;k<prodRequire[1][iProd].length;k++){
                            iProd2=prodRequire[1][iProd][k];
                            if(prodTyp[iProd2[0]][iProd2[1]]=="f3"){
                                iTime[0]+=calcProductionTime("sawmill",iProd2[0],iProd2[1],1-zones.getBonus("sawmill")/100)*unsafeWindow.forestry_farmis[i]["products"][j]["amount"]*iProd2[2]/prodYield[iProd2[0]][iProd2[1]];
                            } else if(prodTyp[iProd2[0]][iProd2[1]]=="f4"){
                                iTime[1]+=calcProductionTime("carpentry",iProd2[0],iProd2[1],1-zones.getBonus("carpentry")/100)*unsafeWindow.forestry_farmis[i]["products"][j]["amount"]*iProd2[2]/prodYield[iProd2[0]][iProd2[1]];
                            }
                        }
                    }
                }
                div=$("forestry_farmi_info"+(1+i));
                if(div&&div.parentNode){
                    newDiv=$("forestry_farmi_info"+(i+1)+"_createdate");
                    if(!newDiv){
                        newDiv=createElement("div",{"id":"forestry_farmi_info"+(i+1)+"_createdate"});
                        div.insertBefore(newDiv,div.firstElementChild);
                    }
                    newDiv.innerHTML=getDateStr(unsafeWindow.forestry_farmis[i]["createdate"]);
                }
                div=$("forestry_farmi_info_price"+(1+i));
                if(div&&div.parentNode){
                    newDiv=$("forestry_farmi_info"+(i+1)+"_time_sawmill");
                    if(!newDiv){
                        newDiv=createElement("div",{"id":"forestry_farmi_info"+(i+1)+"_time_sawmill"});
                        div.parentNode.parentNode.insertBefore(newDiv,div.parentNode);
                    }
                    newDiv.innerHTML=getText("sawmill")+": "+getTimeStr(iTime[0],true)+"&nbsp;"+getText("shortHours");
                    newDiv=$("forestry_farmi_info"+(i+1)+"_time_carpentry");
                    if(!newDiv){
                        newDiv=createElement("div",{"id":"forestry_farmi_info"+(i+1)+"_time_carpentry"});
                        div.parentNode.parentNode.insertBefore(newDiv,div.parentNode);
                    }
                    newDiv.innerHTML="("+getText("carpentry")+": "+getTimeStr(iTime[1],true)+"&nbsp;"+getText("shortHours")+")";
                    newDiv=$("forestry_farmi_info_price"+(i+1)+"_norm");
                    if(!newDiv){
                        newDiv=createElement("span",{"id":"forestry_farmi_info_price"+(i+1)+"_norm","style":"font-size:8pt;"},div.parentNode);
                    }
                    newDiv.innerHTML="&nbsp;("+moneyFormatInt(unsafeWindow.forestry_farmis[i]["price"]*86400/iTime[0])+"/d)";
                }
                div=$("forestry_farmi_info_points"+(1+i));
                if(div&&div.parentNode){
                    div.innerHTML=numberFormat(unsafeWindow.forestry_farmis[i]["points"]);
                    newDiv=$("forestry_farmi_info_points"+(i+1)+"_norm");
                    if(!newDiv){
                        newDiv=createElement("span",{"id":"forestry_farmi_info_points"+(i+1)+"_norm","style":"font-size:8pt;"},div.parentNode);
                    }
                    newDiv.innerHTML="&nbsp;("+numberFormat(unsafeWindow.forestry_farmis[i]["points"]*86400/iTime[0])+"/d)";
                }
            }
            res=null;pos=null;iProd=null;iProd2=null;iTime=null;iWaterTime=null;iStock=null;building=null;maxCapacity=null;
        }else{
            zones.setBlock(zoneNrF,"q");
            zones.setBonus(zoneNrF,0);
        }
        zoneNrF=null;tempZoneProductionData=null;tempZoneProductionDataSlot=null;
        calcTotalZones();
        err_trace="saving";
        publishProductData();
    }catch(err){GM_logError("doForestry ("+err_trace+")\n"+err);}
    }
    
    function forestryScrapTreeLog(step,treeId,amount){
        // GM_log("forestryScrapTreeLog BEGIN step="+step+" treeId="+treeId);
        var action=null,listeningEvent=null;
        switch(step){
        case 1: // click the production icon
            if(amount>0){
                logBubble.add("Scrapping Tree Log: tree "+treeId+", left "+amount);
                listeningEvent="gameOpenGlobalCommitBox";
                action=function(){ click($("forestry_slot_products"+(3*treeId-2))); };
            }
        break;
        case 2: // click OK. sawmill will be reopened
            listeningEvent="gameSawmillOpened";
            action=function(){ click($("globalcommitboxfooter").children[0]); };
        break;
        case 3: // click Abort
            listeningEvent="gameOpenGlobalCommitBox";
            action=function(){ click($("forestry_slot_cancel"+unsafeWindow.currentslot)); };            
        break;
        case 4: // click OK. sawmill will be reopened
            listeningEvent="gameSawmillOpened";
            action=function(){ click($("globalcommitboxfooter").children[0]); };
        break;
        case 5: // open production menu again
            amount--;step=0;
            listeningEvent="gameSawmillSlotOpened";
            action=function(){ click($("forestry_slot"+unsafeWindow.currentslot)); };
        break;
        }
        if(listeningEvent){
            document.addEventListener(listeningEvent,function(listeningEvent,step,treeId,amount){
                return function(){
                    document.removeEventListener(listeningEvent,arguments.callee,false);
                    window.setTimeout(function(){ forestryScrapTreeLog(step+1,treeId,amount); },300);
                };
            }(listeningEvent,step,treeId,amount),false);
        }
        if(action){ action(); }
        listeningEvent=null;action=null;
    }
    
    unsafeOverwriteFunction("forestryBuySlotResponse",function(request,b){
        try{
            unsafeWindow._forestryBuySlotResponse(request,b);
        }catch(err){GM_logError("_forestryBuySlotResponse\n"+err);}
        try{
            var result = checkRequest(request);
            if(result){
                if(DEVMODE){ GM_log("forestryBuySlotResponse result:"+implode(result)); }
                doForestry();
                calcProdMinRack();
            }
        }catch(err){GM_logError("forestryBuySlotResponse \n"+err);}
    });
    unsafeOverwriteFunction("initCampaignsResponse",function(request,update){
        try{
            unsafeWindow._initCampaignsResponse(request,update);
        }catch(err){GM_logError("_initCampaignsResponse\n"+err);}
        try{
            var result = checkRequest(request);
            if(result&&result[0]!=0){
                if(DEVMODE){ GM_log("initCampaignsResponse"); }
                // GM_log("initCampaignsResponse result="+implode(result));
                //if(DEVMODE){ GM_log("campaign: result:"+print_r(result)); }
                for(campaign in QUESTS["forestry"]){
                    if(!QUESTS["forestry"].hasOwnProperty(campaign)){continue;}
                    if(result[1][campaign]){
                        if(result[1][campaign]==0){
                            // campaign not available
                            var newforestryQuestNr = 0;
                            if(questData["forestry"][campaign]["nr"]!=newforestryQuestNr){
                                questData["forestry"][campaign]["nr"]=newforestryQuestNr;
                                if(questData["forestry"][campaign]["calcTo"]!=0){
                                    setCalcToQuest("forestry",campaign,0);
                                }
                            }
                        }else{
                            // quest available
                            /*
                            GM_log("initCampaignsResponse\ncampaign="+campaign+"\nresult[1][campaign]:\n"+print_r(result[1][campaign],"",true,"\n"));
                            [1]{1}{1}[0]{8} = 300
                            [1]{1}{1}[0]{6} = 2000
                            [1]{1}{entries}{1}[0]{productid} = 8
                            [1]{1}{entries}{1}[0]{sum} = 300
                            [1]{1}{entries}{1}[0]{type} = 1
                            
                            [1]{1}{1}[0]{24} = 1800
                            [1]{1}{1}[1]{21} = 12
                            [1]{1}{1}[1]{41} = 10
                            [1]{1}{entries}{1}[0]{productid} = 24
                            [1]{1}{entries}{1}[0]{sum} = 1800
                            [1]{1}{entries}{1}[0]{type} = 1
                            [1]{1}{entries}{2}[0]{productid} = 21
                            [1]{1}{entries}{2}[0]{sum} = 12
                            [1]{1}{entries}{2}[0]{type} = 2
                            [1]{1}{entries}{2}[1]{productid} = 41
                            [1]{1}{entries}{2}[1]{sum} = 9
                            [1]{1}{entries}{2}[1]{type} = 2
                            */
                            // Time
                            if(result[1][campaign]["remain"]){
                                questData["forestry"][campaign]["time"] = now+result[1][campaign]["remain"];
                            }else if(now<questData["forestry"][campaign]["time"]){
                                questData["forestry"][campaign]["time"] = now;
                            }
                            // Given
                            questData["forestry"][campaign]["given"] = new Object();
                            if(result[1][campaign]["entries"]){
                            for(var t in result[1][campaign]["entries"]){
                                if(!result[1][campaign]["entries"].hasOwnProperty(t)){continue;}
                                for(var i=0;i<result[1][campaign]["entries"][t].length;i++){
                                    var prod = result[1][campaign]["entries"][t][i]["productid"];
                                    var type = parseInt(t,10)-1;
                                    if(!questData["forestry"][campaign]["given"][type]){ questData["forestry"][campaign]["given"][type] = new Object(); }
                                    if(!questData["forestry"][campaign]["given"][type][prod]){ questData["forestry"][campaign]["given"][type][prod] = 0; }
                                    questData["forestry"][campaign]["given"][type][prod] += parseInt(result[1][campaign]["entries"][t][i]["sum"],10);
                                }
                            }
                            }
                            // Number
                            var newforestryQuestNr = parseInt(result[1][campaign]["questid"],10);
                            if((questData["forestry"][campaign]["nr"]!=newforestryQuestNr)||(typeof questData["forestry"][campaign]["nr"]!=typeof newforestryQuestNr)){
                                questData["forestry"][campaign]["nr"]=newforestryQuestNr;
                                if((0<questData["forestry"][campaign]["calcTo"])&&(questData["forestry"][campaign]["calcTo"]<questData["forestry"][1]["nr"])){
                                    setCalcToQuest("forestry",campaign,questData["forestry"][campaign]["nr"]);
                                }
                            }
                            // Data
                            calcQuestData("forestry",campaign);
                        }
                    }else{
                        // all quests solved
                        var newforestryQuestNr = QUESTS["forestry"][campaign].length;
                        if(questData["forestry"][campaign]["nr"]!=newforestryQuestNr){
                            questData["forestry"][campaign]["nr"]=newforestryQuestNr;
                            if(questData["forestry"][campaign]["calcTo"]!=0){
                                setCalcToQuest("forestry",campaign,0);
                            }
                        }
                    }
                }
                handleQuestLine();
                GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_questData",implode(questData));
                unsafeData.questData=questData.clone();
                //GM_log("onclick:"+$('forestry_quest_entry' + forestryCampaignNr + '_' + questData["forestry"][1]["nr"] + '_1_6').onclick);
    
                //make prodName[1] && forestry_stock
                    //GM_log("initCampaignsResponse bChanged:"+ bChanged+" prodName:"+implode(prodName));
                try{
                    var store, fId, bChanged=false;
                    prodStock[1]= new Object();
                    for(store in result[3]){ //forestry_stock
                        if (!result[3].hasOwnProperty(store)){ continue; }
                        for(fId in result[3][store]){
                            if (!result[3][store].hasOwnProperty(fId)){ continue; }
                            // if (!prodName[1][fId]){
                            //  prodName[1][fId] = result[3][store][fId]["name"]; // set prodName[1]
                            //  //GM_log("initCampaignsResponse ADD prodName stock fId:"+fId+" name:"+prodName[1][fId]);
                            //  bChanged=true;
                            // }
                            if(!prodStock[1][fId]) prodStock[1][fId]=0;
                            prodStock[1][fId] += parseInt(result[3][store][fId]["amount"],10);
                        }
                    }
                    for(fId in prodName[1]){
                        if (!prodName[1].hasOwnProperty(fId)){ continue; }
                        if(!prodStock[1][fId]){ prodStock[1][fId]=0; }
                    }
                    store=null;fId=null;
                    // GM_log("initCampaignsResponse bChanged:"+ bChanged+" prodName:"+implode(prodName));
                    if(bChanged){
                        // prodName[1].sortObj();
                        GM_setValueCache(COUNTRY+"_"+SERVER+"_prodName",implode(prodName));
                    }
                    // prodStock[1].sortObj();
                    GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodStock",implode(prodStock));
                }catch(err){GM_logError("initCampaignsResponse \n"+err);}
                updateProductDataForestry();
                calcProdMinRack();
                raiseEvent("gameOpenCampaign");
            }
        }catch(err){GM_logError("initCampaignsResponse\n"+err);}
    });

    // events city 1 ==============================================================================
    err_trace="events city 1";
    unsafeOverwriteFunction("cityActionResponse",function(request,mode,f,e,d,c){
        try{
            unsafeWindow._cityActionResponse(request,mode,f,e,d,c);
        }catch(err){GM_logError("_cityActionResponse\nj="+mode+"\n"+err);}
        try{
            var result = checkRequest(request);
            if((result!=0)&&(result[0]!=0)){
                switch(mode){
                case "windmillinit": raiseEvent("gameOpenWindmill"); break;
                case "windmillcrop": raiseEvent("gameWindmillCropped"); break;
                case "windmillstartproduction": raiseEvent("gameWindmillStarted"); break;
                }
            }
        }catch(err){GM_logError("cityActionResponse\nmode="+mode+"\n"+err);}
    });
    unsafeOverwriteFunction("cityArrived",function(questbox){
        try{
            unsafeWindow._cityArrived(questbox);
        }catch(err){GM_logError("_cityArrived\n"+err);}
        try{
            gameLocation=["city",unsafeWindow.city];
            unsafeData.gameLocation=gameLocation.clone();
            raiseEvent("gameCity"+unsafeWindow.city);
        }catch(err){GM_logError("cityArrived\n"+err);}
    });
    // unsafeOverwriteFunction("initCity",function(e, c, d){
    //  try{
    //      unsafeWindow._initCity(e, c, d);
    //  }catch(err){GM_logError("_initCity\ne="+e+"\nc="+c+"\nd="+d+"\n"+err);}
    // });

    // Werbung
    unsafeOverwriteFunction("fillAdColumn",function(){
        try{
            unsafeWindow._fillAdColumn();
        }catch(err){GM_logError("_fillAdColumn\n"+err);}
        try{
            var images=$("adzonetooltip1").getElementsByTagName("img");
            if(COUNTRY=="SE"){
                $("adzonetooltip1").firstElementChild.innerHTML=$("adzonetooltip1").firstElementChild.innerHTML.replace(/\.(\d\d) /,",$1 ");
            }
            var preis=parseFloat(/&nbsp;(.*)/.exec($("adzonetooltip1").firstElementChild.innerHTML)[1].replace(regDelimThou,"").replace(regDelimDeci,"."),10);
            createElement("div",{},$("adzonetooltip1"),"<img width='12' height='12' src='"+images[0].getAttribute("src")+"'>/<img width='12' height='12' src='"+images[2].getAttribute("src")+"'>&nbsp;"+moneyFormatInt(preis/8));
    
            var preis=gut[0]*parseInt(/&nbsp;(\d*)/.exec($("adzonetooltip2").firstElementChild.innerHTML)[1],10);
            createElement("div",{},$("adzonetooltip2"),"<img width='12' height='12' src='"+images[0].getAttribute("src")+"'>/<img width='12' height='12' src='"+images[2].getAttribute("src")+"'>&nbsp;"+moneyFormatInt(preis/16));
            $("adzonetooltip2").firstElementChild.innerHTML +="&nbsp;("+moneyFormatInt(preis)+")";
    
            var preis=gut[0]*parseInt(/&nbsp;(\d*)/.exec($("adzonetooltip3").firstElementChild.innerHTML)[1],10);
            createElement("div",{},$("adzonetooltip3"),"<img width='12' height='12' src='"+images[0].getAttribute("src")+"'>/<img width='12' height='12' src='"+images[2].getAttribute("src")+"'>&nbsp;"+moneyFormatInt(preis/24));
            $("adzonetooltip3").firstElementChild.innerHTML +="&nbsp;("+moneyFormatInt(preis)+")";
            images=null;
        }catch(err){GM_logError("fillAdColumn\n"+err);}
    });

    // Marktschreier
    unsafeOverwriteFunction("openMarktschreiberResponse",function(response){
        try{
            unsafeWindow._openMarktschreiberResponse(response);
        }catch(err){GM_logError("_openMarktschreiberResponse\n"+err);}
        try{
            var div,container;
            container=$("marktschreierinnercontent");
            for(var v=0;v<container.childElementCount;v++){
                if(container.children[v].nodeName=="DIV"){
                    div=container.children[v].getElementsByTagName("div")[1];
                    var player=(/\?to=(.*)';/).exec(div.getElementsByTagName("img")[0].getAttribute("onclick"))[1];
                    stats(player,div);
                }
            }
            div=null;container=null;
        }catch(err){GM_logError("openMarktschreiberResponse\n"+err);}
    });
    // Competition
    unsafeOverwriteFunction("setCityWBWContentResponse",function(request){
        try{
            unsafeWindow._setCityWBWContentResponse(request);
        }catch(err){GM_logError("_setCityWBWContentResponse\n"+err);}
        try{
            var result=checkRequest(request);
            if(result){
            window.setTimeout(function(result){
                if(result[1]['open']==1){
                    var product=parseInt(result[1]['wettbewerb_produkt'],10);
                    GM_setValue(COUNTRY+"_"+SERVER+"_competition",implode([product,result[1]['wettbewerb_ende']]));
                }else{
                    var help=explode(GM_getValue(COUNTRY+"_"+SERVER+"_competition","[]"),"setCityWBWContentResponse/competition",[]);
                    if(help[1]==result[1]["wettbewerb_ende"]){
                        var product=help[0];
                    }else{
                        var product=-1;
                    }
                }
                if(product>-1){
                    $('localwbwproduct').innerHTML='<div class="kp' + product + '" style="position:absolute; width:15px; height:15px;"></div>';
                    $('localwbwproductname').innerHTML=prodName[0][product];
                }

                cand=document.querySelectorAll("#wbwcontent2ranking>div");
                var newdiv,c,sum=0;
                for(var v=1;v<cand.length;v++){
                    newdiv=cand[v].getElementsByTagName("div");
                    igm(newdiv[2].innerHTML.replace(/&nbsp;.*/,""),newdiv[2]);
                    newdiv[newdiv.length-2].style.textAlign="right";
                    c=parseInt(newdiv[newdiv.length-2].innerHTML,10);
                    newdiv[newdiv.length-2].innerHTML=numberFormat(c);
                    sum += c;
                }
                if(cand.length>1){ cand[1].style.borderBottom="1px solid black"; }
                if(cand.length>15){ cand[15].style.borderBottom="1px solid black"; }
                if(cand.length>50){ cand[50].style.borderBottom="1px solid black"; }
                newdiv=null;
                $("localwbwproductname").innerHTML += "&nbsp;("+sign_sum+"&nbsp;"+numberFormat(sum)+")";
                if(result[1]['open']!=1){
                    nextproduct=parseInt(result[1]['wettbewerb_produkt'],10);
                    if(nextproduct>0){
                        $("localwbwproductname").innerHTML += "&nbsp;(&rarr;"+prodName[0][nextproduct]+"?)";
                    }
                }
            },0,result);
        }
        }catch(err){GM_logError("setCityWBWContentResponse\n"+err);}
    });

    // events city 2 ==============================================================================
    err_trace="events city 2";
    if(USERLEVEL>=8){
        // arrival in city2
        err_trace="events city 2: arrival in city2";
        document.addEventListener("gameCity2",function(){
            try{
                createZoneTimer("zoneTimer_windmill","windmill","zonetimer","position:absolute;top:80px;left:0px;",$("cityzone_2_1"));

/*
            //QUESTS["forestry"]["campaign"]["nr"][[type,id,amount],waittime,points,more|undefined]
            //more:
            //0,id of type 1 product
            //1,id of type 2 product
            //2,special name
            // Generate QUESTS["forestry"]
                var cand,camp,qnr,inf,maxi,help,help2, forest_quest=new Array(),foresty_prods_after_quest=new Object();
                var cells = $("forestry_questlist_container").querySelectorAll("div[id^=\"forestry_questlist_item\"]");
                for(var i=0;i<cells.length;i++){
                    inf = cells[i].id.replace("forestry_questlist_item","").split("_");
                    camp = inf[0];
                    qnr = inf[1];
                    if (!forest_quest[camp]) forest_quest[camp]= new Array();
                    if (!forest_quest[camp][qnr]) forest_quest[camp][qnr]= [[],,0,[]];
                    cand = $("forestry_quest_require"+camp+"_"+qnr);
                    for(var k=0;k<cand.childElementCount;k=k+2){
                        inf = cand.children[k].id.replace("forestry_quest_entry","").split("_");
                        maxi = $("forestry_quest_amount_max"+camp+"_"+qnr+"_"+inf[2]+"_"+inf[3]).innerHTML;
                        forest_quest[camp][qnr][0].push([parseInt(inf[2],10)-1,parseInt(inf[3],10),parseInt(maxi,10)]);
                        //$("forestry_tt_"+camp+"_"+qnr+"_"+inf[2]+"_"+inf[3])
                    }
                    cand = $("forestry_quest_reward"+camp+"_"+qnr);
                    for(var k=1;k<cand.childElementCount;k++){
                        cand2 = cand.children[k];
                        if(cand2.childElementCount==1){
                            forest_quest[camp][qnr][3].push([2,cand2.children[0].innerHTML]);
                        }else if(cand2.childElementCount==3){
                            if(help = cand2.children[0].className.match(/kp(\d+)/i)){//Not used yet
                                maxi = cand2.children[1].innerHTML.match(/&nbsp;(\d+)x ([A-z]*)/i);
                                forest_quest[camp][qnr][3].push([0,parseInt(help[1],10),parseInt((maxi&&maxi[1]?maxi[1]:1),10)]);
                            }else if(help = cand2.children[0].className.match(/f_m_symbol(\d+)/i)){
                                maxi = cand2.children[1].innerHTML.match(/&nbsp;(\d+)x ([A-z]*)/i);
                                forest_quest[camp][qnr][3].push([1,parseInt(help[1],10),parseInt((maxi&&maxi[1]?maxi[1]:1),10)]);
                                foresty_prods_after_quest[parseInt(help[1],10)]= qnr;
                            }else if(help=cand2.children[1].innerHTML.match(/\&nbsp;(\d+)\&nbsp;punten/i)){
                                forest_quest[camp][qnr][2]=parseInt(help[1],10);
                            }else{
                                forest_quest[camp][qnr][3].push([2,cand2.children[1].innerHTML]);
                            }
                        }
                    }
                }
                cells=null;cand=null;inf=null;help=null;cand2=null;
                GM_log("forest_quest"+implode(forest_quest));
                GM_log("foresty_prods_after_quest"+implode(foresty_prods_after_quest));
*/

            //make forestry naming
            /*
                var cand,camp,qnr,inf,maxi,help,help2,bChanged=false;
                var cells = $("forestry_questlist_container").querySelectorAll("div[id^=\"forestry_questlist_item\"]");
                for(var i=0;i<cells.length;i++){
                    inf = cells[i].id.replace("forestry_questlist_item","").split("_");
                    camp = inf[0];
                    qnr = inf[1];
                    cand = $("forestry_quest_require"+camp+"_"+qnr);
                    for(var k=0;k<cand.childElementCount;k=k+2){
                        inf = cand.children[k].id.replace("forestry_quest_entry","").split("_");
                        if(inf[2]==2){
                            prodName[1][inf[3]] = $("forestry_tt_"+camp+"_"+qnr+"_"+inf[2]+"_"+inf[3]).innerHTML; // set prodName[1]
                            //GM_log("gameCity2 ADD prodName quest1 fId:"+inf[3]+" name:"+prodName[1][inf[3]]);
                            bChanged=true;
                        }
                    }
                    cand = $("forestry_quest_reward"+camp+"_"+qnr);
                    for(var k=0;k<cand.childElementCount;k=k+2){
                        inf = cand.children[k].id.replace("forestry_quest_entry","").split("_");
                        if(inf[2]==2){
                            prodName[1][inf[3]] = $("forestry_tt_"+camp+"_"+qnr+"_"+inf[2]+"_"+inf[3]).innerHTML; // set prodName[1]
                            //GM_log("gameCity2 ADD prodName quest2 fId:"+inf[3]+" name:"+prodName[1][inf[3]]);
                            bChanged=true;
                        }
                    }
                    cand = $("forestry_quest_reward"+camp+"_"+qnr);
                    for(var k=1;k<cand.childElementCount;k++){
                        cand2 = cand.children[k];
                        if(cand2.childElementCount==3){
                            if(help = cand2.children[0].className.match(/f_m_symbol(\d+)/i)){
                                maxi = cand2.children[1].innerHTML.match(/&nbsp;((\d+)?x?\s?)?(.*)/i); //OLD &nbsp;((\d+)x\s)?([A-z\s]*)/i);
                                if(maxi[3]){
                                    prodName[1][help[1]] = maxi[3]; // set prodName[1]
                                    //GM_log("gameCity2 ADD prodName quest3 fId:"+help[1]+" name:"+prodName[1][help[1]]+" maix:"+implode(maxi));
                                    bChanged=true;
                                }
                            }
                        }
                    }
                }

                cells=null;cand=null;inf=null;help=null;
                //GM_log("gameCity2 bChanged:"+ bChanged+" prodName:"+implode(prodName));
                if(bChanged){
                    prodName[1].sortObj();
                    GM_setValueCache(COUNTRY+"_"+SERVER+"_prodName",implode(prodName));
                }
                */
            }catch(err){GM_logError("city2 \n"+err+"\n"+cand.innerHTML);}
        },false);
        // windmill production
        err_trace="events city 2: windmillSlots";
        unsafeOverwriteFunction("windmillSlots",function(){
            try{
                unsafeWindow._windmillSlots();  
            }catch(err){ GM_logError("_windmillSlots\n"+err); }
            try{
                var zoneNrF="windmill";
                var zoneNrS;
                zones.setBlock(zoneNrF,"");
                var tempZoneProductionData,tempZoneProductionDataSlot,iProd,iAmount,iPoints,iTime,currBlock;
                var iPrTyp=3;
                tempZoneProductionData=[[],0,0,true];
                tempZoneProductionData[0][iPrTyp]={};
                for(var slot=1;slot<=2;slot++){
                    zoneNrS=zoneNrF+"."+slot;
                    currBlock=(((slot==2)&&(unsafeWindow.windmill_slotremain<=0))?"b":"");
                    zones.setBlock(zoneNrS,currBlock);
                    if(!currBlock){
                        tempZoneProductionDataSlot=[[],0,0,true];
                        tempZoneProductionDataSlot[0][iPrTyp]={};
                        if(unsafeWindow.windmill_slots[slot]){
                            iProd=(unsafeWindow.windmill_slots[slot]["formula"]?parseInt(unsafeWindow.windmill_slots[slot]["formula"],10):null);
                            if(isNaN(iProd)){ iProd=null; }
                            if((iProd!=null)&&(unsafeWindow.windmill_slots[slot]["end"])){ // production ready or busy
                                iTime=parseInt(unsafeWindow.windmill_slots[slot]["end"],10); 
                            }else{ // no production
                                iTime=NEVER;
                                tempZoneProductionData[1]++;
                                tempZoneProductionDataSlot[1]++;
                            }
                            // iAmount=(res[slot]["amount"]?res[slot]["amount"]:null);
                            tempZoneProductionData[2]++;
                            tempZoneProductionDataSlot[2]++;
                            if(iProd!=null){
                                iAmount=prodYield[iPrTyp][iProd];
                                iPoints=iAmount*prodPoints[iPrTyp][iProd];                          
                                if(!tempZoneProductionData[0][iPrTyp][iProd]){ tempZoneProductionData[0][iPrTyp][iProd]=[]; }
                                tempZoneProductionData[0][iPrTyp][iProd].push([iAmount,iPoints,iTime,NEVER]);
                                tempZoneProductionDataSlot[0][iPrTyp][iProd]=[];
                                tempZoneProductionDataSlot[0][iPrTyp][iProd].push([iAmount,iPoints,iTime,NEVER]);
                            }
                        }
                        zones.setProduction(zoneNrS,tempZoneProductionDataSlot.clone());
                    }
                }
                zones.setProduction(zoneNrF,tempZoneProductionData.clone());
                calcTotalZones();
                publishProductData();
            }catch(err){ GM_logError("windmillSlots\n"+err); }
        });
        // windmill stock
        err_trace="events city 2: windmillStock";
        unsafeOverwriteFunction("windmillStock",function(){
            try{
                unsafeWindow._windmillStock();
            }catch(err){GM_logError("_windmillStock\n"+err);}
            try{
                for(var i=0;i<prodStock[2].length;i++){
                    prodStock[2][i]=0;
                }               
                if (unsafeWindow.windmill_stock) {
                    for (var prodId in unsafeWindow.windmill_stock) {
                        prodStock[2][parseInt(prodId,10)]=parseInt(unsafeWindow.windmill_stock[prodId]["amount"],10);
                    }
                }
                //updateProductDataWindmill();
                unsafeData.prodStock = prodStock.clone();
                GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodStock",implode(prodStock,"windmillStock\prodStock"));
            }catch(err){ GM_logError("windmillStock\n"+err); }
        });
        // windmill dialog
        err_trace="events city 2: windmillDialog";
        unsafeOverwriteFunction("windmillDialog",function(mode,q,a){
            try{
                unsafeWindow._windmillDialog(mode,q,a) ;
            }catch(err){ GM_logError("_windmillDialog\n"+err); }
            try{
                switch(mode){
                case "windmillstartproduction": {
                    raiseEvent("gameWindmillDialogStart"); 
                break; }
                case "windmillstartproductioncommit": {
                    var currAmount,currProd;
                    if (unsafeWindow.formulas[0][a] && unsafeWindow.formulas[0][a][3].length) {
                        var m = unsafeWindow.formulas[0][a][3];
                        for (var b = 0; b < m.length; b++) {
                            currProd= m[b][0];
                            currAmount= m[b][1];
                            if(prodStock[0][currProd]-currAmount<prodMinRack[0][currProd]){ 
                                createElement("div",{"class":"blackbox alertbox","style":"position:absolute;left:0;top:240px;"},$("windmill_paper_headline"),getText("alertWillLowRack"));
                                break; 
                            }
                        }
                    }
                    raiseEvent("gameWindmillDialogCommit"); 
                break; }
                }
            }catch(err){GM_logError("windmillDialog\n"+err);}
        });

        // Clothing donation
        err_trace="events city 2: showClothingDonation";
        unsafeOverwriteFunction("showClothingDonation",function(){
            try{
                unsafeWindow._showClothingDonation() ;
            }catch(err){GM_logError("_showClothingDonation\n"+err);}
            try{
                var data = unsafeWindow.clothingdonation_data.data.data;
                var goodsValue = [0,0];
                var div;
                var prodId;
                // input
                var container=$("clothingdonation_inner_left_inner");
                for (var b in data["in"]) {
                    prodId=parseInt(b,10);
                    div=container.querySelector(".l"+prodId).nextElementSibling;
                    div.parentNode.setAttribute("prod",prodId);
                    div.parentNode.setAttribute("class","link");
                    div.parentNode.addEventListener("click",function(event){ showMarket(this.getAttribute("prod")); },false);
                    div.parentNode.addEventListener("mouseover",function(event){ showGoToMarketToolTip(event,this.getAttribute("prod")); },false);                      
                    if(gut[prodId]){
                        goodsValue[0]+=data["in"][b].amount*gut[prodId];
                        div.innerHTML+="<br>"+moneyFormatInt(data["in"][b].amount*gut[prodId]);
                    }else{
                        goodsValue[0]=0;
                        break;
                    }
                }
                createElement("div",{"class":"blackbox","style":"position:absolute;top:70px;left:5px;;"},container,goodsValue[0]>0?moneyFormatInt(goodsValue[0]):"---");
                // output
                container=$("clothingdonation_inner_right_inner");
                for (var b in data["out"]) {
                    prodId=parseInt(b,10);
                    div=container.querySelector(".l"+prodId).nextElementSibling;
                    div.parentNode.setAttribute("prod",prodId);
                    div.parentNode.setAttribute("class","link");
                    div.parentNode.addEventListener("click",function(event){ showMarket(this.getAttribute("prod")); },false);
                    div.parentNode.addEventListener("mouseover",function(event){ showGoToMarketToolTip(event,this.getAttribute("prod")); },false);                      
                    if(gut[prodId]){
                        goodsValue[1]+=data["out"][b].amount*gut[prodId];
                        div.innerHTML+="<br>"+moneyFormatInt(data["out"][b].amount*gut[prodId]);
                    }else{
                        goodsValue[1]=0;
                        break;
                    }
                }
                createElement("div",{"class":"blackbox","style":"position:absolute;top:70px;right:5px;;"},container,goodsValue[0]>0?moneyFormatInt(goodsValue[1]):"---");
                // Level percent
                div=$("clothingdonation_level_percentage");
                if(!div){
                    div=createElement("div",{"id":"clothingdonation_level_percentage","class":"blackbox","style":"position:absolute;top:5px;right:100px;;"},$("clothingdonation_levelouter"));
                }
                div.innerHTML = numberFormat(unsafeWindow.clothingdonation_data.data.percent)+"%";
                div=null; container=null;
            }catch(err){ GM_logError("showClothingDonation\nprodId="+prodId+"\n"+err); }
        });
        // Recipedealer
        err_trace="events city 2: Recipedealer";
        document.addEventListener("gameUpdateFormuladealerOffers", function(event){
            var newdiv,newtable,newtr,newtd;
            for(var v=1;v<4;v++){
                newdiv=$("formuladealerproduct"+v);
                newdiv.setAttribute("class","");

                newdiv=newdiv.getElementsByTagName("div")[0];
                var str=newdiv.getAttribute("class");
                newdiv.setAttribute("class","link "+str);
                var formula=parseInt(str.replace("fm",""),10);

                newdiv=$("formuladealerproduct"+v+"berater");
                if(newdiv){
                    newdiv.innerHTML="";
                }else{
                    newdiv=createElement("div",{"id":"formuladealerproduct"+v+"berater","class":"blackbox","style":"position:absolute;top:70px;"},$("formuladealerproduct"+v));
                }
                var sum=0;

                newtable=createElement("table",{"cellspacing":"0","style":"text-align:right;"},newdiv);
                newtr=createElement("tr",{"class":"hoverBgCc9"},newtable);
                newtr.addEventListener("mouseover",function(event){ toolTip.show(event,getText("price")); },false);
                createElement("td",{},newtr,"-");
                newtd=createElement("td",{},newtr);
                if(unsafeWindow.formulas[0][formula][6]>0){
                    newtd.innerHTML=numberFormat(unsafeWindow.formulas[0][formula][6]);
                    sum -= unsafeWindow.formulas[0][formula][6];
                }else if(unsafeWindow.formulas[0][formula][7]>0){
                    newtd.innerHTML=numberFormat(unsafeWindow.formulas[0][formula][7]*gut[0]);
                    sum -= unsafeWindow.formulas[0][formula][7]*gut[0];
                }
                var sum1=0;
                str='<table>';
                str += '<tr><th colspan="4" class="lightBg">'+getText("ingredients")+'</th></tr>';
                for(var w=0;w<unsafeWindow.formulas[0][formula][3].length;w++){
                    sum1 += unsafeWindow.formulas[0][formula][3][w][1]*gut[unsafeWindow.formulas[0][formula][3][w][0]];
                    str += '<tr><td>'+produktPic(0,unsafeWindow.formulas[0][formula][3][w][0],createElement("div")).parentNode.innerHTML+'</td>';
                    str += '<td style="text-align:right;">'+numberFormat(unsafeWindow.formulas[0][formula][3][w][1])+'&nbsp;'+sign_mult+'</td>';
                    str += '<td style="text-align:right;">'+moneyFormat(gut[unsafeWindow.formulas[0][formula][3][w][0]])+'&nbsp;=</td>';
                    str += '<td style="text-align:right;">'+moneyFormatInt(unsafeWindow.formulas[0][formula][3][w][1]*gut[unsafeWindow.formulas[0][formula][3][w][0]])+'</td></tr>';
                }
                str += '</table>';

                newtr=createElement("tr",{"class":"hoverBgCc9","mouseOverText":str},newtable);
                newtr.addEventListener("mouseover",function(event){ toolTip.show(event,this.getAttribute("mouseOverText")); },false);
                createElement("td",{},newtr,"-");
                createElement("td",{},newtr,numberFormat(sum1));
                sum -= sum1;

                if(unsafeWindow.formulas[0][formula][5][0]!=0){
                    sum1=unsafeWindow.formulas[0][formula][5][0][1]*gut[unsafeWindow.formulas[0][formula][5][0][0]];
                    sum += sum1;
                    str='<table>';
                    str += '<tr><th colspan="3" class="lightBg">'+getText("gain")+'</th></tr>';
                    str += '<tr><td>'+produktPic(0,unsafeWindow.formulas[0][formula][5][0][0],createElement("div")).parentNode.innerHTML+'</td>';
                    str += '<td style="text-align:right;">'+numberFormat(unsafeWindow.formulas[0][formula][5][0][1])+'&nbsp;'+sign_mult+'</td>';
                    str += '<td style="text-align:right;">'+moneyFormat(gut[unsafeWindow.formulas[0][formula][5][0][0]])+'</td>';
                    str += '</table>';
                    newtr=createElement("tr",{"class":"hoverBgCc9","mouseOverText":str},newtable);
                    newtr.addEventListener("mouseover",function(event){ toolTip.show(event,this.getAttribute("mouseOverText")); },false);
                    createElement("td",{},newtr,"+");
                    createElement("td",{},newtr,numberFormat(sum1));
                }
                if(unsafeWindow.formulas[0][formula][5][1]!=0){
                    var c=0;
                    for(var i=0;i<ALL_ZONES["farm"].length;i++){
                        var zoneNr=ALL_ZONES["farm"][i];
                        if((!zones.getBlock(zoneNr))&&(zones.getBuilding(zoneNr)==1)){
                            c += Math.ceil(calcGrowTimes(60*prodGrowTime[0][unsafeWindow.formulas[0][formula][5][1][0]],unsafeWindow.formulas[0][formula][5][1][2],1-(zones.getBonus(zoneNr)/100)))*BUILDING_SIZE["1"]/prodPlantSize[0][unsafeWindow.formulas[0][formula][5][1][0]];
                        }
                    }
                    sum1=c*unsafeWindow.formulas[0][formula][5][1][1]*gut[unsafeWindow.formulas[0][formula][5][1][0]];
                    sum += sum1;
                    str='<table>';
                    str += '<tr><th colspan="4" class="lightBg">'+getText("gain")+'</th></tr>';
                    str += '<tr><td>'+produktPic(0,unsafeWindow.formulas[0][formula][5][1][0],createElement("div")).parentNode.innerHTML+'</td>';
                    str += '<td style="text-align:right;">'+numberFormat(c)+'&nbsp;'+sign_mult+'</td>';
                    str += '<td style="text-align:right;">'+numberFormat(unsafeWindow.formulas[0][formula][5][1][1])+'&nbsp;'+sign_mult+'</td>';
                    str += '<td style="text-align:right;">'+moneyFormat(gut[unsafeWindow.formulas[0][formula][5][1][0]])+'</td>';
                    str += '</table>';
                    newtr=createElement("tr",{"class":"hoverBgCc9","mouseOverText":str},newtable);
                    newtr.addEventListener("mouseover",function(event){ toolTip.show(event,this.getAttribute("mouseOverText")); },false);
                    createElement("td",{},newtr,"+");
                    createElement("td",{},newtr,numberFormat(sum1));
                }

                newtr=createElement("tr",{},newtable);
                createElement("td",{"colspan":"2","style":"border-top:1px solid black;"},newtr,numberFormat(sum));
                if(unsafeWindow.formulas[0][formula][5][2]!=0){
                    var c=0;
                    for(var i=0;i<ALL_ZONES["farm"].length;i++){
                        var zoneNr=ALL_ZONES["farm"][i];
                        if((!zones.getBlock(zoneNr))&&(zones.getBuilding(zoneNr)==1)){
                        c += Math.ceil(calcGrowTimes(60*prodGrowTime[0][unsafeWindow.formulas[0][formula][5][2][0]],unsafeWindow.formulas[0][formula][5][2][2],1-(zones.getBonus(zoneNr)/100)))*BUILDING_SIZE["1"]/prodPlantSize[0][unsafeWindow.formulas[0][formula][5][2][0]];
                        }
                    }
                    sum1=c*unsafeWindow.formulas[0][formula][5][2][1];
                    str='<table>';
                    str += '<tr><th colspan="2" class="lightBg">'+getText("points")+'</th></tr>';
                    str += '<tr><td style="text-align:right;">'+numberFormat(c)+'&nbsp;'+sign_mult+'</td>';
                    str += '<td style="text-align:right;">'+pointsFormat(unsafeWindow.formulas[0][formula][5][2][1],"span",createElement("div")).parentNode.innerHTML+'</td>';
                    str += '</table>';
                    newtr=createElement("tr",{"class":"hoverBgCc9","mouseOverText":str},newtable);
                    newtr.addEventListener("mouseover",function(event){ toolTip.show(event,this.getAttribute("mouseOverText")); },false);
                    newtd=createElement("td",{"colspan":"2"},newtr);
                    pointsFormat(sum1,"div",newtd);
                }

                newtr=createElement("tr",{"class":"hoverBgCc9"},newtable);
                newtd=createElement("td",{"colspan":"2"},newtr);
                pointsFormat(unsafeWindow.formulas[0][formula][8],"div",newtd);
            }

            // Powerups
            if(unsafeWindow.poweruprack){
                newdiv=$("powerups");
                if(newdiv){
                    newdiv.innerHTML="";
                }else{
                    createElement("div",{id:"powerupsbackground",style:"background-color:black;width:560px;right:0;opacity:0.5;position:absolute;bottom:0;height:80px;"},$("formuladealer"));
                    newdiv=createElement("div",{id:"powerups",style:"height:80px;bottom:0;right:0;position:absolute;vertical-align:top;"},$("formuladealer"));
                }
                var newRID;
                for(var v in unsafeWindow.poweruprack){
                    if(!unsafeWindow.poweruprack.hasOwnProperty(v)){continue;}
                    aMount=parseInt(unsafeWindow.poweruprack[v]["rack"],10);
                    rId=parseInt(unsafeWindow.poweruprack[v][0],10);
                    newRID=createElement("div",{onmouseout:"$('formuladealerproductinfo').innerHTML=''; hideDiv('formuladealerproductinfo');",onmouseover:"$('formuladealerproductinfo').innerHTML=showFormulaInfos("+rId+"); showDiv('formuladealerproductinfo');",style:"height: 25px; width: 25px; position: relative; margin-top: 7px; float: right; margin-right: 10px;"});
                    newdiv.insertBefore(newRID, newdiv.firstElementChild);
                    createElement("div", {"class":"fmm"+rId},newRID);
                    createElement("div", {style:"position:absolute;bottom:-2px;right:-2px;font-weight:normal;color:white;"},newRID,aMount);
                }
                newRID=null;
            }
            newdiv=null;newtable=null;newtr=null;newtd=null;
        },false);
        unsafeOverwriteFunction("setFormulaDealerFormulas",function(){
            try{
                unsafeWindow._setFormulaDealerFormulas();
            }catch(err){GM_logError("_setFormulaDealerFormulas\n"+err);}
            try{
                raiseEvent("gameUpdateFormuladealerOffers");
            }catch(err){GM_logError("setFormulaDealerFormulas\n"+err);}
        });
        unsafeOverwriteFunction("setFormulaDealerRack",function(rack){
            try{
                unsafeWindow._setFormulaDealerRack(rack);
            }catch(err){GM_logError("_setFormulaDealerRack\n"+err);}
            try{
                for(var i=0;i<prodStock[2].length;i++){
                    prodStock[2][i]=0;
                }
                for(var i=0;i<rack.length;i++){
                    prodStock[2][parseInt(rack[i]["fid"],10)]=parseInt(rack[i]["amount"],10);
                }
                unsafeData.prodStock = prodStock.clone();
                GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_prodStock",implode(prodStock,"setFormulaDealerRack\prodStock"));
                raiseEvent("gameUpdateFormuladealerRack");
            }catch(err){GM_logError("setFormulaDealerRack\n"+err);}
        });

        // Lottery
        err_trace="events city 2: Lottery";
        // lotteryLog[]=[day,id of daily lot,exchanged products|null|undefined,id's of bought lots|undefined]
        lotteryLog=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_lotteryLog","[]"),"do_main/lotteryLog",[]);
        if(!(lotteryLog instanceof Array)){ lotteryLog = []; }
        function setLotteryLogId(){
            lotteryLog.sort(sortObjFunctions["date"]);
            for(lotteryLogId=lotteryLog.length-1;lotteryLogId>=0;lotteryLogId--){
                if(lotteryLog[lotteryLogId][0]==todayServerStr){ return; }
            }
            lotteryLog.push([todayServerStr]);
            setLotteryLogId();
        }
        setLotteryLogId();
        if($top("lotterycontainer")){
            function showGoToLottery(){
                nodes["goToLottery"]=new Object();
                nodes["goToLottery"]["node"]=createElement("div",{"id":"divGoToLottery","class":"link blinking","style":"height:70px;width:70px;background:url('"+GFX+"city/city2_back2.jpg') 440px 430px;border:2px solid black;border-radius:35px;margin-bottom:5px;opacity:1;","mouseOverText":getText("goToLottery")},$("fixedDivRight"));
                nodes["goToLottery"]["node"].addEventListener("mouseover",function(event){ toolTip.show(event,getText("goToLottery")); },false);
                nodes["goToLottery"]["node"].addEventListener("click",function(event){ showLottery(); },false);
                raiseEvent("gameLotteryDailyLotAvailable");
            }
            if(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_lotteryLastLot")!=todayStr){ showGoToLottery(); }

            function hideGoToLottery(){
                GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_lotteryLastLot",todayStr);
                if(nodes["goToLottery"]){
                    if(nodes["goToLottery"]["node"]){ removeElement(nodes["goToLottery"]["node"]); }
                    delete nodes["goToLottery"];
                }
            }

            unsafeOverwriteFunction("updateLotRack",function(){
                try{
                    unsafeWindow._updateLotRack();
                }catch(err){GM_logError("_updateLotRack\n"+err);}
                window.setTimeout(function(){
                try{
                    if(unsafeData.lotteryCollectForPrize){
                        var lotteryCollectForPrize=unsafeData.lotteryCollectForPrize.clone();
                    }else{
                        var lotteryCollectForPrize=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_lotteryCollectForPrize", "{}"),"updateLotRack/lotteryCollectForPrize",{});
                    }
                    if (!lotteryCollectForPrize["total"]){ lotteryCollectForPrize["total"]=new Array(); }
                    var newdiv;
                    var lrack=$("lotsrack");
                    for(var v=0;v<lrack.childElementCount;v++){
                        var lotid=lrack.children[v].style.backgroundImage.match(/lot_(\d+).png/i)[1];
                        if (!lotteryCollectForPrize["total"][lotid]){ lotteryCollectForPrize["total"][lotid]=0; }
                        //if (!$("lotlack"+lotid)){
                        newdiv=createElement("div",{"id":"lotlack"+lotid,"style":"position:absolute;right:8px;top:5px;font-size:14px;font-weight:bold;color:#fff;padding:2px;"},lrack.children[v]);
                        var help=(unsafeWindow.lotrack[lotid]?unsafeWindow.lotrack[lotid]:0)-lotteryCollectForPrize["total"][lotid];
                        if(help<=0){
                            newdiv.innerHTML=help;
                            newdiv.style.backgroundColor="#AA0000";
                        }else{
                            newdiv.innerHTML="+"+help;
                            newdiv.style.backgroundColor="green";
                        }
                    }
                    lrack=null;
                    newdiv=null;

                }catch(err){GM_log("updateLotRack error:"+err);}
                },0);
            });
            unsafeOverwriteFunction("updateLotteryPrizes",function(item){
                try{
                    unsafeWindow._updateLotteryPrizes(item);
                }catch(err){GM_logError("_updateLotteryPrizes\n"+err);}
                window.setTimeout(function(){
                try{
                    if(unsafeData.lotteryCollectForPrize){
                        var lotteryCollectForPrize=unsafeData.lotteryCollectForPrize.clone();
                    }else{
                        var lotteryCollectForPrize=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_lotteryCollectForPrize", "{}"),"updateLotteryPrizes/lotteryCollectForPrize",{});
                    }
                    // delete collecting of missing prizes
                    for(var v in lotteryCollectForPrize){
                        if(!lotteryCollectForPrize.hasOwnProperty(v)){ continue; }
                        if(isNaN(v)){ continue; }
                        if(!unsafeWindow.lotteryprizes[v]){
                            lotteryCollectForPrize[v]=false;
                            //Calc new totals
                            lotteryCollectForPrize["total"]=new Array();
                            for(var prizeId in unsafeWindow.lotteryprizes){
                                if(!unsafeWindow.lotteryprizes.hasOwnProperty(prizeId)){ continue; }
                                if (lotteryCollectForPrize[prizeId]){
                                    for(var v in unsafeWindow.lotteryprizes[prizeId][1]){
                                        if(!unsafeWindow.lotteryprizes[prizeId][1].hasOwnProperty(v)){ continue; }
                                        var flid=unsafeWindow.lotteryprizes[prizeId][1][v][0];
                                        if (!lotteryCollectForPrize["total"][flid]) lotteryCollectForPrize["total"][flid]=0;
                                        lotteryCollectForPrize["total"][flid] += unsafeWindow.lotteryprizes[prizeId][1][v][1];
                                        flid=null;
                                    }
                                    v=null;
                                }
                            }
                        }
                    }

                    var divLotteryprizes=$("lotteryprizes");
                    var cell;
                    for(var v=0;v<divLotteryprizes.childElementCount;v++){
                        if(!divLotteryprizes.children[v].id.match(/lotteryprize\d+/)){ continue; }
                        var prizeId=parseInt(divLotteryprizes.children[v].id.replace("lotteryprize",""),10);
                        if (lotteryCollectForPrize[prizeId]==undefined){ lotteryCollectForPrize[prizeId]=false; }
                        cell=createElement("input",{"id":"inputLotteryCollectForPrize"+prizeId,"class":"link","type":"checkbox","checked":lotteryCollectForPrize[prizeId],"style":"position:absolute;top:35px;left:10px;"},divLotteryprizes.children[v].firstElementChild);
                        cell.addEventListener("click",function(){
                            var prizeId=parseInt(this.id.replace("inputLotteryCollectForPrize",""),10);
                            var lotteryCollectForPrize=unsafeData.lotteryCollectForPrize.clone();
                            lotteryCollectForPrize[prizeId]=this.checked;

                            //Calc new totals
                            lotteryCollectForPrize["total"]=new Array();
                            for(var prizeId in unsafeWindow.lotteryprizes){
                                if(!unsafeWindow.lotteryprizes.hasOwnProperty(prizeId)){ continue; }
                                if (lotteryCollectForPrize[prizeId]){
                                    for(var v in unsafeWindow.lotteryprizes[prizeId][1]){
                                        if(!unsafeWindow.lotteryprizes[prizeId][1].hasOwnProperty(v)){ continue; }
                                        var flid=unsafeWindow.lotteryprizes[prizeId][1][v][0];
                                        if (!lotteryCollectForPrize["total"][flid]) lotteryCollectForPrize["total"][flid]=0;
                                        lotteryCollectForPrize["total"][flid] += unsafeWindow.lotteryprizes[prizeId][1][v][1];
                                        flid=null;
                                    }
                                    v=null;
                                }
                            }
                            prizeId=null;
                            // lotteryCollectForPrize.sortObj();
                            GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_lotteryCollectForPrize", implode(lotteryCollectForPrize));
                            unsafeData.lotteryCollectForPrize=lotteryCollectForPrize.clone();
                            unsafeWindow.updateLotRack();
                        },false);
                        // position:absolute; top:0px; left:0px; width:40px; height:40px;
                        // mouseover-div
                        cell=divLotteryprizes.children[v].children[1].firstElementChild;
                        for(var w=0;w<unsafeWindow.lotteryprizes[prizeId][1].length;w++){
                            var help=(unsafeWindow.lotrack[unsafeWindow.lotteryprizes[prizeId][1][w][0]]?unsafeWindow.lotrack[unsafeWindow.lotteryprizes[prizeId][1][w][0]]:0);
                            // cell.children[w].children[1].innerHTML += "<br>"+help;
                            help=Math.min(100,Math.round(100*help/unsafeWindow.lotteryprizes[prizeId][1][w][1]));
                            createElement("div",{"style":"position:absolute;top:0;left:0;height:5px;width:"+help+"%;background:green;"},cell.children[w]);
                            createElement("div",{"style":"position:absolute;top:0;right:0;height:5px;width:"+(100-help)+"%;background:#c00;"},cell.children[w]);
                        }
                    }
                    divLotteryprizes=null;
                    cell=null;
                    unsafeData.lotteryCollectForPrize=lotteryCollectForPrize.clone();
                }catch(err){GM_logError("updateLotteryPrizes\n"+err);}
                },0);
            });
            unsafeOverwriteFunction("initLotteryResponse",function(response){
                try{
                    unsafeWindow._initLotteryResponse(response);
                }catch(err){GM_logError("_initLotteryResponse\n"+err);}
                window.setTimeout(function(response){
                    try{
                        // [1(isOk), [...](lotrack), 1(dailyLotTaken), 0(id), {...}(lotteryprizes), 0(won products)]
                        if(response[2]!=0){
                            hideGoToLottery();
                        }
                        // Log-Button
                        var button=createElement("button",{"class":"link button_new","style":"position:absolute;bottom:120px;right:30px;"},$("lotterycontainer"),getText("lotteryLog"));
                        button.addEventListener("click",function(){ unsafeWindow.buildInfoPanel("lottery"); },false);
                        button=null;
                        //unsafeWindow.updateLotRack();
                        raiseEvent("gameLotteryOpen");
                    }catch(err){GM_log("initLotteryResponse error:"+err);}
                },0,response);
            });
            unsafeOverwriteFunction("dailyLotResponse",function(response){
                try{
                    unsafeWindow._dailyLotResponse(response);
                }catch(err){GM_logError("_dailyLotResponse\n"+err);}
                try{
                    hideGoToLottery();
                    if(response[3]){
                        lotteryLog[lotteryLogId][1]=response[3];
                        GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_lotteryLog",implode(lotteryLog));
                        raiseEvent("gameLotteryGotDailyLot");
                    }
                }catch(err){GM_logError("dailyLotResponse\n"+err);}
            });
            unsafeOverwriteFunction("showLotDecision",function(lotid){
                try{
                    unsafeWindow._showLotDecision(lotid);
                }catch(err){GM_logError("_showLotDecision\n"+err);}
                window.setTimeout(function(lotid){
                try{
                    if(unsafeData.lotteryCollectForPrize){
                        var lotteryCollectForPrize=unsafeData.lotteryCollectForPrize.clone();
                    }else{
                        var lotteryCollectForPrize=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_lotteryCollectForPrize", "{}"),"showLotDecision/lotteryCollectForPrize",{});
                    }
                    if(!lotteryCollectForPrize["total"]){ lotteryCollectForPrize["total"]=new Array(); }
                    if(!lotteryCollectForPrize["total"][lotid]){ lotteryCollectForPrize["total"][lotid]=0; }
                    var newdiv=createElement("div",{"id":"currentlotAdvise","style":"position:absolute;right:8px;top:5px;font-size:14px;font-weight:bold;color:#fff;padding:2px;"},$("currentlot"));
                    var help=(unsafeWindow.lotrack[lotid]?unsafeWindow.lotrack[lotid]:0)-lotteryCollectForPrize["total"][lotid];
                    if(help<=0){
                        newdiv.innerHTML=help;
                        newdiv.style.backgroundColor="#AA0000";
                    }else{
                        newdiv.innerHTML="+"+help;
                        newdiv.style.backgroundColor="green";
                    }
                    newdiv=null;
                    raiseEvent("gameLotteryGotLot");
                }catch(err){GM_logError("showLotDecision\n"+err);}
                },0,lotid);
            });
            unsafeOverwriteFunction("lotGetPrizeResponse",function(response){
                try{
                    unsafeWindow._lotGetPrizeResponse(response);
                }catch(err){GM_logError("_lotGetPrizeResponse\n"+err);}
                try{
                    if(response[5]){
                        lotteryLog[lotteryLogId][2]=response[5];
                        GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_lotteryLog",implode(lotteryLog));
                        raiseEvent("gameLotteryGotPrize");
                    }
                }catch(err){GM_logError("lotGetPrizeResponse\n"+err);}
            });
            unsafeOverwriteFunction("buyNewLotResponse",function(response){
                try{
                    unsafeWindow._buyNewLotResponse(response);
                }catch(err){GM_logError("_buyNewLotResponse\n"+err);}
                try{
                    if(response[5]&response[3]){
                        lotteryLog[lotteryLogId][3].push(response[3]);
                        GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_lotteryLog",implode(lotteryLog));
                        raiseEvent("gameLotteryGotPrize");
                    }
                }catch(err){GM_logError("buyNewLotResponse\n"+err);}
            });
        }
        // Waltraud
        err_trace="Donkey Waltraud";
        // logDonkey[]=[day,points,[received gifts]]
        // same pattern as QUESTS
        logDonkey=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_logDonkey","[]"),"do_main/logDonkey",[]);
        if(!(logDonkey instanceof Array)){ logDonkey = []; }
        function showGoToDonkey(){
        try{
            var showDonkey=true;
            if(!unsafeWindow.donkey_isset){
                showDonkey=false;
            }else{
                for(var i=logDonkey.length-1;i>=0;i--){
                    if(logDonkey[i][0]==todayServerStr){ 
                        showDonkey=false;
                        break;
                    }
                }
            }
            if(showDonkey){
                nodes["goToDonkey"]=new Object();
                nodes["goToDonkey"]["node"]=createElement("div",{"id":"divGoToDonkey","class":"link blinking","style":"height:70px;width:70px;background:url('"+GFX+"donkey_dialog.gif') 65px -15px / 300%;border:2px solid black;border-radius:35px;margin-bottom:5px;opacity:1;"},$("fixedDivRight"));
                nodes["goToDonkey"]["node"].addEventListener("mouseover",function(event){ toolTip.show(event,getText("goToDonkey")); },false);
                nodes["goToDonkey"]["node"].addEventListener("click",function(event){ goToDonkey(); },false);
                raiseEvent("gameDonkeyAvailable");
            }
        }catch(err){GM_logError("showGoToDonkey\n"+err);}
        }
        function hideGoToDonkey(){
        try{
            if(nodes["goToDonkey"]){
                if(nodes["goToDonkey"]["node"]){ removeElement(nodes["goToDonkey"]["node"]); }
                delete nodes["goToDonkey"];
            }
        }catch(err){GM_logError("hideGoToDonkey\n"+err);}
        }       
        showGoToDonkey();
        unsafeOverwriteFunction("dailyDonkeyResult",function(response){
            try{
                unsafeWindow._dailyDonkeyResult(response);
                raiseEvent("gameDonkeyResponse");
            }catch(err){GM_logError("_dailyDonkeyResult\n"+err);}
            try{
                if (response[0]!=2) {
                    hideGoToDonkey();
                    var newElem=[todayServerStr,0,[]];
                    newElem[1]=response[1];
                    if(response[7]>0){
                        newElem[2].push([5,1]);
                    }else if(response[2]>0){
                        newElem[2].push([1,0,0,1]);
                    }else if(response[4]>0){
                        newElem[2].push([13,response[4]]);
                    }else if(response[6]>0){
                        newElem[2].push([12,response[6]]);
                    }else if(response[5]>0){
                        newElem[2].push([1,0,response[5],1]);
                    }else if(response[3]){
                        for(pid in response[3]){
                            if(!response[3].hasOwnProperty(pid)){ continue; }
                            newElem[2].push([1,0,parseInt(pid,10),response[3][pid]]);
                        }
                    }
                    logDonkey.push(newElem);
                    GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_logDonkey",implode(logDonkey));
                }
            }catch(err){GM_logError("dailyDonkeyResult\n"+err);}
        });     
    }

    // on load execute ============================================================================
    err_trace="on load execute";
    newdiv1=$("buildingmain");
    var newdiv2;

    // TODO! farm is already filled
    unsafeWindow.farmBuildPositions();
    unsafeWindow.farmMove(1);
    calcFarmiCost();
    calcTotalFarmis();
    calcProdMinRackInit(); // this calls finally doBuyNotepad, doFarmis
    //doFarmis();
    saveProductData();
    if(unsafeWindow.showQuests){ //FastFix2012/01/18
        unsafeWindow.showQuests(); //TODO review
    }

    if(COUNTRY=="SE"){ $("bar").innerHTML=$("bar").innerHTML.replace(/\.(\d\d) /,",$1 "); }
    GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_bargeld",$("bar").innerHTML.replace(" "+getText("gamecurrency"),"").replace(regDelimThou,"").replace(regDelimDeci,"."));

    err_trace="global timer";
    if(USERLEVEL>=8){
        createZoneTimer("globalZoneTimer_windmill","windmill","zonetimer","position:relative;",$("timeHolder"));
    }
    if(unsafeWindow.forestry_unlock!=undefined){
        createZoneTimer("globalZoneTimer_forest","forest","zonetimer","position:relative;",$("timeHolder"));
        if(zones.getBonus("forest")>0){ createZoneTimer("globalZoneTimerWater_forest","forest","zoneTimerWater","position:relative;",$("timeHolder")); }
        createZoneTimer("globalZoneTimer_sawmill","sawmill","zonetimer","position:relative;",$("timeHolder"));
        createZoneTimer("globalZoneTimer_carpentry","carpentry","zonetimer","position:relative;",$("timeHolder"));
    }
    for(var v=1;v<=4;v++){
        createZoneTimer("globalZoneTimer_foodworld-"+v,"foodworld-"+v,"zonetimer","position:relative;",$("timeHolder"));
    }
    for(var v=1;v<=6;v++){
        createZoneTimer("globalZoneTimer_farmersmarket-"+v,"farmersmarket-"+v,"zonetimer","position:relative;",$("timeHolder"));
    }

    // looping ====================================================================================
    err_trace="looping";
    function loop1(){
    if(DEVMODE_FUNCTION){ var trackingHandle = tracking.start("berater","loop1"); }
        try{
        //timeMeasureStart("loop1");    
        // test session
        if (unsafeWindow.rid!=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_session","")){ unsafeWindow.initZones(1); }
        else{ GM_setValue2(COUNTRY+"_"+SERVER+"_sessionlost",false,74); }

        now=Math.floor((new Date()).getTime()/1000);
        todayStr=getDateStr(now,2,false);
        nowServerOff=unsafeWindow.Zeit.Server+valServerTimeOffset;
        var help=getDateStr(nowServerOff,2,false);
        if(help!=todayServerStr){
            todayServerStr=help;
            setLevelLogId();
            setLotteryLogId();
            getDailyRanking();
            showGoToLottery();
            raiseEvent("gameNewDay");
        }

        // clock
        nodes["serverTime"]["node"].innerHTML=todayServerStr+"&nbsp;"+getDaytimeStr(nowServerOff);
        if(valSessionEndtime){ nodes["sessionTimeLeft"]["node"].innerHTML="("+getTimeStr(valSessionEndtime-now)+")"; }
        if(DEVMODE){ nodes["sessionTimeNow"]["node"].innerHTML="("+getDaytimeStr(now)+")"; }
        // questline
        updateQuestLineTimer();
        // powerupsymbols
        for(var v=nodes["containerPowerupSymbols"]["node"].childElementCount-1;v>=0;v--){
            help=parseInt(nodes["containerPowerupSymbols"]["node"].children[v].getAttribute("end"),10)-unsafeWindow.Zeit.Server;
            if(help>0){ nodes["containerPowerupSymbols"]["node"].children[v].lastElementChild.innerHTML=getTimeStr(help); }
            else{ removeElement(nodes["containerPowerupSymbols"]["node"].children[v]); }
        }

        // timers
        timer.run();
        clocks.run();

        // slots
        var readyZoneAdded=0;
        for(var i in ALL_SLOTS){
            if(!ALL_SLOTS.hasOwnProperty(i)){ continue; }
            if(!zones.getBlock(i)){ 
                readyZoneAdded+=zones.checkReady(i);
            }
        }
        if(readyZoneAdded>0){
            raiseEvent("gameZoneReady");
            // GM_log("unsafeData.readyZone:\n"+print_r(unsafeData.readyZone,"",true,"\n"));                    
            if(DEVMODE){ GM_log("readyZone="+implode(unsafeData.readyZone)); }
        }
        if (totalEndtime==-1){
            help=getText("cropped").toUpperCase();
        }else if(totalEndtime+unsafeWindow.Zeit.Verschiebung<=now){
            help=getText("finished").toUpperCase();
        }else{
            help=getTimeStr(totalEndtime+unsafeWindow.Zeit.Verschiebung-now);
        }
        var cell;
        if((cell=$("mainmenue2_incoming"))&&(cell.style.display=="block")){
            help+=" - !";
        }else if((cell=$("mainmenue3_incoming"))&&(cell.style.display=="block")){
            help+=" - !";
        }
        cell=null;
        document.title=help+documentTitle;

        //raising events of other pages
        var raisedEvents=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_raisedEvents","{}"),"loop1/raisedEvents",{});
        for(var v in raisedEvents){
            if(!raisedEvents.hasOwnProperty(v)){ continue; }
            raiseEvent(v);
            GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_raisedEvents","{}");
        }
        // timeMeasureStop("loop1"); // 4ms
        }catch(err){ GM_logError("loop1\n"+err); }
    if(DEVMODE_FUNCTION){ tracking.end("berater",trackingHandle); }
    }

    function loop60(){
        unsafeWindow.updateMenu();
    }

    window.setInterval(loop1,1000);
    window.setInterval(loop60,60000);

    // First run
    if (GM_getValue("tutorial",0)==0){
        click($("mainmenue5")); // Fix Seberoth
    }
    newinput=null;newdiv=null;newdiv1=null;newbutton=null;newimg=null;
}catch(err){ GM_logError("do_main ("+err_trace+")\n"+err); }
}

//***********************************************************************************************************

function do_vertraege_head(){
try{
    //GM_log("do_vertraege_head");
    var candtr=document.getElementsByTagName("table")[0].getElementsByTagName("tr");
    for(var v=0;v<candtr[0].childElementCount;v++){
        candtr[0].children[v].setAttribute("class","bordered link hoverBgLightbrown");
        candtr[0].children[v].firstElementChild.setAttribute("class","link");
    }
    var newtd=createElement("td",{"class":"bordered link hoverBgLightbrown","align":"center"},candtr[0]);
    var newa=createElement("a",{"style":"font-weight:bold;"},newtd,getText("oldOnes"));
    newa.addEventListener("click",function(){
        window.setTimeout(function(){
            GM_setValue(COUNTRY+"_"+SERVER+"_pagedataVertraegeOverview",implode({"contractview":"old"}));
            if (PAGE=="vertraege/overview"){ do_vertraege_overview(); }
            else{ location.href="overview.php"; }
        },0);
    },false);
    candtr=null;newtd=null;newa=null;
}catch(err){GM_logError("do_vertraege_head\n"+err);}
}

function do_vertraege_new(){
try{
    var err_trace="init";
    loadProductData();
    var candtable=document.getElementsByTagName("table");
    candtable[0].firstElementChild.firstElementChild.firstElementChild.bgColor="lightblue";

    var candinput=candtable[1].getElementsByTagName("input");
    candtable=null;
    var newdiv;
    if (candinput.length>0){
        // contract submit page
        err_trace="contract submit page";
        var neuvertrag=new Array();
        neuvertrag[3]=new Array();
        for(var v=0;v<candinput.length;v++){
            if (candinput[v].name=="contract_to"){
                neuvertrag[2]=candinput[v].value;
                GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_lastContractTo",candinput[v].value);
            }
            else if (candinput[v].name.search("prod")!=-1){ neuvertrag[3][/(\d+)/.exec(candinput[v].name)[1]]=[parseInt(candinput[v].value,10),,]; }
            else if (candinput[v].name.search("anz")!=-1){ neuvertrag[3][/(\d+)/.exec(candinput[v].name)[1]][1]=parseInt(candinput[v].value,10); }
            else if (candinput[v].name.search("preis")!=-1){ neuvertrag[3][/(\d+)/.exec(candinput[v].name)[1]][2]=parseFloat(candinput[v].value,10); }
        }
        if(neuvertrag[2].toLowerCase()!=USERNAME){
            var vertraegeOut=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_vertraegeOut","[]"),"do_vertraege_new/vertraegeOut",[]);
            var vertraegeOutIndex={};
            var valContractLogAmount=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valContractLogAmount",200);
            neuvertrag[0]=0;
            neuvertrag[1]= Math.round((new Date()).getTime()/1000);
            for(var v=0;v<vertraegeOut.length;v++){
                if(isNaN(vertraegeOut[v][0])||(vertraegeOutIndex[vertraegeOut[v][0]]>-1)){
                    vertraegeOut.splice(v,1);
                    v--;
                }else{
                    vertraegeOutIndex[vertraegeOut[v][0]]=v;
                    neuvertrag[0]=Math.max(neuvertrag[0],vertraegeOut[v][0]);
                }
            }           
            neuvertrag[0]++;
            vertraegeOut.push(neuvertrag);
            vertraegeOut.sort(function(a,b){return (a[1]-b[1]);});
            vertraegeOut.splice(0,vertraegeOut.length-valContractLogAmount); // shrink on storage amount
            GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_vertraegeOut",implode(vertraegeOut));
            var contractPrices=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_vertraegePreise","[]"),"do_vertraege_new/vertraegePreise",[]);
            for(var v=0;v<neuvertrag[3].length;v++){
                contractPrices[neuvertrag[3][v][0]]=neuvertrag[3][v][2];
            }
            GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_vertraegePreise",implode(contractPrices));
        }

        // multi submit
        err_trace="multi submit";
        var submitButton=document.getElementsByName("confirm_contract")[0];
        submitButton.style.display="none";
        var newdiv=createElement("div",{"style":"position:absolute;width:300px;height:50px;bottom:135px;left:150px;text-align:center;"},document.getElementsByName("form_confirmcontract")[0].parentNode);
        var newbutton=createElement("input",{"type":"button","class":"link msg_input","id":"multiSubmit","name":"1","value":submitButton.value},newdiv);
        newbutton.addEventListener("click",function(){
        try{
            var submitForm=document.getElementsByName("form_confirmcontract")[0];
            var help=submitForm.getElementsByTagName("input");
            var str="";
            for(var v=0;v<help.length;v++){ str += help[v].getAttribute("name")+"="+help[v].value+"&"; }
            str=str.slice(0,str.length-1);
            var c=parseInt(this.getAttribute("name"),10);
            for(var d=1;d<c;d++){
                window.setTimeout(function(d){
                    GM_xmlhttpRequest({
                    method: "POST",
                    url: "http://s"+SERVER+"."+GAMEPAGES[COUNTRY]+submitForm.getAttribute("action"),
                    headers: {"Content-type": "application/x-www-form-urlencoded"},
                    data: str,
                    onload: function(response){
                        try{
                            logBubble.add(getText("sentContractNrX").replace(/%1%/,d));
                        }catch(err){GM_logError("contractMultiSubmit.onload\n"+err);}           
                    },
                    onerror: function(response){
                        GM_logError("contractMultiSubmit.onerror\n"+response.responseText);
                    },
                    timeout: function(response){
                        GM_logError("contractMultiSubmit.timeout\n"+response.responseText);
                    }                   
                    });
                },d*100,d);
            }
            window.setTimeout(function(c){
                var submitButton=document.getElementsByName("confirm_contract")[0];
                click(submitButton);
                logBubble.add(getText("sentContractNrX").replace(/%1%/,c));
                submitButton=null;submitForm=null;
            },c*100,c);
        }catch(err){GM_logError("#multiSubmit.click\n"+err);}       
        },false);
        createElement("div",{},newdiv);
        newbutton=createElement("input",{"type":"button","class":"link msg_input","value":"-"},newdiv);
        newbutton.addEventListener("click",function(){
            var submitButton=document.getElementsByName("confirm_contract")[0];
            var multiSubmitButton=$("multiSubmit");
            multiSubmitButton.setAttribute("name",Math.max(1,parseInt(multiSubmitButton.getAttribute("name"),10)-1));
            if (multiSubmitButton.getAttribute("name")=="1"){ multiSubmitButton.value=submitButton.value; }
            else{ multiSubmitButton.value=multiSubmitButton.getAttribute("name")+"x "+submitButton.value; }
            submitButton=null;multiSubmitButton=null;
        },false);
        newbutton=createElement("input",{"type":"button","class":"link msg_input","value":"+"},newdiv);
        newbutton.addEventListener("click",function(){
            var submitButton=document.getElementsByName("confirm_contract")[0];
            var multiSubmitButton=$("multiSubmit");
            multiSubmitButton.setAttribute("name",parseInt(multiSubmitButton.getAttribute("name"),10)+1);
            multiSubmitButton.value=multiSubmitButton.getAttribute("name")+"x "+submitButton.value;
            submitButton=null;multiSubmitButton=null;
        },false);
        newdiv=null;newbutton=null;submitButton=null;
    }else{
        // contract edit page
        err_trace="contract edit page";
        var pagedata=explode(GM_getValue(COUNTRY+"_"+SERVER+"_pagedataVertraegeNew","{}"),"do_vertraege_new/pagedataVertraegeNew",{});
        GM_setValue(COUNTRY+"_"+SERVER+"_pagedataVertraegeNew","{}");

        var candtr=$("addproduct").getElementsByTagName("tr");
        var newtr=createElement("tr");
        candtr[4].parentNode.insertBefore(newtr,candtr[4]);
        createElement("td",{},newtr);
        createElement("td",{},newtr,getText("value"));
        var newtd=createElement("td",{"align":"left"},newtr);
        err_trace="contract edit page/addproductWert";
        newdiv=createElement("input",{"id":"addproductWert","class":"text msg_input","type":"text","style":"width:100px;"},newtd);
        newdiv.addEventListener("keyup",function(event){
            var preis=parseFloat($("neu_preis").value.replace(regDelimDeci,"."),10);
            if (preis>0){
                $("neu_anzahl").value=Math.floor(0.01+parseFloat(this.value.replace(regDelimThou,"").replace(regDelimDeci,"."),10)/preis);
            }
            if (event.keyCode==13){ click($("btn_add_product")); }
        },false);
        // newdiv.addEventListener("focus",function(){this.style.border="1px solid #555555";},false);
        newdiv.addEventListener("blur",function(){
            this.value=numberFormat(parseInt($("neu_anzahl").value,10)*parseFloat($("neu_preis").value.replace(regDelimDeci,"."),10),2);this.style.border="1px solid #aaa";
        },false);
        err_trace="contract edit page/neu_anzahl";
        if(newdiv=$("neu_anzahl")){
            // newdiv.addEventListener("focus",function(){this.style.border="1px solid #555555";},false);
            newdiv.addEventListener("keyup",function(event){
                var anzahl=parseInt(this.value.replace(/\D/g,""),10);
                $("addproductWert").value=numberFormat(anzahl*parseFloat($("neu_preis").value.replace(regDelimDeci,"."),10),2);
                this.value=(anzahl>0?anzahl:"");
                if (event.keyCode==13){ click($("btn_add_product")); }
            },false);
            // newdiv.addEventListener("blur",function(){this.style.border="1px solid #aaa";},false);
        }
        err_trace="contract edit page/neu_preis";
        if(newdiv=$("neu_preis")){
            // newdiv.addEventListener("focus",function(){this.style.border="1px solid #555";},false);
            newdiv.addEventListener("keyup",function(event){
                $("addproductWert").value=numberFormat(parseInt($("neu_anzahl").value,10)*parseFloat(this.value.replace(regDelimDeci,"."),10),2);
                if (event.keyCode==13){ click($("btn_add_product")); }
            },false);
            // newdiv.addEventListener("blur",function(){this.style.border="1px solid #aaa";},false);
        }

        /*
        // selected products
        err_trace="selected products";
        for(var v=0;v<=7;v++){
             $("delbtn_"+v).addEventListener("mouseover",function(event){
                toolTip.show(event,getText("delete"));
             },false);
            $("platzhalter_"+v).addEventListener("mouseover",function(event){
                var currNr=this.id.replace(/platzhalter_/,"");
                prod=parseInt($("produkt_"+currNr).value,10);
                var amount=parseInt($("anzahl_"+currNr).value,10);
                var price=parseFloat($("preis_"+currNr).value.replace(regDelimDeci,"."),10);

                var str='<table class="white" cellspacing="0">';
                str += '<tr><th colspan="2" class="lightBg">'+prodName[0][prod]+'</td></tr>';
                str += '<tr><td style="text-align:right;">'+numberFormat(amount)+'&nbsp;'+sign_mult+'</td><td style="text-align:right;">'+moneyFormat(price)+'</td></tr>';
                str += '<tr><td style="text-align:right;">=</td><td style="text-align:right;">'+moneyFormat(amount*price)+'</td></tr>';

                str += '</table>';
                toolTip.show(event,str);
            },false);

        }
        */
        err_trace="currContract";
        var currContract=new Object();
        createElement("div",{"id":"preis_total","style":"position:absolute;top:215px;left:480px;padding:2px;color:black;background-color:#b8a789;border:1px solid black;border-radius:5px;"},ALL);
        // Change of the contract
        //unsafeWindow._buildCart=unsafeWindow.buildCart;
        unsafeOverwriteFunction("buildCart",function(){
            // try{
            //  unsafeWindow._buildCart();
            // }catch(err){ GM_logError("_buildCart\n"+err); }      
            try{
                var html = '';
                var count = -1;
                var sum=0,amount,price;
                var newdiv,newdiv1,newdiv2;
                currContract=new Object();
                newdiv=$("contract_cart");
                newdiv.innerHTML = "";
                for(var prod in unsafeWindow.cart){
                    if(!unsafeWindow.cart.hasOwnProperty(prod)){ continue; }
                    amount=parseInt(unsafeWindow.cart[prod]["anzahl_neu"],10);
                    price=parseFloat(unsafeWindow.cart[prod]["preis_neu"].replace(regDelimDeci,"."),10);
                    currContract[prod]=[amount,price];
                    sum += amount*price;
                    count++;

                    newdiv1=createElement("div",{"prod":prod,"style":"position:relative;float:left;margin:0 0 5px 5px;"},newdiv);
                    newdiv2=createElement("div",{"onclick":"addItem("+prod+")","class":"v"+prod+" link"},newdiv1);
                    newdiv2.addEventListener("mouseover",function(event){
                        var prod=this.parentNode.getAttribute("prod");
                        var amount=currContract[prod][0];
                        var price=currContract[prod][1];
                        var str='<table cellspacing="0">';
                        str += '<tr><th colspan="2" class="lightBg">'+prodName[0][prod]+'</td></tr>';
                        str += '<tr><td style="text-align:right;">'+numberFormat(amount)+'&nbsp;'+sign_mult+'</td><td style="text-align:right;">'+moneyFormat(price)+'</td></tr>';
                        str += '<tr><td style="text-align:right;">=</td><td style="text-align:right;">'+moneyFormat(amount*price)+'</td></tr>';
                        str += '</table>';
                        toolTip.show(event,str);
                    },false);
                    newdiv2=createElement("div",{"class":"link","onclick":"removeItem("+prod+")","style":"background:url(http://mff.wavecdn.de/mff/popin/contracts/delete.gif);width:11px; height:11px; position:absolute; top:-2px; right:-2px;"},newdiv1);
                    newdiv2.addEventListener("mouseover",function(event){
                        toolTip.show(event,getText("delete"));
                    },false);
                    newdiv2=createElement("input",{"type":"hidden","name":"prod["+count+"]","id":"produkt_"+count,"value":prod},newdiv1);
                    newdiv2=createElement("input",{"type":"hidden","name":"anz["+count+"]","id":"anzahl_"+count,"value":unsafeWindow.cart[prod].anzahl_neu},newdiv1);
                    newdiv2=createElement("input",{"type":"hidden","name":"preis["+count+"]","id":"preis_"+count,"value":unsafeWindow.cart[prod].preis_neu},newdiv1);
                }
                createElement("div",{"style":"clear:both;"},newdiv);
                
                $("preis_total").innerHTML=getText("total")+":<br>"+moneyFormat(sum);
                newdiv=null;newdiv1=null;newdiv2=null;
            }catch(err){GM_logError("buildCart\n"+err);}
        });
        unsafeWindow.buildCart();
        
        // Filling data
        err_trace="Filling data";
        unsafeWindow.fillContract = function(player,data){
            try{
                // player: string or null
                // data: {prod:[amount,single-price],...}
                // set receiver
                if(player){ $("to_player").value=player; }
                // clear data
                unsafeWindow.cart = new Object();
                // fill data
                for(var v in data){
                    if(!data.hasOwnProperty(v)){ continue; }
                    if(prodStock[0][v]>0){
                        unsafeWindow.cart[v] = new Object();
                        unsafeWindow.cart[v]["anzahl_neu"]=numberFormat(Math.min(prodStock[0][v],data[v][0]),0,".","");
                        unsafeWindow.cart[v]["preis_neu"]=numberFormat(data[v][1],2,".","");
                    }
                }
                // call displaying
                unsafeWindow.buildCart();
            }catch(err){ GM_logError("fillContract\n"+err); }
        };
        newdiv=$("to_player");
        if (newdiv){
            if(pagedata["to"]){
                newdiv.value=pagedata["to"];
            }else if(newdiv.value==""){
                newdiv.value=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_lastContractTo","");
            }
        }
        if(pagedata["fillContract"]){
            unsafeWindow.fillContract(null,pagedata["fillContract"]);
        }

        // last message panel
        err_trace="last message panel";
        newdiv=createElement("div",{"id":"lastMessage","style":"position:absolute;top:110px;right:-403px;width:413px;height:134px;padding:5px;background-color:#b8a789;border:2px solid black;border-radius:10px 0px 0px 10px;z-index:101;z-index:15;color:black;overflow:auto;"},ALL,GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_nachrichten_letzte",""));
        newdiv.addEventListener("mouseover",function(){this.style.right="0";},false);
        newdiv.addEventListener("mouseout",function(){this.style.right="-403px";},false);

        // set remembered price
        err_trace="set remembered price";
        unsafeOverwriteFunction("addItem",function(pid){
            try{
                unsafeWindow._addItem(pid);
            }catch(err){ GM_logError("_addItem\npid="+pid+"\n"+err); }      
            try{
                window.setTimeout(function(){
                    var contractPrices=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_vertraegePreise","[]"),"do_vertraege_new/addproduct/vertraegePreise",[]);
                    var cell=$("neu_preis");
                    if(cell&&(cell.value=="0")){
                        var new_produkt=parseInt(unsafeWindow.addboxid,10);
                        if(contractPrices[new_produkt]){
                            cell.value=numberFormat(contractPrices[new_produkt],2,delimDeci,"");
                            keyup(cell);
                        }else if(gut[new_produkt]){
                            cell.value=numberFormat(gut[new_produkt],2,delimDeci,"");
                            keyup(cell);
                        }else if(!isNaN(NPC[0][new_produkt])){
                            cell.value=numberFormat(NPC[0][new_produkt],2,delimDeci,"");
                            keyup(cell);
                        }
                    }
                    cell=null;
                },0);
            }catch(err){GM_logError("addItem\npid="+pid+"\n"+err);}
        });

        // save contract, [target user,{"prod":[amount,price],...}]
        err_trace="save contract";
        var contractSave=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_contractSave","[]"),"do_vertraege_new/contractSave",[]);
        var top=345;
        var right=120;
        for(var v=0;v<10;v++){
            right -= 20;
            if(right<=0){
                top += 20;
                right=100;
            }
            newdiv=createElement("div",{"id":"contractSave"+v,"class":"link hoverBgLightblue","style":"position:absolute;top:"+top+"px;right:"+right+"px;width:13px;padding:1px;color:black;text-align:center;border:2px inset black;border-radius:10px;"+(contractSave[v]?"background-color:#bb7;":"")},ALL,v+1);
            newdiv.addEventListener("mouseover",function(event){
                try{
                    var contractSave=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_contractSave","[]"),"do_vertraege_new/contractSave/mouseover",[]);
                    var currNr=parseInt(this.id.replace(/contractSave/,""),10);
                    var str='<table cellspacing="0" cellpadding="0" style="width:100%;">';
                    if(contractSave[currNr]){
                        str += '<tr><td>'+getText("click")+':&nbsp;</td><td>'+getText("load")+'</td></tr>';
                    }
                    str += '<tr><td style="border-bottom:1px solid black;">'+getText("clickCtrl")+':&nbsp;</td><td style="border-bottom:1px solid black;">'+getText("save")+'</td></tr>';
                    str += '</table><table cellspacing="0" cellpadding="0" style="line-height:15px;width:100%;">';
                    if(contractSave[currNr]){
                        if(contractSave[currNr][0]!=""){
                            str += '<tr><td colspan="3">&rarr;&nbsp;'+contractSave[currNr][0]+'</td></tr>';
                        }
                        for(var v in contractSave[currNr][1]){
                            if(!contractSave[currNr][1].hasOwnProperty(v)){ continue; }
                            str += '<tr><td style="text-align:right;padding-right:3px;">'+numberFormat(contractSave[currNr][1][v][0])+'</td><td style="padding-right:3px;">'+produktPic(0,v,createElement("div")).parentNode.innerHTML+prodName[0][v]+'</td><td style="text-align:right;">'+moneyFormat(contractSave[currNr][1][v][1])+'</td></tr>';
                        }
                    }else{
                        str += '<tr><td colspan="3">---</td></tr>';
                    }
                    str += '</table>';
                    toolTip.show(event,str);
                }catch(err){ GM_logError("contractSave.mouseover\n"+err); }
            },false);
            newdiv.addEventListener("click",function(event){
                try{
                    var contractSave=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_contractSave","[]"),"do_vertraege_new/contractSave/click",[]);
                    var currNr=parseInt(this.id.replace(/contractSave/,""),10);
                    if(event.ctrlKey){
                        // save this contract
                        contractSave[currNr]=[$("to_player").value,currContract];
                        if((contractSave[currNr][0]=="")&&(contractSave[currNr][1].isEmpty())){
                            delete contractSave[currNr];
                            this.style.backgroundColor="";
                        }else{
                            this.style.backgroundColor="#bb7";
                        }
                        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_contractSave",implode(contractSave));
                        toolTip.adjust(this);
                    }else{
                        // load contract
                        if(contractSave[currNr]){
                            unsafeWindow.fillContract(contractSave[currNr][0]==""?null:contractSave[currNr][0],contractSave[currNr][1]);
                        }
                    }
                }catch(err){ GM_logError("contractSave.click\n"+err); }
            },false);
        }
        newtr=null;newtd=null;candtr=null;candinput=null;
        raiseEventTop("gameWindowContractNew");
    }
    newdiv=null;
}catch(err){ GM_logError("do_vertraege_new ("+err_trace+")\n"+err); }
}

function buildAlteVertraege(mode){
try{
    //GM_log("buildAlteVertraege:"+mode);
    loadProductData();
    var vertraege;
    if (mode=="In"){ vertraege=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_vertraegeIn","[]"),"do_vertraege_overview/vertraegeIn",[]); }
    else{ vertraege=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_vertraegeOut","[]"),"do_vertraege_overview/vertraegeOut",[]); }
    var container=document.getElementsByTagName("table")[1].parentNode;
    container.innerHTML="";
    container.setAttribute("mode",mode);
    var newtable=createElement("table",{"style":"width:100%;margin-bottom:3px;"},container);
    var newtr=createElement("tr",{},newtable);
    var newtd=createElement("td",{"class":"link tnormal hoverBgLightbrown","align":"center","style":"color:black;font-weight:bold;"},newtr,getText("contractsReceived"));
    if (mode=="In"){ newtd.bgColor="lightblue"; }
    newtd.addEventListener("click",function(){buildAlteVertraege("In");},false);
    newtd=createElement("td",{"class":"link tnormal hoverBgLightbrown","align":"center","style":"color:black;font-weight:bold;"},newtr,getText("contractsSent"));
    if (mode=="Out"){ newtd.bgColor="lightblue"; }
    newtd.addEventListener("click",function(){buildAlteVertraege("Out");},false);

    newdiv=createElement("div",{"style":"width:100%;height:280px;overflow-x:hidden;overflow-y:scroll;"},container);
    newtable=createElement("table",{"style":"width:100%;","cellspacing":"0"},newdiv);
    var newtablehead=createElement("thead",{},newtable);
    var newtablebody=createElement("tbody",{"class":"hoverRowBgLightbrown","style":"height:290px;overflow-x:hidden;overflow-y:scroll;"},newtable);
    var newtd1,newtd2,newimg;
    var help;
    var sendContractAgain=((mode=="Out")&&($top("multiframe")));
    for(var v=vertraege.length-1;v>=0;v--){
        newtr=createElement("tr",{},newtablebody);
        newtd=createElement("td",{},newtr);
        if(sendContractAgain&&(typeof vertraege[v][3]=="object")){
            newtd.setAttribute("class","link borderTop");
            help=new Object();
            help["to"]=vertraege[v][2];
            help["fillContract"]=new Object();
            for(var w=0;w<vertraege[v][3].length;w++){
                help["fillContract"][vertraege[v][3][w][0]]=[vertraege[v][3][w][1],vertraege[v][3][w][2]];
            }
            newtd.setAttribute("data",implode(help));
            newtd.addEventListener("mouseover",function(event){ toolTip.show(event,getText("sendContractAgain")); },false);
            newtd.addEventListener("click",function(){
                GM_setValue(COUNTRY+"_"+SERVER+"_pagedataVertraegeNew",this.getAttribute("data"));
                location.href="http://s"+SERVER+"."+GAMEPAGES[COUNTRY]+"/vertraege/new.php";
            },false);
        }else{
            newtd.setAttribute("class","borderTop");
        }
        if (vertraege[v][1]>0){
            newtd.innerHTML=getFormattedDateStr(vertraege[v][1])+",<br>"+getDaytimeStr(vertraege[v][1],1)+"&nbsp;"+getText("shortOClock");
        }else{
            newtd.innerHTML="---";
        }

        newtd=createElement("td",{"class":"borderTop"},newtr,vertraege[v][2]);
        newdiv=createElement("div",{},newtd);
        igm(vertraege[v][2],newdiv);
        stats(vertraege[v][2],newdiv);
        vertrag(vertraege[v][2],newdiv);

        newtd=createElement("td",{"class":"borderTop"},newtr);
        newtd1=createElement("td",{"class":"borderTop","style":"text-align:right;"},newtr);
        newtd2=createElement("td",{"class":"borderTop","style":"text-align:right;"},newtr);
        if(typeof vertraege[v][3]=="object"){
            var sum=0;
            for(var w=0;w<vertraege[v][3].length;w++){
                newdiv=createElement("div",{"class":"link hoverBgLightblue","style":"line-height:16px;white-space:nowrap;","prod":vertraege[v][3][w][0]},newtd);
                newdiv.addEventListener("mouseover",function(event){ showGoToMarketToolTip(event,this.getAttribute("prod")); },false);
                newdiv.addEventListener("click",function(){showMarket(this.getAttribute("prod"));},false);
                produktPic(0,vertraege[v][3][w][0],newdiv);
                createElement("span",{},newdiv,numberFormat(vertraege[v][3][w][1],0) +"&nbsp;"+ prodName[0][vertraege[v][3][w][0]]);
                createElement("div",{"style":"line-height:16px;white-space:nowrap;"},newtd1,moneyFormat(vertraege[v][3][w][2]));
                createElement("div",{"style":"line-height:16px;white-space:nowrap;"},newtd2,moneyFormatInt(vertraege[v][3][w][1]*vertraege[v][3][w][2]));
                sum += vertraege[v][3][w][1]*vertraege[v][3][w][2];
            }
            if (vertraege[v][3].length>1){
                createElement("div",{},newtd,"&nbsp;");
                createElement("div",{},newtd1,"&nbsp;");
                createElement("div",{"style":"border-top:1px solid black;text-align:right;"},newtd2,moneyFormatInt(sum));
            }
        }else{
            createElement("div",{"style":"line-height:16px;white-space:nowrap;"},newtd2,moneyFormatInt(vertraege[v][3]));
        }
        newtd=createElement("td",{"class":"borderTop","style":"text-align:right;padding-right:20px;"},newtr);
        newimg=createElement("img",{"objId":vertraege[v][0],"src":GFX+"popin/contracts/anullieren.gif","class":"link2","style":"width:16px;height:16px;"},newtd);
        newimg.addEventListener("mouseover",function(event){ toolTip.show(event,getText("delete")); },false);
        newimg.addEventListener("click",function(){
            var objId=this.getAttribute("objId");
            var mode=this.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.getAttribute("mode");               
            alert2(getText("delete")+"?",getText("yes"),getText("no"),function(){ return function(mode){
                if (mode=="In"){
                    var vertraegeIn=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_vertraegeIn","[]"),"do_vertraege_overview/vertraegeIn",[]);
                    for(var v=vertraegeIn.length-1;v>=0;v--){
                        if(vertraegeIn[v][0]==objId){ break; }
                    }
                    if(v>=0){
                        vertraegeIn.splice(v,1);
                        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_vertraegeIn",implode(vertraegeIn));
                    }
                }else{
                    var vertraegeOut=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_vertraegeOut","[]"),"do_vertraege_overview/vertraegeOut",[]);
                    for(var v=vertraegeOut.length-1;v>=0;v--){
                        if(vertraegeOut[v][0]==objId){ break; }
                    }
                    if(v>=0){
                        vertraegeOut.splice(v,1);
                        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_vertraegeOut",implode(vertraegeOut));
                    }
                }
                buildAlteVertraege(mode);
            }(mode)});
        },false);
    }
    container=null;newtable=null;newtablehead=null;newtablebody=null;newtr=null;newtd=null;newtd1=null;newtd2=null;newimg=null;newdiv=null;
}catch(err){GM_logError("buildAlteVertraege\nv="+v+"\n"+err);}
}

function do_vertraege_overview(){
try{
    //GM_log("do_vertraege_overview");
    var pagedata=explode(GM_getValue(COUNTRY+"_"+SERVER+"_pagedataVertraegeOverview","{}"),"do_vertraege_overview/pagedataVertraegeOverview",{});
    GM_setValue(COUNTRY+"_"+SERVER+"_pagedataVertraegeOverview","{}");

    var candtable=document.getElementsByTagName("table");
    candtable[1].parentNode.style.height="310px";
    var candtd=candtable[0].getElementsByTagName("td");
    if (pagedata["contractview"]){
        candtd[1].bgColor="";
        candtd[2].bgColor="lightblue";
        buildAlteVertraege("In");
    }else{
        loadProductData();
        candtd[1].bgColor="lightblue";
        var candtr=candtable[1].getElementsByTagName("tr");
        var canda,user,newContract;
        var sumTotalOut=0;
        var valContractLogAmount=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valContractLogAmount",200);
        // vertraegeX[id]=[time,person,[[prod,amount,single price],...]]
        var vertraegeIn=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_vertraegeIn","[]"),"do_vertraege_overview/vertraegeIn",[]);
        var vertraegeInIndex={};
        for(var v=0;v<vertraegeIn.length;v++){
            if(isNaN(vertraegeIn[v][0])||(vertraegeInIndex[vertraegeIn[v][0]]>-1)){
                vertraegeIn.splice(v,1);
                v--;
            }else{
                vertraegeInIndex[vertraegeIn[v][0]]=v;
            }
        }       
        for(var v=0;v<candtr.length;v++){
            candtd=candtr[v].getElementsByTagName("td");
            canda=candtr[v].getElementsByTagName("a");
            if (canda[0]){
                var help=/'(\d+)',%20'(.*?)'%20/.exec(canda[0].href);
                if (help[2] == "in"){
                    if(COUNTRY=="SE"){
                        candtd[3].innerHTML=candtd[3].innerHTML.replace(/\.(\d\d)&/,",$1&");
                    }
                    if (vertraegeInIndex[help[1]]>-1){
                        vertraegeIn[vertraegeInIndex[help[1]]][1]=getFormattedTime(candtd[0].innerHTML);
                    }else{
                        user=/(.*?)&nbsp;/.exec(candtd[2].innerHTML+"&nbsp;")[1];
                        if(user.toLowerCase()!=USERNAME){
                            newContract=new Array();
                            newContract[0]=parseInt(help[1],10);
                            newContract[1]=getFormattedTime(candtd[0].innerHTML);
                            newContract[2]=user;
                            var help2=candtd[1].firstElementChild.innerHTML.replace(' style=""',"").replace("<b>","").replace("</b>","");
                            var preis=parseFloat(candtd[3].innerHTML.replace(/&nbsp;/g+getText("gamecurrency"),"").replace(regDelimThou,"").replace(regDelimDeci,"."),10);
                            if (help2.search(",")==-1){
                                var help3=help2.split(" x ");
                                newContract[3]=[[prodId[0][help3[1]],parseInt(help3[0],10),preis/parseInt(help3[0],10)]];
                            }else{
                                newContract[3]=preis;
                            }
                            vertraegeIn.push(newContract);
                            vertraegeInIndex[newContract[0]]=vertraegeIn.length-1;
                        }
                    }
                }else if(help[2] == "out"){
                    if(COUNTRY=="SE"){
                        candtd[3].innerHTML=candtd[3].innerHTML.replace(/\.(\d\d)&/,",$1&");
                    }
                    sumTotalOut += parseFloat(candtd[3].innerHTML.replace(regDelimThou,"").replace(regDelimDeci),10);
                }
            }
        }
        createElement("td",{"colspan":"3"},candtable[1]);
        createElement("td",{"style":"border-top:1px solid black;text-align:right;"},candtable[1],moneyFormatInt(sumTotalOut));
        vertraegeIn.sort(function(a,b){return (a[1]-b[1]);});
        vertraegeIn.splice(0,vertraegeIn.length-valContractLogAmount); // shrink on storage amount
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_vertraegeIn",implode(vertraegeIn));

        candtr=null;canda=null;
    }
    candtable=null;candtd=null;
}catch(err){GM_logError("do_vertraege_overview\n"+err);}
}

function do_vertraege_show(){
try{
    var spanError=ALL.getElementsByClassName("error");
    if (spanError.length>0){
        spanError[0].parentNode.style.height="25px";
        spanError[0].parentNode.style.top="262px";
    }
    spanError=null;

    loadProductData();
    var vertraegeIn=false,vertraegeInId;
    var candtable=document.getElementsByTagName("table");
    var candtr=candtable[1].getElementsByTagName("tr");
    var candtd;
    candtable[1].previousElementSibling.appendChild(candtable[1]);
    candtable[1].setAttribute("style","height:250px;margin-left:auto;margin-right:auto;"); //centering the table
    removeElement(candtable[1].getElementsByTagName("colgroup")[0]);
    candtable[1].firstElementChild.insertBefore(createElement("tr",{"style":"height: 20px;"}),candtable[1].firstElementChild.firstElementChild);
    createElement("td",{"colspan":"3","style":"border-top:1px solid #aaa;padding-right:5px;padding-left:5px;"},candtr[0]);
    createElement("td",{"colspan":"2","style":"border-top:1px solid #aaa;border-left:1px dashed black;padding-right:5px;padding-left:5px;"},candtr[0],getText("price"));
    createElement("td",{"style":"border-top:1px solid #aaa;border-left:1px dashed black;padding-right:5px;padding-left:5px;"},candtr[0]);
    createElement("td",{"colspan":"2","style":"border-top:1px solid #aaa;border-left:1px dashed black;padding-right:5px;padding-left:5px;"},candtr[0],getText("marketPrice"));
    if (pageZusatz["typ"]=="in"){
        vertraegeIn=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_vertraegeIn","[]"),"do_vertraege_show/vertraegeIn",[]);
        for(vertraegeInId=vertraegeIn.length-1;vertraegeInId>=0;vertraegeInId--){
            if(vertraegeIn[vertraegeInId][0]==pageZusatz["v"]){ break; }
        }
        if(vertraegeInId==-1){
            vertraegeInId=(vertraegeIn.push([]))-1;
            vertraegeIn[vertraegeInId][0]=pageZusatz["v"];
            vertraegeIn[vertraegeInId][1]=now;
            vertraegeIn[vertraegeInId][2]=/\s*(.*)&nbsp;/.exec(candtable[1].parentNode.innerHTML)[1];
        }
        vertraegeIn[vertraegeInId][3]=new Array();
    }
    var sum=0;
    var borderStr;
    for(var w=1;w<candtr.length-2;w++){
        candtr[w].setAttribute("class","hoverBgLightbrown");
        candtd=candtr[w].getElementsByTagName("td");
        if(COUNTRY=="SE"){ candtd[4].innerHTML=candtd[4].innerHTML.replace(/\.(\d\d)\&/,",$1&"); }
        var thisData=[prodId[0][candtd[2].innerHTML],parseInt(candtd[0].innerHTML,10),parseFloat(candtd[4].innerHTML.replace(regDelimThou,"").replace(regDelimDeci,"."),10)];
        if(vertraegeIn){
            vertraegeIn[vertraegeInId][3].push(thisData);
        }
        borderStr="border-bottom:"+candtd[0].style.borderBottom+";border-top:"+candtd[0].style.borderTop+";";
        candtd[0].innerHTML=numberFormat(thisData[1]);
        candtd[0].style.paddingRight="5px";
        candtd[1].innerHTML="";
        produktPic(0,thisData[0],candtd[1]);
        removeElement(candtd[3]);
        candtd[2].style.paddingRight="5px";
        candtd[3].style.borderLeft="1px dashed black";
        candtd[3].style.paddingLeft="5px";
        candtd[3].style.paddingRight="5px";
        candtd[3].innerHTML=numberFormat(thisData[2],2)+"&nbsp;:";
        createElement("td",{"style":borderStr+"padding-right:5px;padding-left:5px;text-align:right;"},candtr[w],numberFormat(thisData[1]*thisData[2],2));
        createElement("td",{"style":borderStr+"border-left:1px dashed black;padding-right:5px;padding-left:5px;text-align:right;"},candtr[w],numberFormat(100*thisData[2]/gut[thisData[0]],1)+"%");
        createElement("td",{"style":borderStr+"border-left:1px dashed black;padding-right:5px;padding-left:5px;text-align:right;"},candtr[w],numberFormat(gut[thisData[0]],2)+"&nbsp;:");
        var help=thisData[1]*gut[thisData[0]];
        createElement("td",{"style":borderStr+"padding-right:5px;padding-left:5px;text-align:right;"},candtr[w],numberFormat(help,2));
        sum += help;
    }
    candtd=candtr[candtr.length-2].getElementsByTagName("td");
    //removeElement(candtd[0]);
    candtd[0].style.paddingRight="5px";
    candtd[0].align="left";
    var preis=parseFloat(candtd[1].firstElementChild.innerHTML.replace(regDelimThou,"").replace(regDelimDeci,"."),10);
    candtd[1].firstElementChild.innerHTML=numberFormat(preis,2);
    candtd[1].style.paddingRight="5px";
    createElement("td",{"style":"border-left:1px dashed black;padding-right:5px;padding-left:5px;text-align:right;"},candtr[w],numberFormat(100*preis/sum,1)+"%");
    createElement("td",{"style":"border-left:1px dashed black;padding-right:5px;padding-left:5px;text-align:right;","colspan":"2"},candtr[w],numberFormat(sum,2));

    if(vertraegeIn){
        vertraegeIn.sort(function(a,b){return (a[1]-b[1]);});
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_vertraegeIn",implode(vertraegeIn));
    }
    candtable=null;canddiv=null;candtr=null;candtd=null;
}catch(err){GM_logError("do_vertraege_show\n"+err);}
}

//***********************************************************************************************************

function do_hilfe(){
    var canddiv=new Array();
    for(var v=0;v<ALL.childElementCount;v++){ if(ALL.children[v].id=="") canddiv.push(ALL.children[v]); }
    canddiv[1].id="helpmenu";
    canddiv[1].style.left="0";
    canddiv[1].style.width="155px";
    canddiv[1].style.overflowX="hidden";
    canddiv[1].style.overflowY="auto";
    canddiv[2].id="helpbody";
    canddiv=$("helpmenu").getElementsByTagName("div");
    for(var v=0;v<canddiv.length;v++){ if(canddiv[v].getAttribute("class")=="list_header"){ break; }}
    var newdiv=createElement("div",{"id":"helpmenuLinks","style":"margin-bottom:10px;"});
    $("helpmenu").insertBefore(newdiv,canddiv[v]);
    newdiv=createElement("div",{},newdiv);
    var newa=createElement("a",{"class":"list_header","href":"#"},newdiv,getText("adviser"));
    newa.addEventListener("click",function(){
        try{
            var div,help,i=0;
            var container=$("helpbody");
            container.innerHTML="";
            div=createElement("div",{"class":"tnormal"},container);
            createElement("b",{},div,getText("adviser"));
            while(help=getText("help_"+(i++))){
                div=createElement("div",{"class":"tmenu"},container);
                if(help[0]){ createElement("b",{},div,help[0]); }
                if(help[1]){ createElement("p",{},div,help[1]); }
            }
            container=null;div=null;
        }catch(err){GM_logError("help.click\n"+err);}   
    },false);
    if (GM_getValue("tutorial",0)==0){
        click(newa);
        GM_setValue("tutorial",1);
    }

    switch(pageZusatz["item"]){
    case "18":{ // Questlist
        loadProductData();
        top.unsafeData.questData=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_questData"),"help/questData",INIT_questData);
        var nodes = {};
        nodes["helpbody"]=$("helpbody");
        nodes["questinfos_select"]=createElement("select",{"id":"questinfos_select","class":"link"},nodes["helpbody"].children[0]);
        nodes["questinfos_select"].addEventListener("click",function(){
            for(var v=0;v<this.childElementCount;v++){
                if(this.children[v].value==this.value){
                    $("questinfos_"+this.children[v].value).style.display="block";
                    do_hilfe_questlist(this.children[v].value);
                }else{
                    $("questinfos_"+this.children[v].value).style.display="none";
                }
            }
        },false);
        nodes["questinfos"]=$("questinfos");
        removeElement(nodes["questinfos"].children[nodes["questinfos"].childElementCount-1]);
        
        /*
        var normal_quest=new Array();
        var cand, canddiv, qnr=0, prodId, amount;
        for(var v=0;v<$("questinfos").childElementCount;v++){
            try{
                cand = $("questinfos").children[v];
                if(cand.childElementCount<2){
                    GM_log("Questlist: "+implode(normal_quest));
                    normal_quest=new Array();
                    continue;
                }
                qnr = parseInt(cand.children[0].innerHTML.replace(".",""),10);
                if(!normal_quest[qnr]){ normal_quest[qnr]= new Array(); }
                if(!normal_quest[qnr][0]){ normal_quest[qnr][0] = new Array(); }
                if(!normal_quest[qnr][3]){ normal_quest[qnr][3] = new Array(); }

                canddiv=cand.children[1];//.getElementsByTagName("div");
                for(var k=0;k<canddiv.childElementCount;k++){
                    prodId = parseInt(canddiv.children[k].children[0].getAttribute("class").replace("kp",""),10);
                    amount = parseInt(canddiv.children[k].children[1].innerHTML.replace(/[x*|&nbsp;|\.]/gi,""),10);
                    normal_quest[qnr][0].push([0,prodId,amount]);
                }
                
                normal_quest[qnr][1] = (v<100?1:2);

                for(var k=0;k<cand.children[2].childElementCount;k++){
                    canddiv = cand.children[2].children[k];
                    if(canddiv.innerHTML.indexOf("points.gif")>=0){
                        normal_quest[qnr][2] = parseInt(canddiv.innerHTML.replace(/.*&nbsp;/,"").replace(/\./g,""),10);
                    }else if(canddiv.innerHTML.indexOf("money.gif")>=0){
                        //normal_quest[qnr][3].push([0,parseInt(canddiv.innerHTML.replace(/.*&nbsp;/,"").replace(/\./g,""),10)]);
                        normal_quest[qnr][3]=[0,parseInt(canddiv.innerHTML.replace(/.*&nbsp;/,"").replace(/\./g,""),10)];
                    }else if(canddiv.innerHTML.indexOf("adbonus.gif")>=0){
                        //normal_quest[qnr][3].push([5,1]);
                        normal_quest[qnr][3]=[5,1];
                    }else if(canddiv.className.indexOf("kp")>=0 && cand.children[2].children[k+1].innerHTML.toLowerCase().indexOf("minuten")>=0){  //change to language where reading
                        //normal_quest[qnr][3].push([4,parseInt(canddiv.className.replace("kp",""),10),parseInt(cand.children[2].children[k+1].innerHTML.replace(/[A-z ] /,""),10)]);
                        normal_quest[qnr][3]=[4,parseInt(canddiv.className.replace("kp",""),10),parseInt(cand.children[2].children[k+1].innerHTML.replace(/[A-z ] /,""),10)];
                        k++;
                    }else if(canddiv.innerHTML.toLowerCase().indexOf("boerderij")>=0){ //change to language where reading
                        //normal_quest[qnr][3].push([3,parseInt(canddiv.innerHTML.replace(/\.[A-z ] /,""),10)]);
                        normal_quest[qnr][3]=[3,parseInt(canddiv.innerHTML.replace(/\.[A-z ] /,""),10)];
                    }else if(canddiv.innerHTML.toLowerCase().indexOf("voorraadkast")>=0){  //change to language where reading
                        //normal_quest[qnr][3].push([2,parseInt(canddiv.innerHTML.replace(/\.[A-z ] /,""),10)]);
                        normal_quest[qnr][3]=[2,parseInt(canddiv.innerHTML.replace(/\.[A-z ] /,""),10)];
                    }else if(canddiv.className.indexOf("kp")>=0){
                        //normal_quest[qnr][3].push([1,parseInt(canddiv.className.replace("kp",""),10)]);
                        normal_quest[qnr][3]=[1,parseInt(canddiv.className.replace("kp",""),10)];
                    }
                }
                if(normal_quest[qnr][3].length==0){ delete normal_quest[qnr][3];}
            }catch(err){GM_logError("at quest nr:"+qnr+" k:"+k+"\n"+err+"\n"+cand.innerHTML);}
        }
        GM_log("Questlist: "+implode(normal_quest));
        */

        var line,cell,help;
        var type,prod,amount,item,questCurr,quCamp=1,quNr=0;
        // initial prepare of the tables
        nodes["questinfos_"+quCamp]=createElement("div",{"id":"questinfos_"+quCamp,"style":"color:black;display:block;height:325px;overflow-x:hidden;overflow-y:scroll;"},nodes["helpbody"]);
        createElement("option",{"value":quCamp},nodes["questinfos_select"],quCamp);
        //*task_new_quest*/ var ALL_GEN_QUESTS="";
        while(nodes["questinfos"].childElementCount>0){
            line=nodes["questinfos"].children[0];
            if(line.childElementCount==0){
                quCamp++;
                nodes["questinfos_"+quCamp]=createElement("div",{"id":"questinfos_"+quCamp,"style":"color:black;display:none;height:325px;overflow-x:hidden;overflow-y:scroll;"},nodes["helpbody"]);
                createElement("option",{"value":quCamp},nodes["questinfos_select"],quCamp);
                quNr=0;
                removeElement(line);
            } else {
                quNr++;
                if(QUESTS["main"][quCamp]&&QUESTS["main"][quCamp][quNr]){
                    line.addEventListener("click",function(){
                        var quCamp=this.parentNode.id.replace("questinfos_","");
                        top.unsafeData.questData["main"][quCamp]["nr"]=parseInt(this.children[0].innerHTML,10);
                        GM_setValueCache(COUNTRY+"_"+SERVER+"_"+USERNAME+"_questData",implode(top.unsafeData.questData));
                        do_hilfe_questlist(quCamp);
                        if((0<top.unsafeData.questData["main"][quCamp]["calcTo"])&&(top.unsafeData.questData["main"][quCamp]["calcTo"]<top.unsafeData.questData["main"][quCamp]["nr"])){
                            setCalcToQuest("main",quCamp,top.unsafeData.questData["main"][quCamp]["nr"]);
                        }
                    },false);
                    questCurr=QUESTS["main"][quCamp][quNr];
                    for(var j=0;j<questCurr[0].length;j++){
                        if(typeof questCurr[0][j][0]=="object"){
                            for(var k=0;k<questCurr[0][j].length;k++){
                                if(isNaN(NPC[questCurr[0][j][k][0]][questCurr[0][j][k][1]])){
                                    questCurr[0][j][k][3]=Math.round(questCurr[0][j][k][2]*gut[questCurr[0][j][k][1]]*100)/100;
                                }else{
                                    questCurr[0][j][k][3]=Math.round(questCurr[0][j][k][2]*Math.min(gut[questCurr[0][j][k][1]],NPC[questCurr[0][j][k][0]][questCurr[0][j][k][1]])*100)/100;
                                }
                                questCurr[0][j][k][4]=true;
                                for(var l=0;l<k;l++){
                                    if(questCurr[0][j][l][3]>questCurr[0][j][k][3]){ questCurr[0][j][l][4]=false; }
                                    else { questCurr[0][j][k][4]=false; }
                                }
                            }
                        }else{
                            if(isNaN(NPC[questCurr[0][j][0]][questCurr[0][j][1]])){
                                questCurr[0][j][3]=Math.round(questCurr[0][j][2]*gut[questCurr[0][j][1]]*100)/100;
                            }else{
                                questCurr[0][j][3]=Math.round(questCurr[0][j][2]*Math.min(gut[questCurr[0][j][1]],NPC[questCurr[0][j][0]][questCurr[0][j][1]])*100)/100;
                            }
                            questCurr[0][j][4]=true;
                        }
                    }               
                    for(var i=0;i<line.children[1].childElementCount;i++){
                        cell = line.children[1].children[i];
                        cell.style.backgroundColor = "";
                        type=0;
                        prod=parseInt(cell.children[0].getAttribute("class").replace("kp",""),10);
                        amount=parseInt(cell.children[1].innerHTML.replace(/&nbsp;/g,"").replace("x",""),10);
                        item=null;
                        for(var j=0;j<questCurr[0].length;j++){
                            if(typeof questCurr[0][j][0]=="object"){
                                for(var k=0;k<questCurr[0][j].length;k++){
                                    if((type==questCurr[0][j][k][0])&&(prod==questCurr[0][j][k][1])){ item=questCurr[0][j][k]; }
                                }
                            }else{
                                if((type==questCurr[0][j][0])&&(prod==questCurr[0][j][1])){ item=questCurr[0][j]; }
                            }
                        }   
                        if(item){
                            if(!item[4]){
                                cell.children[1].style.textDecoration="line-through";
                                cell.children[2].style.textDecoration="line-through";
                            }
                            cell.setAttribute("value",implode(item));
                            cell.addEventListener("mouseover",function(event){
                                var help=explode(this.getAttribute("value"),"questlist/mouseover",[]);
                                toolTip.show(event,numberFormat(help[2])+" "+prodName[help[0]][help[1]]+" ("+moneyFormatLimit(help[3]/help[2],100)+") = "+moneyFormatLimit(help[3],10000));
                            },false);
                            if(amount!=item[2]){
                                GM_log("Questlist-Help: Quest main."+quCamp+"."+quNr+". Amount of product "+prodName[type][prod]+ " wrong! data="+numberFormat(item[2])+" read="+numberFormat(amount));
                            }
                        }else{
                            GM_log("Questlist-Help: Quest main."+quCamp+"."+quNr+". Data of product "+prodName[type][prod]+ " unknown! [i="+i+", prod="+prod+"]"); 
                        }
                        if(amount>=10000){ cell.children[1].innerHTML="&nbsp;"+numberFormat(amount/1000)+"k&nbsp;"; }
                        else { cell.children[1].innerHTML="&nbsp;"+numberFormat(amount)+"&nbsp;"; }
                        if(prodBlock[type][prod]){ cell.children[2].style.backgroundColor="red"; }
                        createElement("span",{"style":"color:red;"},cell.children[2]);
                    }
                }else{
                    GM_log("Questlist-Help: Quest main."+quCamp+"."+quNr+" unknown!");
                    //*task_new_quest*/ var GEN_QUESTS=[[],,0];
                    //*task_new_quest*/ for(var i=0;i<line.children[1].childElementCount;i++){
                    //*task_new_quest*/     cell = line.children[1].children[i];
                    //*task_new_quest*/     type=0;
                    //*task_new_quest*/     prod=parseInt(cell.children[0].getAttribute("class").replace("kp",""),10);
                    //*task_new_quest*/     amount=parseInt(cell.children[1].innerHTML.replace(/&nbsp;/g,"").replace("x",""),10);
                    //*task_new_quest*/     GEN_QUESTS[0].push([type,prod,amount]);
                    //*task_new_quest*/ }
                    //*task_new_quest*/ GEN_QUESTS[2]=line.children[2].innerHTML;
                    //*task_new_quest*/ ALL_GEN_QUESTS+="GEN_QUESTS main."+quCamp+"."+quNr+"="+implode(GEN_QUESTS)+"\n";
                }
                nodes["questinfos_"+quCamp].appendChild(line);
            }
        }
        //*task_new_quest*/ GM_log(ALL_GEN_QUESTS);
        removeElement(nodes["helpbody"].getElementsByTagName("table")[0]);

        createElement("div",{"id":"questcalculation","style":"position:fixed;top:7px;right:3px;width:80px;"},nodes["helpbody"]);
        var newsel=createElement("select",{"id":"selectQuestCalcTo","style":"position:absolute;top:7px;left:0;width:50px;height:18px;"},$("questcalculation"));
        createElement("div",{"id":"queststocks","style":"position:absolute;top:28px;left:0;width:80px;height:220px;border:1px solid #6c441e;overflow-y:auto;overflow-x:hidden;"},$("questcalculation"));
        var newinp=createElement("input",{"id":"questvsrack","type":"checkbox","class":"link","checked":true,"style":"position:absolute;top:250px;right:3px;"},$("questcalculation"));
        newdiv.addEventListener("mouseover",function(event){ toolTip.show(event,getText("showMissingProducts")); },false);
        newinp.addEventListener("click",function(){change($("selectQuestCalcTo"));},false);
        newsel.addEventListener("change",function(){
            var questinfos_select=$("questinfos_select");
            for(var v=0;v<questinfos_select.childElementCount;v++){
                if($("questinfos_"+questinfos_select.children[v].value).style.display=="block"){
                    top.unsafeData.setCalcToQuest("main",questinfos_select.children[v].value,this.value);
                    fill_hilfe_calcToQuest(questinfos_select.children[v].value);
                    break;
                }
            }
            questinfos_select=null;
        },false);

        function fill_hilfe_calcToQuest(quCamp){
            var cell=$("queststocks");
            cell.innerHTML="";
            var prd=new Object();
            var cand,prod,help=null;
            for(var v=top.unsafeData.questData["main"][quCamp]["nr"]-1;v<top.unsafeData.questData["main"][quCamp]["calcTo"];v++){
                cand=$("questinfos_"+quCamp).children[v].children[1];
                for(var i=0;i<cand.childElementCount;i++){
                    help=cand.children[i].getAttribute("value");
                    if(help){
                        help=explode(help,"fill_hilfe_calcToQuest");
                        if(help[4]){
                            if (!prd[help[1]]){ prd[help[1]]=0; }
                            prd[help[1]] += help[2];
                        }
                    }
                }
            }
            var counter=0;
            for(var v=0;v<prodNameSort[0].length;v++){
                prod = prodNameSort[0][v];
                //if ($("questvsrack").checked && (prodStock[0][v] > prd[v])) continue;
                if((!prodBlock[0][prod].match(/t/))&&(!prodBlock[0][prod].match(/l/))&&prd[prod]){
                    var newdiv=createElement("div",{"style":"display:inline-block;width:100%;background-color:"+(prodBlock[0][prod]?"red":((counter%2)?"#ad9e7d;":"#a59574;"))},cell);
                    produktPic(0,prod,newdiv);
                    if($("questvsrack").checked){
                        if(prodStock[0][prod] < prd[prod]){
                            createElement("span",{"style":"color:"+(prodBlock[0][prod]?"black":"red")+ ";"},newdiv,"-"+numberFormat(prd[prod]-prodStock[0][prod]));
                        }else{
                            createElement("span",{"style":"color:black;"},newdiv,"+"+numberFormat(prodStock[0][prod]-prd[prod]));
                        }
                    }else{
                        createElement("span",{"style":"color:black;"},newdiv,numberFormat(prd[prod]));
                    }
                    counter++;
                }
            }
            cell=null;newdiv=null;v=null;prd=null;counter=null;cand=null;help=null;prod=null;
        }

        function do_hilfe_questlist(quCamp){
            var questinfos=$("questinfos_"+quCamp);
            var line;
            for(var v=0;v<top.unsafeData.questData["main"][quCamp]["nr"]-1;v++){
                line=questinfos.children[v];
                if(line.style.opacity!="0.5"){ line.style.opacity="0.5"; }
                if(line.getAttribute("class")!="hoverBgCc9"){ line.setAttribute("class","hoverBgCc9"); }
                // cand=line.getElementsByTagName("div");
                // if(cand[1].style.backgroundColor!=""){ cand[1].style.backgroundColor=""; }
                // if(cand[2].style.backgroundColor!=""){ cand[2].style.backgroundColor=""; }
                // if(cand[5].style.backgroundColor!=""){ cand[5].style.backgroundColor=""; }
                // if(cand[6].style.backgroundColor!=""){ cand[6].style.backgroundColor=""; }
            }

            if(top.unsafeData.questData["main"][quCamp]["nr"]<=questinfos.childElementCount){
                var newsel=$("selectQuestCalcTo");
                newsel.innerHTML="";
                var prodcounter=new Object();
                createElement("option",{"value":0},newsel,"--");
                for(var v=top.unsafeData.questData["main"][quCamp]["nr"]-1;v<questinfos.childElementCount;v++){
                    createElement("option",{"value":v+1},newsel,v+1);
                    line = questinfos.children[v];
                    if(line.style.opacity!="1"){ line.style.opacity="1"; }
                    if(line.getAttribute("class")!="hoverBgCc9"){ line.setAttribute("class","hoverBgCc9"); }
                    for(var i=0;i<line.children[1].childElementCount;i++){
                        help=line.children[1].children[i].getAttribute("value");
                        if(help){
                            help=explode(help,"do_hilfe_questlist",[]);
                            if(help[4]){
                                if(!prodBlock[help[0]][help[1]]){
                                    if (!prodcounter[help[1]]){ prodcounter[help[1]]=0; }
                                    prodcounter[help[1]] += help[2];
                                    if(v==top.unsafeData.questData["main"][quCamp]["nr"]-1){
                                        if(top.unsafeData.questData["main"][quCamp]["given"][help[0]]&&top.unsafeData.questData["main"][quCamp]["given"][help[0]][help[1]]){
                                            prodcounter[help[1]] -= top.unsafeData.questData["main"][quCamp]["given"][help[0]][help[1]];
                                        }
                                    }
                                    if(prodStock[help[0]][help[1]] < prodcounter[help[1]]){
                                        if(prodcounter[help[1]]-prodStock[help[0]][help[1]]>10000){
                                            line.children[1].children[i].children[2].children[0].innerHTML = "&nbsp;(" + numberFormat((prodcounter[help[1]]-prodStock[help[0]][help[1]])/1000) + "k)";
                                        }else{
                                            line.children[1].children[i].children[2].children[0].innerHTML = "&nbsp;(" + numberFormat(prodcounter[help[1]]-prodStock[help[0]][help[1]]) + ")";
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                questinfos.children[top.unsafeData.questData["main"][quCamp]["nr"]-1].setAttribute("class","divCurrentQuest");
                if(questinfos.children[top.unsafeData.questData["main"][quCamp]["nr"]-2]){
                    questinfos.scrollTop=questinfos.children[top.unsafeData.questData["main"][quCamp]["nr"]-2].offsetTop;
                }
                if(top.unsafeData.questData["main"][quCamp]["calcTo"]>0){
                    newsel.value=Math.max(top.unsafeData.questData["main"][quCamp]["nr"],Math.min(questinfos.childElementCount,top.unsafeData.questData["main"][quCamp]["calcTo"]));
                }
                fill_hilfe_calcToQuest(quCamp);
                newsel=null;
            }else{
                questinfos.scrollTop=questinfos.lastChildElement.offsetTop;
            }
            questinfos=null;line=null;
        }
        do_hilfe_questlist("1");

        line=null;cell=null;help=null;
        newsel=null;prodcounter=null;newinp=null;
    break; }
    }

    newdiv=null;newa=null;canddiv=null;
}

//***********************************************************************************************************

function do_multiframe(){
    if($top("multiframe")){
        if(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valDrag",false)){ makeDraggable(ALL,true,true,"multiframe"); }
    }
}

//***********************************************************************************************************
// Dragging
var valMouseXY=["",0,0,0,0];
var dragPos=new Object();
var doDrag=new Object();
function makeDraggable(appendTo,doDragX,doDragY,dragObjId){
    if(typeof(doDragX)!="boolean") doDragX=true;
    if(typeof(doDragY)!="boolean") doDragY=true;
    if(typeof(dragObjId)!="string") dragObjId=appendTo.id;
    //GM_log("makeDraggable:"+appendTo+":"+doDragX+":"+doDragY+":"+dragObjId);
    doDrag[dragObjId]=[doDragX,doDragY];
    var help=GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_dragPos_"+dragObjId,"");
    var dragObj=$top(dragObjId);
    if (help){
        dragPos[dragObjId]=help.split("|");
        if(doDragX) dragObj.style.left=dragPos[dragObjId][0]+"px";
        if(doDragY) dragObj.style.top=dragPos[dragObjId][1]+"px";
        dragObj.style.margin="";
        dragObj.style.marginLeft="";
        dragObj.style.marginTop="";
    }else{
        x=parseInt(dragObj.style.left+"0",10)+parseInt(dragObj.style.marginLeft+"0",10);
        y=parseInt(dragObj.style.top+"0",10)+parseInt(dragObj.style.marginTop+"0",10);
        if(doDragX) dragObj.style.left=x+"px";
        if(doDragY) dragObj.style.top=y+"px";
        dragObj.style.margin="";
        dragObj.style.marginLeft="";
        dragObj.style.marginTop="";
        dragPos[dragObjId]=[x,y];
    }

    var newdiv=createElement("div",{"id":dragObjId+"Drag","style":"cursor:move;position:absolute;top:0;left:0;width:10px;height:20px;background-color:blue;opacity:0.4;"},appendTo);
    newdiv.addEventListener("mousedown", function(event){
        valMouseXY=[this.id.replace("Drag",""),"x","y"];
        top.window.addEventListener("mousemove", mousemoveDrag ,false);
        top.window.addEventListener("mouseup", mouseupDrag ,false);
        var dragObj=$top(valMouseXY[0]);
        createElement("div",{"id":"divDragHelper","style":"position:absolute;display:block;z-index:200;height:"+dragObj.style.height+";width:"+dragObj.style.width+";top:"+dragObj.style.top+";left:"+dragObj.style.left+";background-color:blue;"},dragObj.parentNode);
        dragObj=null;
    },false);
    dragObj=null;newdiv=null;
}
mousemoveDrag = function(event){
//GM_log("mousemoveDrag");
    if (valMouseXY[0] != ""){
        if(valMouseXY[1]=="x") valMouseXY=[valMouseXY[0],event.pageX,event.pageY]; // init
        var dragObj=$top(valMouseXY[0]);
        var divDragHelper=$top("divDragHelper");
        if(doDrag[valMouseXY[0]][0]){
            dragObj.style.left=(parseInt(dragObj.style.left+"0",10) + (event.pageX - valMouseXY[1]))+'px';
            divDragHelper.style.left=dragObj.style.left;
        }
        if(doDrag[valMouseXY[0]][1]){
            dragObj.style.top= (parseInt(dragObj.style.top+"0",10) + (event.pageY - valMouseXY[2]))+'px';
            divDragHelper.style.top=dragObj.style.top;
        }
        valMouseXY=[valMouseXY[0],event.pageX,event.pageY];
        dragObj=null;divDragHelper=null;
    }
};
mouseupDrag = function(event){
//GM_log("mouseupDrag");
    top.window.removeEventListener("mousemove", mousemoveDrag ,false);
    if (valMouseXY[0] != ""){
        var dragObj=$top(valMouseXY[0]);
        dragPos[valMouseXY[0]]=[parseInt(dragObj.style.left+"0",10),parseInt(dragObj.style.top+"0",10)];
        GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_dragPos_"+valMouseXY[0],dragPos[valMouseXY[0]].join("|"));
        removeElement($top("divDragHelper"));
        dragObj=null;
    }
    valMouseXY=["",0,0,0,0];
    top.window.removeEventListener("mouseup", mouseupDrag ,false);
};

//***********************************************************************************************************
function resetVariables(){
/*
    createElement("div",{"id":"transp100","mode":"","style":"z-index:100;background-color:black;opacity:0.7;position:absolute;top:0;left:0;width:100%;height:100%;display:block;"},$("main_container"));
    newdiv=createElement("div",{"id":"infoPanel","mode":"","style":"position:absolute;top:50px;left:240px;width:660px;height:580px;background-color:#b8a789;z-index:101;display:block;"},$("main_container"));
    createElement("img",{"src":GFX+"guild/help_back.jpg","style":"position:absolute;top:0;left:0;width:100%;height:100%;z-index:-1;"},newdiv);
    createElement("div",{"id":"infoPanelInner","class":"tnormal","style":"position:absolute;width:595px;height:89%;margin:5%;overflow:auto;"},newdiv);
    var newimg=createElement("img",{"id":"infoPanelClose","class":"link","src":GFX+"close.jpg","style":"position:absolute;top:8px;right:8px;width:20px;height:20px;"},newdiv);
    newimg.addEventListener("click",function(){
        $("transp100").style.display = "none";
        $("infoPanel").style.display = "none";
    },false);

    try{
        var loginStr = new Array(new Object(), new Object(), new Object(), new Object());//[0]=global,[1]=server,[2]=user,[3]=vars over
        var listVars = cloneInto(GM_listValues(), unsafeWindow);
        var found = false;
        try{logindata=explode(GM_getValue("logindata","[]"),"resetVariables\logindata");
            for(var v=0;v<logindata.length;v++){
                loginStr[0][logindata[v][0]]=true;
                loginStr[1][logindata[v][0]+"_"+logindata[v][1]]=true;
                loginStr[2][logindata[v][0]+"_"+logindata[v][1]+"_"+logindata[v][2]]=true;
            }
            loginStr[0].sortObj();
            GM_log("loginStr[0]:"+implode(loginStr[0]));
            loginStr[1].sortObj();
            GM_log("loginStr[1]:"+implode(loginStr[1]));
            loginStr[2].sortObj();
            GM_log("loginStr[2]:"+implode(loginStr[2]));

            for(var v in listVars){
                if(!listVars.hasOwnProperty(v)){continue;}
                found=false;
                for(var elm in loginStr[2]){
                    if(!loginStr[2].hasOwnProperty(elm)){continue;}
                    if(help=listVars[v].match(new RegExp("^"+elm+"_(.*)"))){
                        found=true;
                        loginStr[3][help[1]]=true;
                    }
                }
                if(!found){
                    for(var elm in loginStr[1]){
                        if(!loginStr[1].hasOwnProperty(elm)){continue;}
                        if(help=listVars[v].match(new RegExp("^"+elm+"_[^_]*_(.*)"))){
                            found=true;
                            loginStr[3][help[1]]=true;
                        }
                    }
                }
                if(found){
                    delete listVars[v];
                }
            }
            loginStr[3].sortObj();
            GM_log("loginStr[3]:"+implode(loginStr[3]));
            listVars.sort();
            GM_log("listVars:"+implode(listVars));

        }catch(err){GM_log("1:"+err);}
    }catch(err){GM_log("2:"+err);}
    return false;
*/
    if(confirm("Do you really want to reset zone data?")){
        var help=cloneInto(GM_listValues(), unsafeWindow);
        var help2;
        for(var v=0;v<help.length;v++){
            if(help[v].match(/_gut$/)){if(GM_getValue(help[v],"").indexOf("|")>0){ GM_deleteValue(help[v]); }}
            if(help[v].match(/_gutBeob$/)){if(GM_getValue(help[v],"").indexOf("|")>0){ GM_deleteValue(help[v]); }}

            if(help[v].match(/_prodName$/)){GM_deleteValue(help[v]);}
            if(help[v].match(/_prodNameSort$/)){GM_deleteValue(help[v]);}

            if(help[v].match(/_valGlobalTimeAdd$/)){GM_deleteValue(help[v]);}
            if(help[v].match(/_lodgeQuestData$/)){GM_deleteValue(help[v]);}
            if(help[v].match(/_prodStock$/)){GM_deleteValue(help[v]);}
            if(help[v].match(/_prodMinRack$/)){GM_deleteValue(help[v]);}
            if(help[v].match(/_prodMinRackInit$/)){GM_deleteValue(help[v]);}
            if(help[v].match(/_totalForestryFarmis$/)){GM_deleteValue(help[v]);}
            if(help[v].match(/_prodYield$/)){GM_deleteValue(help[v]);}
            if(help[v].match(/_prodRequire$/)){GM_deleteValue(help[v]);}

            if(help[v].match(/_changedata$/)){GM_deleteValue(help[v]);}
        }
        // GM_log(print_r(total));
        GM_deleteValue("loginbusy");
        if(GAMEPAGES[COUNTRY]){
            location.href="http://www."+GAMEPAGES[COUNTRY]+"/login.php?start=1";
        }
    }
}
function manageVariables(){
    // 1: historic data - not reproducible!
    // 2: collectable data
    // 3: options, settings
    // 4: temporary data = 2?
    // 5: useless, old data
    function buildManageVariables(){
    try{
        var container=$("divManageVariablesInner");
        container.innerHTML="";
        var containerPart = createElement("div",{"style":"height:10%;"},container);
        createElement("div",{"style":"font-weight:bold;"},containerPart,"Variable Management "+getText("adviser"));

        var newinput=createElement("select",{"class":"link"},containerPart);
        createElement("option",{"value":"GLOBAL"},newinput,"GLOBAL");
        createElement("option",{"value":"ALL"},newinput,"ALL");
        createElement("option",{"value":"UNKNOWN"},newinput,"UNKNOWN");
        createElement("option",{"value":"USELESS"},newinput,"USELESS");
        newinput.addEventListener("click",function(){
            buildExportTable(this.value);
        },false);

        var variables = {};
        variables["GLOBAL"] = [];
        var help = cloneInto(GM_listValues(), unsafeWindow);
        help.sort();
        var help2;                  
        for(var v=0;v<help.length;v++){
            help2 = (/^([A-Z]{2}_\d+_.+?_)(.*)$/).exec(help[v]); // COUNTRY_SERVER_USER_...
            if(!help2){ help2 = (/^([A-Z]{2}_\d+_)(.*)$/).exec(help[v]); // COUNTRY_SERVER_...
                if(!help2){ help2 = (/^([A-Z]{2}_)(.*)$/).exec(help[v]); // COUNTRY_...
            }   }
            
            if(help2){
                if(!variables[help2[1]]){ 
                    variables[help2[1]] = []; 
                    createElement("option",{"value":help2[1]},newinput,help2[1]);
                }
                variables[help2[1]].push(help2[2]);
            } else {
                variables["GLOBAL"].push(help[v]); // GLOBAL
            }
        }

        newinput=createElement("button",{"class":"link","style":"margin-left:20px;"},containerPart,"Select all");
        newinput.addEventListener("click",function(){
            var container=$("divManageVariablesInner");
            var rows = container.children[1].getElementsByTagName("tr");
            var checkedNew;
            if(this.innerHTML=="Select all"){
                checkedNew = true;
                this.innerHTML="Unselect all";
            } else {
                checkedNew = false;
                this.innerHTML="Select all";
            }
            for (var v=0;v<rows.length;v++){
                rows[v].children[0].children[0].checked = checkedNew;
            }
            
        },false);

        newinput=createElement("button",{"class":"link","style":"margin-left:20px;"},containerPart,"Delete");
        newinput.addEventListener("click",function(){
            var container=$("divManageVariablesInner");
            var rows = container.children[1].getElementsByTagName("tr");
            var variables = [];
            var acc, varname;
            var str = "Delete following variables:";
            for (var v=0;v<rows.length;v++){
                if(rows[v].children[0].children[0].checked){
                    acc = rows[v].children[1].innerHTML;
                    varname = rows[v].children[2].innerHTML;
                    variables.push(acc+varname);
                    if(variables.length<11){ str += "\n"+acc+varname; }
                }
            }
            if(variables.length>0){
                if(variables.length>10){ str += "\n..." }
                if(confirm(str)){
                    for (var v=0;v<variables.length;v++){
                        GM_deleteValue(variables[v]);
                    }
                    buildManageVariables();
                }
            } else {
                alert("Nothing selected");
            }
        },false);
    
        newinput=createElement("button",{"class":"link","style":"margin-left:20px;"},containerPart,"Create storage string");
        newinput.addEventListener("click",function(){
            var container=$("divManageVariablesInner");
            var rows = container.children[1].getElementsByTagName("tr");
            var variables = [];
            var acc, varname;
            for (var v=0;v<rows.length;v++){
                if(rows[v].children[0].children[0].checked){
                    acc = rows[v].children[1].innerHTML;
                    varname = rows[v].children[2].innerHTML;
                    variables.push([acc+varname,GM_getValue(acc+varname)]);
                }
            }
            if(variables.length>0){
                prompt("Copy this string to a text-file", implode(variables));
            } else {
                alert("Nothing selected");
            }
        },false);

        newinput=createElement("button",{"class":"link","style":"margin-left:20px;"},containerPart,"Import storage string");
        newinput.addEventListener("click",function(){
            var data = prompt("Enter storage string");
            if(data){
                try{
                    data = explode(data,"buildImportTable/storageString");
                    buildImportTable(data);
                }catch(err){ alert("Sorry. Can't read the entered string.\n"+err); }
            }
        },false);
        
        newinput=createElement("button",{"class":"link","style":"margin-left:20px;"},containerPart,"Import OLD storage string");
        newinput.addEventListener("click",function(){
            var data = prompt("Enter storage string");
            var user = prompt("Enter prefix like 'de_7_Johnny_' if needed");
            if(data){
                try{
                    data=data.split("::");
                    for(var v=0;v<data.length;v++){
                        data[v] = [,data[v].split(":")];
                        data[v][0] = user+data[v][1].splice(0,1)[0];
                        var impType=data[v][1].splice(0,1)[0];
                        data[v][1] = data[v][1].join(":");
                        if(impType == "n"){ data[v][1] = parseFloat(data[v][1],10); }
                        else if(impType == "b"){ data[v][1] = (data[v][1]=="true"); }
                    }
                    buildImportTable(data);
                }catch(err){ alert("Sorry. Can't read the entered string.\n"+err); }
            }
        },false);
        
        containerPart = createElement("div",{"style":"height:90%;overflow-y:scroll;"},container);
        function buildExportTable(filter){
        try{
            var container=$("divManageVariablesInner");
            container.children[1].innerHTML = "";
            var newtable=createElement("table",{"border":"1","class":"hoverRowBgCc9","style":"width:100%"},container.children[1]);
            var newtr,newtd;
            var help3=cloneInto(GM_listValues(), unsafeWindow);
            var help=[],help2;
            for(var v=0;v<help3.length;v++){
                help2 = (/^([A-Z]{2}_\d+_.+?_)(.*)$/).exec(help3[v]); // COUNTRY_SERVER_USER_...
                if(help2){ 
                    help[v] = [help2[1],help2[2],"USER"];
                } else {
                    help2 = (/^([A-Z]{2}_\d+_)(.*)$/).exec(help3[v]); // COUNTRY_SERVER_...
                    if(help2){
                        help[v] = [help2[1],help2[2],"SERVER"];
                    } else {
                        help2 = (/^([A-Z]{2}_)(.*)$/).exec(help3[v]); // COUNTRY_...
                        if(help2){
                            help[v] = [help2[1],help2[2],"COUNTRY"];
                        } else {
                            help[v] = ["",help3[v],"GLOBAL"];
                        }
                    }   
                }
            }
            help.sort(function(a,b){
                if(a[0]==b[0]){ return ((a[1]>b[1])-(a[1]<b[1])); }
                          else{ return ((a[0]>b[0])-(a[0]<b[0])); }
            });

            for(var v=0;v<help.length;v++){
                switch(filter){
                case "ALL": break;
                case "GLOBAL":if(help[v][0]!=""){ continue; } break;
                case "UNKNOWN":if(VARIABLES[help[v][2]][help[v][1]]){ continue; } break;
                case "USELESS":if((!VARIABLES[help[v][2]][help[v][1]])||(VARIABLES[help[v][2]][help[v][1]][1]!=5)){ continue; } break;
                default: if(help[v][0]!=filter){ continue; }
                }
                
                help[v][4] = GM_getValue(help[v][0]+help[v][1]);
                help[v][3] = "s";
                // if(help[v][4]==""){ help[v][4]=" "; }
                if(typeof help[v][4]=="number"){ help[v][3]="n"; }
                else if(typeof help[v][4]=="boolean"){ help[v][3]="b"; }
                else{   // help[v][4] = help[v][4].replace(/(:+)/g,":");
                        if(help[v][4].length>100){
                            help[v][4] = help[v][4].substr(0,97)+"..."; 
                        }
                    }
                
                newtr=createElement("tr",{},newtable);
                newtd = createElement("td",{},newtr);
                createElement("input",{"type":"checkbox","class":"link","checked":false},newtd);
                createElement("td",{},newtr,help[v][0]);
                createElement("td",{},newtr,help[v][1]);
                createElement("td",{},newtr,help[v][3]);
                if(VARIABLES[help[v][2]][help[v][1]]){
                    createElement("td",{},newtr,VARIABLES[help[v][2]][help[v][1]][0]);
                    createElement("td",{},newtr,[,"historic data - not reproducible!","collectable data","options, settings","temporary data","useless, old data"][VARIABLES[help[v][2]][help[v][1]][1]]);
                } else {
                    createElement("td",{},newtr,"unknown");
                    createElement("td",{},newtr,"");
                }
                createElement("td",{},newtr,help[v][4]);
            
            }
            container=null;newtable=null;newtr=null;newtd=null;
        }catch(err){ GM_logError("buildExportTable\n"+err); }
        }
        buildExportTable("GLOBAL");

        function buildImportTable(data){
        try{
            var container=$("divManageVariablesInner");
            container.children[1].innerHTML = "";
            var newinput=createElement("button",{"class":"link"},container.children[1],"SAVE !");
            newinput.addEventListener("click",function(){
                var container=$("divManageVariablesInner");
                var rows = container.children[1].getElementsByTagName("tr");
                var variables = [];
                var acc, varname;
                for (var v=0;v<rows.length;v++){
                    if(rows[v].children[0].children[0].checked){
                        GM_setValue(data[v][0]+data[v][1],data[v][3]);
                    }
                }
                buildManageVariables();
            },false);
            var newtable=createElement("table",{"border":"1","class":"hoverRowBgCc9","style":"width:100%"},container.children[1]);
            var newtr,newtd;
            var help2;
            var dataLevel;
            for(var v=0;v<data.length;v++){
                help2 = (/^([A-Z]{2}_\d+_.+?_)(.*)$/).exec(data[v][0]); // COUNTRY_SERVER_USER_...
                if(help2){ 
                    dataLevel = "USER";
                    data[v] = [help2[1],help2[2],"s",data[v][1]];
                } else {
                    help2 = (/^([A-Z]{2}_\d+_)(.*)$/).exec(data[v][0]); // COUNTRY_SERVER_...
                    if(help2){
                        dataLevel = "SERVER";
                        data[v] = [help2[1],help2[2],"s",data[v][1]];
                    } else {
                        help2 = (/^([A-Z]{2}_)(.*)$/).exec(data[v][0]); // COUNTRY_...
                        if(help2){
                            dataLevel = "COUNTRY";
                            data[v] = [help2[1],help2[2],"s",data[v][1]];
                        } else {
                            dataLevel = "GLOBAL";
                            data[v] = ["",data[v][0],"s",data[v][1]];
                        }
                    }   
                }
                if(typeof data[v][3]=="number"){ data[v][2]="n"; }
                else if(typeof data[v][3]=="boolean"){ data[v][2]="b"; }

                newtr=createElement("tr",{},newtable);
                newtd = createElement("td",{},newtr);
                createElement("input",{"type":"checkbox","class":"link","checked":true},newtd);
                createElement("td",{},newtr,data[v][0]);
                createElement("td",{},newtr,data[v][1]);
                createElement("td",{},newtr,data[v][2]);
                if(VARIABLES[dataLevel][data[v][1]]){
                    createElement("td",{},newtr,VARIABLES[dataLevel][data[v][1]][0]);
                    createElement("td",{},newtr,[,"historic data - not reproducible!","collectable data","options, settings","temporary data","useless, old data"][VARIABLES[dataLevel][data[v][1]][1]]);
                } else {
                    createElement("td",{},newtr,"unknown");
                    createElement("td",{},newtr,"");
                }
                if(data[v][3].length>100){
                    createElement("td",{},newtr,data[v][3].substr(0,97)+"...");
                } else {
                    createElement("td",{},newtr,data[v][3]);
                }
            }
            container=null;newtable=null;newtr=null;newtd=null;newinput=null;
        }catch(err){ GM_logError("buildImportTable\n"+err); }
        }

        container=null;containerPart=null;newselect=null;
        newdiv=null;newinput=null;
    }catch(err){ GM_logError("buildManageVariables\n"+err); } 
    }

    if($("divManageVariables")){ return false; }
    var newdiv=createElement("div",{"id":"divManageVariables","mode":"","style":"position:fixed;top:0;left:0;width:100%;height:100%;background-color:#b8a789;z-index:1000;display:block;"},ALL);
    createElement("img",{"src":GFX+"guild/help_back.jpg","style":"position:absolute;top:0;left:0;width:100%;height:100%;z-index:-1;"},newdiv);
    createElement("div",{"id":"divManageVariablesInner","class":"tnormal","style":"position:absolute;top:6%;left:5%;width:90%;height:88%;overflow:auto;"},newdiv);
    var newimg=createElement("img",{"id":"infoPanelClose","class":"link","src":GFX+"close.jpg","style":"position:absolute;top:8px;right:8px;width:20px;height:20px;"},newdiv);
    newimg.addEventListener("click",function(){ removeElement(this.parentNode); },false);
    newdiv = null;newimg=null;
    buildManageVariables();
}

function do_login(){
    try{
        if(top!=self){ return; }
        if((location.pathname.match(/^\/login\.php$/))&&(pageZusatz["logout"]=="1")){
            GM_log("Logout-page found ("+location.href+").\nReturn to login-page.");
            if(GAMEPAGES[COUNTRY]){
                window.setTimeout(function(){ location.href="http://www."+GAMEPAGES[COUNTRY]+"/login.php?start=1"; },1000); // go to login-page after logout (old page)
            }
        }else if($("login_container")){
            do_login_old();
        }else if($("loginbar")){
            GM_log("Login-page found ("+location.href+")\npagedata="+implode(pagedata));        
            // account data
            var logindata=explode(GM_getValue("logindata","[]"),"do_login/logindata",[]);
            var c=0;
            var servers=new Object(); // servers["language_serverNr"]=[logindataNr,logindataNr,...]
            for(var v=0;v<logindata.length;v++){ 
                if(logindata[v][4]){
                    c++;
                    if(!servers[logindata[v][0]+"_"+logindata[v][1]]){ servers[logindata[v][0]+"_"+logindata[v][1]]=new Array(); }
                    servers[logindata[v][0]+"_"+logindata[v][1]].push(v);
                }   
            }
            // listener login-form to store username
            $("loginelements").querySelector("#loginbutton").parentNode.addEventListener("submit",function(){
                try{
                    var currServer=this.querySelector("#loginserver").value;
                    var currUser=this.querySelector("#loginusername").value.toLowerCase();
                    GM_log("Login submitted. Server="+currServer+", user="+currUser);
                    GM_setValueCache(COUNTRY+"_"+currServer+"_username",currUser.toLowerCase());
                }catch(err){ GM_logError("loginform.submit\n"+err); }
            },false);
            // listener portal login-form to store username
            $("portal").querySelector("#portalmiddle").parentNode.addEventListener("submit",function(){
                try{
                    var currServer=this.querySelector("#portalserver").value;
                    var currUser=this.querySelector("#portalusername").value.toLowerCase();
                    GM_log("Portal login submitted. Server="+currServer+", user="+currUser);
                    GM_setValueCache(COUNTRY+"_"+currServer+"_username",currUser.toLowerCase());
                }catch(err){ GM_logError("portalform.submit\n"+err); }
            },false);
            // execute login
            function submit_login(accNr){
                window.setTimeout(function(){
                    try{
                        var logindata=explode(GM_getValue("logindata"),"submit_login/logindata",[]);
                        if(logindata[accNr][0]==COUNTRY){
                            if(logindata[accNr][5]){
                                click($("portalicon"));
                                var login_container=$("portal");
                                login_container.querySelector("#portalserver").value=logindata[accNr][1];
                                login_container.querySelector("#portalusername").value=logindata[accNr][2];
                                login_container.querySelector("#portalpassword").value=enc(logindata[accNr][3],-4242);
                                GM_setValueCache(COUNTRY+"_"+logindata[accNr][1]+"_username",logindata[accNr][2].toLowerCase());
                                click(login_container.querySelector("#portalbutton"));
                                login_container=null;
                            }else{
                                var login_container=$("loginelements");
                                login_container.querySelector("#loginserver").value=logindata[accNr][1];
                                login_container.querySelector("#loginusername").value=logindata[accNr][2];
                                login_container.querySelector("#loginpassword").value=enc(logindata[accNr][3],-4242);
                                GM_setValueCache(COUNTRY+"_"+logindata[accNr][1]+"_username",logindata[accNr][2].toLowerCase());
                                click(login_container.querySelector("#loginbutton"));
                                login_container=null;
                            }
                        }else if(GAMEPAGES[logindata[accNr][0]]){
                            var help=explode(GM_getValue(logindata[accNr][0]+"_pagedataLogin","{}"),"submit_login/pagedataLogin",{});
                            if(!(help["dologin"]&&(typeof help["dologin"]=="object"))){
                                help["dologin"]=new Object();
                            }
                            help["dologin"][accNr]=true;
                            GM_setValue(logindata[accNr][0]+"_pagedataLogin",implode(help));
                            location.href="http://www."+GAMEPAGES[logindata[accNr][0]]+"/login.php?start=1";
                        }
                    }catch(err){ GM_logError("submit_login("+accNr+")\n"+err); }
                },0);
            }
            var currDoLogin=null;
            var currDoServer=null;
            var pagedata=explode(GM_getValue(COUNTRY+"_pagedataLogin","{}"),"do_login/pagedataLogin",{});
            if(pagedata["doserver"]){
                if(typeof pagedata["doserver"]=="object"){
                    for(var v in pagedata["doserver"]){
                        if(!pagedata["doserver"].hasOwnProperty(v)){ continue; }
                        currDoServer=v;
                        delete pagedata["doserver"][v];
                        break;
                    }
                    if(pagedata["doserver"].isEmpty()){ delete pagedata["doserver"]; }
                }else{
                    delete pagedata["doserver"];
                }
            }else if(pagedata["dologin"]){
                if(typeof pagedata["dologin"]=="object"){
                    for(var v in pagedata["dologin"]){
                        if(!pagedata["dologin"].hasOwnProperty(v)){ continue; }
                        currDoLogin=v;
                        delete pagedata["dologin"][v];
                        break;
                    }
                    if(pagedata["dologin"].isEmpty()){ delete pagedata["dologin"]; }
                }else{
                    delete pagedata["dologin"];
                }
            }
            GM_setValue(COUNTRY+"_pagedataLogin",implode(pagedata));
            if(currDoServer!=null){
                var help=GM_getValue(COUNTRY+"_"+currDoServer+"_username","");
                for(var v=0;v<logindata.length;v++){
                    if((logindata[v][4])&&(logindata[v][0]==COUNTRY)&&(logindata[v][1]==currDoServer)&&(logindata[v][2].toLowerCase()==help)){
                        currDoLogin=v;
                        break;
                    }
                }
                if(currDoLogin!=null){
                    for(var v=0;v<logindata.length;v++){
                        if((logindata[v][4])&&(logindata[v][0]==COUNTRY)&&(logindata[v][1]==currDoServer)){
                            currDoLogin=v;
                            break;
                        }
                    }
                }
            }
            if(currDoLogin!=null){
                submit_login(currDoLogin);
            }else{
                var newdiv,newbutton;
                // Buttons
                newdiv=createElement("div",{"id":"divBeraterButtons"},ALL);
                newdiv.addEventListener("mouseover",function(event){
                    var node=event.target;
                    var mouseOverText=node.getAttribute("mouseOverText");
                    while((node!=this)&&(!mouseOverText)){
                        node=node.parentNode;
                        mouseOverText=node.getAttribute("mouseOverText");
                    }
                    if(mouseOverText){ toolTip.show(event,mouseOverText); }
                    node=null;mouseOverText=null;
                },false);
                newdiv.addEventListener("click",function(){
                    if($("divInfo")){ click($("divInfo")); }
                },false);
                // Button manage accounts
                newbutton=createElement("div",{"class":"link beraterButtonIcon hoverBgGreen","mouseOverText":getText("accounts")},newdiv);
                createElement("img",{"src":IMAGES["settings"],"style":"position:relative;top:-3px;left:-1px;;width:32px;height:32px;"},newbutton);
                newbutton.addEventListener("click",function(){ unsafeWindow.buildInfoPanel("menu","accounts"); },false);            
                // Button manage variables
                newbutton=createElement("div",{"class":"link beraterButtonIcon hoverBgGold","mouseOverText":getText("manageVariables")+" ("+getText("adviser")+")"},newdiv);
                createElement("img",{"src":IMAGES["floppyDisk"],"style":"position:relative;top:3px;left:3px;;width:24px;height:24px;"},newbutton);
                newbutton.addEventListener("click",manageVariables,false);
                // Buttons accounts
                newdiv=createElement("div",{"style":"position:absolute;left:50%;margin-left:250px;top:205px;height:263px;overflow-x:hidden;overflow-y:auto;padding-right:17px;"},$("content"));
                for(var v=0;v<logindata.length;v++){ if(logindata[v][4]){
                    newbutton=createElement("div",{"class":"link loginbutton hoverBgLightblue","id":"autologin"+v},newdiv,getText("server")+"&nbsp;"+logindata[v][1]+"."+logindata[v][0]+":&nbsp;"+logindata[v][2]);
                    newbutton.addEventListener("click",function(){
                        if($("divInfo")){ click($("divInfo")); }
                        submit_login(this.id.replace("autologin",""));
                    },false);
                }}
                // Autologin
                var lastbusy=GM_getValue("loginbusy",0);
                if (isNaN(lastbusy) || now<lastbusy){ lastbusy=0; }
                if (GM_getValue("valAutoLogin",false) && (c>0) && (now-lastbusy>15)){
                    GM_setValue("loginbusy",now);
                    newdiv=createElement("div",{"id":"divInfo","class":"round transp shadow","style":"position:absolute;left:50%;margin-left:-150px;top:470px;height:130px;width:300px;z-index:200;"},$("content"));
                    createElement("div",{"class":"buttontext4","style":""},newdiv,getText("autologinChecking").replace(/%1%/,"5"));
                    newdiv.addEventListener("click",function(){
                        removeElement(this);
                    },false);
                    for(var v in servers){
                        if(!servers.hasOwnProperty(v)){ continue; }
                        GM_setValue(v+"_sessionlost",true);
                    }
                    var counter=5;
                    function autologinLoop(){
                        counter -= 0.5;
                        if(!$("divInfo")){ return false; }
                        if(counter>0){
                            $("divInfo").firstElementChild.innerHTML=getText("autologinChecking").replace(/%1%/,Math.ceil(counter));
                            var c=0;
                            for(var v in servers){
                                if(!servers.hasOwnProperty(v)){ continue; }
                                if (GM_getValue(v+"_sessionlost",true)){
                                    c++;
                                }else{
                                    var help=GM_getValue(v+"_username","");
                                    for(var w=0;w<servers[v].length;w++){
                                        $("autologin"+servers[v][w]).style.backgroundColor=(logindata[servers[v][w]][2].toLowerCase()==help?"#00ff00":"#008800");
                                    }
                                    //delete servers[v];
                                }
                            }
                            if(c==0){ counter=0; }
                            window.setTimeout(autologinLoop,500);
                        }else{
                            var c=null;
                            for(var v in servers){
                                if(!servers.hasOwnProperty(v)){ continue; }
                                if (GM_getValue(v+"_sessionlost",true)){
                                    if (c==null){
                                        c=servers[v][0];
                                    }else if(GAMEPAGES[logindata[servers[v][0]][0]]){
                                        var help=explode(GM_getValue(logindata[servers[v][0]][0]+"_pagedataLogin","{}"),"autologinLoop/pagedataLogin",{});
                                        if(!(help["dologin"]&&(typeof help["dologin"]=="object"))){
                                            help["dologin"]=new Object();
                                        }
                                        help["dologin"][servers[v][0]]=true;
                                        GM_setValue(logindata[servers[v][0]][0]+"_pagedataLogin",implode(help));
                                        window.open("http://www."+GAMEPAGES[logindata[servers[v][0]][0]]+"/login.php?start=1");
                                    }
                                }
                            }
                
                            if (c==null){
                                // all logged in
                                $("divInfo").firstElementChild.innerHTML=getText("autologinAllOk");
                                window.setTimeout(function(){
                                    for(var v in servers){
                                        if(!servers.hasOwnProperty(v)){ continue; }
                                        for(var w=0;w<servers[v].length;w++){
                                            $("autologin"+servers[v][w]).style.backgroundColor="white";
                                        }
                                        GM_setValue(v+"_sessionlost",true);
                                    }
                                    now=Math.floor((new Date()).getTime()/1000);
                                    GM_setValue("loginbusy",now);
                                    counter=5;
                                    autologinLoop();
                                },5000);
                            }else{
                                GM_setValue("loginbusy",0);
                                submit_login(c);
                            }
                        }
                    }
                    window.setTimeout(autologinLoop,500);
                }
                newdiv=null;newbutton=null;
            }
        }
    }catch(err){ GM_logError("do_login\n"+err); }
}
function do_login_old(){
    try{
        GM_log("Old login-page found ("+location.href+")");
        //paypal
        var newform=createElement("form",{"id":"paypalForm","action":"https://www.paypal.com/cgi-bin/webscr","method":"post","style":"position:absolute;top:30px;left:117px;"},ALL);
        createElement("input",{"type":"hidden","name":"cmd","value":"_donations"},newform);
        createElement("input",{"type":"hidden","name":"business","value":"jessicakanaan@web.de"},newform);
        createElement("input",{"type":"hidden","name":"lc","value":((LANGUAGE=="de")?"DE":"US")},newform);
        createElement("input",{"type":"hidden","name":"item_name","value":"MyFreeFarm Script"},newform);
        createElement("input",{"type":"hidden","name":"no_note","value":"0"},newform);
        createElement("input",{"type":"hidden","name":"currency_code","value":"EUR"},newform);
        createElement("input",{"type":"hidden","name":"bn","value":"PP-DonationsBF:btn_donate_LG.gif:NonHostedGuest"},newform);
        createElement("input",{"type":"image","border":"0","src":"https://www.paypal.com/"+((LANGUAGE=="de")?"de_DE/DE":"en_US")+"/i/btn/btn_donate_LG.gif","name":"submit",alt:"PayPal"},newform);
        createElement("img",{"alt":"","border":"0","src":"https://www.paypal.com/en_US/i/scr/pixel.gif","width":"1","height":"1"},newform);
        newform=null;
        
        //login
        var logindata=explode(GM_getValue("logindata","[]"),"do_login/logindata",[]);
        var c=0;
        var servers=new Object(); // servers["language_serverNr"]=[logindataNr,logindataNr,...]
        for(var v=0;v<logindata.length;v++){ 
            if(logindata[v][4]){
                c++;
                if(!servers[logindata[v][0]+"_"+logindata[v][1]]){ servers[logindata[v][0]+"_"+logindata[v][1]]=new Array(); }
                servers[logindata[v][0]+"_"+logindata[v][1]].push(v);
            }   
        }
        
        $("login_container").querySelector("#submitlogin").addEventListener("click",function(){
            try{
                var login_container=$("login_container");
                var currServer=login_container.querySelector("#loginserver").value;
                var currUser=login_container.querySelector("#loginusername").value.toLowerCase();
                GM_setValueCache(COUNTRY+"_"+currServer+"_username",currUser.toLowerCase());
                login_container=null;
            }catch(err){ GM_logError("login_container listener\n"+err); }
        },false);
        
        function submit_login(accNr){
            window.setTimeout(function(){
                try{
                    var logindata=explode(GM_getValue("logindata"),"submit_login/logindata",[]);
                    if(logindata[accNr][0]==COUNTRY){
                        var login_container=$("login_container");
                        login_container.querySelector("#loginserver").value=logindata[accNr][1];
                        login_container.querySelector("#loginusername").value=logindata[accNr][2];
                        login_container.querySelector("#loginpassword").value=enc(logindata[accNr][3],-4242);
                        GM_setValueCache(COUNTRY+"_"+logindata[accNr][1]+"_username",logindata[accNr][2].toLowerCase());
                        click(login_container.querySelector("#submitlogin"));
                        login_container=null;
                    }else if(GAMEPAGES[logindata[accNr][0]]){
                        var help=explode(GM_getValue(logindata[accNr][0]+"_pagedataLogin","{}"),"submit_login/pagedataLogin",{});
                        if(!(help["dologin"]&&(typeof help["dologin"]=="object"))){
                            help["dologin"]=new Object();
                        }
                        help["dologin"][accNr]=true;
                        GM_setValue(logindata[accNr][0]+"_pagedataLogin",implode(help));
                        location.href="http://www."+GAMEPAGES[logindata[accNr][0]]+"/login.php?start=1";
                    }
                }catch(err){ GM_logError("submit_login("+accNr+")\n"+err); }
            },0);
        }
            
        var currDoLogin=null;
        var currDoServer=null;
        var pagedata=explode(GM_getValue(COUNTRY+"_pagedataLogin","{}"),"do_login/pagedataLogin",{});
        GM_log("This is do_login_old@"+location.href+". pagedata:"+implode(pagedata));
        if(pagedata["doserver"]){
            if(typeof pagedata["doserver"]=="object"){
                for(var v in pagedata["doserver"]){
                    if(!pagedata["doserver"].hasOwnProperty(v)){ continue; }
                    currDoServer=v;
                    delete pagedata["doserver"][v];
                    break;
                }
                if(pagedata["doserver"].isEmpty()){ delete pagedata["doserver"]; }
            }else{
                delete pagedata["doserver"];
            }
        }else if(pagedata["dologin"]){
            if(typeof pagedata["dologin"]=="object"){
                for(var v in pagedata["dologin"]){
                    if(!pagedata["dologin"].hasOwnProperty(v)){ continue; }
                    currDoLogin=v;
                    delete pagedata["dologin"][v];
                    break;
                }
                if(pagedata["dologin"].isEmpty()){ delete pagedata["dologin"]; }
            }else{
                delete pagedata["dologin"];
            }
        }
        GM_setValue(COUNTRY+"_pagedataLogin",implode(pagedata));

        if(currDoServer!=null){
            var help=GM_getValue(COUNTRY+"_"+currDoServer+"_username","");
            for(var v=0;v<logindata.length;v++){
                if((logindata[v][4])&&(logindata[v][0]==COUNTRY)&&(logindata[v][1]==currDoServer)&&(logindata[v][2].toLowerCase()==help)){
                    currDoLogin=v;
                    break;
                }
            }
            if(currDoLogin!=null){
                for(var v=0;v<logindata.length;v++){
                    if((logindata[v][4])&&(logindata[v][0]==COUNTRY)&&(logindata[v][1]==currDoServer)){
                        currDoLogin=v;
                        break;
                    }
                }
            }
        }
        
        if(currDoLogin!=null){
            submit_login(currDoLogin);
        }else{
            var newdiv=createElement("div",{"style":"position:relative;top:-400px;left:300px;"},$("login_container"));
            var newbutton;

            newbutton=createElement("div",{"id":"GM_manageVariables","style":"position:absolute;top:-200px;"},newdiv);
            newbutton=createElement("div",{"class":"link loginbutton hoverBgLightblue","style":"background-color:orange;"},newbutton,getText("manageVariables")+" ("+getText("adviser")+")");
            newbutton.addEventListener("click",function(){
                if($("divInfo")){ click($("divInfo")); }
                manageVariables();
            },false);
        
            
            for(var v=0;v<logindata.length;v++){ if(logindata[v][4]){
                newbutton=createElement("div",{"class":"link loginbutton hoverBgLightblue","id":"autologin"+v},newdiv,getText("server")+"&nbsp;"+logindata[v][1]+"."+logindata[v][0]+":&nbsp;"+logindata[v][2]);
                newbutton.addEventListener("click",function(){
                    if($("divInfo")){ click($("divInfo")); }
                    submit_login(this.id.replace("autologin",""));
                },false);
            }}
        
            //Autologin
            var lastbusy=GM_getValue("loginbusy",0);
            if (isNaN(lastbusy) || now<lastbusy){ lastbusy=0; }
            if (GM_getValue("valAutoLogin",false) && (c>0) && (now-lastbusy>15)){
                GM_setValue("loginbusy",now);
                newdiv=createElement("div",{"id":"divInfo","style":"position:absolute;top:190px;left:455px;height:200px;width:280px;background-color:#842;border:4px solid black;z-index:200;"},$("main_container"),"<h1>"+getText("autologinChecking").replace(/%1%/,"5")+"</h1>");
                newdiv.addEventListener("click",function(){
                    removeElement(this);
                },false);
           
                for(var v in servers){
                    if(!servers.hasOwnProperty(v)){ continue; }
                    GM_setValue(v+"_sessionlost",true);
                }
                var counter=5;
                function autologinLoop(){
                    counter -= 0.5;
                    if(!$("divInfo")){ return false; }
                    if(counter>0){
                        $("divInfo").innerHTML="<h1>"+getText("autologinChecking").replace(/%1%/,Math.ceil(counter))+"</h1>";
                        var c=0;
                        for(var v in servers){
                            if(!servers.hasOwnProperty(v)){ continue; }
                            if (GM_getValue(v+"_sessionlost",true)){
                                c++;
                            }else{
                                var help=GM_getValue(v+"_username","");
                                for(var w=0;w<servers[v].length;w++){
                                    $("autologin"+servers[v][w]).style.backgroundColor=(logindata[servers[v][w]][2].toLowerCase()==help?"#00ff00":"#008800");
                                }
                                //delete servers[v];
                            }
                        }
                        if(c==0){ counter=0; }
                        window.setTimeout(autologinLoop,500);
                    }else{
                        var c=null;
                        for(var v in servers){
                            if(!servers.hasOwnProperty(v)){ continue; }
                            if (GM_getValue(v+"_sessionlost",true)){
                                if (c==null){
                                    c=servers[v][0];
                                }else if(GAMEPAGES[logindata[servers[v][0]][0]]){
                                    var help=explode(GM_getValue(logindata[servers[v][0]][0]+"_pagedataLogin","{}"),"autologinLoop/pagedataLogin",{});
                                    if(!(help["dologin"]&&(typeof help["dologin"]=="object"))){
                                        help["dologin"]=new Object();
                                    }
                                    help["dologin"][servers[v][0]]=true;
                                    GM_setValue(logindata[servers[v][0]][0]+"_pagedataLogin",implode(help));
                                    window.open("http://www."+GAMEPAGES[logindata[servers[v][0]][0]]+"/login.php?start=1");
                                }
                            }
                        }
        
                        if (c==null){
                            // all logged in
                            $("divInfo").innerHTML="<h1>"+getText("autologinAllOk")+"</h1>";
                            window.setTimeout(function(){
                                for(var v in servers){
                                    if(!servers.hasOwnProperty(v)){ continue; }
                                    for(var w=0;w<servers[v].length;w++){
                                        $("autologin"+servers[v][w]).style.backgroundColor="white";
                                    }
                                    GM_setValue(v+"_sessionlost",true);
                                }
                                now=Math.floor((new Date()).getTime()/1000);
                                GM_setValue("loginbusy",now);
                                counter=5;
                                autologinLoop();
                            },5000);
                        }else{
                            GM_setValue("loginbusy",0);
                            submit_login(c);
                        }
                    }
                }
                window.setTimeout(autologinLoop,500);
            }
            newdiv=null;newbutton=null;
        }
    }catch(err){ GM_logError("do_login\n"+err); }
}
//***********************************************************************************************************

// DOMContentLoaded

function startScript(){
try{
var err_trace="init";
unsafeData.beraterVersion=VERSION;
err_trace="Localization";
if(top.unsafeData.COUNTRY){
    COUNTRY=top.unsafeData.COUNTRY;
    LANGUAGE=top.unsafeData.LANGUAGE;
    delimThou=top.unsafeData.delimThou;
    regDelimThou=top.unsafeData.regDelimThou;
    regDelimThouShift=top.unsafeData.regDelimThouShift;
    regDelimThouDelete=top.unsafeData.regDelimThouDelete;
    delimDeci=top.unsafeData.delimDeci;
    regDelimDeci=top.unsafeData.regDelimDeci;
    dateFormatDM=top.unsafeData.dateFormatDM;
    dateFormatDMY=top.unsafeData.dateFormatDMY;
}else{
    if(location.hostname.match(/^(|www\.|s\d+\.)myfreefarm.de$/)){
        COUNTRY="DE";
        LANGUAGE="de";
    }else if(location.hostname.match(/^(|www\.|s\d+\.)au\.myfreefarm.com$/)){
        COUNTRY="AU";
        LANGUAGE="en";
        delimThou=",";
        regDelimThou=",";
        regDelimThouShift="([\\d,])(\\d),(\\d{1,2}\\D)";
        regDelimThouDelete="(\\d),(,*)(\\d{1,2}\\D)";
        delimDeci=".";
        regDelimDeci="\\.";
    }else if(location.hostname.match(/^(|www\.|s\d+\.)myfreefarm.ir$/)){
        COUNTRY="IR";
        LANGUAGE="en";
        delimThou=",";
        regDelimThou=",";
        regDelimThouShift="([\\d,])(\\d),(\\d{1,2}\\D)";
        regDelimThouDelete="(\\d),(,*)(\\d{1,2}\\D)";
        delimDeci=".";
        regDelimDeci="\\.";
    }else if(location.hostname.match(/^(|www\.|s\d+\.)myfreefarm.co.nz$/)){
        COUNTRY="NZ";
        LANGUAGE="en";
        delimThou=",";
        regDelimThou=",";
        regDelimThouShift="([\\d,])(\\d),(\\d{1,2}\\D)";
        regDelimThouDelete="(\\d),(,*)(\\d{1,2}\\D)";
        delimDeci=".";
        regDelimDeci="\\.";
    }else if(location.hostname.match(/^(|www\.|s\d+\.)myfreefarm.co.uk$/)){
        COUNTRY="UK";
        LANGUAGE="en";
        delimThou=",";
        regDelimThou=",";
        regDelimThouShift="([\\d,])(\\d),(\\d{1,2}\\D)";
        regDelimThouDelete="(\\d),(,*)(\\d{1,2}\\D)";
        delimDeci=".";
        regDelimDeci="\\.";
    }else if(location.hostname.match(/^(|www\.|s\d+\.)myfreefarm.com$/)){
        COUNTRY="US";
        LANGUAGE="en";
        delimThou=",";
        regDelimThou=",";
        regDelimThouShift="([\\d,])(\\d),(\\d{1,2}\\D)";
        regDelimThouDelete="(\\d),(,*)(\\d{1,2}\\D)";
        delimDeci=".";
        regDelimDeci="\\.";
    }else{
        GM_logWarning("Language pack is missing!");
    }
    top.unsafeData.COUNTRY=COUNTRY;
    top.unsafeData.LANGUAGE=LANGUAGE;
    top.unsafeData.delimThou=delimThou;
    top.unsafeData.regDelimThou=regDelimThou;
    top.unsafeData.regDelimThouShift=regDelimThouShift;
    top.unsafeData.regDelimThouDelete=regDelimThouDelete;
    top.unsafeData.delimDeci=delimDeci;
    top.unsafeData.regDelimDeci=regDelimDeci;
    top.unsafeData.dateFormatDM=dateFormatDM;
    top.unsafeData.dateFormatDMY=dateFormatDMY;
}
err_trace="Texts";
if(top.unsafeData.texte==undefined){
    top.unsafeData.texte=texte;
}else{
    texte=top.unsafeData.texte;
}
if(top.unsafeData.texte["de"]==undefined){
    texte["de"]=new Object();
    texte["de"]["msgMarketsaleContent"]="(.*) hat am Marktplatz (\\d+)x (.*?) von dir<br> f&uuml;r (.*?) kT gekauft\\.";
    texte["de"]["msgContractsaleContent"]="(.*) hat einen Vertrag von dir unterzeichnet!<br><br> Folgende Produkte wurden verkauft:<br>(.*?)<br> Die Vertragssumme von (.*?) kT wurde deinem Konto gutgeschrieben\\.";
    texte["de"]["msgContractsaleList"]="(\\d+)x (.+?)<br>";
    texte["de"]["msgFriend"]="(.+) m"+o_dots+"chte dich als Freund hinzuf"+u_dots+"gen";

    texte["de"]["above"]="davor";
    texte["de"]["absolute"]="absolut";
    texte["de"]["accountActive"]="Account aktiv";
    texte["de"]["accounts"]="Accounts";
    texte["de"]["activation"]="Freischaltung";
    texte["de"]["additionalFarmi"]="%1% Zusatzfarmi t"+a_dots+"glich";
    texte["de"]["additionalForestFarmiSlot"]="%1% Zusatzplatz in der Waldfarmi-Warteschlange";
    texte["de"]["additionalLogCapacity"]="Erh"+o_dots+"hung der Lagerkapazit"+a_dots+"t St"+a_dots+"mme um %1%";
    texte["de"]["advertisingEnds"]="Werbung endet heute";
    texte["de"]["adviser"]="Berater";
    texte["de"]["afterFee"]="abzgl Geb"+u_dots+"hr";
    texte["de"]["alertSetPriceNone"]="M"+o_dots+"chtest du wirklich keinen Preis f"+u_dots+"r %PRODUCT% setzen?";
    texte["de"]["alertSetPriceOverNPC"]="M"+o_dots+"chtest du wirklich den Preis %PRICE% f"+u_dots+"r %PRODUCT% setzen?<br>Dieser ist h"+o_dots+"her als der NPC-Preis %NPC%.";
    texte["de"]["alertSetPriceOverObs"]="M"+o_dots+"chtest du wirklich den Preis %PRICE% f"+u_dots+"r %PRODUCT% setzen?<br>Dieser ist viel h"+o_dots+"her als der beobachtete Preis %OBS%.";
    texte["de"]["alertSetPriceUnderObs"]="M"+o_dots+"chtest du wirklich den Preis %PRICE% f"+u_dots+"r %PRODUCT% setzen?<br>Dieser ist viel niedriger als der beobachtete Preis %OBS%.";
    texte["de"]["alertWillLowRack"]="Achtung! Dies wird deinen Lagerbestand unter den Minimalwert bringen!";
    texte["de"]["all"]="Alle";
    texte["de"]["autologinAllOk"]="Alle Accounts eingeloggt.";
    texte["de"]["autologinChecking"]="Ermittle aktive Sessions.<br>Bitte %1% Sekunden warten<br>...";
    texte["de"]["boughtTickets"]="Gekaufte Tickets";
    texte["de"]["buy"]="Kauf";
    texte["de"]["buyers"]="K"+a_dots+"ufer";
    texte["de"]["calcTo"]="Berechne bis";
    texte["de"]["carpentry"]="Schreinerei";
    texte["de"]["city"]="Stadt";
    texte["de"]["change"]=A_dots+"nderung";
    texte["de"]["clearFilter"]="Filter entfernen";
    texte["de"]["click"]="Klick";
    texte["de"]["clickAlt"]="Alt+Klick";
    texte["de"]["clickCtrl"]="Strg+Klick";
    texte["de"]["clickDouble"]="Doppel-Klick";
    texte["de"]["clickToChange"]="Klick um zu "+a_dots+"ndern";
    texte["de"]["commission"]   = "Geb"+u_dots+"hr";
    texte["de"]["coins"]=unsafeWindow.t_coins;
    texte["de"]["confirmUseObservedPrices"]="Es werden die beobachteten Preise eingetragen. Die eigenen gehen dabei verloren ...";
    texte["de"]["confirmChangelogVersion"]="Du hast eine neue Version des Berater-Scriptes installiert.<br>Die Version %1% beinhaltet folgende "+A_dots+"nderungen:";
    texte["de"]["contract"]="Vertrag";
    texte["de"]["contractsReceived"]="Erhaltene Vertr"+a_dots+"ge";
    texte["de"]["contractsSent"]="Gesendete Vertr"+a_dots+"ge";
    texte["de"]["couldNotGetPlace"]="Dein Platz konnte nicht bestimmt werden.";
    texte["de"]["couldNotGetUpdateInfoOfX"]="Update-Informationen f"+u_dots+"r %1% konnten nicht bestimmt werden."
    texte["de"]["cropped"]="Geerntet";
    texte["de"]["currentOffers"]="Aktuelle Angebote";
    texte["de"]["dailyRuns"]="T"+a_dots+"gl L"+a_dots+"ufe";
    texte["de"]["dailyTicket"]="T"+a_dots+"gliches Ticket";
    texte["de"]["dailyYield"]="T"+a_dots+"gl Ertrag";
    texte["de"]["date"]="Datum";
    texte["de"]["day"]="Tag";
    texte["de"]["day0"]="Heute";
    texte["de"]["day1"]="Morgen";
    texte["de"]["day2"]=U_dots+"bermorgen";
    texte["de"]["default"]="Default";
    texte["de"]["delete"]="L"+o_dots+"schen";
    texte["de"]["demand"]="Forderung";
    texte["de"]["detail"]="Detail";
    texte["de"]["donkey"]="Waltraud";
    texte["de"]["duration"]="Dauer";
    texte["de"]["editPrice"]="Preis "+a_dots+"ndern";
    texte["de"]["emptyField"]="Feld leer!";
    texte["de"]["exchangedLots"]="Eingel"+o_dots+"ste Lose";
    texte["de"]["farm"]="Farm";
    texte["de"]["farmersmarket"]=unsafeWindow.t_farmers_market;
    texte["de"]["farmX"]="%1%. Farm";
    texte["de"]["farmi"]="Farmi";
    texte["de"]["farmis"]="Farmis";
    texte["de"]["farmpedia"]="FarmPedia";
    texte["de"]["farmpediaUrl"]="http://farmpedia.myfreefarm.de/";
    texte["de"]["farmzone"]="Bauplatz %1% der %2%. Farm";
    texte["de"]["feed"]="Futter";
    texte["de"]["filter"]="Filter";
    texte["de"]["filterForX"]="Nach %1% filtern";
    texte["de"]["finished"]="Fertig";
    texte["de"]["foodworld"]=unsafeWindow.foodworld_title;
    texte["de"]["forest"]="Wald";
    texte["de"]["forestry"]="Baumerei";
    texte["de"]["formatNumbers"]="Formatiere Zahlen";
    texte["de"]["formulaType"]=["Prod","+val","+pts"]; // TODO texte
    texte["de"]["fl1"]="Blumenwiese";
    texte["de"]["fl2"]="Blumenwerkstatt";
    texte["de"]["fl3"]="Monsterfruchtzucht";
    texte["de"]["fl6"]="Wettmampfen";
    texte["de"]["fw1"]="Getr"+a_dots+"nkebude";
    texte["de"]["fw2"]="Imbissbude";
    texte["de"]["fw3"]="Konditorei";
    texte["de"]["gamecurrency"]=unsafeWindow.gamecurrency;
    texte["de"]["gain"]="Erzeugnis";
    texte["de"]["general"]="Allgemein";
    texte["de"]["given"]="Gegeben";
    texte["de"]["goToDonkey"]="Zum Goldesel Waltraud";
    texte["de"]["goToLottery"]="Zur Lotterie";
    texte["de"]["goToMarket"]="Zum Markt";
    texte["de"]["goToMarketOfX"]="Zum %1%-Markt";
    texte["de"]["goToMarketstall"]="Zum Marktstand";
    texte["de"]["goToPage"]="gehe zu Seite";
    texte["de"]["goToRank"]="Gehe zu Platz";
    texte["de"]["goToZoneX"]="Gehe zur Zone %1%";
    texte["de"]["goods"]="Waren";
    texte["de"]["hide"]="ausblenden";
    texte["de"]["highlightProducts"]="Produkte am Markt markieren";
    texte["de"]["highlightUser"]="User am Markt markieren";
    texte["de"]["hotkeys"]="Hotkeys";
    texte["de"]["idle"]="unbesch"+a_dots+"ftigt !!";
    texte["de"]["inStock"]="im Lager";
    texte["de"]["informationIsMissing"]="Es fehlen Informationen."
    texte["de"]["ingredients"]="Zutaten";
    texte["de"]["invalidServer"]="Ung"+u_dots+"ltiger Server";
    texte["de"]["inventory"]="Bestand";
    texte["de"]["keptLots"]="Behaltene Lose";
    texte["de"]["level"]="Level";
    texte["de"]["levelTooLow"]="Dein Level ist zu niedrig";
    texte["de"]["levelXneeded"]="Level&nbsp;%1%&nbsp;ben"+o_dots+"tigt";
    texte["de"]["load"]="Laden";
    texte["de"]["loading"]="Lade";
    texte["de"]["localTime"]="Lokale Zeit";
    texte["de"]["lodge"]="Forsth"+u_dots+"tte";
    texte["de"]["login"]="Umloggen";
    texte["de"]["logDonkey"]="Goldesel Waltraud Log";
    texte["de"]["lotteryLog"]="Lotterie Log";
    texte["de"]["lvl"]="Lvl";
    texte["de"]["manageVariables"]="Variablen verwalten";
    texte["de"]["market"]="Markt";
    texte["de"]["marketPrice"]="Marktpreis";
    texte["de"]["marketplace"]="Marktplatz";
    texte["de"]["marketstall"]="Marktstand";
    texte["de"]["megafield"]="G"+u_dots+"terhof";
    texte["de"]["messages"]="Nachrichten";
    texte["de"]["minRack"]="Min&nbsp;Lager";
    texte["de"]["minRackamount"]="Minimaler Lagerbestand";
    texte["de"]["missing"]="Fehlt";
    texte["de"]["money"]="Geld";
    texte["de"]["msgUpdateX"]="Es ist eine neue Version von %1% verf"+u_dots+"gbar. M"+o_dots+"chtest du diese installieren?";
    texte["de"]["name"]="Name";
    texte["de"]["newLevelReached"]="Herzlichen Gl"+u_dots+"ckwunsch!<br>Du bist ein Level aufgestiegen!";
    texte["de"]["nextMessage"]="n"+a_dots+"chste Nachricht";
    texte["de"]["no"]="Nein";
    texte["de"]["NPC"]="NPC";
    texte["de"]["NPCprice"]="NPC-Preis";
    texte["de"]["nr"]="Nr";
    texte["de"]["observed"]="beobachtet";
    texte["de"]["ok"]="OK";
    texte["de"]["oldOnes"]="Alte";
    texte["de"]["options"]="Optionen";
    texte["de"]["overNPCprice"]=u_dots+"ber NPC-Preis";
    texte["de"]["overX"]=u_dots+"ber %1%";
    texte["de"]["overview"]=U_dots+"bersicht";
    texte["de"]["password"]="Passwort";
    texte["de"]["pleaseOpenX"]="Bitte %1% "+o_dots+"ffnen.";
    texte["de"]["pleaseWait"]="Bitte warten.";
    texte["de"]["portalLogin"]="Portal-Login";
    texte["de"]["points"]="Punkte";
    texte["de"]["powerups"]="Power-Ups";
    texte["de"]["previousMessage"]="vorige Nachricht";
    texte["de"]["price"]="Preis";
    texte["de"]["prices"]="Preise";
    texte["de"]["product"]="Produkt";
    texte["de"]["productOverview"]="Produkt "+U_dots+"bersicht";
    texte["de"]["productTimeSaving"]="%1% Minuten Zeitersparnis auf %2%";
    texte["de"]["production"]="Produktion";
    texte["de"]["products"]="Produkte";
    texte["de"]["profit"]="Gewinn";
    texte["de"]["profitTable"]="Profit pro Zone pro Tag";
    texte["de"]["quantity"]="Menge";
    texte["de"]["quest_foodworld"]="Picknickarea-Questreihe";
    texte["de"]["quest_forestry"]="Baumerei-Questreihe";
    texte["de"]["quest_main"]="Farm-Questreihe";
    texte["de"]["questfoodworld1"]="Picknickarea-Questreihe";
    texte["de"]["questforestry1"]="1. Baumerei-Questreihe";
    texte["de"]["questforestry2"]="2. Baumerei-Questreihe";
    texte["de"]["questmain1"]="1. Farm-Questreihe";
    texte["de"]["questmain2"]="2. Farm-Questreihe";
    texte["de"]["quests"]="Quests";
    texte["de"]["rackX"]="%1%. Regal";
    texte["de"]["rank"]="Platz";
    texte["de"]["readAll"]="Alle lesen";
    texte["de"]["readyAtX"]="Fertig um %1%";
    texte["de"]["readyAtX_day1"]="Morgen fertig um %1%";
    texte["de"]["readyAtX_day2"]=U_dots+"bermorgen fertig um %1%";
    texte["de"]["readySinceX"]="Fertig seit %1%";
    texte["de"]["recipes"]="Rezepte";
    texte["de"]["recursive"]="Rekursiv ben"+o_dots+"tigt";
    texte["de"]["relative"]="relativ";
    texte["de"]["relogin"]="Session endet bald.<br>Neuer Login in %1%.";
    texte["de"]["requestingUpdateInfoOfX"]="Fordere Update-Informationen f"+u_dots+"r %1% an ..."
    texte["de"]["requestingUserStatistic"]="Fordere Benutzer-Statistik an ...";
    texte["de"]["requirement"]="Bedarf";
    texte["de"]["requirementPerProduction"]="Bedarf pro Produktion";
    texte["de"]["reward"]="Belohnung";
    texte["de"]["salesLog"]="Verk"+a_dots+"ufe Log";
    texte["de"]["save"]="Speichern";
    texte["de"]["saveAsTemplate"]="als Vorlage speichern";
    texte["de"]["sawmill"]="S"+a_dots+"gewerk";
    texte["de"]["scriptHomepage"]="Scripthomepage";
    texte["de"]["searchPlayer"]="Spieler suchen";
    texte["de"]["sendContract"]="Vertrag schicken";
    texte["de"]["sendContractAgain"]="Vertrag noch einmal schicken";
    texte["de"]["sentContractNrX"]="Vertrag Nr %1% gesendet."
    texte["de"]["sendingXObservedPricesToServer"]="Sende %1% beobachtete Preise an Server ...";
    texte["de"]["server"]="Server";
    texte["de"]["serverTime"]="Zeit des Servers";
    texte["de"]["sessionEnd"]="Ende der Session um %1%<br>Klick f"+u_dots+"r neuen Login";  
    texte["de"]["SGH"]="SGH"; // Short for the seller of plants
    texte["de"]["shadowboxitem"]="Setzkastenitem";
    texte["de"]["shortHours"]="h";
    texte["de"]["shortOClock"]="Uhr";
    texte["de"]["shouldReload"]="Du solltest die Seite neu laden.";
    texte["de"]["showAll"]="Alle zeigen";
    texte["de"]["showChangelog"]="Zeige ChangeLog";
    texte["de"]["showLog"]="Zeige Log";
    texte["de"]["showMissingProducts"]="Zeige fehlende Produkte";
    texte["de"]["showPasswords"]="zeige Passw"+o_dots+"rter";
    texte["de"]["sinceX"]="seit %1%";
    texte["de"]["single"]="Einzel";
    texte["de"]["start"]="Start";
    texte["de"]["stat_days1"]="1 Tag";
    texte["de"]["stat_days3"]="3 Tage";
    texte["de"]["stat_days5"]="5 Tage";
    texte["de"]["stat_days7"]="7 Tage";
    texte["de"]["stat_gamefield"]="Spielfeld zeigen";
    texte["de"]["stat_stats"]="Statistik zeigen";
    texte["de"]["statistics"]="Statistik";
    texte["de"]["stock"]="Lager";
    texte["de"]["stockValue"]="Lagerwert";
    texte["de"]["stockXlow"]="Lagerbestand %1% niedrig";
    texte["de"]["stockXmissing"]="Lagerbestand %1% fehlt!!!";
    texte["de"]["storeXinContract"]="%1% im Vertrag auslagern";
    texte["de"]["summarize"]="Summiere";
    texte["de"]["takeObservedPrices"]="Nimm beobachtete Preise";
    texte["de"]["time"]="Zeit";
    texte["de"]["title"]="Titel";
    texte["de"]["toMessage"]="zur Nachricht";
    texte["de"]["toSGH"]="Zum Saatguth"+a_dots+"ndler";
    texte["de"]["total"]="Total";
    texte["de"]["turnover"]="Umsatz";
    texte["de"]["unitPrice"]="St"+u_dots+"ckpreis";
    texte["de"]["updateOfXAvailable"]="Es ist eine neue Version von %1% verf"+u_dots+"gbar. Die Installation hast du abgelehnt."
    texte["de"]["upgradeForX"]="ausbauen&nbsp;f"+u_dots+"r&nbsp;%1%";
    texte["de"]["upgradeLevel"]="Ausbaustufe";
    texte["de"]["upjersAdvertising"]="Upjers-Werbung";
    texte["de"]["useQuestProducts"]= "Nimm aktuelle Quest-Waren";
    texte["de"]["useWildcard"]= "Verwende * um einen oder mehrere Buchstaben zu entsprechen.";
    texte["de"]["value"]="Wert";
    texte["de"]["version"]="Version";
    texte["de"]["waterBonus"]="%1%% Gie"+sz+"bonus";
    texte["de"]["waterNeeded"]="Wasser ben"+o_dots+"tigt";
    texte["de"]["waterNeededAtX"]="Wasser ben"+o_dots+"tigt um %1%"; 
    texte["de"]["waterNeededAtX_day1"]="Morgen Wasser ben"+o_dots+"tigt um %1%";
    texte["de"]["wateringFeature"]="Gie"+sz+"funktion";
    texte["de"]["windmill"]="M"+u_dots+"hle";
    texte["de"]["writeMessage"]="Nachricht schreiben";
    texte["de"]["XIsUpToDate"]="%1% ist up-to-date."    
    texte["de"]["yes"]="Ja";
    texte["de"]["yield"]="Ertrag";
    texte["de"]["yieldPerProduction"]="Ertrag pro Produktion";
    texte["de"]["youAreOnRankX"]="Du bist auf Platz %1%.";
    // category
    texte["de"]["category_c"]=texte["de"]["coins"];
    texte["de"]["category_v"]="Pflanzen";
    texte["de"]["category_e"]="Fortgeschrittene Produkte";
    texte["de"]["category_z"]=unsafeWindow.rack_deco;
    texte["de"]["category_o"]=unsafeWindow.rack_oil;
    texte["de"]["category_fw"]=unsafeWindow.rack_foodworld;
    texte["de"]["category_fw1"]="Getr"+a_dots+"nke";
    texte["de"]["category_fw2"]="Speisen";
    texte["de"]["category_fw3"]="Torten und Kuchen";
    texte["de"]["category_fw4"]="noch nicht verf"+u_dots+"gbar";
    texte["de"]["category_fl"]="Blumen";
    texte["de"]["category_fla"]="Gestecke";
    texte["de"]["category_f1"]="Setzlinge";
    texte["de"]["category_f2"]="St"+a_dots+"mme";
    texte["de"]["category_f3"]="S"+a_dots+"gewerk Produkte";
    texte["de"]["category_f4"]="Schreinerei Produkte";
    texte["de"]["category_f5"]="Bauernhaus Holzprodukte";
    texte["de"]["category_r0"]="Rezepte Produkt";
    texte["de"]["category_r1"]="Rezepte Erh"+o_dots+"hung Ertrag";
    texte["de"]["category_r2"]="Rezepte Erh"+o_dots+"hung Punkte";
    texte["de"]["category_p0"]="Power-Ups Produkt";
    texte["de"]["category_p1"]="Power-Ups Erh"+o_dots+"hung Ertrag";
    texte["de"]["category_p2"]="Power-Ups Erh"+o_dots+"hung Punkte";
    // settings
    texte["de"]["settings_valAutoWater"]=["Automatisch gie"+sz+"en","Sagt ja der Name schon: Nach dem Pflanzen wird automatisch gegossen, wenn du den 'Alles gie"+sz+"en' besitzt (Premium)."];
    texte["de"]["settings_valAssumeWater"]=["Gie"+sz+"en annehmen","Dies ist wichtig f"+u_dots+"r Pflanzen, die l"+a_dots+"nger als 24h wachsen. Die Berechnung der Ernte-Zeit nimmt an, dass stets gegossen wird."];
    texte["de"]["settings_valAutoCrop"]=["Automatisch ernten","Wie zuvor auch: Es wird beim "+O_dots+"ffnen der Ackers geerntet, falls n"+o_dots+"tig."];
    texte["de"]["settings_valWaterNeeded"]=["Gie"+sz+"en n"+o_dots+"tig","Soll angezeigt werden, dass dein Acker nicht gegossen ist?"];
    texte["de"]["settings_valCropMsg"]=["Erntemeldung klicken","Du magst die l"+a_dots+"stige Erntemeldung mit dem Schwein nicht? Hier wirst du sie los."];
    texte["de"]["settings_valLimitEmptyFields"]=["Leere Felder","Es werden unbepflanzte Felder auf deinem Acker erkannt. Sind dies mehr als hier angegeben, wird der Acker als unbenutzt gemeldet."];
    texte["de"]["settings_valLimitEmptyFields_forest"]=["Leere Felder Wald","If the number of unplanted areas in your field exceeds this number, the field will be shown as empty."];
    texte["de"]["settings_valMoveAnimals"]=["Bewege Tiere",""];
    texte["de"]["settings_valContractLogAmount"]=["Anzahl gemerkte Vertr"+a_dots+"ge","Deine letzten erhaltenen und gesendeten Vertr"+a_dots+"ge werden gespeichert und somit kann ein Verlauf angezeigt werden."];
    texte["de"]["settings_valFarmiLimits"]=["Farmi Grenzen","Die Farmis sind in 3 F"+a_dots+"lle markiert, je nachdem wie gut ihre Bezahl-Rate ist."];
    texte["de"]["settings_valFarmiMiniInfo"]=["Farmi Mini Info","Zeigt einen kleinen Kreis unter jedem Farmi mit der jeweiligen Klasse der Bezahl-Rate."];
    texte["de"]["settings_valMinRackMan"]=["Detail Konfiguration","Du editierst die Anzahl selbst *hier*"];
    texte["de"]["settings_valMinRack"]=[,"Ein Produkt wird markiert, falls der Lagerbestand unter diese Grenze f"+a_dots+"llt. Du kannst verschiedene Werte abh"+a_dots+"ngig von der Kategorie einstellen."];
    texte["de"]["settings_valMinRackPlantsize"]=["Pflanzengr"+o_dots+sz+"e einrechnen","Zum Beispiel braucht Getreide nur den halben Bestand."];
    texte["de"]["settings_valMinRackGrowing"]=["Ernteprodukte","Beachtet zus"+a_dots+"tzlich die Produkte in Produktion und in den fertigen Powerups."];
    texte["de"]["settings_valMinRackQuest"]=["Quest-Produkte","Beachtet zus"+a_dots+"tzlich die Menge der Questprodukte."];
    texte["de"]["settings_valMinRackRecursive"]=["Recursive products","Add the required products needed to make missing products, and calculate these again for the required proucts.(used by forestry products)"];
    texte["de"]["settings_valMinRackFarmis"]=["Farmi-Produkte","Beachtet zus"+a_dots+"tzlich die Menge der Produkte, die deine Farmis verlangen. Dabei gelten nur diejenigen, die besser als die untere Grenze bezahlen."];
    texte["de"]["settings_valMinRackForestryFarmis"]=["Forestry farmie products","Adds the amount of the products wanted by the forestry farmies."];
    texte["de"]["settings_protectMinRack"]=["Marktschutz","Verhindert, dass die Warenmenge beim Marktverkauf den minimalen Lagerbestand unterschreitet."];
    texte["de"]["settings_valBuyingLimitDown"]=["Untere Kaufmarkierung",""];
    texte["de"]["settings_valBuyingLimit"]=["Obere Kaufgrenze","Du kannst am Markt nur Produkte kaufen die maximal der Prozentgrenze entsprechen. Dies sch"+u_dots+"tzt dich vor dem versehentlichen Kauf "+u_dots+"bertrieben teurer Waren."];
    texte["de"]["settings_valBuyingLimitNPC"]=["Nur billiger als NPC kaufen",""];
    texte["de"]["settings_valSellingLimit"]=["Verkaufgrenzen","Auch dein Verkauf wird gesch"+u_dots+"tzt, so dass du weder zu billig noch zu teuer verkaufst."];
    texte["de"]["settings_valJoinPrices"]=["Ein Preisfeld","Verbindet die Preis-Eingabefelder beim Marktstand"];
    texte["de"]["settings_valQuicklinks"]=["Quicklinks am Markt anzeigen","Quicklinks am Markt anzeigen"];
    texte["de"]["settings_valUseObservedPrices"]=["Benutze beobachtete Preise","Wenn du dich durch den Markt klickst, werden die Preise beobachtet. Ein berechneter Preis ist in der Preisliste zu sehen. Soll dieser automatisch "+u_dots+"bernommen werden?"];
    texte["de"]["settings_valSendStatistics"]=["Sende Statistiken","Unterst"+u_dots+"tze den <a href='http://mff.metrax.eu/' target='_blank'>Statistik-Server</a>. Es werden keine privaten Daten gesendet!"];
    texte["de"]["settings_valPrivateMessages"]=["Anzahl gemerkte Privatnachrichten","Deine letzten privaten Nachrichten werden gespeichert und somit kann ein Nachrichten-Verlauf mit einem Kontakt angezeigt werden."];
    texte["de"]["settings_valMarketMessages"]=["Anzahl gemerkte Marktnachrichten","Es bleiben auch alte System-Nachrichten in diesem Speicher, selbst wenn sie "+a_dots+"lter als die maximalen 7&nbsp;Tage sind."];
    texte["de"]["settings_valMessageRe"]=["Betreff k"+u_dots+"rzen","Ersetzt im Betreff \"Re:Re:\" durch \"Re:\", wenn du eine Antwort schreibst."];
    texte["de"]["settings_valMessagesSystemMarkRead"]=["Systemnachrichten lesen","Systemnachrichten werden automatisch als gelesen markiert."];
    texte["de"]["settings_valFoodworldFarmiPlacing"]=["Picknickarea Farmis platzieren","Angenommene Picknickarea Farmis werden automatisch auf einen freien Sitzplatz gewiesen."];
    texte["de"]["settings_valAutoLogin"]=["Automatisch einloggen","Sobald Nutzerdaten und Passwort eingegeben sind, werden die Accounts wieder eingeloggt. Somit kann wieder gef"+u_dots+"ttert, geerntet, gegossen und gepflanzt werden. Es m"+u_dots+"ssen Popups erlaubt werden bei mehreren Accounts."];
    texte["de"]["settings_valUpdate"]=["Update","Es wird gepr"+u_dots+"ft, ob eine neuere Version dieses Scriptes verf"+u_dots+"gbar ist."];
    texte["de"]["settings_valServerTimeOffset"]=["Zeit des Servers",""];
    texte["de"]["settings_valGamecursor"]=["Spiel-Cursor","Benutze die spieleigenen Cursor an Stelle deiner System-Cursor."];
    texte["de"]["settings_valDrag"]=["Verschieben","Erlaube das Bewegen der Fenster (obere linke Ecke)."];
    texte["de"]["settings_valClickErrorbox"]=["Verstecke Fehlerbox","Einige Spieler haben Probleme mit der Fehlerbox. Beachte, dass diese Meldung normalerweise sinnvoll ist!"];
    texte["de"]["settings_valHotkeys"]=["Hotkeys","Benutze Hotkeys um schnell durch das Spiel zu navigieren. Schau in die Hilfe."];
    texte["de"]["settings_hotkeymap"]={"prevPage":"vorige Nachricht, Zone, ...","nextPage":"n"+a_dots+"chste Nachricht, Zone, ...","farm1":"1. Farm","farm2":"2. Farm","farm3":"3. Farm","guild":"Club","city1":"Klein Muhstein","city2":"Teichlingen","farmilog":"Farmi-Log","help":"Hilfe","market":"Marktplatz","marketstand":"Marktstand","messages":"Nachrichten","options":"Optionen","profit":"Profit Kalkulation","sgh":"Saatguth"+a_dots+"ndler","overview":U_dots+"bersicht","contract":"Vertr"+a_dots+"ge","systemmessage":"(n"+a_dots+"chste ungelesene) Systemnachricht"};
    texte["de"]["settings_valzoneAddToGlobalTime"]=["Integration","Soll die Zeit in die Global-Zeit einbezogen werden?"];
    texte["de"]["settings_valGlobaltimeShowCroppedZone"]=["Beachte geerntete Zonen","Sollen geerntete Zonen in die globale Zeit einbezogen werden?"];
    texte["de"]["settings_cacheReset"]=["Cache reset","Alle Informationen "+u_dots+"ber deine Zonen werden gel"+o_dots+"scht ..."];
    // help
    texte["de"]["help_0"]=[,"This is small introduction to the functions of the Adviser-Script. Not all changes are written here, go find them yourself ... Sometimes a mouse-over helps. <br>At the bottom you see a button to visit the <a href=\""+GM_Home+"\" target=\"_blank\">homepage</a>. Next to it, there is the button for the options. You should look at them and configure as you desire.<br>Generally the script only knows what you have seen. So just visit the field if something is wrong."];
    texte["de"]["help_1"]=["The Zones","The fields are observed while you see them. The script saves the plants, times and watering. So on the farm view this can be displayed. Each zone has a time counter at its top to show you when it is ready.<br>If you own the planting helper, you can access it directly from opened field. At the top of an opened zone you can navigate directly to zones of the same type."];
    texte["de"]["help_2"]=["The Overview","Click the pig on the top and you will see an overview of your complete farm. Each zone, its output (product and points) and the next time of work are displayed. Also your total crop is shown. Below you see the wishes of your farmies. You can click each zone or farmie to navigate there. If you are run out of a product, it can take you directly to the market place."];
    texte["de"]["help_3"]=["Blue Bar","Your points are kept daily. At the bottom you see a bar displaying the current and past level. Each white and red (sunday) line is a day. If you click it you get a detailed table and perhaps a hint if you are lack of a product."];
    texte["de"]["help_4"]=["Shelf","Here informations of prices and value are added. The amount are reformatted to better style. At the bottom you have an input to seach an other player."];
    texte["de"]["help_5"]=["Profit Calculation","Next to the bottom of the shelf you can click <img src=\""+GFX+"buildingupdatebutton_off.png\" style=\"width: 15px;height: 15px;\">. This shows you a table calculating times and profits of your products. Click the stars to change the upgrade levels. Click the headline to sort."];
    texte["de"]["help_6"]=["Farmies","The bubbles of the farmies are expanded by a calculation if they pay enough. If your product amount runs too low, the product is marked. Click the house next to the farmies to see the ones of the last month. At the blue bar on the right you can set which farmies you send away. At the top a calculation is made, so you can decide if an advertising is profitable."];
    texte["de"]["help_7"]=["Hotkeys","You can quickly move to a place by pressing <i>Alt</i>+... See the options!"];
    texte["de"]["help_8"]=["Market place","On the market place you are \"protected\", means that you can't buy a product more expensive than in the retailer or by options set. If activated, you can directly switch to a product page by the incoming window on the right. At the top you can step to the next/previous product and see your current amount.<br>You find at the bottom a very important button: the prices. It gives you a table listing your product amounts, values and the prices that are everywhere used. So keep attention they are set right! An \"observed\" price is kept when you visit a market page of a single product.<br>On your market stall a few usefull values are displayed and your last offer was kept and is set now."];
    texte["de"]["help_9"]=["Messages","Your sales are kept and directly displayed - no need to open a message two times! Note the \"Read all\" and \"Log\" buttons. Your private messages are kept, too. So no need to look for the last messages of the current contact."];
    texte["de"]["help_10"]=["Contracts","They are kept, too. While creating a contact an input displays the value of the entered product. Enter first the price and then the amount to get inverse the amount. You can submit the same contract multiple times!"];
    texte["de"]["help_11"]=["Account Managing","You can save all your accounts in the options. So you can login easily in each one by the displayed buttons on the starting page. Note that you can switch directly the accounts at the same server."];
}
if(top.unsafeData.texte["en"]==undefined){
    texte["en"]=new Object();
    texte["en"]["msgMarketsaleContent"]="(.*) bought (\\d+)x (.*?) for<br> (.*?) pD from you\\."; // The text where the information is stated. The information has to be replaced by "(.*?)".
    texte["en"]["msgContractsaleContent"]="(.*) has signed a contract of yours!<br><br> The following products have been sold:<br>(.*?)<br> The amount of (.*?) pD has been credited to your account\\."; // The text where the general information is stated. The information has to be replaced by "(.*?)".
    texte["en"]["msgContractsaleList"]="(\\d+)x (.*?)<br>"; // The line-pattern for the detailed selling list
    texte["en"]["msgFriend"]="(.+) would like to add you as a friend"; // The subject. The person has to be replaced by "(.+)"
    
    texte["en"]["above"]="above";
    texte["en"]["absolute"]="absolute";
    texte["en"]["accountActive"]="Account active";
    texte["en"]["accounts"]="Accounts";
    texte["en"]["activation"]="Activation";
    texte["en"]["additionalFarmi"]="%1% additional farmie daily";
    texte["en"]["additionalForestFarmiSlot"]="%1% additional place in the forest farmi waiting queue";
    texte["en"]["additionalLogCapacity"]="Rack capacity for logs increases of %1%";
    texte["en"]["advertisingEnds"]="Advertising ends today";
    texte["en"]["adviser"]="Adviser";
    texte["en"]["afterFee"]="After Fee";
    texte["en"]["alertSetPriceNone"]="Do you really want to set no price for %PRODUCT%?";
    texte["en"]["alertSetPriceOverNPC"]="Do you really want to set the price of %PRICE% for %PRODUCT%?<br>It is higher than the NPC-value of %NPC%.";
    texte["en"]["alertSetPriceOverObs"]="Do you really want to set the price of %PRICE% for %PRODUCT%?<br>It is much higher than the observed value of %OBS%.";
    texte["en"]["alertSetPriceUnderObs"]="Do you really want to set the price of %PRICE% for %PRODUCT%?<br>It is much lower than the observed value of %OBS%.";
    texte["en"]["alertWillLowRack"]="Attention! This will drop your stock below the minimal value!";
    texte["en"]["all"]="All";
    texte["en"]["autologinAllOk"]="All accounts logged in.";
    texte["en"]["autologinChecking"]="Checking active sessions.  Please wait %1% seconds<br>...";
    texte["en"]["boughtTickets"]="Bought tickets";
    texte["en"]["buy"]="Buy";
    texte["en"]["buyers"]="Buyers";
    texte["en"]["calcTo"]="Calculate to";
    texte["en"]["carpentry"]="Carpentry";
    texte["en"]["city"]="City";
    texte["en"]["change"]="Change";
    texte["en"]["clearFilter"]="Clear filter";
    texte["en"]["click"]="Click";
    texte["en"]["clickAlt"]="Alt+Click";
    texte["en"]["clickCtrl"]="Ctrl+Click";
    texte["en"]["clickDouble"]="Double-Click";
    texte["en"]["clickToChange"]="Click to change";
    texte["en"]["coins"]=unsafeWindow.t_coins;
    texte["en"]["commission"]   = "Commission";
    texte["en"]["confirmUseObservedPrices"]="The observed prices will overwrite previously saved market prices ...";
    texte["en"]["confirmChangelogVersion"]="You have installed a new version of the Adviser script.<br>The version %1% contains the following changes:";
    texte["en"]["contract"]="Contract";
    texte["en"]["contractsReceived"]="Contracts received";
    texte["en"]["contractsSent"]="Contracts sent";
    texte["en"]["couldNotGetRank"]="Your rank could not be determined.";
    texte["en"]["couldNotGetUpdateInfoOfX"]="Update information for %1% could not be determined."
    texte["en"]["cropped"]="Cropped";
    texte["en"]["currentOffers"]="Current offers";
    texte["en"]["dailyRuns"]="Daily runs";
    texte["en"]["dailyTicket"]="Daily ticket";
    texte["en"]["dailyYield"]="Daily yield";
    texte["en"]["date"]="Date";
    texte["en"]["day"]="Day";
    texte["en"]["day0"]="Today";
    texte["en"]["day1"]="Tomorrow";
    // texte["day2"]="Day after tomorrow"; // comment it if not used in the language
    texte["en"]["default"]="Default";
    texte["en"]["delete"]="Delete";
    texte["en"]["demand"]="Demand";
    texte["en"]["detail"]="Detail";
    texte["en"]["donkey"]="Donkey";
    texte["en"]["duration"]="duration";
    texte["en"]["editPrice"]="Edit price";
    texte["en"]["emptyField"]="Empty field!";
    texte["en"]["exchangedLots"]="Exchanged lots";
    texte["en"]["farm"]="Farm";
    texte["en"]["farmersmarket"]=unsafeWindow.t_farmers_market;
    texte["en"]["farmX"]="%1%. farm";
    texte["en"]["farmi"]="Farmie";
    texte["en"]["farmis"]="Farmies";    
    texte["en"]["farmpedia"]="FarmPedia";
    texte["en"]["farmpediaUrl"]="http://farmpedia.myfreefarm.de/";
    texte["en"]["farmzone"]="Building place %1% of %2%. farm";
    texte["en"]["feed"]="Feed";
    texte["en"]["filter"]="Filter";
    texte["en"]["filterForX"]="Filter for %1%";
    texte["en"]["finished"]="Finished";
    texte["en"]["foodworld"]=unsafeWindow.foodworld_title;
    texte["en"]["forest"]="Forest";
    texte["en"]["forestry"]="Forestry";
    texte["en"]["formatNumbers"]="Format numbers";
    texte["en"]["formulaType"]=["Prod","+val","+pts"];
    texte["en"]["fl1"]="Flower meadow";
    texte["en"]["fl2"]="Flower workshop";
    texte["en"]["fl3"]="Monster fruit culture";
    texte["en"]["fl6"]="Speed eating";
    texte["en"]["fw1"]="Soda stall";
    texte["en"]["fw2"]="Snack booth";
    texte["en"]["fw3"]="Pastry shop";
    texte["en"]["gain"]="Gain";
    texte["en"]["gamecurrency"]=unsafeWindow.gamecurrency;
    texte["en"]["general"]="General";
    texte["en"]["given"]="Given";
    texte["en"]["goToDonkey"]="Go to donkey Luke";
    texte["en"]["goToLottery"]="Go to lottery";
    texte["en"]["goToMarket"]="Go to market";
    texte["en"]["goToMarketOfX"]="Go to market of %1%";
    texte["en"]["goToMarketstall"]="Go to market stall";
    texte["en"]["goToPage"]="Go to page";
    texte["en"]["goToRank"]="Go to rank";
    texte["en"]["goToZoneX"]="Go to zone %1%";
    texte["en"]["goods"]="Goods";
    texte["en"]["hide"]="hide";
    texte["en"]["highlightProducts"]="Highlight products at market";
    texte["en"]["highlightUser"]="Highlight user at market";
    texte["en"]["hotkeys"]="Hotkeys";
    texte["en"]["idle"]="idle !!";
    texte["en"]["inStock"]="in stock";
    texte["en"]["informationIsMissing"]="Information is missing."
    texte["en"]["ingredients"]="Ingredients";
    texte["en"]["invalidServer"]="Invalid Server";
    texte["en"]["inventory"]="Inventory";
    texte["en"]["keptLots"]="Kept lots";
    texte["en"]["level"]="Level";
    texte["en"]["levelTooLow"]="Your level is too low";
    texte["en"]["levelXneeded"]="Level&nbsp;%1%&nbsp;needed";
    texte["en"]["load"]="Load";
    texte["en"]["loading"]="Loading";
    texte["en"]["localTime"]="Local time";
    texte["en"]["lodge"]="Log cabin";   
    texte["en"]["login"]="Login";
    texte["en"]["logDonkey"]="Donkey Luke Log";
    texte["en"]["lotteryLog"]="Lottery Log";
    texte["en"]["lvl"]="Lvl";
    texte["en"]["manageVariables"]="Manage variables";  
    texte["en"]["market"]="Market";
    texte["en"]["marketPrice"]="Market&nbsp;Price";
    texte["en"]["marketplace"]="Market place";
    texte["en"]["marketstall"]="Market stall";
    texte["en"]["megafield"]="Megafield";
    texte["en"]["messages"]="Messages";
    texte["en"]["minRack"]="Min&nbsp;rack";
    texte["en"]["minRackamount"]="Minimal rackamount";
    texte["en"]["missing"]="Need";
    texte["en"]["money"]="Offered";
    texte["en"]["msgUpdate"]="There is a new script version of the Adviser. Install?";
    texte["en"]["msgUpdateX"]="A new script version of %1% is available. Do you want to install it?";
    texte["en"]["name"]="Name";
    texte["en"]["newLevelReached"]="Congratulations!<br>You have reached the next level!";
    texte["en"]["nextMessage"]="next message";
    texte["en"]["no"]="No";
    texte["en"]["NPC"]="NPC";
    texte["en"]["NPCprice"]="NPC-Price";
    texte["en"]["nr"]="Nr";
    texte["en"]["observed"]="Observed";
    texte["en"]["ok"]="OK";
    texte["en"]["oldOnes"]="Old";
    texte["en"]["options"]="Options";
    texte["en"]["overNPCprice"]="over NPC-price";
    texte["en"]["overX"]="over %1%";
    texte["en"]["overview"]="overview";
    texte["en"]["password"]="Password";
    texte["en"]["pleaseOpenX"]="Please open %1%.";
    texte["en"]["points"]="Points";
    texte["en"]["portalLogin"]="Portal-Login";
    texte["en"]["powerups"]="Power-Ups";
    texte["en"]["previousMessage"]="previous message";
    texte["en"]["price"]="Price";
    texte["en"]["prices"]="Prices";
    texte["en"]["product"]="Product";
    texte["en"]["productOverview"]="Product overview";
    texte["en"]["productTimeSaving"]="%1% minutes saving for %2%";
    texte["en"]["production"]="Production";
    texte["en"]["products"]="Products";
    texte["en"]["profit"]="Profit";
    texte["en"]["profitTable"]="Profit per Zone per Day";
    texte["en"]["quantity"]="Quantity";
    texte["en"]["quest_foodworld"]="Picnic area quest series";
    texte["en"]["quest_forestry"]="Series of quests (forestry)";
    texte["en"]["quest_main"]="Series of quests (farm)";
    texte["en"]["questfoodworld1"]="Picnic area quest series";
    texte["en"]["questforestry1"]="1st series of quests (forestry)";
    texte["en"]["questforestry2"]="2nd series of quests (forestry)";
    texte["en"]["questmain1"]="1st series of quests (farm)";
    texte["en"]["questmain2"]="2nd series of quests (farm)";
    texte["en"]["quests"]="Quests";
    texte["en"]["rackX"]="%1%. rack";
    texte["en"]["rank"]="Rank";
    texte["en"]["readAll"]="Read all";
    texte["en"]["readyAtX"]="Ready at %1%"; // %1%=2:15+texte["shortOClock"]
    texte["en"]["readyAtX_day1"]="Tomorrow ready at %1%"; 
    // texte["en"]["readyAtX_day2"]="Ready in 2days at %1%"; // comment it if not used in the language
    texte["en"]["readySinceX"]="Ready since %1%"; 
    texte["en"]["recipes"]="Recipes";
    texte["en"]["recursive"]="Recursive Needed";
    texte["en"]["relative"]="relative";
    texte["en"]["relogin"]="Session ends soon.<br>New login in %1%.";
    texte["en"]["requestingUpdateInfoOfX"]="Requesting update information for %1% ..."
    texte["en"]["requestingUserStatistic"]="Requesting user statistic ...";
    texte["en"]["requirement"]="Need";
    texte["en"]["requirementPerProduction"]="Requirement per production";   
    texte["en"]["reward"]="Reward";
    texte["en"]["salesLog"]="Sales log";
    texte["en"]["save"]="Save";
    texte["en"]["saveAsTemplate"]="Save as template";
    texte["en"]["sawmill"]="Sawmill";
    texte["en"]["scriptHomepage"]="Script Homepage";
    texte["en"]["searchPlayer"]="Search player";
    texte["en"]["sendContract"]="Send contract";
    texte["en"]["sendContractAgain"]="Send contract again";
    texte["en"]["sentContractNrX"]="Sent contract no %1%."
    texte["en"]["sendingXObservedPricesToServer"]="Sending %1% observed prices to server ...";
    texte["en"]["server"]="Server";
    texte["en"]["serverTime"]="Time of server";
    texte["en"]["sessionEnd"]="End of Session at %1%<br>Click for new login";   
    texte["en"]["SGH"]="SGH"; // Short for the seller of plants
    texte["en"]["shadowboxitem"]="Shadowbox item";  
    texte["en"]["shortHours"]="h";
    texte["en"]["shortOClock"]="h";
    texte["en"]["shouldReload"]="You should reload the page.";
    texte["en"]["showAll"]="Show all";
    texte["en"]["showChangelog"]="Show changelog";
    texte["en"]["showLog"]="Show log";
    texte["en"]["showMissingProducts"]="Show product shortage";
    texte["en"]["showPasswords"]="show passwords";
    texte["en"]["sinceX"]="since %1%";
    texte["en"]["single"]="Single";
    texte["en"]["start"]="Start";
    texte["en"]["stat_days1"]="1 day";
    texte["en"]["stat_days3"]="3 days";
    texte["en"]["stat_days5"]="5 days";
    texte["en"]["stat_days7"]="7 days";
    texte["en"]["stat_gamefield"]="Show game";
    texte["en"]["stat_stats"]="Show statistics";
    texte["en"]["statistics"]="Statistics";
    texte["en"]["stock"]="Stock";
    texte["en"]["stockValue"]="Stock value";
    texte["en"]["stockXlow"]="Stock %1% low";
    texte["en"]["stockXmissing"]="Stock %1% missing!!!";
    texte["en"]["storeXinContract"]="Store %1% in contract";
    texte["en"]["summarize"]="Summarize";
    texte["en"]["takeObservedPrices"]="Take observed prices";
    texte["en"]["time"]="Time";
    texte["en"]["title"]="Title";
    texte["en"]["toMessage"]="to message";
    texte["en"]["toSGH"]="Go to shop";
    texte["en"]["total"]="Total";
    texte["en"]["turnover"]="Turnover";
    texte["en"]["unitPrice"]="Unit price";
    texte["en"]["updateOfXAvailable"]="A new script version of %1% is available. You refused to install it."
    texte["en"]["upgradeForX"]="upgrade&nbsp;for&nbsp;%1%";
    texte["en"]["upgradeLevel"]="Upgrade level";
    texte["en"]["upjersAdvertising"]="Upjers-Advertising";
    texte["en"]["useQuestProducts"]= "Use current quest products";
    texte["en"]["useWildcard"]= "Use * to match one or more letters.";
    texte["en"]["value"]="Value";
    texte["en"]["version"]="Version";
    texte["en"]["waterBonus"]="%1%% water bonus";
    texte["en"]["waterNeeded"]="Water needed";
    texte["en"]["waterNeededAtX"]="Water needed at %1%"; 
    texte["en"]["waterNeededAtX_day1"]="Tomorrow water needed at %1%";
    texte["en"]["wateringFeature"]="Watering feature";
    texte["en"]["windmill"]="Windmill";
    texte["en"]["writeMessage"]="write message";
    texte["en"]["XIsUpToDate"]="%1% is up-to-date."
    texte["en"]["yes"]="Yes";
    texte["en"]["yield"]="Yield";
    texte["en"]["yieldPerProduction"]="Yield per production";
    texte["en"]["youAreOnRankX"]="You are on rank %1%.";
    // category
    texte["en"]["category_c"]=texte["en"]["coins"];
    texte["en"]["category_v"]="Plants";
    texte["en"]["category_e"]="Advanced products";
    texte["en"]["category_z"]=unsafeWindow.rack_deco;
    texte["en"]["category_o"]=unsafeWindow.rack_oil;
    texte["en"]["category_fw"]=unsafeWindow.rack_foodworld;
    texte["en"]["category_fw1"]="Drinks";
    texte["en"]["category_fw2"]="Food";
    texte["en"]["category_fw3"]="Cakes";
    texte["en"]["category_fw4"]="not yet available";
    texte["en"]["category_fl"]="Flowers";
    texte["en"]["category_fla"]="Arrangements";
    texte["en"]["category_f1"]="Saplings";
    texte["en"]["category_f2"]="Logs";
    texte["en"]["category_f3"]="Sawmill products";
    texte["en"]["category_f4"]="Carpentry products";
    texte["en"]["category_f5"]="Wooden farmhouse items";
    texte["en"]["category_r0"]="Recipes product";
    texte["en"]["category_r1"]="Recipes increade yield";
    texte["en"]["category_r2"]="Recipes increade points";
    texte["en"]["category_p0"]="Power-Ups Produkt";
    texte["en"]["category_p1"]="Power-Ups increade yield";
    texte["en"]["category_p2"]="Power-Ups increade points";
    // settings
    texte["en"]["settings_valAutoWater"]=["Automatic watering","Plants will be watered after planting, if you have 'Water everything' (Premium)."];
    texte["en"]["settings_valAssumeWater"]=["Assume watering","This is important for plants growing more than 24h. The calculation of the cropping time assumes watering when needed."];
    texte["en"]["settings_valAutoCrop"]=["Automatic harvesting","After opening your field, crops will be harvested if necessary."];
    texte["en"]["settings_valWaterNeeded"]=["Watering needed","Shall the necessity of watering be displayed?"];
    texte["en"]["settings_valCropMsg"]=["Close harvest dialog","Don't like the annoying harvest notification with the pig?  Get rid of it here."];
    texte["en"]["settings_valLimitEmptyFields"]=["Empty areas","If the number of unplanted areas in your field exceeds this number, the field will be shown as empty."];
    texte["en"]["settings_valLimitEmptyFields_forest"]=["Empty forest areas","If the number of unplanted areas in your field exceeds this number, the field will be shown as empty."];
    texte["en"]["settings_valMoveAnimals"]=["Move animals",""];
    texte["en"]["settings_valContractLogAmount"]=["Number contracts kept","Your last sent and received contracts are kept so that a history of them can be shown."];
    texte["en"]["settings_valFarmiLimits"]=["Farmie Limits","The farmies are marked in 3 cases depending on their payment-rate."];
    texte["en"]["settings_valFarmiMiniInfo"]=["Farmie Mini Info","Displays a small circle below each farmie showing its case of payment-rate."];
    texte["en"]["settings_valMinRackMan"]=["Detail configuration","You edit the amount on your own *here*"];
    texte["en"]["settings_valMinRack"]=[,"A product is marked if its amount in your rack is falling below this value. You can enter different values depending on the category."];
    texte["en"]["settings_valMinRackPlantsize"]=["Aspect size of plant","For example grain needs only half of the value above."];
    texte["en"]["settings_valMinRackGrowing"]=["Growing products","Adds the amount of products that are in production and ready by powerup."];
    texte["en"]["settings_valMinRackQuest"]=["Quest products","Adds the amount of the quest products"];
    texte["en"]["settings_valMinRackRecursive"]=["Recursive products","Add the required products needed to make missing products, and calculate these again for the required proucts.(used by forestry products)"];
    texte["en"]["settings_valMinRackFarmis"]=["Farmie products","Adds the amount of the products wanted by the farmies which pay more than the lower limit."];
    texte["en"]["settings_valMinRackForestryFarmis"]=["Lodge farmie products","Adds the amount of the products wanted by the lodge farmies."];
    texte["en"]["settings_protectMinRack"]=["Selling protection","Prohibits to sell products at market below the minimal rackamount"];
    texte["en"]["settings_valBuyingLimitDown"]=["Bottom buy highlight",""];
    texte["en"]["settings_valBuyingLimit"]=["Top buy limit","You can only buy products at the Market up to the limit given.  This protects you from accidentally purchasing very over-priced goods."];
    texte["en"]["settings_valBuyingLimitNPC"]=["Only allow buy less than price of NPC",""];
    texte["en"]["settings_valSellingLimit"]=["Sell limits","Your sales are also protected, so that you don't price your own goods too cheaply or too highly."];
    texte["en"]["settings_valJoinPrices"]=["One input","Joins the price input fields at the market stand."];
    texte["en"]["settings_valQuicklinks"]=["Show market quicklinks","Show Quicklinks at Market place"];
    texte["en"]["settings_valUseObservedPrices"]=["Use observed prices","Prices are observed while clicking through the market place. A calculated price can be seen in the price list. Shall this automatically override your settings?"];
    texte["en"]["settings_valSendStatistics"]=["Send statistics","Support the <a href='http://mff.metrax.eu/' target='_blank'>Statistik-Server</a>.  No private data is sent!"];
    texte["en"]["settings_valPrivateMessages"]=["Number private messages kept","Your last private messages are kept so that a message history of one contact can be shown."];
    texte["en"]["settings_valMarketMessages"]=["Number market messages kept","Old messages remain in this archive, even if they are older than the maximum 7 days."];
    texte["en"]["settings_valMessageRe"]=["Short subject","Replaces \"Re:Re:\" to \"Re:\" in the subject when you reply to a message."];
    texte["en"]["settings_valMessagesSystemMarkRead"]=["Read system messages","System messages are marked read automatically."];
    texte["en"]["settings_valFoodworldFarmiPlacing"]=["Locate picnic area farmis","Accepted picnic area farmis are located automatically to a vacant seat."];
    texte["en"]["settings_valAutoLogin"]=["Automatic login","Once username and password information is given, all accounts will be logged in, so that they can be fed, harvested, watered, and planted. Popups must be allowed with multiple accounts."];
    texte["en"]["settings_valUpdate"]=["Update","Checks whether an updated version of this Advisor script is available."];
    texte["en"]["settings_valServerTimeOffset"]=["Time of server",""];
    texte["en"]["settings_valGamecursor"]=["Game cursor","Use the game cursors instead of your system cursors."];
    texte["en"]["settings_valDrag"]=["Dragging","Allow moving windows by clicking the upper left corner."];
    texte["en"]["settings_valClickErrorbox"]=["Hide errorbox","Some users have problems with the error box. Keep in mind that this alert is normally useful!"];
    texte["en"]["settings_valHotkeys"]=["Hotkeys","Use hotkeys to quicker navigate the game. See the help."];
    texte["en"]["settings_hotkeymap"]={"prevPage":"previous Message, Zone, ...","nextPage":"next Message, Zone, ...","farm1":"1st farm","farm2":"2nd farm","farm3":"3rd farm","guild":"Club","city1":"First Village","city2":"Second Village","farmilog":"Farmi-Log","help":"Help","market":"Market place","marketstand":"Market stand","messages":"Messages","options":"Options","profit":"Profit Calculation","sgh":"Seed retailer","overview":"Overview","contract":"Contracts","systemmessage":"(next unread) system message"};
    texte["en"]["settings_valzoneAddToGlobalTime"]=["Integrate","Shall the time be included to the global time?"];
    texte["en"]["settings_valGlobaltimeShowCroppedZone"]=["Integrate cropped zone","Shall the ready-state of the cropped zones be included in the global time?"];
    texte["en"]["settings_cacheReset"]=["Cache reset","All information about your farms will be deleted ..."];
    //help
    texte["en"]["help_0"]=[,"This is small introduction to the functions of the Adviser-Script. Not all changes are written here, go find them yourself ... Sometimes a mouse-over helps. <br>At the bottom you see a button to visit the <a href=\"http://userscripts.org:8080/scripts/show/66964\" target=\"_blank\">homepage</a>. Next to it, there is the button for the options. You should look at them and configure as you desire.<br>Generally the script only knows what you have seen. So just visit the field if something is wrong."];
    texte["en"]["help_1"]=["The Zones","The fields are observed while you see them. The script saves the plants, times and watering. So on the farm view this can be displayed. Each zone has a time counter at its top to show you when it is ready.<br>If you own the planting helper, you can access it directly from opened field. At the top of an opened zone you can navigate directly to zones of the same type."];
    texte["en"]["help_2"]=["The Overview","Click the pig on the top and you will see an overview of your complete farm. Each zone, its output (product and points) and the next time of work are displayed. Also your total crop is shown. Below you see the wishes of your farmies. You can click each zone or farmie to navigate there. If you are run out of a product, it can take you directly to the market place."];
    texte["en"]["help_3"]=["Blue Bar","Your points are kept daily. At the bottom you see a bar displaying the current and past level. Each white and red (sunday) line is a day. If you click it you get a detailed table and perhaps a hint if you are lack of a product."];
    texte["en"]["help_4"]=["Shelf","Here informations of prices and value are added. The amount are reformatted to better style. At the bottom you have an input to seach an other player."];
    texte["en"]["help_5"]=["Profit Calculation","Next to the bottom of the shelf you can click <img src=\""+GFX+"buildingupdatebutton_off.png\" style=\"width: 15px;height: 15px;\">. This shows you a table calculating times and profits of your products. Click the stars to change the upgrade levels. Click the headline to sort."];
    texte["en"]["help_6"]=["Farmies","The bubbles of the farmies are expanded by a calculation if they pay enough. If your product amount runs too low, the product is marked. Click the house next to the farmies to see the ones of the last month. At the blue bar on the right you can set which farmies you send away. At the top a calculation is made, so you can decide if an advertising is profitable."];
    texte["en"]["help_7"]=["Hotkeys","You can quickly move to a place by pressing <i>Alt</i>+... See the options!"];
    texte["en"]["help_8"]=["Market place","On the market place you are \"protected\", means that you can't buy a product more expensive than in the retailer or by options set. If activated, you can directly switch to a product page by the incoming window on the right. At the top you can step to the next/previous product and see your current amount.<br>You find at the bottom a very important button: the prices. It gives you a table listing your product amounts, values and the prices that are everywhere used. So keep attention they are set right! An \"observed\" price is kept when you visit a market page of a single product.<br>On your market stall a few usefull values are displayed and your last offer was kept and is set now."];
    texte["en"]["help_9"]=["Messages","Your sales are kept and directly displayed - no need to open a message two times! Note the \"Read all\" and \"Log\" buttons. Your private messages are kept, too. So no need to look for the last messages of the current contact."];
    texte["en"]["help_10"]=["Contracts","They are kept, too. While creating a contact an input displays the value of the entered product. Enter first the price and then the amount to get inverse the amount. You can submit the same contract multiple times!"];
    texte["en"]["help_11"]=["Account Managing","You can save all your accounts in the options. So you can login easily in each one by the displayed buttons on the starting page. Note that you can switch directly the accounts at the same server."];
}
err_trace="MenuCommand";
GM_registerMenuCommand(getText("adviser")+" "+"Update", function(){
    location.href=GM_Source;
});
GM_registerMenuCommand(getText("adviser")+" "+getText("scriptHomepage"), function(){
    window.open(GM_Home);
});
if(location.href==GM_Home){
    err_trace="Userscripts.org";
    if($("content")&&$("install_script")){
        var uso_version=/<p><b>Version:<\/b>(\d+\.\d+\.\d+)<\/p>/gi.exec($("content").innerHTML.replace(/\s/gi,""))[1];
        if(compareVersions(uso_version,VERSION)<1){
            $("install_script").firstElementChild.innerHTML="Already installed";
        }else{
            $("install_script").firstElementChild.innerHTML="Update ("+VERSION+"&nbsp;&rarr;&nbsp;"+uso_version+")";
        }
    }
    return false;
}else if(!COUNTRY||!GAMEPAGES[COUNTRY]||!location.hostname.match(GAMEPAGES[COUNTRY])){
    err_trace="COUNTRY error";
    createElement("div",{"style":"position:absolute;top:0;left:0;width:340px;padding:30px;background-color:yellow;border:3px solid black;border-radius:10px;z-index:1000;font-family:Verdana,sans-serif;color:#000000;font-size:12pt;font-weight:bold;"},document.getElementsByTagName("body")[0],"You have to install a language pack. Download one at <a href='http://userscripts.org:8080'>userscripts.org</a>.")
}else{
    err_trace="regular expressions";
    regDelimThou=new RegExp(regDelimThou,"g");
    regDelimThouShift=new RegExp(regDelimThouShift,"g");
    regDelimThouDelete=new RegExp(regDelimThouDelete,"g");
    regDelimDeci=new RegExp(regDelimDeci);
    regMsgMarketsaleContent=new RegExp(getText("msgMarketsaleContent"));
    regMsgContractsaleContent=new RegExp(getText("msgContractsaleContent"));
    regMsgContractsaleList=new RegExp(getText("msgContractsaleList"));
    regMsgFriend=new RegExp(getText("msgFriend"));
    err_trace="Events";
    if(DEVMODE_EVENTS&&(self==top)){
        var allEvents=new Array();
        // list of events:
        allEvents.push("gameWindowContractNew");            // "create new contract"-frame is loaded
        allEvents.push("gameChangedProdMinRackInit");       // prodMinRackInit  is saved (rack amount detail configuration, market-frame)
        allEvents.push("gameChangedProdMinRackAddon");      // prodMinRackAddon is saved
        allEvents.push("gameChangedGut");                   // gut is saved (market-frame)
        allEvents.push("gameChangedBeobPrice");             // beobPrice is saved (market-frame)
        allEvents.push("gameChangedOwnMarketOffers");       // ownMarketOffers is saved
        allEvents.push("gameChangedLevelLog");              // levelLog is saved (message-frame)
        allEvents.push("gameOtherAccReady");                // another account needs to be worked
        allEvents.push("gameSessionEnds");                  // the session ends soon (max 120s)
        allEvents.push("gameInfoPanelOpen");                // the infoPanel is opened and filled
        allEvents.push("gameInfoPanelOptions");             // the infoPanel has the option-tab loaded
        allEvents.push("gameUpdateRack");                   // the rack has loaded
        allEvents.push("gameFieldModified");                // the plants on the opened field are loaded
        allEvents.push("gameFieldOpened");                  // a field is opened
        allEvents.push("gameFieldPlanted");                 // a field has been planted
        allEvents.push("gameFieldWatered");                 // a field has been watered
        allEvents.push("gameFieldCropped");                 // a field has been cropped
        allEvents.push("gameFieldDemolished");              // 
        allEvents.push("gameFactoryKnittingStarted");       // a knitting factory has been started
        allEvents.push("gameFactoryKnittingCropped");       // a knitting factory has been cropped
        allEvents.push("gameFactoryKnittingDialogStart");   // a knitting factory has opened a production dialog
        allEvents.push("gameFarmLoaded");                   // the farm is loaded
        allEvents.push("gameFarmOpened");                   // the farm is opened
        allEvents.push("gameFarmersmarketCropped");         // the farmersmarket is cropped
        allEvents.push("gameFarmersmarketStarted");         // the farmersmarket has been started
        allEvents.push("gameFarmersmarketWatered");         // the farmersmarket has been watered
        allEvents.push("gameFarmersmarketOpened");          // the farmersmarket is opened
        allEvents.push("gameFarmersmarketOpened1");         // the farmersmarket building 1 is opened
        allEvents.push("gameFarmersmarketOpened2");         // the farmersmarket building 2 is opened
        allEvents.push("gameFarmersmarketSlotOpened");      // the farmersmarket building slot has been opened
        allEvents.push("gameFarmersmarketDialogStart");     // the farmersmarket building has opened a dialog
        allEvents.push("gameFarmersmarketDialogCommit");    // the farmersmarket building has requested for commit of a dialog
        allEvents.push("gameFarmiNew");                     // a new farmi is appeared
        allEvents.push("gameFarmiResponse");                // a farmi is been rejected or accepted.
        allEvents.push("gameMegafieldTourStarted");         // a megafield tour has been started
        allEvents.push("gameOpenCampaign");                 // Forestry Quest is opened
        allEvents.push("gameOpenStable");                   // a stable is opened
        allEvents.push("gameOpenFactory");                  // a factory is opened
        allEvents.push("gameOpenFactoryOil");               // an oil factory is opened
        allEvents.push("gameOpenFactoryKnitting");          // an knitting factory is opened
        allEvents.push("gameOpenMarket");                   // the market is opened
        allEvents.push("gameOpenMegafield");                // the megafield is opened
        allEvents.push("gameOpenWindmill");                 // the windmill is opened
        allEvents.push("gameOpenGlobalCommitBox");          // GlobalCommitBox is opened
        allEvents.push("gameOpenGlobalBox");                // GlobalBox is opened
        allEvents.push("gameOpenForestry");                 // Forestry is opened
        allEvents.push("gameFoodworldCropped");             // Foodworld building has been cropped
        allEvents.push("gameFoodworldOpened");              // Foodworld is opened
        allEvents.push("gameFoodworldOpened1");             // Foodworld building 1 is opened
        allEvents.push("gameFoodworldOpened2");             // Foodworld building 2 is opened
        allEvents.push("gameFoodworldOpened3");             // Foodworld building 3 is opened
        allEvents.push("gameFoodworldOpened4");             // Foodworld building 4 is opened
        allEvents.push("gameFoodworldSlotOpened");          // Foodworld slot has been opened
        allEvents.push("gameFoodworldStarted");             // Foodworld building has been started
        allEvents.push("gameSawmillCropped");               // Sawmill has been cropped
        allEvents.push("gameSawmillOpened");                // Sawmill is opened
        allEvents.push("gameSawmillStarted");               // Sawmill has been started
        allEvents.push("gameSawmillSlotOpened");            // Sawmill-Slot is opened
        allEvents.push("gameCarpentryCropped");             // Carpentry has been cropped
        allEvents.push("gameCarpentryOpened");              // Carpentry is opened
        allEvents.push("gameCarpentryStarted");             // Carpentry has been started
        allEvents.push("gameCarpentrySlotOpened");          // Carpentry-Slot is opened
        allEvents.push("gameCity1");                        // city 1 is opened
        allEvents.push("gameCity2");                        // city 2 is opened
        allEvents.push("gameLotteryOpen");                  // lottery frame is opened
        allEvents.push("gameLotteryGotDailyLot");           // daily lot is taken
        allEvents.push("gameLotteryGotLot");                // lot decision question is shown
        allEvents.push("gameLotteryGotPrize");              // got price
        allEvents.push("gameLotteryDailyLotAvailable");     //
        allEvents.push("gamePoweruprackUpdated");           // Powerup data updated
        allEvents.push("gameQuestNewAvailable");            // There is a new quest that can be played
        allEvents.push("gameQuestAccepted");                // Quest is accepted
        //allEvents.push("gameQuestActive");                    // There is an activated quest
        allEvents.push("gameQuestFinished");                // Quest is finished
        allEvents.push("gameQuestSolvable");
        allEvents.push("gameNewDay");                       // a new day started
        allEvents.push("gameWindmillStarted");              // the windmill has been started
        allEvents.push("gameWindmillCropped");              // the windmill has been cropped
        allEvents.push("gameWindmillDialogStart");          // the windmill has opened a recipe dialog
        allEvents.push("gameWindmillDialogCommit");         // the windmill has requested for commit of a recipe dialog
        allEvents.push("gameZoneReady");                    // a zone is ready. unsafeData.readyZone is set
        allEvents.push("gameUpdateFormuladealerOffers");    // the formuladealer has filled the offers
        allEvents.push("gameUpdateFormuladealerRack");      // the formuladealer has filled the recipes rack
        allEvents.push("gamePowerupActivated");             // a powerup has been executed
        allEvents.push("gameReallocateBuilding");           // 2 buildings are swapped. unsafeData.reallocateBuildingSet is set [1..18,1..18]
        allEvents.push("gameUserlevelUp");                  // a new level is reached
        allEvents.push("beraterDone");                      // script successfully executed
    
        for(var v=0;v<allEvents.length;v++){
            document.addEventListener(allEvents[v],function(event){
                logBubble.add("Event:&nbsp;"+event.type,10,"#099");
                //GM_log("Event:&nbsp;"+event.type);
            },false);
        }
        allEvents=null;
    }
    err_trace="CSS";
    GM_addStyle(
        "input:hover{background-color:#cc9!important;}\
        input:focus{background-color:lightblue!important;}\
        button:hover{background-color:#cc9!important;}\
        button:hover{background-color:#cc9!important;}\
        .white,.white td,.white th,.white div,.white span,.white a {color:white;}\
        .black,.black td,.black th,.black div,.black span,.black a {color:black;}\
        .grey,.grey td,.grey th,.grey div,.grey span,.grey a {color:grey;}\
        .red,.red td,.red th,.red div,.red span,.red a {color:red;}\
        th{font-weight:bold;border-bottom:1px dashed black;background-color:#b69162;}\
        th.lightBg{background-color:#d5c0a5!important;}\
        .borderTop1dashedWhite,.borderTop1dashedWhite>td,.borderTop1dashedWhite>th{border-top:1px dashed white!important;}\
        .borderTop1dashedBlack,.borderTop1dashedBlack>td,.borderTop1dashedBlack>th{border-top:1px dashed black!important;}\
        .borderBottom1White,.borderBottom1White>td,.borderBottom1White>th{border-bottom:1px solid white!important;}\
        .borderBottom1Black,.borderBottom1Black>td,.borderBottom1Black>th{border-bottom:1px solid black!important;}\
        .borderBottom1dashedBlack,.borderBottom1dashedBlack>td,.borderBottom1dashedBlack>th{border-bottom:1px dashed black!important;}\
        .borderBottom1dashedGrey,.borderBottom1dashedGrey>td,.borderBottom1dashedGrey>th{border-bottom:1px dashed grey!important;}\
        .blinking{animation-name:blink;animation-duration:1s;animation-timing-function:linear;animation-iteration-count:infinite;animation-direction:normal;animation-delay:0;animation-play-state:running;animation-fill-mode:forwards;}\
        @keyframes blink{0%{opacity:1;}90%{opacity:0.4;}100%{opacity:1;}}\
        .rotating{animation-name:rotate;animation-duration:3s;animation-timing-function:linear;animation-iteration-count:infinite;animation-direction:normal;animation-delay:0;animation-play-state:running;animation-fill-mode:forwards;}\
        @keyframes rotate{0%{transform:rotate(0deg);}100%{transform:rotate(360deg);}}"
    );
    GM_addStyle(
        ".alertbox{color:white;background-color:red;font-weight:bold;}\
        .alertbubble{position:absolute;top:0;left:0;width:340px;padding:30px;background-color:yellow;border:3px solid black;border-radius:10px;z-index:1000;}\
        .sortableColAsc{background-color:lightblue!important;}\
        .sortableColDesc{background-color:lightblue!important;}\
        .hoverBlack:hover,div.hoverBlack:hover div{color:black!important;}\
        .hoverRowBgCc9 tr:hover{background-color:#cc9!important;}\
        .hoverRowBgLightblue>tr:hover{background-color:lightblue!important;}\
        .hoverRowBgLightbrown>tr:hover{background-color:#e4b55d!important;}\
        .hoverBgBlue:hover{background-color:blue!important;}\
        .hoverBgCc9:hover{background-color:#cc9!important;}\
        .hoverBgDarkgreen:hover{background-color:#084200!important;}\
        .hoverBgGreen:hover{background-color:green!important;}\
        .hoverBgGold:hover{background-color:gold!important;}\
        .hoverBgLightblue:hover{background-color:lightblue!important;}\
        .hoverBgLightbrown:hover{background-color:#e4b55d!important;}\
        .hoverBgRed:hover{background-color:red!important;}\
        .hoverBgBlack:hover{background-color:black!important;}\
        .hoverNoTextDecoration:hover,td.hoverNoTextDecoration:hover,span.hoverNoTextDecoration:hover{text-decoration:none!important;}"
    );
    GM_addStyle(
        ".v97{background-position: -240px -120px!important;}\n" // Bugfix Poinsettia (Weihnachtsstern)
        +".v104{background-position: -180px -300px!important;}\n" // Bugfix Daffodil (Osterglocke)
        +".v107{background-position: -240px -300px!important;}\n" // Bugfix Grapes (Weintrauben)
        +".v129{background-position: 0px -390px!important;}\n" // Bugfix Tea (Tee)
        +".v158{background-position: 0px -480px!important;}\n" // Bugfix Tulips (Tulpen)
    );
    GM_addStyle(
        ".playerMsg{float:left;margin-right:7px;background-image:url('"+GFX+"guild/mail.gif');background-position:0px -3px;}\
        .playerMsg div{width:15px;height:12px;opacity:0.5;}\
        .playerMsg div:hover{background-color:blue;}\
        .playerContract{float:left;margin-right:5px;background-image:url('"+GFX+"guild/contract.gif');background-position:-2px 0px;}\
        .playerContract div{width:11px;height:15px;opacity:0.5;}\
        .playerContract div:hover{background-color:blue;}\
        .playerStats{float:left;margin-right:5px;background-image:url('"+GFX+"stadt/stats_sf_black.gif');background-repeat:no-repeat;background-position:0px 2px;}\
        .playerStats div{position:relative;top:1px;width:11px;height:9px;opacity:0.5;border-radius:5px;}\
        .playerStats div:hover{background-color:blue;}\
        .naviItem{float:left;padding:5px;text-align:center;font-weight:bold;border-radius:5px;background-color:#C3A75E;margin-right:5px;}\
        .naviItem:hover{background-color:white;}\
        .naviItemActive{float:left;padding:5px;text-align:center;font-weight:bold;border-radius:5px;background-color:#C3A75E;margin-right:5px;background-color:white;}\
        .naviItemInactive{float:left;padding:5px;text-align:center;font-weight:bold;border-radius:5px;background-color:#C3A75E;margin-right:5px;color:grey;}"
    );
    removeAllCSS(/reallocatebuilding_symbol_tt/);
    GM_addStyle(
        ".rackcat1v,.rackcat1v_active{background:url("+GFX+"rack_sort_top.png);width:27px;height:39px;}\
        .rackcat1v{background-position:0px 0px;}\
        .rackcat1v:hover{background-position:0px -39px;}\
        .rackcat1v_active{background-position:0px -78px;}\
        .rackcat1e,.rackcat1e_active{background:url("+GFX+"rack_sort_top.png);width:26px;height:39px;}\
        .rackcat1e{background-position:-27px 0px;}\
        .rackcat1e:hover{background-position:-27px -39px;}\
        .rackcat1e_active{background-position:-27px -78px;}\
        .rackcat21,.rackcat21_active{background:url("+GFX+"rack_sort_top.png);width:27px;height:20px;}\
        .rackcat21{background-position:-106px 0px;}\
        .rackcat21:hover{background-position:-106px -39px;}\
        .rackcat21_active{background-position:-106px -78px;}\
        .rackcat22,.rackcat22_active{background:url("+GFX+"rack_sort_top.png);width:27px;height:19px;}\
        .rackcat22{background-position:-106px -20px;}\
        .rackcat22:hover{background-position:-106px -59px;}\
        .rackcat22_active{background-position:-106px -98px;}\
        .rackcat23,.rackcat23_active{background:url("+GFX+"rack_sort_top.png);width:26px;height:20px;}\
        .rackcat23{background-position:-133px 0px;}\
        .rackcat23:hover{background-position:-133px -39px;}\
        .rackcat23_active{background-position:-133px -78px;}\
        .rackcat24,.rackcat24_active{background:url("+GFX+"rack_sort_top.png);width:26px;height:19px;}\
        .rackcat24{background-position:-133px -20px;}\
        .rackcat24:hover{background-position:-133px -59px;}\
        .rackcat24_active{background-position:-133px -98px;}\
        .rackcat30fl,.rackcat30fl_active{background:url("+GFX+"rack_sort_top.png);width:27px;height:39px;}\
        .rackcat30fl{background-position:-212px 0px;}\
        .rackcat30fl:hover{background-position:-212px -39px;}\
        .rackcat30fl_active{background-position:-212px -78px;}\
        .rackcat30fla,.rackcat30fla_active{background:url("+GFX+"rack_sort_top.png);width:26px;height:39px;}\
        .rackcat30fla{background-position:-239px 0px;}\
        .rackcat30fla:hover{background-position:-239px -39px;}\
        .rackcat30fla_active{background-position:-239px -78px;};"
    );
    // Script elements
    GM_addStyle(
        ".farmiInfo{position:absolute;height:35px;top:-47px;border-radius:5px;padding:5px;color:black;font-size:0.8em;}\
        .farmiMiniInfo{position:absolute;top:45px;right:15px;height:7px;width:7px;display:block;border-radius:5px;}\
        .questboxbarinPoss{position:absolute;top:0px;height:15px;background-color:green;opacity:0.5;}\
        .fieldReady{background:url('"+GFX+"incoming.gif');position:absolute;top:30px;display:block!important;width:24px;height:57px;}\
        .fieldWaterReady{background:url('"+GFX+"garten/gegossen_static.gif') -20px 0px no-repeat;position:absolute;top:60px;display:block!important;width:40px;height:40px;transform:scale(2,2);}\
        .beraterButtonIcon{margin:3px;width:30px;height:30px;overflow:hidden;background-color:#936b52;border:1px groove #4d240e;border-radius: 20px;}\
        .beraterButtonIcon:hover{transform:scale(1.1);}\
        .opener{background:url('"+GFX+"questbarcontrols.png') 0px 0px no-repeat;width:20px;height:20px;}\
        .leftarrow{height:26px;width:35px;border-radius:15px;background:url('"+IMAGES["leftarrow"]+"');}\
        .leftarrow:hover{background:url('"+IMAGES["leftarrow_dark"]+"');}\
        .rightarrow{height:26px;width:35px;border-radius:15px;background:url('"+IMAGES["rightarrow"]+"');}\
        .rightarrow:hover{background:url('"+IMAGES["rightarrow_dark"]+"');}\
        .formattedRackItem{position:absolute;top:3px;left:0;width:40px;font-size:7pt;color:#555555;text-align:center;}\
        .farmicart_missing td{color:red!important;}\
        .border1 td,.border1 th{border:1px solid black;}\
        .borderTop2 td,.borderTop2 th{border-top:2px solid black;}\
        .borderBottom2 td,.borderBottom2 th{border-bottom:2px solid black;}\
        .fontWeightBold td,.fontWeightBold th{font-weight:bold;}\
        .questlineicon1{background:url('"+GFX+"questlineicons.gif') no-repeat scroll 0 0 transparent;float:left;height:19px;left:2px;position:absolute;top:2px;width:19px;}\
        .questboxlinecontent:hover{background-color:#8F6803;}\
        .quests_status_bar_main1{background:url('"+GFX+"questbar_main1.png') repeat scroll 0 0 rgba(0, 0, 0, 0);}\
        .quests_status_bar_main2{background:url('"+GFX+"questbar_main2.png') repeat scroll 0 0 rgba(0, 0, 0, 0);}\
        .quests_status_bar_forestry1{background:url('"+GFX+"questbar_forestry1.png') repeat scroll 0 0 rgba(0, 0, 0, 0);}\
        .quests_status_bar_forestry2{background:url('"+GFX+"questbar_forestry2.png') repeat scroll 0 0 rgba(0, 0, 0, 0);}\
        .quests_status_bar_foodworld1{background:url('"+GFX+"questbar_foodworld1.png') repeat scroll 0 0 rgba(0, 0, 0, 0);}\
        .quests_status_bar_main1_active{background:url('"+IMAGES["questActiveMain1"]+"') repeat scroll 0 0 rgba(0, 0, 0, 0);}\
        .quests_status_bar_main2_active{background:url('"+IMAGES["questActiveMain2"]+"') repeat scroll 0 0 rgba(0, 0, 0, 0);}\
        .quests_status_bar_forestry1_active{background:url('"+IMAGES["questActiveForestry1"]+"') repeat scroll 0 0 rgba(0, 0, 0, 0);}\
        .quests_status_bar_forestry2_active{background:url('"+IMAGES["questActiveForestry2"]+"') repeat scroll 0 0 rgba(0, 0, 0, 0);}\
        .quests_status_bar_foodworld1_active{background:url('"+IMAGES["questActiveFoodworld"]+"') repeat scroll 0 0 rgba(0, 0, 0, 0);}\
        .category_f1,.category_f2,.category_f3,.category_f4,.category_f5,.category_f1_active,.category_f2_active,.category_f3_active,.category_f4_active,.category_f5_active{width:25px;height:25px;margin:1px;border-radius:9px;}\
        .category_f1,.category_f2,.category_f3,.category_f4,.category_f5{border:2px solid #808080;background:url('"+GFX+"forestry/forestry_symbols6.gif') top left no-repeat;}\
        .category_f1{background-position:-100px 0px;}\
        .category_f2{background-position:-25px -25px;}\
        .category_f3{background-position:-100px -100px;}\
        .category_f4{background-position:-25px -150px;}\
        .category_f5{background-position:0px -175px;}\
        .category_f1_active,.category_f2_active,.category_f3_active,.category_f4_active,.category_f5_active{border:2px solid black;}\
        .category_f1_active{background:url('"+IMAGES["category_f1_active"]+"') top left no-repeat;}\
        .category_f2_active{background:url('"+IMAGES["category_f2_active"]+"') top left no-repeat;}\
        .category_f3_active{background:url('"+IMAGES["category_f3_active"]+"') top left no-repeat;}\
        .category_f4_active{background:url('"+IMAGES["category_f4_active"]+"') top left no-repeat;}\
        .category_f5_active{background:url('"+IMAGES["category_f5_active"]+"') top left no-repeat;}\
        .category_r0,.category_r1,.category_r2,.category_r0_active,.category_r1_active,.category_r2_active{width:42px;height:42px;margin:1px;border-radius:23px;}\
        .category_r0,.category_r1,.category_r2{border:2px solid #808080;;}\
        .category_r0{background:url('"+GFX+"powerup1.png') top left no-repeat;background-position:-9px -23px}\
        .category_r1{background:url('"+GFX+"powerup2.png') top left no-repeat;background-position:-9px -23px}\
        .category_r2{background:url('"+GFX+"powerup3.png') top left no-repeat;background-position:-9px -23px}\
        .category_r0_active,.category_r1_active,.category_r2_active{border:2px solid black;}\
        .category_r0_active{background:url('"+IMAGES["category_r0_active"]+"') top left no-repeat;}\
        .category_r1_active{background:url('"+IMAGES["category_r1_active"]+"') top left no-repeat;}\
        .category_r2_active{background:url('"+IMAGES["category_r2_active"]+"') top left no-repeat;}\
        .category_f1:hover,.category_f2:hover,.category_f3:hover,.category_f4:hover,.category_f5:hover,.category_r0:hover,.category_r1:hover,.category_r2:hover,.category_f1_active:hover,.category_f2_active:hover,.category_f3_active:hover,.category_f4_active:hover,.category_f5_active:hover,.category_r0_active:hover,.category_r1_active:hover,.category_r2_active:hover{transform:scale(1.1);}\
        .zoneBg70_1,.zoneBg70_2,.zoneBg70_3,.zoneBg70_4,.zoneBg70_5,.zoneBg70_6,.zoneBg70_7,.zoneBg70_8,.zoneBg70_9,.zoneBg70_10,.zoneBg70_11,.zoneBg70_12,.zoneBg70_13,.zoneBg70_14,.zoneBg70_15,.zoneBg70_16,.zoneBg70_17,.zoneBg70_18,.zoneBg70_fl1,.zoneBg70_fl2,.zoneBg70_fw1,.zoneBg70_fw2,.zoneBg70_fw3,.zoneBg70_sawmill,.zoneBg70_carpentry{width:70px;height:70px;}\
        .zoneBg70_1,.zoneBg70_2,.zoneBg70_3,.zoneBg70_4,.zoneBg70_5,.zoneBg70_6,.zoneBg70_7,.zoneBg70_8,.zoneBg70_9,.zoneBg70_10,.zoneBg70_11,.zoneBg70_12,.zoneBg70_13,.zoneBg70_14,.zoneBg70_15,.zoneBg70_16,.zoneBg70_17,.zoneBg70_18{background:url('"+GFX+"maps/buildings18.gif') top left no-repeat;background-size: 420px 280px;}\
        .zoneBg70_1{background-position:0px 0px;}\
        .zoneBg70_2{background-position:-70px 0px;}\
        .zoneBg70_3{background-position:-140px 0px;}\
        .zoneBg70_4{background-position:-210px 0px;}\
        .zoneBg70_5{background-position:-280px 0px;}\
        .zoneBg70_6{background-position:-350px 0px;}\
        .zoneBg70_7{background-position:0px -139px;}\
        .zoneBg70_8{background-position:-350px -70px;}\
        .zoneBg70_9{background-position:-70px -139px;}\
        .zoneBg70_10{background-position:-140px -138px;}\
        .zoneBg70_11{background-position:-210px -138px;}\
        .zoneBg70_12{background-position:-280px -138px;}\
        .zoneBg70_13{background-position:-350px -138px;}\
        .zoneBg70_14{background-position:0px -209px;}\
        .zoneBg70_15{background-position:-70px -209px;}\
        .zoneBg70_16{background-position:-140px -209px;}\
        .zoneBg70_17{background-position:-210px -209px;}\
        .zoneBg70_18{background-position:-280px -209px;}\
        .zoneBg70_fl1{background:url('"+GFX+"farm99_pos1.gif') no-repeat;background-position:0px 0px;background-size: 70px 70px;}\
        .zoneBg70_fl2{background:url('"+GFX+"farm99_pos2.png') no-repeat;background-position:0px 0px;background-size: 70px 70px;}\
        .zoneBg70_fw1{background:url('"+GFX+"foodworld/building1_5.jpg') no-repeat;background-position:0px 0px;background-size: 70px 70px;}\
        .zoneBg70_fw2{background:url('"+GFX+"foodworld/building2_5.jpg') no-repeat;background-position:0px 0px;background-size: 70px 70px;}\
        .zoneBg70_fw3{background:url('"+GFX+"foodworld/building3_5.jpg') no-repeat;background-position:0px 0px;background-size: 70px 70px;}\
        .zoneBg70_sawmill{background:url('"+GFX+"forestry/building1.jpg') no-repeat;background-position:0px 0px;background-size: 70px 70px;}\
        .zoneBg70_carpentry{background:url('"+GFX+"forestry/building2.jpg') no-repeat;background-position:0px 0px;background-size: 70px 70px;}\
        .smallStatistic{position:relative;display:inline-block;height:214px;margin:5px;background-color:#bbe;}\
        #imgNeedWater1,#imgNeedWater2,#imgNeedWater3,#imgNeedWater4,#imgNeedWater5,#imgNeedWater6{position:absolute;right:25px;height:63px;width:63px;}\
        #zoneinfo1,#zoneinfo2,#zoneinfo3,#zoneinfo4,#zoneinfo5,#zoneinfo6{border:2px solid #6c441e;border-radius:10px;z-index:3;position:absolute;left:120px;top:20px;}\
        #divErnteInfo{position:relative;float:left;top:120px;left:620px;padding:2px;border:2px inset white;background-color:#FFB876;display:none;}\
        #divRightBorder>div{z-index:2;position:relative!important;top:0!important;margin-top:5px;}\
        #buyNotepad,#marketoffersNotepad{white-space:nowrap;vertical-align:top;border:2px inset black;background-color:white;padding:3px;max-height:200px;;overflow:hidden;overflow-y:scroll;}\
        #zoneNavi{position:absolute;top:9px;right:50px;z-index:25;}\
        #zoneNavi div{float:left;}\
        #divBeraterButtons{-moz-user-select:none;position:fixed;left:0;top:80px;width:40px;border:1px groove #4D240E;border-radius:0 10px 10px 0;z-index:500;background:url(\""+GFX+"guild/help_back.jpg\") -25px -25px;}\
        .clearFilter{width:14px;height:13px;background:url(\""+GFX+"market/filter_del.gif\");}\
        .loginbutton{background-color:white;color:black;text-align:center;font-weight:bold;width:250px;line-height:20px;margin:3px;border:3px solid #6c441e;border-radius:10px;}"

    );
    // Game elements
    GM_addStyle(
        ".friendslineoptions{width:72px!important;}\
        .forestry_slot_product{margin:15px 0 0 20px!important;}\
        .forestry_sawmill_productbox{width:272px!important;height:208px!important;padding:10px!important;}\
        .rackitem_tt_sack,.rackitem_tt_box,.rackitem_tt_bottle,.rackitem_tt_karton,.rackitem_tt_tupper{z-index:110!important;}\
        .farm_button_destruct{display:none!important;}\
        .farm_button_gardenspeedup{left:5px!important;}\
        .farm_button_tt{width:150px!important;}\
        .farm_button_tt{display:none!important;}\
        .quests_status_bar_item_tt{display:none!important;}\
        .messages_list_subject{width:385px!important;}\
        .farm_production_timer{opacity:1!important;}\
        .farmersmarket_pos_timer{opacity:1!important;}\
        #cartsubmit{font-weight:bold!important;}\
        #customerline{z-index:19!important;}\
        #transp8{display:none!important;}\
        #buildinginfo1,#buildinginfo2,#buildinginfo3,#buildinginfo4,#buildinginfo5,#buildinginfo6{display:none!important;}\
        #buildinginfo_right3,#buildinginfo_right6{display:none!important;}\
        #buildinginfo_left0,#buildinginfo_left1,#buildinginfo_left2,#buildinginfo_left4,#buildinginfo_left5{display:none!important;}\
        #updateinfo1,#updateinfo2,#updateinfo3,#updateinfo4,#updateinfo5,#updateinfo6{display:none!important;}\
        #autoplantinfo1,#autoplantinfo2,#autoplantinfo3,#autoplantinfo4,#autoplantinfo5,#autoplantinfo6{display:none!important;}\
        #speedupgardenbuttoninfo1,#speedupgardenbuttoninfo2,#speedupgardenbuttoninfo3,#speedupgardenbuttoninfo4,#speedupgardenbuttoninfo5,#speedupgardenbuttoninfo6{display:none!important;}\
        #bulldozetooltip1,#bulldozetooltip2,#bulldozetooltip3,#bulldozetooltip4,#bulldozetooltip5,#bulldozetooltip6{display:none!important;}\
        #emptyfieldtooltip1,#emptyfieldtooltip2,#emptyfieldtooltip3,#emptyfieldtooltip4,#emptyfieldtooltip5,#emptyfieldtooltip6{display:none!important;}\
        #timeevent1,#timeevent2,#timeevent3,#timeevent4,#timeevent5,#timeevent6{display:none!important;}\
        #friendslist{width:280px!important;}\
        #friendlistinfoblock li:hover{background-color:#e4b55d;}\
        #speedlinks,#cityline{display:block!important;}\
        #rackItems{-moz-user-select:none;}\
        #traveltransp,#questline,#questlineopener,#speedlinks,#guildlink,#guildlink_tt,#cityline,#farmtooltip1,#farmtooltip2,#farmtooltip3,#citytooltip1,#citytooltip2{z-index:110!important;}\
        #zone1,#zone2,#zone3,#zone4,#zone5,#zone6{z-index:1;}\
        #zoneupdatebutton1,#zoneupdatebutton2,#zoneupdatebutton3,#zoneupdatebutton4,#zoneupdatebutton5,#zoneupdatebutton6{position:absolute;left:5px;top:72px;}\
        #lager_wachsezeit,#lager_ertrag,#lager_ist1,#lager_ist2,#lager_zeit,#lager_ernte{margin:0 0 0 5px!important;}\
        #memory_pack{left:50px!important;top:10px!important;z-index:2!important;}\
        #questboxlineinfo1,#questboxlineinfo2{display:none!important;}\
        #questboxline{position:relative!important;top:0!important;}\
        #reallocatebuilding_symbol_tt,#reallocateanimals_symbol_tt,#poweruptimes_content{left:30px!important;}\
        #cropbonus_symbol_tt,#carpentrybonus_content{left:40px!important;}\
        #reallocatebuilding_symbol_tt,#reallocateanimals_symbol_tt{display:none;position:absolute;top:0px;}\
        #game_control{display:none!important;}\
        #food_cart_products{top:250px!important;left:115px!important;}\
        #cartcontent{width:400px!important;}\
        #gardencancel{right:5px!important;top:5px!important;}\
        #rankingcontent{line-height:12px;}\
        .help_content{margin:20px 0 0 0;width: 345px;!important}"
    );
    GM_addStyle(
         ".market_buy{width:30px!important;}\n"
        +".market_delicon{height:15px!important;}" // Bugfix. Game-CSS sets 16px=dis-harmonic to class market_carticon.
        +".market_noicon{height:15px!important;}" // Bugfix. Game-CSS sets 16px=dis-harmonic to class market_carticon.
    );
    GM_addStyle(".divCurrentQuest{background-color:lightblue!important;}");
    if(!GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valGamecursor",true)){
        GM_addStyle(
            "BODY,.normal,.normal2{cursor:default;}\
            .link,.link2{cursor:pointer!important;}\
            TEXTAREA,.text,.text2{cursor:text!important;}"
        );
    }
    
    // **************************************************
    // ChangeData Global 
    // -->> add var to delete also to resetVariables
    err_trace="ChangeData Global";
    try{
        var changedata = GM_getValue("changedata",0);
        switch(changedata){
        case 1:case 2:{
            function old_enc(str) {
                var encoded = "";
                for (i=0; i<str.length;i++) {
                    encoded = encoded+String.fromCharCode(str.charCodeAt(i)^123);
                }
                return encoded;
            }
            var logindata = explode(GM_getValue("logindata",[]),"changedataGlobal/1/logindata",[]);
            for(var v=0;v<logindata.length;v++){ 
                logindata[v][3] = enc(old_enc(logindata[v][3]),4242);
            }
            GM_setValue("logindata",implode(logindata));
        }
        case 3:{
            var help=cloneInto(GM_listValues(), unsafeWindow);
            var help2;
            for(var v=help.length-1;v>=0;v--){
                if(help2=/^([a-z]{2})(_.*)$/.exec(help[v])){ 
                    GM_setValue(help2[1].toUpperCase()+help2[2],GM_getValue(help[v]));
                    GM_deleteValue(help[v]);
                }
            }
            var help = explode(GM_getValue("logindata",[]),"changedataGlobal/3/logindata",[]);
            for(var v=help.length-1;v>=0;v--){
                help[v][0] = help[v][0].toUpperCase();
            }
            GM_setValue("logindata",implode(help));     
        }
        }
        if(changedata<4){ GM_setValue("changedata",4); }
    }catch(err){GM_logError("changedata global\n"+err);}
    // **************************************************
    
    err_trace="Location exec";
    var loc=new RegExp("s(\\d+)\\."+GAMEPAGES[COUNTRY].replace(/\./g,"\\."),"i").exec(location.hostname);
    if(loc){
        SERVER=loc[1];
        PAGE=location.pathname.replace(/^\//,"").replace(/\.php.*$/,"");
        if(DEVMODE){ GM_log("PAGE:"+PAGE+" location.pathname:"+location.pathname); }

        err_trace="User";
        USERNAME=GM_getValue(COUNTRY+"_"+SERVER+"_username","");
        unsafeData.username=USERNAME;
        FARMNAME=$top("username")?$top("username").innerHTML:GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_farmname","");
        npcSaison=explode(GM_getValue(COUNTRY+"_"+SERVER+"_NpcSaison"),"npcSaison",null);
        if(npcSaison==null){
            npcSaison=INIT_NPC_SAISON.clone();
            GM_setValue(COUNTRY+"_"+SERVER+"_NpcSaison",implode(npcSaison,"npcSaison"));
        }
        css_styles = explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_css_styles","{}"),"css_styles",INIT_CSS_STYLES);
        //GM_log("css_styles length:"+css_styles.length()+" :"+implode(css_styles));
        var changeFlag=false;
        for(tag in INIT_CSS_STYLES){
            if(!INIT_CSS_STYLES.hasOwnProperty(tag)){ continue; }
            if(!css_styles[tag]){
                changeFlag=true;
                css_styles[tag]=INIT_CSS_STYLES[tag];
            }
        }
        if(changeFlag){ GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_css_styles",implode(css_styles)); }
        changeFlag=null;
        GM_addStyle(
            ".zoneTimer{z-index:3;position:absolute;padding:2px;margin:1px;"+css_styles["timer"][1]+"}\
            .zoneTimerWater{z-index:3;position:absolute;padding:2px;margin:1px;"+css_styles["watertimer"][1]+"}\
            .zoneTimerReady{z-index:3;position:absolute;padding:2px;margin:1px;"+css_styles["timer_ready"][1]+"}\
            .lowrack{"+css_styles["lowrack"][1]+"}\
            .farmicart_lowrack td{"+css_styles["farmicart_lowrack"][1]+"}\
            .systemMsg_marketsale{"+css_styles["systemMsg_marketsale"][1]+"}\
            .systemMsg_contractsale{"+css_styles["systemMsg_contractsale"][1]+"}\
            #timeHolder{"+css_styles["timeholder"][1]+"}"
        );
    
        // **************************************************
        // ChangeData server
        // -->> add var to delte also to resetVariables
        err_trace="ChangeData server";
        try{
            changedata = GM_getValue(COUNTRY+"_"+SERVER+"_changedata",0);
            // switch(changedata){
            // case 1:case 2: case 3:case 4:case 5:case 6:{
            // }
            // }
            if(changedata<7){ GM_setValue(COUNTRY+"_"+SERVER+"_changedata",7); }
        }catch(err){GM_logError("changedata server\n"+err);}
    
        // ChangeData account
        err_trace="ChangeData account";
        try{
            changedata = GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_changedata",0);
            switch(changedata){
            case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:
            case 11:case 12:case 13:case 14:{
                css_styles = INIT_CSS_STYLES;
                GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_css_styles",implode(css_styles));
            }
            case 15:case 16:case 17:{
                css_styles["timeholder"] = INIT_CSS_STYLES["timeholder"];
                GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_css_styles",implode(css_styles));
            }
            case 18:{
                for(tag in css_styles){
                    if(!css_styles.hasOwnProperty(tag)){ continue; }
                    css_styles[tag][1]=css_styles[tag][1].replace(/-moz-border-radius/g,"border-radius");
                }
                GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_css_styles",implode(css_styles));
            }
            case 19:{
                // Converting object "kauf" to array
                var old_obj = explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_kauf","{}"),"ChangeData19/kauf",{});
                var new_arr = [];
                for(var id in old_obj){
                    if(!old_obj.hasOwnProperty(id)){ continue; }
                    old_obj[id].splice(0,0,parseInt(id,10));
                    new_arr.push(old_obj[id]);
                }
                GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_kauf",implode(new_arr));
                // Converting object "farmiLog" to array
                var old_obj=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_farmiLog","[]"),"ChangeData19/farmiLog",[]);
                var new_arr = [];
                for(var id in old_obj){
                    if(!old_obj.hasOwnProperty(id)){ continue; }
                    old_obj[id].splice(0,0,parseInt(id,10));
                    new_arr.push(old_obj[id]);
                }
                GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_farmiLog",implode(new_arr));
                // Converting object "clubmemberLog" to array
                var old_obj=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_clubmemberLog","{}"),"ChangeData19/clubmemberLog",{});
                var new_arr = [];
                for(var name in old_obj){
                    if(!old_obj.hasOwnProperty(name)){ continue; }
                    var new_arr_name = [name,[]];
                    for(var date in old_obj[name]){
                        if(!old_obj[name].hasOwnProperty(date)){ continue; }
                        var new_arr_date = [date,old_obj[name][date][0],[]];
                        for(var prod in old_obj[name][date][1]){
                            if(!old_obj[name][date][1].hasOwnProperty(prod)){ continue; }
                            new_arr_date[2].push([parseInt(prod,10),old_obj[name][date][1][prod]]);
                        }
                        new_arr_name[1].push(new_arr_date);
                    }   
                    new_arr.push(new_arr_name);
                }
                GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_clubmemberLog",implode(new_arr));
            }
            case 20:{
                // Converting object "lotteryLog" to array
                var old_obj = explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_lotteryLog","{}"),"ChangeData20/lotteryLog",{});
                var new_arr = [];
                var day;
                for(var id in old_obj){
                    if(!old_obj.hasOwnProperty(id)){ continue; }
                    if(id.match(/\d+\.\d+\.\d+/)){
                        day=id;
                    }else if(id.match(/\d+\.\d+/)){
                        day=/(\d+)\.(\d+)/.exec(id);
                        if(day[1].length==1){
                            day=day[2]+"-0"+day[1];
                        }else{
                            day=day[2]+"-"+day[1];
                        }
                    }else{
                        contine;
                    }
                    old_obj[id].splice(0,0,day);
                    new_arr.push(old_obj[id]);
                }
                GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_lotteryLog",implode(new_arr));
                // Converting object "levelLog" to array
                var old_obj = explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_levelLog","{}"),"ChangeData20/levelLog",{});
                var new_arr = [];
                var day;
                for(var id in old_obj){
                    if(!old_obj.hasOwnProperty(id)){ continue; }
                    if(id.match(/\d+\.\d+\.\d+/)){
                        day=id;
                    }else if(id.match(/\d+\.\d+/)){
                        day=/(\d+)\.(\d+)/.exec(id);
                        if(day[1].length==1){
                            day=day[2]+"-0"+day[1];
                        }else{
                            day=day[2]+"-"+day[1];
                        }
                    }else{
                        contine;
                    }
                    old_obj[id].splice(0,0,day);
                    new_arr.push(old_obj[id]);
                }
                GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_levelLog",implode(new_arr));
            }
            case 21:{
                // Converting object "vertraegeIn" to array
                var old_obj = explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_vertraegeIn","{}"),"ChangeData21/vertraegeIn",{});
                var new_arr = [];
                for(var id in old_obj){
                    if(!old_obj.hasOwnProperty(id)){ continue; }
                    old_obj[id].splice(0,0,parseInt(id,10));
                    new_arr.push(old_obj[id]);
                }
                GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_vertraegeIn",implode(new_arr));
                // Converting object "vertraegeOut" to array
                var old_obj = explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_vertraegeOut","{}"),"ChangeData21/vertraegeOut",{});
                var new_arr = [];
                for(var id in old_obj){
                    if(!old_obj.hasOwnProperty(id)){ continue; }
                    new_arr.push([,old_obj[id]]);
                }
                GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_vertraegeOut",implode(new_arr));
            }
            case 22:{
                css_styles["timer_ready"] = INIT_CSS_STYLES["timer_ready"];
                GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_css_styles",implode(css_styles));
            }
            }
            if(changedata<23){ GM_setValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_changedata",23); }
            changedata = null;
        }catch(err){GM_logError("changedata account\n"+err);}
        
        // **************************************************
    
        //Hotkeys
        err_trace="Hotkeys";
        if (GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_valHotkey",true)){
            window.addEventListener("keydown",function(event){
                if(event.keyCode==27){  // Esc
                    if(unsafeWindow.city){ top.window.wrappedJSObject.initCity(unsafeWindow.city); event.preventDefault(); }
                    else{ top.window.wrappedJSObject.showMain(); event.preventDefault(); }
                    closeInfoPanel();
                }
                if (event.altKey){
                switch (event.keyCode){
                case hotkeymap["prevPage"]: if(($top("zoneNavi"))&&($top("zoneNavi").firstElementChild)){ click($top("zoneNavi").firstElementChild); event.preventDefault();}
                        else if($top("prevPage")){ click($top("prevPage")); event.preventDefault();}
                        else if($("prevPage")){ click($("prevPage")); event.preventDefault();}
                break;
                case hotkeymap["nextPage"]: if(($top("zoneNavi"))&&($top("zoneNavi").lastChild)){ click($top("zoneNavi").lastChild); event.preventDefault();}
                        else if($top("nextPage")){ click($top("nextPage")); event.preventDefault();}
                        else if($("nextPage")){ click($("nextPage")); event.preventDefault();}
                break;
                case hotkeymap["farm1"]: top.window.wrappedJSObject.initZones(1); top.window.wrappedJSObject.showMain(); event.preventDefault(); break; // 1:Farm 1
                case hotkeymap["farm2"]: if(parseInt(top.window.wrappedJSObject.farmamount,10)>1){ top.window.wrappedJSObject.initZones(2); top.window.wrappedJSObject.showMain(); event.preventDefault(); } break; // 2:Farm 2
                case hotkeymap["farm3"]: if(parseInt(top.window.wrappedJSObject.farmamount,10)>2){ top.window.wrappedJSObject.initZones(3); top.window.wrappedJSObject.showMain(); event.preventDefault(); } break; // 3:Farm 3
                case hotkeymap["guild"]: top.window.wrappedJSObject.showMain(); top.window.wrappedJSObject.initGuild(); event.preventDefault(); break; // 4:Club
                case hotkeymap["city1"]:
                    if($top("speedlink_city1")){ click($top("speedlink_city1")); }
                    else{
                        if($top("citymaincontainer").style.display=="block"){
                            if($top("cityzone_2_3")){ click($top("cityzone_2_3")); }
                        }else{
                            click($top("mainmenue1"));
                        }
                    }
                    event.preventDefault(); break; // 5:Dorf1
                case hotkeymap["city2"]:
                    if($top("speedlink_city2")){ click($top("speedlink_city2")); }
                    else{
                        if($top("citymaincontainer").style.display=="block"){
                            if($top("cityzone_1_9")){ click($top("cityzone_1_9")); }
                        }else{
                            click($top("mainmenue1"));
                            var gotocitytimeout=window.setInterval(function(){
                                if($top("cityzone_1_9")){
                                    click($top("cityzone_1_9"));
                                    clearTimeout(gotocitytimeout);
                                }
                            },200);
                        }
                    }
                    event.preventDefault(); break; // 6:Dorf2
                case hotkeymap["farmilog"]: click($top("customerstats")); event.preventDefault(); break; // F:FarmiLog
                case hotkeymap["help"]: click($top("mainmenue5")); event.preventDefault(); break; // H:Hilfe
                case hotkeymap["market"]: showMarket(); event.preventDefault(); break; // M:Markt
                case hotkeymap["marketstand"]: showMarketStall(); event.preventDefault(); break; // ,:Marktstand
                case hotkeymap["messages"]: click($top("mainmenue2")); event.preventDefault(); break; // N:Nachrichten
                case hotkeymap["options"]: click($top("berateroptionen")); event.preventDefault(); break; // O:Optionen
                case hotkeymap["profit"]: click($top("profitcalc")); event.preventDefault(); break; // P:Profit
                case hotkeymap["sgh"]: showSGH(); event.preventDefault(); break; // S:SGH
                case hotkeymap["overview"]: click($top("titlepig")); event.preventDefault(); break; // U:Uebersicht
                case hotkeymap["contract"]: click($top("mainmenue3")); event.preventDefault(); break; // V:Vertrag
                case hotkeymap["systemmessage"]: if (GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_nachrichten_doread","")){
                            var help=explode(GM_getValue(COUNTRY+"_"+SERVER+"_"+USERNAME+"_nachrichten_doread","[]"),"eventListener@keydown/nachrichten_doread",[]);
                            showMessage("system","1",help[help.length-1],0);
                        }else{
                            showMultiframePage("nachrichten/system.php");
                        } event.preventDefault(); break; // X:next Message/Systemmessages
                }
                }
            },false);
        }
    
        err_trace="Page switch";
        if(DEVMODE){ GM_log("loading page:"+PAGE); }
        switch (PAGE){
            case "stadt/shop":          do_shop();break;
            case "stadt/stats":         do_stats();break;
            case "stadt/wettbewerb":    do_wettbewerb();break;
            case "main":                do_main();break;
            case "vertraege/new":       do_multiframe();do_vertraege_head();do_vertraege_new();break;
            case "vertraege/overview":  do_multiframe();do_vertraege_head();do_vertraege_overview();break;
            case "vertraege/show":      do_multiframe();do_vertraege_head();do_vertraege_show();break;
            case "nutzer/profil":       do_multiframe();break;
            case "nutzer/usecoins":     do_multiframe();break;
            case "hilfe":               do_multiframe();do_hilfe();break;
            case "login":               do_login();break;
        }
    }else{
        do_login();
    }
    window.setTimeout(function(){
        unsafeData.beraterDone=true;
        raiseEvent("beraterDone");
    },100);
}
}catch(err){ GM_logError("startScript ("+err_trace+")\npage="+location.href+"\n"+err); }
}
function initScript(time){
try{
    var div;
    if((document.readyState=="complete")||(document.readyState=="loaded")){
        if((self==top)&&(div=$("bubbleBeraterNotLoaded"))){
            removeElement(div);
        }
        startScript();
    }else{
        if(time>0){
            if(self==top){
                div=$("bubbleBeraterNotLoaded");
                if(!div){
                    div=createElement("div",{"id":"bubbleBeraterNotLoaded","style":"position:absolute;top:0;left:0;width:340px;padding:30px;background-color:yellow;border:3px solid black;border-radius:10px;z-index:1000;font-family:Verdana,sans-serif;color:#000000;font-size:12pt;font-weight:bold;"},document.getElementsByTagName("body")[0]);
                }
                div.innerHTML = "Page '"+location.href+"' is not completely loaded.<br><br>Reload in "+time+"sec.";
            }
            window.setTimeout(function(){ initScript(--time); },1000);
        }else{
            location.href=location.href;
        }
    }
}catch(err){GM_logError("initScript\n"+err);}
}
initScript(20);