|
-{"version":3,"sources":["misago.js"],"names":["window","Misago","ns","Object","getPrototypeOf","this","self","_initServices","services","orderedServices","OrderedList","order","forEach","item","factory","undefined","serviceInstance","key","_destroyServices","reverse","destroy","context","SETTINGS","setup","init","fixture","get","test","api","_services","proto","prototype","addService","name","push","after","before","has","obj","hasOwnProperty","value","pop","returnValue","input","kwargs","options","disabled","placeholder","config","element","id","type","oninput","m","withAttr","noop","stateHooks","component","loadingState","errorState","_hasLifecycleHooks","isActive","_controller","controller","apply","arguments","_onunload","onunload","vm","loading","loadingHandler","bind","_view","view","isReady","errorHandler","_init","initArgs","promise","then","ondata","finalArgs","i","length","f","error","items","isOrdered","_items","add","values","values_only","_order","unordered","insertItem","insertAt","ordering","indexOf","ordered","splice","index","iterations","serializeDatetime","serialized","format","deserializeDatetime","deserialized","moment","startsWith","string","beginning","endsWith","tail","UrlConf","_patterns","patterns","prefixPattern","prefix","pattern","replace","include","url","loadingPage","_","getCsrfToken","cookie_name","document","cookie","cookieRegex","RegExp","match","split","Ajax","refreshCsrfToken","csrfToken","CSRF_COOKIE_NAME","runningGets","ajax","method","data","progress","deferred","ajax_settings","headers","X-CSRFToken","dataType","success","resolve","jqXHR","rejection","responseJSON","status","statusText","reject","$","preloaded","post","patch","put","ALERT_BASE_DISPLAY_TIME","ALERT_LENGTH_FACTOR","ALERT_MAX_DISPLAY_TIME","ALERT_HIDE_ANIMATION_LENGTH","Alert","message","isVisible","show","startComputation","endComputation","displayTime","runloop","runOnce","set","info","warning","filtersUrl","filters","encodedKey","encodeURIComponent","encodedValue","join","Query","call","path","related","model","relation","endpoint","results","map","models","Api","alert","gettext","detail","Auth","user","deserialize","_components","argumentsArray","settings","mount","getElementById","Modal","delegateName","on","hide","off","modal","open","_modal","boilerplate","_modals","Models","classes","deserializers","relations","json","locale","attr","Router","baseUrl","staticUrl","mediaUrl","urls","reverses","populatePatterns","urlconf","finalPattern","route","startRouting","mode","delegateElement","cleanUrl","isRelative","substr","location","protocol","host","avatarsUrl","delegateClicks","e","target","href","preventDefault","prefixUrl","error403","ban","error404","error500","error0","errorPage","router","_hasRouteBoilerplate","loadingView","container","_routes","RunLoop","_intervals","stopInterval","clearTimeout","run","callable","delay","setTimeout","result","stop","loop","ticks","prop","PageTitle","forum_name","title","_set_complex","completeTitle","page","page_label","interpolate","parent","validators","required","trim","validate","ctrl","errors","validator","validation","Ban","html","plain","expires_on","deserializeBan","class","LegalPage","body","link","User","isAuthenticated","isAnonymous","slug","username","acl","rank","deserializeUser","joined_on","error_message","help","code","icon","errorBanned","trust","expirationMessage","isAfter","fromNow","forum_index_title","count","increment","console","log","styles","label","legalPageFactory","typeName","defaultTitle","dashedTypeName","isMenuVisible","forum_footnote","terms_of_service","terms_of_service_link","privacy_policy","privacy_policy_link","footer","nav","legalLink","legalType","menu","branding","header","data-dismiss","aria-label","aria-hidden","persistent","el","isInit","retain","register","signin","busy","showActivation","password","submit","credentials","$form","find","val","onsubmit","navbar","style","brand","children","src","alt","showSignIn","showRegister","onclick","forum_branding_display","forum_branding_text","isBusy","logout","button","forumLayout","loader","markup","content","tabindex","aria-labelledby"],"mappings":"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","file":"misago.js","sourcesContent":["/* global -Misago */\n/* exported Misago */\n(function () {\n 'use strict';\n\n window.Misago = function() {\n var ns = Object.getPrototypeOf(this);\n var self = this;\n\n // Services init/destroy\n this._initServices = function(services) {\n var orderedServices = new ns.OrderedList(services).order(false);\n orderedServices.forEach(function (item) {\n var factory = null;\n if (item.item.factory !== undefined) {\n factory = item.item.factory;\n } else {\n factory = item.item;\n }\n\n var serviceInstance = factory(self);\n if (serviceInstance) {\n self[item.key] = serviceInstance;\n }\n });\n };\n\n this._destroyServices = function(services) {\n var orderedServices = new ns.OrderedList(services).order();\n orderedServices.reverse();\n orderedServices.forEach(function (item) {\n if (item.destroy !== undefined) {\n item.destroy(self);\n }\n });\n };\n\n // Context data\n this.context = {\n // Empty settings\n SETTINGS: {}\n };\n\n // App init/destory\n this.setup = false;\n this.init = function(setup, context) {\n this.setup = {\n fixture: ns.get(setup, 'fixture', null),\n test: ns.get(setup, 'test', false),\n api: ns.get(setup, 'api', '/api/')\n };\n\n if (context) {\n this.context = context;\n }\n\n this._initServices(ns._services);\n };\n\n this.destroy = function() {\n this._destroyServices(ns._services);\n };\n };\n\n\n // Services\n var proto = window.Misago.prototype;\n\n proto._services = [];\n proto.addService = function(name, factory, order) {\n proto._services.push({\n key: name,\n item: factory,\n after: proto.get(order, 'after'),\n before: proto.get(order, 'before')\n });\n };\n}());\n\n(function (Misago) {\n 'use strict';\n\n Misago.has = function(obj, key) {\n if (obj) {\n return obj.hasOwnProperty(key);\n } else {\n return false;\n }\n };\n\n Misago.get = function(obj, key, value) {\n if (Misago.has(obj, key)) {\n return obj[key];\n } else if (value !== undefined) {\n return value;\n } else {\n return undefined;\n }\n };\n\n Misago.pop = function(obj, key, value) {\n var returnValue = Misago.get(obj, key, value);\n if (Misago.has(obj, key)) {\n obj[key] = null;\n }\n return returnValue;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.input = function(kwargs) {\n var options = {\n disabled: kwargs.disabled || false,\n placeholder: kwargs.placeholder || null,\n config: kwargs.config || null\n };\n\n var element = 'input';\n\n if (kwargs.id) {\n element += '#' + kwargs.id;\n }\n\n element += '.form-control' + (kwargs.class || '');\n element += '[type=\"' + (kwargs.type || 'text') + '\"]';\n\n if (kwargs.value) {\n options.value = kwargs.value();\n options.oninput = m.withAttr('value', kwargs.value);\n }\n\n return m(element, options);\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var noop = function() {};\n\n Misago.stateHooks = function(component, loadingState, errorState) {\n /*\n Boilerplate for Misago components with lifecycles\n */\n\n // Component boilerplated (this may happen in tests)\n if (component._hasLifecycleHooks) {\n return component;\n }\n component._hasLifecycleHooks = true;\n\n // Component active state\n component.isActive = true;\n\n // Wrap controller to store lifecycle methods\n var _controller = component.controller || noop;\n component.controller = function() {\n component.isActive = true;\n\n var controller = _controller.apply(component, arguments) || {};\n\n // wrap onunload for lifestate\n var _onunload = controller.onunload || noop;\n controller.onunload = function() {\n _onunload.apply(component, arguments);\n component.isActive = false;\n };\n\n return controller;\n };\n\n // Add state callbacks to View-Model\n if (component.vm && component.vm.init) {\n // setup default loading view\n if (!component.loading) {\n var loadingHandler = loadingState.bind(component);\n component.loading = loadingHandler;\n }\n\n var _view = component.view;\n component.view = function() {\n if (component.vm.isReady) {\n return _view.apply(component, arguments);\n } else {\n return component.loading.apply(component, arguments);\n }\n };\n\n var errorHandler = errorState.bind(component);\n\n // wrap vm.init in promise handler\n var _init = component.vm.init;\n component.vm.init = function() {\n var initArgs = arguments;\n var promise = _init.apply(component.vm, initArgs);\n\n if (promise) {\n promise.then(function() {\n if (component.isActive && component.vm.ondata) {\n var finalArgs = [];\n for (var i = 0; i < arguments.length; i++) {\n finalArgs.push(arguments[i]);\n }\n for (var f = 0; f < initArgs.length; f++) {\n finalArgs.push(initArgs[f]);\n }\n\n component.vm.ondata.apply(component.vm, finalArgs);\n }\n }, function(error) {\n if (component.isActive) {\n errorHandler(error);\n }\n });\n }\n };\n }\n\n return component;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.OrderedList = function(items) {\n this.isOrdered = false;\n this._items = items || [];\n\n this.add = function(key, item, order) {\n this._items.push({\n key: key,\n item: item,\n after: Misago.get(order, 'after'),\n before: Misago.get(order, 'before')\n });\n };\n\n this.get = function(key, value) {\n for (var i = 0; i < this._items.length; i++) {\n if (this._items[i].key === key) {\n return this._items[i].item;\n }\n }\n\n return value;\n };\n\n this.has = function(key) {\n return this.get(key) !== undefined;\n };\n\n this.values = function() {\n var values = [];\n for (var i = 0; i < this._items.length; i++) {\n values.push(this._items[i].item);\n }\n return values;\n };\n\n this.order = function(values_only) {\n if (!this.isOrdered) {\n this._items = this._order(this._items);\n this.isOrdered = true;\n }\n\n if (values_only || typeof values_only === 'undefined') {\n return this.values();\n } else {\n return this._items;\n }\n };\n\n this._order = function(unordered) {\n // Index of unordered items\n var index = [];\n unordered.forEach(function (item) {\n index.push(item.key);\n });\n\n // Ordered items\n var ordered = [];\n var ordering = [];\n\n // First pass: register items that\n // don't specify their order\n unordered.forEach(function (item) {\n if (!item.after && !item.before) {\n ordered.push(item);\n ordering.push(item.key);\n }\n });\n\n // Second pass: register items that\n // specify their before to \"_end\"\n unordered.forEach(function (item) {\n if (item.before === \"_end\") {\n ordered.push(item);\n ordering.push(item.key);\n }\n });\n\n // Third pass: keep iterating items\n // until we hit iterations limit or finish\n // ordering list\n function insertItem(item) {\n var insertAt = -1;\n if (ordering.indexOf(item.key) === -1) {\n if (item.after) {\n insertAt = ordering.indexOf(item.after);\n if (insertAt !== -1) {\n insertAt += 1;\n }\n } else if (item.before) {\n insertAt = ordering.indexOf(item.before);\n }\n\n if (insertAt !== -1) {\n ordered.splice(insertAt, 0, item);\n ordering.splice(insertAt, 0, item.key);\n }\n }\n }\n\n var iterations = 200;\n while (iterations > 0 && index.length !== ordering.length) {\n iterations -= 1;\n unordered.forEach(insertItem);\n }\n\n return ordered;\n };\n };\n} (Misago.prototype));\n\n(function (Misago) {\n Misago.serializeDatetime = function(serialized) {\n return serialized ? serialized.format() : null;\n };\n\n Misago.deserializeDatetime = function(deserialized) {\n return deserialized ? moment(deserialized) : null;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.startsWith = function(string, beginning) {\n return string.indexOf(beginning) === 0;\n };\n\n Misago.endsWith = function(string, tail) {\n return string.indexOf(tail, string.length - tail.length) !== -1;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.UrlConf = function() {\n var self = this;\n this._patterns = [];\n\n this.patterns = function() {\n return this._patterns;\n };\n\n var prefixPattern = function(prefix, pattern) {\n return (prefix + pattern).replace('//', '/');\n };\n\n var include = function(prefix, patterns) {\n for (var i = 0; i < patterns.length; i ++) {\n self.url(prefixPattern(prefix, patterns[i].pattern),\n patterns[i].component,\n patterns[i].name);\n }\n };\n\n this.url = function(pattern, component, name) {\n if (pattern === '') {\n pattern = '/';\n }\n\n if (component instanceof Misago.UrlConf) {\n include(pattern, component.patterns());\n } else {\n this._patterns.push({\n pattern: pattern,\n component: component.replace(/_/g, '-'),\n name: name || component\n });\n }\n };\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.loadingPage = function(_) {\n return m('.page.page-loading',\n _.component('loader')\n );\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var getCsrfToken = function(cookie_name) {\n if (document.cookie.indexOf(cookie_name) !== -1) {\n var cookieRegex = new RegExp(cookie_name + '\\=([^;]*)');\n var cookie = Misago.get(document.cookie.match(cookieRegex), 0);\n return cookie.split('=')[1];\n } else {\n return null;\n }\n };\n\n var Ajax = function(_) {\n this.refreshCsrfToken = function() {\n this.csrfToken = getCsrfToken(_.context.CSRF_COOKIE_NAME);\n };\n this.refreshCsrfToken();\n\n /*\n List of GETs underway\n We are limiting number of GETs to API to 1 per url\n */\n var runningGets = {};\n\n this.ajax = function(method, url, data, progress) {\n var promise = m.deferred();\n\n var ajax_settings = {\n url: url,\n method: method,\n headers: {\n 'X-CSRFToken': this.csrfToken\n },\n\n data: data || {},\n dataType: 'json',\n\n success: function(data) {\n if (method === 'GET') {\n Misago.pop(runningGets, url);\n }\n promise.resolve(data);\n },\n error: function(jqXHR) {\n if (method === 'GET') {\n Misago.pop(runningGets, url);\n }\n\n var rejection = jqXHR.responseJSON || {};\n\n rejection.status = jqXHR.status;\n rejection.statusText = jqXHR.statusText;\n\n promise.reject(rejection);\n }\n };\n\n if (progress) {\n return; // not implemented... yet!\n }\n\n $.ajax(ajax_settings);\n return promise.promise;\n };\n\n this.get = function(url) {\n var preloaded = Misago.pop(_.context, url);\n if (preloaded) {\n var deferred = m.deferred();\n deferred.resolve(preloaded);\n return deferred.promise;\n } else if (runningGets[url] !== undefined) {\n return runningGets[url];\n } else {\n runningGets[url] = this.ajax('GET', url);\n return runningGets[url];\n }\n };\n\n this.post = function(url, data) {\n return this.ajax('POST', url, data);\n };\n\n this.patch = function(url, data) {\n return this.ajax('PATCH', url, data);\n };\n\n this.put = function(url, data) {\n return this.ajax('PUT', url, data);\n };\n\n this.delete = function(url) {\n return this.ajax('DELETE', url);\n };\n };\n\n Misago.addService('ajax', function(_) {\n return new Ajax(_);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var ALERT_BASE_DISPLAY_TIME = 5 * 1000;\n var ALERT_LENGTH_FACTOR = 70;\n var ALERT_MAX_DISPLAY_TIME = 9 * 1000;\n var ALERT_HIDE_ANIMATION_LENGTH = 300;\n\n var Alert = function(_) {\n var self = this;\n\n this.id = 0;\n this.type = 'info';\n this.message = null;\n this.isVisible = false;\n\n var show = function(type, message) {\n m.startComputation();\n\n self.id += 1;\n self.type = type;\n self.message = message;\n self.isVisible = true;\n\n m.endComputation();\n\n var displayTime = ALERT_BASE_DISPLAY_TIME;\n displayTime += message.length * ALERT_LENGTH_FACTOR;\n if (displayTime > ALERT_MAX_DISPLAY_TIME) {\n displayTime = ALERT_MAX_DISPLAY_TIME;\n }\n\n var id = self.id;\n _.runloop.runOnce(function () {\n if (self.id === id) {\n m.startComputation();\n self.isVisible = false;\n m.endComputation();\n }\n }, 'flash-message-hide', displayTime);\n };\n\n var set = function(type, message) {\n if (self.isVisible) {\n self.isVisible = false;\n _.runloop.runOnce(function () {\n show(type, message);\n }, 'flash-message-show', ALERT_HIDE_ANIMATION_LENGTH);\n } else {\n show(type, message);\n }\n };\n\n this.info = function(message) {\n set('info', message);\n };\n\n this.success = function(message) {\n set('success', message);\n };\n\n this.warning = function(message) {\n set('warning', message);\n };\n\n this.error = function(message) {\n set('error', message);\n };\n };\n\n Misago.addService('alert', {\n factory: function(_) {\n return new Alert(_);\n }\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var filtersUrl = function(filters) {\n if (typeof filters === 'object') {\n var values = [];\n for (var key in filters) {\n if (filters.hasOwnProperty(key)) {\n var encodedKey = encodeURIComponent(key);\n var encodedValue = encodeURIComponent(filters[key]);\n values.push(encodedKey + '=' + encodedValue);\n }\n }\n return '?' + values.join('&');\n } else {\n return filters + '/';\n }\n };\n\n var Query = function(_, call) {\n this.url = call.url || _.setup.api;\n\n if (call.path) {\n this.url += call.path + '/';\n } else if (call.related) {\n this.url += call.related + '/';\n } else {\n this.url += call.model + 's' + '/';\n }\n\n if (call.filters) {\n this.url += filtersUrl(call.filters);\n }\n\n if (!call.url && call.filters) {\n if (call.model) {\n this.related = function(model, filters) {\n return new Query(_, {\n url: this.url,\n relation: call.model,\n related: model,\n filters: filters,\n });\n };\n }\n\n this.endpoint = function(path, filters) {\n return new Query(_, {\n url: this.url,\n path: path,\n filters: filters\n });\n };\n }\n\n this.get = function() {\n var model = null;\n if (call.related) {\n model = call.relation + ':' + call.related;\n } else if (call.model) {\n model = call.model;\n }\n\n return _.ajax.get(this.url).then(function(data) {\n if (model) {\n if (data.results) {\n data.results.map(function(item) {\n return _.models.new(model, item);\n });\n return data;\n } else {\n return _.models.new(model, data);\n }\n } else {\n return data;\n }\n });\n };\n\n this.post = function(data) {\n return _.ajax.post(this.url, data);\n };\n\n this.patch = function(data) {\n return _.ajax.patch(this.url, data);\n };\n\n this.put = function(data) {\n return _.ajax.put(this.url, data);\n };\n\n this.delete = function() {\n return _.ajax.delete(this.url);\n };\n\n // shortcut for get()\n this.then = function(resolve, reject) {\n return this.get().then(resolve, reject);\n };\n };\n\n var Api = function(_) {\n this.model = function(model, filters) {\n return new Query(_, {\n model: model,\n filters: filters,\n });\n };\n\n this.endpoint = function(path, filters) {\n return new Query(_, {\n path: path,\n filters: filters\n });\n };\n\n this.alert = function(rejection) {\n // Shorthand for API errors\n var message = gettext('Unknown error has occured.');\n\n if (rejection.status === 0) {\n message = gettext('Lost connection with application.');\n }\n\n if (rejection.status === 403) {\n message = rejection.detail;\n if (message === 'Permission denied') {\n message = gettext(\n \"You don't have permission to perform this action.\");\n }\n }\n\n if (rejection.status === 404) {\n message = gettext('Action link is invalid.');\n }\n\n _.alert.error(message);\n };\n };\n\n Misago.addService('api', function(_) {\n return new Api(_);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Auth = function(_) {\n _.user = _.models.deserialize('user', _.context.user);\n };\n\n Misago.addService('auth', function(_) {\n return new Auth(_);\n },\n {\n after: 'model:user'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var component = function(name, component) {\n if (this._components[name]) {\n if (arguments.length > 1) {\n var argumentsArray = [this._components[name]];\n for (var i = 1; i < arguments.length; i += 1) {\n argumentsArray.push(arguments[i]);\n }\n argumentsArray.push(this);\n return m.component.apply(undefined, argumentsArray);\n } else {\n return m.component(this._components[name], this);\n }\n } else {\n this._components[name] = component;\n }\n };\n\n Misago.addService('components', function(_) {\n _._components = {};\n _.component = component;\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('conf', function(_) {\n _.settings = Misago.get(_.context, 'SETTINGS', {});\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('forum-layout', {\n factory: function(_) {\n if (_.setup.fixture) {\n m.mount(document.getElementById(_.setup.fixture),\n _.component('forum-layout'));\n }\n },\n\n destroy: function(_) {\n if (_.setup.fixture) {\n m.mount(document.getElementById(_.setup.fixture), null);\n }\n }\n },\n {\n before: 'start-routing'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Modal = function() {\n var self = this;\n\n var element = document.getElementById('misago-modal');\n\n // href clicks within modal should close it\n var delegateName = 'click.misago-modal';\n $(element).on(delegateName, 'a', function() {\n self.hide();\n });\n\n this.destroy = function() {\n $(element).off(delegateName);\n };\n\n // Open/close modal\n var modal = $(element).modal({show: false});\n this.open = false;\n\n modal.on('hidden.bs.modal', function () {\n if (self.open) {\n m.mount(element, null);\n this.open = false;\n }\n });\n\n this.show = function(component) {\n this.open = true;\n m.mount(element, component);\n modal.modal('show');\n };\n\n this.hide = function() {\n modal.modal('hide');\n };\n };\n\n Misago.addService('_modal', {\n factory: function() {\n return new Modal();\n },\n destroy: function(_) {\n _._modal.destroy();\n }\n },\n {\n after: 'start-routing'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var boilerplate = function(component) {\n return component;\n };\n\n var modal = function(name, component) {\n if (this._modals[name]) {\n var argumentsArray = [this._modals[name]];\n for (var i = 1; i < arguments.length; i += 1) {\n argumentsArray.push(arguments[i]);\n }\n argumentsArray.push(this);\n this._modal.show(m.component.apply(m, argumentsArray));\n } else if (name) {\n this._modals[name] = boilerplate(component);\n } else {\n this._modal.hide();\n }\n };\n\n Misago.addService('modals', function(_) {\n _._modals = {};\n _.modal = modal;\n },\n {\n after: '_modal'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Models = function() {\n this.classes = {};\n this.deserializers = {};\n this.relations = {};\n\n this.add = function(name, kwargs) {\n if (kwargs.class) {\n this.classes[name] = kwargs.class;\n }\n\n if (kwargs.deserialize) {\n this.deserializers[name] = kwargs.deserialize;\n }\n\n if (kwargs.relations) {\n for (var key in kwargs.relations) {\n if (kwargs.relations.hasOwnProperty(key)) {\n this.relations[name + ':' + key] = kwargs.relations[key];\n }\n }\n }\n };\n\n this.new = function(name, data) {\n if (this.classes[name]) {\n return new this.classes[name](data);\n } else {\n return data;\n }\n };\n\n this.deserialize = function(name, json) {\n if (this.relations[name]) {\n name = this.relations[name];\n }\n\n if (this.deserializers[name]) {\n return this.new(name, this.deserializers[name](json, this));\n } else {\n return this.new(name, json);\n }\n };\n };\n\n Misago.addService('models', function() {\n return new Models();\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('set-momentjs-locale', function() {\n moment.locale($('html').attr('lang'));\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Router = function(_) {\n var self = this;\n this.baseUrl = $('base').attr('href');\n\n var staticUrl = Misago.get(_.context, 'STATIC_URL', '/');\n var mediaUrl = Misago.get(_.context, 'MEDIA_URL', '/');\n\n // Routing\n this.urls = {};\n this.reverses = {};\n\n var populatePatterns = function(urlconf) {\n urlconf.patterns().forEach(function(url) {\n var finalPattern = self.baseUrl + url.pattern;\n finalPattern = finalPattern.replace('//', '/');\n\n self.urls[finalPattern] = _.route(url.component);\n self.reverses[url.name] = finalPattern;\n });\n };\n\n this.startRouting = function(urlconf, fixture) {\n populatePatterns(urlconf);\n this.fixture = fixture;\n\n if (_.setup.test) {\n m.route.mode = 'search';\n } else {\n m.route.mode = 'pathname';\n }\n m.route(fixture, '/', this.urls);\n };\n\n this.url = function(name) {\n return this.reverses[name];\n };\n\n // Delegate clicks\n this.delegateElement = null;\n\n this.cleanUrl = function(url) {\n if (!url) { return; }\n\n // Is link relative?\n var isRelative = url.substr(0, 1) === '/' && url.substr(0, 2) !== '//';\n\n // If link contains host, validate to see if its outgoing\n if (!isRelative) {\n var location = window.location;\n\n // If protocol matches current one, strip it from string\n // otherwhise stop handler\n if (url.substr(0, 2) !== '//') {\n var protocol = url.substr(0, location.protocol.length + 2);\n if (protocol !== location.protocol + '//') { return; }\n url = url.substr(location.protocol.length + 2);\n } else {\n url = url.substr(2);\n }\n\n // Host checks out?\n if (url.substr(0, location.host.length) !== location.host) { return; }\n url = url.substr(location.host.length);\n }\n\n // Is link within Ember app?\n if (url.substr(0, this.baseUrl.length) !== this.baseUrl) { return; }\n\n // Is link to media/static/avatar server?\n if (url.substr(0, staticUrl.length) === staticUrl) { return; }\n\n if (url.substr(0, mediaUrl.length) === mediaUrl) { return; }\n\n var avatarsUrl = '/user-avatar/';\n if (url.substr(0, avatarsUrl.length) === avatarsUrl) { return; }\n\n return url;\n };\n\n var delegateName = 'click.misago-router';\n this.delegateClicks = function(element) {\n this.delegateElement = element;\n $(this.delegateElement).on(delegateName, 'a', function(e) {\n var cleanUrl = self.cleanUrl(e.target.href);\n if (cleanUrl) {\n if (cleanUrl != m.route()) {\n m.route(cleanUrl);\n }\n e.preventDefault();\n }\n });\n };\n\n this.destroy = function() {\n $(this.delegateElement).off(delegateName);\n };\n\n // Media/Static url\n var prefixUrl = function(prefix) {\n return function(url) {\n return prefix + url;\n };\n };\n\n this.staticUrl = prefixUrl(staticUrl);\n this.mediaUrl = prefixUrl(mediaUrl);\n\n // Errors\n this.error403 = function(error) {\n var component = null;\n if (error.ban) {\n component = _.route('error:banned',\n error.detail,\n _.models.deserialize('ban', error.ban));\n } else {\n component = _.route('error:403', error.detail);\n }\n m.mount(this.fixture, component);\n };\n\n this.error404 = function() {\n m.mount(this.fixture, _.route('error:404'));\n };\n\n this.error500 = function() {\n m.mount(this.fixture, _.route('error:500'));\n };\n\n this.error0 = function() {\n m.mount(this.fixture, _.route('error:0'));\n };\n\n this.errorPage = function(error) {\n if (error.status === 0) {\n this.error0();\n }\n\n if (error.status === 500) {\n this.error500();\n }\n\n if (error.status === 404) {\n this.error404();\n }\n\n if (error.status === 403) {\n this.error403(error);\n }\n };\n };\n\n Misago.addService('router', function(_) {\n return new Router(_);\n });\n\n Misago.addService('start-routing', function(_) {\n _.router.startRouting(\n Misago.urls, document.getElementById('router-fixture'));\n _.router.delegateClicks(document.getElementById(_.setup.fixture));\n },\n {\n before: '_end'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var boilerplate = function(component) {\n /*\n Boilerplate for Misago top-level components\n */\n\n // Component boilerplated (this may happen in tests)\n if (component._hasRouteBoilerplate) {\n return component;\n }\n component._hasRouteBoilerplate = true;\n\n // Add lifecycle hooks\n var loadingView = function () {\n var _ = this.container;\n return m('.page.page-loading',\n _.component('loader')\n );\n };\n\n var errorHandler = function(error) {\n if (this.isActive) {\n this.container.router.errorPage(error);\n }\n };\n\n return Misago.stateHooks(component, loadingView, errorHandler);\n };\n\n Misago.addService('routes', function(_) {\n _._routes = {};\n _.route = function(name, component) {\n if (this._routes[name]) {\n if (arguments.length > 1) {\n var argumentsArray = [this._routes[name]];\n for (var i = 1; i < arguments.length; i += 1) {\n argumentsArray.push(arguments[i]);\n }\n argumentsArray.push(this);\n return m.component.apply(undefined, argumentsArray);\n } else {\n return m.component(this._routes[name], this);\n }\n } else {\n component.container = _;\n this._routes[name] = boilerplate(component);\n }\n };\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var RunLoop = function(_) {\n var self = this;\n\n this._intervals = {};\n\n var stopInterval = function(name) {\n if (self._intervals[name]) {\n window.clearTimeout(self._intervals[name]);\n self._intervals[name] = null;\n }\n };\n\n this.run = function(callable, name, delay) {\n this._intervals[name] = window.setTimeout(function() {\n stopInterval(name);\n var result = callable(_);\n if (result !== false) {\n self.run(callable, name, delay);\n }\n }, delay);\n };\n\n this.runOnce = function(callable, name, delay) {\n this._intervals[name] = window.setTimeout(function() {\n stopInterval(name);\n callable(_);\n }, delay);\n };\n\n this.stop = function(name) {\n for (var loop in this._intervals) {\n if (!name || name === loop) {\n stopInterval(loop);\n }\n }\n };\n };\n\n Misago.addService('runloop', {\n factory: function(_) {\n return new RunLoop(_);\n },\n\n destroy: function(_) {\n _.runloop.stop();\n }\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('start-tick', function(_) {\n var ticks = m.prop();\n\n _.runloop.run(function() {\n m.startComputation();\n // just tick once a minute so stuff gets rerendered\n ticks(ticks() + 1);\n // syncing dynamic timestamps, etc ect\n m.endComputation();\n }, 'tick', 60000);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var PageTitle = function(forum_name) {\n this.set = function(title) {\n if (title) {\n this._set_complex(title);\n } else {\n document.title = forum_name;\n }\n };\n\n this._set_complex = function(title) {\n if (typeof title === 'string') {\n title = {title: title};\n }\n\n var completeTitle = title.title;\n\n if (typeof title.page !== 'undefined' && title.page > 1) {\n var page_label = interpolate(\n gettext('page %(page)s'), { page:title.page }, true);\n completeTitle += ' (' + page_label + ')';\n }\n\n if (typeof title.parent !== 'undefined') {\n completeTitle += ' | ' + title.parent;\n }\n\n document.title = completeTitle + ' | ' + forum_name;\n };\n };\n\n Misago.addService('page-title', function(_) {\n _.title = new PageTitle(_.settings.forum_name);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n // Validators namespace\n Misago.validators = {\n required: function() {\n return function(value) {\n if ($.trim(value).length === 0) {\n return gettext(\"This field is required.\");\n }\n };\n }\n };\n\n var validate = function(ctrl) {\n var errors = {};\n var value = null;\n var validator = null;\n var result = null;\n\n for (var key in ctrl.validation) {\n if (ctrl.validation.hasOwnProperty(key)) {\n value = ctrl[key]();\n\n for (var i in ctrl.validation[key]) {\n validator = ctrl.validation[key][i];\n result = validator(value);\n\n if (result) {\n if (!errors[key]) {\n errors[key] = [];\n }\n errors[key].push(result);\n }\n }\n }\n }\n\n return errors;\n };\n\n Misago.addService('validate', {\n factory: function() {\n return validate;\n }\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Ban = function(data) {\n this.message = {\n html: data.message.html,\n plain: data.message.plain,\n };\n\n this.expires_on = data.expires_on;\n };\n\n var deserializeBan = function(data) {\n data.expires_on = Misago.deserializeDatetime(data.expires_on);\n\n return data;\n };\n\n Misago.addService('model:ban', function(_) {\n _.models.add('ban', {\n class: Ban,\n deserialize: deserializeBan\n });\n },\n {\n after: 'models'\n });\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var LegalPage = function(data) {\n this.title = data.title;\n this.body = data.body;\n this.link = data.link;\n };\n\n Misago.addService('model:legal-page', function(_) {\n _.models.add('legal-page', {\n class: LegalPage\n });\n },\n {\n after: 'models'\n });\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var User = function(data) {\n this.id = data.id;\n\n this.isAuthenticated = !!this.id;\n this.isAnonymous = !this.isAuthenticated;\n\n this.slug = data.slug;\n this.username = data.username;\n\n this.acl = data.acl;\n this.rank = data.rank;\n };\n\n var deserializeUser = function(data) {\n if (data.joined_on) {\n data.joined_on = Misago.deserializeDatetime(data.joined_on);\n }\n\n return data;\n };\n\n Misago.addService('model:user', function(_) {\n _.models.add('user', {\n class: User,\n deserialize: deserializeUser\n });\n },\n {\n after: 'models'\n });\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var errorPage = function(error) {\n var error_message = [\n m('p.lead', error.message)\n ];\n\n if (error.help) {\n error_message.push(m('p.help', error.help));\n }\n\n return m('.page.error-page.error-' + error.code + '-page',\n m('.container',\n m('.error-panel', [\n m('.error-icon',\n m('span.material-icon', error.icon)\n ),\n m('.error-message', error_message)\n ])\n )\n );\n };\n\n var errorBanned = {\n controller: function() {\n this.container.title.set(gettext('You are banned'));\n },\n view: function(ctrl, message, ban) {\n var error_message = [];\n\n if (ban.message.html) {\n error_message.push(m('.lead', m.trust(ban.message.html)));\n } else if (message) {\n error_message.push(m('p.lead', message));\n } else {\n error_message.push(m('p.lead', gettext('You are banned.')));\n }\n\n var expirationMessage = null;\n if (ban.expires_on) {\n if (ban.expires_on.isAfter(moment())) {\n expirationMessage = interpolate(\n gettext('This ban expires %(expires_on)s.'),\n { 'expires_on': ban.expires_on.fromNow() },\n true);\n } else {\n expirationMessage = gettext('This ban has expired.');\n }\n } else {\n expirationMessage = gettext('This ban is permanent.');\n }\n error_message.push(m('p', expirationMessage));\n\n return m('.page.error-page.error-banned-page',\n m('.container',\n m('.error-panel', [\n m('.error-icon',\n m('span.material-icon', 'highlight_off')\n ),\n m('.error-message', error_message)\n ])\n )\n );\n }\n };\n\n var error403 = {\n controller: function() {\n this.container.title.set(gettext('Page not available'));\n },\n view: function(ctrl, message) {\n if (message === \"Permission denied\") {\n message = gettext(\"You don't have permission to access this page.\");\n }\n\n return errorPage({\n code: 403,\n icon: 'remove_circle_outline',\n message: gettext(\"This page is not available.\"),\n help: message\n });\n }\n };\n\n var error404 = {\n controller: function() {\n this.container.title.set(gettext('Page not found'));\n },\n view: function() {\n return errorPage({\n code: 404,\n icon: 'info_outline',\n message: gettext(\"Requested page could not be found.\"),\n help: gettext(\"The link you followed was incorrect or the page has been moved or deleted.\")\n });\n }\n };\n\n var error500 = {\n controller: function() {\n this.container.title.set(gettext('Application error occured'));\n },\n view: function() {\n return errorPage({\n code: 500,\n icon: 'error_outline',\n message: gettext(\"Requested page could not be displayed due to an error.\"),\n help: gettext(\"Please try again later or contact site staff if error persists.\")\n });\n }\n };\n\n var error0 = {\n controller: function() {\n this.container.title.set(gettext('Lost connection with application'));\n },\n view: function() {\n return errorPage({\n code: 0,\n icon: 'sync_problem',\n message: gettext(\"Could not connect to application.\"),\n help: gettext(\"This may be caused by problems with your connection or application server. Please check your internet connection and refresh page if problem persists.\")\n });\n }\n };\n\n Misago.addService('route:error-pages', function(_) {\n _.route('error:banned', errorBanned);\n _.route('error:403', error403);\n _.route('error:404', error404);\n _.route('error:500', error500);\n _.route('error:0', error0);\n },\n {\n after: 'routes'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var index = {\n controller: function() {\n var _ = this.container;\n document.title = _.settings.forum_index_title || _.settings.forum_name;\n\n var count = m.prop(0);\n\n return {\n count: count,\n increment: function() {\n console.log('increment()');\n count(count() + 1);\n }\n };\n },\n view: function(ctrl, _) {\n var styles = [\n 'default', 'primary', 'success',\n 'info', 'warning', 'danger'\n ];\n\n return m('.container', [\n m('h1', 'Buttons'),\n m('', styles.map(function(item) {\n return m('', [\n _.component('button', {\n class: '.btn-' + item,\n label: 'Lorem ipsum'\n }),\n _.component('button', {\n class: '.btn-' + item,\n label: 'Lorem ipsum',\n loading: true\n })\n ]);\n }))\n ]);\n }\n };\n\n Misago.addService('route:index', function(_) {\n _.route('index', index);\n },\n {\n after: 'routes'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var legalPageFactory = function(typeName, defaultTitle) {\n var dashedTypeName = typeName.replace(/_/g, '-');\n\n return {\n controller: function(_) {\n if (Misago.get(_.settings, typeName + '_link')) {\n window.location = Misago.get(_.settings, typeName + '_link');\n } else {\n this.vm.init(this, _);\n }\n },\n vm: {\n page: null,\n isReady: false,\n init: function(component, _) {\n if (this.isReady) {\n _.title.set(this.title);\n } else {\n _.title.set();\n return _.api.model('legal-page', dashedTypeName);\n }\n },\n ondata: function(page, component, _) {\n m.startComputation();\n\n if (page.link) {\n window.location = page.link;\n } else {\n page.title = page.title || defaultTitle;\n this.page = page;\n this.isReady = true;\n\n m.endComputation();\n\n if (component.isActive) {\n _.title.set(this.page.title);\n }\n }\n }\n },\n view: function(ctrl, _) {\n return m('.page.legal-page.' + dashedTypeName + '-page', [\n _.component('header', {title: this.vm.page.title}),\n m('.container',\n _.component('markup', this.vm.page.body)\n )\n ]);\n }\n };\n };\n\n Misago.addService('route:legal-pages', function(_) {\n _.route('terms-of-service', legalPageFactory(\n 'terms_of_service', gettext('Terms of service')));\n _.route('privacy-policy', legalPageFactory(\n 'privacy_policy', gettext('Privacy policy')));\n },\n {\n after: 'routes'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var isMenuVisible = function(settings) {\n return [\n !!settings.forum_footnote,\n !!settings.terms_of_service,\n !!settings.terms_of_service_link,\n !!settings.privacy_policy,\n !!settings.privacy_policy_link\n ].indexOf(true) !== -1;\n };\n\n var footer = {\n view: function(ctrl, _) {\n var nav = null;\n if (isMenuVisible(_.settings)) {\n nav = _.component('footer:menu');\n }\n\n return m('footer.forum-footer', [\n m('.container',\n m('.footer-content', [\n nav,\n _.component('footer:branding')\n ])\n )\n ]);\n }\n };\n\n Misago.addService('component:footer', function(_) {\n _.component('footer', footer);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var legalLink = function(_, legalType, defaultTitle) {\n var url = Misago.get(_.settings, legalType + '_link');\n if (!url && Misago.get(_.settings, legalType)) {\n url = _.router.url(legalType);\n }\n\n if (url) {\n return m('li',\n m('a', {href: url},\n Misago.get(_.settings, legalType + '_title', defaultTitle)\n )\n );\n } else {\n return null;\n }\n };\n\n var menu = {\n isVisible: function(settings) {\n return [\n !!settings.forum_footnote,\n !!settings.terms_of_service,\n !!settings.terms_of_service_link,\n !!settings.privacy_policy,\n !!settings.privacy_policy_link\n ].indexOf(true) !== -1;\n },\n view: function(ctrl, _) {\n var items = [];\n\n if (_.settings.forum_footnote) {\n items.push(m('li.forum-footnote', m.trust(_.settings.forum_footnote)));\n }\n\n items.push(\n legalLink(_, 'terms_of_service', gettext('Terms of service')));\n items.push(\n legalLink(_, 'privacy_policy', gettext('Privacy policy')));\n\n return m('ul.list-inline.footer-nav', items);\n }\n };\n\n Misago.addService('component:footer:menu', function(_) {\n _.component('footer:menu', menu);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var branding = {\n view: function() {\n return m('a.misago-branding[href=http://misago-project.org]', [\n \"powered by \", m('strong', \"misago\")\n ]);\n }\n };\n\n Misago.addService('component:footer:branding', function(_) {\n _.component('footer:branding', branding);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var header = {\n view: function(ctrl, title) {\n return m('.modal-header', [\n m('button.close[type=\"button\"]',\n {'data-dismiss': 'modal', 'aria-label': gettext('Close')},\n m('span', {'aria-hidden': 'true'}, m.trust('×'))\n ),\n m('h4#misago-modal-label.modal-title', title)\n ]);\n }\n };\n\n Misago.addService('component:modal:header', function(_) {\n _.component('modal:header', header);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n function persistent(el, isInit, context) {\n context.retain = true;\n }\n\n var register = {\n view: function() {\n return m('.modal-dialog.modal-lg[role=\"document\"]',\n {config: persistent},\n m('.modal-content', [\n m('.modal-header',\n m('h4#misago-modal-label.modal-title', 'Register in modal!')\n ),\n m('.modal-body', [\n m('p', 'Lorem ipsum dolor met sit amet elit.'),\n m('p', [\n 'Si vis pacem ',\n m('a', {href: '/'}, 'bellum'),\n ' sequitat.'\n ])\n ])\n ])\n );\n }\n };\n\n Misago.addService('modal:register', function(_) {\n _.modal('register', register);\n },\n {\n after: 'modals'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n function persistent(el, isInit, context) {\n context.retain = true;\n }\n\n var signin = {\n controller: function() {\n return {\n busy: m.prop(false),\n showActivation: m.prop(false),\n\n username: m.prop(''),\n password: m.prop(''),\n\n validation: {\n 'username': [Misago.validators.required()],\n 'password': [Misago.validators.required()]\n }\n };\n },\n submit: function(ctrl, _) {\n if (ctrl.busy()) {\n return false;\n }\n\n if (_.validate(ctrl).length) {\n _.alert.error(gettext(\"Fill out both fields.\"));\n return false;\n }\n\n m.startComputation();\n ctrl.busy(true);\n m.endComputation();\n\n var credentials = {\n username: ctrl.username(),\n password: ctrl.password()\n };\n\n var self = this;\n\n _.api.endpoint('auth').post(credentials).then(\n function() {\n self.success(credentials, _);\n },\n function(error) {\n self.error(ctrl, error, _);\n });\n\n return false;\n },\n success: function(credentials, _) {\n var $form = $('#hidden-login-form');\n\n // refresh CSRF token because api call to /auth/ changed it\n _.ajax.refreshCsrfToken();\n\n // fill out form with user credentials and submit it, this will tell\n // misago to redirect user back to right page, and will trigger browser's\n // key ring feature\n $form.find('input[type=\"hidden\"]').val(_.ajax.csrfToken);\n $form.find('input[name=\"redirect_to\"]').val(m.route());\n $form.find('input[name=\"username\"]').val(credentials.username);\n $form.find('input[name=\"password\"]').val(credentials.password);\n $form.submit();\n },\n error: function(ctrl, rejection, _) {\n // activate form again\n m.startComputation();\n ctrl.busy(false);\n m.endComputation();\n\n // handle returned error\n if (rejection.status === 400) {\n if (rejection.code === 'inactive_admin') {\n _.alert.info(rejection.detail);\n } else if (rejection.code === 'inactive_user') {\n _.alert.info(rejection.detail);\n ctrl.showActivation(true);\n } else if (rejection.code === 'banned') {\n _.modal();\n _.router.error403({\n message: '',\n ban: rejection.detail\n });\n } else {\n _.alert.error(rejection.detail);\n }\n } else {\n _.api.alert(rejection);\n }\n },\n view: function(ctrl, _) {\n return m('.modal-dialog.modal-sm.modal-signin[role=\"document\"]',\n {config: persistent},\n m('.modal-content', [\n _.component('modal:header', gettext('Sign in')),\n m('form', {onsubmit: this.submit.bind(this, ctrl, _)}, [\n m('.modal-body', [\n m('.form-group',\n m('.control-input',\n Misago.input({\n disabled: ctrl.busy(),\n value: ctrl.username,\n placeholder: gettext(\"Username or e-mail\")\n })\n )\n ),\n m('.form-group',\n m('.control-input',\n Misago.input({\n type: 'password',\n disabled: ctrl.busy(),\n value: ctrl.password,\n placeholder: gettext(\"Password\")\n })\n )\n )\n ]),\n m('.modal-footer',\n _.component('button', {\n class: '.btn-primary.btn-block',\n submit: true,\n loading: ctrl.busy(),\n label: gettext('Sign in')\n })\n )\n ])\n ])\n );\n }\n };\n\n Misago.addService('modal:sign-in', function(_) {\n _.modal('sign-in', signin);\n },\n {\n after: 'modals'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var navbar = {\n view: function(ctrl, _) {\n var style = '.navbar.navbar-default.navbar-static-top';\n return m('nav' + style + '[role=\"navigation\"]', [\n _.component('navbar:desktop')\n ]);\n }\n };\n\n Misago.addService('component:navbar', function(_) {\n _.component('navbar', navbar);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var brand = {\n view: function(ctrl, branding, _) {\n var children = [\n m('img', {\n src: _.router.staticUrl('misago/img/site-logo.png'),\n alt: _.settings.forum_name\n })\n ];\n\n if (branding) {\n children.push(branding);\n }\n\n return m('a.navbar-brand', {href: _.router.url('index')}, children);\n }\n };\n\n Misago.addService('component:navbar:desktop:brand', function(_) {\n _.component('navbar:desktop:brand', brand);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var menu = {\n controller: function(_) {\n return {\n showSignIn: function() {\n _.modal('sign-in');\n },\n showRegister: function() {\n _.modal('register');\n }\n };\n },\n view: function(ctrl) {\n return m('div.nav.guest-nav', [\n m('button.navbar-btn.btn.btn-default',\n {\n onclick: ctrl.showSignIn\n },\n gettext(\"Sign in\")\n ),\n m('button.navbar-btn.btn.btn-primary',\n {\n onclick: ctrl.showRegister\n },\n gettext(\"Register\")\n )\n ]);\n }\n };\n\n Misago.addService('component:navbar:desktop:guest-menu', function(_) {\n _.component('navbar:desktop:guest-menu', menu);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var navbar = {\n view: function(ctrl, _) {\n var menu = [];\n\n if (_.settings.forum_branding_display) {\n menu.push(\n _.component('navbar:desktop:brand', _.settings.forum_branding_text));\n }\n\n menu.push(m('ul.nav.navbar-nav', [\n m('li',\n m(\"a\", {config: m.route, href: _.router.url('index')}, 'Index')\n )\n ]));\n\n if (_.user.isAuthenticated) {\n menu.push(_.component('navbar:desktop:user-menu'));\n } else {\n menu.push(_.component('navbar:desktop:guest-menu'));\n }\n\n return m('.container.navbar-full.hidden-xs.hidden-sm', menu);\n }\n };\n\n Misago.addService('component:navbar:desktop', function(_) {\n _.component('navbar:desktop', navbar);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var menu = {\n controller: function() {\n return {\n isBusy: m.prop(false),\n logout: function() {\n if (!this.isBusy()) {\n this.isBusy(true);\n $('#hidden-logout-form').submit();\n }\n }\n };\n },\n view: function(ctrl, _) {\n return m('div.nav.user-nav', [\n m('p.navbar-text',\n _.user.username\n ),\n m('button.navbar-btn.btn.btn-default.navbar-right',\n {\n onclick: ctrl.logout.bind(ctrl)\n },\n gettext(\"Logout\")\n )\n ]);\n }\n };\n\n Misago.addService('component:navbar:desktop:user-menu', function(_) {\n _.component('navbar:desktop:user-menu', menu);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n function persistent(el, isInit, context) {\n context.retain = true;\n }\n\n var alert = {\n classes: {\n 'info': 'alert-info',\n 'success': 'alert-success',\n 'warning': 'alert-warning',\n 'error': 'alert-danger'\n },\n view: function(ctrl, _) {\n return m(\n '.alerts',\n {\n config: persistent,\n class: _.alert.isVisible ? 'in' : 'out'\n },\n m('p.alert',\n {\n class: this.classes[_.alert.type]\n },\n _.alert.message\n )\n );\n }\n };\n\n Misago.addService('component:alert', function(_) {\n _.component('alert', alert);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var button = {\n view: function(ctrl, kwargs) {\n var options = {\n disabled: kwargs.disabled || kwargs.loading || false,\n config: kwargs.config || null,\n loading: kwargs.loading || false,\n type: kwargs.submit ? 'submit' : 'button',\n onclick: kwargs.onclick || null\n };\n\n var element = 'button[type=\"' + options.type + '\"].btn';\n if (options.loading) {\n element += '.btn-loading';\n }\n\n if (kwargs.id) {\n element += '#' + kwargs.id;\n }\n\n element += (kwargs.class || '');\n\n var label = kwargs.label;\n if (options.loading) {\n label = [\n label,\n m('.loader-compact', [\n m('.bounce1'),\n m('.bounce2'),\n m('.bounce3')\n ])\n ];\n }\n\n return m(element, options, label);\n },\n };\n\n Misago.addService('component:button', function(_) {\n _.component('button', button);\n },\n {\n after: 'components'\n });\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var persistent = function(el, isInit, context) {\n context.retain = true;\n };\n\n var forumLayout = {\n view: function(ctrl, _) {\n return [\n _.component('alert'),\n _.component('navbar'),\n m('#router-fixture', {config: persistent}),\n _.component('footer'),\n _.component('modal')\n ];\n }\n };\n\n Misago.addService('component:layout', function(_) {\n _.component('forum-layout', forumLayout);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var loader = {\n view: function() {\n return m('.loader.sk-folding-cube', [\n m('.sk-cube1.sk-cube'),\n m('.sk-cube2.sk-cube'),\n m('.sk-cube4.sk-cube'),\n m('.sk-cube3.sk-cube')\n ]);\n }\n };\n\n Misago.addService('component:loader', function(_) {\n _.component('loader', loader);\n },\n {\n after: 'components'\n });\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var persistent = function(el, isInit, context) {\n context.retain = true;\n };\n\n var markup = {\n view: function(ctrl, content) {\n return m('article.misago-markup', {config: persistent},\n m.trust(content)\n );\n }\n };\n\n Misago.addService('component:markup', function(_) {\n _.component('markup', markup);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n function persistent(el, isInit, context) {\n context.retain = true;\n }\n\n var modal = {\n view: function() {\n return m(\n '#misago-modal.modal.fade[role=\"dialog\"]',\n {\n config: persistent,\n tabindex: \"-1\",\n \"aria-labelledby\": \"misago-modal-label\"\n }\n );\n }\n };\n\n Misago.addService('component:modal', function(_) {\n _.component('modal', modal);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var header = {\n view: function(ctrl, options) {\n return m('.page-header',\n m('.container', [\n m('h1', options.title),\n ])\n );\n }\n };\n\n Misago.addService('component:header', function(_) {\n _.component('header', header);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago, UrlConf) {\n 'use strict';\n\n var urls = new UrlConf();\n urls.url('/', 'index');\n\n // Legal pages\n urls.url(\n '/terms-of-service/',\n 'terms_of_service');\n\n urls.url(\n '/privacy-policy/',\n 'privacy_policy');\n\n // Catch-all 404 not found route\n urls.url('/:rest...', 'error:404', 'not_found');\n\n Misago.urls = urls;\n} (Misago.prototype, Misago.prototype.UrlConf));\n"],"sourceRoot":"/source/"}
|
|
|
|
|
|
+{"version":3,"sources":["misago.js"],"names":["window","Misago","ns","Object","getPrototypeOf","this","self","_initServices","services","orderedServices","OrderedList","order","forEach","item","factory","undefined","serviceInstance","key","_destroyServices","reverse","destroy","context","SETTINGS","setup","init","fixture","get","test","api","_services","proto","prototype","addService","name","push","after","before","has","obj","hasOwnProperty","value","pop","returnValue","input","kwargs","options","disabled","placeholder","config","element","id","type","oninput","m","withAttr","noop","stateHooks","component","loadingState","errorState","_hasLifecycleHooks","isActive","_controller","controller","apply","arguments","_onunload","onunload","vm","loading","loadingHandler","bind","_view","view","isReady","errorHandler","_init","initArgs","promise","then","ondata","finalArgs","i","length","f","error","items","isOrdered","_items","add","values","values_only","_order","unordered","insertItem","insertAt","ordering","indexOf","ordered","splice","index","iterations","serializeDatetime","serialized","format","deserializeDatetime","deserialized","moment","startsWith","string","beginning","endsWith","tail","UrlConf","_patterns","patterns","prefixPattern","prefix","pattern","replace","include","url","loadingPage","_","getCsrfToken","cookie_name","document","cookie","cookieRegex","RegExp","match","split","Ajax","refreshCsrfToken","csrfToken","CSRF_COOKIE_NAME","runningGets","ajax","method","data","progress","deferred","ajax_settings","headers","X-CSRFToken","dataType","success","resolve","jqXHR","rejection","responseJSON","status","statusText","reject","$","preloaded","post","patch","put","ALERT_BASE_DISPLAY_TIME","ALERT_LENGTH_FACTOR","ALERT_MAX_DISPLAY_TIME","ALERT_HIDE_ANIMATION_LENGTH","Alert","message","isVisible","show","startComputation","endComputation","displayTime","runloop","runOnce","set","info","warning","filtersUrl","filters","encodedKey","encodeURIComponent","encodedValue","join","Query","call","path","related","model","relation","endpoint","results","map","models","Api","alert","gettext","detail","Auth","user","deserialize","_components","argumentsArray","settings","mount","getElementById","Modal","delegateName","on","hide","off","removeClass","remove","modal","open","_modal","boilerplate","_modals","Models","classes","deserializers","relations","json","locale","attr","Router","baseUrl","staticUrl","mediaUrl","urls","reverses","populatePatterns","urlconf","finalPattern","route","startRouting","mode","delegateElement","cleanUrl","isRelative","substr","location","protocol","host","avatarsUrl","delegateClicks","e","target","href","preventDefault","prefixUrl","error403","ban","error404","error500","error0","errorPage","router","_hasRouteBoilerplate","loadingView","container","_routes","RunLoop","_intervals","stopInterval","clearTimeout","run","callable","delay","setTimeout","result","stop","loop","ticks","prop","PageTitle","forum_name","title","_set_complex","completeTitle","page","page_label","interpolate","parent","validators","required","trim","validate","ctrl","errors","validator","validation","getOwnPropertyNames","Ban","html","plain","expires_on","deserializeBan","class","LegalPage","body","link","User","isAuthenticated","isAnonymous","slug","username","acl","rank","deserializeUser","joined_on","error_message","help","code","icon","errorBanned","trust","expirationMessage","isAfter","fromNow","forum_index_title","count","increment","console","log","styles","label","legalPageFactory","typeName","defaultTitle","dashedTypeName","isMenuVisible","forum_footnote","terms_of_service","terms_of_service_link","privacy_policy","privacy_policy_link","footer","nav","legalLink","legalType","menu","branding","header","data-dismiss","aria-label","aria-hidden","persistent","el","isInit","retain","register","signin","busy","showActivation","password","submit","credentials","$form","find","val","onsubmit","navbar","style","brand","children","src","alt","showSignIn","showRegister","onclick","forum_branding_display","forum_branding_text","logout","button","forumLayout","loader","markup","content","tabindex","aria-labelledby"],"mappings":"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","file":"misago.js","sourcesContent":["/* global -Misago */\n/* exported Misago */\n(function () {\n 'use strict';\n\n window.Misago = function() {\n var ns = Object.getPrototypeOf(this);\n var self = this;\n\n // Services init/destroy\n this._initServices = function(services) {\n var orderedServices = new ns.OrderedList(services).order(false);\n orderedServices.forEach(function (item) {\n var factory = null;\n if (item.item.factory !== undefined) {\n factory = item.item.factory;\n } else {\n factory = item.item;\n }\n\n var serviceInstance = factory(self);\n if (serviceInstance) {\n self[item.key] = serviceInstance;\n }\n });\n };\n\n this._destroyServices = function(services) {\n var orderedServices = new ns.OrderedList(services).order();\n orderedServices.reverse();\n orderedServices.forEach(function (item) {\n if (item.destroy !== undefined) {\n item.destroy(self);\n }\n });\n };\n\n // Context data\n this.context = {\n // Empty settings\n SETTINGS: {}\n };\n\n // App init/destory\n this.setup = false;\n this.init = function(setup, context) {\n this.setup = {\n fixture: ns.get(setup, 'fixture', null),\n test: ns.get(setup, 'test', false),\n api: ns.get(setup, 'api', '/api/')\n };\n\n if (context) {\n this.context = context;\n }\n\n this._initServices(ns._services);\n };\n\n this.destroy = function() {\n this._destroyServices(ns._services);\n };\n };\n\n\n // Services\n var proto = window.Misago.prototype;\n\n proto._services = [];\n proto.addService = function(name, factory, order) {\n proto._services.push({\n key: name,\n item: factory,\n after: proto.get(order, 'after'),\n before: proto.get(order, 'before')\n });\n };\n}());\n\n(function (Misago) {\n 'use strict';\n\n Misago.has = function(obj, key) {\n if (obj) {\n return obj.hasOwnProperty(key);\n } else {\n return false;\n }\n };\n\n Misago.get = function(obj, key, value) {\n if (Misago.has(obj, key)) {\n return obj[key];\n } else if (value !== undefined) {\n return value;\n } else {\n return undefined;\n }\n };\n\n Misago.pop = function(obj, key, value) {\n var returnValue = Misago.get(obj, key, value);\n if (Misago.has(obj, key)) {\n obj[key] = null;\n }\n return returnValue;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.input = function(kwargs) {\n var options = {\n disabled: kwargs.disabled || false,\n placeholder: kwargs.placeholder || null,\n config: kwargs.config || null\n };\n\n var element = 'input';\n\n if (kwargs.id) {\n element += '#' + kwargs.id;\n }\n\n element += '.form-control' + (kwargs.class || '');\n element += '[type=\"' + (kwargs.type || 'text') + '\"]';\n\n if (kwargs.value) {\n options.value = kwargs.value();\n options.oninput = m.withAttr('value', kwargs.value);\n }\n\n return m(element, options);\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var noop = function() {};\n\n Misago.stateHooks = function(component, loadingState, errorState) {\n /*\n Boilerplate for Misago components with lifecycles\n */\n\n // Component boilerplated (this may happen in tests)\n if (component._hasLifecycleHooks) {\n return component;\n }\n component._hasLifecycleHooks = true;\n\n // Component active state\n component.isActive = true;\n\n // Wrap controller to store lifecycle methods\n var _controller = component.controller || noop;\n component.controller = function() {\n component.isActive = true;\n\n var controller = _controller.apply(component, arguments) || {};\n\n // wrap onunload for lifestate\n var _onunload = controller.onunload || noop;\n controller.onunload = function() {\n _onunload.apply(component, arguments);\n component.isActive = false;\n };\n\n return controller;\n };\n\n // Add state callbacks to View-Model\n if (component.vm && component.vm.init) {\n // setup default loading view\n if (!component.loading) {\n var loadingHandler = loadingState.bind(component);\n component.loading = loadingHandler;\n }\n\n var _view = component.view;\n component.view = function() {\n if (component.vm.isReady) {\n return _view.apply(component, arguments);\n } else {\n return component.loading.apply(component, arguments);\n }\n };\n\n var errorHandler = errorState.bind(component);\n\n // wrap vm.init in promise handler\n var _init = component.vm.init;\n component.vm.init = function() {\n var initArgs = arguments;\n var promise = _init.apply(component.vm, initArgs);\n\n if (promise) {\n promise.then(function() {\n if (component.isActive && component.vm.ondata) {\n var finalArgs = [];\n for (var i = 0; i < arguments.length; i++) {\n finalArgs.push(arguments[i]);\n }\n for (var f = 0; f < initArgs.length; f++) {\n finalArgs.push(initArgs[f]);\n }\n\n component.vm.ondata.apply(component.vm, finalArgs);\n }\n }, function(error) {\n if (component.isActive) {\n errorHandler(error);\n }\n });\n }\n };\n }\n\n return component;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.OrderedList = function(items) {\n this.isOrdered = false;\n this._items = items || [];\n\n this.add = function(key, item, order) {\n this._items.push({\n key: key,\n item: item,\n after: Misago.get(order, 'after'),\n before: Misago.get(order, 'before')\n });\n };\n\n this.get = function(key, value) {\n for (var i = 0; i < this._items.length; i++) {\n if (this._items[i].key === key) {\n return this._items[i].item;\n }\n }\n\n return value;\n };\n\n this.has = function(key) {\n return this.get(key) !== undefined;\n };\n\n this.values = function() {\n var values = [];\n for (var i = 0; i < this._items.length; i++) {\n values.push(this._items[i].item);\n }\n return values;\n };\n\n this.order = function(values_only) {\n if (!this.isOrdered) {\n this._items = this._order(this._items);\n this.isOrdered = true;\n }\n\n if (values_only || typeof values_only === 'undefined') {\n return this.values();\n } else {\n return this._items;\n }\n };\n\n this._order = function(unordered) {\n // Index of unordered items\n var index = [];\n unordered.forEach(function (item) {\n index.push(item.key);\n });\n\n // Ordered items\n var ordered = [];\n var ordering = [];\n\n // First pass: register items that\n // don't specify their order\n unordered.forEach(function (item) {\n if (!item.after && !item.before) {\n ordered.push(item);\n ordering.push(item.key);\n }\n });\n\n // Second pass: register items that\n // specify their before to \"_end\"\n unordered.forEach(function (item) {\n if (item.before === \"_end\") {\n ordered.push(item);\n ordering.push(item.key);\n }\n });\n\n // Third pass: keep iterating items\n // until we hit iterations limit or finish\n // ordering list\n function insertItem(item) {\n var insertAt = -1;\n if (ordering.indexOf(item.key) === -1) {\n if (item.after) {\n insertAt = ordering.indexOf(item.after);\n if (insertAt !== -1) {\n insertAt += 1;\n }\n } else if (item.before) {\n insertAt = ordering.indexOf(item.before);\n }\n\n if (insertAt !== -1) {\n ordered.splice(insertAt, 0, item);\n ordering.splice(insertAt, 0, item.key);\n }\n }\n }\n\n var iterations = 200;\n while (iterations > 0 && index.length !== ordering.length) {\n iterations -= 1;\n unordered.forEach(insertItem);\n }\n\n return ordered;\n };\n };\n} (Misago.prototype));\n\n(function (Misago) {\n Misago.serializeDatetime = function(serialized) {\n return serialized ? serialized.format() : null;\n };\n\n Misago.deserializeDatetime = function(deserialized) {\n return deserialized ? moment(deserialized) : null;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.startsWith = function(string, beginning) {\n return string.indexOf(beginning) === 0;\n };\n\n Misago.endsWith = function(string, tail) {\n return string.indexOf(tail, string.length - tail.length) !== -1;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.UrlConf = function() {\n var self = this;\n this._patterns = [];\n\n this.patterns = function() {\n return this._patterns;\n };\n\n var prefixPattern = function(prefix, pattern) {\n return (prefix + pattern).replace('//', '/');\n };\n\n var include = function(prefix, patterns) {\n for (var i = 0; i < patterns.length; i ++) {\n self.url(prefixPattern(prefix, patterns[i].pattern),\n patterns[i].component,\n patterns[i].name);\n }\n };\n\n this.url = function(pattern, component, name) {\n if (pattern === '') {\n pattern = '/';\n }\n\n if (component instanceof Misago.UrlConf) {\n include(pattern, component.patterns());\n } else {\n this._patterns.push({\n pattern: pattern,\n component: component.replace(/_/g, '-'),\n name: name || component\n });\n }\n };\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.loadingPage = function(_) {\n return m('.page.page-loading',\n _.component('loader')\n );\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var getCsrfToken = function(cookie_name) {\n if (document.cookie.indexOf(cookie_name) !== -1) {\n var cookieRegex = new RegExp(cookie_name + '\\=([^;]*)');\n var cookie = Misago.get(document.cookie.match(cookieRegex), 0);\n return cookie.split('=')[1];\n } else {\n return null;\n }\n };\n\n var Ajax = function(_) {\n this.refreshCsrfToken = function() {\n this.csrfToken = getCsrfToken(_.context.CSRF_COOKIE_NAME);\n };\n this.refreshCsrfToken();\n\n /*\n List of GETs underway\n We are limiting number of GETs to API to 1 per url\n */\n var runningGets = {};\n\n this.ajax = function(method, url, data, progress) {\n var promise = m.deferred();\n\n var ajax_settings = {\n url: url,\n method: method,\n headers: {\n 'X-CSRFToken': this.csrfToken\n },\n\n data: data || {},\n dataType: 'json',\n\n success: function(data) {\n if (method === 'GET') {\n Misago.pop(runningGets, url);\n }\n promise.resolve(data);\n },\n error: function(jqXHR) {\n if (method === 'GET') {\n Misago.pop(runningGets, url);\n }\n\n var rejection = jqXHR.responseJSON || {};\n\n rejection.status = jqXHR.status;\n rejection.statusText = jqXHR.statusText;\n\n promise.reject(rejection);\n }\n };\n\n if (progress) {\n return; // not implemented... yet!\n }\n\n $.ajax(ajax_settings);\n return promise.promise;\n };\n\n this.get = function(url) {\n var preloaded = Misago.pop(_.context, url);\n if (preloaded) {\n var deferred = m.deferred();\n deferred.resolve(preloaded);\n return deferred.promise;\n } else if (runningGets[url] !== undefined) {\n return runningGets[url];\n } else {\n runningGets[url] = this.ajax('GET', url);\n return runningGets[url];\n }\n };\n\n this.post = function(url, data) {\n return this.ajax('POST', url, data);\n };\n\n this.patch = function(url, data) {\n return this.ajax('PATCH', url, data);\n };\n\n this.put = function(url, data) {\n return this.ajax('PUT', url, data);\n };\n\n this.delete = function(url) {\n return this.ajax('DELETE', url);\n };\n };\n\n Misago.addService('ajax', function(_) {\n return new Ajax(_);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var ALERT_BASE_DISPLAY_TIME = 5 * 1000;\n var ALERT_LENGTH_FACTOR = 70;\n var ALERT_MAX_DISPLAY_TIME = 9 * 1000;\n var ALERT_HIDE_ANIMATION_LENGTH = 300;\n\n var Alert = function(_) {\n var self = this;\n\n this.id = 0;\n this.type = 'info';\n this.message = null;\n this.isVisible = false;\n\n var show = function(type, message) {\n m.startComputation();\n\n self.id += 1;\n self.type = type;\n self.message = message;\n self.isVisible = true;\n\n m.endComputation();\n\n var displayTime = ALERT_BASE_DISPLAY_TIME;\n displayTime += message.length * ALERT_LENGTH_FACTOR;\n if (displayTime > ALERT_MAX_DISPLAY_TIME) {\n displayTime = ALERT_MAX_DISPLAY_TIME;\n }\n\n var id = self.id;\n _.runloop.runOnce(function () {\n if (self.id === id) {\n m.startComputation();\n self.isVisible = false;\n m.endComputation();\n }\n }, 'flash-message-hide', displayTime);\n };\n\n var set = function(type, message) {\n if (self.isVisible) {\n self.isVisible = false;\n _.runloop.runOnce(function () {\n show(type, message);\n }, 'flash-message-show', ALERT_HIDE_ANIMATION_LENGTH);\n } else {\n show(type, message);\n }\n };\n\n this.info = function(message) {\n set('info', message);\n };\n\n this.success = function(message) {\n set('success', message);\n };\n\n this.warning = function(message) {\n set('warning', message);\n };\n\n this.error = function(message) {\n set('error', message);\n };\n };\n\n Misago.addService('alert', {\n factory: function(_) {\n return new Alert(_);\n }\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var filtersUrl = function(filters) {\n if (typeof filters === 'object') {\n var values = [];\n for (var key in filters) {\n if (filters.hasOwnProperty(key)) {\n var encodedKey = encodeURIComponent(key);\n var encodedValue = encodeURIComponent(filters[key]);\n values.push(encodedKey + '=' + encodedValue);\n }\n }\n return '?' + values.join('&');\n } else {\n return filters + '/';\n }\n };\n\n var Query = function(_, call) {\n this.url = call.url || _.setup.api;\n\n if (call.path) {\n this.url += call.path + '/';\n } else if (call.related) {\n this.url += call.related + '/';\n } else {\n this.url += call.model + 's' + '/';\n }\n\n if (call.filters) {\n this.url += filtersUrl(call.filters);\n }\n\n if (!call.url && call.filters) {\n if (call.model) {\n this.related = function(model, filters) {\n return new Query(_, {\n url: this.url,\n relation: call.model,\n related: model,\n filters: filters,\n });\n };\n }\n\n this.endpoint = function(path, filters) {\n return new Query(_, {\n url: this.url,\n path: path,\n filters: filters\n });\n };\n }\n\n this.get = function() {\n var model = null;\n if (call.related) {\n model = call.relation + ':' + call.related;\n } else if (call.model) {\n model = call.model;\n }\n\n return _.ajax.get(this.url).then(function(data) {\n if (model) {\n if (data.results) {\n data.results.map(function(item) {\n return _.models.new(model, item);\n });\n return data;\n } else {\n return _.models.new(model, data);\n }\n } else {\n return data;\n }\n });\n };\n\n this.post = function(data) {\n return _.ajax.post(this.url, data);\n };\n\n this.patch = function(data) {\n return _.ajax.patch(this.url, data);\n };\n\n this.put = function(data) {\n return _.ajax.put(this.url, data);\n };\n\n this.delete = function() {\n return _.ajax.delete(this.url);\n };\n\n // shortcut for get()\n this.then = function(resolve, reject) {\n return this.get().then(resolve, reject);\n };\n };\n\n var Api = function(_) {\n this.model = function(model, filters) {\n return new Query(_, {\n model: model,\n filters: filters,\n });\n };\n\n this.endpoint = function(path, filters) {\n return new Query(_, {\n path: path,\n filters: filters\n });\n };\n\n this.alert = function(rejection) {\n // Shorthand for API errors\n var message = gettext(\"Unknown error has occured.\");\n\n if (rejection.status === 0) {\n message = gettext(\"Lost connection with application.\");\n }\n\n if (rejection.status === 403) {\n message = rejection.detail;\n if (message === \"Permission denied\") {\n message = gettext(\n \"You don't have permission to perform this action.\");\n }\n }\n\n if (rejection.status === 404) {\n message = gettext(\"Action link is invalid.\");\n }\n\n _.alert.error(message);\n };\n };\n\n Misago.addService('api', function(_) {\n return new Api(_);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Auth = function(_) {\n _.user = _.models.deserialize('user', _.context.user);\n };\n\n Misago.addService('auth', function(_) {\n return new Auth(_);\n },\n {\n after: 'model:user'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var component = function(name, component) {\n if (this._components[name]) {\n if (arguments.length > 1) {\n var argumentsArray = [this._components[name]];\n for (var i = 1; i < arguments.length; i += 1) {\n argumentsArray.push(arguments[i]);\n }\n argumentsArray.push(this);\n return m.component.apply(undefined, argumentsArray);\n } else {\n return m.component(this._components[name], this);\n }\n } else {\n this._components[name] = component;\n }\n };\n\n Misago.addService('components', function(_) {\n _._components = {};\n _.component = component;\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('conf', function(_) {\n _.settings = Misago.get(_.context, 'SETTINGS', {});\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('forum-layout', {\n factory: function(_) {\n if (_.setup.fixture) {\n m.mount(document.getElementById(_.setup.fixture),\n _.component('forum-layout'));\n }\n },\n\n destroy: function(_) {\n if (_.setup.fixture) {\n m.mount(document.getElementById(_.setup.fixture), null);\n }\n }\n },\n {\n before: 'start-routing'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Modal = function() {\n var self = this;\n\n var element = document.getElementById('misago-modal');\n\n // href clicks within modal should close it\n var delegateName = 'click.misago-modal';\n $(element).on(delegateName, 'a', function() {\n self.hide();\n });\n\n this.destroy = function() {\n $(element).off();\n $('body').removeClass('modal-open');\n $('.modal-backdrop').remove();\n };\n\n // Open/close modal\n var modal = $(element).modal({show: false});\n this.open = false;\n\n modal.on('hidden.bs.modal', function () {\n if (self.open) {\n m.mount(element, null);\n this.open = false;\n }\n });\n\n this.show = function(component) {\n this.open = true;\n m.mount(element, component);\n modal.modal('show');\n };\n\n this.hide = function() {\n modal.modal('hide');\n };\n };\n\n Misago.addService('_modal', {\n factory: function() {\n return new Modal();\n },\n destroy: function(_) {\n _._modal.destroy();\n }\n },\n {\n after: 'start-routing'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var boilerplate = function(component) {\n return component;\n };\n\n var modal = function(name, component) {\n if (this._modals[name]) {\n var argumentsArray = [this._modals[name]];\n for (var i = 1; i < arguments.length; i += 1) {\n argumentsArray.push(arguments[i]);\n }\n argumentsArray.push(this);\n this._modal.show(m.component.apply(m, argumentsArray));\n } else if (name) {\n this._modals[name] = boilerplate(component);\n } else {\n this._modal.hide();\n }\n };\n\n Misago.addService('modals', function(_) {\n _._modals = {};\n _.modal = modal;\n },\n {\n after: '_modal'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Models = function() {\n this.classes = {};\n this.deserializers = {};\n this.relations = {};\n\n this.add = function(name, kwargs) {\n if (kwargs.class) {\n this.classes[name] = kwargs.class;\n }\n\n if (kwargs.deserialize) {\n this.deserializers[name] = kwargs.deserialize;\n }\n\n if (kwargs.relations) {\n for (var key in kwargs.relations) {\n if (kwargs.relations.hasOwnProperty(key)) {\n this.relations[name + ':' + key] = kwargs.relations[key];\n }\n }\n }\n };\n\n this.new = function(name, data) {\n if (this.classes[name]) {\n return new this.classes[name](data);\n } else {\n return data;\n }\n };\n\n this.deserialize = function(name, json) {\n if (this.relations[name]) {\n name = this.relations[name];\n }\n\n if (this.deserializers[name]) {\n return this.new(name, this.deserializers[name](json, this));\n } else {\n return this.new(name, json);\n }\n };\n };\n\n Misago.addService('models', function() {\n return new Models();\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('set-momentjs-locale', function() {\n moment.locale($('html').attr('lang'));\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Router = function(_) {\n var self = this;\n this.baseUrl = $('base').attr('href');\n\n var staticUrl = Misago.get(_.context, 'STATIC_URL', '/');\n var mediaUrl = Misago.get(_.context, 'MEDIA_URL', '/');\n\n // Routing\n this.urls = {};\n this.reverses = {};\n\n var populatePatterns = function(urlconf) {\n urlconf.patterns().forEach(function(url) {\n var finalPattern = self.baseUrl + url.pattern;\n finalPattern = finalPattern.replace('//', '/');\n\n self.urls[finalPattern] = _.route(url.component);\n self.reverses[url.name] = finalPattern;\n });\n };\n\n this.startRouting = function(urlconf, fixture) {\n populatePatterns(urlconf);\n this.fixture = fixture;\n\n if (_.setup.test) {\n m.route.mode = 'search';\n } else {\n m.route.mode = 'pathname';\n }\n m.route(fixture, '/', this.urls);\n };\n\n this.url = function(name) {\n return this.reverses[name];\n };\n\n // Delegate clicks\n this.delegateElement = null;\n\n this.cleanUrl = function(url) {\n if (!url) { return; }\n\n // Is link relative?\n var isRelative = url.substr(0, 1) === '/' && url.substr(0, 2) !== '//';\n\n // If link contains host, validate to see if its outgoing\n if (!isRelative) {\n var location = window.location;\n\n // If protocol matches current one, strip it from string\n // otherwhise stop handler\n if (url.substr(0, 2) !== '//') {\n var protocol = url.substr(0, location.protocol.length + 2);\n if (protocol !== location.protocol + '//') { return; }\n url = url.substr(location.protocol.length + 2);\n } else {\n url = url.substr(2);\n }\n\n // Host checks out?\n if (url.substr(0, location.host.length) !== location.host) { return; }\n url = url.substr(location.host.length);\n }\n\n // Is link within Ember app?\n if (url.substr(0, this.baseUrl.length) !== this.baseUrl) { return; }\n\n // Is link to media/static/avatar server?\n if (url.substr(0, staticUrl.length) === staticUrl) { return; }\n\n if (url.substr(0, mediaUrl.length) === mediaUrl) { return; }\n\n var avatarsUrl = '/user-avatar/';\n if (url.substr(0, avatarsUrl.length) === avatarsUrl) { return; }\n\n return url;\n };\n\n var delegateName = 'click.misago-router';\n this.delegateClicks = function(element) {\n this.delegateElement = element;\n $(this.delegateElement).on(delegateName, 'a', function(e) {\n var cleanUrl = self.cleanUrl(e.target.href);\n if (cleanUrl) {\n if (cleanUrl != m.route()) {\n m.route(cleanUrl);\n }\n e.preventDefault();\n }\n });\n };\n\n this.destroy = function() {\n $(this.delegateElement).off(delegateName);\n };\n\n // Media/Static url\n var prefixUrl = function(prefix) {\n return function(url) {\n return prefix + url;\n };\n };\n\n this.staticUrl = prefixUrl(staticUrl);\n this.mediaUrl = prefixUrl(mediaUrl);\n\n // Errors\n this.error403 = function(error) {\n var component = null;\n if (error.ban) {\n component = _.route('error:banned',\n error.detail,\n _.models.deserialize('ban', error.ban));\n } else {\n component = _.route('error:403', error.detail);\n }\n m.mount(this.fixture, component);\n };\n\n this.error404 = function() {\n m.mount(this.fixture, _.route('error:404'));\n };\n\n this.error500 = function() {\n m.mount(this.fixture, _.route('error:500'));\n };\n\n this.error0 = function() {\n m.mount(this.fixture, _.route('error:0'));\n };\n\n this.errorPage = function(error) {\n if (error.status === 0) {\n this.error0();\n }\n\n if (error.status === 500) {\n this.error500();\n }\n\n if (error.status === 404) {\n this.error404();\n }\n\n if (error.status === 403) {\n this.error403(error);\n }\n };\n };\n\n Misago.addService('router', function(_) {\n return new Router(_);\n });\n\n Misago.addService('start-routing', function(_) {\n _.router.startRouting(\n Misago.urls, document.getElementById('router-fixture'));\n _.router.delegateClicks(document.getElementById(_.setup.fixture));\n },\n {\n before: '_end'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var boilerplate = function(component) {\n /*\n Boilerplate for Misago top-level components\n */\n\n // Component boilerplated (this may happen in tests)\n if (component._hasRouteBoilerplate) {\n return component;\n }\n component._hasRouteBoilerplate = true;\n\n // Add lifecycle hooks\n var loadingView = function () {\n var _ = this.container;\n return m('.page.page-loading',\n _.component('loader')\n );\n };\n\n var errorHandler = function(error) {\n if (this.isActive) {\n this.container.router.errorPage(error);\n }\n };\n\n return Misago.stateHooks(component, loadingView, errorHandler);\n };\n\n Misago.addService('routes', function(_) {\n _._routes = {};\n _.route = function(name, component) {\n if (this._routes[name]) {\n if (arguments.length > 1) {\n var argumentsArray = [this._routes[name]];\n for (var i = 1; i < arguments.length; i += 1) {\n argumentsArray.push(arguments[i]);\n }\n argumentsArray.push(this);\n return m.component.apply(undefined, argumentsArray);\n } else {\n return m.component(this._routes[name], this);\n }\n } else {\n component.container = _;\n this._routes[name] = boilerplate(component);\n }\n };\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var RunLoop = function(_) {\n var self = this;\n\n this._intervals = {};\n\n var stopInterval = function(name) {\n if (self._intervals[name]) {\n window.clearTimeout(self._intervals[name]);\n self._intervals[name] = null;\n }\n };\n\n this.run = function(callable, name, delay) {\n this._intervals[name] = window.setTimeout(function() {\n stopInterval(name);\n var result = callable(_);\n if (result !== false) {\n self.run(callable, name, delay);\n }\n }, delay);\n };\n\n this.runOnce = function(callable, name, delay) {\n this._intervals[name] = window.setTimeout(function() {\n stopInterval(name);\n callable(_);\n }, delay);\n };\n\n this.stop = function(name) {\n for (var loop in this._intervals) {\n if (!name || name === loop) {\n stopInterval(loop);\n }\n }\n };\n };\n\n Misago.addService('runloop', {\n factory: function(_) {\n return new RunLoop(_);\n },\n\n destroy: function(_) {\n _.runloop.stop();\n }\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('start-tick', function(_) {\n var ticks = m.prop();\n\n _.runloop.run(function() {\n m.startComputation();\n // just tick once a minute so stuff gets rerendered\n ticks(ticks() + 1);\n // syncing dynamic timestamps, etc ect\n m.endComputation();\n }, 'tick', 60000);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var PageTitle = function(forum_name) {\n this.set = function(title) {\n if (title) {\n this._set_complex(title);\n } else {\n document.title = forum_name;\n }\n };\n\n this._set_complex = function(title) {\n if (typeof title === 'string') {\n title = {title: title};\n }\n\n var completeTitle = title.title;\n\n if (typeof title.page !== 'undefined' && title.page > 1) {\n var page_label = interpolate(\n gettext('page %(page)s'), { page:title.page }, true);\n completeTitle += ' (' + page_label + ')';\n }\n\n if (typeof title.parent !== 'undefined') {\n completeTitle += ' | ' + title.parent;\n }\n\n document.title = completeTitle + ' | ' + forum_name;\n };\n };\n\n Misago.addService('page-title', function(_) {\n _.title = new PageTitle(_.settings.forum_name);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n // Validators namespace\n Misago.validators = {\n required: function() {\n return function(value) {\n if ($.trim(value).length === 0) {\n return gettext(\"This field is required.\");\n }\n };\n }\n };\n\n var validate = function(ctrl) {\n var errors = {};\n var value = null;\n var validator = null;\n var result = null;\n\n for (var key in ctrl.validation) {\n if (ctrl.validation.hasOwnProperty(key)) {\n value = ctrl[key]();\n\n for (var i in ctrl.validation[key]) {\n validator = ctrl.validation[key][i];\n result = validator(value);\n\n if (result) {\n if (!errors[key]) {\n errors[key] = [];\n }\n errors[key].push(result);\n }\n }\n }\n }\n\n if (Object.getOwnPropertyNames(errors).length > 0) {\n return errors;\n } else {\n return null;\n }\n };\n\n Misago.addService('validate', {\n factory: function() {\n return validate;\n }\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Ban = function(data) {\n this.message = {\n html: data.message.html,\n plain: data.message.plain,\n };\n\n this.expires_on = data.expires_on;\n };\n\n var deserializeBan = function(data) {\n data.expires_on = Misago.deserializeDatetime(data.expires_on);\n\n return data;\n };\n\n Misago.addService('model:ban', function(_) {\n _.models.add('ban', {\n class: Ban,\n deserialize: deserializeBan\n });\n },\n {\n after: 'models'\n });\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var LegalPage = function(data) {\n this.title = data.title;\n this.body = data.body;\n this.link = data.link;\n };\n\n Misago.addService('model:legal-page', function(_) {\n _.models.add('legal-page', {\n class: LegalPage\n });\n },\n {\n after: 'models'\n });\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var User = function(data) {\n this.id = data.id;\n\n this.isAuthenticated = !!this.id;\n this.isAnonymous = !this.isAuthenticated;\n\n this.slug = data.slug;\n this.username = data.username;\n\n this.acl = data.acl;\n this.rank = data.rank;\n };\n\n var deserializeUser = function(data) {\n if (data.joined_on) {\n data.joined_on = Misago.deserializeDatetime(data.joined_on);\n }\n\n return data;\n };\n\n Misago.addService('model:user', function(_) {\n _.models.add('user', {\n class: User,\n deserialize: deserializeUser\n });\n },\n {\n after: 'models'\n });\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var errorPage = function(error) {\n var error_message = [\n m('p.lead', error.message)\n ];\n\n if (error.help) {\n error_message.push(m('p.help', error.help));\n }\n\n return m('.page.error-page.error-' + error.code + '-page',\n m('.container',\n m('.error-panel', [\n m('.error-icon',\n m('span.material-icon', error.icon)\n ),\n m('.error-message', error_message)\n ])\n )\n );\n };\n\n var errorBanned = {\n controller: function() {\n this.container.title.set(gettext('You are banned'));\n },\n view: function(ctrl, message, ban) {\n var error_message = [];\n\n if (ban.message.html) {\n error_message.push(m('.lead', m.trust(ban.message.html)));\n } else if (message) {\n error_message.push(m('p.lead', message));\n } else {\n error_message.push(m('p.lead', gettext('You are banned.')));\n }\n\n var expirationMessage = null;\n if (ban.expires_on) {\n if (ban.expires_on.isAfter(moment())) {\n expirationMessage = interpolate(\n gettext('This ban expires %(expires_on)s.'),\n { 'expires_on': ban.expires_on.fromNow() },\n true);\n } else {\n expirationMessage = gettext('This ban has expired.');\n }\n } else {\n expirationMessage = gettext('This ban is permanent.');\n }\n error_message.push(m('p', expirationMessage));\n\n return m('.page.error-page.error-banned-page',\n m('.container',\n m('.error-panel', [\n m('.error-icon',\n m('span.material-icon', 'highlight_off')\n ),\n m('.error-message', error_message)\n ])\n )\n );\n }\n };\n\n var error403 = {\n controller: function() {\n this.container.title.set(gettext('Page not available'));\n },\n view: function(ctrl, message) {\n if (message === \"Permission denied\") {\n message = gettext(\"You don't have permission to access this page.\");\n }\n\n return errorPage({\n code: 403,\n icon: 'remove_circle_outline',\n message: gettext(\"This page is not available.\"),\n help: message\n });\n }\n };\n\n var error404 = {\n controller: function() {\n this.container.title.set(gettext('Page not found'));\n },\n view: function() {\n return errorPage({\n code: 404,\n icon: 'info_outline',\n message: gettext(\"Requested page could not be found.\"),\n help: gettext(\"The link you followed was incorrect or the page has been moved or deleted.\")\n });\n }\n };\n\n var error500 = {\n controller: function() {\n this.container.title.set(gettext('Application error occured'));\n },\n view: function() {\n return errorPage({\n code: 500,\n icon: 'error_outline',\n message: gettext(\"Requested page could not be displayed due to an error.\"),\n help: gettext(\"Please try again later or contact site staff if error persists.\")\n });\n }\n };\n\n var error0 = {\n controller: function() {\n this.container.title.set(gettext('Lost connection with application'));\n },\n view: function() {\n return errorPage({\n code: 0,\n icon: 'sync_problem',\n message: gettext(\"Could not connect to application.\"),\n help: gettext(\"This may be caused by problems with your connection or application server. Please check your internet connection and refresh page if problem persists.\")\n });\n }\n };\n\n Misago.addService('route:error-pages', function(_) {\n _.route('error:banned', errorBanned);\n _.route('error:403', error403);\n _.route('error:404', error404);\n _.route('error:500', error500);\n _.route('error:0', error0);\n },\n {\n after: 'routes'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var index = {\n controller: function() {\n var _ = this.container;\n document.title = _.settings.forum_index_title || _.settings.forum_name;\n\n var count = m.prop(0);\n\n return {\n count: count,\n increment: function() {\n console.log('increment()');\n count(count() + 1);\n }\n };\n },\n view: function(ctrl, _) {\n var styles = [\n 'default', 'primary', 'success',\n 'info', 'warning', 'danger'\n ];\n\n return m('.container', [\n m('h1', 'Buttons'),\n m('', styles.map(function(item) {\n return m('', [\n _.component('button', {\n class: '.btn-' + item,\n label: 'Lorem ipsum'\n }),\n _.component('button', {\n class: '.btn-' + item,\n label: 'Lorem ipsum',\n loading: true\n })\n ]);\n }))\n ]);\n }\n };\n\n Misago.addService('route:index', function(_) {\n _.route('index', index);\n },\n {\n after: 'routes'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var legalPageFactory = function(typeName, defaultTitle) {\n var dashedTypeName = typeName.replace(/_/g, '-');\n\n return {\n controller: function(_) {\n if (Misago.get(_.settings, typeName + '_link')) {\n window.location = Misago.get(_.settings, typeName + '_link');\n } else {\n this.vm.init(this, _);\n }\n },\n vm: {\n page: null,\n isReady: false,\n init: function(component, _) {\n if (this.isReady) {\n _.title.set(this.title);\n } else {\n _.title.set();\n return _.api.model('legal-page', dashedTypeName);\n }\n },\n ondata: function(page, component, _) {\n m.startComputation();\n\n if (page.link) {\n window.location = page.link;\n } else {\n page.title = page.title || defaultTitle;\n this.page = page;\n this.isReady = true;\n\n m.endComputation();\n\n if (component.isActive) {\n _.title.set(this.page.title);\n }\n }\n }\n },\n view: function(ctrl, _) {\n return m('.page.legal-page.' + dashedTypeName + '-page', [\n _.component('header', {title: this.vm.page.title}),\n m('.container',\n _.component('markup', this.vm.page.body)\n )\n ]);\n }\n };\n };\n\n Misago.addService('route:legal-pages', function(_) {\n _.route('terms-of-service', legalPageFactory(\n 'terms_of_service', gettext('Terms of service')));\n _.route('privacy-policy', legalPageFactory(\n 'privacy_policy', gettext('Privacy policy')));\n },\n {\n after: 'routes'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var isMenuVisible = function(settings) {\n return [\n !!settings.forum_footnote,\n !!settings.terms_of_service,\n !!settings.terms_of_service_link,\n !!settings.privacy_policy,\n !!settings.privacy_policy_link\n ].indexOf(true) !== -1;\n };\n\n var footer = {\n view: function(ctrl, _) {\n var nav = null;\n if (isMenuVisible(_.settings)) {\n nav = _.component('footer:menu');\n }\n\n return m('footer.forum-footer', [\n m('.container',\n m('.footer-content', [\n nav,\n _.component('footer:branding')\n ])\n )\n ]);\n }\n };\n\n Misago.addService('component:footer', function(_) {\n _.component('footer', footer);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var legalLink = function(_, legalType, defaultTitle) {\n var url = Misago.get(_.settings, legalType + '_link');\n if (!url && Misago.get(_.settings, legalType)) {\n url = _.router.url(legalType);\n }\n\n if (url) {\n return m('li',\n m('a', {href: url},\n Misago.get(_.settings, legalType + '_title', defaultTitle)\n )\n );\n } else {\n return null;\n }\n };\n\n var menu = {\n isVisible: function(settings) {\n return [\n !!settings.forum_footnote,\n !!settings.terms_of_service,\n !!settings.terms_of_service_link,\n !!settings.privacy_policy,\n !!settings.privacy_policy_link\n ].indexOf(true) !== -1;\n },\n view: function(ctrl, _) {\n var items = [];\n\n if (_.settings.forum_footnote) {\n items.push(m('li.forum-footnote', m.trust(_.settings.forum_footnote)));\n }\n\n items.push(\n legalLink(_, 'terms_of_service', gettext('Terms of service')));\n items.push(\n legalLink(_, 'privacy_policy', gettext('Privacy policy')));\n\n return m('ul.list-inline.footer-nav', items);\n }\n };\n\n Misago.addService('component:footer:menu', function(_) {\n _.component('footer:menu', menu);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var branding = {\n view: function() {\n return m('a.misago-branding[href=http://misago-project.org]', [\n \"powered by \", m('strong', \"misago\")\n ]);\n }\n };\n\n Misago.addService('component:footer:branding', function(_) {\n _.component('footer:branding', branding);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var header = {\n view: function(ctrl, title) {\n return m('.modal-header', [\n m('button.close[type=\"button\"]',\n {'data-dismiss': 'modal', 'aria-label': gettext('Close')},\n m('span', {'aria-hidden': 'true'}, m.trust('×'))\n ),\n m('h4#misago-modal-label.modal-title', title)\n ]);\n }\n };\n\n Misago.addService('component:modal:header', function(_) {\n _.component('modal:header', header);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n function persistent(el, isInit, context) {\n context.retain = true;\n }\n\n var register = {\n view: function() {\n return m('.modal-dialog.modal-lg[role=\"document\"]',\n {config: persistent},\n m('.modal-content', [\n m('.modal-header',\n m('h4#misago-modal-label.modal-title', 'Register in modal!')\n ),\n m('.modal-body', [\n m('p', 'Lorem ipsum dolor met sit amet elit.'),\n m('p', [\n 'Si vis pacem ',\n m('a', {href: '/'}, 'bellum'),\n ' sequitat.'\n ])\n ])\n ])\n );\n }\n };\n\n Misago.addService('modal:register', function(_) {\n _.modal('register', register);\n },\n {\n after: 'modals'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n function persistent(el, isInit, context) {\n context.retain = true;\n }\n\n var signin = {\n controller: function() {\n return {\n busy: m.prop(false),\n showActivation: m.prop(false),\n\n username: m.prop(''),\n password: m.prop(''),\n\n validation: {\n 'username': [Misago.validators.required()],\n 'password': [Misago.validators.required()]\n }\n };\n },\n submit: function(ctrl, _) {\n if (ctrl.busy()) {\n return false;\n }\n\n if (_.validate(ctrl)) {\n _.alert.error(gettext(\"Fill out both fields.\"));\n return false;\n }\n\n m.startComputation();\n ctrl.busy(true);\n m.endComputation();\n\n var credentials = {\n username: ctrl.username(),\n password: ctrl.password()\n };\n\n var self = this;\n\n _.api.endpoint('auth').post(credentials).then(\n function() {\n self.success(credentials, _);\n },\n function(error) {\n self.error(ctrl, error, _);\n });\n\n return false;\n },\n success: function(credentials, _) {\n var $form = $('#hidden-login-form');\n\n // refresh CSRF token because api call to /auth/ changed it\n _.ajax.refreshCsrfToken();\n\n // fill out form with user credentials and submit it, this will tell\n // misago to redirect user back to right page, and will trigger browser's\n // key ring feature\n $form.find('input[type=\"hidden\"]').val(_.ajax.csrfToken);\n $form.find('input[name=\"redirect_to\"]').val(m.route());\n $form.find('input[name=\"username\"]').val(credentials.username);\n $form.find('input[name=\"password\"]').val(credentials.password);\n $form.submit();\n },\n error: function(ctrl, rejection, _) {\n // activate form again\n m.startComputation();\n ctrl.busy(false);\n m.endComputation();\n\n // handle returned error\n if (rejection.status === 400) {\n if (rejection.code === 'inactive_admin') {\n _.alert.info(rejection.detail);\n } else if (rejection.code === 'inactive_user') {\n _.alert.info(rejection.detail);\n ctrl.showActivation(true);\n } else if (rejection.code === 'banned') {\n _.modal();\n _.router.error403({\n message: '',\n ban: rejection.detail\n });\n } else {\n _.alert.error(rejection.detail);\n }\n } else {\n _.api.alert(rejection);\n }\n },\n view: function(ctrl, _) {\n return m('.modal-dialog.modal-sm.modal-signin[role=\"document\"]',\n {config: persistent},\n m('.modal-content', [\n _.component('modal:header', gettext('Sign in')),\n m('form', {onsubmit: this.submit.bind(this, ctrl, _)}, [\n m('.modal-body', [\n m('.form-group',\n m('.control-input',\n Misago.input({\n disabled: ctrl.busy(),\n value: ctrl.username,\n placeholder: gettext(\"Username or e-mail\")\n })\n )\n ),\n m('.form-group',\n m('.control-input',\n Misago.input({\n type: 'password',\n disabled: ctrl.busy(),\n value: ctrl.password,\n placeholder: gettext(\"Password\")\n })\n )\n )\n ]),\n m('.modal-footer',\n _.component('button', {\n class: '.btn-primary.btn-block',\n submit: true,\n loading: ctrl.busy(),\n label: gettext('Sign in')\n })\n )\n ])\n ])\n );\n }\n };\n\n Misago.addService('modal:sign-in', function(_) {\n _.modal('sign-in', signin);\n },\n {\n after: 'modals'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var navbar = {\n view: function(ctrl, _) {\n var style = '.navbar.navbar-default.navbar-static-top';\n return m('nav' + style + '[role=\"navigation\"]', [\n _.component('navbar:desktop')\n ]);\n }\n };\n\n Misago.addService('component:navbar', function(_) {\n _.component('navbar', navbar);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var brand = {\n view: function(ctrl, branding, _) {\n var children = [\n m('img', {\n src: _.router.staticUrl('misago/img/site-logo.png'),\n alt: _.settings.forum_name\n })\n ];\n\n if (branding) {\n children.push(branding);\n }\n\n return m('a.navbar-brand', {href: _.router.url('index')}, children);\n }\n };\n\n Misago.addService('component:navbar:desktop:brand', function(_) {\n _.component('navbar:desktop:brand', brand);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var menu = {\n controller: function(_) {\n return {\n showSignIn: function() {\n _.modal('sign-in');\n },\n showRegister: function() {\n _.modal('register');\n }\n };\n },\n view: function(ctrl) {\n return m('div.nav.nav-guest', [\n m('button.navbar-btn.btn.btn-default',\n {\n onclick: ctrl.showSignIn\n },\n gettext(\"Sign in\")\n ),\n m('button.navbar-btn.btn.btn-primary',\n {\n onclick: ctrl.showRegister\n },\n gettext(\"Register\")\n )\n ]);\n }\n };\n\n Misago.addService('component:navbar:desktop:guest-menu', function(_) {\n _.component('navbar:desktop:guest-menu', menu);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var navbar = {\n view: function(ctrl, _) {\n var menu = [];\n\n if (_.settings.forum_branding_display) {\n menu.push(\n _.component('navbar:desktop:brand', _.settings.forum_branding_text));\n }\n\n menu.push(m('ul.nav.navbar-nav', [\n m('li',\n m(\"a\", {config: m.route, href: _.router.url('index')}, 'Index')\n )\n ]));\n\n if (_.user.isAuthenticated) {\n menu.push(_.component('navbar:desktop:user-menu'));\n } else {\n menu.push(_.component('navbar:desktop:guest-menu'));\n }\n\n return m('.container.navbar-full.hidden-xs.hidden-sm', menu);\n }\n };\n\n Misago.addService('component:navbar:desktop', function(_) {\n _.component('navbar:desktop', navbar);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var menu = {\n controller: function() {\n return {\n logout: function() {\n $('#hidden-logout-form').submit();\n }\n };\n },\n view: function(ctrl, _) {\n return m('div.nav.nav-user', [\n m('p.navbar-text',\n _.user.username\n ),\n m('button.navbar-btn.btn.btn-default.navbar-right',\n {\n onclick: ctrl.logout.bind(ctrl)\n },\n gettext(\"Logout\")\n )\n ]);\n }\n };\n\n Misago.addService('component:navbar:desktop:user-menu', function(_) {\n _.component('navbar:desktop:user-menu', menu);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n function persistent(el, isInit, context) {\n context.retain = true;\n }\n\n var alert = {\n classes: {\n 'info': 'alert-info',\n 'success': 'alert-success',\n 'warning': 'alert-warning',\n 'error': 'alert-danger'\n },\n view: function(ctrl, _) {\n return m(\n '.alerts',\n {\n config: persistent,\n class: _.alert.isVisible ? 'in' : 'out'\n },\n m('p.alert',\n {\n class: this.classes[_.alert.type]\n },\n _.alert.message\n )\n );\n }\n };\n\n Misago.addService('component:alert', function(_) {\n _.component('alert', alert);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var button = {\n view: function(ctrl, kwargs) {\n var options = {\n disabled: kwargs.disabled || kwargs.loading || false,\n config: kwargs.config || null,\n loading: kwargs.loading || false,\n type: kwargs.submit ? 'submit' : 'button',\n onclick: kwargs.onclick || null\n };\n\n var element = 'button[type=\"' + options.type + '\"].btn';\n if (options.loading) {\n element += '.btn-loading';\n }\n\n if (kwargs.id) {\n element += '#' + kwargs.id;\n }\n\n element += (kwargs.class || '');\n\n var label = kwargs.label;\n if (options.loading) {\n label = [\n label,\n m('.loader-compact', [\n m('.bounce1'),\n m('.bounce2'),\n m('.bounce3')\n ])\n ];\n }\n\n return m(element, options, label);\n },\n };\n\n Misago.addService('component:button', function(_) {\n _.component('button', button);\n },\n {\n after: 'components'\n });\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var persistent = function(el, isInit, context) {\n context.retain = true;\n };\n\n var forumLayout = {\n view: function(ctrl, _) {\n return [\n _.component('alert'),\n _.component('navbar'),\n m('#router-fixture', {config: persistent}),\n _.component('footer'),\n _.component('modal')\n ];\n }\n };\n\n Misago.addService('component:layout', function(_) {\n _.component('forum-layout', forumLayout);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var loader = {\n view: function() {\n return m('.loader.sk-folding-cube', [\n m('.sk-cube1.sk-cube'),\n m('.sk-cube2.sk-cube'),\n m('.sk-cube4.sk-cube'),\n m('.sk-cube3.sk-cube')\n ]);\n }\n };\n\n Misago.addService('component:loader', function(_) {\n _.component('loader', loader);\n },\n {\n after: 'components'\n });\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var persistent = function(el, isInit, context) {\n context.retain = true;\n };\n\n var markup = {\n view: function(ctrl, content) {\n return m('article.misago-markup', {config: persistent},\n m.trust(content)\n );\n }\n };\n\n Misago.addService('component:markup', function(_) {\n _.component('markup', markup);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n function persistent(el, isInit, context) {\n context.retain = true;\n }\n\n var modal = {\n view: function() {\n return m(\n '#misago-modal.modal.fade[role=\"dialog\"]',\n {\n config: persistent,\n tabindex: \"-1\",\n \"aria-labelledby\": \"misago-modal-label\"\n }\n );\n }\n };\n\n Misago.addService('component:modal', function(_) {\n _.component('modal', modal);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var header = {\n view: function(ctrl, options) {\n return m('.page-header',\n m('.container', [\n m('h1', options.title),\n ])\n );\n }\n };\n\n Misago.addService('component:header', function(_) {\n _.component('header', header);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago, UrlConf) {\n 'use strict';\n\n var urls = new UrlConf();\n urls.url('/', 'index');\n\n // Legal pages\n urls.url(\n '/terms-of-service/',\n 'terms_of_service');\n\n urls.url(\n '/privacy-policy/',\n 'privacy_policy');\n\n // Catch-all 404 not found route\n urls.url('/:rest...', 'error:404', 'not_found');\n\n Misago.urls = urls;\n} (Misago.prototype, Misago.prototype.UrlConf));\n"],"sourceRoot":"/source/"}
|