<!DOCTYPE html> <html> <head> <title>Send to Picasa</title> <style type="text/css"> .invisible { display: none; } .cancel-button { cursor: pointer; } </style> </head> <body> <div id="progress-container"> <div id="files-sent-div">A of B files sent.</div> <div> <progress id="files-sent-progress">progress</progress> <span class="cancel-button"> <img id="cancel-normal" src="images/cancel_normal-16.png"> <img id="cancel-hover" src="images/cancel_hover-16.png" class="invisible"> </span> </div> <div id="time-remaining-div">Time remaining: unknown.</div> </div> <div id="completed-container" class="invisible"> <div style="float:left;height:100%;padding:5px;"> <img src="images/green_check-32.png" /> </div> <div style="float:left;height:100%;"> <span id="files-completed-span">X files sent.</span> <br><a id="view-album-link" href="" target="_blank">View Picasa Web Album</a> </div> </div> <div id="failed-container" class="invisible"> <span id="failure-span">Failure. A of B files sent.</span> </div> <div id="canceled-container" class="invisible"> <span id="canceled-span">Canceled. X files sent.</span> </div> <script> /** * Notification constructor. * * Notification object is responsible for manipulating notification dom. */ function Notification() { this.progressContainer_ = document.getElementById('progress-container'); this.filesSentDiv_ = document.getElementById('files-sent-div'); this.filesSentProgress_ = document.getElementById('files-sent-progress'); this.cancelButton_ = document.querySelector('.cancel-button'); this.cancelButton_.addEventListener('click', this.handleOnCancelClicked_.bind(this)) this.cancelButton_.addEventListener('mouseover', this.handleOnCancelOver_.bind(this)) this.cancelButton_.addEventListener('mouseout', this.handleOnCancelOut_.bind(this)) this.cancelNormal_ = document.getElementById('cancel-normal'); this.cancelHover_ = document.getElementById('cancel-hover'); this.timeRemainingDiv_ = document.getElementById('time-remaining-div'); this.completedContainer_ = document.getElementById('completed-container'); this.filesCompletedSpan_ = document.getElementById('files-completed-span'); this.viewAlbumLink_ = document.getElementById('view-album-link'); this.failedContainer_ = document.getElementById('failed-container'); this.failureSpan_ = document.getElementById('failure-span'); this.canceledContainer_ = document.getElementById('canceled-container'); this.canceledSpan_ = document.getElementById('canceled-span'); // Pass this to uploader object, so it will call update methods when needed. chrome.extension.getBackgroundPage().bg.getUploader(window.location.hash). setNotification(this); } Notification.prototype = { /** * Updates notification progress. * @param {number} done Number of files uploaded. * @param {number} total Total number of files to upload. * @param {number} timeRemaining Estimated remaining time. */ update: function(done, total, timeRemaining) { this.filesSentDiv_.textContent = done + ' of ' + total + ' files sent.'; this.filesSentProgress_.max = total; this.filesSentProgress_.value = done; var timeStr = timeRemaining != null ? this.timeToStr(Math.round(timeRemaining / 1000)) : 'unknown'; this.timeRemainingDiv_.textContent = 'Time remaining: ' + timeStr + '.'; }, /** * Converts time to user-readable string. * @param {number} time Time interval. * @return {string} String representation of time. */ timeToStr: function(time) { var hours = Math.floor(time / 3600); var minutes = Math.floor((time % 3600) / 60); var seconds = time % 60; if (hours > 0) { seconds = 0; } var result = ''; if (hours > 0) { result += hours + ' hours '; } if (minutes > 0) { result += minutes + ' minutes'; } if (seconds > 0 || time == 0) { result += seconds + ' seconds'; } return result; }, /** * Shows information about upload failure. * @param {number} done Number of files uploaded. * @param {number} total Total number of files to upload. */ showFailed: function(done, total) { this.progressContainer_.classList.add('invisible'); this.failedContainer_.classList.remove('invisible'); this.failureSpan_.textContent = 'Failure. ' + done + ' of ' + total + ' files sent.'; }, /** * Shows information about upload cancelation. * @param {number} done Number of files uploaded. * @param {number} total Total number of files to upload. */ showCanceled: function(done, total) { this.progressContainer_.classList.add('invisible'); this.canceledContainer_.classList.remove('invisible'); this.canceledSpan_.textContent = 'Canceled. ' + done + ' of ' + total + ' files sent.'; }, /** * Shows information about upload success. * @param {number} done Number of files uploaded. * @param {string} link Link to the picasa web album. */ showCompleted: function(done, link) { this.progressContainer_.classList.add('invisible'); this.completedContainer_.classList.remove('invisible'); this.filesCompletedSpan_.textContent = done + ' files sent.'; this.viewAlbumLink_.setAttribute('href', link); }, /** * Event handler for cancel button clicked. * @param {Event} e Event. */ handleOnCancelClicked_: function(e) { chrome.extension.getBackgroundPage().bg.getUploader(window.location.hash). cancel(); }, /** * Event handler for cancel button mouseover. * @param {Event} e Event. */ handleOnCancelOver_: function(e) { this.cancelNormal_.classList.add('invisible'); this.cancelHover_.classList.remove('invisible'); }, /** * Event handler for cancel button mouseout. * @param {Event} e Event. */ handleOnCancelOut_: function(e) { this.cancelNormal_.classList.remove('invisible'); this.cancelHover_.classList.add('invisible'); } }; /** * The single notification object. * @type {Notification} */ var notification = new Notification(); </script> </body> </html>