SmartIT_Extensions/BMC/smart-it-full-helix/scripts/app/app-bootstrap.js

163 lines
6.8 KiB
JavaScript

"use strict";
$(function () {
'use strict';
var supportedLanguages = ['de', 'en', 'es', 'fr', 'fr-ca', 'he', 'it', 'ja', 'ko', 'pl', 'pt', 'ru', 'zh'], rtlLanguages = ['he'], defaultLocale = 'en', nav = window.navigator, locale = (!window.navigator.userAgent.match(/Trident\/7\./) && (nav.languages && nav.languages[0] || nav.language)) || $.cookie('myitsm_locale'), localeForChangeCalendar = defaultLocale, localeForAngularResources = defaultLocale;
jQuery.ajaxSetup({ cache: true });
initAppWithMaps();
// 1. Load Map API configuration
function initAppWithMaps() {
$.getJSON('/smartit/rest/map_api_properties').always(function (data) {
// init specific adapter accoding to the api properties
bmcMaps.adapters.init(data)
.always(function () {
initLocale();
});
});
}
// 2. Get correct browser locale information
function initLocale() {
if ($.cookie('user_locale')) {
locale = $.cookie('user_locale').value ? $.cookie('user_locale').value : $.cookie('user_locale');
}
if (locale) {
localeForAngularResources = locale;
locale = normalizeLocale(locale);
initApplication();
}
else {
$.ajax('/smartit/rest/serverstates/acceptLanguage', {
cache: false,
success: function (data) {
locale = localeFromAcceptLanguage(data);
initApplication();
}
});
}
}
// 3. Save locale information and bootstrap Angular app
function initApplication() {
window.myitsmLocale = locale;
window.showMeridian = shouldShowMeridian(localeForAngularResources);
$('html').attr('lang', locale);
if (/(msie) ([\w.]+)/.exec(navigator.userAgent.toLowerCase())) {
$.cookie('myitsm_locale', locale, { expires: 31 });
}
if (rtlLanguages.indexOf(locale) > -1) {
window.isRtl = true;
loadRtlCss();
}
$.when($.getScript(getAngularLocaleUrl(localeForAngularResources.toLowerCase())), $.getJSON('scripts/app/i18n/resources-locale_' + locale + '.json'), $.getScript(getAngularCustomLocaleUrl(localeForChangeCalendar.toLowerCase())))
.fail(function () {
return $.when($.getScript(getAngularLocaleUrl(defaultLocale)), $.getJSON('scripts/app/i18n/resources-locale_' + defaultLocale + '.json'), $.getScript(getAngularCustomLocaleUrl(defaultLocale))).then(startApp);
})
.then(startApp);
}
// loads RTL styles
function loadRtlCss() {
var rtlStyles = {
development: [
'styles/vendor/bootstrap/bootstrap-rtl.css',
'styles/css/smart-it-rtl.css'
],
distribution: [
'styles/vendor/css/vendor-rtl.min.css',
'styles/css/smart-it-rtl.min.css'
]
}, styles = '';
if (window.ENV) {
$.each(rtlStyles[window.ENV], function (i, css) {
styles += '<link rel="stylesheet" href="' + css + '" />';
});
$('head').append(styles);
}
}
function localeFromAcceptLanguage(acceptLanguage) {
// e.g. acceptLanguage = 'en-US,en;q=0.8,en-GB;q=0.6,es;q=0.4,es-419;q=0.2'
if (!acceptLanguage) {
return defaultLocale;
}
var localesStr = acceptLanguage.trim().toLowerCase().split(';');
for (var i = 0; i < localesStr.length; i++) {
var locales = localesStr[i].split(',');
for (var j = 0; j < locales.length; j++) {
var locale = locales[j];
// skip 'q=' param from Accept-Language Header
if (locale.search('q=') === -1) {
// try full locale e.g. 'en-us'
if (supportedLanguages.indexOf(locale) !== -1) {
localeForAngularResources = localeForChangeCalendar = locale;
return locale;
}
// try short locale e.g. 'en'
var localeLang = locale.substr(0, 2);
if (supportedLanguages.indexOf(localeLang) !== -1) {
localeForAngularResources = locale;
localeForChangeCalendar = locale.toLowerCase() === 'en-au' ? locale : localeLang;
return localeLang;
}
}
}
}
return defaultLocale;
}
function normalizeLocale(locale) {
if (locale) {
locale = locale.toLowerCase();
// try if we support long locale e.g. 'es-es'
if (supportedLanguages.indexOf(locale) !== -1) {
localeForChangeCalendar = locale;
return locale;
}
// try if we support short one e.g. 'es'
var localeLang = locale.substr(0, 2);
if (supportedLanguages.indexOf(localeLang) !== -1) {
localeForChangeCalendar = locale.toLowerCase() === 'en-us' ? locale : localeLang;
return localeLang;
}
}
return defaultLocale;
}
function startApp() {
window.appLocalilzation = arguments[1][0]; //resource locale JSON
angular.bootstrap(document.documentElement, ['myitsmApp']);
}
function getAngularLocaleUrl(lang) {
moment.locale((lang === "zh") ? "zh-cn" : lang);
return 'scripts/vendor/angular-i18n/angular-locale_' + lang + '.js';
}
function getAngularCustomLocaleUrl(lang) {
return 'scripts/app/i18n-custom/angular-custom-locale_' + lang + '.js';
}
function shouldShowMeridian(locale) {
var d1 = new Date();
var d2 = new Date(d1);
d2.setHours(d1.getHours() + 12);
d1 = d1.toLocaleTimeString(locale).match(/\d+/);
d2 = d2.toLocaleTimeString(locale).match(/\d+/);
return !(d1[0] == 0 || d1[0] > 12 || d2[0] == 0 || d2[0] > 12); //jshint ignore:line
}
if (typeof String.prototype.trimLeft !== 'function') {
String.prototype.trimLeft = function () {
return this.replace(/^\s+/g, '');
};
}
if (typeof String.prototype.trim !== 'function') {
String.prototype.trim = function () {
return this.replace(/^\s+|\s+$/g, '');
};
}
if (typeof String.prototype.trimRight !== 'function') {
String.prototype.trimRight = function () {
return this.replace(/\s+$/g, '');
};
}
if (!String.prototype.startsWith) {
Object.defineProperty(String.prototype, 'startsWith', {
value: function (search, pos) {
pos = !pos || pos < 0 ? 0 : +pos;
return this.substring(pos, pos + search.length) === search;
}
});
}
});