/*
* @Author: printempw
* @Date: 2016-09-15 10:39:41
* @Last Modified by: g-plane
* @Last Modified time: 2017-04-26 15:57:50
*/
'use strict';
console.log(`\n %c Blessing Skin v${blessing.version} %c https://blessing.studio \n\n`,"color: #fadfa3; background: #030307; padding:5px 0;","background: #fadfa3; padding:5px 0;");
$.locales = {};
$.currentLocale = {};
/**
* Check if given value is empty.
*
* @param {any} obj
* @return {Boolean}
*/
function isEmpty(obj) {
// null and undefined are "empty"
if (obj == null) return true;
// Assume if it has a length property with a non-zero value
// that that property is correct.
if (obj.length > 0) return false;
if (obj.length === 0) return true;
// If it isn't an object at this point
// it is empty, but it can't be anything *but* empty
// Is it empty? Depends on your application.
if (typeof obj !== "object") return true;
// Otherwise, does it have any properties of its own?
// Note that this doesn't handle
// toString and valueOf enumeration bugs in IE < 9
for (var key in obj) {
if (hasOwnProperty.call(obj, key)) return false;
}
return true;
}
/**
* Load current selected language.
*
* @return void
*/
function loadLocales() {
for (lang in $.locales) {
if (!isEmpty($.locales[lang])) {
$.currentLocale = $.locales[lang] || {};
}
}
}
/**
* Translate according to given key.
*
* @param {string} key
* @param {dict} parameters
* @return {string}
*/
function trans(key, parameters = {}) {
if (isEmpty($.currentLocale)) {
loadLocales();
}
let segments = key.split('.');
let temp = $.currentLocale || {};
for (i in segments) {
if (isEmpty(temp[segments[i]])) {
return key;
} else {
temp = temp[segments[i]];
}
}
for (i in parameters) {
if (!isEmpty(parameters[i])) {
temp = temp.replace(':'+i, parameters[i]);
}
}
return temp;
}
function showModal(msg, title = 'Messgae', type = 'default', options = {}) {
let btnType = (type != "default") ? "btn-outline" : "btn-primary";
let onClick = (options.callback === undefined) ? 'data-dismiss="modal"' : `onclick="${options.callback}"`;
let dom = `
`;
$(dom).modal(options);
}
/**
* Show message to div#msg with level
*
* @param {string} msg
* @param {string} type
* @return {void}
*/
function showMsg(msg, type = 'info') {
$("[id=msg]").removeClass().addClass("callout").addClass('callout-'+type).html(msg);
}
/**
* Show modal if error occured when sending an ajax request.
*
* @param {object} json
* @return {void}
*/
function showAjaxError(json) {
if (!json.responseText) {
console.warn('Empty Ajax response body.');
return;
}
showModal(json.responseText.replace(/\n/g, '
'), trans('general.fatalError'), 'danger');
}
/**
* Get parameters in query string with key.
*
* @param {string} key
* @return {string}
*/
function getQueryString(key) {
result = location.search.match(new RegExp('[\?\&]'+key+'=([^\&]+)','i'));
if (result == null || result.length < 1){
return null;
} else {
return result[1];
}
}
/**
* Return a debounced function
*
* @param {Function} func
* @param {number} delay
* @param {Array} args
* @param {Object} context
*/
function debounce(func, delay, args = [], context = undefined) {
if (isNaN(delay) || typeof func !== 'function') {
throw new Error('Arguments type of function "debounce" is incorrent!');
}
let timer = null;
return function () {
clearTimeout(timer);
timer = setTimeout(() => {
func.apply(context, args);
}, delay);
}
}
// polyfill of String.prototype.endsWith
if (!String.prototype.endsWith) {
String.prototype.endsWith = function (searchString, position) {
var subjectString = this.toString();
if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) {
position = subjectString.length;
}
position -= searchString.length;
var lastIndex = subjectString.lastIndexOf(searchString, position);
return lastIndex !== -1 && lastIndex === position;
};
}
function url(relativeUri) {
relativeUri = relativeUri || "";
blessing.base_url = blessing.base_url || "";
if (relativeUri[0] != "/") {
relativeUri = "/" + relativeUri;
}
return blessing.base_url + relativeUri;
}
function confirmLogout() {
swal({
text: trans('general.confirmLogout'),
type: 'warning',
showCancelButton: true,
confirmButtonText: trans('general.confirm'),
cancelButtonText: trans('general.cancel')
}).then(() => {
logout().then((json) => {
swal({
type: 'success',
html: json.msg
});
window.setTimeout(() => window.location = url(), 1000);
});
});
}
function logout() {
return new Promise((resolve, reject) => {
$.ajax({
type: "POST",
url: url('auth/logout'),
dataType: "json",
success: (json) => resolve(json),
error: (json) => {
showAjaxError(json);
reject(json);
}
});
});
}
$('#logout-button').click(() => confirmLogout());
$(document).ready(() => $('li.active > ul').show());
var TexturePreview = function (type, tid, preference) {
this.tid = tid;
this.type = type;
this.selector = $('#' + type);
this.preference = type == 'steve' ? 'default' : 'slim';
this.playerPreference = preference;
this.change2dPreview = function () {
this.selector
.attr('src', url(`preview/200/${this.tid}.png`))
.show()
.parent().attr('href', url('skinlib/show/' + this.tid))
.next().hide();
return this;
}
this.change3dPreview = function () {
if (this.playerPreference == this.preference) {
$.ajax({
type: "GET",
url: url(`skinlib/info/${this.tid}`),
dataType: "json",
success: (json) => {
let textureUrl = url('textures/' + json.hash);
if (this.type == 'cape') {
MSP.changeCape(textureUrl);
} else {
MSP.changeSkin(textureUrl);
}
},
error: (json) => showAjaxError(json)
});
}
return this;
}
this.showNotUploaded = function () {
this.selector.hide().parent().next().show();
return this;
}
}
TexturePreview.previewType = '3D';
TexturePreview.init3dPreview = () => {
if (TexturePreview.previewType == '2D') return;
$('#preview-2d').hide();
if ($(window).width() < 800) {
var canvas = MSP.get3dSkinCanvas($('#skinpreview').width(), $('#skinpreview').width());
$("#skinpreview").append($(canvas).prop("id", "canvas3d"));
} else {
var canvas = MSP.get3dSkinCanvas(350, 350);
$("#skinpreview").append($(canvas).prop("id", "canvas3d"));
}
}
TexturePreview.show3dPreview = () => {
TexturePreview.previewType = "3D";
TexturePreview.init3dPreview();
$('#preview-2d').hide();
$('.operations').show();
$('#preview-switch').html(trans('user.switch2dPreview'));
}
TexturePreview.show2dPreview = () => {
TexturePreview.previewType = '2D';
$('#canvas3d').remove();
$('.operations').hide();
$('#preview-2d').show();
$('#preview-switch').html(trans('user.switch3dPreview')).attr('onclick', 'show3dPreview();');
}
// change 3D preview status
$('.fa-pause').click(function () {
MSP.setStatus('rotation', ! MSP.getStatus('rotation'));
MSP.setStatus('movements', ! MSP.getStatus('movements'));
$(this).toggleClass('fa-pause').toggleClass('fa-play');
});
$('.fa-forward').click(() => MSP.setStatus('running', !MSP.getStatus('running')) );
$('.fa-repeat' ).click(() => MSP.setStatus('rotation', !MSP.getStatus('rotation')) );
(function ($) {
if ($('#copyright-text').length != 0 && $('#copyright-text').text().indexOf('Blessing') >= 0) {
return;
}
$.ajax({
type: 'POST',
url: 'https://work.prinzeugen.net/statistics/whitelist',
dataType: 'json',
data: { site_name: blessing.site_name, site_url: blessing.base_url }
}).done((json) => {
if (!json.inWhiteList) {
// :(
showModal("It looks like that you have removed the program's copyright. It's better for you to restore it ASAP, otherwise something terrible will be applied to your site :)
If there is a false alarm, please send a mail to h@prinzeugen.net to correct it.", 'CMN BAD ASS', 'danger', {
'backdrop': 'static',
'keyboard': false
});
}
});
})(jQuery);