window.addEvent('domready', function() {
intermission = new Intermission();
});
Torrent = new Class({
initialize : function(torrent) {
this.completed = torrent.completed; // this might change
this.id = torrent.id; // we assume this..
this.name = torrent.name; // .. and this ..
this.size = torrent.size; // .. and this don't change
this.state = torrent.state;
if (this.state == "downloading") {
this.download_speed = torrent.download_speed;
this.eta = torrent.eta;
this.peers_uploading = torrent.peers_uploading;
this.peers_total = torrent.peers_total;
this.upload_speed = torrent.upload_speed;
}
else if (this.state == "seeding") {
this.peers_downloading = torrent.peers_downloading;
this.peers_total = torrent.peers_total;
this.upload_speed = torrent.upload_speed;
}
this.tds = new Array();
this.selected = false;
},
grafter : function() {
var completedAndETA = this.humaniseCompletedOfSize();
if (this.state == "downloading") {
completedAndETA += ' - ' + this.humaniseETA();
}
// You can find graft() here -> http://tinyurl.com/y7yqch
// .. real skank-a-thon with the IDing of stuff atm :)
graft(
$("torrents"),
['div', {id : "di1" + this.id, class : "torrent"},
['table', {id : "tab" + this.id},
['tr', {id : "tr1" + this.id},
['td', {id : "td1" + this.id, class : "torrent_name", colspan : 2}, this.name]
],
['tr', {id : "tr2" + this.id},
['td', {id : "td2" + this.id}, completedAndETA]
],
['tr', {id : "tr3" + this.id},
['td', {id : "td3" + this.id},
['div', {id : "di2" + this.id, class : "progress_border"},
['div', {id : "di3" + this.id, class : "progress_bar", style : "width:" + this.progressWidth() + ";"}]
]
]
],
['tr', {id : "tr4" + this.id},
['td', {id : "td4" + this.id}, this.stateAndPeers()]
]
]
]
);
// Store references to our
elements for updating later
// .. we don't need to with the skank naming system, but it's nicer
this.tds = [$("td1" + this.id), $("td2" + this.id), $("td3" + this.id), $("td4" + this.id)];
this.progress = $("di3" + this.id);
$("di1" + this.id).addEvent('click', this.toggle.bind(this));
},
humaniseBytes : function(value) {
// Turn size byte counts into something prettier
if (value < 1024000) {
return (value / 1024).round(2) + ' KB';
}
else if (value < 1048576000) {
return (value / 1048576).round(2) + ' MB';
}
else if (value < 1073741824000) {
return (value / 1073741824).round(2) + ' GB';
} else {
return (value / 1099511627776).round(2) + ' TB';
}
},
humaniseCompletedOfSize : function() {
// Return x of y (%)
return this.humaniseBytes(this.completed)
+ ' of '
+ this.humaniseBytes(this.size)
+ ' ('
+ ((this.completed / this.size) * 100).round(2)
+ '%)';
},
humaniseETA : function() {
// Turn seconds into something readable - not nice, needs replacing
var hours = Math.floor(this.eta / 3600);
var minutes = Math.floor((this.eta % 3600) / 60);
var seconds = Math.floor((this.eta % 3600) % 60);
if (minutes == 0 && hours == 0) {
var response = seconds + ' seconds remaining';
} else {
var response = hours + ' hours ' + minutes + ' minutes remaining';
}
return response;
},
humaniseSpeed : function(value, type) {
// Turn speed byte counts into something prettier
if (value < 1024000) {
return (value / 1024).round(2) + 'KB/s';
}
else if (value < 1048576000) {
return (value / 1048576).round(2) + 'MB/s';
}
else if (value < 1073741824000) {
return (value / 1073741824).round(2) + 'GB/s';
} else {
return (value / 1099511627776).round(2) + 'TB/s';
}
},
progressWidth : function() {
// Return a suitable % width for the CSS progress bar
width = (this.completed / this.size) * 100;
if (width < 1) {
return '0%';
}
else if (width < 2) {
return width + '%';
} else {
return (width - 1) + '%';
}
},
toggle : function(event) {
id = $("di1" + $(event.target).id.substr(3));
if (this.selected) {
this.selected = false;
id.setStyle('background-color', '#fff');
} else {
this.selected = true;
id.setStyle('background-color', '#00f');
}
},
stateAndPeers : function() {
// Return state and peer data if active, otherwise just state
if (this.state == "downloading") {
return 'Downloading from '
+ this.peers_uploading
+ ' of '
+ this.peers_total
+ ' peers - DL: '
+ this.humaniseSpeed(this.download_speed)
+ ', UL: '
+ this.humaniseSpeed(this.upload_speed);
}
else if (this.state == "seeding") {
return 'Seeding to '
+ this.peers_downloading
+ ' of '
+ this.peers_total
+ ' peers - UL: '
+ this.humaniseSpeed(this.upload_speed);
} else {
return this.state.capitalize();
}
},
updater : function(torrent) {
// Update the data for the this torrent
this.completed = torrent.completed;
this.state = torrent.state;
var completedAndETA = this.humaniseCompletedOfSize();
if (this.state == "downloading") {
this.download_speed = torrent.download_speed;
this.eta = torrent.eta;
this.peers_uploading = torrent.peers_uploading;
this.peers_total = torrent.peers_total;
this.upload_speed = torrent.upload_speed;
completedAndETA += ' - ' + this.humaniseETA();
}
else if (torrent.state == "seeding") {
this.peers_downloading = torrent.peers_downloading;
this.peers_total = torrent.peers_total;
this.upload_speed = torrent.upload_speed;
}
// Update the | s we grafted earlier
this.tds[1].setHTML(completedAndETA);
this.progress.setStyle("width", this.progressWidth());
this.tds[3].setHTML(this.stateAndPeers());
}
});
transfers = new Array();
transfers_count = 0;
Intermission = new Class({
initialize : function() {
this.torrentsRefresh();
$('manualRefresh').addEvent('click', this.torrentsRefresh.bind(this));
// periodical = this.torrentsRefresh.periodical(5000, this, 1); // update every x milliseconds
},
torrentsRefresh : function(event) {
var torrentsRefreshURL = 'ajax/torrentsRefresh.php';
// Tell the daemon which torrents we're tracking
if (transfers) {
var ids_known = new Array();
torrentsRefreshURL += '?ids=';
transfers.each(function(torrent) {
ids_known.push(torrent.id);
});
torrentsRefreshURL += Json.toString(ids_known);
}
new Ajax(torrentsRefreshURL, {
method : 'get',
onComplete : this.torrentsRefreshComplete
}).request();
},
torrentsRefreshComplete : function(data) {
// Handle the Json sent back from the server
var torrents = Json.evaluate(data);
$each(torrents['torrents'], function(torrent) {
// Three possibilities - deleted, removed or existing torrent data
if (torrent.internal == 'deleted') {
transfers_count -= 1;
transfers.splice(torrent.id, 1);
$("di1" + torrent.id).remove();
}
else if (torrent.internal == 'new') {
transfers_count += 1;
transfers[torrent.id] = new Torrent(torrent);
transfers[torrent.id].grafter();
}
else if (torrent.internal == 'old') {
transfers[torrent.id].updater(torrent);
}
});
$('statusbar').setHTML(transfers_count + ' transfers');
}
});
|