diff --git a/webui/src/main/css/muwire.css b/webui/src/main/css/muwire.css index d470f900..3cdd80bd 100644 --- a/webui/src/main/css/muwire.css +++ b/webui/src/main/css/muwire.css @@ -11,7 +11,7 @@ } #table-wrapper table * { - background:yellow; + background: #ceeee8; color:black; } #table-wrapper table thead th .text { diff --git a/webui/src/main/java/com/muwire/webui/BrowseServlet.java b/webui/src/main/java/com/muwire/webui/BrowseServlet.java index 91c8d590..fe72ff39 100644 --- a/webui/src/main/java/com/muwire/webui/BrowseServlet.java +++ b/webui/src/main/java/com/muwire/webui/BrowseServlet.java @@ -85,6 +85,9 @@ public class BrowseServlet extends HttpServlet { sb.append(""); }); sb.append(""); + } else { + resp.sendError(403, "Bad param"); + return; } resp.setContentType("text/xml"); resp.setCharacterEncoding("UTF-8"); diff --git a/webui/src/main/java/com/muwire/webui/DownloadServlet.java b/webui/src/main/java/com/muwire/webui/DownloadServlet.java index 9d3b6b67..d6e85da9 100644 --- a/webui/src/main/java/com/muwire/webui/DownloadServlet.java +++ b/webui/src/main/java/com/muwire/webui/DownloadServlet.java @@ -55,7 +55,7 @@ public class DownloadServlet extends HttpServlet { String ETA; if (speed == 0) - ETA = "Unknown"; + ETA = Util._t("Unknown"); else { long remaining = (d.getNPieces() - d.donePieces()) * d.getPieceSize() / speed; ETA = DataHelper.formatDuration(remaining * 1000); @@ -66,6 +66,7 @@ public class DownloadServlet extends HttpServlet { if (d.getNPieces() != 0) percent = (int)(d.donePieces() * 100 / d.getNPieces()); String totalSize = DataHelper.formatSize2Decimal(d.getLength(), false) + "B"; + // FIXME translate String progress = String.format("%2d", percent) + "% of "+totalSize; sb.append("").append(progress).append(""); diff --git a/webui/src/main/java/com/muwire/webui/TrustServlet.java b/webui/src/main/java/com/muwire/webui/TrustServlet.java index 21f600b3..8bdf9046 100644 --- a/webui/src/main/java/com/muwire/webui/TrustServlet.java +++ b/webui/src/main/java/com/muwire/webui/TrustServlet.java @@ -65,7 +65,7 @@ public class TrustServlet extends HttpServlet { sb.append("").append(Util.escapeHTMLinXML(list.getPersona().getHumanReadableName())).append(""); sb.append("").append(list.getPersona().toBase64()).append(""); sb.append("").append(list.getStatus()).append(""); - String timestamp = "Never"; + String timestamp = Util._t("Never"); if (list.getTimestamp() > 0) timestamp = DataHelper.formatTime(list.getTimestamp()); sb.append("").append(timestamp).append(""); diff --git a/webui/src/main/java/com/muwire/webui/Util.java b/webui/src/main/java/com/muwire/webui/Util.java index 3c174a40..bf20af1b 100644 --- a/webui/src/main/java/com/muwire/webui/Util.java +++ b/webui/src/main/java/com/muwire/webui/Util.java @@ -22,28 +22,27 @@ public class Util { // if we had a lot of these we could scan for them in the build and generate // a file, but it's not worth it for just a handful. private static final String[] jsStrings = { - _x("Fetching Certificates"), - _x("Hide Certificates"), - _x("Results For {0}"), - _x("View {0} Certificates"), - _x("Certify"), - _x("Certified"), - _x("Import"), - _x("Imported"), - _x("Unsubscribe"), + // alphabetical please _x("Actions"), _x("Browse"), _x("Browsing"), _x("Cancel"), - _x("Details For {0}"), + _x("Certified"), + _x("Certify"), + _x("Comment"), + _x("Details for {0}"), _x("Down"), _x("Download"), _x("Downloading"), _x("Enter Reason (Optional)"), _x("ETA"), + _x("Fetching Certificates"), _x("File"), + _x("Hide Certificates"), _x("Hide Comment"), _x("Host"), + _x("Import"), + _x("Imported"), _x("Last Updated"), _x("Mark Distrusted"), _x("Mark Neutral"), @@ -54,11 +53,13 @@ public class Util { _x("Reason"), _x("Refresh"), _x("Results"), - _x("Results From {0}"), + _x("Results for {0}"), + _x("Results from {0}"), _x("Save"), _x("Search"), _x("Sender"), _x("Senders"), + _x("Shared Files"), _x("Show Comment"), _x("Size"), _x("Speed"), @@ -67,7 +68,10 @@ public class Util { _x("Subscribe"), _x("Subscribed"), _x("Trust"), + _x("Unshare"), + _x("Unsubscribe"), _x("User"), + _x("View {0} Certificates"), _x("Your Trust"), }; @@ -116,9 +120,13 @@ public class Util { * HTML-escaped. */ public static String getJSTranslations() { + if (Translate.getLanguage(_context).equals("en")) + return "{}"; Map map = new HashMap(jsStrings.length); for (String s : jsStrings) { - map.put(s, _t(s)); + String tx = _t(s); + if (!s.equals(tx)) + map.put(s, tx); } return JSONObject.toJSONString(map); } diff --git a/webui/src/main/js/conncount.js b/webui/src/main/js/conncount.js index d93dae3d..c86e9b3d 100644 --- a/webui/src/main/js/conncount.js +++ b/webui/src/main/js/conncount.js @@ -4,12 +4,20 @@ function refreshConnectionsCount() { if (this.readyState == 4) { var connectionCountSpan = document.getElementById("connectionsCount"); if (this.status == 200) { + var image; var connections = this.responseXML.getElementsByTagName("Connections"); var count = connections[0].childNodes[0].nodeValue var countString = ""+count; connectionCountSpan.innerHTML = countString; + if (count > 0) + image = "connected.png"; + else + image = "connecting.png"; + var connectionIcon = document.getElementById("connectionsIcon"); + connectionIcon.innerHTML = "\"\""; } else { connectionCountSpan.innerHTML = _t("Down"); + connectionIcon.innerHTML = ""; } } } diff --git a/webui/src/main/js/files.js b/webui/src/main/js/files.js index de7394c1..cc7b6753 100644 --- a/webui/src/main/js/files.js +++ b/webui/src/main/js/files.js @@ -77,7 +77,7 @@ function refreshStatus() { } var treeRevision = -1 -var root = new Node("root",null,false,"Shared Files", -1, null, false, -1) +var root = new Node("root",null,false,_t("Shared Files"), -1, null, false, -1) var nodesById = new Map() function initFiles() { diff --git a/webui/src/main/js/search.js b/webui/src/main/js/search.js index 11094d6a..076cc518 100644 --- a/webui/src/main/js/search.js +++ b/webui/src/main/js/search.js @@ -393,7 +393,7 @@ function updateSender(senderName) { sender = senderName; var resultsFromSpan = document.getElementById("resultsFrom"); - resultsFromSpan.innerHTML = _t("Results From {0}", sender); + resultsFromSpan.innerHTML = _t("Results from {0}", sender); var resultsDiv = document.getElementById("bottomTable"); var table = "" @@ -446,7 +446,7 @@ function updateFile(fileInfoHash) { var searchResults = currentSearchByFile.resultBatches.get(infoHash); var resultsFromSpan = document.getElementById("resultsFrom"); - resultsFromSpan.innerHTML = "Results For "+searchResults.name; + resultsFromSpan.innerHTML = _t("Results for {0}", searchResults.name); var resultsDiv = document.getElementById("bottomTable"); var table = "
" + _t("Name") + "" + _t("Size") + "" + _t("Download") + "
"; diff --git a/webui/src/main/js/search.js.orig b/webui/src/main/js/search.js.orig new file mode 100644 index 00000000..11094d6a --- /dev/null +++ b/webui/src/main/js/search.js.orig @@ -0,0 +1,706 @@ +class SearchStatus { + constructor(xmlNode) { + this.revision = xmlNode.getElementsByTagName("Revision")[0].childNodes[0].nodeValue + this.query = xmlNode.getElementsByTagName("Query")[0].childNodes[0].nodeValue + this.uuid = xmlNode.getElementsByTagName("uuid")[0].childNodes[0].nodeValue + this.senders = xmlNode.getElementsByTagName("Senders")[0].childNodes[0].nodeValue + this.results = xmlNode.getElementsByTagName("Results")[0].childNodes[0].nodeValue + } +} + +class SearchBySender { + constructor(xmlNode) { + this.resultBatches = new Map(); + + var resultsBySender = xmlNode.getElementsByTagName("ResultsBySender")[0]; + var resultsFromSenders = resultsBySender.getElementsByTagName("ResultsFromSender"); + var i; + for (i = 0; i < resultsFromSenders.length; i++) { + var results = new ResultsBySender(resultsFromSenders[i]); + this.resultBatches.set(results.sender, results); + } + } +} + +class SearchByFile { + constructor(xmlNode) { + this.resultBatches = new Map(); + + var resultsByFile = xmlNode.getElementsByTagName("ResultsByFile")[0]; + var resultsForFile = resultsByFile.getElementsByTagName("ResultsForFile"); + var i; + for (i = 0; i < resultsForFile.length; i++) { + var results = new ResultsByFile(resultsForFile[i]); + this.resultBatches.set(results.infoHash, results); + } + } +} + +class ResultsBySender { + constructor(xmlNode) { + this.sender = xmlNode.getElementsByTagName("Sender")[0].childNodes[0].nodeValue; + this.senderB64 = xmlNode.getElementsByTagName("SenderB64")[0].childNodes[0].nodeValue; + this.browse = xmlNode.getElementsByTagName("Browse")[0].childNodes[0].nodeValue; + this.browsing = xmlNode.getElementsByTagName("Browsing")[0].childNodes[0].nodeValue; + this.trust = xmlNode.getElementsByTagName("Trust")[0].childNodes[0].nodeValue; + this.results = new Map(); + var resultNodes = xmlNode.getElementsByTagName("Result"); + var i; + for (i = 0 ; i < resultNodes.length; i ++) { + var result = new ResultBySender(resultNodes[i]); + this.results.set(result.infoHash,result); + } + } + + getTrustLinks() { + if (this.trust == "NEUTRAL") + return this.getTrustLink() + this.getDistrustLink() + else if (this.trust == "TRUSTED") + return this.getNeutralLink() + this.getDistrustLink() + else + return this.getTrustLink() + this.getNeutralLink() + } + + getTrustLink() { + return "" + + "" + _t("Mark Trusted") + "" + } + + getNeutralLink() { + return "" + _t("Mark Neutral") + "" + } + + getDistrustLink() { + return "" + + "" + _t("Mark Distrusted") + "" + } +} + +class ResultsByFile { + constructor(xmlNode) { + this.name = xmlNode.getElementsByTagName("Name")[0].childNodes[0].nodeValue; + this.infoHash = xmlNode.getElementsByTagName("InfoHash")[0].childNodes[0].nodeValue; + this.size = xmlNode.getElementsByTagName("Size")[0].childNodes[0].nodeValue; + this.downloading = xmlNode.getElementsByTagName("Downloading")[0].childNodes[0].nodeValue; + this.results = new Map(); + var resultNodes = xmlNode.getElementsByTagName("Result"); + var i; + for (i = 0; i < resultNodes.length; i++) { + var result = new ResultByFile(resultNodes[i]); + this.results.set(result.sender, result); + } + } +} + +class ResultBySender { + constructor(xmlNode) { + this.name = xmlNode.getElementsByTagName("Name")[0].childNodes[0].nodeValue; + this.size = xmlNode.getElementsByTagName("Size")[0].childNodes[0].nodeValue; + this.infoHash = xmlNode.getElementsByTagName("InfoHash")[0].childNodes[0].nodeValue; + this.downloading = xmlNode.getElementsByTagName("Downloading")[0].childNodes[0].nodeValue; + this.comment = null; + var comment = xmlNode.getElementsByTagName("Comment") + if (comment.length == 1) + this.comment = comment[0].childNodes[0].nodeValue; + this.certificates = xmlNode.getElementsByTagName("Certificates")[0].childNodes[0].nodeValue + } + + getCertificatesBlock() { + if (this.certificates == "0") + return "" + var linkText = _t("View {0} Certificates", this.certificates) + var link = "" + + linkText + "" + var id = senderB64 + "_" + this.infoHash + var html = "
" + return html + } +} + +class ResultByFile { + constructor(xmlNode) { + this.sender = xmlNode.getElementsByTagName("Sender")[0].childNodes[0].nodeValue; + this.senderB64 = xmlNode.getElementsByTagName("SenderB64")[0].childNodes[0].nodeValue; + this.browse = xmlNode.getElementsByTagName("Browse")[0].childNodes[0].nodeValue; + this.browsing = xmlNode.getElementsByTagName("Browsing")[0].childNodes[0].nodeValue; + this.trust = xmlNode.getElementsByTagName("Trust")[0].childNodes[0].nodeValue; + this.comment = null; + var comment = xmlNode.getElementsByTagName("Comment") + if (comment.length == 1) + this.comment = comment[0].childNodes[0].nodeValue; + this.certificates = xmlNode.getElementsByTagName("Certificates")[0].childNodes[0].nodeValue + } + + getCertificatesBlock() { + if (this.certificates == "0") + return "" + var linkText = _t("View {0} Certificates", this.certificates) + var link = "" + linkText + "" + var id = this.senderB64 + "_" + infoHash + var html = "
" + return html + } + + getTrustLinks() { + if (this.trust == "NEUTRAL") + return this.getTrustLink() + this.getDistrustLink() + else if (this.trust == "TRUSTED") + return this.getNeutralLink() + this.getDistrustLink() + else + return this.getTrustLink() + this.getNeutralLink() + } + + getTrustLink() { + return "" + + "" + _t("Mark Trusted") + "" + } + + getNeutralLink() { + return "" + _t("Mark Neutral") + "" + } + + getDistrustLink() { + return "" + + "" + _t("Mark Distrusted") + "" + } +} + +class Certificate { + constructor(xmlNode) { + this.issuer = xmlNode.getElementsByTagName("Issuer")[0].childNodes[0].nodeVlue + this.name = xmlNode.getElementsByTagName("Name")[0].childNodes[0].nodeVlue + this.comment = null + try { + this.comment = xmlNode.getElementsByTagName("Comment")[0].childNodes[0].nodeVlue + } catch(ignore) {} + this.timestamp = xmlNode.getElementsByTagName("Timestamp")[0].childNodes[0].nodeVlue + this.base64 = xmlNode.getElementsByTagName("Base64")[0].childNodes[0].nodeVlue + } + + renderRow() { + var commentPresent = "false" + if (this.comment != null) + commentPresent = "true" + + var html = "" + html += "" + html += "" + html += "" + html += "" + html += "" + return html + } +} + +class CertificateResponse { + constructor(xmlNode) { + this.status = xmlNode.getElementsByTagName("Status")[0].childNodes[0].nodeValue + this.total = xmlNode.getElementsByTagName("Total")[0].childNodes[0].nodeValue + + var certNodes = xmlNode.getElementsByTagName("Certificates")[0].getElementsByTagName("Certificate") + var i + this.certificates = [] + for (i = 0; i < certNodes.length; i++) { + certificates.push( new Certificate(certNodes[i])) + } + } + + renderTable() { + var html = _t("Status") + " " + this.status + if (this.certificates.length == 0) + return html + + html += " " + html += _t("Certificates") + " " + this.certificates.length + "/" + this.total + + var headers = [_t("Issuer"), _t("Name"), _t("Comment"), _t("Timestamp")] + html += "
" + html += "
" + _t("Sender") + "" + _t("Browse") + "
" + this.issuer + "" + this.name + "" + commentPresent + "" + this.timestamp + "
" + var i + for(i = 0; i < this.certificates.length; i++) { + html += this.certificates[i].renderRow() + } + html += "
" + headers.join("") + "
" + + return html + } +} + +class CertificateFetch { + constructor(senderB64, fileInfoHash) { + this.senderB64 = senderB64 + this.fileInfoHash = fileInfoHash + this.divId = senderB64 + "_" + fileInfoHash + } + + updateTable() { + var xmlhttp = new XMLHttpRequest() + xmlhttp.onreadystatechange = function() { + if (this.readyState == 4 && this.status == 200) { + + var block = document.getElementById("certificates-" + this.divId) + } + } + xmlhttp.open("GET", "/MuWire/Certificate", true) + xmlhttp.send() + } +} + +var statusByUUID = new Map() +var currentSearchBySender = null +var currentSearchByFile = null +var currentSender = null +var currentFile = null +var expandedComments = new Map(); +var certificateFetches = new Map() + +var uuid = null; +var sender = null; +var senderB64 = null +var lastXML = null; +var infoHash = null; + +function showCommentBySender(divId, spanId) { + var split = divId.split("_"); + var commentDiv = document.getElementById(divId); + var comment = "
"+ currentSearchBySender.resultBatches.get(split[2]).results.get(split[3]).comment + "
"; + commentDiv.innerHTML = comment + expandedComments.set(divId, comment); + var hideLink = "" + _t("Hide Comment") + ""; + var linkSpan = document.getElementById(spanId); + linkSpan.innerHTML = hideLink; +} + +function showCommentByFile(divId, spanId) { + var split = divId.split("_"); + var commentDiv = document.getElementById(divId); + var comment = "
"+currentSearchByFile.resultBatches.get(split[2]).results.get(split[3]).comment + "
"; + commentDiv.innerHTML = comment + expandedComments.set(divId, comment); + var hideLink = "" + _t("Hide Comment") + ""; + var linkSpan = document.getElementById(spanId); + linkSpan.innerHTML = hideLink; +} + +function hideComment(divId, spanId, byFile) { + expandedComments.delete(divId); + var commentDiv = document.getElementById(divId); + commentDiv.innerHTML = "" + var showLink = "" + _t("Show Comment") + ""; + var linkSpan = document.getElementById(spanId); + linkSpan.innerHTML = showLink; +} + +function download(resultInfoHash) { + var xmlhttp = new XMLHttpRequest(); + xmlhttp.onreadystatechange = function() { + if (this.readyState == 4 && this.status == 200) { + var resultSpan = document.getElementById("download-"+resultInfoHash); + resultSpan.innerHTML = _t("Downloading"); + } + } + xmlhttp.open("POST", "/MuWire/Download", true); + xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); + xmlhttp.send(encodeURI("action=start&infoHash="+resultInfoHash+"&uuid="+uuid)); +} + +function markTrusted(host) { + var linkSpan = document.getElementById("trusted-link-"+host) + linkSpan.innerHTML = "" + + var textAreaSpan = document.getElementById("trusted-"+host) + + var textbox = "" + var submitLink = "" + _t("Submit") + "" + var cancelLink = "" + _t("Cancel") + "" + + var html = "
Enter Reason (Optional)
" + textbox + "
" + submitLink + " " + cancelLink + "
" + + textAreaSpan.innerHTML = html +} + +function markNeutral(host) { + publishTrust(host, "", "neutral") +} + +function markDistrusted(host) { + var linkSpan = document.getElementById("distrusted-link-"+host) + linkSpan.innerHTML = "" + + var textAreaSpan = document.getElementById("distrusted-"+host) + + var textbox = "" + var submitLink = "" + _t("Submit") + "" + var cancelLink = "" + _t("Cancel") + "" + + var html = "
Enter Reason (Optional)
" + textbox + "
" + submitLink + " " + cancelLink + "
" + + textAreaSpan.innerHTML = html +} + +function submitTrust(host) { + var reason = document.getElementById("trust-reason-"+host).value + publishTrust(host, reason, "trust") +} + +function submitDistrust(host) { + var reason = document.getElementById("trust-reason-"+host).value + publishTrust(host, reason, "distrust") +} + +function cancelTrust(host) { + var textAreaSpan = document.getElementById("trusted-" + host) + textAreaSpan.innerHTML = "" + + var linkSpan = document.getElementById("trusted-link-"+host) + var html = "" + _t("Mark Trusted") + "" + linkSpan.innerHTML = html +} + +function cancelDistrust(host) { + var textAreaSpan = document.getElementById("distrusted-" + host) + textAreaSpan.innerHTML = "" + + var linkSpan = document.getElementById("distrusted-link-"+host) + var html = "" + _t("Mark Distrusted") + "" + linkSpan.innerHTML = html +} + +function publishTrust(host, reason, trust) { + var xmlhttp = new XMLHttpRequest() + xmlhttp.onreadystatechange = function() { + if (this.readyState == 4 && this.status == 200) { + if (refreshType == "Sender") + refreshGroupBySender(uuid) + else if (refreshType == "File") + refreshGroupByFile(uuid) + } + } + xmlhttp.open("POST","/MuWire/Trust", true) + xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); + xmlhttp.send("action=" + trust + "&reason=" + reason + "&persona=" + host) +} + +function updateSender(senderName) { + sender = senderName; + + var resultsFromSpan = document.getElementById("resultsFrom"); + resultsFromSpan.innerHTML = _t("Results From {0}", sender); + + var resultsDiv = document.getElementById("bottomTable"); + var table = "" + var x = currentSearchBySender + var senderBatch = x.resultBatches.get(sender) + senderB64 = senderBatch.senderB64 + x = senderBatch.results; + for (var [resultInfoHash, result] of x) { + table += ""; + table += ""; + table += ""; + table += ""; + table += ""; + } + table += "
" + _t("Name") + "" + _t("Size") + "" + _t("Download") + "
"; + table += result.name; + if (result.comment != null) { + var divId = "comment_" + uuid + "_" + senderName + "_" + resultInfoHash; + var spanId = "comment-link-"+resultInfoHash + senderName + uuid; + var comment = expandedComments.get(divId); + if (comment != null) { + var link = "" + _t("Hide Comment") + ""; + table += "
" + link + "
"; + table += "
"+comment+"
"; + } else { + var link = "" + _t("Show Comment") + ""; + table += "
"+link+""; + table += "
"; + } + } + table += result.getCertificatesBlock() + table += "
"; + table += result.size; + table += ""; + if (result.downloading == "false") { + table += "" + _t("Download") + ""; + } else { + table += _t("Downloading"); + } + table += "
"; + if (x.size > 0) + resultsDiv.innerHTML = table; +} + +function updateFile(fileInfoHash) { + infoHash = fileInfoHash; + + var searchResults = currentSearchByFile.resultBatches.get(infoHash); + + var resultsFromSpan = document.getElementById("resultsFrom"); + resultsFromSpan.innerHTML = "Results For "+searchResults.name; + + var resultsDiv = document.getElementById("bottomTable"); + var table = ""; + var i; + for (var [senderName, result] of searchResults.results) { + table += ""; + table += ""; + if (result.browse == "true") { + if (result.browsing == "true") + table += "" + else { + table += "" + } + } + table += "" + table += ""; + } + table += "
" + _t("Sender") + "" + _t("Browse") + "
"; + table += senderName + if (result.comment != null) { + var divId = "comment_" + uuid + "_" + fileInfoHash + "_" + senderName; + var spanId = "comment-link-" + fileInfoHash + senderName + uuid; + var comment = expandedComments.get(divId); + if (comment != null) { + var link = "" + _t("Hide Comment") + ""; + table += "
" + link + "
"; + table += "
"+comment+"
"; + } else { + var link = "" + _t("Show Comment") + ""; + table += "
"+link+""; + table += "
"; + } + } + table += result.getCertificatesBlock() + table += "
" + _t("Browsing") + "" + getBrowseLink(result.senderB64) + "" + result.trust + " " + result.getTrustLinks() + "
"; + if (searchResults.results.size > 0) + resultsDiv.innerHTML = table; +} + +function updateUUIDBySender(resultUUID) { + uuid = resultUUID; + + var currentStatus = statusByUUID.get(uuid) + + var currentSearchSpan = document.getElementById("currentSearch"); + currentSearchSpan.innerHTML = currentStatus.query + " Results"; + + var sendersDiv = document.getElementById("topTable"); + var table = ""; + var x = currentSearchBySender.resultBatches; + for (var [senderName, senderBatch] of x) { + table += ""; + if (senderBatch.browse == "true") { + if (senderBatch.browsing == "true") + table += "" + else + table += "" + } + table += "" + table += ""; + } + table += "
" + _t("Sender") + "" + _t("Browse") + "" + _t("Trust") + "
" + table += senderName; + table += "" + _t("Browsing") + "" + getBrowseLink(senderBatch.senderB64) + "" + senderBatch.trust + " "+senderBatch.getTrustLinks() + "
"; + if (x.size > 0) + sendersDiv.innerHTML = table; + if (sender != null) + updateSender(sender); +} + +function updateUUIDByFile(resultUUID) { + uuid = resultUUID; + + var currentStatus = statusByUUID.get(uuid) + + var currentSearchSpan = document.getElementById("currentSearch"); + currentSearchSpan.innerHTML = _t("Results for {0}", currentStatus.query) + + var topTableDiv = document.getElementById("topTable"); + var table = ""; + var x = currentSearchByFile.resultBatches; + for (var [fileInfoHash, file] of x) { + table += ""; + table += ""; + table += ""; + } + table += "
" + _t("Name") + "" + _t("Size") + "" + _t("Download") + "
"; + table += file.name; + table += ""; + table += file.size; + table += ""; + if (file.downloading == "false") + table += "" + _t("Download") + ""; + else + table += _t("Downloading"); + table += "
"; + if (x.size > 0) + topTableDiv.innerHTML = table; + if (infoHash != null) + updateFile(infoHash); +} + +function refreshGroupBySender(searchUUID) { + var xmlhttp = new XMLHttpRequest(); + xmlhttp.onreadystatechange = function () { + if (this.readyState == 4 && this.status == 200) { + var xmlDoc = this.responseXML; + currentSearchBySender = new SearchBySender(xmlDoc) + updateUUIDBySender(searchUUID); + } + } + xmlhttp.open("GET", "/MuWire/Search?section=groupBySender&uuid="+searchUUID, true); + xmlhttp.send(); +} + +function refreshGroupByFile(searchUUID) { + var xmlhttp = new XMLHttpRequest(); + xmlhttp.onreadystatechange = function () { + if (this.readyState == 4 && this.status == 200) { + var xmlDoc = this.responseXML; + + currentSearchByFile = new SearchByFile(xmlDoc) + updateUUIDByFile(searchUUID) + } + } + xmlhttp.open("GET", "/MuWire/Search?section=groupByFile&uuid="+searchUUID, true); + xmlhttp.send(); +} + +function getBrowseLink(host) { + return "" + _t("Browse") + "" +} + +function browse(host) { + var xmlhttp = new XMLHttpRequest() + xmlhttp.onreadystatechange = function() { + if (this.readyState == 4 && this.status == 200) { + var linkSpan = document.getElementById("browse-link-"+host) + linkSpan.innerHTML = _t("Browsing"); + } + } + xmlhttp.open("POST", "/MuWire/Browse", true) + xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); + xmlhttp.send("action=browse&host="+host) +} + +function viewCertificatesByFile(fileSenderB64, count) { + var fetch = new CertificateFetch(fileSenderB64, infoHash) + certificateFetches.set(fetch.divId, fetch) + + var linkSpan = document.getElementById("certificates-link-" + fetch.divId) + var hideLink = "" + _t("Hide Certificates") + "" + linkSpan.innerHTML = hideLink + + var fetchSpan = document.getElementById("certificates-" + fetch.divId) + fetchSpan.innerHTML = _t("Fetching Certificates") +} + +function hideCertificatesByFile(fileSenderB64, count) { + var id = fileSenderB64 + "_" + infoHash + certificateFetches.delete(id) // TODO: propagate cancel to core + + var fetchSpan = document.getElementById("certificates-" + id) + fetchSpan.innerHTML = "" + + var linkSpan = document.getElementById("certificates-link-" + id) + var linkText = _t("View {0} Certificates", count) + var showLink = "" + linkText + "" + linkSpan.innerHTML = showLink +} + +function viewCertificatesBySender(fileInfoHash, count) { + var fetch = new CertificateFetch(senderB64, fileInfoHash) + certificateFetches.set(fetch.divId, fetch) + + var linkSpan = document.getElementById("certificates-link-" + fetch.divId) + var hideLink = "" + + _t("Hide Certificates") + "" + linkSpan.innerHTML = hideLink + + var fetchSpan = document.getElementById("certificates-" + fetch.divId) + fetchSpan.innerHTML = _t("Fetching Certificates") +} + +function hideCertificatesBySender(fileInfoHash, count) { + var id = senderB64 + "_" + fileInfoHash + certificateFetches.delete(id) // TODO: propagate cancel to core + + var fetchSpan = document.getElementById("certificates-" + id) + fetchSpan.innerHTML = "" + + var linkSpan = document.getElementById("certificates-link-" + id) + var linkText = _t("View {0} Certificates", count) + var showLink = "" + + linkText + "" + linkSpan.innerHTML = showLink +} + +function refreshStatus() { + var xmlhttp = new XMLHttpRequest() + xmlhttp.onreadystatechange = function() { + if (this.readyState == 4 && this.status == 200) { + var currentSearch = null + if (uuid != null) + currentSearch = statusByUUID.get(uuid) + statusByUUID.clear() + + var activeSearches = this.responseXML.getElementsByTagName("Search") + var i + for(i = 0; i < activeSearches.length; i++) { + var searchStatus = new SearchStatus(activeSearches[i]) + statusByUUID.set(searchStatus.uuid, searchStatus) + } + + + var table = "" + for (var [searchUUID, status] of statusByUUID) { + table += "" + table += "" + table += "" + table += "" + table += "" + } + table += "
" + _t("Query") + "" + _t("Senders") + "" + _t("Results") + "
" + "" + status.query + "" + status.senders + "" + status.results + "
" + + var activeDiv = document.getElementById("activeSearches") + activeDiv.innerHTML = table + + if (uuid != null) { + var newStatus = statusByUUID.get(uuid) + if (newStatus.revision > currentSearch.revision) + refreshFunction(uuid) + } + } + } + xmlhttp.open("GET", "/MuWire/Search?section=status", true) + xmlhttp.send() +} + +var refreshFunction = null +var refreshType = null + +function initGroupBySender() { + refreshFunction = refreshGroupBySender + refreshType = "Sender" + setInterval(refreshStatus, 3000); + setTimeout(refreshStatus, 1); +} + +function initGroupByFile() { + refreshFunction = refreshGroupByFile + refreshType = "File" + setInterval ( refreshStatus, 3000); + setTimeout ( refreshStatus, 1); +} diff --git a/webui/src/main/js/translate.js b/webui/src/main/js/translate.js index ec18e1ba..a8d0345a 100644 --- a/webui/src/main/js/translate.js +++ b/webui/src/main/js/translate.js @@ -21,10 +21,9 @@ function _t(s) { // p will replace {0} function _t(s, p) { var rv = translations.get(s); - if (rv != null) { - rv = rv.replace("{0}", p); - } else { + if (rv == null) { rv = s; } + rv = rv.replace("{0}", p); return rv; } diff --git a/webui/src/main/webapp/sidebar.jsi b/webui/src/main/webapp/sidebar.jsi index d1fb53ae..f4bf306c 100644 --- a/webui/src/main/webapp/sidebar.jsi +++ b/webui/src/main/webapp/sidebar.jsi @@ -1,8 +1,12 @@