|
|
@ -35,27 +35,148 @@ var dynamicTable = new Class({ |
|
|
|
|
|
|
|
|
|
|
|
initialize : function () {}, |
|
|
|
initialize : function () {}, |
|
|
|
|
|
|
|
|
|
|
|
setup : function (table, progressIndex, context_menu) { |
|
|
|
setup : function (table, context_menu) { |
|
|
|
this.table = $(table); |
|
|
|
this.table = $(table); |
|
|
|
this.rows = new Hash(); |
|
|
|
this.rows = new Hash(); |
|
|
|
this.cur = new Array(); |
|
|
|
this.cur = new Array(); |
|
|
|
this.priority_hidden = false; |
|
|
|
this.columns = new Array(); |
|
|
|
this.progressIndex = progressIndex; |
|
|
|
|
|
|
|
this.context_menu = context_menu; |
|
|
|
this.context_menu = context_menu; |
|
|
|
this.table.sortedColumn = getLocalStorageItem('sorted_column', 'name'); |
|
|
|
this.sortedColumn = getLocalStorageItem('sorted_column', 'name'); |
|
|
|
this.table.reverseSort = getLocalStorageItem('reverse_sort', 'false');; |
|
|
|
this.reverseSort = getLocalStorageItem('reverse_sort', '0'); |
|
|
|
|
|
|
|
this.initColumns(); |
|
|
|
|
|
|
|
this.loadColumnsOrder(); |
|
|
|
|
|
|
|
this.updateHeader(); |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
initColumns : function () { |
|
|
|
|
|
|
|
this.newColumn('state_icon', 'width: 16px', ''); |
|
|
|
|
|
|
|
this.newColumn('name', 'min-width: 200px; cursor: pointer', 'QBT_TR(Name)QBT_TR'); |
|
|
|
|
|
|
|
this.newColumn('priority', 'width: 90px; cursor: pointer', '#'); |
|
|
|
|
|
|
|
this.newColumn('size', 'width: 100px; cursor: pointer', 'QBT_TR(Size)QBT_TR'); |
|
|
|
|
|
|
|
this.newColumn('progress', 'width: 80px; cursor: pointer', 'QBT_TR(Done)QBT_TR'); |
|
|
|
|
|
|
|
this.newColumn('num_seeds', 'width: 100px; cursor: pointer', 'QBT_TR(Seeds)QBT_TR'); |
|
|
|
|
|
|
|
this.newColumn('num_leechs', 'width: 100px; cursor: pointer', 'QBT_TR(Peers)QBT_TR'); |
|
|
|
|
|
|
|
this.newColumn('dlspeed', 'width: 100px; cursor: pointer', 'QBT_TR(Down Speed)QBT_TR'); |
|
|
|
|
|
|
|
this.newColumn('upspeed', 'width: 100px; cursor: pointer', 'QBT_TR(Up Speed)QBT_TR'); |
|
|
|
|
|
|
|
this.newColumn('eta', 'width: 100px; cursor: pointer', 'QBT_TR(ETA)QBT_TR'); |
|
|
|
|
|
|
|
this.newColumn('ratio', 'width: 100px; cursor: pointer', 'QBT_TR(Ratio)QBT_TR'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.columns['state_icon'].onclick = ''; |
|
|
|
|
|
|
|
this.columns['state_icon'].dataProperties[0] = 'state'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.columns['num_seeds'].dataProperties.push('num_complete'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.columns['num_leechs'].dataProperties.push('num_incomplete'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.initColumnsFunctions(); |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
newColumn : function (name, style, caption) { |
|
|
|
|
|
|
|
var column = {}; |
|
|
|
|
|
|
|
column['name'] = name; |
|
|
|
|
|
|
|
column['visible'] = getLocalStorageItem('column_' + name + '_visible', '1'); |
|
|
|
|
|
|
|
column['force_hide'] = false; |
|
|
|
|
|
|
|
column['caption'] = caption; |
|
|
|
|
|
|
|
column['style'] = style; |
|
|
|
|
|
|
|
column['onclick'] = 'setSortedColumn(\'' + name + '\');'; |
|
|
|
|
|
|
|
column['dataProperties'] = [name]; |
|
|
|
|
|
|
|
column['getRowValue'] = function (row, pos) { |
|
|
|
|
|
|
|
if (pos == undefined) |
|
|
|
|
|
|
|
pos = 0; |
|
|
|
|
|
|
|
return row['full_data'][this.dataProperties[pos]]; |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
column['compareRows'] = function (row1, row2) { |
|
|
|
|
|
|
|
if (this.getRowValue(row1) < this.getRowValue(row2)) |
|
|
|
|
|
|
|
return -1; |
|
|
|
|
|
|
|
else if (this.getRowValue(row1) > this.getRowValue(row2)) |
|
|
|
|
|
|
|
return 1; |
|
|
|
|
|
|
|
else return 0; |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
column['updateTd'] = function (td, row) { |
|
|
|
|
|
|
|
td.innerHTML = this.getRowValue(row); |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
this.columns.push(column); |
|
|
|
|
|
|
|
this.columns[name] = column; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$('torrentTableHeader').appendChild(new Element('th')); |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
loadColumnsOrder : function () { |
|
|
|
|
|
|
|
columnsOrder = ['state_icon']; // status icon column is always the first
|
|
|
|
|
|
|
|
val = localStorage.getItem('columns_order'); |
|
|
|
|
|
|
|
if (val === null || val === undefined) return; |
|
|
|
|
|
|
|
val.split(',').forEach(function(v) { |
|
|
|
|
|
|
|
if ((v in this.columns) && (!columnsOrder.contains(v))) |
|
|
|
|
|
|
|
columnsOrder.push(v); |
|
|
|
|
|
|
|
}.bind(this)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < this.columns.length; i++) |
|
|
|
|
|
|
|
if (!columnsOrder.contains(this.columns[i].name)) |
|
|
|
|
|
|
|
columnsOrder.push(this.columns[i].name); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < this.columns.length; i++) |
|
|
|
|
|
|
|
this.columns[i] = this.columns[columnsOrder[i]]; |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
saveColumnsOrder : function () { |
|
|
|
|
|
|
|
val = ''; |
|
|
|
|
|
|
|
for (i = 0; i < this.columns.length; i++) { |
|
|
|
|
|
|
|
if (i > 0) |
|
|
|
|
|
|
|
val += ','; |
|
|
|
|
|
|
|
val += this.columns[i].name; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
localStorage.setItem('columns_order', val); |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
updateHeader : function () { |
|
|
|
|
|
|
|
ths = $('torrentTableHeader').getElements('th'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < ths.length; i++) { |
|
|
|
|
|
|
|
th = ths[i]; |
|
|
|
|
|
|
|
th.setAttribute('onclick', this.columns[i].onclick); |
|
|
|
|
|
|
|
th.innerHTML = this.columns[i].caption; |
|
|
|
|
|
|
|
th.setAttribute('style', this.columns[i].style); |
|
|
|
|
|
|
|
if ((this.columns[i].visible == '0') || this.columns[i].force_hide) |
|
|
|
|
|
|
|
th.addClass('invisible'); |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
th.removeClass('invisible'); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
getColumnPos : function (columnName) { |
|
|
|
|
|
|
|
for (var i = 0; i < this.columns.length; i++) |
|
|
|
|
|
|
|
if (this.columns[i].name == columnName) |
|
|
|
|
|
|
|
return i; |
|
|
|
|
|
|
|
return -1; |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
updateColumn : function (columnName) { |
|
|
|
|
|
|
|
var pos = this.getColumnPos(columnName); |
|
|
|
|
|
|
|
var visible = ((this.columns[pos].visible != '0') && !this.columns[pos].force_hide); |
|
|
|
|
|
|
|
var ths = $('torrentTableHeader').getElements('th'); |
|
|
|
|
|
|
|
if (visible) |
|
|
|
|
|
|
|
ths[pos].removeClass('invisible'); |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
ths[pos].addClass('invisible'); |
|
|
|
|
|
|
|
var trs = this.table.getElements('tr'); |
|
|
|
|
|
|
|
for (var i = 0; i < trs.length; i++) |
|
|
|
|
|
|
|
if (visible) |
|
|
|
|
|
|
|
trs[i].getElements('td')[pos].removeClass('invisible'); |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
trs[i].getElements('td')[pos].addClass('invisible'); |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
setSortedColumn : function (column) { |
|
|
|
setSortedColumn : function (column) { |
|
|
|
if (column != this.table.sortedColumn) { |
|
|
|
if (column != this.sortedColumn) { |
|
|
|
this.table.sortedColumn = column; |
|
|
|
this.sortedColumn = column; |
|
|
|
this.table.reverseSort = 'false'; |
|
|
|
this.reverseSort = '0'; |
|
|
|
} else { |
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
// Toggle sort order
|
|
|
|
// Toggle sort order
|
|
|
|
this.table.reverseSort = this.table.reverseSort == 'true' ? 'false' : 'true'; |
|
|
|
this.reverseSort = this.reverseSort == '0' ? '1' : '0'; |
|
|
|
} |
|
|
|
} |
|
|
|
localStorage.setItem('sorted_column', column); |
|
|
|
localStorage.setItem('sorted_column', column); |
|
|
|
localStorage.setItem('reverse_sort', this.table.reverseSort); |
|
|
|
localStorage.setItem('reverse_sort', this.reverseSort); |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
getCurrentTorrentHash : function () { |
|
|
|
getCurrentTorrentHash : function () { |
|
|
@ -78,224 +199,269 @@ var dynamicTable = new Class({ |
|
|
|
}.bind(this)); |
|
|
|
}.bind(this)); |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
hidePriority : function () { |
|
|
|
selectAll : function () { |
|
|
|
if (this.priority_hidden) |
|
|
|
this.cur.empty(); |
|
|
|
return; |
|
|
|
|
|
|
|
$('prioHeader').addClass('invisible'); |
|
|
|
|
|
|
|
var trs = this.table.getElements('tr'); |
|
|
|
var trs = this.table.getElements('tr'); |
|
|
|
trs.each(function (tr, i) { |
|
|
|
for (var i = 0; i < trs.length; i++) { |
|
|
|
var tds = tr.getElements('td'); |
|
|
|
var tr = trs[i]; |
|
|
|
tds[2].addClass('invisible'); |
|
|
|
this.cur.push(tr.hash); |
|
|
|
}.bind(this)); |
|
|
|
if (!tr.hasClass('selected')) |
|
|
|
this.priority_hidden = true; |
|
|
|
tr.addClass('selected'); |
|
|
|
|
|
|
|
} |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
showPriority : function () { |
|
|
|
selectRow : function (hash) { |
|
|
|
if (!this.priority_hidden) |
|
|
|
this.cur.empty(); |
|
|
|
return; |
|
|
|
this.cur.push(hash); |
|
|
|
$('prioHeader').removeClass('invisible'); |
|
|
|
|
|
|
|
var trs = this.table.getElements('tr'); |
|
|
|
var trs = this.table.getElements('tr'); |
|
|
|
trs.each(function (tr, i) { |
|
|
|
for (var i = 0; i < trs.length; i++) { |
|
|
|
var tds = tr.getElements('td'); |
|
|
|
var tr = trs[i]; |
|
|
|
tds[2].removeClass('invisible'); |
|
|
|
if (tr.hash == hash) { |
|
|
|
}.bind(this)); |
|
|
|
if (!tr.hasClass('selected')) |
|
|
|
this.priority_hidden = false; |
|
|
|
tr.addClass('selected'); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
if (tr.hasClass('selected')) |
|
|
|
|
|
|
|
tr.removeClass('selected'); |
|
|
|
|
|
|
|
} |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
insertRow : function (id, row, data, attrs, pos) { |
|
|
|
updateRowData : function (data) { |
|
|
|
if (this.rows.has(id)) { |
|
|
|
var hash = data['hash']; |
|
|
|
return; |
|
|
|
var row; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!this.rows.has(hash)) { |
|
|
|
|
|
|
|
row = {}; |
|
|
|
|
|
|
|
this.rows.set(hash, row); |
|
|
|
|
|
|
|
row['full_data'] = {}; |
|
|
|
|
|
|
|
row['hash'] = hash; |
|
|
|
} |
|
|
|
} |
|
|
|
var tr = new Element('tr'); |
|
|
|
else |
|
|
|
for (var a in attrs) |
|
|
|
row = this.rows.get(hash); |
|
|
|
tr.set(a, attrs[a]); |
|
|
|
|
|
|
|
tr.addClass("menu-target"); |
|
|
|
row['data'] = data; |
|
|
|
this.rows.set(id, tr); |
|
|
|
|
|
|
|
for (var i = 0; i < row.length; i++) { |
|
|
|
for(var x in data) |
|
|
|
var td = new Element('td'); |
|
|
|
row['full_data'][x] = data[x]; |
|
|
|
if (i == this.progressIndex) { |
|
|
|
}, |
|
|
|
td.adopt(new ProgressBar(row[i].toFloat(), { |
|
|
|
|
|
|
|
'id' : 'pb_' + id, |
|
|
|
applyFilter : function (row, filterName, labelName) { |
|
|
|
'width' : 80 |
|
|
|
var state = row['full_data'].state; |
|
|
|
})); |
|
|
|
switch(filterName) { |
|
|
|
if (typeof data[i] != 'undefined') |
|
|
|
case 'downloading': |
|
|
|
td.set('data-raw', data[i]) |
|
|
|
if ((state != 'downloading') && !~state.indexOf('DL')) |
|
|
|
} else { |
|
|
|
return false; |
|
|
|
if (i == 0) { |
|
|
|
break; |
|
|
|
td.adopt(new Element('img', { |
|
|
|
case 'completed': |
|
|
|
'src' : row[i], |
|
|
|
if ((state != 'uploading') && !~state.indexOf('UP')) |
|
|
|
'class' : 'statusIcon' |
|
|
|
return false; |
|
|
|
})); |
|
|
|
break; |
|
|
|
} else { |
|
|
|
case 'paused': |
|
|
|
if (i == 2) { |
|
|
|
if (!~state.indexOf('paused')) |
|
|
|
// Priority
|
|
|
|
return false; |
|
|
|
if (this.priority_hidden) |
|
|
|
break; |
|
|
|
td.addClass('invisible'); |
|
|
|
case 'active': |
|
|
|
} |
|
|
|
if ((state != 'uploading') && (state != 'downloading')) |
|
|
|
td.set('html', row[i]); |
|
|
|
return false; |
|
|
|
if (typeof data[i] != 'undefined') |
|
|
|
break; |
|
|
|
td.set('data-raw', data[i]) |
|
|
|
case 'inactive': |
|
|
|
} |
|
|
|
if ((state == 'uploading') || (state == 'downloading')) |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (labelName == null) |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (labelName != row['full_data'].label) |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
getFilteredAndSortedRows : function () { |
|
|
|
|
|
|
|
var filteredRows = new Array(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var rows = this.rows.getValues(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < rows.length; i++) |
|
|
|
|
|
|
|
if (this.applyFilter(rows[i], selected_filter, selected_label)) { |
|
|
|
|
|
|
|
filteredRows.push(rows[i]); |
|
|
|
|
|
|
|
filteredRows[rows[i].hash] = rows[i]; |
|
|
|
} |
|
|
|
} |
|
|
|
td.injectInside(tr); |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tr.addEvent('mouseover', function (e) { |
|
|
|
filteredRows.sort(function (row1, row2) { |
|
|
|
tr.addClass('over'); |
|
|
|
column = this.columns[this.sortedColumn]; |
|
|
|
}.bind(this)); |
|
|
|
res = column.compareRows(row1, row2); |
|
|
|
tr.addEvent('mouseout', function (e) { |
|
|
|
if (this.reverseSort == '0') |
|
|
|
tr.removeClass('over'); |
|
|
|
return res; |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
return -res; |
|
|
|
}.bind(this)); |
|
|
|
}.bind(this)); |
|
|
|
tr.addEvent('contextmenu', function (e) { |
|
|
|
return filteredRows; |
|
|
|
if (!this.cur.contains(id)) { |
|
|
|
}, |
|
|
|
// Remove selected style from previous ones
|
|
|
|
|
|
|
|
for (i = 0; i < this.cur.length; i++) { |
|
|
|
getTrByHash : function (hash) { |
|
|
|
if (this.rows.has(this.cur[i])) { |
|
|
|
trs = this.table.getElements('tr'); |
|
|
|
var temptr = this.rows.get(this.cur[i]); |
|
|
|
for (var i = 0; i < trs.length; i++) |
|
|
|
temptr.removeClass('selected'); |
|
|
|
if (trs[i].hash == hash) |
|
|
|
} |
|
|
|
return trs[i]; |
|
|
|
} |
|
|
|
return null; |
|
|
|
this.cur.empty(); |
|
|
|
}, |
|
|
|
this.cur[this.cur.length] = id; |
|
|
|
|
|
|
|
temptr = this.rows.get(id); |
|
|
|
updateTable : function (fullUpdate) { |
|
|
|
temptr.addClass("selected"); |
|
|
|
if (fullUpdate == undefined) |
|
|
|
|
|
|
|
fullUpdate = false; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var rows = this.getFilteredAndSortedRows(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < this.cur.length; i++) |
|
|
|
|
|
|
|
if (!(this.cur[i] in rows)) { |
|
|
|
|
|
|
|
this.cur.splice(i, 1); |
|
|
|
|
|
|
|
i--; |
|
|
|
} |
|
|
|
} |
|
|
|
return true; |
|
|
|
|
|
|
|
}.bind(this)); |
|
|
|
var trs = this.table.getElements('tr'); |
|
|
|
tr.addEvent('click', function (e) { |
|
|
|
|
|
|
|
e.stop(); |
|
|
|
for (var rowPos = 0; rowPos < rows.length; rowPos++) { |
|
|
|
if (e.control) { |
|
|
|
var hash = rows[rowPos]['hash']; |
|
|
|
// CTRL key was pressed
|
|
|
|
tr_found = false; |
|
|
|
if (this.cur.contains(id)) { |
|
|
|
for (j = rowPos; j < trs.length; j++) |
|
|
|
// remove it
|
|
|
|
if (trs[j]['hash'] == hash) { |
|
|
|
this.cur.erase(id); |
|
|
|
trs[rowPos].removeClass('over'); |
|
|
|
// Remove selected style
|
|
|
|
tr_found = true; |
|
|
|
if (this.rows.has(id)) { |
|
|
|
if (rowPos == j) |
|
|
|
temptr = this.rows.get(id); |
|
|
|
break; |
|
|
|
temptr.removeClass('selected'); |
|
|
|
trs[j].inject(trs[rowPos], 'before'); |
|
|
|
} |
|
|
|
var tmpTr = trs[j]; |
|
|
|
} else { |
|
|
|
trs.splice(j, 1); |
|
|
|
this.cur[this.cur.length] = id; |
|
|
|
trs.splice(rowPos, 0, tmpTr); |
|
|
|
// Add selected style
|
|
|
|
break; |
|
|
|
if (this.rows.has(id)) { |
|
|
|
|
|
|
|
temptr = this.rows.get(id); |
|
|
|
|
|
|
|
temptr.addClass('selected'); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
if (tr_found) // row already exists in the table
|
|
|
|
if (e.shift && this.cur.length == 1) { |
|
|
|
this.updateRow(trs[rowPos], fullUpdate); |
|
|
|
// Shift key was pressed
|
|
|
|
else { // else create a new row in the table
|
|
|
|
var first_id = this.cur[0]; |
|
|
|
var tr = new Element('tr'); |
|
|
|
var first_tr = this.rows.get(first_id); |
|
|
|
|
|
|
|
var last_id = id; |
|
|
|
tr.addClass("menu-target"); |
|
|
|
var last_tr = this.rows.get(last_id); |
|
|
|
tr['hash'] = rows[rowPos]['hash']; |
|
|
|
var all_trs = this.table.getChildren('tr'); |
|
|
|
|
|
|
|
var index_first_tr = all_trs.indexOf(first_tr); |
|
|
|
tr.addEvent('contextmenu', function (e) { |
|
|
|
var index_last_tr = all_trs.indexOf(last_tr); |
|
|
|
if (!myTable.cur.contains(this.hash)) |
|
|
|
var trs_to_select = all_trs.filter(function (item, index) { |
|
|
|
myTable.selectRow(this.hash); |
|
|
|
if (index_first_tr < index_last_tr) |
|
|
|
return true; |
|
|
|
return (index > index_first_tr) && (index <= index_last_tr); |
|
|
|
}); |
|
|
|
else |
|
|
|
tr.addEvent('click', function (e) { |
|
|
|
return (index < index_first_tr) && (index >= index_last_tr); |
|
|
|
e.stop(); |
|
|
|
}); |
|
|
|
if (e.control) { |
|
|
|
trs_to_select.each(function (item, index) { |
|
|
|
// CTRL key was pressed
|
|
|
|
// Add to selection
|
|
|
|
if (myTable.cur.contains(this.hash)) { |
|
|
|
this.cur[this.cur.length] = this.getRowId(item); |
|
|
|
// remove it
|
|
|
|
// Select it visually
|
|
|
|
myTable.cur.erase(this.hash); |
|
|
|
item.addClass('selected'); |
|
|
|
// Remove selected style
|
|
|
|
}.bind(this)); |
|
|
|
this.removeClass('selected'); |
|
|
|
} else { |
|
|
|
} |
|
|
|
// Simple selection
|
|
|
|
else { |
|
|
|
// Remove selected style from previous ones
|
|
|
|
myTable.cur.push(this.hash); |
|
|
|
for (i = 0; i < this.cur.length; i++) { |
|
|
|
// Add selected style
|
|
|
|
if (this.rows.has(this.cur[i])) { |
|
|
|
this.addClass('selected'); |
|
|
|
var temptr = this.rows.get(this.cur[i]); |
|
|
|
|
|
|
|
temptr.removeClass('selected'); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
this.cur.empty(); |
|
|
|
else { |
|
|
|
// Add selected style to new one
|
|
|
|
if (e.shift && myTable.cur.length == 1) { |
|
|
|
if (this.rows.has(id)) { |
|
|
|
// Shift key was pressed
|
|
|
|
temptr = this.rows.get(id); |
|
|
|
var first_row_hash = myTable.cur[0]; |
|
|
|
temptr.addClass('selected'); |
|
|
|
var last_row_hash = this.hash; |
|
|
|
|
|
|
|
myTable.cur.empty(); |
|
|
|
|
|
|
|
var trs = myTable.table.getElements('tr'); |
|
|
|
|
|
|
|
var select = false; |
|
|
|
|
|
|
|
for (var i = 0; i < trs.length; i++) { |
|
|
|
|
|
|
|
var tr = trs[i]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((tr.hash == first_row_hash) || (tr.hash == last_row_hash)) { |
|
|
|
|
|
|
|
myTable.cur.push(tr.hash); |
|
|
|
|
|
|
|
tr.addClass('selected'); |
|
|
|
|
|
|
|
select = !select; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
if (select) { |
|
|
|
|
|
|
|
myTable.cur.push(tr.hash); |
|
|
|
|
|
|
|
tr.addClass('selected'); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
tr.removeClass('selected') |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
// Simple selection
|
|
|
|
|
|
|
|
myTable.selectRow(this.hash); |
|
|
|
|
|
|
|
updatePropertiesPanel(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
this.cur[0] = id; |
|
|
|
return false; |
|
|
|
updatePropertiesPanel(); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (var j = 0 ; j < this.columns.length; j++) { |
|
|
|
|
|
|
|
var td = new Element('td'); |
|
|
|
|
|
|
|
if ((this.columns[j].visible == '0') || this.columns[j].force_hide) |
|
|
|
|
|
|
|
td.addClass('invisible'); |
|
|
|
|
|
|
|
td.injectInside(tr); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Insert
|
|
|
|
|
|
|
|
if (rowPos >= trs.length) { |
|
|
|
|
|
|
|
tr.inject(this.table); |
|
|
|
|
|
|
|
trs.push(tr); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
tr.inject(trs[rowPos], 'before'); |
|
|
|
|
|
|
|
trs.splice(rowPos, 0, tr); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Update context menu
|
|
|
|
|
|
|
|
this.context_menu.addTarget(tr); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.updateRow(tr, true); |
|
|
|
} |
|
|
|
} |
|
|
|
return false; |
|
|
|
} |
|
|
|
}.bind(this)); |
|
|
|
|
|
|
|
|
|
|
|
rowPos = rows.length; |
|
|
|
|
|
|
|
|
|
|
|
// Insert
|
|
|
|
while ((rowPos < trs.length) && (trs.length > 0)) { |
|
|
|
var trs = this.table.getChildren('tr'); |
|
|
|
trs[trs.length - 1].dispose(); |
|
|
|
if (pos >= trs.length) { |
|
|
|
trs.pop(); |
|
|
|
tr.inject(this.table); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
tr.inject(trs[pos], 'before'); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
//tr.injectInside(this.table);
|
|
|
|
|
|
|
|
// Update context menu
|
|
|
|
|
|
|
|
this.context_menu.addTarget(tr); |
|
|
|
|
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
selectAll : function () { |
|
|
|
updateRow : function (tr, fullUpdate) { |
|
|
|
this.cur.empty(); |
|
|
|
var row = this.rows.get(tr.hash); |
|
|
|
this.rows.each(function (tr, id) { |
|
|
|
data = row[fullUpdate ? 'full_data' : 'data']; |
|
|
|
this.cur[this.cur.length] = id; |
|
|
|
|
|
|
|
if (!tr.hasClass('selected')) { |
|
|
|
|
|
|
|
tr.addClass('selected'); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}, this); |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
updateRow : function (id, row, data, attrs, newpos) { |
|
|
|
tds = tr.getElements('td'); |
|
|
|
if (!this.rows.has(id)) { |
|
|
|
|
|
|
|
return false; |
|
|
|
for(var prop in data) |
|
|
|
|
|
|
|
for (var i = 0; i < this.columns.length; i++) |
|
|
|
|
|
|
|
for (var j = 0; j < this.columns[i].dataProperties.length; j++) |
|
|
|
|
|
|
|
if (this.columns[i].dataProperties[j] == prop) |
|
|
|
|
|
|
|
this.columns[i].updateTd(tds[i], row); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (this.cur.contains(tr.hash)) { |
|
|
|
|
|
|
|
if (!tr.hasClass('selected')) |
|
|
|
|
|
|
|
tr.addClass('selected'); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
var tr = this.rows.get(id); |
|
|
|
if (tr.hasClass('selected')) |
|
|
|
for (var a in attrs) |
|
|
|
tr.removeClass('selected'); |
|
|
|
tr.set(a, attrs[a]); |
|
|
|
|
|
|
|
var tds = tr.getElements('td'); |
|
|
|
|
|
|
|
for (var i = 0; i < row.length; i++) { |
|
|
|
|
|
|
|
if (i == 1) |
|
|
|
|
|
|
|
continue; // Do not refresh name
|
|
|
|
|
|
|
|
if (i == this.progressIndex) { |
|
|
|
|
|
|
|
$('pb_' + id).setValue(row[i]); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
if (i == 0) { |
|
|
|
|
|
|
|
tds[i].getChildren('img')[0].set('src', row[i]); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
tds[i].set('html', row[i]); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (typeof data[i] != 'undefined') |
|
|
|
|
|
|
|
tds[i].set('data-raw', data[i]) |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Prevent freezing of the backlight.
|
|
|
|
|
|
|
|
tr.removeClass('over'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Move to 'newpos'
|
|
|
|
|
|
|
|
var trs = this.table.getChildren('tr'); |
|
|
|
|
|
|
|
if (newpos >= trs.length) { |
|
|
|
|
|
|
|
tr.inject(this.table); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
tr.inject(trs[newpos], 'before'); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
removeRow : function (id) { |
|
|
|
removeRow : function (hash) { |
|
|
|
if (this.cur.contains(id)) { |
|
|
|
this.cur.erase(hash); |
|
|
|
this.cur.erase(id); |
|
|
|
var tr = this.getTrByHash(hash); |
|
|
|
} |
|
|
|
if (tr != null) { |
|
|
|
if (this.rows.has(id)) { |
|
|
|
|
|
|
|
var tr = this.rows.get(id); |
|
|
|
|
|
|
|
tr.dispose(); |
|
|
|
tr.dispose(); |
|
|
|
this.altRow(); |
|
|
|
this.rows.erase(hash); |
|
|
|
this.rows.erase(id); |
|
|
|
|
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
return false; |
|
|
|
return false; |
|
|
@ -305,12 +471,152 @@ var dynamicTable = new Class({ |
|
|
|
return this.cur; |
|
|
|
return this.cur; |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
getRowId : function (tr) { |
|
|
|
|
|
|
|
return this.rows.keyOf(tr); |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
getRowIds : function () { |
|
|
|
getRowIds : function () { |
|
|
|
return this.rows.getKeys(); |
|
|
|
return this.rows.getKeys(); |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
initColumnsFunctions : function () { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// state_icon
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.columns['state_icon'].updateTd = function (td, row) { |
|
|
|
|
|
|
|
var state = this.getRowValue(row); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (state == "pausedUP" || state == "pausedDL") |
|
|
|
|
|
|
|
state = "paused"; |
|
|
|
|
|
|
|
else if (state == "queuedUP" || state == "queuedDL") |
|
|
|
|
|
|
|
state = "queued"; |
|
|
|
|
|
|
|
else if (state == "checkingUP" || state == "checkingDL") |
|
|
|
|
|
|
|
state = "checking"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var img_path = 'images/skin/' + state + '.png'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (td.getChildren('img').length) { |
|
|
|
|
|
|
|
var img = td.getChildren('img')[0]; |
|
|
|
|
|
|
|
if (img.src.indexOf(img_path) < 0) |
|
|
|
|
|
|
|
img.set('src', img_path); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
td.adopt(new Element('img', { |
|
|
|
|
|
|
|
'src' : img_path, |
|
|
|
|
|
|
|
'class' : 'statusIcon' |
|
|
|
|
|
|
|
})); |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// name
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.columns['name'].updateTd = function (td, row) { |
|
|
|
|
|
|
|
td.set('html', escapeHtml(this.getRowValue(row))); |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// priority
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.columns['priority'].updateTd = function (td, row) { |
|
|
|
|
|
|
|
var priority = this.getRowValue(row); |
|
|
|
|
|
|
|
td.set('html', priority < 0 ? null : priority); |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
this.columns['priority'].compareRows = function (row1, row2) { |
|
|
|
|
|
|
|
var row1_val = this.getRowValue(row1); |
|
|
|
|
|
|
|
var row2_val = this.getRowValue(row2); |
|
|
|
|
|
|
|
if (row1_val == -1) |
|
|
|
|
|
|
|
row1_val = 1000000; |
|
|
|
|
|
|
|
if (row2_val == -1) |
|
|
|
|
|
|
|
row2_val = 1000000; |
|
|
|
|
|
|
|
if (row1_val < row2_val) |
|
|
|
|
|
|
|
return -1; |
|
|
|
|
|
|
|
else if (row1_val > row2_val) |
|
|
|
|
|
|
|
return 1; |
|
|
|
|
|
|
|
else return 0; |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// size
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.columns['size'].updateTd = function (td, row) { |
|
|
|
|
|
|
|
var size = this.getRowValue(row); |
|
|
|
|
|
|
|
td.set('html', friendlyUnit(size, false)); |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// progress
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.columns['progress'].updateTd = function (td, row) { |
|
|
|
|
|
|
|
var progress = this.getRowValue(row); |
|
|
|
|
|
|
|
var progressFormated = (progress * 100).round(1); |
|
|
|
|
|
|
|
if (progressFormated == 100.0 && progress != 1.0) |
|
|
|
|
|
|
|
progressFormated = 99.9; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (td.getChildren('div').length) { |
|
|
|
|
|
|
|
var div = td.getChildren('div')[0]; |
|
|
|
|
|
|
|
if (div.getValue() != progressFormated) |
|
|
|
|
|
|
|
div.setValue(progressFormated); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
td.adopt(new ProgressBar(progressFormated.toFloat(), { |
|
|
|
|
|
|
|
'width' : 80 |
|
|
|
|
|
|
|
})); |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// num_seeds
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.columns['num_seeds'].updateTd = function (td, row) { |
|
|
|
|
|
|
|
var num_seeds = this.getRowValue(row, 0); |
|
|
|
|
|
|
|
var num_complete = this.getRowValue(row, 1); |
|
|
|
|
|
|
|
var html = num_seeds; |
|
|
|
|
|
|
|
if (num_complete != -1) |
|
|
|
|
|
|
|
html += ' (' + num_complete + ')'; |
|
|
|
|
|
|
|
td.set('html', html); |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
this.columns['num_seeds'].compareRows = function (row1, row2) { |
|
|
|
|
|
|
|
var num_seeds1 = this.getRowValue(row1, 0); |
|
|
|
|
|
|
|
var num_complete1 = this.getRowValue(row1, 1); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var num_seeds2 = this.getRowValue(row2, 0); |
|
|
|
|
|
|
|
var num_complete2 = this.getRowValue(row2, 1); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (num_complete1 < num_complete2) |
|
|
|
|
|
|
|
return -1; |
|
|
|
|
|
|
|
else if (num_complete1 > num_complete2) |
|
|
|
|
|
|
|
return 1; |
|
|
|
|
|
|
|
else if (num_seeds1 < num_seeds2) |
|
|
|
|
|
|
|
return -1; |
|
|
|
|
|
|
|
else if (num_seeds1 > num_seeds2) |
|
|
|
|
|
|
|
return 1; |
|
|
|
|
|
|
|
else return 0; |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// num_leechs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.columns['num_leechs'].updateTd = this.columns['num_seeds'].updateTd; |
|
|
|
|
|
|
|
this.columns['num_leechs'].compareRows = this.columns['num_seeds'].compareRows; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// dlspeed
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.columns['dlspeed'].updateTd = function (td, row) { |
|
|
|
|
|
|
|
var speed = this.getRowValue(row); |
|
|
|
|
|
|
|
td.set('html', friendlyUnit(speed, true)); |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// upspeed
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.columns['upspeed'].updateTd = this.columns['dlspeed'].updateTd; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// eta
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.columns['eta'].updateTd = function (td, row) { |
|
|
|
|
|
|
|
var eta = this.getRowValue(row); |
|
|
|
|
|
|
|
td.set('html', friendlyDuration(eta, true)); |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ratio
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.columns['ratio'].updateTd = function (td, row) { |
|
|
|
|
|
|
|
var ratio = this.getRowValue(row); |
|
|
|
|
|
|
|
var html = null; |
|
|
|
|
|
|
|
if (ratio == -1) |
|
|
|
|
|
|
|
html = '∞'; |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
html = (Math.floor(100 * ratio) / 100).toFixed(2); //Don't round up
|
|
|
|
|
|
|
|
td.set('html', html); |
|
|
|
|
|
|
|
}; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
}); |
|
|
|
}); |
|
|
|