Transmission: update from 2.42 to 2.50
[tomato.git] / release / src / router / transmission / web / javascript / file-row.js
blob03ea07d70b9e814e3b70db6b86a9093b4b548134
1 /**
2  * Copyright © Mnemosyne LLC
3  *
4  * This file is licensed under the GPLv2.
5  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
6  */
8 function FileRow(torrent, i)
10         var fields = {
11                 have: 0,
12                 index: 0,
13                 isDirty: false,
14                 isWanted: true,
15                 priority: 0,
16                 me: this,
17                 size: 0,
18                 torrent: null
19         },
21         elements = {
22                 priority_low_button: null,
23                 priority_normal_button: null,
24                 priority_high_button: null,
25                 progress: null,
26                 root: null
27         },
29         initialize = function(torrent, i) {
30                 fields.torrent = torrent;
31                 fields.index = i;
32                 createRow(torrent, i);
33         },
35         readAttributes = function(file) {
36                 if (fields.have !== file.bytesCompleted) {
37                         fields.have = file.bytesCompleted;
38                         fields.isDirty = true;
39                 }
40                 if (fields.size !== file.length) {
41                         fields.size = file.length;
42                         fields.isDirty = true;
43                 }
44                 if (fields.priority !== file.priority) {
45                         fields.priority = file.priority;
46                         fields.isDirty = true;
47                 }
48                 if (fields.isWanted !== file.wanted) {
49                         fields.isWanted = file.wanted;
50                         fields.isDirty = true;
51                 }
52         },
54         refreshWantedHTML = function()
55         {
56                 var e = $(elements.root);
57                 e.toggleClass('skip', !fields.isWanted);
58                 e.toggleClass('complete', isDone());
59                 $(e[0].checkbox).prop('checked', fields.isWanted);
60         },
61         refreshPriorityHTML = function()
62         {
63                 $(elements.priority_high_button  ).toggleClass('selected', fields.priority ===  1 );
64                 $(elements.priority_normal_button).toggleClass('selected', fields.priority ===  0 );
65                 $(elements.priority_low_button   ).toggleClass('selected', fields.priority === -1 );
66         },
67         refreshProgressHTML = function()
68         {
69                 var pct = 100 * (fields.size ? (fields.have / fields.size) : 1.0),
70                     c = [ Transmission.fmt.size(fields.have),
71                           ' of ',
72                           Transmission.fmt.size(fields.size),
73                           ' (',
74                           Transmission.fmt.percentString(pct),
75                           '%)' ].join('');
76                 setInnerHTML(elements.progress, c);
77         },
78         refreshHTML = function() {
79                 if (fields.isDirty) {
80                         fields.isDirty = false;
81                         refreshProgressHTML();
82                         refreshWantedHTML();
83                         refreshPriorityHTML();
84                 }
85         },
86         refresh = function() {
87                 readAttributes(fields.torrent.getFile(fields.index));
88                 refreshHTML();
89         },
91         isDone = function () {
92                 return fields.have >= fields.size;
93         },
95         createRow = function(torrent, i) {
96                 var file = torrent.getFile(i), e, name, root, box;
98                 root = document.createElement('li');
99                 root.id = 't' + fields.torrent.getId() + 'f' + fields.index;
100                 root.className = 'inspector_torrent_file_list_entry ' + ((i%2)?'odd':'even');
101                 elements.root = root;
103                 e = document.createElement('input');
104                 e.type = 'checkbox';
105                 e.className = "file_wanted_control";
106                 e.title = 'Download file';
107                 $(e).change(function(ev){ fireWantedChanged( $(ev.currentTarget).prop('checked')); });
108                 root.checkbox = e;
109                 root.appendChild(e);
111                 e = document.createElement('div');
112                 e.className = 'file-priority-radiobox';
113                 box = e;
115                         e = document.createElement('div');
116                         e.className = 'low';
117                         e.title = 'Low Priority';
118                         $(e).click(function(){ firePriorityChanged(-1); });
119                         elements.priority_low_button = e;
120                         box.appendChild(e);
122                         e = document.createElement('div');
123                         e.className = 'normal';
124                         e.title = 'Normal Priority';
125                         $(e).click(function(){ firePriorityChanged(0); });
126                         elements.priority_normal_button = e;
127                         box.appendChild(e);
129                         e = document.createElement('div');
130                         e.title = 'High Priority';
131                         e.className = 'high';
132                         $(e).click(function(){ firePriorityChanged(1); });
133                         elements.priority_high_button = e;
134                         box.appendChild(e);
136                 root.appendChild(box);
138                 name = file.name || 'Unknown';
139                 name = name.substring(name.lastIndexOf('/')+1);
140                 name = name.replace(/([\/_\.])/g, "$1​");
141                 e = document.createElement('div');
142                 e.className = "inspector_torrent_file_list_entry_name";
143                 e.innerHTML = name;
144                 root.appendChild(e);
146                 e = document.createElement('div');
147                 e.className = "inspector_torrent_file_list_entry_progress";
148                 root.appendChild(e);
149                 elements.progress = e;
151                 refresh();
152                 return root;
153         },
155         fireWantedChanged = function(do_want) {
156                 $(fields.me).trigger('wantedToggled',[ fields.me, do_want ]);
157         },
158         firePriorityChanged = function(priority) {
159                 $(fields.me).trigger('priorityToggled',[ fields.me, priority ]);
160         };
162         /***
163         ****  PUBLIC
164         ***/
166         this.getElement = function() {
167                 return elements.root;
168         };
169         this.getIndex = function() {
170                 return fields.index;
171         };
172         this.isEditable = function () {
173                 return (fields.torrent.getFileCount()>1) && !isDone();
174         };
176         initialize(torrent, i);