/* * @project: TERA * @version: Development (beta) * @license: MIT (not for evil) * @copyright: Yuriy Ivanov (Vtools) 2017-2019 [progr76@gmail.com] * Web: https://terafoundation.org * Twitter: https://twitter.com/terafoundation * Telegram: https://t.me/terafoundation */ var SaveIdArr = ["idAccount", "idTo", "idSumSend", "idDescription", "idCurTabName", "idViewBlockNum", "idViewAccountNum", "idViewDappNum", "idLang"]; var CONFIG_DATA = { PRICE_DAO: { NewAccount: 10 }, MaxNumBlockDB: 0, MaxAccID: 0, MaxDappsID: 0 }; var CountViewRows = 20; var DefAccounts = { BlockName: "idPaginationAccount", NumName: "idViewAccountNum", TabName: "explorer_accounts", APIName: "GetAccountList" }; var DefBlock = { BlockName: "idPaginationBlock", NumName: "idViewBlockNum", TabName: "explorer_blocks", APIName: "GetBlockList" }; var DefDapps = { BlockName: "idPaginationDapps", NumName: "idViewDappNum", TabName: "dapps_list", APIName: "GetDappList", CountViewRows: 10, FilterName: "idCategory" }; function SetImg() { }; var CONNECT_STATUS = 0; var NotModalClose = 0; window.onload = function() { InitAccountsCard(); DoLangScript(); InitWalletKeyName(); if (Storage.getItem("NETWORK") || IsLocalClient()) { OnLoad(); } else { GetData("/GetCurrentInfo", {}, function(Data) { if (Data && Data.result) { Storage.setItem("NETWORK", Data.NETWORK); console.log("Default network: " + Data.NETWORK); OnLoad(); } }); } var HasPassword = IsLockedWallet(); if (HasPassword) { NotModalClose = 1; openModal('password-modal-enter'); } else { OpenWalletKey(); } SetUsePassword(HasPassword); window.onkeydown = function(e) { if (e.keyCode === 27) { if (IsVisibleBlock("overlay")) closeModal(); } }; $("idAccountsList").addEventListener("click", MyToggleList); }; function OnLoad() { if (Storage.getItem("NETWORK")) { NETWORK = Storage.getItem("NETWORK"); } $("idCurNetwork").value = NETWORK; LoadValues(); InitDappsCard(); StartWebWallet(); UpdatesExplorerData(); UpdatesAccountsData(); setInterval(UpdatesExplorerData, 1000); setInterval(UpdatesAccountsData, 1000); DoStableScroll(); window.onmousemove = function(event) { SetDiagramMouseX(event); }; if (window.location.hash) { var LocationPath = window.location.hash.substr(1); if (LocationPath) { SelectTab(LocationPath); } } }; function ChangeNetwork() { CONNECT_STATUS = 0; NETWORK = $("idCurNetwork").value; Storage.setItem("NETWORK", NETWORK); StartWebWallet(); UpdatesExplorerData(); UpdatesAccountsData(); }; function OnFindServer() { if (!MainServer) { CONNECT_STATUS = - 1; SetStatus("Server not found"); Storage.setItem("MainServer", undefined); return; } CONNECT_STATUS = 2; Storage.setItem("MainServer", JSON.stringify({ ip: MainServer.ip, port: MainServer.port })); FillCurrencyAsync("idAccountCur"); }; function LoadValues() { var StrDelList = localStorage["DelList"]; if (StrDelList) DelList = JSON.parse(StrDelList); if (LoadValuesByArr(SaveIdArr)) { ChangeLang(); } InitPrivKey(); }; function SaveValues() { SaveValuesByArr(SaveIdArr); localStorage["DelList"] = JSON.stringify(DelList); }; var TabArr = [{ name: "TabWelcome" }, { name: "TabWalletSet" }, { name: "TabKeySet" }, { name: "TabAccounts" }, { name: "TabSend" }, { name: "TabDapps" }, { name: "TabExplorer" }, { name: "TabLogo" }]; function SelectTab(name) { SetStatus(""); $("idCurTabName").value = name; SetVisibleTab(); SaveValues(); OnSelectTab(name); if (name && history.pushState) history.pushState(null, null, "#" + name); }; function OnSelectTab(name) { if (!GetPrivKey()) { GenerateKeyNew(); SetPrivKey($("idPrivKeyEdit").value.trim()); InitPrivKey(); } if (name === "TabDapps") { ViewDapps(); } }; function SetVisibleTab() { var CurTabName = $("idCurTabName").value; if (!CurTabName || CurTabName === "undefined") CurTabName = TabArr[0].name; var str; for (var i = 0; i < TabArr.length; i++) { var name = TabArr[i].name; var Item = $(name); if (!Item) continue; if (CurTabName === name) { Item.style.display = 'block'; str = "active"; } else { Item.style.display = 'none'; str = ""; } var ItemM = $("M" + name); if (ItemM) { if (str) { ItemM.classList.add(str); } else { ItemM.classList.remove("active"); } } } }; function IsPrivateMode() { var PrivKeyStr = GetPrivKey(); if (PrivKeyStr && PrivKeyStr.length === 64) return 1; else return 0; }; function SetVisiblePrivKey() { if (bShowPrivKey) $("idPrivKeyStatic").innerText = GetPrivKey(); else $("idPrivKeyStatic").innerText = "••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••"; }; var bShowPrivKey = 0; function OnVisiblePrivKey() { bShowPrivKey = !bShowPrivKey; SetVisiblePrivKey(); }; function SetPubKeyHTML() { $("idPubKeyStatic").innerText = GetPubKey(); }; function GenerateKeyNew() { var arr = new Uint8Array(32); window.crypto.getRandomValues(arr); var Str = GetHexFromArr(sha3(arr)); $("idPrivKeyEdit").value = Str; }; function OnGenerateKeyNew() { GenerateKeyNew(); }; function OnEditPrivKey() { }; function OnPrivKeyOK() { SetPrivKey($("idPrivKeyEdit").value.trim()); InitPrivKey(); SelectTab('TabKeySet'); ClearSend(); }; function OnPrivKeyCancel() { InitPrivKey(); SelectTab('TabKeySet'); }; var FirstAccountsData = 1; var AccountsCount = - 1; function UpdatesAccountsData() { if (IsVisibleClass(".accounts-info__add")) return; if (!CONNECT_STATUS) return; var Str = GetPubKey(); if (!Str) { return; } GetData("/GetAccountListByKey", { Key: Str, AllData: FirstAccountsData }, function(Data, responseText) { if (!Data || !Data.result || !Data.arr) return; if (AccountsCount === Data.arr.length) { if (IsVisibleClass(".accounts-info__add2")) return; } AccountsCount = Data.arr.length; SetVisibleClass(".accounts-info__acc-list", AccountsCount); SetVisibleClass(".accounts-info__empty", !AccountsCount); SetVisibleClass(".accounts-info__add2", 0); if (AccountsCount) { SetAccountsCard(Data, responseText); } else { if (FirstAccountsData && !Data.arr.length) { SelectTab('TabAccounts'); } } FirstAccountsData = 0; }); }; function ViewAddAccount(Visible) { SetVisibleClass(".accounts-info__add", Visible); SetVisibleClass(".accounts-info__acc-list", !Visible); SetVisibleClass(".accounts-info__empty", 0); }; function OnViewAddAccount() { OnChangeAccName(); ViewAddAccount(1); $("idAccountName").focus(); }; function CancelAddAccount() { ViewAddAccount(0); }; function OnChangeAccName() { $("idBtAddAccount").disabled = !($("idAccountName").value.length); }; function CancelCreateAccount() { }; function OnAddAccount() { var Name = $("idAccountName").value; if (!Name) { SetError("Enter the account name"); return; } var Smart = 0; var Currency = ParseNum($("idAccountCur").value); SetStatus("Calculate Tx, wait pls ..."); SendTrCreateAccWait(Currency, GetPubKey(), Name, Smart); SetVisibleClass(".accounts-info__add", 0); SetVisibleClass(".accounts-info__add2", 1); }; var WasAccountsDataStr; var StrAccCardTemplate; function InitAccountsCard() { if ($("AccCardTemplate")) { StrAccCardTemplate = $("AccCardTemplate").outerHTML; $("AccCardTemplate").outerHTML = ""; } }; function SetAccountsCard(Data, AccountsDataStr) { if (!Data || !Data.result) { return; } if (AccountsDataStr === WasAccountsDataStr) return; WasAccountsDataStr = AccountsDataStr; var arr = []; for (var i = 0; Data.arr && i < Data.arr.length; i++) { var Item = Data.arr[i]; if (!DelList[Item.Num]) { arr.push(Item); } } var Select = $("idAccount"); if (arr.length !== Select.options.length) { var options = Select.options; options.length = arr.length; } MaxBlockNum = GetCurrentBlockNumByTime(); $("idListCount").innerText = arr.length; var StrList = ""; var ListTotal = {}; for (var i = 0; arr && i < arr.length; i++) { var Item = arr[i]; Item.MyAccount = true; var Num = ParseNum(Item.Num); if (!MapAccounts[Num]) MapAccounts[Num] = {}; CopyObjKeys(MapAccounts[Num], Item); var option = Select.options[i]; var StrText = GetAccountText(Item, Num, 1); if (option.text !== StrText) CheckNameAccTo(); option.value = Num; option.text = StrText; var Str = StrAccCardTemplate; Str = Str.replace("AccCardTemplate", "idCard" + Item.Num); Str = Str.replace(/{Item.Num}/g, Item.Num); Str = Str.replace("{Value.SumCOIN}", Item.Value.SumCOIN); Str = Str.replace("{Value.SumCENT}", Item.Value.SumCENT); Str = Str.replace("{Value.CurrencyName}", CurrencyName(Item.Currency)); var CurrencyObj = Item.CurrencyObj; if (!CurrencyObj) CurrencyObj = { IconBlockNum: 0, Num: 0 }; Str = Str.replace("{Value.CurrencyIconPath}", RetIconPath(CurrencyObj, 1)); var CurrencyPath = RetIconPath(CurrencyObj); if (CurrencyPath.substr(0, 6) !== "/file/") Str = Str.replace("prod-card__currency--with-dot", ""); Str = Str.replace("{Item.Name}", escapeHtml(Item.Name)); var SmartObj = Item.SmartObj; if (!SmartObj) SmartObj = { Name: "", Num: 0 }; SmartObj.IconPath = RetIconPath(SmartObj, 0); Str = Str.replace("{SmartObj.IconPath}", SmartObj.IconPath); Str = Str.replace("{SmartObj.Name}", escapeHtml(SmartObj.Name)); Str = Str.replace(/{SmartObj.Num}/g, SmartObj.Num); if (SmartObj.Num) { Str = Str.replace("prod-card__link--connect", "myhidden"); } else { Str = Str.replace("prod-card__link--dapp", "myhidden"); Str = Str.replace("prod-card__dropdown", "prod-card__dropdown nodapp"); } StrList += Str; Str = ""; var Total = ListTotal[Item.Currency]; if (!Total) { Total = { SumCOIN: 0, SumCENT: 0, Name: CurrencyName(Item.Currency) }; ListTotal[Item.Currency] = Total; } ADD(Total, Item.Value); } $("idAccountsList").innerHTML = StrList; StrList = ""; var StrTotal = ""; for (var key in ListTotal) { var Total = ListTotal[key]; StrTotal += '
' + Total.Name + '
' + STRING_FROM_COIN(Total) + '
'; } $("idTotalList").innerHTML = StrTotal; var CurentValue = LoadMapAfter["idAccount"]; if (CurentValue) { Select.value = CurentValue; delete LoadMapAfter["idAccount"]; } }; function ConnectSmart(NumAccount) { ChangeSmart(NumAccount, 0); }; function SetSmart(NumAccount, WasSmart) { ChangeSmart(NumAccount, WasSmart); }; function DelSmart(NumAccount, WasSmart) { SetSmartToAccount(NumAccount, 0); }; function DelAccount(NumAccount) { DelList[NumAccount] = 1; AccountsCount = 0; WasAccountsDataStr = ""; SaveValues(); }; function RestoreAllAccounts() { DelList = {}; DelAccount(0); }; function UpdatesExplorerData() { var WasSendTr = 0; for (var key in MapSendTransaction) { var Item = MapSendTransaction[key]; if (!Item.WasProcess && !Item.final) { WasSendTr = 1; break; } } GetData("GetCurrentInfo", { Diagram: IsVisibleBlock("idStatBlock") ? 1 : 0, ArrLog: WasSendTr }, function(Data) { if (!Data || !Data.result) return; SetExplorerData(Data); SetBlockChainConstant(Data); var arr = Data.arr; for (var i = 0; arr && i < arr.length; i++) { var ItemServer = arr[i]; var ItemClient = DiagramMap[ItemServer.name]; if (!ItemClient || ItemClient.Extern) continue; ItemClient.arr = ItemServer.arr; ItemClient.AvgValue = ItemServer.AvgValue; ItemClient.steptime = ItemServer.steptime; ItemClient.fillStyle = "white"; DrawDiagram(ItemClient); } }); }; var FirstCallDiagram = 1; function SetExplorerData(Data) { if (!Data || !Data.result) return; CONFIG_DATA = Data; window.FIRST_TIME_BLOCK = Data.FIRST_TIME_BLOCK; if (FirstCallDiagram) { ViewEnd(DefAccounts, CONFIG_DATA.MaxAccID, 1); ViewEnd(DefBlock, CONFIG_DATA.MaxNumBlockDB, 1); InitDiagram(); } FirstCallDiagram = 0; var StrVersion = " 0." + Data.VersionNum; $("idBHeight").innerText = Data.MaxNumBlockDB; $("idBCurrent").innerText = Data.CurBlockNum; $("idBVersion").innerText = StrVersion; SetArrLog(Data.ArrLog); }; function SetArrLog(arr) { if (!arr) return; for (var i = 0; i < arr.length; i++) { var Item = arr[i]; if (!Item.final) continue; var TR = MapSendTransaction[Item.key]; if (TR && !TR.WasProcess && Item.final) { TR.WasProcess = 1; SetStatus(Item.text); if (Item.text.indexOf("Add to blockchain") >= 0) { if (TR.Run) { TR.Run(TR); TR.Run = undefined; } } var Account = MapCheckTransaction[Item.key]; if (Account) { delete MapCheckTransaction[Item.key]; Account.NextSendTime = 0; } } } CheckSending(); }; var DiagramArr = [{ name: "MAX:ALL_NODES", text: "All nodes count", value: 0, red: "#1d506b", MouseText: " nodes" }, { name: "MAX:HASH_RATE_B", text: "HashRate, Tera hash/s", value: 0, red: "#286b16", MathPow: 2, MathDiv: 1024 * 1024 * 1024 * 1024, KPrecision: 10, NoTextMax: 1, MouseText: " T h/s" },]; function InitDiagram() { InitDiagramByArr(DiagramArr, 1120); }; function ViewCounters(This) { var BlockName = "idStatBlock"; var element = $(BlockName); var bVisible = IsVisibleBlock(BlockName); if (!bVisible) MoveUp(element); SetVisibleBlock(BlockName, !bVisible); var ResVisible = IsVisibleBlock(BlockName); if (This && This.className) { This.className = This.className.replace("btpress", ""); if (ResVisible) This.className += " btpress"; } }; setInterval(CheckSending, 1000); function OpenAddressBook() { return; var bVisible = IsVisibleBlock("idAddressBook"); SetVisibleBlock("idAddressBook", !bVisible); }; function CloaseAddressBook() { OpenAddressBook(); }; function ClearSend() { $("idAccount").value = ""; $("idTo").value = ""; $("idSumSend").value = ""; $("idDescription").value = ""; $("idNameTo2").innerText = ""; }; function downloadKey(fieldID) { var text = document.getElementById(fieldID).value; var blob = new Blob([text], { type: "text/plain" }); var anchor = document.createElement("a"); anchor.download = "tera-key.txt"; anchor.href = window.URL.createObjectURL(blob); anchor.target = "_blank"; anchor.style.display = "none"; document.body.appendChild(anchor); anchor.click(); document.body.removeChild(anchor); }; function openModal(id) { var modal = document.querySelector("#" + id); var overlay = document.querySelector("#overlay"); modal.style.display = "block"; overlay.style.display = "block"; }; function closeModal() { if (NotModalClose) return; var modals = document.querySelectorAll(".modal"); var overlay = document.querySelector("#overlay"); modals.forEach(function(item) { item.style.display = "none"; }); overlay.style.display = "none"; }; function showMenu(Num) { var menu = document.querySelector("#idBt" + Num); if (menu.style.display === "none") { menu.style.display = "block"; } else { menu.style.display = "none"; } }; function closeMenu(Num) { var menu = document.querySelector("#idBt" + Num); setTimeout(function() { menu.style.display = "none"; }, 115); }; function UploadKey(id) { var file = $(id).files[0]; var reader = new FileReader(); reader.onload = function() { if (reader.result.byteLength !== 64) SetError("Error file length (" + reader.result.byteLength + ")"); else { var view = new Uint8Array(reader.result); var Key = Utf8ArrayToStr(view); SetStatus("OK"); ToLog("Result: " + Key); SetPrivKey(Key); InitPrivKey(); $(id).value = ""; } }; reader.readAsArrayBuffer(file); }; function InitPrivKey() { $("idPrivKeyEdit").value = GetPrivKey(); SetPubKeyHTML(); SetVisiblePrivKey(); $("idSave2").disabled = !IsPrivateMode(); }; function SendMobileBefore() { if ($("idSendButton").disabled) return; var FromID = ParseNum($("idAccount").value); var Item = MapAccounts[FromID]; if (!Item) { SetError("Error FROM ID"); return; } $("idConfirmFromID").innerText = Item.Num; $("idConfirmFromName").innerText = Item.Name + " (" + STRING_FROM_COIN(Item.Value) + " " + CurrencyNameItem(Item) + ")"; var ToID = ParseNum($("idTo").value); var Item2 = MapAccounts[ToID]; if (!Item2) { SetError("Error TO ID"); return; } $("idConfirmToID").innerText = Item2.Num; $("idConfirmToName").innerText = Item2.Name + " (" + STRING_FROM_COIN(Item2.Value) + " " + CurrencyNameItem(Item2) + ")"; var CoinAmount = COIN_FROM_FLOAT($("idSumSend").value); $("idConfirmAmount").innerText = STRING_FROM_COIN(CoinAmount); $("idConfirmCurrency").innerText = CurrencyNameItem(Item); $("idConfirmDescription").innerText = $("idDescription").value; SetVisibleClass(".send-page__setting", 0); SetVisibleClass(".send-page__confirm", 1); SetStatus(""); }; function OKSend() { SendMoney(); $("idSumSend").value = 0; CancelSend(); }; function CancelSend() { SetVisibleClass(".send-page__setting", 1); SetVisibleClass(".send-page__confirm", 0); }; function SetNewPassword() { var Str1 = $("Password1").value.trim(); var Str2 = $("Password2").value.trim(); if (Str1 !== Str2) { SetError("Wrong passwords"); return; } var Key = GetPrivKey(); SetWalletPassword(Str1); SetPrivKey(Key); SetPubKeyHTML(); closeModal(); $("Password1").value = ""; $("Password2").value = ""; if (Str1) SetStatus("Password changed successfully"); else SetStatus("Password has been reset successfully"); SetUsePassword(Str1); }; var MultipleMode = 0; function MyOpenWallet(bCheck) { var Str = $("Password").value.trim(); if (!Str) { SetError("Type password, pls"); return; } $("Password").value = ""; if (Str.substr(0, 11) === "--subwallet") { Str = Str.substr(11); if (Str === " off") { Storage.setItem("USESUBWALLET", 0); SetStatus("Set off subwallet mode"); } else { Storage.setItem("USESUBWALLET", 1); SetStatus("Set subwallet mode"); } SetUsePassword(1); return; } if (Str === "--reset") { SetWalletPassword(""); OpenWalletKey(); SetUsePassword(0); NotModalClose = 0; closeModal(); return; } SetWalletPassword(Str); OpenWalletKey(); SetStatus(""); if (bCheck) { var WasPubKey = Storage.getItem("WALLET_PUB_KEY_MAIN"); var PrivKey = GetArrFromHex(GetPrivKey()); var TestPubKey = GetHexFromArr(SignLib.publicKeyCreate(PrivKey, 1)); if (WasPubKey !== TestPubKey) { SetWalletPassword(""); SetError("Wrong password"); return; } SetStatus("Password ok"); MultipleMode = 0; SetVisibleBlock("idKeyEdit", 1); SetVisibleBlock("idLoad2", 1); SetVisibleBlock("idPasswordEdit", 1); } else { MultipleMode = 1; SetVisibleBlock("idKeyEdit", 0); SetVisibleBlock("idLoad2", 0); SetVisibleBlock("idPasswordEdit", 0); } NotModalClose = 0; closeModal(); InitPrivKey(); SetPubKeyHTML(); SetUsePassword(1); }; function SetUsePassword(bUse) { document.documentElement.style.setProperty('--fill--password', bUse ? 'blue' : 'black'); SetVisibleBlock("idWalletExit", !!bUse); SetVisibleBlock("idEntrance", Storage.getItem("USESUBWALLET") === "1"); }; function DoExitWallet() { ClearSend(); NotModalClose = 1; $("Password").value = ""; SetWalletPassword(""); OpenWalletKey(); openModal('password-modal-enter'); }; var StrDappCardTemplate; var StrDappRowCardTemplate; var CardMapList = {}; function InitDappsCard() { if ($("DappRowCardTemplate")) { StrDappRowCardTemplate = $("DappRowCardTemplate").outerHTML; $("DappRowCardTemplate").outerHTML = ""; } if ($("DappCardTemplate")) { StrDappCardTemplate = $("DappCardTemplate").outerHTML; } }; function ViewDapps() { ViewCurrent(DefDapps); GetData("/GetDappCategory", {}, function(Data) { if (Data && Data.result && Data.arr) { var arr = Data.arr; for (var i = 0; i < arr.length; i++) { var key = arr[i]; arr[i] = { sort: MapCategory[key].toUpperCase(), text: MapCategory[key], value: key }; } arr.push({ sort: "-", text: "Choose the category", value: 0 }); FillCategoryAndSort("idCategory", arr); } }); }; function FillDappCard(Str, Item) { CardMapList[Item.Num] = Item; Str = Str.replace(/{Item.Num}/g, Item.Num); Str = Str.replace("{Item.Name}", escapeHtml(Item.Name)); Str = Str.replace("{Item.Description}", escapeHtml(Item.Description)); Str = Str.replace("{Item.Owner}", Item.Owner); if (!Item.TokenGenerate) Str = Str.replace("dapp-modal__ok-token", "myhidden"); Str = Str.replace("{Item.IconPath}", RetIconPath(Item, 0)); return Str; }; function RetDappCard(Item) { var Str = FillDappCard(StrDappRowCardTemplate, Item); Str = Str.replace("DappRowCardTemplate", "idCard" + Item.Num); return Str; }; function OpenDappCard(Num) { var Item = CardMapList[Num]; if (!Item) return; var Str = FillDappCard(StrDappCardTemplate, Item); Str = Str.replace("{Item.Account}", RetBaseAccount(Item)); Str = Str.replace("{Item.BlockNum}", RetOpenBlock(Item.BlockNum, 2)); Str = FillDappCategory(Str, Item, 1); Str = FillDappCategory(Str, Item, 2); Str = FillDappCategory(Str, Item, 3); $("DappCardTemplate").outerHTML = Str; openModal('DappCardTemplate'); }; function OpenDapp(Num) { OpenDapps(Num); closeModal(); }; function FillDappCategory(Str, Item, Num) { var Value = Item["Category" + Num]; if (Value && MapCategory[Value]) { Str = Str.replace("{Item.Category" + Num + "}", MapCategory[Value]); } else { Str = Str.replace("dappcategory" + Num, "myhidden"); } return Str; }; function MyToggleList(e) { var item = e.target; while (true) { if (!item) break; if (!item.classList) break; if (item.onclick && item.onclick !== MyToggleList) break; if (item.classList.contains("find--switch")) { if (item.classList.contains("prod-card--switch")) { item.classList.add("prod-card--active"); item.classList.add("prod-card--toggle"); item.classList.remove("prod-card--switch"); } else { item.classList.remove("prod-card--active"); item.classList.remove("prod-card--toggle"); item.classList.add("prod-card--switch"); } break; } item = item.parentNode; } }; var LangItems = []; function InitLangItems() { var tags = ["TITLE", "BUTTON", "DIV", "INPUT", "TH", "TD", "SPAN", "A", "H1", "H2", "H3", "H4", "H5", "P", "DT"]; var Map2 = {}; for (var n = 0; n < tags.length; n++) { var tagname = tags[n]; var elems = document.getElementsByTagName(tagname); for (var elem, i = 0; elem = elems[i++];) { var Text = elem.innerText; if (elem.innerHTML !== Text) continue; if (!Text) continue; if (Text.substr(0, 1) === "{") continue; if (Text.toUpperCase() == Text.toLowerCase()) continue; LangItems.push({ key: Text, elem: elem }); } } }; function DoLangItems(Map) { var Map2 = {}; for (var n = 0; n < LangItems.length; n++) { var key = LangItems[n].key; var elem = LangItems[n].elem; if (Map) { var TextNew = Map[key]; if (TextNew === undefined) { ToLog("Not found translate for key: " + key); Map[key] = key; TextNew = key; } if (elem.innerText !== TextNew) { elem.innerText = TextNew; } } else { Map2[key] = key; } } return Map2; }; function DoLangScript() { InitLangItems(); LangMap["ENG"] = DoLangItems(); FillSelect("idLang", LangMap, "KEY"); }; function ChangeLang() { var key = $("idLang").value; if (!key) { key = "ENG"; $("idLang").value = key; } DoLangItems(LangMap[key]); SaveValues(); }; function GetNewLangItem() { ToLog(JSON.stringify(LangMap["ENG"])); }; var LangMap = {}; LangMap["ENG"] = {}; LangMap["RUS"] = { "TERA WALLET": "TERA КОШЕЛЕК", "Generate key": "Сгенерировать ключ", "OK": "OK", "Cancel": "Отмена", "Edit": "Редактирование", "Save key": "Сохран.", "+ CREATE A NEW ACCOUNT": "+ СОЗДАТЬ НОВЫЙ СЧЕТ", "Create account": "Создать счет", "Send": "Отправить", "CONFIRM": "Подтверждение", "Accounts": "Счета", "Account(s)": "Счет(а,ов)", "Blocks and Tx": "Блоки и Транзакции", "Counters": "Показатели", "Open DApp": "Открыть Дапп", "Back": "Назад", "Delete": "Удалить", "Save to book": "Сохранить в книгу", "Choose": "Выбрать", "RECONNECT": "КОННЕКТ", "DApps": "ДАппс", "ID": "ИД", "Amount": "Величина", "Cur": "Вал", "Name": "Имя", "PubKey": "Пуб.ключ", "Operation": "Операция", "Smart": "Смарт", "Block Num": "Ном блока", "Num": "Ном", "Date": "Дата", "Data Hash": "Хеш данных", "PowHash": "Хеш сложности", "Block Hash": "Хеш блока", "Bytes": "Байт", "Pow": "Сложн", "Miner": "Майнер", "(secret)": "(секрет)", "Show": "Показать", "TERA": "TERA", "Blockchain height:": "Высота блокчейна:", "Current create:": "Текущий блок:", "Protocol ver:": "Версия протокола:", "ID: {Item.Num}": "ИД: {Item.Num}", "Token generate": "Генерация токенов", "ACCOUNTS": "СЧЕТА", "SEND": "ПОСЛАТЬ", "DAPPS": "ДАППС", "EXPLORER": "ПРОСМ", "ATTENTION: Before using the wallet, save the private key.": "ВНИМАНИЕ: Перед использованием кошелька сохраните приватный ключ", "Web-site": "Веб-сайт", "Bitcointalk": "Bitcointalk", "Twitter": "Твиттер", "Telegram": "Телеграм", "Discord": "Дискорд", "QQchat": "QQchat", "Buy/sell/mine TERA": "Купить/Продать", "+ CREATE NEW": "+ СОЗДАТЬ НОВЫЙ", "Confirm Transaction": "Подтверждение транзакции", "CREATE DAPPS": "СОЗДАТЬ", "Set pass": "Установить пароль", "Unlock": "Разблокировать", "Entrance to sub-wallet": "Войти в под-кошелек", "Public name": "Публичное имя", "Currency": "Валюта", "Pay to:": "Получатель:", "Amount:": "Сумма:", "Description:": "Описание:", "Welcome to TERA Wallet": "Добропожаловать в кошелек TERA", "Edit your wallet": "Редактирование вашего кошелька", "Key settings": "Задание ключей", "KEY SETTINGS": "ЗАДАНИЕ КЛЮЧЕЙ", "Create an account": "Создание счета", "Sending coins": "Отправка монет", "Decentralized applications (dApps)": "Децентрализованные приложения (Даппс)", "Secure your wallet": "Безопасность вашего кошелька", "Wallet is secured": "Установлен пароль", "Total": "Всего", "Item.Name": "Item.Name", "You have no accounts yet": "У вас нет ни одного счета", "Wait 10-15 sec": "Ждите 10-15 сек", "Creating your account": "Идет создание вашего счета", "From:": "Отправитель:", "Set a password for protect entry": "Установите пароль для безопасности", "Enter password to unlock wallet": "Введите пароль для разблокировки кошелька", "From ID:": "Отправитель:", "Pay to ID:": "Получатель:", "Account": "Счет", "Owner": "Владелец", "Block num": "Ном блока", "Private key (secret)": "Приватный ключ (секретно)", "Load key": "Загруз.", "Create your first account and start using TERA": "Создайте свой первый счет и начните использовать TERA", "0 Accounts": "0 Счетов", "OWNER: {Item.Owner}": "Владелец: {Item.Owner}", "More info": "Информация", "Public key": "Публичный ключ" }; LangMap["简体中文"] = { "TERA WALLET": "TERA 钱包", "Generate key": "生成私钥", "OK": "OK", "Cancel": "取消", "Edit": "编辑", "Save key": "保存私钥", "+ CREATE A NEW ACCOUNT": "+ 新建账号", "Create account": "创建账号", "Send": "发送", "SEND": "转账", "CONFIRM": "确认", "Accounts": "账号", "Account(s)": "账号", "Blocks and Tx": "区块和交易", "Counters": "状态统计", "Open DApp": "打开DApp", "Back": "返回", "Delete": "删除", "Save to book": "保存到地址本", "Choose": "选择", "RECONNECT": "重连", "DApps": "DApps", "ID": "ID", "Amount": "余额", "Cur": "币种", "Name": "名称", "PubKey": "公钥", "Operation": "操作次数", "Smart": "DApp", "Block Num": "区块编号", "Num": "编号", "Date": "日期", "Data Hash": "数据哈希", "PowHash": "Pow哈希", "Block Hash": "区块哈希", "Bytes": "字节", "Pow": "Pow", "Miner": "矿工", "(secret)": "(机密)", "Show": "显示", "TERA": "TERA", "Blockchain height:": "区块高度:", "Current create:": "最近区块:", "Protocol ver:": "协议版本:", "ID: {Item.Num}": "ID: {Item.Num}", "Token generate": "生成代币", "ACCOUNTS": "账号", "DAPPS": "DAPPS", "EXPLORER": "浏览器", "ATTENTION: Before using the wallet, save the private key.": "注意: 使用钱包前,务必保存好私钥。", "Web-site": "官网", "Bitcointalk": "创世贴", "Twitter": "推特", "Telegram": "电报", "Discord": "Discord", "QQchat": "QQ群", "Buy/sell/mine TERA": "TERA 交易/挖矿", "+ CREATE NEW": "+ 新建", "Confirm Transaction": "确认交易", "CREATE DAPPS": "创建DAPPS", "Set pass": "设置密码", "Unlock": "解锁", "Entrance to sub-wallet": "进入子钱包", "Public name": "名称", "Currency": "币种", "Pay to:": "收款:", "Amount:": "金额:", "Description:": "描述:", "Welcome to TERA Wallet": "欢迎使用TERA钱包", "Edit your wallet": "编辑钱包", "Key settings": "设置私钥", "KEY SETTINGS": "设置私钥", "Create an account": "创建账号", "Sending coins": "转账", "Decentralized applications (dApps)": "去中心化应用 (DApps)", "Secure your wallet": "设置钱包密码", "Wallet is secured": "钱包密码已设置", "Total": "总计", "Item.Name": "Item.Name", "You have no accounts yet": "你还没有账号", "Wait 10-15 sec": "等待10-15秒", "Creating your account": "创建你的账号", "From:": "付款:", "Set a password for protect entry": "设置密码保护钱包", "Enter password to unlock wallet": "输入密码解锁钱包", "From ID:": "付款ID:", "Pay to ID:": "收款ID:", "Account": "账号", "Owner": "拥有者", "Block num": "区块编号", "Private key (secret)": "私钥 (机密)", "Load key": "载入私钥", "Create your first account and start using TERA": "创建你的第一个账号,开启TERA之旅", "0 Accounts": "0 账号", "OWNER: {Item.Owner}": "拥有者: {Item.Owner}", "More info": "详情", "Public key": "公钥" };