imageburner.html revision bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293
1<!DOCTYPE html>
2<html i18n-values="dir:textdirection;">
3<head>
4<meta charset=UTF-8">
5<title i18n-content="title"></title>
6<style>
7body {  
8  -webkit-user-select: none;
9}
10  
11h1 {
12  border-bottom: 1px solid #7289E2;
13  padding: 8px;
14  height: 32px;
15  background-image: -webkit-gradient(linear,
16                                     left top,
17                                     left bottom,
18                                     from(#D0DAF8),
19                                     to(#A6BAF7));
20  border: 1px solid #999;
21  border-top: 0;
22  color: black;
23}
24
25html[dir='rtl'] h1 {
26  left: auto;
27  right: 0;
28  background-image: -webkit-gradient(linear,
29                                     right top,
30                                     right bottom,
31                                     from(#D0DAF8),
32                                     to(#A6BAF7));
33}
34 
35.rowlink {
36  height: 100%;
37  -webkit-margin-end: 2px;
38}
39
40.devicerow div.icon {
41  -webkit-margin-start: 5px;
42  margin-top: -3px;
43  float: left;
44  width: 17px;
45  height: 17px;
46  background-repeat: no-repeat;
47  background: url('shared/images/icon_folder.png');
48}
49
50html[dir='rtl'] .devicerow div.icon {
51  float: right;
52}
53
54.burnicon {
55  background:  url('shared/images/filebrowse_menu.png');
56  position: absolute;
57  right: 4px;
58  top: 5px;
59  height: 15px;
60  width: 15px;
61  margin-top: 5px;
62  background-repeat: no-repeat;
63  cursor: pointer;
64  opacity: 0.3;
65  -webkit-transition: opacity 0.15s ease-out;
66  border: 0;
67}
68
69html[dir='rtl'].burnicon {
70  right: auto;
71  left: 4px;
72}
73
74.devicerow:hover .burnicon {
75  opacity: 0.75;
76  -webkit-transition: none;
77}
78
79.devicerow:hover .burnicon:hover {
80  opacity: 1;
81  -webkit-transition: none;
82}
83
84.devicerow {
85  border-bottom: 1px solid #f7f7f7;
86  padding: 8px 5px 5px 8px;
87  font-size: .8em;
88  position: relative;
89  background-color: #fff;
90}
91
92html[dir='rtl'] .devicerow {
93  padding: 8px 8px 5px 5px;
94}
95
96.devicerow:hover {
97  background-color: #ebeff9;
98  cursor: pointer;
99}
100
101.devicerow span.name {
102  margin-top: 10px;
103  -webkit-margin-start: 10px;
104}
105
106.selected {
107  background-color: #b1c8f2;
108}
109
110h1.title {
111  margin-top: 5px;
112  text-align: center;
113  font-size: 1.2em;
114  font-weight: bold;
115}
116
117.columnlist {
118  width: 100%;
119  bottom: 0;
120}
121
122.fullcontainer {
123  top: 0px;
124  position: absolute;
125  left: 0;
126  bottom: 0;
127  right: 600px;
128  border-right: 1px solid #7289E2;
129}
130
131html[dir='rtl'] .fullcontainer {
132  left: 600px;
133  right: 0;
134  border-right: auto;
135  border-left: 1px solid #7289E2;
136}
137
138progress {
139  -webkit-margin-start: 15px;
140  width: 700px;
141}
142
143.progressText {
144  -webkit-padding-start: 20px;
145  font-size: .6em;
146  font: "Helvetica";
147}
148
149.statusText {
150  padding-top: 5px;
151  -webkit-padding-start: 15px;
152  font-size: 1em;
153}
154
155.statusDiv{
156  border-bottom: 1px solid #f7f7f7;
157  padding-bottom: 2px;
158  background-color: #fff;
159}
160
161#rootsColumn:not(.burningColumn) {
162  height: 50%;
163}
164
165#statusColumn:not(.burningColumn) {
166  height: 50%; 
167  border-top: 1px solid #7289E2;
168}
169</style>
170
171<script src="shared/js/local_strings.js"></script>
172<script>
173function $(o) {
174  return document.getElementById(o);
175}
176
177var currentlySelectedItem;
178var currentlySelectedPath;
179var localStrings;
180var statusMessages;
181var burnStarted;
182
183function promtUserDownloadFinished() {
184  // This could be done nicer.
185  var answer = confirm(localStrings.getString('burnConfirmText1') +
186      currentlySelectedPath + localStrings.getString('burnConfirmText2'));
187  chrome.send(answer ? 'burnImage' : 'cancelBurnImage', []);
188}
189
190function alertUserDownloadAborted(){
191  alert(localStrings.getString('downloadAbortedMessage'));
192}
193
194function burnSuccessful() {
195  alert(localStrings.getString('burnSuccessfulMessage'));
196}
197
198function burnUnsuccessful(){
199  alert(localStrings.getString('burnUnsuccessfulMessage'));
200}
201  
202function rootsChanged(){
203  chrome.send('getRoots', []);
204}
205  
206function browseFileResult(info, results) {
207  var path = info.path;
208  var list = $('rootsList');
209  list.innerHTML = '';
210  var selectedRemoved = true;
211  var addedRoots=[];
212  for (var x = 0; x < results.length; x++) {
213    if (!(results[x].title in addedRoots)) {
214      addedRoots[results[x].title] = true;
215      var element = createNewItem(results[x].title, results[x].path);
216      if (results[x].path == currentlySelectedPath) {
217        selectItem(element.id, results[x].path);
218        selectedRemoved = false;
219      }
220      list.appendChild(element);
221    }
222  }
223  if (selectedRemoved) {
224    currentlySelectedItem = null;
225    currentlySelectedPath = null;
226  }
227}
228
229function selectItem(elementId, path) {
230  var element = $(elementId);
231  var index;
232  if (currentlySelectedItem)
233    currentlySelectedItem.className = 'devicerow';
234  if (element) {
235    element.className = 'selected devicerow';
236    currentlySelectedItem = element;
237    currentlySelectedPath = path;
238  }
239}
240
241function createProgressElement(id) {
242  var statusDiv = document.createElement('div');
243  statusDiv.id = id;
244  statusDiv.className = 'statusDiv';
245  
246  var statusText = document.createElement('div');
247  statusText.id = id + 'StatusText';
248  statusText.className = 'statusText';
249  statusDiv.appendChild(statusText);
250  
251  var progressBar = document.createElement('progress');
252  progressBar.id = id + 'ProgressBar';
253  progressBar.className = 'progressBar';
254  statusDiv.appendChild(progressBar);
255
256  var progressText = document.createElement('div');
257  progressText.id = id + 'ProgressText';
258  progressText.className = 'progressText'
259  statusDiv.appendChild(progressText);
260  
261  return statusDiv;
262}
263
264function setProgressElementFinalValues(element, statuses, event) {
265  var statusTextDiv;
266  var progressBarDiv;
267  var progressTextDiv;
268  for (var i = 0; i < element.children.length; i++ ) {
269    switch(element.children[i].className) {
270      case 'statusText':
271        statusTextDiv = element.children[i];
272        break;
273      case 'progressBar':
274        progressBarDiv = element.children[i];
275        break;
276      case 'progressText':
277        progressTextDiv = element.children[i];
278        break;
279    }
280  }  
281  if (event == 'COMPLETE')
282    statusTextDiv.textContent = statuses['finished'];
283  else
284      statusTextDiv.textContent = statuses['canceled'];
285      
286  var progressBarParent = progressBarDiv.parentNode;
287  progressBarParent.removeChild(progressBarDiv); 
288  
289  var progressTextParent = progressTextDiv.parentNode;
290  progressTextParent.removeChild(progressTextDiv);
291  return element;
292}
293
294function setProgressElementValues(element, statuses, amountFinished, 
295                                  amountTotal, progressText){
296  var statusTextDiv;
297  var progressBarDiv;
298  var progressTextDiv;
299  for (var i = 0; i < element.children.length; i++ ) {
300    switch(element.children[i].className) {
301      case 'statusText':
302        statusTextDiv = element.children[i];
303        break;
304      case 'progressBar':
305        progressBarDiv = element.children[i];
306        break;
307      case 'progressText':
308        progressTextDiv = element.children[i];
309        break;
310    }
311  }  
312 
313  if (!(amountFinished > 0)) {
314    amountFinished = 0; 
315    statusTextDiv.textContent = statuses["start"];
316    progressTextDiv.textContent = "";
317  } else {
318    statusTextDiv.textContent = statuses["inProgress"];
319    progressTextDiv.textContent = progressText;
320  }
321  if(amountFinished > amountTotal)
322    amountFinished = amountTotal;
323  progressBarDiv.value = amountFinished;
324  if (amountTotal)
325    progressBarDiv.max = amountTotal;  
326  return element;
327}
328
329function updateProgressElement(progressType, progressInfo) {
330  var element = $(progressType + 'ProgressElement');
331  if (!element) {
332    element = createProgressElement(progressType + 'ProgressElement');
333    var column  = $('statusList');
334    column.appendChild(element);
335  }
336  var errorOccurred = (progressInfo.state == 'CANCELLED');
337  if (progressInfo.state == 'IN_PROGRESS') {
338    setProgressElementValues(element, statusMessages[progressType],  
339        progressInfo.received, progressInfo.total, 
340        progressInfo.progress_status_text); 
341  } else {
342    setProgressElementFinalValues(element, statusMessages[progressType],
343                                  progressInfo.state);
344  }   
345}
346
347function downloadUpdated(result) { 
348  updateProgressElement('download', result);
349}
350
351function burnProgressUpdated(result) { 
352  if (!burnStarted) {
353    $('rootsList').style.display = 'none';
354    $('rootsListTitle').textContent = result.path;
355    $('rootsColumn').className = 'burningColumn columnList';
356    $('statusColumn').className = 'burningColumn columnList';
357    burnStarted = true;
358  }
359  updateProgressElement('burn', result);
360}
361
362var elementIdCounter = 0;
363
364function createNewItem(title, path) {
365  var element = document.createElement('div');
366  element.className = 'devicerow';
367  element.id = path + elementIdCounter;
368  elementIdCounter++;
369  var link;
370  link = document.createElement('div');
371  link.onclick = function() { burnImage(element.id, path); };
372  link.className = 'rowlink';
373
374  var icon = document.createElement('div');
375  icon.className = 'icon';
376  link.appendChild(icon);
377
378  var span = document.createElement('span');
379  span.className = 'name';
380  span.textContent = title;
381  link.appendChild(span);
382
383  element.appendChild(link);
384
385  var burnicon = document.createElement('button');
386  burnicon.className = 'burnicon';
387  burnicon.onclick = function() { burnImage(element.id, path); };
388  element.appendChild(burnicon);
389
390  return element;
391}
392
393function burnImage(elementId, path) {
394  selectItem(elementId, path);
395  chrome.send('downloadImage', [path]);
396}
397
398function clearList(list) {
399  while (list.childNodes.length >= 1) {
400    list.removeChild(list.firstChild);
401  }
402}
403  
404document.addEventListener('DOMContentLoaded', function() {
405  localStrings = new LocalStrings();    
406  burnStarted = false;
407  chrome.send("getRoots", []);
408
409  // Initialize messages that will be displayed as download 
410  // or burn progress is updated.
411  statusMessages = [];
412  
413  var downloadStatuses = [];
414  downloadStatuses['start'] = localStrings.getString('downloadStatusStart');
415  downloadStatuses['inProgress'] = 
416      localStrings.getString('downloadStatusInProgress');
417  downloadStatuses['finished'] = 
418      localStrings.getString('downloadStatusComplete');
419  downloadStatuses['canceled'] = 
420      localStrings.getString('downloadStatusCanceled');
421  statusMessages['download'] = downloadStatuses;
422  
423  var burnStatuses = [];
424  burnStatuses['start'] = localStrings.getString('burnStatusStart');
425  burnStatuses['inProgress'] = localStrings.getString('burnStatusInProgress');
426  burnStatuses['finished'] = localStrings.getString('burnStatusComplete');
427  burnStatuses['canceled'] = localStrings.getString('burnStatusCanceled');
428  statusMessages['burn'] = burnStatuses;
429});
430</script>
431</head>
432<body>
433  <div id="main" class="fullcontainer">
434    <div id="rootsColumn" class="columnlist">
435      <h1 id="rootsListTitle" class="title" i18n-content="listTitle"></h1>  
436      <div id="rootsList"></div>
437    </div>
438    <div id="statusColumn" class="columnlist">
439      <div id="statusList"></div>
440    </div>  
441  </div>
442</body>
443</html>
444