blob: 5b073f5864a727c4ecce832b85bea746b813f8be [file] [log] [blame]
const CURRENT_LOCALE = chrome.i18n.getMessage('@@ui_locale');
const MULTIPART_FORMDATA_BOUNDARY = 'Google_Chrome_Screen_Capture';
const HIDE_ERROR_INFO_DELAY_TIME = 5000;
var UploadUI = {
currentSite: '',
uploading: false,
sites: {},
registerSite: function(id, siteObject) {
this.sites[id] = siteObject;
},
getSiteObject: function(id) {
return this.sites[id];
},
setUploading: function(state) {
UploadUI.uploading = state;
},
init: function() {
// Register supported site for image sharing.
UploadUI.registerSite(SinaMicroblog.siteId, SinaMicroblog);
UploadUI.registerSite(Facebook.siteId, Facebook);
UploadUI.registerSite(Picasa.siteId, Picasa);
UploadUI.registerSite(Imgur.siteId, Imgur);
// Import style sheet for current locale
if (CURRENT_LOCALE == 'zh_CN')
UI.addStyleSheet('./i18n_styles/zh_CN_upload_image.css');
else
UI.addStyleSheet('./i18n_styles/en_US_upload_image.css');
// Get i18n message
i18nReplace('shareToSinaMicroblogText', SinaMicroblog.siteId +
'_upload_header');
i18nReplace('shareToFacebookText', Facebook.siteId + '_upload_header');
i18nReplace('shareToPicasaText', Picasa.siteId + '_upload_header');
i18nReplace('lastStep', 'return_to_site_selection');
i18nReplace('closeUploadWrapper', 'close_upload_wrapper');
i18nReplace('imageCaptionText', 'image_caption');
i18nReplace('photoSizeTip', 'photo_size_tip');
i18nReplace('shareToImgurText', Imgur.siteId + '_upload_header');
$('requiredFlag').setAttribute('title',
chrome.i18n.getMessage('invalid_caption'));
// Add event listeners
//$('btnUpload').addEventListener('click', UploadUI.showUploadWrapper, false);
$('btnSave').addEventListener('click', UploadUI.saveImage, false);
$('closeUploadWrapper').addEventListener('click',
UploadUI.hideUploadWrapper, false);
$('picasaBtn').addEventListener('click', function() {
UploadUI.showUploadContentWrapper(Picasa.siteId);
});
$('facebookBtn').addEventListener('click', function() {
UploadUI.showUploadContentWrapper(Facebook.siteId);
}, false);
$('sinaMicroblogBtn').addEventListener('click', function() {
UploadUI.showUploadContentWrapper(SinaMicroblog.siteId);
}, false);
$('imgurBtn').addEventListener('click', function() {
UploadUI.showUploadContentWrapper(Imgur.siteId);
}, false);
$('shareToOtherAccount').addEventListener('click', function() {
var currentSite = UploadUI.currentSite;
// Validate image description first
if (UploadUI.validatePhotoDescription(currentSite)) {
var callback = function() {
var authenticationTip =
chrome.i18n.getMessage('user_authentication_tip');
UploadUI.showAuthenticationProgress(authenticationTip);
UploadUI.getAccessToken(currentSite);
};
var users = Account.getUsers(currentSite);
var numberOfUsers = Object.keys(users).length;
// Logout when user has authenticated app
if (numberOfUsers) {
var logoutTip = chrome.i18n.getMessage('user_logout_tip');
UploadUI.showAuthenticationProgress(logoutTip);
var site = UploadUI.getSiteObject(currentSite);
site.logout(callback);
} else {
callback();
}
}
}, false);
$('lastStep').addEventListener('click', UploadUI.showUploadSitesWrapper,
false);
},
showUploadWrapper: function() {
var uploadWrapper = $('uploadWrapper');
UI.show(uploadWrapper);
// Reset upload wrapper position
var viewportWidth = window.innerWidth;
var viewportHeight = window.innerHeight;
var wrapperWidth = uploadWrapper.offsetWidth;
var wrapperHeight = uploadWrapper.offsetHeight;
var left = (viewportWidth - wrapperWidth) / 2;
var top = (viewportHeight - wrapperHeight) / 3;
left = left < 0 ? 0 : left;
top = top < 0 ? 0 : top;
var scrollTop = document.body.scrollTop;
var scrollLeft = document.body.scrollLeft;
UI.setStyle(uploadWrapper, {
top: top + scrollTop + 'px',
left: left + scrollLeft + 'px'
});
UploadUI.showUploadSitesWrapper();
UploadUI.showOverlay();
},
hideUploadWrapper: function() {
UI.hide($('uploadWrapper'));
UploadUI.hideOverlay();
},
showOverlay: function() {
var overlay = $('overlay');
UI.setStyle(overlay, {
width: document.body.scrollWidth + 'px',
height: document.body.scrollHeight + 'px'
});
UI.show($('overlay'));
},
hideOverlay: function() {
UI.hide($('overlay'));
},
updateUploadHeader: function(title) {
$('uploadHeader').firstElementChild.firstElementChild.innerText = title;
},
showUploadSitesWrapper: function() {
var uploadHeader = chrome.i18n.getMessage('upload_sites_header');
UploadUI.updateUploadHeader(uploadHeader);
UI.show($('uploadSitesWrapper'));
UploadUI.hideUploadContentWrapper();
UI.hide($('lastStep'));
},
hideUploadSitesWrapper: function() {
UI.hide($('uploadSitesWrapper'));
},
showUploadContentWrapper: function(site) {
UploadUI.currentSite = site;
// Update upload wrapper UI
var uploadHeader = chrome.i18n.getMessage(site + '_upload_header');
UploadUI.updateUploadHeader(uploadHeader);
UploadUI.hideUploadSitesWrapper();
UploadUI.hideErrorInfo();
UploadUI.hideAuthenticationProgress();
UploadUI.clearPhotoDescription();
UI.show($('uploadContentWrapper'));
UI.show($('lastStep'));
UploadUI.updateShareToOtherAccountText(site);
UploadUI.togglePhotoDescriptionRequiredFlag(site);
// Show authenticated accounts of current site
UploadUI.clearAccounts();
var users = Account.getUsers(site);
for (var userId in users) {
UploadUI.addAuthenticatedAccount(site, userId);
}
},
hideUploadContentWrapper: function() {
UI.hide($('uploadContentWrapper'));
},
clearPhotoDescription: function() {
$('imageCaption').value = '';
},
validatePhotoDescription: function(site) {
var caption = $('imageCaption');
var invalidCaptionMsg = chrome.i18n.getMessage('invalid_caption');
// Validate photo description
if (site == SinaMicroblog.siteId && caption.value == '') {
UploadUI.showErrorInfo(invalidCaptionMsg);
caption.focus();
return false;
}
return true;
},
togglePhotoDescriptionRequiredFlag: function(siteId) {
if (siteId == SinaMicroblog.siteId)
UI.show($('requiredFlag'));
else
UI.hide($('requiredFlag'));
},
updateShareToOtherAccountText: function(siteId) {
var users = Account.getUsers(siteId);
var userLength = Object.keys(users).length;
if (userLength)
i18nReplace('shareToOtherAccount', 'share_to_other_account');
else
i18nReplace('shareToOtherAccount', 'share_to_' + siteId + '_account');
},
showErrorInfo: function(text) {
UI.show($('errorWrapper'));
$('errorInfo').innerHTML = text;
setTimeout(function() {
UploadUI.hideErrorInfo();
}, HIDE_ERROR_INFO_DELAY_TIME);
},
hideErrorInfo: function() {
UI.hide($('errorWrapper'));
},
showProgressBar: function(accountId) {
var progress = document.querySelector('#' + accountId +
' .progressBar');
UI.show(progress);
},
hideProgressBar: function(accountId) {
var progress = document.querySelector('#' + accountId +
' .progressBar');
UI.hide(progress);
},
showAuthenticationProgress: function(title) {
var progress = $('authenticationProgress');
progress.setAttribute('title', title);
UI.show(progress);
},
hideAuthenticationProgress: function() {
UI.hide($('authenticationProgress'));
},
setProgress: function(accountId, loaded, total) {
console.log('In setProgress, loaded: ' + loaded + ', total: ' + total);
var progress = document.querySelector('#' + accountId + ' .progressBar');
// One progress bar has 4 parts to represent progress
var level = parseInt(loaded / total / 0.25);
UI.setStyle(progress, 'background-position-y', '-' + (12 * level) + 'px');
},
showPhotoLink: function(accountId, link) {
var photoLink = document.querySelector('#' + accountId + ' .photoLink');
photoLink.setAttribute('href', link);
UI.setStyle(photoLink, 'display', 'inline');
},
hidePhotoLink: function(accountId) {
var photoLink = document.querySelector('#' + accountId + ' .photoLink');
UI.hide(photoLink);
},
showUploadInfo: function(accountId, text) {
var uploadInfo = document.querySelector('#' + accountId + ' .uploadInfo');
uploadInfo.innerHTML = text;
UI.show(uploadInfo);
},
hideUploadInfo: function(accountId) {
var uploadInfo = document.querySelector('#' + accountId + ' .uploadInfo');
UI.hide(uploadInfo);
},
clearAccounts: function() {
$('uploadAccountList').innerHTML = '';
},
addAuthenticatedAccount: function(site, userId) {
var template = $('accountItemTemplate').innerHTML;
// Replace i18n message
template = template.replace(/\$\{accountId\}/gi, site + '_' + userId);
var shareToText = chrome.i18n.getMessage('share_to');
template = template.replace(/\$\{accountName\}/gi,
shareToText + ' ' + Account.getUser(site, userId)['name']);
template = template.replace('${site}', site);
template = template.replace('${userId}', userId);
template = template.replace(/\$\{deletionTitle\}/gi,
chrome.i18n.getMessage('deletion_title'));
template = template.replace(/\$\{photoLinkText\}/gi,
chrome.i18n.getMessage('photo_link_text'));
template = template.replace(/\$\{progressInfo\}/gi,
chrome.i18n.getMessage('progress_info'));
// At most show 3 authenticated users
var uploadAccountList = $('uploadAccountList');
var accountsNumber = uploadAccountList.childElementCount;
if (accountsNumber == 2) {
uploadAccountList.removeChild(uploadAccountList.lastElementChild);
}
uploadAccountList.innerHTML = template + uploadAccountList.innerHTML;
$('accountName').addEventListener('click', function(e) {
UploadUI.upload(site, userId);
});
$('deleteBtn').addEventListener('click', function(e) {
e.stopPropagation();
UploadUI.deleteAccountItem(site + '_' + userId);
});
UploadUI.updateShareToOtherAccountText(site);
},
deleteAccountItem: function(accountId, noConfirm) {
if (UploadUI.uploading && !noConfirm)
return;
var confirmText = chrome.i18n.getMessage('account_deletion_confirm');
if (noConfirm || confirm(confirmText)) {
$('uploadAccountList').removeChild($(accountId));
// Clear localStorage
var site = accountId.split('_')[0];
var userId = accountId.split('_')[1];
Account.removeUser(site, userId);
UploadUI.updateShareToOtherAccountText(site);
}
},
upload: function(siteId, userId) {
if (UploadUI.uploading)
return;
// Initialize UI
var accountId = siteId + '_' + userId;
UploadUI.hideErrorInfo();
UploadUI.hideUploadInfo(accountId);
UploadUI.hidePhotoLink(accountId);
if (!UploadUI.validatePhotoDescription(siteId))
return;
var caption = $('imageCaption').value;
// Get ready for upload image.
photoshop.draw();
UploadUI.setUploading(true);
UploadUI.showProgressBar(accountId);
var site = UploadUI.getSiteObject(siteId);
var user = Account.getUser(siteId, userId);
var imageData = UploadUI.getImageData();
var infoText;
var callback = function(result, photoIdOrMessage) {
if (result == 'success') {
infoText = chrome.i18n.getMessage('get_photo_link');
UploadUI.showUploadInfo(accountId, infoText);
site.getPhotoLink(user, photoIdOrMessage, function(photoLinkResult,
photoLinkOrMessage) {
if (photoLinkResult == 'success') {
UploadUI.setUploading(false);
UploadUI.hideUploadInfo(accountId);
UploadUI.showPhotoLink(accountId, photoLinkOrMessage);
} else {
UploadUI.showErrorInfo(photoLinkOrMessage);
}
});
} else {
if (photoIdOrMessage == 'bad_access_token' ||
photoIdOrMessage == 'invalid_album_id') {
Account.removeUser(site.siteId, site.currentUserId);
UploadUI.deleteAccountItem(accountId, true);
UploadUI.getAccessToken(siteId);
}
UploadUI.setUploading(false);
UploadUI.hideProgressBar(accountId);
UploadUI.showErrorInfo(chrome.i18n.getMessage(photoIdOrMessage));
}
UploadUI.hideProgressBar(accountId);
};
if (user) {
site.currentUserId = user.id;
site.upload(user, caption, imageData, callback);
} else {
UploadUI.getAccessToken(siteId);
}
},
getAccessToken: function(siteId) {
var site = UploadUI.getSiteObject(siteId);
var accessTokenCallback = function(result, userOrMessage) {
if (result == 'success') {
UploadUI.getUserInfo(siteId, userOrMessage);
} else {
// Show error information according to error reason
UploadUI.showErrorInfo(chrome.i18n.getMessage(userOrMessage));
UploadUI.hideAuthenticationProgress();
}
};
site.getAccessToken(accessTokenCallback);
},
getUserInfo: function(siteId, user) {
var site = UploadUI.getSiteObject(siteId);
site.getUserInfo(user, function(result, userOrMessage) {
if (result == 'success') {
var userId = user.id;
// Check if the authenticated user is added.
if (!Account.getUser(siteId, userId)) {
site.currentUserId = userId;
Account.addUser(siteId, user);
UploadUI.addAuthenticatedAccount(siteId, userId);
}
UploadUI.upload(siteId, userId);
} else {
var msg = chrome.i18n.getMessage(userOrMessage);
UploadUI.showErrorInfo(msg);
}
UploadUI.hideAuthenticationProgress();
});
},
getImageData: function() {
var dataUrl = $('canvas').toDataURL('image/png');
var imageDataIndex = dataUrl.indexOf('data:image/png;base64,');
if (imageDataIndex != 0) {
return;
}
// Decode to binary data
return atob(dataUrl.substr(imageDataIndex + 22));
},
saveImage: function() {
$('canvas').toBlob(function(blob) {
console.log(chrome.extension.getBackgroundPage());
saveAs(blob, chrome.extension.getBackgroundPage().screenshot.screenshotName+".png");
});
}
};
(function() {
// Cache tab id of edit page, so that we can get tab focus after getting access
// token.
var tabIdOfEditPage;
chrome.tabs.getSelected(null, function(tab) {
tabIdOfEditPage = tab.id;
});
function selectTab(tabId) {
chrome.tabs.update(tabId, {
selected: true
});
}
function closeTab(tabId) {
chrome.tabs.remove(tabId);
}
function parseAccessToken(senderId, url, siteId) {
var sites = UploadUI.sites;
for (var id in sites) {
var site = sites[id];
if ((siteId && id == siteId) || site.isRedirectUrl(url)) {
selectTab(tabIdOfEditPage);
closeTab(senderId);
site.parseAccessToken(url);
return true;
}
}
return false;
}
chrome.extension.onMessage.addListener(function(request, sender) {
switch (request.msg) {
case 'url_for_access_token':
parseAccessToken(sender.tab.id, request.url, request.siteId);
break;
}
});
})();