var currentpath = "/";
var authentication = false;
var webupdate = false;
var filesystem = false;
var websocket_port = 0;
var websocket_IP = "";
var async_webcommunication = false;
var page_id = "";
var ws_source;
var log_off =false;
var websocket_started =false;
var esp_error_message ="";
var esp_error_code = 0;
var xmlhttpupload;
var typeupload = 0;
var wifimode = "";
var terminal_visible= false;
var terminalbody = DGEI('TERMINAL');
var wsmsg = "";
var Monitor_output = [];
function toogleConsole(){
if (terminal_visible){
terminalbody.style.display="none";
} else{
terminalbody.style.display="block";
}
terminal_visible= !terminal_visible;
}
function DGEI(s){
return document.getElementById(s);
}
function SendCustomCommand(){
if (DGEI('custom_cmd_txt').value.length >0){
Monitor_output_Update(DGEI('custom_cmd_txt').value + "\n");
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 ) {
if(xmlhttp.status == 200) {
Monitor_output_Update(xmlhttp.responseText);
}
}
};
xmlhttp.open("GET", "/command?cmd="+encodeURI(DGEI('custom_cmd_txt').value), true);
xmlhttp.send();
DGEI('custom_cmd_txt').value="";
}
}
function navbar(){
var content="
";
var tlist = currentpath.split("/");
var path="/";
var nb = 1;
content+="/ ";
while (nb < (tlist.length-1))
{
path+=tlist[nb] + "/";
content+=""+tlist[nb] +" / ";
nb++;
}
content+="
";
return content;
}
function trash_icon(){
return "" +
" "+
" "+
" "+
" "+
" "+
" "+
" "+
" ";
}
function back_icon(){
return " ";
}
function select_dir(directoryname){
currentpath+=directoryname + "/";
SendCommand('list','all');
}
function compareStrings(a, b) {
// case-insensitive comparison
a = a.toLowerCase();
b = b.toLowerCase();
return (a < b) ? -1 : (a > b) ? 1 : 0;
}
function dispatchfilestatus(jsonresponse)
{
var content ="";
var display_message = false;
content =" Status: "+jsonresponse.status +
" | Total space: "+jsonresponse.total+
" | Used space: "+jsonresponse.used+
" | Occupation: "+
" "+jsonresponse.occupation +"%";
DGEI('status').innerHTML=content;
content ="";
if (currentpath!="/")
{
var pos = currentpath.lastIndexOf("/",currentpath.length-2);
var previouspath = currentpath.slice(0,pos+1);
content +=""+back_icon()+" Up.. ";
}
jsonresponse.files.sort(function(a, b) {
return compareStrings(a.name, b.name);
});
if (currentpath=="/") {
display_message = true;
}
var display_time =false;
for (var i1=0;i1 "+
" "+
" "+
""+
jsonresponse.files[i1].name;
if ((jsonresponse.files[i1].name == "index.html.gz")||(jsonresponse.files[i1].name == "index.html")){
display_message = false;
}
content +="
";
content +=jsonresponse.files[i1].size;
content +=" ";
if (jsonresponse.files[i1].hasOwnProperty('time')){
display_time = true;
content +=""+ jsonresponse.files[i1].time + " ";
} else {
content +=" ";
}
content +=""+
trash_icon()+"
";
}
}
//then display directories
for (var i2=0;i2 "+
""+
jsonresponse.files[i2].name+" ";
if (typeof jsonresponse.files[i2].hasOwnProperty('time')){
display_time = true;
}
content +=""+trash_icon()+"
";
}
}
if(display_time){
DGEI('FS_time').innerHTML = "";
} else {
DGEI('FS_time').innerHTML = "Time";
}
if (display_message) {
DGEI('MSG').innerHTML = "File index.html.gz is missing, please upload it";
} else {
DGEI('MSG').innerHTML = "Go to ESP3D interface ";
}
DGEI('file_list').innerHTML=content;
DGEI('path').innerHTML=navbar();}
function Delete(filename){
if (confirm("Confirm deletion of file: " + filename))SendCommand("delete",filename);
}
function Deletedir(filename){
if (confirm("Confirm deletion of directory: " + filename))SendCommand("deletedir",filename);
}
function Createdir(){
var filename = prompt("Directory name", "");
if (filename != null) {
SendCommand("createdir",filename.trim());
}
}
function isLimitedEnvironment() {
var sitesList = [
"clients3.google.com", //Android Captive Portal Detection
"connectivitycheck.",
//Apple iPhone, iPad with iOS 6 Captive Portal Detection
"apple.com",
".akamaitechnologies.com",
//Apple iPhone, iPad with iOS 7, 8, 9 and recent versions of OS X
"www.appleiphonecell.com",
"www.itools.info",
"www.ibook.info",
"www.airport.us",
"www.thinkdifferent.us",
".akamaiedge.net",
//Windows
".msftncsi.com",
"microsoft.com",
];
if (wifimode != "AP")return false;
for (var i = 0; i < sitesList.length; i++) {
if (document.location.host.indexOf(sitesList[i]) != -1) return true;
}
return false;
}
function SendCommand(action,filename){
var xmlhttp = new XMLHttpRequest();
var url = "/files?action="+action;
DGEI('MSG').innerHTML = "Connecting...";
url += "&filename="+encodeURI(filename);
url += "&path="+encodeURI(currentpath);
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 ) {
if(xmlhttp.status == 200) {
var jsonresponse = JSON.parse(xmlhttp.responseText);
dispatchfilestatus(jsonresponse);
} else {
if(xmlhttp.status == 401) {
RL ();
} else {
console.log(xmlhttp.status);
FWError();
}
}
}
};
xmlhttp.open("GET", url, true);
xmlhttp.send();
}
function Sendfile(){
var files = DGEI('file-select').files;
if (files.length==0)return;
DGEI('upload-button').value = "Uploading...";
DGEI('prg').style.visibility = "visible";
var formData = new FormData();
formData.append('path', currentpath);
for (var i3 = 0; i3 < files.length; i3++) {
var file = files[i3];
var arg = currentpath + file.name + "S";
//append file size first to check updload is complete
formData.append(arg, file.size);
formData.append('myfiles[]', file, currentpath+file.name);}
xmlhttpupload = new XMLHttpRequest();
xmlhttpupload.open('POST', '/files', true);
//progress upload event
xmlhttpupload.upload.addEventListener("progress", updateProgress, false);
//progress function
function updateProgress (oEvent) {
if (oEvent.lengthComputable) {
var percentComplete = (oEvent.loaded / oEvent.total)*100;
DGEI('prg').value=percentComplete;
DGEI('upload-button').value = "Uploading ..." + percentComplete.toFixed(0)+"%" ;
} else {
// Impossible because size is unknown
}
}
typeupload = 1;
xmlhttpupload.onload = function () {
if (xmlhttpupload.status === 200) {
DGEI('upload-button').value = 'Upload';
DGEI('prg').style.visibility = "hidden";
DGEI('file-select').value="";
var jsonresponse = JSON.parse(xmlhttpupload.responseText);
dispatchfilestatus(jsonresponse);
} else uploadError();
};
xmlhttpupload.send(formData);
}
function autoscroll(){
if (DGEI('monitor_enable_autoscroll').checked == true) DGEI('cmd_content').scrollTop = DGEI('cmd_content').scrollHeight;
}
function padNumber(num, size) {
var s = num.toString();
while (s.length < size) s = "0" + s;
return s;
}
function getPCTime(){
var d = new Date();
return d.getFullYear() + "-" + padNumber(d.getMonth() + 1 ,2) + "-" + padNumber(d.getDate(),2) + "-" + padNumber(d.getHours(),2) + "-" + padNumber(d.getMinutes(),2) + "-" + padNumber(d.getSeconds(),2);
}
function HideAll(msg){
//console.log("Hide all:" + msg);
log_off = true;
if(websocket_started){
ws_source.close();
}
document.title = document.title + "(disconnected)";
DGEI('MSG').innerHTML = msg;
DGEI('FILESYSTEM').style.display = "none";
DGEI('FWUPDATE').style.display = "none";
DGEI('CONSOLE').style.display = "none";
}
function FWError(){
HideAll("Failed to communicate with FW!");
}
function FWOk(){
DGEI('MSG').innerHTML = "Connected";
DGEI('CONSOLE').style.display = "block";
if (filesystem){
DGEI('FILESYSTEM').style.display = "block";
}
if (webupdate){
DGEI('FWUPDATE').style.display = "block";
}
}
function InitUI(){
var xmlhttp = new XMLHttpRequest();
var url = "/command?cmd="+encodeURI("[ESP800]"+"time=" + getPCTime());
authentication = false;
async_webcommunication = false;
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 ) {
var error = false;
if(xmlhttp.status == 200) {
var jsonresponse = JSON.parse(xmlhttp.responseText);
if ((typeof jsonresponse.FWVersion === "undefined")|| (typeof jsonresponse.Hostname === "undefined") || (typeof jsonresponse.WebUpdate === "undefined") || (typeof jsonresponse.WebSocketport === "undefined") || (typeof jsonresponse.WebSocketIP === "undefined") || (typeof jsonresponse.WebCommunication === "undefined") || (typeof jsonresponse.Filesystem === "undefined") || (typeof jsonresponse.Authentication === "undefined")) {
error = true;
} else {
DGEI('FWVERSION').innerHTML = "v"+jsonresponse.FWVersion;
if (jsonresponse.Filesystem != "None"){
filesystem = true;
//console.log(jsonresponse.Filesystem);
}
if (jsonresponse.WebUpdate != "Disabled"){
webupdate = true;
//console.log(jsonresponse.WebUpdate);
}
//
wifimode = jsonresponse.WiFiMode;
//websocket port
websocket_port = jsonresponse.WebSocketport;
//websocket IP
websocket_IP = jsonresponse.WebSocketIP;
//console.log(websocket_port);
//async communications
if (jsonresponse.WebCommunication != "Synchronous") {
async_webcommunication = true;
//console.log(jsonresponse.WebCommunication);
}
if (isLimitedEnvironment()){
DGEI('InfoMSG').innerHTML="It seems you are in limited environment, please open a browser using " + websocket_IP + " to get all features working";
} else {
DGEI('InfoMSG').innerHTML="";
}
FWOk();
startSocket();
document.title = jsonresponse.Hostname;
if (filesystem)SendCommand('list','all');
if (jsonresponse.Authentication != "Disabled"){
authentication = true;
//console.log(jsonresponse.Authentication);
DGEI('loginicon').style.visibility = "visible";
} else {
DGEI('loginicon').style.visibility = "hidden";
}
}
} else if (xmlhttp.status == 401){
RL();
} else {
error = true;
console.log( xmlhttp.status);
}
if (error) {
FWError();
}
}
};
xmlhttp.open("GET", url, true);
xmlhttp.send();
}
function Monitor_output_Update(message) {
if (message) {
Monitor_output = Monitor_output.concat(message);
Monitor_output = Monitor_output.slice(-300);
var output="";
for (var i = 0; i < Monitor_output.length; i++) {
output+=Monitor_output[i];
}
DGEI("cmd_content").innerHTML = output;
autoscroll();
}
}
function startSocket(){
if (websocket_started){
ws_source.close();
}
if(async_webcommunication){
ws_source = new WebSocket('ws://'+websocket_IP + ':' + websocket_port +'/ws',['arduino']);
}
else {
//console.log("Socket port is :" + websocket_port);
ws_source = new WebSocket('ws://'+websocket_IP + ':' + websocket_port,['arduino']);
}
ws_source.binaryType = "arraybuffer";
ws_source.onopen = function(e){
console.log("WS");
websocket_started = true;
};
ws_source.onclose = function(e){
websocket_started = false;
console.log("~WS");
//seems sometimes it disconnect so wait 3s and reconnect
//if it is not a log off
if(!log_off) setTimeout(startSocket, 3000);
};
ws_source.onerror = function(e){
console.log("WS", e);
};
ws_source.onmessage = function(e){
var msg = "";
//bin
if (e.data instanceof ArrayBuffer) {
var bytes = new Uint8Array(e.data);
for (var i = 0; i < bytes.length; i++) {
msg += String.fromCharCode(bytes[i]);
if ((bytes[i] == 10) || (bytes[i] == 13)) {
wsmsg += msg;
Monitor_output_Update(wsmsg);
wsmsg = "";
msg = "";
}
}
wsmsg += msg;
} else {
msg = e.data;
var tval = msg.split(":");
if (tval.length >= 2) {
if (tval[0] == 'currentID') {
page_id = tval[1];
console.log("ID " + page_id);
}
if (tval[0] == 'activeID') {
if(page_id != tval[1]) {
HideAll("It seems you are connect from another location, your are now disconnected");
}
}
if (tval[0] == 'ERROR') {
esp_error_message = tval[2];
esp_error_code = tval[1];
console.log(tval[2] + " code:" + tval[1]);
uploadError();
xmlhttpupload.abort();
}
}
}
//console.log(msg);
};
}
window.onload = function() {
InitUI();
};
function uploadError()
{
if (esp_error_code != 0) {
alert('Update failed(' + esp_error_code + '): ' + esp_error_message);
esp_error_code = 0;
} else {
alert('Update failed!');
}
if (typeupload == 1) {
//location.reload();
DGEI('upload-button').value = 'Upload';
DGEI('prg').style.visibility = "hidden";
DGEI('file-select').value="";
SendCommand('list', 'all');
} else {
location.reload();
}
}
function Uploadfile(){
if (!confirm("Confirm Firmware Update ?"))return;
var files = DGEI('fw-select').files;
if (files.length==0)return;
DGEI('ubut').style.visibility = 'hidden';
DGEI('fw-select').style.visibility = 'hidden';
DGEI('msg').style.visibility = "visible";
DGEI('msg').innerHTML="";
DGEI('MSG').innerHTML="Please wait";
DGEI('CONSOLE').style.display = "none";
DGEI('FILESYSTEM').style.display = "none";
DGEI('prgfw').style.visibility = "visible";
var formData = new FormData();
for (var i4 = 0; i4 < files.length; i4++) {
var file = files[i4];
var arg = "/" + file.name + "S";
//append file size first to check updload is complete
formData.append(arg, file.size);
formData.append('myfile[]', file, "/"+file.name);}
typeupload = 0;
xmlhttpupload = new XMLHttpRequest();
xmlhttpupload.open('POST', '/updatefw', true);
//progress upload event
xmlhttpupload.upload.addEventListener("progress", updateProgress, false);
//progress function
function updateProgress (oEvent) {
if (oEvent.lengthComputable) {
var percentComplete = (oEvent.loaded / oEvent.total)*100;
DGEI('prgfw').value=percentComplete;
DGEI('msg').innerHTML = "Uploading ..." + percentComplete.toFixed(0)+"%" ;
} else {
// Impossible because size is unknown
}
}
xmlhttpupload.onload = function () {
if (xmlhttpupload.status === 200) {
DGEI('ubut').value = 'Upload';
DGEI('msg').innerHTML="Restarting....";
DGEI('counter').style.visibility = "visible";
DGEI('ubut').style.visibility = 'hidden';
DGEI('ubut').style.width = '0px';
DGEI('fw-select').value="";
DGEI('fw-select').style.visibility = 'hidden';
DGEI('fw-select').style.width = '0px';
var jsonresponse = JSON.parse(xmlhttpupload.responseText);
if (jsonresponse.status=='1' || jsonresponse.status=='4' || jsonresponse.status=='1')uploadError();
if (jsonresponse.status=='2')alert('Update canceled!');
else if (jsonresponse.status=='3')
{
var i5 = 0;
var interval;
var x = DGEI("prgfw");
x.max=40;
interval = setInterval(function(){
i5=i5+1;
var x = DGEI("prgfw");
x.value=i5;
DGEI('counter').innerHTML=41-i5;
if (i5>40)
{
clearInterval(interval);
location.reload();
}
},1000);
}
else uploadError();
} else uploadError();
};
xmlhttpupload.send(formData);
}
function RL(){
DGEI('loginpage').style.display='block';
}
function SLR (){
DGEI('loginpage').style.display='none';
var user = DGEI('lut').value.trim();
var password = DGEI('lpt').value.trim();
var url = "/login?USER="+encodeURIComponent(user) + "&PASSWORD=" + encodeURIComponent(password) + "&SUBMIT=yes" ;
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4){
if (xmlhttp.status != 200) {
if (xmlhttp.status == 401) {
RL();
} else {
FWError();
console.log(xmlhttp.status);
}
} else {
InitUI();
}
}
};
xmlhttp.open("GET", url, true);
xmlhttp.send();
}