szurubooru/public_html/js/Util.js
2014-10-18 18:48:18 +02:00

102 lines
2.5 KiB
JavaScript

var App = App || {};
App.Util = (function(jQuery, promise) {
var templateCache = {};
var lastContentPresenterName;
var lastContentPresenter;
function parseComplexRouteArgs(args) {
var result = {};
args = (args || '').split(/;/);
for (var i = 0; i < args.length; i ++) {
var arg = args[i];
if (!arg)
continue;
kv = arg.split(/=/);
result[kv[0]] = kv[1];
}
return result;
}
function compileComplexRouteArgs(baseUri, args) {
var result = baseUri + '/';
_.each(args, function(v, k) {
if (typeof(v) == 'undefined')
return;
result += k + '=' + v + ';'
});
result = result.slice(0, -1);
return result;
}
function initPresenter(presenterName, args) {
var presenter = App.DI.get(presenterName);
presenter.init.call(presenter, args);
}
function initContentPresenter(presenterName, args) {
if (lastContentPresenterName != presenterName) {
var presenter = App.DI.get(presenterName);
var initResult = presenter.init.call(presenter, args);
lastContentPresenterName = presenterName;
lastContentPresenter = presenter;
} else {
lastContentPresenter.reinit.call(presenter, args);
}
};
function promiseTemplate(templateName) {
return promiseTemplateFromCache(templateName)
|| promiseTemplateFromDOM(templateName)
|| promiseTemplateWithAJAX(templateName);
}
function promiseTemplateFromCache(templateName) {
if (templateName in templateCache) {
return promise.make(function(resolve, reject) {
resolve(templateCache[templateName]);
});
}
}
function promiseTemplateFromDOM(templateName) {
var $template = jQuery('#' + templateName + '-template');
if ($template.length) {
return promise.make(function(resolve, reject) {
resolve($template.html());
});
}
return null;
}
function promiseTemplateWithAJAX(templateName) {
return promise.make(function(resolve, reject) {
var templatesDir = '/templates';
var templateUrl = templatesDir + '/' + templateName + '.tpl';
var templateString;
$.ajax({
url: templateUrl,
method: 'GET',
success: function(data, textStatus, xhr) {
resolve(data);
},
error: function(xhr, textStatus, errorThrown) {
console.log(Error('Error while loading template ' + templateName + ': ' + errorThrown));
reject();
},
});
});
}
return {
promiseTemplate: promiseTemplate,
initPresenter : initPresenter,
initContentPresenter: initContentPresenter,
parseComplexRouteArgs: parseComplexRouteArgs,
compileComplexRouteArgs: compileComplexRouteArgs,
};
});
App.DI.registerSingleton('util', App.Util);