You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ktorrent/plugins/webinterface/www/coldmilk/page_update.js

430 lines
13 KiB

/***************************************************************************
* Copyright (C) 2007 by Dagur Valberg Johannsson *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
var details_of_torrent = null; //id of torrent which details are displayed
function update_interval(time) {
update_all();
if (!time) {
return;
}
var seconds = time * 1000;
window.setInterval(update_all, seconds);
}
function update_all() {
fetch_xml("rest.php?global_status", new Array("update_status_bar", "update_title"));
fetch_xml("rest.php?download_status", new Array("update_torrent_table"));
}
function fetch_xml(url, callback_functions) {
var request = false;
if (window.XMLHttpRequest) { // most browsers
request = new XMLHttpRequest();
// if (request.overrideMimeType) {
// request.overrideMimeType('text/xml');
// }
}
else if (window.ActiveXObject) { //ie
try {
request = new ActiveXObject("Msxml2.XMLHTTP");
}
catch(e) {
try { request = new ActiveXObject("Microsoft.XMLHTTP"); }
catch(e) { }
}
}
if (!request) {
// Browser doesn't support XMLHttpRequest
return false;
}
request.onreadystatechange = function() {
if (request.readyState == 4) {
if (request.status == 200) {
//overrideMimeType didn't work in Konqueror,
//so we'll have to parse the response into XML
//object ourselfs. responseXML won't work.
var xmlstring = request.responseText;
var xmldoc;
if (window.DOMParser) {
xmldoc = (new DOMParser())
.parseFromString(xmlstring, "text/xml");
}
else if (window.ActiveXObject) { //ie
xmldoc = new ActiveXObject("Microsoft.XMLDOM");
xmldoc.async = false;
xmldoc.loadXML(xmlstring);
}
for (var i in callback_functions) {
eval(callback_functions[i] + "(xmldoc)");
}
}
else {
// could not fetch
}
}
}
request.open('GET', url, true);
request.send(null);
}
function update_title(xmldoc) {
var down = _get_text(xmldoc, 'download_speed').data;
var up = _get_text(xmldoc, 'upload_speed').data;
var new_title = "(D: " + down + ") (U: " + up + ") - ktorrent web interface";
document.title = new_title;
}
function update_status_bar(xmldoc) {
var newtable = document.createElement('table');
newtable.setAttribute('id', 'status_bar_table');
//dht and encryption
{
var row = newtable.insertRow(0);
var cell = row.insertCell(0);
var dht = _get_text_from_attribute(xmldoc, 'dht', 'status').data;
var encryption = _get_text_from_attribute(xmldoc, 'encryption', 'status').data;
cell.appendChild(
document.createTextNode("DHT : " +dht));
cell = row.insertCell(1);
cell.appendChild(
document.createTextNode("Encryption : " + encryption));
}
//speed down/up
{
var row = newtable.insertRow(1);
var cell = row.insertCell(0);
cell.appendChild(
document.createTextNode("Speed"));
cell = row.insertCell(1);
var down = _get_text(xmldoc, 'download_speed').data;
var up = _get_text(xmldoc, 'upload_speed').data;
cell.appendChild(
document.createTextNode("down: " + down + " / up: " + up));
}
//transferred
{
var row = newtable.insertRow(2);
var cell = row.insertCell(0);
cell.appendChild(
document.createTextNode("Transferred"));
cell = row.insertCell(1);
var down = _get_text(xmldoc, 'downloaded_total').data;
var up = _get_text(xmldoc, 'uploaded_total').data;
cell.appendChild(
document.createTextNode("down: " + down + " / up: " + up));
}
var oldtable = document.getElementById('status_bar_table');
oldtable.parentNode.replaceChild(newtable, oldtable);
}
function update_torrent_table(xmldoc) {
var newtable = document.createElement('table');
newtable.setAttribute('id', 'torrent_list_table');
newtable.className='list_table';
var torrents = xmldoc.getElementsByTagName('torrent');
var i = 0;
while (torrents[i]) {
_torrent_table_row(torrents[i], newtable, i);
i++;
}
_torrent_table_header(newtable.insertRow(0));
var oldtable = document.getElementById('torrent_list_table');
oldtable.parentNode.replaceChild(newtable, oldtable);
}
function _torrent_table_row(torrent, table, i) {
var row = table.insertRow(i);
var row_color = (i % 2) ?
"#ffffff" : "#dce4f9";
row.setAttribute("style", "background-color : " + row_color);
//actions
{
var cell = row.insertCell(0);
var can_start = (_get_text(torrent, 'running').data) ? 0 : 1; //if torrent is running we can't start it
var can_stop = (can_start==1) ? 0 : 1; //opposite of can_start
var start_button = _create_action_button('Start', 'start.png', (can_start==1) ? 'start='+i : '');
var stop_button = _create_action_button('Stop', 'stop.png', (can_stop==1) ? 'stop='+i : '');
var remove_button = _create_action_button('Remove', 'remove.png', 'remove='+i);
remove_button.setAttribute("onclick", "return validate('remove_torrent')");
cell.appendChild(start_button);
cell.appendChild(stop_button);
cell.appendChild(remove_button);
}
//file
{
var cell = row.insertCell(1);
var file = document.createElement('a');
file.setAttribute('href', '#');
file.appendChild(_get_text(torrent, 'name'));
file.onclick = function()
{
show('torrents_details');
fetch_xml("rest.php?torrents_details="+i, new Array("get_torrents_details"));
details_of_torrent = i;
};
cell.appendChild(file);
}
//status
{
var cell = row.insertCell(2);
cell.appendChild(
_get_text(torrent, 'status'));
}
//speed
{
var cell = row.insertCell(3);
cell.appendChild(
_get_text(torrent, 'download_rate'));
cell.appendChild(document.createElement('br'));
cell.appendChild(
_get_text(torrent, 'upload_rate'));
}
//size
{
var cell = row.insertCell(4);
cell.appendChild(
_get_text(torrent, 'size'));
}
//peers
{
var cell = row.insertCell(5);
cell.appendChild(
_get_text(torrent, 'peers'));
}
//transferred
{
var cell = row.insertCell(6);
cell.appendChild(
_get_text(torrent, 'downloaded'));
cell.appendChild(document.createElement('br'));
cell.appendChild(
_get_text(torrent, 'uploaded'));
}
//done
{
var cell = row.insertCell(7);
cell.setAttribute("style", "padding-right : 2px;");
var percent_done
= _get_text_from_attribute(torrent, 'downloaded', 'percent').data;
var bar = document.createElement('div');
bar.setAttribute("class", "percent_bar");
bar.setAttribute("style", "width : " + percent_done + "%;");
cell.appendChild(bar);
var bar_text = document.createElement('div');
bar_text.appendChild(
document.createTextNode(percent_done + "%"));
bar.appendChild(bar_text);
}
}
//function called after changing file priority to refresh list of files (and priorities)
function just_refresh_details(xmldoc) {
if (details_of_torrent!=null)
fetch_xml("rest.php?torrents_details="+details_of_torrent, new Array("get_torrents_details"));
}
function get_torrents_details(xmldoc) {
var newtable = document.createElement('table');
newtable.setAttribute('id', 'torrents_details_files');
newtable.className='list_table';
var id = xmldoc.getElementsByTagName('torrents_details')[0].getAttribute('id');
var files = xmldoc.getElementsByTagName('file');
for(var i=0; i<files.length; i++)
{
var row = newtable.insertRow(i);
row.style.backgroundColor=(i % 2) ? '#ffffff' : '#dce4f9';
var cell = row.insertCell(-1);
var file_status = _get_text(files[i], 'status').data;
var command; //we call ?file_xx - this call is detected by server and priority is being changed
command = (file_status==50)?'':'rest.php?file_hp='+id+'-'+i;
var high_prior = _create_file_action_button('/icons/16x16/high_priority.png', 'High Priority', command);
cell.appendChild(high_prior);
command = (file_status==40)?'':'rest.php?file_np='+id+'-'+i;
var normal_prior = _create_file_action_button('/icons/16x16/normal_priority.png', 'Normal Priority', command);
cell.appendChild(normal_prior);
command = (file_status==30)?'':'rest.php?file_lp='+id+'-'+i;
var low_prior = _create_file_action_button('/icons/16x16/low_priority.png', 'Low Priority', command);
cell.appendChild(low_prior);
command = (file_status==20 || file_status==10)?'':'rest.php?file_stop='+id+'-'+i;
var dnd = _create_file_action_button('/icons/16x16/only_seed.png', 'Stop downloading (Only Seed Priority)', command);
cell.appendChild(dnd);
var cell = row.insertCell(-1);
cell.appendChild(_get_text(files[i], 'name'));
var cell = row.insertCell(-1);
cell.appendChild(_get_text(files[i], 'size'));
var cell = row.insertCell(-1);
if (_get_text(files[i], 'perc_done').data!='')
cell.appendChild(_get_text(files[i], 'perc_done'));
else
cell.appendChild(document.createTextNode("0"));
cell.appendChild(document.createTextNode("%"));
var cell = row.insertCell(-1);
cell.appendChild(document.createTextNode(_get_file_status_name(file_status)));
}
_torrents_details_header(newtable.insertRow(0));
/*var torrents = xmldoc.getElementsByTagName('torrent');
var i = 0;
while (torrents[i]) {
_torrent_table_row(torrents[i], newtable, i);
i++;
}
_torrent_table_header(newtable.insertRow(0));*/
var oldtable = document.getElementById('torrents_details_files');
oldtable.parentNode.replaceChild(newtable, oldtable);
}
function _create_action_button(button_name, image_src, command) {
var image = document.createElement("img");
image.setAttribute("src", "icons/22x22/" + image_src);
image.setAttribute("alt", button_name);
image.setAttribute("title", button_name);
if (command != '')
{
var a = document.createElement("a");
a.setAttribute("href", "interface.php?" + command);
a.appendChild(image);
return a;
}
else
return image;
}
function _create_file_action_button(img_src, img_alt, command) {
var image = document.createElement("img");
image.setAttribute("src", img_src);
image.setAttribute("alt", img_alt);
image.setAttribute("title", img_alt);
if (command != '')
{
var a = document.createElement("a");
a.setAttribute("href", "#");
a.onclick = function()
{
fetch_xml(command, new Array("just_refresh_details"));
};
a.appendChild(image);
return a;
}
else
return image;
}
// gets element with given tag and crates text node from it
function _get_text(element, tag) {
var text_node;
try {
text_node = document.createTextNode(
element.getElementsByTagName(tag)[0].firstChild.data);
}
catch (e) {
text_node = document.createTextNode('');
}
return text_node;
}
function _get_text_from_attribute(element, tag, attribute) {
var text_node;
try {
text_node = document.createTextNode(
element.getElementsByTagName(tag)[0].getAttribute(attribute));
}
catch (e) {
text_node = document.createTextNode('');
}
return text_node;
}
function _get_file_status_name(status_id)
{
if (status_id==60) return 'PREVIEW_PRIORITY';
else if (status_id==50) return 'Download First';
else if (status_id==40) return 'Download Normally';
else if (status_id==30) return 'Download Last';
else if (status_id==20) return 'Only Seed';
else if (status_id==10) return 'Do Not Download';
else return 'Not supported file status';
}
function _torrents_details_header(row) {
headers = new Array("Actions", "File", "Size", "Perc done", "tqStatus");
for (var i in headers) {
var header = document.createElement("th");
header.appendChild(document.createTextNode(headers[i]));
row.appendChild(header);
}
return row;
}
function _torrent_table_header(row) {
headers = new Array(
"Actions", "File", "tqStatus",
"Speed", "Size", "Peers",
"Transferred", "% done"
);
for (var i in headers) {
var header = document.createElement("th");
header.appendChild(
document.createTextNode(headers[i]));
row.appendChild(header);
}
return row;
}