tera/Source/HTML/JS/dapp-inner.js
2019-07-12 20:45:46 +08:00

522 lines
12 KiB
JavaScript

/*
* @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
*/
function SendPay(Data)
{
Data.cmd = "pay";
SendData(Data);
};
function SetStorage(Key,Value)
{
var Data = {cmd:"setstorage", Key:Key, Value:Value};
SendData(Data);
};
function GetStorage(Key,F)
{
var Data = {cmd:"getstorage", Key:Key};
SendData(Data, F);
};
function SetCommon(Key,Value)
{
var Data = {cmd:"setcommon", Key:Key, Value:Value};
SendData(Data);
};
function GetCommon(Key,F)
{
var Data = {cmd:"getcommon", Key:Key};
SendData(Data, F);
};
function GetInfo(F,bUseCache)
{
var Data = {cmd:"DappInfo", AllAccounts:ALL_ACCOUNTS, AllData:!bUseCache};
SendData(Data, F);
};
function Call(Account,MethodName,Params,F)
{
var Data = {cmd:"DappCall", MethodName:MethodName, Params:Params, Account:Account};
SendData(Data, F);
};
function SendCall(Account,MethodName,Params,FromNum)
{
if(!INFO.WalletCanSign)
{
SetError("Pls, open wallet");
return 0;
}
var Data = {cmd:"DappSendCall", MethodName:MethodName, Params:Params, Account:Account, FromNum:FromNum};
SendData(Data);
return 1;
};
function GetWalletAccounts(F)
{
var Data = {cmd:"DappWalletList"};
SendData(Data, F);
};
function GetAccountList(Params,F)
{
var Data = {cmd:"DappAccountList", Params:Params};
SendData(Data, F);
};
function GetSmartList(Params,F)
{
var Data = {cmd:"DappSmartList", Params:Params};
SendData(Data, F);
};
function GetBlockList(Params,F)
{
var Data = {cmd:"DappBlockList", Params:Params};
SendData(Data, F);
};
function GetTransactionList(Params,F)
{
var Data = {cmd:"DappTransactionList", Params:Params};
SendData(Data, F);
};
function DappSmartHTMLFile(Smart,F)
{
var Data = {cmd:"DappSmartHTMLFile", Params:{Smart:Smart}};
SendData(Data, F);
};
function DappBlockFile(BlockNum,TrNum,F)
{
var Data = {cmd:"DappBlockFile", Params:{BlockNum:BlockNum, TrNum:TrNum}};
SendData(Data, F);
};
function SetStatus(Str)
{
SendData({cmd:"SetStatus", Message:Str});
};
function SetError(Str)
{
SendData({cmd:"SetError", Message:Str});
};
function SetLocationPath(Str)
{
SendData({cmd:"SetLocationHash", Message:Str});
};
function CreateNewAccount(Currency)
{
SendData({cmd:"CreateNewAccount", Currency:Currency});
};
function OpenLink(Str)
{
SendData({cmd:"OpenLink", Message:Str});
};
function SetMobileMode()
{
SendData({cmd:"SetMobileMode"});
};
function ComputeSecret(PubKey,F,Account)
{
if(!INFO.WalletCanSign)
{
SetError("Pls, open wallet");
return 0;
}
if(!Account && USER_ACCOUNT.length)
Account = USER_ACCOUNT[0].Num;
if(typeof PubKey === "number")
{
var AccNum = PubKey;
GetAccountList({StartNum:AccNum, CountNum:1}, function (Err,Arr)
{
if(Err)
{
SetError(Err);
}
else
{
SendData({cmd:"ComputeSecret", Account:Account, PubKey:Arr[0].PubKey.data}, F);
}
});
}
else
{
SendData({cmd:"ComputeSecret", Account:Account, PubKey:PubKey}, F);
}
};
function CheckInstall()
{
SendData({cmd:"CheckInstall"});
};
function SendTransaction(Body,TR,SumPow,F)
{
SetError("Cannt SEND TR: " + JSON.stringify(TR));
};
function CurrencyName(Num)
{
var Name = MapCurrency[Num];
if(!Name)
{
GetSmartList({StartNum:Num, CountNum:1, TokenGenerate:1}, function (Err,Arr)
{
if(Err || Arr.length === 0)
return ;
var Smart = Arr[0];
Name = GetTokenName(Smart.Num, Smart.ShortName);
MapCurrency[Smart.Num] = Name;
});
Name = GetTokenName(Num, "");
}
return Name;
};
var SendCountUpdate = 0;
function FindAllCurrency()
{
SendCountUpdate++;
GetSmartList({StartNum:8, CountNum:100, TokenGenerate:1}, function (Err,Arr)
{
SendCountUpdate--;
if(Err)
return ;
for(var i = 0; i < Arr.length; i++)
{
var Smart = Arr[i];
if(!MapCurrency[Smart.Num])
{
var Name = GetTokenName(Smart.Num, Smart.ShortName);
MapCurrency[Smart.Num] = Name;
}
}
});
};
function GetFilePath(Path)
{
if(window.PROTOCOL_SERVER_PATH && Path.indexOf("file/"))
{
if(Path.substr(0, 1) !== "/")
Path = "/" + Path;
Path = window.PROTOCOL_SERVER_PATH + Path;
}
return Path;
};
function GetParamsFromPath(Name)
{
if(!OPEN_PATH)
return undefined;
var arr = OPEN_PATH.split("&");
for(var i = 0; i < arr.length; i++)
{
if(arr[i].indexOf(Name + "=") === 0)
{
return arr[i].split("=")[1];
}
}
};
function GetState(AccNum,F,FErr)
{
SendCountUpdate++;
GetAccountList({StartNum:AccNum, CountNum:1}, function (Err,Arr)
{
SendCountUpdate--;
if(!Err && Arr.length)
{
var Item = Arr[0].SmartState;
if(Item)
{
F(Item);
return ;
}
}
if(FErr)
{
FErr();
return ;
}
});
};
var glMapF = {};
var glKeyF = 0;
function SendData(Data,F)
{
if(!window.parent)
return ;
if(F)
{
glKeyF++;
Data.CallID = glKeyF;
glMapF[glKeyF] = F;
}
window.parent.postMessage(Data, "*");
};
function OnMessage(event)
{
var Data = event.data;
if(!Data || typeof Data !== "object")
return ;
var CallID = Data.CallID;
var cmd = Data.cmd;
if(CallID)
{
var F = glMapF[CallID];
if(F)
{
delete Data.CallID;
delete Data.cmd;
switch(cmd)
{
case "getstorage":
case "getcommon":
F(Data.Key, Data.Value);
break;
case "DappCall":
F(Data.Err, Data.RetValue);
break;
case "DappInfo":
F(Data.Err, Data);
break;
case "DappWalletList":
case "DappAccountList":
case "DappSmartList":
case "DappBlockList":
case "DappTransactionList":
F(Data.Err, Data.arr);
break;
case "DappBlockFile":
case "DappSmartHTMLFile":
F(Data.Err, Data.Body);
break;
case "ComputeSecret":
F(Data.Result);
break;
default:
console.log("Error cmd: " + cmd);
}
delete glMapF[CallID];
}
}
else
{
switch(cmd)
{
case "History":
var eventEvent = new CustomEvent("History", {detail:Data});
window.dispatchEvent(eventEvent);
break;
case "OnEvent":
if(window.OnEvent)
{
window.OnEvent(Data);
}
var eventEvent = new CustomEvent("Event", {detail:Data});
window.dispatchEvent(eventEvent);
}
}
};
function OpenRefFile(Str)
{
var Param = ParseFileName(Str);
if(Param.BlockNum)
DappBlockFile(Param.BlockNum, Param.TrNum, function (Err,Body)
{
document.write(Body);
});
else
{
OpenLink(Str);
}
};
function SaveToStorageByArr(Arr)
{
SetStorage("VerSave", "1");
for(var i = 0; i < Arr.length; i++)
{
var name = Arr[i];
var Item = $(name);
if(Item)
{
if(Item.type === "checkbox")
SetStorage(name, 0 + Item.checked);
else
SetStorage(name, Item.value);
}
}
};
function LoadFromStorageByArr(Arr,F,bAll)
{
GetStorage("VerSave", function (Key,Value)
{
if(Value === "1")
{
for(var i = 0; i < Arr.length; i++)
{
if(i === Arr.length - 1)
LoadFromStorageById(Arr[i], F);
else
LoadFromStorageById(Arr[i]);
}
}
if(bAll && F)
F(0);
});
};
function LoadFromStorageById(Name,F)
{
GetStorage(Name, function (Key,Value)
{
var Item = document.getElementById(Name);
if(Item)
{
if(Item.type === "checkbox")
Item.checked = parseInt(Value);
else
Item.value = Value;
}
if(F)
F(Key, Value);
});
};
var SendCountDappParams = 0;
function GetDappParams(BNum,TrNum,F,bAll)
{
if(!BNum)
{
if(bAll)
F();
return ;
}
SendCountDappParams++;
DappBlockFile(BNum, TrNum, function (Err,Data)
{
SendCountDappParams--;
if(!Err && Data.Type === 135)
{
try
{
var Params = JSON.parse(Data.Params);
}
catch(e)
{
}
if(Params)
{
F(Params, Data.MethodName, Data.FromNum);
return ;
}
}
if(bAll)
F();
});
};
document.addEventListener("DOMContentLoaded", function ()
{
var refs = document.getElementsByTagName("A");
for(var i = 0, L = refs.length; i < L; i++)
{
if(refs[i].href.indexOf("/file/") >= 0)
{
refs[i].onclick = function ()
{
OpenRefFile(this.href);
};
}
}
});
if(window.addEventListener)
{
window.addEventListener("message", OnMessage);
}
else
{
window.attachEvent("onmessage", OnMessage);
}
var SMART = {}, BASE_ACCOUNT = {}, INFO = {}, USER_ACCOUNT = [], USER_ACCOUNT_MAP = {}, OPEN_PATH = "", ACCOUNT_OPEN_NUM = 0;
var ALL_ACCOUNTS = 0;
var WasStartInit = 0, WasStartInit2 = 0;
var eventInfo = new Event("UpdateInfo");
function UpdateDappInfo()
{
GetInfo(function (Err,Data)
{
if(Err)
{
return ;
}
INFO = Data;
SMART = Data.Smart;
BASE_ACCOUNT = Data.Account;
OPEN_PATH = Data.OPEN_PATH;
ACCOUNT_OPEN_NUM = ParseNum(OPEN_PATH);
SetBlockChainConstant(Data);
USER_ACCOUNT = Data.ArrWallet;
USER_ACCOUNT_MAP = {};
for(var i = 0; i < USER_ACCOUNT.length; i++)
USER_ACCOUNT_MAP[USER_ACCOUNT[i].Num] = USER_ACCOUNT[i];
if(window.OnInit && !WasStartInit)
{
WasStartInit = 1;
window.OnInit(1);
}
else
if(window.OnUpdateInfo)
{
window.OnUpdateInfo();
}
if(!WasStartInit2)
{
WasStartInit2 = 1;
var eventInit = new Event("Init");
window.dispatchEvent(eventInit);
}
window.dispatchEvent(eventInfo);
if(Data.ArrEvent)
for(var i = 0; i < Data.ArrEvent.length; i++)
{
var Item = Data.ArrEvent[i];
Item.cmd = "OnEvent";
OnMessage({data:Item});
}
}, 1);
};
window.addEventListener('load', function ()
{
if(!window.sha3)
LoadLib("./JS/sha3.js");
UpdateDappInfo();
setInterval(UpdateDappInfo, 1000);
});