1
0
Fork 0
tera/Source/HTML/web-wallet.html

1430 lines
46 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>TERA Light</title>
<link rel="shortcut icon" href="./tera.ico" type="image/vnd.microsoft.icon">
<link rel="stylesheet" type="text/css" href="./CSS/wallet.css">
<script type="text/javascript" src="./JS/coinlib.js"></script>
<script type="text/javascript" src="./JS/client.js"></script>
<script type="text/javascript" src="./JS/sha3.js"></script>
<script type="text/javascript" src="./JS/crypto-client.js"></script>
<script type="text/javascript" src="./JS/terahashlib.js"></script>
<script type="text/javascript" src="./JS/wallet-web.js"></script>
<script type="text/javascript" src="./JS/wallet-lib.js"></script>
<script type="text/javascript" src="./JS/diagram.js"></script>
<!--<script type="text/javascript" src="./JS/sign-lib-min.js"></script>-->
<script>
// window.WEBWALLET=1;
var PubKeyStr;
var NumAccountList=0;
//Pagination
var SaveIdArr=["idAccount","idTo","idSumSend","idDescription","idCurTabName","idPubKey","idPrivKey","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};
function SetImg() {};
window.onload=function()
{
LoadSignLib();
DoLangScript();
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();
}
});
}
}
function OnLoad()
{
if(Storage.getItem("NETWORK"))
NETWORK=Storage.getItem("NETWORK");
LoadValues();
StartWebWallet();
UpdatesExplorerData();
UpdatesAccountsData();
setInterval(UpdatesExplorerData,1000);
setInterval(UpdatesAccountsData,1000);
DoStableScroll();
setTimeout(SetVisibleItemsKeys,500);
//COMMON MOUSE MOVING
window.onmousemove = function(event)
{
SetDiagramMouseX(event);
}
if(window.location.hash)
{
var LocationPath=window.location.hash.substr(1);
if(LocationPath)
{
SelectTab(LocationPath);
}
}
}
function ChangeNetwork()
{
if(NETWORK==="TERA-TEST2")
{
NETWORK="TERA-MAIN";
}
else
{
NETWORK="TERA-TEST2";
}
Storage.setItem("NETWORK",NETWORK);
StartWebWallet();
UpdatesExplorerData();
UpdatesAccountsData();
}
function OnFindServer()
{
if(!MainServer)
{
SetStatus("Server not found");
Storage.setItem("MainServer",undefined);
return;
}
Storage.setItem("MainServer",JSON.stringify(MainServer));//for use in dapp
//currency fill
FillCurrencyAsync("idAccountCur");
}
function LoadValues()
{
if(LoadValuesByArr(SaveIdArr))
{
ChangeLang();
}
}
function SaveValues()
{
SaveValuesByArr(SaveIdArr);
}
function ViewDapps()
{
ViewCurrent(DefDapps);
}
</script>
<script>
//TAB TAB
var TabArr=[{name:"TabAccounts"},{name:"TabSend"},{name:"TabDapps"}, {name:"TabExplorer"},{name:"TabLogo"}];
function SelectTab(name)
{
SetStatus("");
$("idCurTabName").value=name;
SetVisibleTab();
SaveValues();
OnSelectTab(name);
if(history.pushState)
history.pushState(null,null,"#"+name);
}
function OnSelectTab(name)
{
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="current bttab"
}
else
{
Item.style.display = 'none';
str="bttab"
}
var ItemM=$("M"+name);
if(ItemM)
{
ItemM.className=str;
}
}
}
</script>
<script>
//CONFIG
var FirstAccountsData=1;
function UpdatesAccountsData()
{
GetData("/GetAccountListByKey",{Key:$("idPubKey").value,AllData:FirstAccountsData}, function (Data,responseText)
{
if(!Data || !Data.result)
return;
FirstAccountsData=0;
NumAccountList=Data.NumAccountList;
SetAccountsData(Data,responseText);
});
}
function IsPrivateMode()
{
var PrivKeyStr=$("idPrivKey").value;
if(PrivKeyStr && PrivKeyStr.length===64)
return 1;
else
return 0;
}
function SetVisibleItemsKeys(EditFlag,bOpenEdit)
{
if(bOpenEdit)
{
$("idPrivKeyEdit").value=$("idPrivKey").value;
}
SetPubKey(EditFlag);
var StrNo="none",StrYes="table-row";
SetVisibleBlock("WalRow1",!EditFlag?StrYes:StrNo);
SetVisibleBlock("WalRow2",EditFlag?StrYes:StrNo);
if($("idShowPubKey").checked)
SetVisibleBlock("WalRow3",EditFlag?StrYes:StrNo);
else
SetVisibleBlock("WalRow3","none");
SetVisibleBlock("WalRow4",EditFlag?StrYes:StrNo);
if(!EditFlag)
{
var Str;
if(!$("idPrivKey").value)
{
if($("idPubKey").value)
Str="Wallet in read mode. Using Public key.";
else
Str="Key not set. Pls, press edit and generate key ->";
}
else
{
Str="OK. Using Private key.";
}
$("idPrivKeyButton").innerHTML=toStaticHTML(Str);
}
if(EditFlag)
{
$("idPrivKeyEdit").focus();
}
}
function SetPubKey(EditFlag)
{
var StrPrivKey;
if(EditFlag)
StrPrivKey=$("idPrivKeyEdit").value.trim();
else
StrPrivKey=$("idPrivKey").value.trim();
if(IsHexStr(StrPrivKey))
{
if(StrPrivKey.length===64)
{
var PrivKey=GetArrFromHex(StrPrivKey);
$("idPubKey").value=GetHexFromArr(SignLib.publicKeyCreate(PrivKey,1));
}
else
{
$("idPubKey").value=StrPrivKey;
}
}
else
{
$("idPubKey").value="";
}
}
function OnPrivKeyNew()
{
var arr = new Uint8Array(32);
window.crypto.getRandomValues(arr);
var Str=GetHexFromArr(sha3(arr));
$("idPrivKeyEdit").value=Str;
SetPubKey(1);
}
function OnPrivKeyOK()
{
$("idPrivKey").value=$("idPrivKeyEdit").value;
SetVisibleItemsKeys(0);
SaveValues();
}
function OpenWallet()
{
if($("idPrivKey").value)
return;
}
//Accounts
function ViewNewAccount()
{
SetVisibleBlock("idAccountEdit",1);
$("idAccountName").focus();
}
function OnSetAccount(FlagOK)
{
if(FlagOK)
{
if(!$("idPrivKey").value)
{
OnPrivKeyNew();
OnPrivKeyOK();
}
var Name=$("idAccountName").value;
var Smart=0;
var Currency=ParseNum($("idAccountCur").value);
if(!Name)
{
SetError("Enter the account name.");
return;
}
SetStatus("Calculate Tx, wait pls ...");
SendTrCreateAccWait(Currency,$("idPubKey").value,Name,Smart);
}
SetVisibleBlock("idAccountEdit",0)
}
function CancelCreateAccount()
{
SetVisibleBlock("idAccountEdit",0)
}
</script>
<script>
//EXPLORER
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;
var Str="Blockchain height: <B>"+Data.MaxNumBlockDB+"</B> Current create: <B>"+Data.CurBlockNum+"</B> Wallet ver:"+"<B>"+StrVersion+"</B>";
$("idCurrentBlockNum").innerHTML=toStaticHTML(Str);
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();
}
</script>
<script>
//Diagrams
var DiagramArr=
[
{name:"MAX:ALL_NODES",text:"All nodes count",value:0,red:"#1d506b"},
{name:"MAX:HASH_RATE_G",text:"HashRate Gh/s",value:0,red:"#286b16"},
];
function InitDiagram()
{
InitDiagramByArr(DiagramArr,800);
}
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";
}
}
</script>
<script>
//SEND
setInterval(CheckSending,1000);
function OpenAddressBook()
{
return;
var bVisible=IsVisibleBlock("idAddressBook");
SetVisibleBlock("idAddressBook",!bVisible);
}
function CloaseAddressBook()
{
OpenAddressBook();
}
</script>
<script>
//LANG
var LangItems=[];
function InitLangItems()
{
var tags=["TITLE","BUTTON","DIV","INPUT","TH","TD","SPAN"];
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 && tagname!=="BUTTON")
continue;
if(!Text)
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);
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();
}
</script>
<style>
/*TAB TAB*/
#TabHeader th
{
color: white;
background-color: #22547f;
margin: 0;
padding: 0;
height: 24px;
}
.bttab
{
background-color: #2b372d;
vertical-align: middle;
cursor: pointer;
color: white;
width: 100%;
margin: 0;
padding-top: 7px;
height: 24px;
border: 1px solid white;
}
.bttab:hover
{
color: #ff9749;
}
.current
{
background-color: #4b5e4d;
color:#ff9749;
}
#TabHeader th
{
width: 200px;
}
</style>
<style>
body
{
background-color: #fffefe;
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
font-size: 13px;
line-height: 1.42857143;
}
.DIAGRAM
{
border-radius: 6px;
width: 800px;
}
table
{
border-collapse: collapse;
width:100%;
max-width: 800px;
margin: 10px;
}
.grid th, .grid td
{
border: 1px solid #777678;
padding: 4px;
}
.grid td
{
width: 60px;
vertical-align:top;
}
button
{
font-family: monospace;
}
button:hover
{
filter: brightness(120%);
cursor: pointer;
}
.openblock
{
padding: 2px;
filter: brightness(120%);
}
.btview
{
background-color: #afb0b7;
border: 1px solid #000;
height: 120px;
width: 150px;
padding-top: 0px;
cursor: pointer;
font-size: large;
}
.btview:hover
{
color: #cb7043;
filter:none;
}
.btpress, .btpress:hover
{
border: 2px solid #000;
color: #9c5335;
filter:none;
}
.btnav
{
font-family: monospace;
height: 32px;
}
.pag_num
{
border-radius: 4px;
height: 26px;
margin: 2px;
}
td
{
font-size: small;
}
td.num
{
text-align: right;
width: 50px;
}
td.sum
{
text-align: right;
font-family: "courier new", "times new roman", monospace;
min-width: 150px;
max-width: 150px;
}
td.cur
{
min-width: 80px;
max-width: 80px;
}
td.date
{
text-align: left;
width: 90px;
min-width: 90px;
font-size: small;
}
td.hash
{
max-width: 113px;
min-width: 113px;
font-family: "courier new", "times new roman", monospace;
font-size: 60%;
align-content: left;
text-align: left;
word-break: break-all;
}
td.pubkey
{
min-width: 195px;
max-width: 195px;
}
.accname
{
width: 180px;
min-width: 140px;
align-content: left;
text-align: left;
word-break: break-all;
}
.dappname
{
width: 140px;
min-width: 140px;
align-content: left;
text-align: left;
word-break: break-all;
}
td.dappdesc
{
width: 180px;
min-width: 180px;
word-break: normal;
}
#idCurrentBlockNum
{
margin: 10px;
height: 20px;
}
.delete
{
position: absolute;
display: none;
}
#idCategory
{
margin: 5px;
}
#idPrivKeyButton, #idPrivKeyEdit, #idPubKey
{
width: 100%;
border: 1px solid #1a2ec1;
background-color: white;
font-family: monospace;
padding: 5px;
}
#idPrivKeyEdit
{
color: darkgreen;
font-weight: 600;
}
#idKeys td:first-child
{
width: 80px;
}
#idKeys td:nth-child(2)
{
width: 520px;
}
#idKeys td:nth-child(3)
{
align-content: left;
text-align: left;
}
.btkey
{
width: 60px;
padding: 5px;
}
.bigs
{
padding: 5px;
}
#idStatus
{
top:0px;
left:10px;
text-align: left;
width:620px;
height: 20px;
color:blue;
}
#idNetwork
{
top:0px;
right:10px;
text-align: center;
width:100px;
height: 20px;
color: #286798;
padding-right: 5px;
}
.logo
{
top:0%;
left:0;
}
.abook
{
width: 26px;
height: 26px;
padding: 0 0 0 10px;
margin: 0 0 -10px;
cursor: pointer;
}
#idAddressBook
{
z-index:100;
position:absolute;
height:200px;
width:300px;
top:150px;
left:0;
transform: translateX(50vw) translateX(-320px);
background: #f1ffda;
color: black;
text-align: left;
border: 1px solid #782019;
border-radius: 5px;
box-shadow: 0 0 0 1px darkgrey;
}
</style>
</head>
<body>
<DIV align='center'>
<DIV align='left' style="min-width:600px;max-width:800px;height: 97vh; border: 0px solid #bfc1c0;">
<INPUT id="idCurTabName" value="TabInfo" style="display: none">
<table id="TabHeader">
<tr>
<th><DIV id="MTabAccounts" onclick="SelectTab('TabAccounts')" class="bttab">ACCOUNTS</DIV></th>
<th><DIV id="MTabSend" onclick="SelectTab('TabSend')" class="bttab">SEND</DIV></th>
<th><DIV id="MTabDapps" onclick="SelectTab('TabDapps')" class="bttab">DAPPS</DIV></th>
<th><DIV id="MTabExplorer" onclick="SelectTab('TabExplorer')" class="bttab">EXPLORER</DIV></th>
</tr>
</table>
<table>
<tr>
<td><DIV id="idStatus">&nbsp;</DIV></td>
<td>
<select size="1" id="idLang" onchange="ChangeLang()" class="bigs" style="width: 70px;height: 24px;padding: 0">
<option value="ENG">ENG</option>
</select>
</td>
<td><button id="idNetwork" style="height: 24px;" onclick="ChangeNetwork()"></button></td>
</tr>
</table>
<DIV id="TabLogo" style="display: block;">
<DIV align='center' style="width: 800px;">
<svg version = "1.1" class="logo" height = "480px" width = "480px">
<path transform="scale(2)" d="m116.5,2.58c0,0 114.5,187.5 114.5,187.5c0,0 -52.5,1 -52.5,1c0,0 -28,-44 -28,-44c0,0 -27,44 -27,44c0,0 -53.5,0 -53.5,0c0,0 54,-89 54,-89c0,0 -33.5,-57 -33.5,-57c0,0 26,-42.5 26,-42.5z" fill="rgb(0,0,0)" id="svg_2" stroke="#000000"/>
<path transform="scale(2)" d="m81.6,60.6c0,0 27,44 27,44c0,0 -53,87 -53,87c0,0 -54,-1 -54,-1c0,0 80,-130 80,-130z" fill="rgb(0,0,0)" id="svg_3" stroke="#000000"/>
</svg>
</DIV>
</DIV>
<DIV id="TabAccounts" style="display: none;">
<BR>
<table id="idKeys">
<tr id="WalRow1">
<td>Wallet:</td>
<td><button id="idPrivKeyButton" onclick="OpenWallet()">Wallet opened: </button></td>
<td><button onclick="SetVisibleItemsKeys(1,1)" style="width: 120px" class="btkey bigs">Edit...</button></td>
</tr>
<tr id="WalRow2" style="display: none">
<td>Private key:</td>
<td><INPUT type="search" id="idPrivKeyEdit" oninput="SetPubKey(1);"></td>
<td>
<button onclick="OnPrivKeyOK()" class="btkey bigs">OK</button>
<button onclick="SetVisibleItemsKeys(0)" class="btkey bigs">Cancel</button>
</td>
</tr>
<tr id="WalRow3" style="display: none">
<td>Pub key:</td>
<td><INPUT type="search" id="idPubKey" readonly></td>
<td></td>
</tr>
<tr id="WalRow4" style="display: none">
<td></td>
<td colspan="1"><button class="bigs" onclick="OnPrivKeyNew()">Generate key</button>
<INPUT type="checkbox" id="idShowPubKey" oninput="SetVisibleItemsKeys(1)"> <span>Show pub key</span>
<!--Set password:<INPUT class="bigs" type="search" id="idProtKey">-->
</td>
<td></td>
</tr>
</table>
<INPUT type="hidden" id="idPrivKey">
<BR>
<DIV style="padding: 0 0 0 10px">
<table>
<tr>
<td style="width: 220px">
<button class="bigs" onclick="ConnectWebWallet()"> Reconnect</button>
<button class="bigs" onclick="ViewNewAccount()"> New account...</button>
</td>
<td>
<DIV id="idAccountEdit" style="display: none;">
<span>Public name</span>:<INPUT class="bigs" style="width: 180px" type="string" id="idAccountName">
<span>Currency</span>:
<select size="1" id="idAccountCur" class="bigs" style="width: 80px">
<option value="0">TERA</option>
</select>
<button onclick="OnSetAccount(1)" class="btkey bigs">OK</button>
<button onclick="OnSetAccount(0)" class="btkey bigs">Cancel</button>
</DIV>
</td>
</tr>
</table>
</DIV>
<table id="grid_accounts" class="grid">
<tr>
<th id="(RetHistoryAccount(Item))" class="num">ID</th>
<th id="SUM_TO_STRING(Item.Value)" class="sum bold">Amount</th>
<th id="CurrencyNameItem(Item)" data-name="Currency" class="cur hint">Currency</th>
<th id="Item.Name" data-name="Account name" class="accname hint">Name</th>
<th id="(RetChangeSmart(Item))" data-name="Smart contract (DApp)" class="smart hint">Smart</th>
</tr>
</table>
<B><DIV id="idMyTotalSum"></DIV></B>
</DIV>
<DIV id="TabSend" style="display: none;">
<DIV id="idSendList"> </DIV>
<table class="form_input">
<tr>
<td style="min-width: 115px">From account</td>
<td>
<select size="1" id="idAccount" oninput="OnEditTransactionFields(); CheckSending();">
</select>
</td>
</tr>
<tr><td>&nbsp;</td><td><DIV id="idNameTo" class="smallbold"></DIV></td></tr>
<tr>
<td>Pay to<img src="./PIC/address_book.png" onclick="OpenAddressBook()" class="abook"></td>
<td>
<INPUT style="float: left" type="string" id="idTo" value="" oninput="OnEditIdTo()" placeholder="Payee (required)" >
</td>
</tr>
<tr>
<td>Amount</td>
<td>
<INPUT type="number" id="idSumSend" style="color:#1e21cb" value="" step=0 min=0 max=1000000000 oninput="OnEditTransactionFields()">&nbsp;
<button style="font-family: monospace;" onclick="SetAllSum()"></button>
<B id="idCoinName"></B>
</td>
</tr>
<tr>
<td>Description (optional)</td><td><textarea id="idDescription" rows="4" oninput="CheckLengthAccDesription('idDescription',200);OnEditTransactionFields()"></textarea></td>
<td><DIV id="idAttach"> </DIV></td>
</tr>
<tr>
<td>
</td>
<td>
<BUTTON onclick="ClearTransaction()" class="bsend bt">Clear</BUTTON>
<BUTTON onclick="EditJSONTransaction();SetImg(this,'edit_transaction');" class="bsend bt" id="idDown">Edit JSON</BUTTON>
<BUTTON onclick="SendMoneyBefore()" class="bsend bt" id="idSendButton" >Send</BUTTON>
</td>
</tr>
</table>
<DIV id="edit_transaction" style="display: none">
<textarea id="idTransaction" rows="20" onkeyup="StartEditTransactionJSON()" onchange="StartEditTransactionJSON()"></textarea>
<BR>
<BUTTON onclick="SignJSON()" class="btdoit bt" id="idSignJSON">Sign JSON</BUTTON>
<BUTTON onclick="SendMoneyJSON()" class="btdoit bt">Send from JSON</BUTTON>
</DIV>
<script>
function SetAllSum()
{
var Item=MapAccounts[$("idAccount").value];
if(Item)
$("idSumSend").value=FLOAT_FROM_COIN(Item.Value).toStringF();
}
</script>
</DIV>
<DIV id="TabHistory" style="display: none;">
</DIV>
<DIV id="TabDapps" style="display: none">
<BR>
<DIV id="idPaginationDapps" style="display: block">
<!--Category:-->
<!--<select size="1" id="idCategory" onchange="ViewCurrent(DefDapps)">-->
<!--</select>-->
<!--<BR>-->
<BUTTON onclick="ViewBegin(DefDapps)" class="btdoitm bt">|&lt;-</BUTTON>
<BUTTON onclick="ViewPrev(DefDapps)" class="btdoit bt">&lt;&lt; Prev</BUTTON>
<INPUT type="number" id="idViewDappNum" style="text-align: center" value="0" min=0 max=1000000000 onchange="ViewCurrent(DefDapps)">
<BUTTON onclick="ViewNext(DefDapps,CONFIG_DATA.MaxDappsID)" class="btdoit bt">Next &gt;&gt;</BUTTON>
<BUTTON onclick="ViewEnd(DefDapps,CONFIG_DATA.MaxDappsID)" class="btdoitm bt">-&gt;|</BUTTON>
<table id="dapps_list" class="grid">
<tr>
<th id="(RetNumDapp(Item))" class="num">ID</th>
<th id="(RetOpenDapps(Item,0,0))" class="dappname">Name</th>
<th id="Item.Description" class="code dappdesc">Description</th>
<th id="(RetCategory(Item))" class="">Category</th>
<th id="(RetBaseAccount(Item))" class="num">Base Account</th>
<th id="Item.Owner" class="num">Owner</th>
<th id="RetBool(Item.TokenGenerate)" class="bool">Token generate</th>
<!--<th id="Item.ISIN" class="num">ISIN</th>-->
<th id="(RetOpenBlock(Item.BlockNum,1))" class="num">Block Num</th>
</tr>
</table>
</DIV>
</DIV>
<DIV id="TabExplorer" align="center" style="display: none;">
<!--<iframe src="/explorer.html" style="width: 100%;height: 100vh"></iframe>-->
<DIV id="idCurrentBlockNum"></DIV>
<button onclick="ViewCurrent(DefAccounts,1,this);" class="btview">Accounts</button>
<button onclick="ViewCurrent(DefBlock,1,this)" class="btview">Blocks & Tr</button>
<!--<button onclick="ViewCurrent(DefBlock,1,this)" class="btview">DApps</button>-->
<button onclick="ViewCounters(this)" class="btview">Counters</button>
<DIV>
<DIV id="idPaginationAccount" style="display: none">
<BR>
<button onclick="ViewBegin(DefAccounts)" class="btnav">|&lt;-</button>
<button onclick="ViewPrev(DefAccounts)" class="btnav">&lt;&lt; Prev</button>
<INPUT type="number" class="pag_num" id="idViewAccountNum" style="text-align: center" value="0" min=0 onchange="ViewCurrent(DefAccounts)">
<button onclick="ViewNext(DefAccounts,CONFIG_DATA.MaxAccID)" class="btnav">Next &gt;&gt;</button>
<button onclick="ViewEnd(DefAccounts,CONFIG_DATA.MaxAccID)" class="btnav">-&gt;|</button>
<table id="explorer_accounts" class="grid">
<tr>
<th id="(RetHistoryAccount(Item))" class="num">ID</th>
<th id="SUM_TO_STRING(Item.Value)" class="sum">Amount</th>
<th id="CurrencyNameItem(Item)" class="cur">Cur</th>
<th id="Item.Name" class="accname">Name</th>
<th id="Item.PubKeyStr" class="hash pubkey">PubKey</th>
<th id="Item.Value.OperationID" class="num">Operation</th>
<th id="Item.Value.Smart" class="num">Smart</th>
<th id="(RetOpenBlock(Item.BlockNumCreate,1))" class="num">Block Num</th>
</tr>
</table>
</DIV>
<DIV id="idPaginationBlock" style="display: none">
<BR>
<DIV><BR></DIV>
<button onclick="ViewBegin(DefBlock)" class="btnav">|&lt;-</button>
<button onclick="ViewPrev(DefBlock)" class="btnav">&lt;&lt; Prev</button>
<INPUT type="number" class="pag_num" id="idViewBlockNum" style="text-align: center" value="0" min=0 onchange="ViewCurrent(DefBlock)">
<button onclick="ViewNext(DefBlock,CONFIG_DATA.MaxNumBlockDB)" class="btnav">Next &gt;&gt;</button>
<button onclick="ViewEnd(DefBlock,CONFIG_DATA.MaxNumBlockDB)" class="btnav">-&gt;|</button>
<table id="explorer_blocks" class="grid">
<tr>
<th id="(RetOpenBlock(Item.BlockNum,Item.TrDataLen))" class="num">Num</th>
<th id="(DateFromBlock(Item.BlockNum,1))" class="date">Date</th>
<th id="GetHexFromArr(Item.TreeHash)" class="hash">Data Hash</th>
<th id="GetHexFromArr(Item.PowHash)" class="hash">PowHash</th>
<th id="GetHexFromArr(Item.Hash)" class="hash">Block Hash</th>
<th id="Item.TrDataLen" class="num">Bytes</th>
<th id="Item.Power" class="num">Pow</th>
<th id="Item.Miner" class="num">Miner</th>
</tr>
</table>
</DIV>
<DIV id="idStatBlock" style="display: none">
<BR>
<DIV id="diagr_content" align='center'>
<DIV id="diargams" align='center'>
</DIV>
</DIV>
</DIV>
</DIV>
<BR>
</DIV>
</DIV>
<DIV id="idBlockOnSend" style="display: none">
<DIV align="center">
Send <B id="idOnSendText"></B>
<BR>
<button onclick="SendMoney2()" id="idBtOnSend" class="radius">Send</button>
<button onclick='SetVisibleBlock("idBlockOnSend",0);' class="radius">Cancel</button>
<DIV align="left">
<DIV id="idCheckOnSend"><input type="checkbox" id="idWhiteOnSend"/> Add this account to white list</DIV>
</DIV>
</DIV>
</DIV>
<DIV id="idAddressBook" style="display: none">
<DIV align="center">
<H3>Address book</H3>
</DIV>
20 VTOOLS del<BR>
20 VTOOLS del<BR>
20 VTOOLS del<BR>
<!--<BR>-->
<!--<button class="radius" onclick="CloaseAddressBook()">Close</button>-->
</DIV>
<DIV id="idStableScroll" align='center'>
<A href="https://terafoundation.org/">Web</A>
<A href="https://bitcointalk.org/index.php?topic=4573801.0">ANN</A>
<A href="https://twitter.com/terafoundation">Twitter</A>
<A href="https://web.telegram.org/#/im?p=@terafoundation">Telegram</A>
<A href="https://discord.gg/CvwrbeG">Discord</A>
<A href="https://jq.qq.com/?_wv=1027&k=5KpN5fw">QQ</A>
<!--progr76@gmail.com-->
</DIV>
</DIV>
</body>
</html>
<script>
var LangMap={};
LangMap["ENG"]={};
LangMap["RUS"]=
{
"TERA Light": "TERA-Лайт",
"Wallet opened: ": "Кошелек открыт: ",
"Edit...": "Ред...",
"OK": "ОК",
"Cancel": "Отмена",
"Generate key": "Сгенерировать ключ",
" Reconnect": " Переконнект",
" New account...": " Новый счет...",
"Accounts": "Счета",
"Counters": "Показатели",
"Send": "Отправить",
"Clear": "Очистить",
"Edit JSON": "Ред. JSON",
"Sign JSON": "Подписать JSON",
"Send from JSON": "Отправить JSON",
"ACCOUNTS": "Счета",
"SEND": "Отправка",
"DAPPS": "Приложения",
"EXPLORER": "Эксплорер",
"ID": "ИД",
"Amount": "Сумма",
"Currency": "Валюта",
"Name": "Имя",
"Smart": "Смарт",
"Description": "Описание",
"Category": "Категория",
"Base Account": "Базовый счет",
"Owner": "Владелец",
"Token generate": "Токеногенерация",
"Block Num": "Номер блока",
"Cur": "Вал.",
"PubKey": "Публ.ключ",
"Operation": "Операция",
"Num": "Ном",
"Date": "Дата",
"Data Hash": "Хеш данных",
"PowHash": "Хеш Pow",
"Block Hash": "Хеш блока",
"Bytes": "Байты",
"Pow": "Pow",
"Miner": "Майнер",
"Wallet:": "Кошелек:",
"Private key:": "Приватный ключ:",
"Pub key:": "Публичный ключ:",
"From account": "Со счета",
"Pay to": "На счет",
"Description (optional)": "Описание (опционально)",
"Public name":"Публичное имя",
"Show pub key":"Показать публичный ключ",
"Blocks & Tr":"Блоки & Транз.",
"<< Prev":"<< Пред",
"Next >>":"След >>",
};
LangMap["DEU"]=
{
"TERA Light": "TERA Light",
"Wallet opened: ": "Wallet geöffnet: ",
"Edit...": "Bearbeiten...",
"OK": "ОК",
"Cancel": "Abbr.",
"Generate key": "Key erzeugen",
" Reconnect": " Neu verbinden",
" New account...": " Neuer ID...",
"Accounts": "Accounts",
"Counters": "Statistiken",
"Send": "Senden",
"Clear": "Löschen",
"Edit JSON": "JSON Bearbeten",
"Sign JSON": "JSON Signieren",
"Send from JSON": "Von JSON gesendet",
"ACCOUNTS": "Accounts",
"SEND": "Überweisung",
"DAPPS": "DApps",
"EXPLORER": "Explorer",
"ID": "ID",
"Amount": "Betrag",
"Currency": "Währung",
"Name": "Beschreibung",
"Smart": "DApp ID",
"Description": "Öffentl. Name",
"Category": "Kategorie",
"Base Account": "Standard Account",
"Owner": "Besitzer",
"Token generate": "Token generieren",
"Block Num": "Block",
"Cur": "Währung",
"PubKey": "Öffentl. Schlüssel",
"Operation": "Transaktionen",
"Num": "Nr",
"Date": "Datum",
"Data Hash": "Hashwert",
"PowHash": "PoW Hash",
"Block Hash": "Block Hash",
"Bytes": "Bytes",
"Pow": "Pow",
"Miner": "Miner",
"Wallet:": "Wallet:",
"Private key:": "Privater Schlüssel:",
"Pub key:": "Öffentl. Schlüssel:",
"From account": "Von Account",
"Pay to": "Empfänger",
"Description (optional)": "Beschreibung (optional)",
"Public name":"Öffentl. Name",
"Show pub key":"Zeige öffentlichen Schlüssel",
"Blocks & Tr":"Blöcke & Tr",
"<< Prev":"<< zurück",
"Next >>":"weiter >>",
};
LangMap["中文"]=
{
"TERA Light": "TERA轻钱包",
"Wallet opened: ": "钱包已打开:",
"Edit...": "编辑...",
"OK": "ОК",
"Cancel": "取消",
"Generate key": "生成私钥",
" Reconnect": " 重连",
" New account...": " 新账号...",
"Accounts": "账号",
"Counters": "计数",
"Send": "发送",
"Clear": "清除",
"Edit JSON": "编辑JSON",
"Sign JSON": "签名JSON",
"Send from JSON": "从JSON发送",
"ACCOUNTS": "账号",
"SEND": "发送",
"DAPPS": "去中心化应用",
"EXPLORER": "浏览器",
"ID": "ID",
"Amount": "数量",
"Currency": "币种",
"Name": "名称",
"Smart": "智能合约",
"Description": "描述",
"Category": "类别",
"Base Account": "基本账号",
"Owner": "拥有者",
"Token generate": "生成代币",
"Block Num": "区块编号",
"Cur": "币种",
"PubKey": "公钥",
"Operation": "操作次数",
"Num": "编号",
"Date": "日期",
"Data Hash": "数据哈希",
"PowHash": "Pow哈希",
"Block Hash": "区块哈希",
"Bytes": "字节",
"Pow": "Pow",
"Miner": "矿工",
"Wallet:": "钱包:",
"Private key:": "私钥:",
"Pub key:": "公钥:",
"From account": "从账号",
"Pay to": "付款到",
"Description (optional)": "描述 (可选)",
"Public name":"名称",
"Show pub key":"显示公钥",
"Blocks & Tr":"区块&交易编号",
"<< Prev":"<< 向前",
"Next >>":"向后>>",
};
LangMap["한글"]=
{ "TERA Light": "TERA가벼운 지갑", "Wallet opened: ": "열린 지갑:", "Edit...": "편집...", "OK": "ОК", "Cancel": "취소", "Generate key": "개인 키 생성", " Reconnect": " 다시 연결", " New account...": " 새 계정...", "Accounts": "계정", "Counters": "계수", "Send": "발송", "Clear": "제거", "Edit JSON": "JSON편집", "Sign JSON": "JSON 서명", "Send from JSON": "JSON부터 발송", "ACCOUNTS": "계정", "SEND": "발송", "DAPPS": "분산화 응용", "EXPLORER": "브라우저", "ID": "ID", "Amount": "수량", "Currency": "화폐", "Name": "이름", "Smart": "지능 계약", "Description": "설명", "Category": "분류", "Base Account": "기초 계정", "Owner": "소유자", "Token generate": "대폐 생성", "Block Num": "블록 번호", "Cur": "화폐", "PubKey": "공공 키", "Operation": "조작 횟수", "Num": "번호", "Date": "날짜", "Data Hash": "데이터 해시", "PowHash": "Pow해시", "Block Hash": "블록 해시", "Bytes": "바이트", "Pow": "Pow", "Miner": "광부", "Wallet:": "지갑:", "Private key:": "개인 키:", "Pub key:": "공공 키:", "From account": "계정 부터", "Pay to": "계정에게 지불", "Description (optional)": "설명 (선택의)", "Public name":"이름", "Show pub key":"공공 키 보이기", "Blocks & Tr":"블록 & 교역 번호", "<< Prev":"<< 앞으로", "Next >>":"뒤로>>", };
</script>