// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* Item used in preview grid view.
* @param {picasa.LocalFile} dataItem Data item.
* @extends {cr.ui.GridItem}
*/
function PreviewItem(dataItem) {
var item = new cr.ui.GridItem(dataItem);
item.__proto__ = PreviewItem.prototype;
return item;
}
PreviewItem.prototype = {
__proto__: cr.ui.GridItem.prototype,
/**
* Called to initialize element.
*/
decorate: function() {
cr.ui.GridItem.prototype.decorate.call(this, arguments);
this.textContent = '';
this.className = 'preview-item';
var div = this.ownerDocument.createElement('div');
this.appendChild(div);
var img = this.ownerDocument.createElement('img');
this.dataItem.showInImage(img);
div.appendChild(img);
}
};
/**
* UploadPage constructor.
*
* UploadPage object is responsible for manipulating upload page.
*/
function UploadPage() {
this.files_ = new cr.ui.ArrayDataModel([]);
this.files_.addEventListener('splice', this.handleOnFilesChanged_.bind(this));
this.title_ = document.querySelector('.header-title');
this.loginDiv_ = document.querySelector('.login-div');
this.loginInput_ = document.getElementById('login-input');
this.passwordInput_ = document.getElementById('password-input');
this.captchaRow_ = document.querySelector('.captcha-row');
this.captchaImage_ = document.querySelector('.captcha-row img');
this.captchaInput_ = document.getElementById('captcha-input');
this.loginFailure_ = document.querySelector('.login-failure');
this.loginButton_ = document.querySelector('.login-button');
this.loginButton_.addEventListener('click',
this.handleOnLoginClicked_.bind(this));
var buttons = document.querySelectorAll('.cancel-button');
for (var i = 0; i < buttons.length; i++) {
buttons[i].addEventListener('click', this.close_.bind(this));
}
this.albumDiv_ = document.querySelector('.album-div');
this.filesCountSpan_ = document.getElementById('files-count-span');
this.albumSelect_ = document.getElementById('album-select');
this.albumSelect_.addEventListener('change',
this.handleOnAlbumSelected_.bind(this));
this.albumTitleInput_ = document.getElementById('album-title-input');
this.albumTitleInput_.addEventListener('change',
this.handleOnAlbumTitleChanged_.bind(this));
this.albumLocationInput_ = document.getElementById('album-location-input');
this.albumLocationInput_.addEventListener('change',
this.handleOnAlbumLocationChanged_.bind(this));
this.albumDescriptionTextarea_ =
document.getElementById('album-description-textarea');
this.albumDescriptionTextarea_.addEventListener('change',
this.handleOnAlbumDescriptionChanged_.bind(this));
this.previewGrid_ = document.querySelector('.preview-grid');
cr.ui.Grid.decorate(this.previewGrid_);
this.previewGrid_.itemConstructor = PreviewItem;
this.previewGrid_.dataModel = this.files_;
this.previewGrid_.selectionModel = new cr.ui.ListSingleSelectionModel();
this.uploadButton_ = document.querySelector('.upload-button');
this.uploadButton_.addEventListener('click',
this.handleOnUploadClicked_.bind(this));
document.querySelector('.logout-button').addEventListener('click',
this.handleOnLogoutClicked_.bind(this));
// Login page is shown first.
this.showLogin_();
this.client_ = chrome.extension.getBackgroundPage().bg.client;
// If user logged in before, skip the login page.
if (this.client_.authorized) {
this.loginCallback_('success');
}
}
UploadPage.prototype = {
/**
* Adds more files to upload.
* @param {Array.<picasa.LocalFile>} files The files to add.
*/
addFiles: function(files) {
for (var i = 0; i < files.length; i++) {
this.files_.push(files[i]);
}
},
/**
* Loads files to upload from background page.
*/
loadFilesFromBackgroundPage_: function() {
var newFiles = chrome.extension.getBackgroundPage().bg.getNewFiles();
this.addFiles(newFiles);
},
/**
* @return {boolean} Whether upload should be enabled.
*/
canUpload_: function() {
return (this.albumTitleInput_.value != '') &&
(this.files_.length > 0) && this.client_.authorized;
},
/**
* Sets enabled attribute to element.
* @param {HTMLElement} elt Element to set enabled on.
* @param {boolean} enabled Whether element should be enabled or disabled.
*/
setEnabled_: function(elt, enabled) {
if (enabled) {
elt.removeAttribute('disabled');
} else {
elt.setAttribute('disabled', 'disabled');
}
},
/**
* Enables/disables upload button as needed.
*/
checkUploadButtonEnabled_: function() {
this.setEnabled_(this.uploadButton_, this.canUpload_());
},
/**
* Shows login page.
*/
showLogin_: function() {
this.title_.textContent = 'Sign in to Picasa';
this.loginDiv_.classList.remove('invisible');
this.albumDiv_.classList.add('invisible');
this.captchaRow_.classList.add('invisible');
},
/**
* Shows the number of upload files.
*/
showFilesCount_: function() {
this.filesCountSpan_.textContent = '' + this.files_.length;
},
/**
* Shows the "choose album" page.
*/
showChooseAlbum_: function() {
this.title_.textContent = 'Choose an Album';
this.checkUploadButtonEnabled_();
this.loginDiv_.classList.add('invisible');
this.albumDiv_.classList.remove('invisible');
this.showFilesCount_();
},
/**
* Event handler for files list changed.
* @param {Event} e Event.
*/
handleOnFilesChanged_: function(e) {
this.showFilesCount_();
this.checkUploadButtonEnabled_();
},
/**
* Callback from picasa client after login.
* @param {string} status Login status: success, failure or captcha.
*/
loginCallback_: function(status) {
this.setEnabled_(this.loginButton_, true);
if (status == 'success') {
this.loginFailure_.classList.add('invisible');
this.showChooseAlbum_();
this.loadFilesFromBackgroundPage_();
this.client_.getAlbums(this.getAlbumsCallback_.bind(this));
} else if (status == 'captcha') {
this.captchaRow_.classList.remove('invisible');
this.captchaImage_.setAttribute('src', this.client_.captchaUrl);
} else if (status == 'failure') {
this.loginFailure_.classList.remove('invisible');
}
},
/**
* Event handler for login button clicked.
* @param {Event} e Event.
*/
handleOnLoginClicked_: function(e) {
this.setEnabled_(this.loginButton_, false);
var password = this.passwordInput_.value;
this.passwordInput_.value = '';
var captcha = this.client_.captchaUrl ? this.captchaInput_.value : null;
this.client_.login(this.loginInput_.value, password,
this.loginCallback_.bind(this), captcha);
},
/**
* Callback from picasa client after getting albums list.
* @param {Array.<picasa.Album>} albums Albums list.
*/
getAlbumsCallback_: function(albums) {
// Adding fake album with id=null.
this.client_.albums.push(
new picasa.Album(null, 'Create New Album', '', '', ''));
albums = this.client_.albums;
this.albumSelect_.options.length = 0;
for (var album, i = 0; album = albums[i]; i++) {
this.albumSelect_.options[i] = new Option(album.title, i);
}
this.albumSelect_.selectedIndex = albums.length - 1;
albums[albums.length - 1].title = '';
this.handleOnAlbumSelected_(null);
},
/**
* Event handler for logout button clicked.
* @param {Event} e Event.
*/
handleOnLogoutClicked_: function(e) {
this.client_.logout();
this.showLogin_();
},
/**
* Event handler for album selection changed.
* @param {Event} e Event.
*/
handleOnAlbumSelected_: function(e) {
var album = this.client_.albums[this.albumSelect_.selectedIndex];
var enabled = album.id == null;
this.setEnabled_(this.albumTitleInput_, enabled);
this.setEnabled_(this.albumLocationInput_, enabled);
this.setEnabled_(this.albumDescriptionTextarea_, enabled);
this.albumTitleInput_.value = album.title;
this.albumLocationInput_.value = album.location;
this.albumDescriptionTextarea_.value = album.description;
this.checkUploadButtonEnabled_();
},
/**
* Event handler for upload button clicked.
* @param {Event} e Event.
*/
handleOnUploadClicked_: function(e) {
this.setEnabled_(this.uploadButton_, false);
var album = this.client_.albums[this.albumSelect_.selectedIndex];
if (album.id == null) {
this.client_.createAlbum(album, this.createAlbumCallback_.bind(this));
} else {
this.createAlbumCallback_(album);
}
},
/**
* Callback from picasa client after album created.
* @param {Event} e Event.
*/
createAlbumCallback_: function(album) {
if (!album) {
this.setEnabled_(this.uploadButton_, true);
alert('Failed to create album.\nTry again.');
return;
}
var files = [];
for (var i = 0; i < this.files_.length; i++) {
files.push(this.files_.item(i));
}
chrome.extension.getBackgroundPage().bg.uploadFiles(files, album);
this.close_();
},
/**
* Event handler for album title changed.
* @param {Event} e Event.
*/
handleOnAlbumTitleChanged_: function(e) {
var album = this.client_.albums[this.albumSelect_.selectedIndex];
album.title = this.albumTitleInput_.value;
this.checkUploadButtonEnabled_();
},
/**
* Event handler for album location changed.
* @param {Event} e Event.
*/
handleOnAlbumLocationChanged_: function(e) {
var album = this.client_.albums[this.albumSelect_.selectedIndex];
album.location = this.albumLocationInput_.value;
},
/**
* Event handler for album description changed.
* @param {Event} e Event.
*/
handleOnAlbumDescriptionChanged_: function(e) {
var album = this.client_.albums[this.albumSelect_.selectedIndex];
album.description = this.albumDescriptionTextarea_.value;
},
/**
* Closes the upload page.
*/
close_: function() {
window.close();
}
};
var uploadPage = new UploadPage();