|
-{"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","NoCaptcha","load","QACaptcha","question","prop","validation","label","helpText","help_text","ReCaptcha","Captcha","types","no","qa","re","captcha","settings","captcha_type","_components","argumentsArray","mount","getElementById","script","remote","STATIC_URL","cache","Modal","delegateName","on","hide","off","removeClass","remove","modal","open","_modal","_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","boilerplate","_hasRouteBoilerplate","loadingView","container","_routes","RunLoop","_intervals","stopInterval","clearTimeout","run","callable","delay","setTimeout","result","stop","loop","ticks","PageTitle","forum_name","title","_set_complex","completeTitle","page","page_label","interpolate","parent","validators","required","trim","validate","ctrl","errors","validator","getOwnPropertyNames","Zxcvbn","included","scorePassword","password","inputs","zxcvbn","score","wait","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","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","submit","credentials","$form","find","val","onsubmit","navbar","style","brand","children","src","alt","showSignIn","isBusy","showRegister","account_activation","sync","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 NoCaptcha = function() {\n var deferred = m.deferred();\n deferred.resolve();\n\n this.load = function() {\n return deferred.promise;\n };\n\n this.component = function() {\n return null;\n };\n\n this.value = function() {\n return 'pass';\n };\n };\n\n var QACaptcha = function(_) {\n this.loading = false;\n this.question = null;\n this.value = m.prop('');\n\n var deferred = m.deferred();\n this.load = function() {\n this.value('');\n\n if (!this.question && !this.loading) {\n this.loading = true;\n\n var self = this;\n _.api.endpoint('captcha-question').get().then(function(question) {\n self.question = question;\n deferred.resolve();\n }, function() {\n _.api.alert(gettext('Failed to load CAPTCHA.'));\n deferred.reject();\n }).then(function() {\n self.loading = true;\n });\n }\n\n return deferred.promise;\n };\n\n this.component = function(validation) {\n return _.component('form:row', {\n label: this.question.question,\n helpText: this.question.help_text,\n validation: validation\n });\n };\n };\n\n var ReCaptcha = function(_) {\n this.loading = false;\n this.question = null;\n\n var deferred = m.deferred();\n this.load = function() {\n return deferred.promise;\n };\n\n this.component = function() {\n return 'null';\n };\n\n this.value = function() {\n return 'pass';\n };\n };\n\n var Captcha = function(_) {\n var types = {\n 'no': NoCaptcha,\n 'qa': QACaptcha,\n 're': ReCaptcha\n };\n\n var captcha = new types[_.settings.captcha_type](_);\n\n this.load = function() {\n return captcha.load();\n };\n\n this.component = function() {\n return captcha.component();\n };\n\n this.value = function() {\n return captcha.value();\n };\n };\n\n Misago.addService('captcha', function(_) {\n return new Captcha(_);\n },\n {\n after: 'include'\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 include = function(script, remote) {\n if (!remote) {\n script = this.context.STATIC_URL + script;\n }\n\n $.ajax({\n url: script,\n cache: true,\n dataType: 'script'\n });\n };\n\n Misago.addService('include', function(_) {\n _.include = include;\n },\n {\n after: 'conf'\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 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] = 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 result = Misago.validators.required()(value);\n if (result) {\n errors[key] = [result];\n } else {\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\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/* global zxcvbn */\n(function (Misago) {\n 'use strict';\n\n var Zxcvbn = function(_) {\n this.included = false;\n\n this.scorePassword = function(password, inputs) {\n // 0-4 score, the more the stronger password\n return zxcvbn(password, inputs).score;\n };\n\n // loading\n this.include = function() {\n _.include('misago/js/zxcvbn.js');\n this.included = true;\n };\n\n var wait = function(promise) {\n if (typeof zxcvbn !== \"undefined\") {\n promise.resolve();\n } else {\n _.runloop.runOnce(function() {\n wait(promise);\n }, 'loading-zxcvbn', 150);\n }\n };\n\n var deferred = m.deferred();\n this.load = function() {\n if (!this.included) {\n this.include();\n }\n wait(deferred);\n return deferred.promise;\n };\n };\n\n Misago.addService('zxcvbn', function(_) {\n return new Zxcvbn(_);\n },\n {\n after: 'include'\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.page-error.page-error-' + error.code,\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.page-error.page-error-banned',\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.page-legal.page-legal-' + dashedTypeName, [\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-register[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': [],\n 'password': []\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\n isBusy: false,\n showRegister: function() {\n if (_.settings.account_activation === 'closed') {\n _.alert.info(gettext(\"New registrations are currently disabled.\"));\n } else {\n m.startComputation();\n this.isBusy = true;\n m.endComputation();\n\n var self = this;\n m.sync([\n _.zxcvbn.load(),\n _.captcha.load()\n ]).then(function() {\n _.alert.success('loaded shizz for registration!');\n }, function() {\n _.alert.error(gettext('Registation is not available now due to an error.'));\n }).then(function() {\n m.startComputation();\n self.isBusy = false;\n m.endComputation();\n });\n }\n }\n };\n },\n view: function(ctrl, _) {\n return m('div.nav.nav-guest', [\n _.component('button', {\n class: '.navbar-btn.btn-default',\n onclick: ctrl.showSignIn,\n disabled: ctrl.isBusy,\n label: gettext('Sign in')\n }),\n _.component('button', {\n class: '.navbar-btn.btn-primary',\n onclick: ctrl.showRegister.bind(ctrl),\n loading: ctrl.isBusy,\n label: 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/"}
|
|
|
|
|
|
+{"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","persistent","el","isInit","retain","input","kwargs","options","disabled","config","placeholder","autocomplete","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","displayTime","runloop","runOnce","startComputation","endComputation","set","stop","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","NoCaptcha","load","validator","QACaptcha","question","prop","label","labelClass","controlClass","control","validate","form","isBusy","validation","errors","validationKey","helpText","help_text","ReCaptcha","Captcha","types","no","qa","re","captcha","settings","captcha_type","_components","argumentsArray","boilerplate","_submit","submit","_success","_error","clean","hasErrors","constructor","_forms","mount","getElementById","script","remote","STATIC_URL","cache","Modal","delegateName","on","hide","off","removeClass","remove","modal","open","_modal","_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","loop","ticks","PageTitle","forum_name","title","_set_complex","completeTitle","page","page_label","interpolate","parent","EMAIL","USERNAME","validators","required","trim","email","minLength","limit_value","returnMessage","ngettext","show_value","maxLength","usernameMinLength","username_length_min","usernameMaxLength","username_length_max","usernameContent","passwordMinLenght","password_length_min","validateField","validateForm","isValid","Zxcvbn","included","scorePassword","password","inputs","zxcvbn","score","wait","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","ctrl","trust","expirationMessage","isAfter","fromNow","forum_index_title","count","increment","console","log","styles","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","register","footnote","termsUrl","terms","onsubmit","style","signin","navbar","brand","children","src","alt","showSignIn","showRegister","account_activation","sync","onclick","forum_branding_display","forum_branding_text","logout","button","textFields","formGroup","groupClass","controlType","attrs","controlId","feedbackId","feedbackIcon","showFeedbackIcon","isValidated","String","for","labelFor","forumLayout","loader","markup","content","tabindex","aria-labelledby","labels","passwordStrength","role","aria-valuenow","aria-valuemin","aria-valuemax","Register","showActivation","extend","SignIn","$form","find","val"],"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 function persistent(el, isInit, context) {\n context.retain = true;\n }\n\n Misago.input = function(kwargs) {\n var options = {\n disabled: kwargs.disabled || false,\n config: kwargs.config || persistent\n };\n\n if (kwargs.placeholder) {\n options.placeholder = kwargs.placeholder;\n }\n\n if (kwargs.autocomplete === false) {\n options.autocomplete = 'off';\n }\n\n var element = 'input';\n\n if (kwargs.id) {\n element += '#' + kwargs.id;\n options.key = 'field-' + 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.type = 'info';\n this.message = null;\n this.isVisible = false;\n\n var show = function(type, message) {\n self.type = type;\n self.message = message;\n self.isVisible = true;\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 _.runloop.runOnce(function () {\n m.startComputation();\n self.isVisible = false;\n m.endComputation();\n }, 'flash-message-hide', displayTime);\n };\n\n var set = function(type, message) {\n _.runloop.stop('flash-message-hide');\n _.runloop.stop('flash-message-show');\n\n if (self.isVisible) {\n self.isVisible = false;\n _.runloop.runOnce(function () {\n m.startComputation();\n show(type, message);\n m.endComputation();\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 NoCaptcha = function() {\n var deferred = m.deferred();\n deferred.resolve();\n\n this.load = function() {\n return deferred.promise;\n };\n\n this.component = function() {\n return null;\n };\n\n this.value = function() {\n return null;\n };\n\n this.validator = function() {\n return null;\n };\n };\n\n var QACaptcha = function(_) {\n var self = this;\n\n this.loading = false;\n this.question = null;\n this.value = m.prop('');\n\n var deferred = m.deferred();\n this.load = function() {\n this.value('');\n\n if (!this.question && !this.loading) {\n this.loading = true;\n\n _.api.endpoint('captcha-question').get().then(function(question) {\n self.question = question;\n deferred.resolve();\n }, function() {\n _.api.alert(gettext('Failed to load CAPTCHA.'));\n deferred.reject();\n }).then(function() {\n self.loading = true;\n });\n }\n\n return deferred.promise;\n };\n\n this.component = function(kwargs) {\n return _.component('form-group', {\n label: this.question.question,\n labelClass: kwargs.labelClass || null,\n controlClass: kwargs.controlClass || null,\n control: _.input({\n value: _.validate(kwargs.form, 'captcha'),\n id: 'id_captcha',\n disabled: kwargs.form.isBusy\n }),\n validation: kwargs.form.errors,\n validationKey: 'captcha',\n helpText: this.question.help_text\n });\n };\n\n this.validator = function() {\n return [];\n };\n };\n\n var ReCaptcha = function() {\n this.loading = false;\n this.question = null;\n\n var deferred = m.deferred();\n this.load = function() {\n return deferred.promise;\n };\n\n this.component = function() {\n return 'null';\n };\n\n this.value = function() {\n return 'pass';\n };\n\n this.validator = function() {\n return [];\n };\n };\n\n var Captcha = function(_) {\n var types = {\n 'no': NoCaptcha,\n 'qa': QACaptcha,\n 're': ReCaptcha\n };\n\n var captcha = new types[_.settings.captcha_type](_);\n\n this.load = function() {\n return captcha.load();\n };\n\n this.component = function(kwargs) {\n return captcha.component(kwargs);\n };\n\n this.value = function() {\n return captcha.value();\n };\n\n this.validator = function() {\n return captcha.validator();\n };\n };\n\n Misago.addService('captcha', function(_) {\n return new Captcha(_);\n },\n {\n after: 'include'\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 var boilerplate = function(form) {\n var _submit = form.submit;\n var _success = form.success;\n var _error = form.error;\n\n form.isBusy = false;\n\n form.errors = null;\n\n form.submit = function() {\n if (form.isBusy) {\n return false;\n }\n\n if (form.clean) {\n if (form.clean()) {\n form.isBusy = true;\n _submit.apply(form);\n }\n } else {\n form.isBusy = true;\n }\n return false;\n };\n\n form.success = function() {\n m.startComputation();\n\n _success.apply(form, arguments);\n form.isBusy = false;\n\n m.endComputation();\n };\n\n form.error = function() {\n m.startComputation();\n\n _error.apply(form, arguments);\n form.isBusy = false;\n\n m.endComputation();\n };\n\n form.hasErrors = function() {\n if (form.errors === null) {\n return false;\n }\n\n for (var key in form.validation) {\n if (form.validation.hasOwnProperty(key)) {\n if (form.errors[key] !== true) {\n return true;\n }\n }\n }\n\n return false;\n };\n\n return form;\n };\n\n var form = function(name, constructor) {\n if (this._forms[name]) {\n if (constructor) {\n return boilerplate(new this._forms[name](constructor, this));\n } else {\n return boilerplate(new this._forms[name](this));\n }\n } else {\n this._forms[name] = constructor;\n }\n };\n\n Misago.addService('forms', function(_) {\n _._forms = {};\n _.form = form;\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 include = function(script, remote) {\n if (!remote) {\n script = this.context.STATIC_URL + script;\n }\n\n $.ajax({\n url: script,\n cache: true,\n dataType: 'script'\n });\n };\n\n Misago.addService('include', function(_) {\n _.include = include;\n },\n {\n after: 'conf'\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 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] = 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 // Component already 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 var EMAIL = /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i;\n var USERNAME = new RegExp('^[0-9a-z]+$', 'i');\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 email: function(message) {\n return function(value) {\n if (!EMAIL.test(value)) {\n return message || gettext('Enter a valid email address.');\n }\n };\n },\n minLength: function(limit_value, message) {\n return function(value) {\n var returnMessage = '';\n var length = $.trim(value).length;\n\n if (length < limit_value) {\n if (message) {\n returnMessage = message(limit_value, length);\n } else {\n returnMessage = ngettext(\n \"Ensure this value has at least %(limit_value)d character (it has %(show_value)d).\",\n \"Ensure this value has at least %(limit_value)d characters (it has %(show_value)d).\",\n limit_value);\n }\n return interpolate(returnMessage, {\n limit_value: limit_value,\n show_value: length\n }, true);\n }\n };\n },\n maxLength: function(limit_value, message) {\n return function(value) {\n var returnMessage = '';\n var length = $.trim(value).length;\n\n if (length > limit_value) {\n if (message) {\n returnMessage = message(limit_value, length);\n } else {\n returnMessage = ngettext(\n \"Ensure this value has at most %(limit_value)d character (it has %(show_value)d).\",\n \"Ensure this value has at most %(limit_value)d characters (it has %(show_value)d).\",\n limit_value);\n }\n return interpolate(returnMessage, {\n limit_value: limit_value,\n show_value: length\n }, true);\n }\n };\n },\n usernameMinLength: function(settings) {\n var message = function(limit_value) {\n return ngettext(\n \"Username must be at least %(limit_value)s character long.\",\n \"Username must be at least %(limit_value)s characters long.\",\n limit_value);\n };\n return this.minLength(settings.username_length_min, message);\n },\n usernameMaxLength: function(settings) {\n var message = function(limit_value) {\n return ngettext(\n \"Username cannot be longer than %(limit_value)s characters.\",\n \"Username cannot be longer than %(limit_value)s characters.\",\n limit_value);\n };\n return this.maxLength(settings.username_length_max, message);\n },\n usernameContent: function() {\n return function(value) {\n if (!USERNAME.test($.trim(value))) {\n return gettext(\"Username can only contain latin alphabet letters and digits.\");\n }\n };\n },\n passwordMinLenght: function(settings) {\n var message = function(limit_value) {\n return ngettext(\n \"Valid password must be at least %(limit_value)s character long.\",\n \"Valid password must be at least %(limit_value)s characters long.\",\n limit_value);\n };\n return this.minLength(settings.password_length_min, message);\n }\n };\n\n var validateField = function(value, validators) {\n var result = Misago.validators.required()(value);\n var errors = [];\n\n if (result) {\n return [result];\n } else {\n for (var i in validators) {\n result = validators[i](value);\n\n if (result) {\n errors.push(result);\n }\n }\n }\n\n return errors.length ? errors : true;\n };\n\n var validateForm = function(form) {\n var errors = {};\n var value = null;\n\n var isValid = true;\n\n for (var key in form.validation) {\n if (form.validation.hasOwnProperty(key)) {\n value = form[key]();\n errors[key] = validateField(form[key](), form.validation[key]);\n if (errors[key] !== true) {\n isValid = false;\n }\n }\n }\n\n form.errors = errors;\n return isValid;\n };\n\n var validate = function(form, name) {\n if (name) {\n return function(value) {\n var errors = null;\n if (typeof value !== 'undefined') {\n errors = validateField(value, form.validation[name]);\n if (errors) {\n if (!form.errors) {\n form.errors = {};\n }\n form.errors[name] = errors;\n }\n form[name](value);\n return form[name](value);\n } else {\n return form[name]();\n }\n };\n } else {\n return validateForm(form);\n }\n };\n\n Misago.addService('validate', {\n factory: function() {\n return validate;\n }\n });\n}(Misago.prototype));\n\n/* global zxcvbn */\n(function (Misago) {\n 'use strict';\n\n var Zxcvbn = function(_) {\n this.included = false;\n\n this.scorePassword = function(password, inputs) {\n // 0-4 score, the more the stronger password\n return zxcvbn(password, inputs).score;\n };\n\n // loading\n this.include = function() {\n _.include('misago/js/zxcvbn.js');\n this.included = true;\n };\n\n var wait = function(promise) {\n if (typeof zxcvbn !== \"undefined\") {\n promise.resolve();\n } else {\n _.runloop.runOnce(function() {\n wait(promise);\n }, 'loading-zxcvbn', 150);\n }\n };\n\n var deferred = m.deferred();\n this.load = function() {\n if (!this.included) {\n this.include();\n }\n wait(deferred);\n return deferred.promise;\n };\n };\n\n Misago.addService('zxcvbn', function(_) {\n return new Zxcvbn(_);\n },\n {\n after: 'include'\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.page-error.page-error-' + error.code,\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.page-error.page-error-banned',\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.page-legal.page-legal-' + dashedTypeName, [\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 controller: function(_) {\n return {\n form: _.form('register')\n };\n },\n view: function(ctrl, _) {\n var captcha = _.captcha.component({\n form: ctrl.form,\n\n labelClass: '.col-md-4',\n controlClass: '.col-md-8'\n });\n\n var footnote = null;\n var termsUrl = _.settings.terms_of_service_link;\n\n if (!termsUrl && _.settings.terms_of_service) {\n termsUrl = _.router.url('terms_of_service');\n }\n\n if (termsUrl) {\n footnote = m('a', {href: termsUrl},\n m.trust(interpolate(gettext(\"By registering you agree to site's %(terms)s.\"), {\n terms: '<strong>' + gettext(\"terms and conditions\") + '</strong>'\n }, true))\n );\n }\n\n return m('.modal-dialog.modal-form.modal-register[role=\"document\"]',\n {config: persistent},\n m('.modal-content', [\n _.component('modal:header', gettext('Register')),\n m('form.form-horizontal',\n {\n onsubmit: ctrl.form.submit\n },\n [\n m('input[type=\"text\"]', {\n name:'_username',\n style: 'display: none'\n }),\n m('input[type=\"password\"]', {\n name:'_password',\n style: 'display: none'\n }),\n m('.modal-body', [\n _.component('form-group', {\n label: gettext(\"Username\"),\n labelClass: '.col-md-4',\n controlClass: '.col-md-8',\n control: _.input({\n value: _.validate(ctrl.form, 'username'),\n id: 'id_username',\n disabled: ctrl.form.isBusy\n }),\n validation: ctrl.form.errors,\n validationKey: 'username'\n }),\n _.component('form-group', {\n label: gettext(\"E-mail\"),\n labelClass: '.col-md-4',\n controlClass: '.col-md-8',\n control: _.input({\n value: _.validate(ctrl.form, 'email'),\n id: 'id_email',\n disabled: ctrl.form.isBusy\n }),\n validation: ctrl.form.errors,\n validationKey: 'email'\n }),\n _.component('form-group', {\n label: gettext(\"Password\"),\n labelClass: '.col-md-4',\n controlClass: '.col-md-8',\n control: _.input({\n value: _.validate(ctrl.form, 'password'),\n type: 'password',\n id: 'id_password',\n disabled: ctrl.form.isBusy\n }),\n validation: ctrl.form.errors,\n validationKey: 'password',\n helpText: _.component('password-strength', {\n inputs: [\n ctrl.form.username(),\n ctrl.form.email()\n ],\n password: ctrl.form.password()\n })\n }),\n captcha\n ]),\n m('.modal-footer', [\n footnote,\n _.component('button', {\n class: '.btn-primary',\n submit: true,\n loading: ctrl.form.isBusy,\n label: gettext(\"Register account\")\n })\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 form: _.form('sign-in')\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: ctrl.form.submit}, [\n m('.modal-body', [\n m('.form-group',\n m('.control-input',\n Misago.input({\n disabled: ctrl.form.isBusy,\n value: ctrl.form.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.form.isBusy,\n value: ctrl.form.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.form.isBusy,\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\n isBusy: false,\n showRegister: function() {\n if (_.settings.account_activation === 'closed') {\n _.alert.info(gettext(\"New registrations are currently disabled.\"));\n } else {\n m.startComputation();\n this.isBusy = true;\n m.endComputation();\n\n var self = this;\n m.sync([\n _.zxcvbn.load(),\n _.captcha.load()\n ]).then(function() {\n _.modal('register');\n }, function() {\n _.alert.error(gettext('Registation is not available now due to an error.'));\n }).then(function() {\n m.startComputation();\n self.isBusy = false;\n m.endComputation();\n });\n }\n }\n };\n },\n view: function(ctrl, _) {\n return m('div.nav.nav-guest', [\n _.component('button', {\n class: '.navbar-btn.btn-default',\n onclick: ctrl.showSignIn,\n disabled: ctrl.isBusy,\n label: gettext('Sign in')\n }),\n _.component('button', {\n class: '.navbar-btn.btn-primary',\n onclick: ctrl.showRegister.bind(ctrl),\n loading: ctrl.isBusy,\n label: 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 textFields = ['text', 'password', 'email'];\n\n var formGroup = {\n view: function(ctrl, kwargs) {\n var groupClass = '.form-group';\n var errors = null;\n var helpText = null;\n\n var controlType = kwargs.control.attrs.type;\n var controlId = kwargs.control.attrs.id;\n\n var feedbackId = controlId + '_feedback';\n var feedbackIcon = null;\n var showFeedbackIcon = null;\n\n var isValidated = kwargs.validationKey && kwargs.validation !== null;\n\n kwargs.control.attrs['aria-describedby'] = '';\n\n if (isValidated && kwargs.validation[kwargs.validationKey]) {\n showFeedbackIcon = textFields.indexOf(controlType) >= 0;\n kwargs.control.attrs['aria-describedby'] = feedbackId;\n\n if (kwargs.validation[kwargs.validationKey] === true) {\n groupClass += '.has-success';\n feedbackIcon = [\n m('span.material-icon.form-control-feedback',\n {\n 'aria-hidden': 'true'\n },\n 'check'\n ),\n m('span.sr-only#' + feedbackId, gettext(\"(success)\"))\n ];\n } else {\n groupClass += '.has-error';\n errors = kwargs.validation[kwargs.validationKey];\n feedbackIcon = [\n m('span.material-icon.form-control-feedback',\n {\n 'aria-hidden': 'true'\n },\n 'clear'\n ),\n m('span.sr-only#' + feedbackId, gettext(\"(error)\"))\n ];\n }\n }\n\n if (kwargs.helpText) {\n if (typeof kwargs.helpText === 'string' ||\n kwargs.helpText instanceof String) {\n helpText = m('p.help-block', kwargs.helpText);\n } else {\n helpText = kwargs.helpText;\n }\n }\n\n return m(groupClass, [\n m('label.control-label' + (kwargs.labelClass || ''),\n {\n for: kwargs.labelFor || controlId\n },\n kwargs.label + ':'\n ),\n m(kwargs.controlClass || '', [\n kwargs.control,\n showFeedbackIcon ? feedbackIcon : null,\n errors ? m('.help-block.errors', errors.map(function(item) {\n return m('p', item);\n })) : null,\n helpText\n ])\n ]);\n },\n };\n\n Misago.addService('component:form-group', function(_) {\n _.component('form-group', formGroup);\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 var persistent = function(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) {\n 'use strict';\n\n var persistent = function(el, isInit, context) {\n context.retain = true;\n };\n\n var styles = [\n 'progress-bar-danger',\n 'progress-bar-warning',\n 'progress-bar-warning',\n 'progress-bar-primary',\n 'progress-bar-success'\n ];\n\n var labels = [\n gettext('Entered password is very weak.'),\n gettext('Entered password is weak.'),\n gettext('Entered password is average.'),\n gettext('Entered password is strong.'),\n gettext('Entered password is very strong.')\n ];\n\n var passwordStrength = {\n view: function(ctrl, kwargs, _) {\n var score = _.zxcvbn.scorePassword(kwargs.password, kwargs.inputs);\n var options = {\n config: persistent,\n class: styles[score],\n style: \"width: \" + (20 + (20 * score)) + '%',\n 'role': \"progressbar\",\n 'aria-valuenow': score,\n 'aria-valuemin': \"0\",\n 'aria-valuemax': \"4\"\n };\n\n return m('.help-block.password-strength', {key: 'password-strength'}, [\n m('.progress',\n m('.progress-bar', options,\n m('span.sr-only', labels[score])\n )\n ),\n m('p.text-small', labels[score])\n ]);\n },\n };\n\n Misago.addService('component:password-strength', function(_) {\n _.component('password-strength', passwordStrength);\n },\n {\n after: 'components'\n });\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Register = function(_) {\n var self = this;\n\n this.showActivation = false;\n\n this.username = m.prop('');\n this.email = m.prop('');\n this.password = m.prop('');\n this.captcha = _.captcha.value;\n\n this.errors = null;\n\n this.validation = {\n 'username': [\n Misago.validators.usernameContent(),\n Misago.validators.usernameMinLength(_.settings),\n Misago.validators.usernameMaxLength(_.settings)\n ],\n 'email': [\n Misago.validators.email()\n ],\n 'password': [\n Misago.validators.passwordMinLenght(_.settings)\n ],\n 'captcha': _.captcha.validator()\n };\n\n this.clean = function() {\n if (this.errors === null) {\n _.validate(this);\n }\n\n if (this.hasErrors()) {\n _.alert.error(gettext(\"Form contains errors\"));\n return false;\n } else {\n return true;\n }\n };\n\n this.submit = function() {\n _.api.model('user').post({\n username: this.username(),\n email: this.email(),\n password: this.password(),\n captcha: this.captcha()\n }).then(this.success, this.error);\n };\n\n this.success = function(data) {\n console.log(data);\n };\n\n this.error = function(rejection) {\n if (rejection.status === 400) {\n if (rejection.code === 'banned') {\n _.modal();\n _.router.error403({\n message: '',\n ban: rejection.detail\n });\n } else {\n _.alert.error(gettext(\"Form contains errors\"));\n $.extend(self.errors, rejection);\n }\n } else {\n _.api.alert(rejection);\n }\n };\n };\n\n Misago.addService('form:register', function(_) {\n _.form('register', Register);\n },\n {\n after: 'forms'\n });\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var SignIn = function(_) {\n var self = this;\n\n this.showActivation = false;\n\n this.username = m.prop('');\n this.password = m.prop('');\n\n this.validation = {\n 'username': [],\n 'password': []\n };\n\n this.clean = function() {\n if (!_.validate(this)) {\n _.alert.error(gettext(\"Fill out both fields.\"));\n return false;\n } else {\n return true;\n }\n };\n\n this.submit = function() {\n _.api.endpoint('auth').post({\n username: self.username(),\n password: self.password()\n }).then(function() {\n self.success();\n }, function(error) {\n self.error(error);\n });\n };\n\n this.success = function() {\n _.modal();\n\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(this.username());\n $form.find('input[name=\"password\"]').val(this.password());\n $form.submit();\n };\n\n this.error = function(rejection) {\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 self.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 };\n\n Misago.addService('form:sign-in', function(_) {\n _.form('sign-in', SignIn);\n },\n {\n after: 'forms'\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/"}
|