Files
muwire/webui/src/main/js/search.js

911 lines
30 KiB
JavaScript

class SearchStatus {
constructor(xmlNode) {
this.revision = parseInt(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
}
getMapping() {
var mapping = new Map()
var trimmedQuery = this.query
if (this.query.length > 19)
trimmedQuery = this.query.slice(0, 19) + "…"
var queryLink = new Link(trimmedQuery, "refresh" + refreshType, [this.uuid])
var stopLink = new Link("[X]", "stopSearch", [this.uuid])
var resultsSnippet = ""
if (this.results > 0)
resultsSnippet = " <b>(" + this.results + ")</b>"
var queryHtml = queryLink.render() + resultsSnippet + "<span class='right'>" + stopLink.render() + "</span>"
mapping.set("Query", queryHtml)
return mapping
}
}
class Sender {
constructor(xmlNode) {
this.name = xmlNode.getElementsByTagName("Name")[0].childNodes[0].nodeValue
this.b64 = xmlNode.getElementsByTagName("B64")[0].childNodes[0].nodeValue
this.trust = xmlNode.getElementsByTagName("Trust")[0].childNodes[0].nodeValue
this.browse = xmlNode.getElementsByTagName("Browse")[0].childNodes[0].nodeValue
this.feed = xmlNode.getElementsByTagName("Feed")[0].childNodes[0].nodeValue
this.subscribed = xmlNode.getElementsByTagName("Subscribed")[0].childNodes[0].nodeValue
this.browsing = xmlNode.getElementsByTagName("Browsing")[0].childNodes[0].nodeValue
this.results = xmlNode.getElementsByTagName("Results")[0].childNodes[0].nodeValue
}
getMapping() {
var mapping = new Map()
mapping.set("Sender", this.getSenderLink())
mapping.set("Results", this.results)
var trustActionHtml = "<span class='dropdown'><a class='droplink'>" + _t("Actions") + "</a><div class='dropdown-content-right'>" +
this.getTrustLinks() +
"</div></span>"
var trustHtml = "<span class='center'>" + this.trust + " " + trustActionHtml + "</span>"
trustHtml += "<div class='centercomment' id='trusted-" + this.b64 + "'></div>"
trustHtml += "<div class='centercomment' id='distrusted-" + this.b64 + "'></div>"
mapping.set("Trust", trustHtml)
mapping.set("Browse", this.getBrowseBlock())
mapping.set("Feed", this.getFeedBlock())
return mapping
}
getSenderLink() {
return "<a href='#' onclick='window.refreshResultsFromSender(\"" + this.b64 + "\");return false'>" + this.name + "</a>"
}
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 "<span id='trusted-link-" + this.b64 + "'>" +
"<a href='#' onclick='window.markTrusted(\"" +
this.b64 + "\"); return false;'>" + _t("Mark Trusted") + "</a></span>"
}
getNeutralLink() {
return "<a href'#' onclick='window.markNeutral(\"" + this.b64 + "\"); return false;'>" + _t("Mark Neutral") + "</a>"
}
getDistrustLink() {
return "<span id='distrusted-link-" + this.b64 + "'>" +
"<a href='#' onclick='window.markDistrusted(\"" +
this.b64 + "\"); return false;'>" + _t("Mark Distrusted") + "</a></span>"
}
getBrowseBlock() {
if (this.browse == "false")
return ""
if (this.browsing == "true")
return "<a href='/MuWire/BrowseHost?currentHost=" + this.b64 + "'>" + _t("Browsing") + "</a>"
var link = "<a href='#' onclick='window.browse(\"" + this.b64 + "\"); return false;'>" + _t("Browse") + "</a>"
var block = "<span id='browse-link-" + this.b64 + "'>" + link + "</span>"
return block
}
getFeedBlock() {
if (this.feed != "true")
return ""
if (this.subscribed == "true")
return "<a href='/MuWire/Feeds'>" + _t("Subscribed") + "</a>"
var link = new Link(_t("Subscribe"), "subscribe", [this.b64])
return "<span id='subscribe-link-" + this.b64 + "'>" + link.render() + "</span>"
}
}
class Senders {
constructor(xmlNode) {
this.senders = []
this.sendersMap = new Map()
var senderNodes = xmlNode.getElementsByTagName("Sender")
var i
for (i = 0; i < senderNodes.length; i++) {
var sender = new Sender(senderNodes[i])
this.senders.push(sender)
this.sendersMap.set(sender.b64, sender)
}
}
render() {
var newOrder
if (sendersSortOrder == "descending")
newOrder = "ascending"
else if (sendersSortOrder == "ascending")
newOrder = "descending"
var table = new Table(["Sender", "Browse", "Feed", "Results", "Trust"], "sortSendersTable", sendersSortKey, newOrder, null)
var i
for (i = 0; i < this.senders.length; i++) {
table.addRow(this.senders[i].getMapping())
}
return table.render()
}
}
class ResultFromSender {
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.resultStatus = xmlNode.getElementsByTagName("ResultStatus")[0].childNodes[0].nodeValue
this.comment = null
try {
this.comment = xmlNode.getElementsByTagName("Comment")[0].childNodes[0].nodeValue
} catch (ignored) {}
this.certificates = xmlNode.getElementsByTagName("Certificates")[0].childNodes[0].nodeValue
}
getMapping() {
var mapping = new Map()
var nameHtml = this.name
nameHtml += this.getCommentBlock()
nameHtml += this.getCertificatesBlock()
mapping.set("Name", nameHtml)
mapping.set("Size", this.size)
mapping.set("Download", this.getDownloadBlock())
return mapping
}
getCommentBlock() {
if (this.comment == null)
return ""
if (expandedComments.get(this.infoHash)) {
var html = "<div id='comment-link-" + this.infoHash + "'>"
html += "<a href='#' onclick='window.hideComment(\"" + this.infoHash + "\");return false;'>"
html += _t("Hide Comment")
html += "</a>"
html += "</div>"
html += "<div id='comment-" + this.infoHash + "'>"
html += "<pre class='comment'>" + this.comment + "</pre>"
html += "</div>"
return html
} else {
var html = "<div id='comment-link-" + this.infoHash + "'>"
html += "<a href='#' onclick='window.showCommentBySender(\"" + this.infoHash + "\");return false;'>"
html += _t("Show Comment")
html += "</a>"
html += "</div>"
html += "<div id='comment-" + this.infoHash + "'></div>"
return html
}
}
getCertificatesBlock() {
if (this.certificates == "0")
return ""
var id = currentSender + "_" + this.infoHash
var linkText = _t("View {0} Certificates", this.certificates)
var link = "<a href='#' onclick='viewCertificatesBySender(\"" + this.infoHash + "\",\"" + this.certificates + "\");return false'>" + linkText + "</a>"
var linkBlock = "<div id='certificates-link-" + id + "'>" + link + "</div>"
var certBlock = "<div id='certificates-" + id + "'></div>"
return linkBlock + certBlock
}
getDownloadBlock() {
if (this.resultStatus == "DOWNLOADING")
return "<a href='/MuWire/Downloads'>" + _t("Downloading") + "</a>"
if (this.resultStatus == "SHARED")
return "<a href='/MuWire/SharedFiles'>" + _t("Downloaded") + "</a>"
var link = "<a href='#' onclick='window.download(\"" + this.infoHash + "\");return false;'>" + _t("Download") + "</a>"
var block = "<span id='download-" + this.infoHash + "'>" + link + "</span>"
return block
}
}
class ResultsFromSender {
constructor(xmlNode) {
this.resultsFromSender = []
this.resultsMap = new Map()
var resultNodes = xmlNode.getElementsByTagName("Result")
var i
for (i = 0; i < resultNodes.length; i++) {
var result = new ResultFromSender(resultNodes[i])
this.resultsFromSender.push(result)
this.resultsMap.set(result.infoHash, result)
}
}
render() {
var newOrder
if (resultsFromSenderSortOrder == "descending")
newOrder = "ascending"
else if (resultsFromSenderSortOrder == "ascending")
newOrder = "descending"
var table = new Table(["Name","Size","Download"], "sortResultsFromSenderTable", resultsFromSenderSortKey, newOrder, null)
var i
for (i = 0 ; i < this.resultsFromSender.length; i++) {
table.addRow(this.resultsFromSender[i].getMapping())
}
return table.render()
}
}
class Result {
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.resultStatus = xmlNode.getElementsByTagName("ResultStatus")[0].childNodes[0].nodeValue
this.sources = xmlNode.getElementsByTagName("Sources")[0].childNodes[0].nodeValue
}
getMapping() {
var mapping = new Map()
mapping.set("Name", this.getNameBlock())
mapping.set("Size", this.size)
mapping.set("Download", this.getDownloadBlock())
mapping.set("Sources", this.sources)
return mapping
}
getNameBlock() {
return "<a href='#' onclick='window.refreshSendersForResult(\"" + this.infoHash + "\");return false;'>" + this.name + "</a>"
}
getDownloadBlock() {
if (this.resultStatus == "DOWNLOADING")
return "<a href='/MuWire/Downloads'>" + _t("Downloading") + "</a>"
if (this.resultStatus == "SHARED")
return "<a href='/MuWire/SharedFiles'>" + _t("Downloaded") + "</a>"
var link = "<a href='#' onclick='window.download(\"" + this.infoHash + "\");return false;'>" + _t("Download") + "</a>"
var block = "<span id='download-" + this.infoHash + "'>" + link + "</span>"
return block
}
}
class Results {
constructor(xmlNode) {
this.results = []
this.resultsMap = new Map()
var resultNodes = xmlNode.getElementsByTagName("Result")
var i
for (i = 0; i < resultNodes.length; i++) {
var result = new Result(resultNodes[i])
this.results.push(result)
this.resultsMap.set(result.infoHash, result)
}
}
render() {
var newOrder
if(resultsSortOrder == "descending")
newOrder = "ascending"
else if (resultsSortOrder == "ascending")
newOrder = "descending"
var table = new Table(["Name","Size","Sources","Download"], "sortResultsTable", resultsSortKey, newOrder, null)
var i
for (i = 0; i < this.results.length; i++) {
table.addRow(this.results[i].getMapping())
}
return table.render()
}
}
class SenderForResult {
constructor(xmlNode) {
this.name = xmlNode.getElementsByTagName("Name")[0].childNodes[0].nodeValue
this.b64 = xmlNode.getElementsByTagName("B64")[0].childNodes[0].nodeValue
this.browse = xmlNode.getElementsByTagName("Browse")[0].childNodes[0].nodeValue
this.browsing = xmlNode.getElementsByTagName("Browsing")[0].childNodes[0].nodeValue
this.feed = xmlNode.getElementsByTagName("Feed")[0].childNodes[0].nodeValue
this.subscribed = xmlNode.getElementsByTagName("Subscribed")[0].childNodes[0].nodeValue
this.trust = xmlNode.getElementsByTagName("Trust")[0].childNodes[0].nodeValue
this.comment = null
try {
this.comment = xmlNode.getElementsByTagName("Comment")[0].childNodes[0].nodeValue
} catch (ignored) {}
this.certificates = xmlNode.getElementsByTagName("Certificates")[0].childNodes[0].nodeValue
}
getMapping() {
var mapping = new Map()
mapping.set("Sender", this.getNameBlock())
mapping.set("Browse", this.getBrowseBlock())
mapping.set("Feed", this.getFeedBlock())
mapping.set("Trust", this.getTrustBlock())
return mapping
}
getNameBlock() {
return this.name + this.getCommentBlock() + this.getCertificatesBlock()
}
getCommentBlock() {
if (this.comment == null)
return ""
if (expandedComments.get(this.b64)) {
var html = "<div id='comment-link-" + this.b64 + "'>"
html += "<a href='#' onclick='window.hideComment(\"" + this.b64 + "\");return false;'>"
html += _t("Hide Comment")
html += "</a>"
html += "</div>"
html += "<div id='comment-" + this.b64 + "'>"
html += "<pre class='comment'>" + this.comment + "</pre>"
html += "</div>"
return html
} else {
var link = "<a href='#' onclick='showCommentByFile(\"" + this.b64 + "\");return false;'>" + _t("Show Comment") + "</a>"
var block = "<div id='comment-link-" + this.b64 + "'>" + link + "</div>"
block += "<div id='comment-" + this.b64 + "'></div>"
return block
}
}
getCertificatesBlock() {
if (this.certificates == "0")
return ""
var linkText
if (this.certificates == "1")
linkText = _t("View 1 Certificate")
else
linkText = _t("View {0} Certificates", this.certificates)
var id = this.b64 + "_" + currentResult
var link = "<a href='#' onclick='window.viewCertificatesByFile(\"" + this.b64 + "\",\"" + this.certificates + "\");return false;')>" + linkText + "</a>"
var linkBlock = "<div id='certificates-link-" + id + "'>" + link + "</div>"
var certBlock = "<div id='certificates-" + id + "'></div>"
return linkBlock + certBlock
}
getBrowseBlock() {
if (this.browse != "true")
return ""
if (this.browsing == "true")
return "<a href='/MuWire/BrowseHost'>" + _t("Browsing") + "</a>"
var link = "<a href='#' onclick='window.browse(\"" + this.b64 + "\");return false;'>" + _t("Browse") + "</a>"
var block = "<span id='browse-link-" + this.b64 + "'>" + link + "</span>"
return block
}
getFeedBlock() {
if (this.feed != "true")
return ""
if (this.subscribed == "true")
return "<a href='/MuWire/Feeds'>" + _t("Subscribed") + "</a>"
var link = new Link(_t("Subscribe"), "subscribe", [this.b64])
return "<span id='subscribe-link-" + this.b64 + "'>" + link.render() + "</span>"
}
getTrustBlock() {
var dropdownBlock = "<span class='dropdown'><a class='droplink'>" + _t("Actions") + "</a><div class='dropdown-content-right'>" +
this.getTrustLinks() +
"</div></span>"
return "<span class='center'>"+ this.trust + " "+ dropdownBlock + "</span>" +
"<div class='centercomment' id='trusted-" + this.b64 + "'></div>" +
"<div class='centercomment' id='distrusted-" + this.b64 + "'></div>"
}
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 "<span id='trusted-link-" + this.b64 + "'>" +
"<a href='#' onclick='window.markTrusted(\"" +
this.b64 + "\"); return false;'>" + _t("Mark Trusted") + "</a></span>"
}
getNeutralLink() {
return "<a href'#' onclick='window.markNeutral(\"" + this.b64 + "\"); return false;'>" + _t("Mark Neutral") + "</a>"
}
getDistrustLink() {
return "<span id='distrusted-link-" + this.b64 + "'>" +
"<a href='#' onclick='window.markDistrusted(\"" +
this.b64 + "\"); return false;'>" + _t("Mark Distrusted") + "</a></span>"
}
}
class SendersForResult {
constructor(xmlNode) {
this.sendersForResult = []
this.sendersMap = new Map()
var senderNodes = xmlNode.getElementsByTagName("Sender")
var i
for (i = 0; i < senderNodes.length; i++) {
var sender = new SenderForResult(senderNodes[i])
this.sendersForResult.push(sender)
this.sendersMap.set(sender.b64, sender)
}
}
render() {
var newOrder
if (sendersForResultSortOrder == "descending")
newOrder = "ascending"
else if (sendersForResultSortOrder == "ascending")
newOrder = "descending"
var table = new Table(["Sender", "Browse", "Feed", "Trust"], "sortSendersForResultTable", sendersForResultSortKey, newOrder, null)
var i
for (i = 0; i < this.sendersForResult.length; i++) {
table.addRow(this.sendersForResult[i].getMapping())
}
return table.render()
}
}
// sort fields
var sendersSortKey
var sendersSortOrder
var resultsFromSenderSortKey
var resultsFromSenderSortOrder
var resultsSortKey
var resultsSortOrder
var sendersForResultSortKey
var sendersForResultSortOrder
var statusKey = null
var statusOrder = null
// global fields
var senders
var currentSender
var resultsFromSender
var results
var currentResult
var sendersForResult
// expanded comments
var expandedComments = new Map()
// status fields
var uuid = null;
var statusByUUID = new Map()
// pointers based on current view type
var refreshFunction = null
var refreshType = null
function sortSendersTable(key, order) {
sendersSortKey = key
sendersSortOrder = order
refreshSender(uuid)
}
function sortResultsTable(key, order) {
resultsSortKey = key
resultsSortOrder = order
refreshFile(uuid)
}
function sortResultsFromSenderTable(key, order) {
resultsFromSenderSortKey = key
resultsFromSenderSortOrder = order
refreshResultsFromSender(currentSender)
}
function sortSendersForResultTable(key, order) {
sendersForResultSortKey = key
sendersForResultSortOrder = order
refreshSendersForResult(currentResult)
}
function showCommentBySender(infoHash) {
expandedComments.set(infoHash, true)
var commentText = resultsFromSender.resultsMap.get(infoHash).comment
var commentDiv = document.getElementById("comment-" + infoHash);
var comment = "<pre class='comment'>"+ commentText + "</pre>";
commentDiv.innerHTML = comment
var hideLink = "<a href='#' onclick='window.hideComment(\"" + infoHash + "\");return false;'>" + _t("Hide Comment") + "</a>";
var linkSpan = document.getElementById("comment-link-" + infoHash);
linkSpan.innerHTML = hideLink;
}
function showCommentByFile(b64) {
expandedComments.set(b64, true)
var commentText = sendersForResult.sendersMap.get(b64).comment
var commentDiv = document.getElementById("comment-" + b64)
var comment = "<pre class='comment'>" + commentText + "</pre>"
commentDiv.innerHTML = comment
var hideLink = "<a href='#' onclick='window.hideComment(\"" + b64 + "\");return false;'>" + _t("Hide Comment") + "</a>";
var linkSpan = document.getElementById("comment-link-" + b64);
linkSpan.innerHTML = hideLink;
}
function hideComment(id) {
expandedComments.delete(id)
var commentDiv = document.getElementById("comment-" + id);
commentDiv.innerHTML = ""
var showLink = "<a href='#' onclick='window.showCommentBy" + refreshType + "(\"" + id + "\"); return false;'>" + _t("Show Comment") + "</a>";
var linkSpan = document.getElementById("comment-link-"+id);
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 = "<a href='/MuWire/Downloads'>" + _t("Downloading") + "</a>"
}
}
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 = "<textarea id='trust-reason-" + host + "'></textarea>"
var submitLink = "<a href='#' onclick='window.submitTrust(\"" + host + "\");return false;'>" + _t("Submit") + "</a>"
var cancelLink = "<a href='#' onclick='window.cancelTrust(\"" + host + "\");return false;'>" + _t("Cancel") + "</a>"
var html = "<br/>" + _t("Enter Reason (Optional)") + "<br/>" + textbox + "<br/>" + submitLink + " " + cancelLink + "<br/>"
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 = "<textarea id='distrust-reason-" + host + "'></textarea>"
var submitLink = "<a href='#' onclick='window.submitDistrust(\"" + host + "\");return false;'>" + _t("Submit") + "</a>"
var cancelLink = "<a href='#' onclick='window.cancelDistrust(\"" + host + "\");return false;'>" + _t("Cancel") + "</a>"
var html = "<br/>" + _t("Enter Reason (Optional)") + "<br/>" + textbox + "<br/>" + submitLink + " " + cancelLink + "<br/>"
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("distrust-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 = "<a href='#' onclick='markTrusted(\"" + host + "\"); return false;'>" + _t("Mark Trusted") + "</a>"
linkSpan.innerHTML = html
}
function cancelDistrust(host) {
var textAreaSpan = document.getElementById("distrusted-" + host)
textAreaSpan.innerHTML = ""
var linkSpan = document.getElementById("distrusted-link-"+host)
var html = "<a href='#' onclick='markDistrusted(\"" + host + "\"); return false;'>" + _t("Mark Distrusted") + "</a>"
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")
refreshSender(uuid, true)
else if (refreshType == "File")
refreshFile(uuid, true)
}
}
xmlhttp.open("POST","/MuWire/Trust", true)
xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xmlhttp.send("action=" + trust + "&reason=" + reason + "&persona=" + host)
}
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 = "<a href='/MuWire/BrowseHost?currentHost=" + host+ "'>" + _t("Browsing") + "</a>"
}
}
xmlhttp.open("POST", "/MuWire/Browse", true)
xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xmlhttp.send("action=browse&host="+host)
}
function subscribe(host) {
var xmlhttp = new XMLHttpRequest()
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var linkSpan = document.getElementById("subscribe-link-" + host)
linkSpan.innerHTML = "<a href='/MuWire/Feeds'>" + _t("Subscribed") + "</a>"
}
}
xmlhttp.open("POST", "/MuWire/Feed", true)
xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xmlhttp.send("action=subscribe&host=" + host)
}
function viewCertificatesByFile(fileSenderB64, count) {
var fetch = new CertificateFetch(fileSenderB64, currentResult)
certificateFetches.set(fetch.divId, fetch)
var xmlhttp = new XMLHttpRequest()
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var linkSpan = document.getElementById("certificates-link-" + fetch.divId)
var hideLink = "<a href='#' onclick='window.hideCertificatesByFile(\"" + fileSenderB64 + "\",\"" + count + "\");return false;'>" + _t("Hide Certificates") + "</a>"
linkSpan.innerHTML = hideLink
var fetchSpan = document.getElementById("certificates-" + fetch.divId)
fetchSpan.innerHTML = _t("Fetching Certificates")
}
}
xmlhttp.open("POST", "/MuWire/Certificate", true)
xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xmlhttp.send("action=fetch&user=" + fileSenderB64 + "&infoHash=" + currentResult)
}
function hideCertificatesByFile(fileSenderB64, count) {
var id = fileSenderB64 + "_" + currentResult
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
if (count == "1")
linkText = _t("View 1 Certificate")
else
linkText = _t("View {0} Certificates", count)
var showLink = "<a href='#' onclick='window.viewCertificatesByFile(\"" + fileSenderB64 + "\",\"" + count + "\");return false;'>" + linkText + "</a>"
linkSpan.innerHTML = showLink
}
function viewCertificatesBySender(fileInfoHash, count) {
var fetch = new CertificateFetch(currentSender, fileInfoHash)
certificateFetches.set(fetch.divId, fetch)
var xmlhttp = new XMLHttpRequest()
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var linkSpan = document.getElementById("certificates-link-" + fetch.divId)
var hideLink = "<a href='#' onclick='window.hideCertificatesBySender(\"" + fileInfoHash + "\",\"" + count + "\");return false;'>" +
_t("Hide Certificates") + "</a>"
linkSpan.innerHTML = hideLink
var fetchSpan = document.getElementById("certificates-" + fetch.divId)
fetchSpan.innerHTML = _t("Fetching Certificates")
}
}
xmlhttp.open("POST", "/MuWire/Certificate", true)
xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xmlhttp.send("action=fetch&user=" + currentSender + "&infoHash=" + fileInfoHash)
}
function hideCertificatesBySender(fileInfoHash, count) {
var id = currentSender + "_" + 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 = "<a href='#' onclick='window.viewCertificatesBySender(\"" + fileInfoHash + "\",\"" + count + "\");return false;'>" +
linkText + "</a>"
linkSpan.innerHTML = showLink
}
function refreshResultsFromSender(sender) {
currentSender = sender
var xmlhttp = new XMLHttpRequest()
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
resultsFromSender = new ResultsFromSender(this.responseXML)
var tableHtml = resultsFromSender.render()
var bottomTableDiv = document.getElementById("bottomTableSender")
bottomTableDiv.innerHTML = tableHtml
}
}
var sortParam = "&key=" + resultsFromSenderSortKey + "&order=" + resultsFromSenderSortOrder
xmlhttp.open("GET", "/MuWire/Search?section=resultsFromSender&uuid=" + uuid + "&sender=" + sender + sortParam)
xmlhttp.send()
}
function refreshSendersForResult(result) {
currentResult = result
var xmlhttp = new XMLHttpRequest()
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
sendersForResult = new SendersForResult(this.responseXML)
var tableHtml = sendersForResult.render()
var bottomTableDiv = document.getElementById("bottomTableFile")
bottomTableDiv.innerHTML = tableHtml
}
}
var sortParam = "&key=" + sendersForResultSortKey + "&order=" + sendersForResultSortOrder
xmlhttp.open("GET", "/MuWire/Search?section=sendersForResult&uuid=" + uuid + "&infoHash=" + currentResult + sortParam)
xmlhttp.send()
}
function refreshSender(searchUUID) {
uuid = searchUUID
var xmlhttp = new XMLHttpRequest()
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
senders = new Senders(this.responseXML)
var tableHtml = senders.render()
var topTableDiv = document.getElementById("topTableSender")
topTableDiv.innerHTML = tableHtml
if (currentSender != null)
refreshResultsFromSender(currentSender)
}
}
var sortParam = "&key=" + sendersSortKey + "&order=" + sendersSortOrder
xmlhttp.open("GET", "/MuWire/Search?section=senders&uuid=" + uuid + sortParam, true)
xmlhttp.send()
}
function refreshFile(searchUUID) {
uuid = searchUUID
var xmlhttp = new XMLHttpRequest()
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
results = new Results(this.responseXML)
var tableHtml = results.render()
var topTableDiv = document.getElementById("topTableFile")
topTableDiv.innerHTML = tableHtml
if (currentResult != null)
refreshSendersForResult(currentResult)
}
}
var sortParam = "&key=" + resultsSortKey + "&order=" + resultsSortOrder
xmlhttp.open("GET", "/MuWire/Search?section=results&uuid=" + uuid + sortParam, true)
xmlhttp.send()
}
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 statuses = []
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)
statuses.push(searchStatus)
}
var newOrder
if (statusOrder == "descending")
newOrder = "ascending"
else
newOrder = "descending"
var table = new Table(["Query"], "sortStatuses", statusKey, newOrder, null)
for (i = 0; i < statuses.length; i++) {
var status = statuses[i]
table.addRow(status.getMapping())
}
var activeDiv = document.getElementById("activeSearches")
if (statuses.length > 0)
activeDiv.innerHTML = table.render()
else
activeDiv.innerHTML = ""
if (uuid != null) {
var newStatus = statusByUUID.get(uuid)
if (currentSearch == null || newStatus.revision > currentSearch.revision)
refreshFunction(uuid)
}
}
}
var params = "section=status&key=" + statusKey + "&order=" + statusOrder
xmlhttp.open("GET", "/MuWire/Search?" + params, true)
xmlhttp.send()
}
function sortStatuses(key, order) {
statusKey = key
statusOrder = order
refreshStatus()
}
function stopSearch(searchUUID) {
var xmlhttp = new XMLHttpRequest()
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
if (searchUUID == uuid) {
uuid = null
var element = document.getElementById("topTable" + refreshType)
element.innerHTML = ""
element = document.getElementById("bottomTable" + refreshType)
element.innerHTML = ""
}
refreshStatus()
}
}
xmlhttp.open("POST", "/MuWire/Search", true)
xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xmlhttp.send("action=stop&uuid=" + searchUUID)
}
function initGroupBySender() {
refreshFunction = refreshSender
refreshType = "Sender"
sendersSortKey = "Sender"
sendersSortOrder = "descending"
resultsFromSenderSortKey = "Name"
resultsFromSenderSortOrder = "descending"
setInterval(refreshStatus, 3000);
setTimeout(refreshStatus, 1);
}
function initGroupByFile() {
refreshFunction = refreshFile
refreshType = "File"
resultsSortKey = "Name"
resultsSortOrder = "descending"
sendersForResultSortKey = "Sender"
sendersForResultSortOrder = "descending"
setInterval ( refreshStatus, 3000);
setTimeout ( refreshStatus, 1);
}