pandora/static/js/pandora.js

663 lines
26 KiB
JavaScript
Raw Permalink Normal View History

2011-11-05 16:51:20 +00:00
'use strict';
2011-09-27 14:14:40 +00:00
/*
---- UI Tree ----
appPanel
mainMenu
mainPanel
leftPanel
sectionbar
folders
info
rightPanel
toolbar
contentPanel
browser <-- should be filters or browser
list or item
statusbar <-- make part of content panel
2011-09-27 14:14:40 +00:00
*/
2011-10-23 14:25:23 +00:00
(function() {
// By default, Chrome and IE limit the .stack property to 10 frames
if (typeof Error.stackTraceLimit === 'number') {
Error.stackTraceLimit = Math.max(50, Error.stackTraceLimit);
}
2013-02-18 07:22:47 +00:00
window.onerror = function(error, url, line, column, errorObj) {
2015-02-21 10:20:15 +00:00
if (error == 'TypeError: Attempted to assign to readonly property.') {
return;
}
2011-11-03 01:52:15 +00:00
try {
var stack = (errorObj && errorObj.stack) || "(no stack trace available)";
2014-12-16 13:44:42 +00:00
!isMSIE && !/^resource:/.test(url) && pandora.api.logError({
text: error + "\n\n" + stack,
2013-10-22 18:40:02 +00:00
url: document.location.pathname + ' at ' + url,
2011-11-03 01:52:15 +00:00
line: line
});
} catch(e) {}
};
2013-07-12 10:33:09 +00:00
2013-07-12 20:32:51 +00:00
// handle legacy embed and print URLs
2015-02-21 10:20:15 +00:00
if (document.location.hash) {
document.location.hash = document.location.hash.replace(
/^#\?(embed|print)=true(&)?/,
function() {
return '#' + arguments[1] + (arguments[2] ? '?' : '');
}
);
}
2013-07-12 10:33:09 +00:00
2012-05-24 13:45:15 +00:00
var animationInterval,
enableDebugMode = getLocalStorage('pandora.enableDebugMode'),
enableEventLogging = getLocalStorage('pandora.enableEventLogging'),
2013-07-12 10:33:09 +00:00
isEmbed = /^#embed(\?.*?)?$/.test(document.location.hash),
isMSIE = /MSIE/.test(navigator.userAgent)
&& !(Math.round(navigator.userAgent.match(/MSIE (\d+)/)[1]) >= 10),
2013-07-12 10:33:09 +00:00
isPrint = /^#print(\?.*?)?$/.test(document.location.hash),
legacyThemes = {classic: 'oxlight', modern: 'oxdark'},
loadUserScript = true,
logoHeight,
logoWidth,
theme = getLocalStorage('Ox.theme')
&& JSON.parse(localStorage['Ox.theme']) || 'oxmedium';
theme = legacyThemes[theme] || theme;
2011-05-25 19:42:45 +00:00
2015-04-29 11:41:17 +00:00
document.addEventListener && document.addEventListener(
'keydown', onKeydown
);
loadImages(function(images) {
loadScreen(images);
2012-05-28 11:36:10 +00:00
loadOxJS(function() {
2011-10-23 14:25:23 +00:00
loadOxUI(loadPandora);
2012-05-28 11:36:10 +00:00
});
});
2011-09-03 15:25:32 +00:00
2013-07-12 10:33:09 +00:00
function getLocalStorage(key) {
// fails if localStorage does not exist or if third party cookies are
// disabled
try {
return localStorage[key];
} catch(e) {}
}
function getPandoraVersion() {
var i, path, scripts = document.getElementsByTagName('script');
2013-12-29 12:03:42 +00:00
for (i = 0; i < scripts.length; i++) {
2015-02-21 10:21:13 +00:00
if (/pandora.js/.test(scripts[i].src)) {
return scripts[i].src.replace(/.*\?/, '');
}
}
}
2011-10-23 14:25:23 +00:00
function loadImages(callback) {
// Opera doesn't fire onload for SVGs,
// so we only wait for the PNG to load.
var images = {};
images.logo = document.createElement('img');
images.logo.onload = function() {
var ratio = images.logo.width / images.logo.height;
logoWidth = isEmbed || isPrint ? 96 : 320;
logoHeight = Math.round(logoWidth / ratio);
2012-02-15 09:23:30 +00:00
images.logo.style.position = 'absolute';
images.logo.style.left = 0;
images.logo.style.top = 0;
images.logo.style.right = 0;
images.logo.style.bottom = logoHeight + 'px';
images.logo.style.width = logoWidth + 'px';
images.logo.style.height = logoHeight + 'px';
2012-02-15 09:23:30 +00:00
images.logo.style.margin = 'auto';
images.logo.style.MozUserSelect = 'none';
images.logo.style.MSUserSelect = 'none';
images.logo.style.OUserSelect = 'none';
images.logo.style.WebkitUserSelect = 'none';
2012-05-25 21:41:16 +00:00
if (!isMSIE) {
images.reflection = document.createElement('img');
images.reflection.style.position = 'absolute';
images.reflection.style.left = 0;
images.reflection.style.top = logoHeight + 'px';
2012-05-25 21:41:16 +00:00
images.reflection.style.right = 0;
images.reflection.style.bottom = 0;
images.reflection.style.width = logoWidth + 'px';
images.reflection.style.height = logoHeight + 'px';
2012-05-25 21:41:16 +00:00
images.reflection.style.margin = 'auto';
images.reflection.style.MozTransform = 'scaleY(-1)';
images.reflection.style.MSTransform = 'scaleY(-1)';
images.reflection.style.OTransform = 'scaleY(-1)';
images.reflection.style.WebkitTransform = 'scaleY(-1)';
images.reflection.style.transform = 'scaleY(-1)';
2012-05-25 21:41:16 +00:00
images.reflection.src = '/static/png/logo.png';
}
2012-02-15 09:23:30 +00:00
images.loadingIcon = document.createElement('img');
images.loadingIcon.setAttribute('id', 'loadingIcon');
images.loadingIcon.style.position = 'absolute';
images.loadingIcon.style.left = 0;
2015-04-29 11:41:17 +00:00
images.loadingIcon.style.top = isEmbed || isPrint
? '32px' : '80px';
2012-02-15 09:23:30 +00:00
images.loadingIcon.style.right = 0;
images.loadingIcon.style.bottom = 0;
2015-04-29 11:41:17 +00:00
images.loadingIcon.style.width = isEmbed || isPrint
? '16px' : '32px';
images.loadingIcon.style.height = isEmbed || isPrint
? '16px' : '32px';
2012-02-15 09:23:30 +00:00
images.loadingIcon.style.margin = 'auto';
images.loadingIcon.style.MozUserSelect = 'none';
images.loadingIcon.style.MSUserSelect = 'none';
images.loadingIcon.style.OUserSelect = 'none';
images.loadingIcon.style.WebkitUserSelect = 'none';
2015-04-29 11:41:17 +00:00
images.loadingIcon.src = '/static/oxjs/'
+ (enableDebugMode ? 'dev' : 'min')
2014-09-26 14:54:20 +00:00
+ '/UI/themes/' + theme + '/svg/symbolLoading.svg';
2011-10-23 14:25:23 +00:00
callback(images);
};
images.logo.src = '/static/png/logo.png';
2011-10-23 14:25:23 +00:00
}
2011-09-09 23:05:20 +00:00
2011-10-23 14:25:23 +00:00
function loadScreen(images) {
var gradient, loadingScreen,
gray = theme == 'oxlight' ? 224 : theme == 'oxmedium' ? 144 : 32,
color = window.backgroundColor ? window.backgroundColor : gray+', '+gray+', '+gray,
background = 'linear-gradient(top, rgba('+color+', 0.75), rgba('+color+', 1), rgba('+color+', 1))',
backgroundColor = 'rgb('+color+')';
2012-05-25 21:41:16 +00:00
if (!isMSIE) {
gradient = document.createElement('div');
2012-05-25 21:41:16 +00:00
gradient.style.position = 'absolute';
gradient.style.left = 0;
gradient.style.top = logoHeight + 'px';
2012-05-25 21:41:16 +00:00
gradient.style.right = 0;
gradient.style.bottom = 0;
// + 2 is a temporary fix for Chrome 26
2018-08-09 18:54:24 +00:00
gradient.style.width = logoWidth + 2 + 'px';
gradient.style.height = logoHeight + 2 + 'px';
2012-05-25 21:41:16 +00:00
gradient.style.margin = 'auto';
['-moz-', '-ms-', '-o-', '-webkit-', ''].forEach(function(prefix) {
gradient.style.background = prefix + background;
});
2012-05-25 21:41:16 +00:00
}
loadingScreen = document.createElement('div');
2011-10-23 14:25:23 +00:00
loadingScreen.setAttribute('id', 'loadingScreen');
loadingScreen.className = 'OxScreen';
loadingScreen.style.position = 'absolute';
loadingScreen.style.width = '100%';
loadingScreen.style.height = '100%';
loadingScreen.style.backgroundColor = backgroundColor;
2012-03-19 17:08:30 +00:00
loadingScreen.style.zIndex = '1002';
2011-10-23 14:25:23 +00:00
loadingScreen.appendChild(images.logo);
2012-05-25 21:41:16 +00:00
images.reflection && loadingScreen.appendChild(images.reflection);
gradient && loadingScreen.appendChild(gradient);
2011-10-23 14:25:23 +00:00
loadingScreen.appendChild(images.loadingIcon);
2012-05-25 21:41:16 +00:00
2012-06-30 11:56:58 +00:00
// FF3.6 document.body can be undefined here
var onloadCalled = false;
2012-05-25 21:41:16 +00:00
window.onload = function() {
if (!onloadCalled) {
onloadCalled = true;
document.body.style.margin = 0;
document.body.appendChild(loadingScreen);
startAnimation();
}
2012-05-25 21:41:16 +00:00
};
2012-06-30 11:56:58 +00:00
// IE8 does not call onload if already loaded before set
2012-05-25 21:41:16 +00:00
document.body && window.onload();
2011-10-23 14:25:23 +00:00
}
2011-09-18 21:18:05 +00:00
2011-10-23 14:25:23 +00:00
function loadOxJS(callback) {
var head = document.head
|| document.getElementsByTagName('head')[0]
|| document.documentElement,
script = document.createElement('script');
2012-05-25 21:41:16 +00:00
if (isMSIE) {
// fixme: find a way to check if css/js have loaded in msie
setTimeout(callback, 2500);
} else {
script.onload = callback;
}
2015-04-19 09:09:12 +00:00
script.src = '/static/oxjs/' + (enableDebugMode ? 'dev' : 'min')
+ '/Ox.js?' + getPandoraVersion();
2011-10-23 14:25:23 +00:00
script.type = 'text/javascript';
head.appendChild(script);
2011-10-23 14:25:23 +00:00
}
2011-10-23 14:25:23 +00:00
function loadOxUI(callback) {
Ox.load({
UI: {theme: theme},
2011-10-23 14:25:23 +00:00
Geo: {}
}, callback);
2011-10-23 14:25:23 +00:00
}
2011-10-23 14:25:23 +00:00
function loadPandora(browserSupported) {
2011-12-30 20:47:40 +00:00
window.pandora = Ox.App({
name: 'pandora',
2012-05-25 22:00:06 +00:00
url: '/api/'
2011-12-30 20:47:40 +00:00
}).bindEvent({
2011-10-23 14:25:23 +00:00
load: function(data) {
data.browserSupported = browserSupported;
Ox.extend(pandora, {
requests: {},
ui: {}
2011-09-09 23:05:20 +00:00
});
2011-10-23 14:25:23 +00:00
loadPandoraFiles(function() {
2012-06-30 11:56:58 +00:00
enableEventLogging && Ox.Event.bind(pandora.logEvent);
2011-10-23 14:25:23 +00:00
initPandora(data);
2011-12-30 20:47:40 +00:00
if (pandora.localStorage('local')) {
var url = pandora.localStorage('local');
2011-12-27 06:54:49 +00:00
window.pandora.local = Ox.API({
2013-02-24 09:16:16 +00:00
url: url + '/api/'
2011-12-27 06:54:49 +00:00
}, function() {
2011-12-30 20:47:40 +00:00
pandora.site.site.videoprefix = url;
2011-12-27 06:54:49 +00:00
});
}
});
2011-10-23 14:25:23 +00:00
}
});
2023-10-27 13:53:44 +00:00
window.pandora.getVersion = getPandoraVersion
2011-10-23 14:25:23 +00:00
}
2011-10-23 14:25:23 +00:00
function loadPandoraFiles(callback) {
2011-10-23 02:29:20 +00:00
var prefix = '/static/';
2024-04-02 19:30:26 +00:00
Ox.getFile(prefix + 'css/pandora.css?' + getPandoraVersion())
2012-06-30 11:56:58 +00:00
if (enableDebugMode) {
2015-04-19 09:09:12 +00:00
Ox.getJSON(
prefix + 'json/pandora.json?' + Ox.random(1000),
function(files) {
Ox.getFile(files.map(function(file) {
return prefix + file + '?' + getPandoraVersion();
}), callback);
}
);
2011-10-23 02:29:20 +00:00
} else {
2015-04-19 09:09:12 +00:00
Ox.getScript(
prefix + 'js/pandora.min.js?' + getPandoraVersion(), callback
);
2011-10-23 02:29:20 +00:00
}
2011-09-09 23:05:20 +00:00
}
2011-10-23 14:25:23 +00:00
function initPandora(data) {
2011-11-04 15:54:42 +00:00
Ox.Log('', 'Ox.App load', data);
Ox.$window.on({
beforeunload: pandora.beforeUnloadWindow,
resize: pandora.resizeWindow,
unload: pandora.unloadWindow
})
2019-07-19 17:04:12 +00:00
Ox.$document.on({
dragenter: function(event) {
if (Ox.contains(event.originalEvent.dataTransfer.types, 'Files')) {
event.originalEvent.preventDefault();
event.originalEvent.stopPropagation();
if (!$('#importScreen').length) {
pandora.ui.importScreen().appendTo(Ox.$body);
}
} else {
console.log(event.originalEvent.dataTransfer);
}
},
dragover: function(event) {
event.originalEvent.preventDefault();
event.originalEvent.stopPropagation();
},
dragstart: function(event) {
event.originalEvent.preventDefault();
event.originalEvent.stopPropagation();
},
drop: function(event) {
$('#importScreen').remove();
if (pandora.hasCapability('canAddItems')) {
if (event.originalEvent.dataTransfer.files.length) {
event.originalEvent.preventDefault();
event.originalEvent.stopPropagation();
pandora.uploadDroppedFiles(event.originalEvent.dataTransfer.files)
}
}
}
});
2011-10-23 14:25:23 +00:00
Ox.extend(pandora, {
$ui: {},
2011-10-23 14:25:23 +00:00
site: data.site,
user: data.user
2011-10-23 14:25:23 +00:00
});
// make sure all valid ui settings are present
pandora.user.ui = Ox.extend(
Ox.clone(pandora.site.user.ui), pandora.user.ui
);
// make sure no invalid ui settings are present
Object.keys(pandora.user.ui).forEach(function(key) {
if (Ox.isUndefined(pandora.site.user.ui[key])) {
delete pandora.user.ui[key];
}
});
// make sure itemSort is valid
if (!Ox.contains(pandora.site.itemKeys.filter(function(itemKey) {
return itemKey.sort;
}).map(function(itemKey) {
return itemKey.id;
}), pandora.user.ui.itemSort[0].key)) {
pandora.user.ui.itemSort = pandora.site.user.ui.itemSort;
}
// make sure itemView is valid
if (!Ox.contains(pandora.site.itemViews.map(function(itemView) {
return itemView.id;
}), pandora.user.ui.itemView)) {
pandora.user.ui.itemView = pandora.site.user.ui.itemView;
}
// patch theme ... this can be removed at a later point
2015-04-19 09:09:12 +00:00
pandora.user.ui.theme = legacyThemes[pandora.user.ui.theme]
|| pandora.user.ui.theme;
2013-02-19 11:48:25 +00:00
// make sure theme is valid
if (!Ox.contains(pandora.site.themes, pandora.user.ui.theme)) {
pandora.user.ui.theme = pandora.site.user.ui.theme;
}
// patch itemView ... this can be removed at a later point
if (pandora.user.ui.itemView == 'video') {
pandora.user.ui.itemView = 'player';
}
2011-10-23 14:25:23 +00:00
Ox.extend(pandora.site, {
2012-02-02 05:16:32 +00:00
calendar: data.site.layers.some(function(layer) {
return layer.type == 'event'
}) ? 'manual' : data.site.layers.some(function(layer) {
return layer.hasEvents;
}) ? 'auto' : 'none',
2012-05-22 15:07:34 +00:00
clipKeys: data.site.clipKeys.map(function(key) {
2011-10-23 14:25:23 +00:00
return Ox.extend(key, {
operator: pandora.getSortOperator(key.id)
});
}),
filters: data.site.itemKeys.filter(function(key) {
return key.filter;
}).map(function(key) {
return {
id: key.id,
title: key.title,
type: Ox.isArray(key.type) ? key.type[0] : key.type
};
}),
2019-06-07 15:30:09 +00:00
documentFilters: data.site.documentKeys.filter(function(key) {
return key.filter;
}).map(function(key) {
return {
id: key.id,
title: key.title,
type: Ox.isArray(key.type) ? key.type[0] : key.type
};
}),
2012-05-22 15:07:34 +00:00
findKeys: data.site.itemKeys.filter(function(key) {
return key.find;
2011-10-23 14:25:23 +00:00
}),
2016-10-04 22:00:03 +00:00
documentFindKeys: data.site.documentKeys.filter(function(key) {
return key.find;
}),
2011-10-23 14:25:23 +00:00
itemsSection: pandora.site.itemName.plural.toLowerCase(),
2016-10-04 22:00:03 +00:00
listSections: ['items', 'documents'],
2012-02-02 05:16:32 +00:00
map: data.site.layers.some(function(layer) {
return layer.type == 'place'
}) ? 'manual' : data.site.layers.some(function(layer) {
return layer.hasPlaces;
}) ? 'auto' : 'none',
2019-12-09 13:12:44 +00:00
sections: [
{id: 'items', title: Ox._(pandora.site.itemName.plural)},
{id: 'edits', title: Ox._('Edits')},
{id: 'documents', title: Ox._('Documents')}
],
2011-10-23 14:25:23 +00:00
sectionFolders: {
items: [
2023-12-02 16:49:54 +00:00
{id: 'personal', title: Ox._('Personal Lists')},
{id: 'favorite', title: Ox._('Favorite Lists'), showBrowser: false},
{id: 'featured', title: Ox._('Featured Lists'), showBrowser: false},
{id: 'volumes', title: Ox._('Local Volumes')}
2011-10-23 14:25:23 +00:00
],
edits: [
2023-12-02 16:49:54 +00:00
{id: 'personal', title: Ox._('Personal Edits')},
{id: 'favorite', title: Ox._('Favorite Edits'), showBrowser: false},
{id: 'featured', title: Ox._('Featured Edits'), showBrowser: false}
2011-10-23 14:25:23 +00:00
],
documents: [
2023-12-02 16:49:54 +00:00
{id: 'personal', title: Ox._('Personal Collections')},
{id: 'favorite', title: Ox._('Favorite Collections'), showBrowser: false},
{id: 'featured', title: Ox._('Featured Collections'), showBrowser: false}
2011-10-29 17:46:46 +00:00
]
2011-10-23 14:25:23 +00:00
},
2016-10-04 22:00:03 +00:00
sortKeys: pandora.getSortKeys(),
2021-11-15 15:20:08 +00:00
documentSortKeys: pandora.getDocumentSortKeys()
});
pandora.site.collectionViews = (pandora.site.collectionViews || [
2023-12-02 16:49:54 +00:00
{id: 'list', title: Ox._('as List')},
{id: 'grid', title: Ox._('as Grid')}
2021-11-15 15:20:08 +00:00
]).map(view => {
return {id: view.id, title: Ox._('View {0}', [Ox._(view.title)])};
2011-10-23 14:25:23 +00:00
});
pandora.site.listSettings = {};
2012-05-22 15:07:34 +00:00
Ox.forEach(pandora.site.user.ui, function(val, key) {
2011-10-23 14:25:23 +00:00
if (/^list[A-Z]/.test(key)) {
2015-04-29 11:41:17 +00:00
pandora.site.listSettings[key] = key[4].toLowerCase()+ key.slice(5);
2011-10-23 14:25:23 +00:00
}
});
2016-10-04 22:00:03 +00:00
pandora.site.collectionSettings = {};
Ox.forEach(pandora.site.user.ui, function(val, key) {
if (/^collection[A-Z]/.test(key)) {
pandora.site.collectionSettings[key] = key[10].toLowerCase()+ key.slice(11);
}
});
2013-08-07 14:31:35 +00:00
pandora.site.editSettings = {
clip: '',
'in': 0,
out: 0,
position: 0,
selection: [],
2013-08-07 15:09:28 +00:00
sort: [{key: 'index', operator: '+'}],
view: 'list'
2013-08-07 14:31:35 +00:00
};
2013-08-07 15:23:49 +00:00
pandora.site.textSettings = {
2013-11-08 18:57:24 +00:00
position: 0,
name: ''
2013-08-07 15:23:49 +00:00
};
2011-10-23 14:25:23 +00:00
Ox.extend(pandora.user, {
sectionElement: 'buttons',
videoFormat: Ox.getVideoFormat(pandora.site.video.formats)
2011-10-23 14:25:23 +00:00
});
2020-05-30 12:33:04 +00:00
pandora.site.site.url = document.location.host
pandora.site.site.https = document.location.protocol == 'https:'
2017-10-26 10:49:57 +00:00
Ox.Map.GoogleApiKey = pandora.site.site.googleapikey;
// set locale and initialize url controller
// data.locale is prefered language according to http header
//pandora.setLocale(pandora.user.ui.locale || data.locale, function() {
pandora.setLocale(pandora.user.ui.locale, function() {
2013-05-09 10:13:58 +00:00
pandora.URL.init().parse(function() {
2015-04-29 11:41:17 +00:00
var isHome = Ox.contains(
['/', '/home'], document.location.pathname
);
2013-05-09 10:13:58 +00:00
if (data.browserSupported) {
stopAnimation();
$('#loadingScreen').remove();
} else {
loadBrowserMessage();
}
Ox.Theme(pandora.user.ui.theme);
if (isEmbed) {
pandora.$ui.embedPanel = pandora.ui.embedPanel().display();
2014-09-23 21:48:59 +00:00
Ox.$parent.bindMessage({
2013-05-09 10:13:58 +00:00
settheme: function(data) {
if (Ox.contains(pandora.site.themes, data.theme)) {
Ox.Theme(data.theme);
}
},
seturl: function(data) {
if (pandora.isEmbedURL(data.url)) {
pandora.URL.push(data.url);
}
2018-03-06 12:57:10 +00:00
},
options: function(data) {
pandora.$ui.embedPanel.options(data);
}
2013-05-09 10:13:58 +00:00
});
2022-01-21 17:39:08 +00:00
pandora.localInit && pandora.localInit();
2013-05-09 10:13:58 +00:00
} else if (isPrint) {
pandora.$ui.printView = pandora.ui.printView().display();
} else if (isHome) {
2015-04-29 11:41:17 +00:00
pandora.$ui.home = pandora.ui.home().showScreen(
initPandoraApp
);
2013-05-09 10:13:58 +00:00
} else {
initPandoraApp();
2012-01-27 14:28:49 +00:00
}
2013-05-09 10:13:58 +00:00
});
2011-10-23 14:25:23 +00:00
});
2011-10-29 17:46:46 +00:00
2011-10-23 14:25:23 +00:00
}
function initPandoraApp() {
pandora.clipboard = Ox.Clipboard();
2013-08-03 14:00:58 +00:00
pandora.history = Ox.History();
pandora.$ui.appPanel = pandora.ui.appPanel().display();
2013-07-28 09:52:13 +00:00
pandora.$ui.loadingIcon.update(Ox.Request.requests());
Ox.Request.bindEvent({
error: pandora.ui.errorDialog,
request: function(data) {
2013-07-28 09:52:13 +00:00
pandora.$ui.loadingIcon.update(data.requests);
}
});
Ox.Fullscreen.bind('exit', pandora.UI.set);
pandora.site.sectionButtonsWidth = pandora.$ui.sectionButtons.width() + 8;
2015-03-19 14:09:47 +00:00
// allow site scripts to run after pandora is loaded
2015-04-17 15:42:52 +00:00
pandora.triggerEvent('loaded');
!pandora.isLicensed() && pandora.openLicenseDialog();
2018-09-12 17:23:30 +00:00
pandora.localInit && pandora.localInit();
loadUserScript && pandora.loadUserScript();
2015-04-29 11:41:17 +00:00
document.removeEventListener && document.removeEventListener(
'keydown', onKeydown
);
}
2011-10-23 14:25:23 +00:00
function loadBrowserMessage() {
2012-05-25 21:41:16 +00:00
var browsers = [].concat(
2015-04-29 11:41:17 +00:00
isMSIE ? [{
name: 'Chrome Frame', url: 'http://google.com/chromeframe/'
}] : [],
2011-10-23 14:25:23 +00:00
[
{name: 'Chrome', url: 'http://google.com/chrome/'},
{name: 'Firefox', url: 'http://mozilla.org/firefox/'},
{name: 'Safari', url: 'http://apple.com/safari/'}
]
),
images = browsers.map(function(browser) {
2015-04-19 09:09:12 +00:00
return Ox.PATH + 'UI/png/browser'
+ browser.name.replace(' ', '') + '128.png';
2011-10-23 14:25:23 +00:00
}),
$loadingScreen = $('#loadingScreen');
2012-06-17 12:54:50 +00:00
Ox.getFile(images, function() {
2011-10-23 14:25:23 +00:00
var html = pandora.site.site.name
+ ' requires an up-to-date web browser. Please take a moment to '
+ (
isMSIE
? 'install <a href="' + browsers[0].url + '">' + browsers[0].name + '</a> or '
: ''
)
+ 'download ' + browsers.filter(function(browser) {
return browser.name != 'Chrome Frame';
}).map(function(browser, i) {
return '<a href="' + browser.url + '">' + browser.name + '</a>'
+ (i == 0 ? ', ' : i == 1 ? ' or ' : '');
}).join('')
+ '. Otherwise, <a href="javascript:pandora.proceed()">proceed</a> at your own risk.',
$message = $('<div>')
.css({
position: 'absolute',
left: 0,
top: '160px',
right: 0,
bottom: 0,
width: '320px',
height: '160px',
margin: 'auto'
}),
$images = $('<div>')
.css({
margin: '12px',
textAlign: 'center'
})
.appendTo($message);
2012-05-24 13:45:15 +00:00
stopAnimation();
2011-10-23 14:25:23 +00:00
$('#loadingIcon').remove();
$message.appendTo($loadingScreen);
browsers.forEach(function(browser) {
$('<a>')
.attr({
href: browser.url,
title: browser.name
})
.append(
$('<img>')
.attr({
2015-04-29 11:41:17 +00:00
src: Ox.PATH + 'UI/png/browser'
+ browser.name.replace(' ', '') + '128.png'
})
.css({
width: '32px',
height: '32px',
border: 0,
margin: '4px'
2011-10-23 14:25:23 +00:00
})
)
.appendTo($images);
2011-10-29 17:46:46 +00:00
});
2011-10-23 14:25:23 +00:00
$('<div>')
.css({
textAlign: 'center'
})
.html(html)
.appendTo($message);
});
pandora.proceed = function() {
$loadingScreen.animate({
opacity: 0
}, 1000, function() {
$loadingScreen.remove();
});
2013-08-03 14:00:58 +00:00
};
2011-10-23 14:25:23 +00:00
}
function onKeydown(e) {
if (e.keyCode == 27) {
loadUserScript = false;
}
}
2012-05-24 13:45:15 +00:00
function startAnimation() {
if (animationInterval !== undefined) {
return;
}
2012-05-24 13:45:15 +00:00
var css, deg = 0, loadingIcon = document.getElementById('loadingIcon'),
previousTime = +new Date();
animationInterval = setInterval(function() {
var currentTime = +new Date(),
delta = (currentTime - previousTime) / 1000;
previousTime = currentTime;
deg = Math.round((deg + delta * 360) % 360 / 30) * 30;
css = 'rotate(' + deg + 'deg)';
loadingIcon.style.MozTransform = css;
2012-05-25 21:41:16 +00:00
loadingIcon.style.MSTransform = css;
2012-05-24 17:26:01 +00:00
loadingIcon.style.OTransform = css;
2012-05-24 13:45:15 +00:00
loadingIcon.style.WebkitTransform = css;
loadingIcon.style.transform = css;
2012-05-24 13:45:15 +00:00
}, 83);
}
function stopAnimation() {
if (animationInterval !== undefined) {
clearInterval(animationInterval);
animationInterval = undefined;
}
2012-05-24 13:45:15 +00:00
}
2011-10-23 14:25:23 +00:00
}());