//jsloader.js (function() { if(typeof XMLHttpRequest!="function") { if(typeof loadfail=="function") { loadfail("1-jsloader.js: XMLHttpRequest(type of "+(typeof XMLHttpRequest)+") is not a function"); } else { window.alert("1-jsloader.js: XMLHttpRequest(type of "+(typeof XMLHttpRequest)+") is not a function"); } return; } var ScriptManager= {}; ScriptManager.loading_count=0; ScriptManager.loadjs=async function(pth) { var resolve; var reject; var ret=new Promise(function(s, r) { resolve=s; reject=r; }); var xhr=new XMLHttpRequest(); var onreadystatechange=async function() { if(xhr.readyState!=XMLHttpRequest.DONE) { return; } removelisteners(); ScriptManager.loading_count--; if(xhr.status!=200) { onfail(); return; } console.debug("script "+pth+" fetched successfully."); try { var fn=new Function(xhr.responseText); Object.defineProperty(fn, "name", {"value":pth}); var re=await fn(); if(typeof re=="function") { await re(); } else { await re; } } catch(e) { console.error(e); onfail(); return; } console.debug("script "+pth+" loaded."); resolve(); return; }; var onfail=function() { removelisteners(); xhr.abort(); window.loadfail("script "+pth+" load failed"); reject("script "+pth+" load failed"); }; var removelisteners=function() { xhr.removeEventListener("readystatechange", onreadystatechange); xhr.removeEventListener("error", onfail); xhr.removeEventListener("abort", onfail); }; xhr.addEventListener("readystatechange", onreadystatechange); xhr.addEventListener("error", onfail); xhr.addEventListener("abort", onfail); xhr.open("GET", pth, true); xhr.send(); ScriptManager.loading_count++; return ret; }; ScriptManager.isDone=function() { return ScriptManager.loading_count==0; }; ScriptManager.waitAll=async function() { return new Promise(function(resolve, reject) { var i; i=setInterval(function() { if(ScriptManager.loading_count==0) { clearInterval(i); resolve(); } }, 100); }); }; window.ScriptManager=ScriptManager; })();