/* Core */
window.Core = new Object();
Core.registerNamespace = function(ns) {
var nsParts = ns.split(".");
var root = window;
for (var i = 0; i < nsParts.length; i++) {
if (typeof root[nsParts[i]] == "undefined")
root[nsParts[i]] = new Object();
root = root[nsParts[i]];
}
}
/* Core -> Settings */
window.Core.Settings = new Object();
window.Core.Settings.Messages = new Object();
Core.Settings.highlightColor = "#FCF6B1";
Core.Settings.anchorHighlightColor = "#FFFFDD";
Core.Settings.currentUserKarmaSelector = "#currentKarma";
Core.Settings.Messages.closerTemplate = "Закрыть все
";
Core.Settings.busyIndicatorTemplate = "Загрузка";
/* UI -> KarmaUpdater */
Core.registerNamespace("CodeHelper.UI");
CodeHelper.UI.KarmaUpdater = function(karmaSelector, highlighter) {
this._karmaSelector = karmaSelector;
this._highlighter = highlighter;
}
CodeHelper.UI.KarmaUpdater.prototype.update = function(operationResult) {
if ((!operationResult) || (!operationResult.currentKarma)) {
return;
}
$(this._karmaSelector).html(operationResult.currentKarma);
this._highlighter.highligh(this._karmaSelector);
}
/* UI -> Highlighting */
CodeHelper.UI.Highlighter = function(color) {
this._defaultColor = color;
}
CodeHelper.UI.Highlighter.prototype.highligh = function(selector, color) {
if (!color) {
color = this._defaultColor;
}
$(selector).highlightFade({ color: color });
}
/* UI -> Busy Indicator */
CodeHelper.UI.BusyIndicator = function(text) {
this._text = text;
}
CodeHelper.UI.BusyIndicator.prototype.show = function(selector) {
$(selector).busyBox({
spinner: this._text
});
}
CodeHelper.UI.BusyIndicator.prototype.hide = function(selector) {
$(selector).busyBox('close');
}
/* UI -> Messages */
Core.registerNamespace("CodeHelper.UI.Messages");
CodeHelper.UI.Messages.Manager = function() { }
CodeHelper.UI.Messages.Manager.prototype.getMessageClass = function(message) {
switch (message.Level) {
case 0:
return "info";
case 1:
return "warning";
case 2:
return "error";
}
};
CodeHelper.UI.Messages.Manager.prototype.show = function(message) {
var messageClass = this.getMessageClass(message);
var options = { theme: messageClass };
if (messageClass != "info") {
options["life"] = 10000;
}
$.jGrowl(message.Content, options);
};
CodeHelper.UI.Messages.Manager.prototype.showAll = function(operationResult) {
if ((!operationResult) || (!operationResult.Messages)) {
return;
}
for (var i = 0; i < operationResult.Messages.length; i++) {
var message = operationResult.Messages[i];
this.show(message);
}
};
/* Operations (DEPRICATED)*/
Core.registerNamespace("CodeHelper.Operations");
CodeHelper.Operations.onOperationSuccess = function(responseHolder, callback) {
var operationResult;
if (responseHolder.get_data) {
operationResult = eval('(' + responseHolder.get_data() + ')');
} else {
operationResult = responseHolder;
}
if (operationResult.IsSuccess) {
callback(operationResult);
Core.KarmaUpdater.update(operationResult)
}
Core.MessageManager.showAll(operationResult);
};
/* Ajax Manager */
Core.registerNamespace("CodeHelper.Ajax");
CodeHelper.Ajax.Manager = function() {
this._handlers = new Array();
};
CodeHelper.Ajax.Manager.prototype.registerHandler = function(handler) {
this._handlers.push(handler);
};
CodeHelper.Ajax.Manager.prototype.processXml = function(data) {
var jsonData = eval("(" + $(data).find("data").text() + ")");
var result = {
data: jsonData,
views: new Object()
};
$(data).find("view").each(function(index, value) {
var viewText = $(value).text();
var viewId = $(value).attr('id');
result.views[viewId] = viewText;
});
for (i = 0; i < this._handlers.length; i++) {
var handler = this._handlers[i];
if (handler.onAjaxResultProcessed) {
handler.onAjaxResultProcessed(result);
}
}
return result;
};
/***************************************************************************************
* Setup *
***************************************************************************************/
/* Setup -> Core Objects */
Core.Highlighter = new CodeHelper.UI.Highlighter(Core.Settings.anchorHighlightColor);
Core.KarmaUpdater = new CodeHelper.UI.KarmaUpdater(
Core.Settings.currentUserKarmaSelector,
Core.Highlighter);
Core.BusyIndicator = new CodeHelper.UI.BusyIndicator(Core.Settings.busyIndicatorTemplate);
Core.MessageManager = new CodeHelper.UI.Messages.Manager();
Core.AjaxManager = new CodeHelper.Ajax.Manager();
Core.AjaxManager.registerHandler({
onAjaxResultProcessed: function(response) {
var data = response.data;
if (data.IsSuccess) {
Core.KarmaUpdater.update(data);
}
Core.MessageManager.showAll(data);
}
});
/* Setup -> jQuery -> Common */
$(document).ready(function() {
$.jGrowl.defaults.closerTemplate = Core.Settings.Messages.closerTemplate;
var anchor = document.location.hash;
if (anchor) {
$(anchor).highlightFade({
color: Core.Settings.anchorHighlightColor,
speed: 5000
});
}
});
$.ajaxSetup({
error: function() {
Core.MessageManager.show({
Level: 2,
Content: "Ошибка при обращении к серверу"
});
}
});
/***************************************************************************************
* jQuery Plugins *
***************************************************************************************/
/* Setup -> jQuery -> Plugins */
var DefaultOptions = function() {
this.verb = "POST";
this.commandSuccess = function(processedData, element) { };
this.commandFailure = function(processedData, element) { };
this.success = function(processedData, element) { };
this.cancel = function($element) { return false; };
this.showIndicator = function($element) {
Core.BusyIndicator.show($element.closest(".ajaxIndicatorContainer"));
};
this.hideIndicator = function($element) {
Core.BusyIndicator.hide($element.closest(".ajaxIndicatorContainer"));
};
};
function processXmlResponse(response, options, $element) {
var processedData = Core.AjaxManager.processXml(response);
if (processedData.data.IsSuccess) {
options["commandSuccess"](processedData, $element);
} else {
options["commandFailure"](processedData, $element);
}
options["success"](processedData, $element);
return processedData;
}
function needToCancel($element, options) {
if (options["cancel"] && options["cancel"]($element)) {
return true;
}
if (options["confirm"]) {
if (!confirm(options["confirm"])) {
return true;
}
}
}
$.fn.ajaxLink = function(options) {
var opts = $.extend(new DefaultOptions(), options);
this.click(function() {
var thisLink = $(this);
if (needToCancel(thisLink, opts)) {
return false;
}
$.ajax({
type: opts["verb"],
dataType: 'xml',
url: thisLink.attr('href'),
data: { tstamp: new Date().getTime() },
success: function(data) {
processXmlResponse(data, opts, thisLink);
},
beforeSend: function() {
opts["showIndicator"](thisLink);
},
complete: function() {
opts["hideIndicator"](thisLink);
}
});
return false;
});
}
$.fn.exAjaxForm = function(options) {
var opts = $.extend(new DefaultOptions(), options);
this.submit(function() {
var thisLink = $(this);
if (needToCancel(thisLink, opts)) {
return false;
}
$(this).ajaxSubmit({
type: "POST",
dataType: 'xml',
url: thisLink.attr('action'),
success: function(data) {
processXmlResponse(data, opts, thisLink);
},
beforeSubmit: function() {
opts["showIndicator"](thisLink);
},
complete: function() {
opts["hideIndicator"](thisLink);
}
});
return false;
});
}