/* 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; }); }