123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
-
- function initThemeChooser(settings) {
- var isInitialized = false;
- var currentThemeSystem; // don't set this directly. use setThemeSystem
- var currentStylesheetEl;
- var loadingEl = document.getElementById('loading');
- var systemSelectEl = document.querySelector('#theme-system-selector select');
- var themeSelectWrapEls = Array.prototype.slice.call( // convert to real array
- document.querySelectorAll('.selector[data-theme-system]')
- );
-
- systemSelectEl.addEventListener('change', function() {
- setThemeSystem(this.value);
- });
-
- setThemeSystem(systemSelectEl.value);
-
- themeSelectWrapEls.forEach(function(themeSelectWrapEl) {
- var themeSelectEl = themeSelectWrapEl.querySelector('select');
-
- themeSelectWrapEl.addEventListener('change', function() {
- setTheme(
- currentThemeSystem,
- themeSelectEl.options[themeSelectEl.selectedIndex].value
- );
- });
- });
-
-
- function setThemeSystem(themeSystem) {
- var selectedTheme;
-
- currentThemeSystem = themeSystem;
-
- themeSelectWrapEls.forEach(function(themeSelectWrapEl) {
- var themeSelectEl = themeSelectWrapEl.querySelector('select');
-
- if (themeSelectWrapEl.getAttribute('data-theme-system') === themeSystem) {
- selectedTheme = themeSelectEl.options[themeSelectEl.selectedIndex].value;
- themeSelectWrapEl.style.display = 'inline-block';
- } else {
- themeSelectWrapEl.style.display = 'none';
- }
- });
-
- setTheme(themeSystem, selectedTheme);
- }
-
-
- function setTheme(themeSystem, themeName) {
- var stylesheetUrl = generateStylesheetUrl(themeSystem, themeName);
- var stylesheetEl;
-
- function done() {
- if (!isInitialized) {
- isInitialized = true;
- settings.init(themeSystem);
- }
- else {
- settings.change(themeSystem);
- }
-
- showCredits(themeSystem, themeName);
- }
-
- if (stylesheetUrl) {
- stylesheetEl = document.createElement('link');
- stylesheetEl.setAttribute('rel', 'stylesheet');
- stylesheetEl.setAttribute('href', stylesheetUrl);
- document.querySelector('head').appendChild(stylesheetEl);
-
- loadingEl.style.display = 'inline';
-
- whenStylesheetLoaded(stylesheetEl, function() {
- if (currentStylesheetEl) {
- currentStylesheetEl.parentNode.removeChild(currentStylesheetEl);
- }
- currentStylesheetEl = stylesheetEl;
- loadingEl.style.display = 'none';
- done();
- });
- } else {
- if (currentStylesheetEl) {
- currentStylesheetEl.parentNode.removeChild(currentStylesheetEl);
- currentStylesheetEl = null
- }
- done();
- }
- }
-
-
- function generateStylesheetUrl(themeSystem, themeName) {
- if (themeSystem === 'bootstrap') {
- if (themeName) {
- return 'https://bootswatch.com/4/' + themeName + '/bootstrap.min.css';
- }
- else { // the default bootstrap theme
- return 'https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css';
- }
- }
- }
-
-
- function showCredits(themeSystem, themeName) {
- var creditId;
-
- if (themeSystem.match('bootstrap')) {
- if (themeName) {
- creditId = 'bootstrap-custom';
- }
- else {
- creditId = 'bootstrap-standard';
- }
- }
-
- Array.prototype.slice.call( // convert to real array
- document.querySelectorAll('.credits')
- ).forEach(function(creditEl) {
- if (creditEl.getAttribute('data-credit-id') === creditId) {
- creditEl.style.display = 'block';
- } else {
- creditEl.style.display = 'none';
- }
- })
- }
-
-
- function whenStylesheetLoaded(linkNode, callback) {
- var isReady = false;
-
- function ready() {
- if (!isReady) { // avoid double-call
- isReady = true;
- callback();
- }
- }
-
- linkNode.onload = ready; // does not work cross-browser
- setTimeout(ready, 2000); // max wait. also handles browsers that don't support onload
- }
- }
|