|
|
-{"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","PermissionDenied","message","detail","status","toString","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","errorHandler","bind","_controller","controller","apply","arguments","_onunload","onunload","e","vm","loading","loadingHandler","_view","view","isReady","_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","statusText","reject","$","preloaded","post","patch","put","ALERT_BASE_DISPLAY_TIME","ALERT_LENGTH_FACTOR","ALERT_MAX_DISPLAY_TIME","ALERT_HIDE_ANIMATION_LENGTH","Alert","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","Auth","user","deserialize","denyAuthenticated","isAuthenticated","denyAnonymous","isAnonymous","NoCaptcha","load","QACaptcha","question","prop","label","labelClass","controlClass","control","validate","form","isBusy","validation","errors","validationKey","helpText","help_text","validator","ReCaptcha","included","wait","grecaptcha","reset","controlConfig","render","sitekey","settings","recaptcha_site_key","getResponse","clean","captcha","Captcha","types","no","qa","re","captcha_type","_components","argumentsArray","boilerplate","_submit","submit","_success","_error","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","target","href","preventDefault","prefixUrl","error403","ban","error404","error500","error0","errorPage","router","_hasRouteBoilerplate","loadingView","container","onerror","_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","passwordMinLength","password_length_min","validateField","validateForm","isValid","Zxcvbn","scorePassword","password","inputs","zxcvbn","score","Ban","html","plain","expires_on","deserializeBan","class","LegalPage","body","link","User","slug","username","acl","rank","deserializeUser","joined_on","viewModel","param","activateByToken","auth","ctrl","rejected","error_message","help","code","icon","errorBanned","trust","expirationMessage","isAfter","fromNow","forum_index_title","activation","legalPageFactory","typeName","defaultTitle","dashedTypeName","formOptions","requestActivation","completed","onclick","isMenuVisible","forum_footnote","terms_of_service","terms_of_service_link","privacy_policy","privacy_policy_link","footer","nav","legalLink","legalType","menu","branding","onsubmit","header","data-dismiss","aria-label","aria-hidden","refresh","reload","registerComplete","messageHtml","active","inactive","lead","register","footnote","termsUrl","terms","style","signin","activateButton","showActivation","navbar","brand","children","src","alt","showSignIn","showRegister","account_activation","sync","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","styles","labels","passwordStrength","role","aria-valuenow","aria-valuemin","aria-valuemax","Register","extend","RequestLink","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 // 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 // Exceptions\n proto.PermissionDenied = function(message) {\n this.detail = message;\n this.status = 403;\n\n this.toString = function() {\n return this.detail || 'Permission denied';\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 var errorHandler = errorState.bind(component);\n\n // Wrap controller to store lifecycle methods\n var _controller = component.controller || noop;\n component.controller = function() {\n try {\n component.isActive = true;\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 } catch (e) {\n errorHandler(e);\n }\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 // 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.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 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 // Access controls\n this.denyAuthenticated = function(message) {\n if (_.user.isAuthenticated) {\n throw new Misago.PermissionDenied(\n message || gettext(\"This page is not available to signed in users.\"));\n }\n };\n\n this.denyAnonymous = function(message) {\n if (_.user.isAnonymous) {\n throw new Misago.PermissionDenied(\n message || gettext(\"This page is not available to guests.\"));\n }\n };\n };\n\n Misago.addService('auth', function(_) {\n return new Auth(_);\n },\n {\n after: 'model:user'\n });\n}(Misago.prototype));\n\n/* global grecaptcha */\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.value = 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.included = false;\n this.question = null;\n\n var deferred = m.deferred();\n\n var wait = function(promise) {\n if (typeof grecaptcha !== \"undefined\") {\n promise.resolve();\n } else {\n _.runloop.runOnce(function() {\n wait(promise);\n }, 'loading-grecaptcha', 150);\n }\n };\n\n this.load = function() {\n if (typeof grecaptcha !== \"undefined\") {\n grecaptcha.reset();\n }\n\n if (!this.included) {\n _.include('https://www.google.com/recaptcha/api.js', true);\n this.included = true;\n }\n\n wait(deferred);\n\n return deferred.promise;\n };\n\n var controlConfig = function(el, isInit, context) {\n context.retain = true;\n\n if (!isInit) {\n grecaptcha.render('recaptcha', {\n 'sitekey': _.settings.recaptcha_site_key\n });\n }\n };\n\n this.component = function(kwargs) {\n var control = m('#recaptcha', {\n config: controlConfig\n });\n\n return _.component('form-group', {\n label: gettext(\"Security test\"),\n labelClass: kwargs.labelClass || null,\n controlClass: kwargs.controlClass || null,\n control: control,\n validation: kwargs.form.errors,\n validationKey: 'captcha'\n });\n };\n\n this.value = function() {\n if (typeof grecaptcha !== \"undefined\") {\n return grecaptcha.getResponse();\n } else {\n return '';\n }\n };\n\n this.clean = function(form) {\n if (!this.value()) {\n form.errors.captcha = [\n gettext('This field is required.')\n ];\n } else {\n form.errors.captcha = true;\n }\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.value = captcha.value;\n\n this.load = function() {\n return captcha.load();\n };\n\n this.component = function(kwargs) {\n if (captcha.component) {\n return captcha.component(kwargs);\n } else {\n return null;\n }\n };\n\n this.validator = function() {\n if (captcha.validator) {\n return captcha.validator();\n } else {\n return null;\n }\n };\n\n this.clean = function(form) {\n if (captcha.clean) {\n captcha.clean(form);\n } else {\n form.errors.captcha = true;\n }\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 if (component) {\n this._components[name] = component;\n } else {\n throw '\"' + name + '\" component is not registered and can\\'t be created';\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\n m.route(fixture, '/', this.urls);\n };\n\n this.url = function(name) {\n return this.reverses[name];\n };\n\n this.route = function(url) {\n m.route(url);\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 self.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 && error.status) {\n if (this.vm && this.vm.onerror) {\n this.vm.onerror(error, this.container);\n } else {\n this.container.router.errorPage(error);\n }\n } else {\n throw 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 if (component) {\n component.container = _;\n this._routes[name] = boilerplate(component);\n } else {\n throw '\"' + name + '\" route is not registered and can\\'t be created';\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 = /^(([^<>()[\\]\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{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)s character (it has %(show_value)s).\",\n \"Ensure this value has at least %(limit_value)s characters (it has %(show_value)s).\",\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)s character (it has %(show_value)s).\",\n \"Ensure this value has at most %(limit_value)s characters (it has %(show_value)s).\",\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 character.\",\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 passwordMinLength: 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 viewModel = {\n error: null,\n username: null,\n isReady: false,\n init: function(_) {\n this.error = null;\n this.user = null;\n this.isReady = false;\n\n var endpoint = _.api.endpoint('auth').endpoint('activate-account');\n endpoint = endpoint.endpoint(m.route.param('user_id'));\n endpoint = endpoint.endpoint(m.route.param('token'));\n\n return endpoint.post();\n },\n ondata: function(data, _) {\n m.startComputation();\n\n _.title.set(gettext(\"Account activated\"));\n\n this.username = data.username;\n this.isReady = true;\n\n m.endComputation();\n },\n onerror: function(error, _) {\n if (error.status === 400) {\n m.startComputation();\n\n this.error = error;\n this.isReady = true;\n\n m.endComputation();\n } else {\n _.router.errorPage(error);\n }\n }\n };\n\n var activateByToken = {\n controller: function(_) {\n _.auth.denyAuthenticated(\n gettext(\"You have to be signed out to activate account.\"));\n\n _.title.set(gettext(\"Account activation\"));\n this.vm.init(_);\n },\n vm: viewModel,\n view: function(ctrl, _) {\n if (this.vm.error) {\n return this.rejected(this.vm.error, _);\n } else {\n return this.success(this.vm.username, _);\n }\n },\n success: function(username) {\n var message = gettext('%(username)s, your account has been successfully activated!');\n\n return m('.page.page-message.page-message-success',\n m('.container',\n m('.message-panel', [\n m('.message-icon',\n m('span.material-icon', 'check')\n ),\n m('.message-body', [\n m('p.lead',\n interpolate(message, {\n username: username\n }, true)\n ),\n m('p',\n gettext('You can now sign in to finish setting up your account and to participate in or start new discussions.')\n )\n ])\n ])\n )\n );\n },\n rejected: function(error) {\n return m('.page.page-message.page-message-info',\n m('.container',\n m('.message-panel', [\n m('.message-icon',\n m('span.material-icon', 'info_outline')\n ),\n m('.message-body', [\n m('p.lead',\n gettext(\"Your account can't be activated at this time.\")\n ),\n m('p',\n error.detail\n )\n ])\n ])\n )\n );\n },\n loading: function(ctrl, _) {\n return m('.page.page-loading', [\n _.component('loader'),\n m('p.lead', gettext(\"Activating account...\"))\n ]);\n }\n };\n\n Misago.addService('route:activate-by-token', function(_) {\n _.route('activate-by-token', activateByToken);\n },\n {\n after: 'routes'\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('.message-panel', [\n m('.message-icon',\n m('span.material-icon', error.icon)\n ),\n m('.message-body', 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('.message-panel', [\n m('.message-icon',\n m('span.material-icon', 'highlight_off')\n ),\n m('.message-body', 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 document.title = _.settings.forum_index_title || _.settings.forum_name;\n\n return {\n activation: function() {\n _.router.url('request_activation');\n }\n };\n },\n view: function(ctrl, _) {\n return m('.container', [\n m('h1', 'Activation'),\n m('p', 'Test auth blocks'),\n m('p',\n m('a', {href: _.router.url('request_activation')},\n 'Request activation.'\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 formOptions = {\n endpoint: 'send-activation',\n user: null,\n\n success: function(user) {\n this.user = user;\n },\n error: function(rejection, _) {\n if (rejection.code === 'already_active') {\n _.alert.info(rejection.detail);\n _.modal('sign-in');\n } else if (rejection.code === 'inactive_admin') {\n _.alert.info(rejection.detail);\n } else {\n _.alert.error(rejection.detail);\n }\n },\n reset: function() {\n this.user = null;\n }\n };\n\n var requestActivation = {\n controller: function(_) {\n _.auth.denyAuthenticated(\n gettext(\"You have to be signed out to activate account.\"));\n\n _.title.set(gettext(\"Activate your account\"));\n\n return {\n form: _.form('request-link', formOptions)\n };\n },\n view: function(ctrl, _) {\n if (formOptions.user) {\n return this.completed(ctrl.form, formOptions, _);\n } else {\n return this.form(ctrl.form, _);\n }\n },\n completed: function(form, formOptions, _) {\n var message = gettext(\"%(username)s, we have sent your activation link to %(email)s.\");\n\n return m('.page.page-message.page-message-success',\n m('.container',\n m('.message-panel', [\n m('.message-icon',\n m('span.material-icon', 'check')\n ),\n m('.message-body', [\n m('p.lead',\n gettext(\"Activation link has been sent.\")\n ),\n m('p',\n interpolate(message, {\n username: formOptions.user.username,\n email: formOptions.user.email\n }, true)\n ),\n m('p',\n _.component('button', {\n class: '.btn-default',\n submit: false,\n label: gettext(\"Request another link\"),\n onclick: form.reset.bind(form)\n })\n )\n ])\n ])\n )\n );\n },\n form: function(form, _) {\n return m('.page.page-request-activation', [\n _.component('header', {\n title: gettext(\"Request activation link\")\n }),\n m('.container',\n m('.row', [\n m('.col-md-8', [\n m('p',\n gettext(\"Site administrator may impose requirement on newly regitered accounts to be activated before users will be able to sign in.\")\n ),\n m('p',\n gettext(\"Depending on time of registration, you will be able activate your account by clicking special activation link. This link will be valid only for your browser, for seven days or until your account is activated.\")\n ),\n m('p',\n gettext(\"To receive this link, enter your account's e-mail addres in form and press \\\"Send link\\\" button.\")\n )\n ]),\n m('.col-md-4',\n _.component('request-link-form', form)\n )\n ])\n )\n ]);\n }\n };\n\n Misago.addService('route:request-activation', function(_) {\n _.route('request-activation', requestActivation);\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 form = {\n view: function(ctrl, form, _) {\n return m('.well.well-form',\n m('form', {onsubmit: form.submit}, [\n m('.form-group',\n m('.control-input',\n Misago.input({\n disabled: form.isBusy,\n value: form.email,\n placeholder: gettext(\"Your e-mail address\")\n })\n )\n ),\n _.component('button', {\n class: '.btn-primary.btn-block',\n submit: true,\n loading: form.isBusy,\n label: gettext(\"Send link\")\n })\n ])\n );\n }\n };\n\n Misago.addService('component:request-link-form', function(_) {\n _.component('request-link-form', form);\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 var persistent = function(el, isInit, context) {\n context.retain = true;\n };\n\n var refresh = function() {\n document.location.reload();\n };\n\n var registerComplete = {\n controller: function(message, _) {\n if (message.activation === 'active') {\n _.runloop.runOnce(\n refresh, 'refresh-after-registration', 10000);\n }\n },\n view: function(ctrl, message, _) {\n var messageHtml = null;\n\n if (message.activation === 'active') {\n messageHtml = this.active(message);\n } else {\n messageHtml = this.inactive(message);\n }\n\n return m('.modal-dialog.modal-message.modal-register[role=\"document\"]',\n {config: persistent},\n m('.modal-content', [\n _.component('modal:header', gettext('Registration complete')),\n m('.modal-body',\n messageHtml\n )\n ])\n );\n },\n active: function(message) {\n var lead = gettext(\"%(username)s, your account has been created and you were signed in.\");\n return [\n m('.message-icon',\n m('span.material-icon', 'check')\n ),\n m('.message-body', [\n m('p.lead',\n interpolate(lead, {'username': message.username}, true)\n ),\n m('p',\n gettext('The page will refresh automatically in 10 seconds.')\n ),\n m('p',\n m('button[type=\"button\"].btn.btn-default', {onclick: refresh},\n gettext('Refresh page')\n )\n )\n ])\n ];\n },\n inactive: function(message) {\n var lead = null;\n var help = null;\n\n if (message.activation === 'user') {\n lead = gettext(\"%(username)s, your account has been created but you need to activate it before you will be able to sign in.\");\n help = gettext(\"We have sent an e-mail to %(email)s with link that you have to click to activate your account.\");\n } else if (message.activation === 'admin') {\n lead = gettext(\"%(username)s, your account has been created but board administrator will have to activate it before you will be able to sign in.\");\n help = gettext(\"We will send an e-mail to %(email)s when this takes place.\");\n }\n\n return [\n m('.message-icon',\n m('span.material-icon', 'info_outline')\n ),\n m('.message-body', [\n m('p.lead',\n interpolate(lead, {'username': message.username}, true)\n ),\n m('p',\n interpolate(help, {'email': message.email}, true)\n )\n ])\n ];\n }\n };\n\n Misago.addService('modal:register-complete', function(_) {\n _.modal('register-complete', registerComplete);\n },\n {\n after: 'modals'\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 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 var activateButton = null;\n\n if (ctrl.form.showActivation) {\n activateButton = m('a.btn.btn-block.btn-success',\n {href: _.router.url('request_activation')},\n gettext('Activate account')\n );\n }\n\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 activateButton,\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\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.passwordMinLength(_.settings)\n ],\n 'captcha': _.captcha.validator()\n };\n\n this.clean = function() {\n if (this.errors === null) {\n _.validate(this);\n }\n\n _.captcha.clean(this);\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 _.modal('register-complete', data);\n };\n\n this.error = function(rejection) {\n if (rejection.status === 400) {\n _.alert.error(gettext(\"Form contains errors.\"));\n $.extend(self.errors, rejection);\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 RequestLink = function(options, _) {\n var self = this;\n\n this.email = m.prop('');\n\n this.validation = {\n 'email': [\n Misago.validators.email()\n ]\n };\n\n this.clean = function() {\n if (!_.validate(this)) {\n _.alert.error(gettext(\"Enter a valid email address.\"));\n return false;\n } else {\n return true;\n }\n };\n\n this.submit = function() {\n _.api.endpoint('auth').endpoint(options.endpoint).post({\n email: self.email()\n }).then(function(user) {\n self.success(user);\n }, function(error) {\n self.error(error);\n });\n };\n\n this.success = function(user) {\n options.success(user);\n };\n\n this.error = function(rejection) {\n if (rejection.status === 400) {\n if (rejection.code === 'banned') {\n _.router.error403({\n message: '',\n ban: rejection.detail\n });\n } else {\n options.error(rejection, _);\n }\n } else {\n _.api.alert(rejection);\n }\n };\n\n this.reset = function() {\n this.email('');\n options.reset();\n };\n };\n\n Misago.addService('form:request-link', function(_) {\n _.form('request-link', RequestLink);\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\n // Board index\n urls.url('/', 'index');\n\n // Account activation\n urls.url('/activation/', 'request_activation');\n urls.url('/activation/:user_id/:token/', 'activate_by_token');\n\n // Legal pages\n urls.url('/terms-of-service/', 'terms_of_service');\n urls.url('/privacy-policy/', '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","PermissionDenied","message","detail","status","toString","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","errorHandler","bind","_controller","controller","apply","arguments","_onunload","onunload","e","vm","loading","loadingHandler","_view","view","isReady","_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","statusText","reject","$","preloaded","post","patch","put","ALERT_BASE_DISPLAY_TIME","ALERT_LENGTH_FACTOR","ALERT_MAX_DISPLAY_TIME","ALERT_HIDE_ANIMATION_LENGTH","Alert","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","Auth","user","deserialize","denyAuthenticated","isAuthenticated","denyAnonymous","isAnonymous","NoCaptcha","load","QACaptcha","question","prop","label","labelClass","controlClass","control","validate","form","isBusy","validation","errors","validationKey","helpText","help_text","validator","ReCaptcha","included","wait","grecaptcha","reset","controlConfig","render","sitekey","settings","recaptcha_site_key","getResponse","clean","captcha","Captcha","types","no","qa","re","captcha_type","_components","argumentsArray","boilerplate","_submit","submit","_success","_error","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","target","href","preventDefault","prefixUrl","error403","ban","error404","error500","error0","errorPage","router","_hasRouteBoilerplate","loadingView","container","onerror","_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","passwordMinLength","password_length_min","validateField","validateForm","isValid","Zxcvbn","scorePassword","password","inputs","zxcvbn","score","Ban","html","plain","expires_on","deserializeBan","class","LegalPage","body","link","User","slug","username","acl","rank","deserializeUser","joined_on","viewModel","param","activateByToken","auth","ctrl","rejected","error_message","help","code","icon","errorBanned","trust","expirationMessage","isAfter","fromNow","forum_index_title","activation","legalPageFactory","typeName","defaultTitle","dashedTypeName","formOptions","requestActivation","completed","onclick","isMenuVisible","forum_footnote","terms_of_service","terms_of_service_link","privacy_policy","privacy_policy_link","footer","nav","legalLink","legalType","menu","branding","onsubmit","header","data-dismiss","aria-label","aria-hidden","refresh","reload","registerComplete","messageHtml","active","inactive","lead","register","footnote","termsUrl","terms","style","signin","activateButton","showActivation","navbar","brand","children","src","alt","showSignIn","showRegister","account_activation","sync","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","styles","labels","passwordStrength","role","aria-valuenow","aria-valuemin","aria-valuemax","Register","extend","RequestLink","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 // 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 // Exceptions\n proto.PermissionDenied = function(message) {\n this.detail = message;\n this.status = 403;\n\n this.toString = function() {\n return this.detail || 'Permission denied';\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 var errorHandler = errorState.bind(component);\n\n // Wrap controller to store lifecycle methods\n var _controller = component.controller || noop;\n component.controller = function() {\n try {\n component.isActive = true;\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 } catch (e) {\n errorHandler(e);\n }\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 // 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 = '';\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.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 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 // Access controls\n this.denyAuthenticated = function(message) {\n if (_.user.isAuthenticated) {\n throw new Misago.PermissionDenied(\n message || gettext(\"This page is not available to signed in users.\"));\n }\n };\n\n this.denyAnonymous = function(message) {\n if (_.user.isAnonymous) {\n throw new Misago.PermissionDenied(\n message || gettext(\"This page is not available to guests.\"));\n }\n };\n };\n\n Misago.addService('auth', function(_) {\n return new Auth(_);\n },\n {\n after: 'model:user'\n });\n}(Misago.prototype));\n\n/* global grecaptcha */\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.value = 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.included = false;\n this.question = null;\n\n var deferred = m.deferred();\n\n var wait = function(promise) {\n if (typeof grecaptcha !== \"undefined\") {\n promise.resolve();\n } else {\n _.runloop.runOnce(function() {\n wait(promise);\n }, 'loading-grecaptcha', 150);\n }\n };\n\n this.load = function() {\n if (typeof grecaptcha !== \"undefined\") {\n grecaptcha.reset();\n }\n\n if (!this.included) {\n _.include('https://www.google.com/recaptcha/api.js', true);\n this.included = true;\n }\n\n wait(deferred);\n\n return deferred.promise;\n };\n\n var controlConfig = function(el, isInit, context) {\n context.retain = true;\n\n if (!isInit) {\n grecaptcha.render('recaptcha', {\n 'sitekey': _.settings.recaptcha_site_key\n });\n }\n };\n\n this.component = function(kwargs) {\n var control = m('#recaptcha', {\n config: controlConfig\n });\n\n return _.component('form-group', {\n label: gettext(\"Security test\"),\n labelClass: kwargs.labelClass || null,\n controlClass: kwargs.controlClass || null,\n control: control,\n validation: kwargs.form.errors,\n validationKey: 'captcha'\n });\n };\n\n this.value = function() {\n if (typeof grecaptcha !== \"undefined\") {\n return grecaptcha.getResponse();\n } else {\n return '';\n }\n };\n\n this.clean = function(form) {\n if (!this.value()) {\n form.errors.captcha = [\n gettext('This field is required.')\n ];\n } else {\n form.errors.captcha = true;\n }\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.value = captcha.value;\n\n this.load = function() {\n return captcha.load();\n };\n\n this.component = function(kwargs) {\n if (captcha.component) {\n return captcha.component(kwargs);\n } else {\n return null;\n }\n };\n\n this.validator = function() {\n if (captcha.validator) {\n return captcha.validator();\n } else {\n return null;\n }\n };\n\n this.clean = function(form) {\n if (captcha.clean) {\n captcha.clean(form);\n } else {\n form.errors.captcha = true;\n }\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 if (component) {\n this._components[name] = component;\n } else {\n throw '\"' + name + '\" component is not registered and can\\'t be created';\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\n m.route(fixture, '/', this.urls);\n };\n\n this.url = function(name) {\n return this.reverses[name];\n };\n\n this.route = function(url) {\n m.route(url);\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 self.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 && typeof error.status !== \"undefined\") {\n if (this.vm && this.vm.onerror) {\n this.vm.onerror(error, this.container);\n } else {\n this.container.router.errorPage(error);\n }\n } else {\n throw 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 if (component) {\n component.container = _;\n this._routes[name] = boilerplate(component);\n } else {\n throw '\"' + name + '\" route is not registered and can\\'t be created';\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 = /^(([^<>()[\\]\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{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)s character (it has %(show_value)s).\",\n \"Ensure this value has at least %(limit_value)s characters (it has %(show_value)s).\",\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)s character (it has %(show_value)s).\",\n \"Ensure this value has at most %(limit_value)s characters (it has %(show_value)s).\",\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 character.\",\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 passwordMinLength: 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 viewModel = {\n error: null,\n username: null,\n isReady: false,\n init: function(_) {\n this.error = null;\n this.user = null;\n this.isReady = false;\n\n var endpoint = _.api.endpoint('auth').endpoint('activate-account');\n endpoint = endpoint.endpoint(m.route.param('user_id'));\n endpoint = endpoint.endpoint(m.route.param('token'));\n\n return endpoint.post();\n },\n ondata: function(data, _) {\n m.startComputation();\n\n _.title.set(gettext(\"Account activated\"));\n\n this.username = data.username;\n this.isReady = true;\n\n m.endComputation();\n },\n onerror: function(error, _) {\n if (error.status === 400) {\n m.startComputation();\n\n this.error = error;\n this.isReady = true;\n\n m.endComputation();\n } else {\n _.router.errorPage(error);\n }\n }\n };\n\n var activateByToken = {\n controller: function(_) {\n _.auth.denyAuthenticated(\n gettext(\"You have to be signed out to activate account.\"));\n\n _.title.set(gettext(\"Account activation\"));\n this.vm.init(_);\n },\n vm: viewModel,\n view: function(ctrl, _) {\n if (this.vm.error) {\n return this.rejected(this.vm.error, _);\n } else {\n return this.success(this.vm.username, _);\n }\n },\n success: function(username) {\n var message = gettext(\"%(username)s, your account has been successfully activated!\");\n\n return m('.page.page-message.page-message-success',\n m('.container',\n m('.message-panel', [\n m('.message-icon',\n m('span.material-icon', 'check')\n ),\n m('.message-body', [\n m('p.lead',\n interpolate(message, {\n username: username\n }, true)\n ),\n m('p',\n gettext('You can now sign in to finish setting up your account and to participate in or start new discussions.')\n )\n ])\n ])\n )\n );\n },\n rejected: function(error) {\n return m('.page.page-message.page-message-info',\n m('.container',\n m('.message-panel', [\n m('.message-icon',\n m('span.material-icon', 'info_outline')\n ),\n m('.message-body', [\n m('p.lead',\n gettext(\"Your account can't be activated at this time.\")\n ),\n m('p',\n error.detail\n )\n ])\n ])\n )\n );\n },\n loading: function(ctrl, _) {\n return m('.page.page-loading', [\n _.component('loader'),\n m('p.lead', gettext(\"Activating account...\"))\n ]);\n }\n };\n\n Misago.addService('route:activate-by-token', function(_) {\n _.route('activate-by-token', activateByToken);\n },\n {\n after: 'routes'\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('.message-panel', [\n m('.message-icon',\n m('span.material-icon', error.icon)\n ),\n m('.message-body', 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('.message-panel', [\n m('.message-icon',\n m('span.material-icon', 'highlight_off')\n ),\n m('.message-body', 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 document.title = _.settings.forum_index_title || _.settings.forum_name;\n\n return {\n activation: function() {\n _.router.url('request_activation');\n }\n };\n },\n view: function(ctrl, _) {\n return m('.container', [\n m('h1', 'Activation'),\n m('p', 'Test auth blocks'),\n m('p',\n m('a', {href: _.router.url('request_activation')},\n 'Request activation.'\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 formOptions = {\n endpoint: 'send-activation',\n user: null,\n\n success: function(user) {\n this.user = user;\n },\n error: function(rejection, _) {\n if (rejection.code === 'already_active') {\n _.alert.info(rejection.detail);\n _.modal('sign-in');\n } else if (rejection.code === 'inactive_admin') {\n _.alert.info(rejection.detail);\n } else {\n _.alert.error(rejection.detail);\n }\n },\n reset: function() {\n this.user = null;\n }\n };\n\n var requestActivation = {\n controller: function(_) {\n _.auth.denyAuthenticated(\n gettext(\"You have to be signed out to activate account.\"));\n\n _.title.set(gettext(\"Activate your account\"));\n\n return {\n form: _.form('request-link', formOptions)\n };\n },\n view: function(ctrl, _) {\n if (formOptions.user) {\n return this.completed(ctrl.form, formOptions, _);\n } else {\n return this.form(ctrl.form, _);\n }\n },\n completed: function(form, formOptions, _) {\n var message = gettext(\"%(username)s, we have sent your activation link to %(email)s.\");\n\n return m('.page.page-message.page-message-success',\n m('.container',\n m('.message-panel', [\n m('.message-icon',\n m('span.material-icon', 'check')\n ),\n m('.message-body', [\n m('p.lead',\n gettext(\"Activation link has been sent.\")\n ),\n m('p',\n interpolate(message, {\n username: formOptions.user.username,\n email: formOptions.user.email\n }, true)\n ),\n m('p',\n _.component('button', {\n class: '.btn-default',\n submit: false,\n label: gettext(\"Request another link\"),\n onclick: form.reset.bind(form)\n })\n )\n ])\n ])\n )\n );\n },\n form: function(form, _) {\n return m('.page.page-request-activation', [\n _.component('header', {\n title: gettext(\"Request activation link\")\n }),\n m('.container',\n m('.row', [\n m('.col-md-8', [\n m('p',\n gettext(\"Site administrator may impose requirement on newly regitered accounts to be activated before users will be able to sign in.\")\n ),\n m('p',\n gettext(\"Depending on time of registration, you will be able activate your account by clicking special activation link. This link will be valid only for your browser, for seven days or until your account is activated.\")\n ),\n m('p',\n gettext(\"To receive this link, enter your account's e-mail addres in form and press \\\"Send link\\\" button.\")\n )\n ]),\n m('.col-md-4',\n _.component('request-link-form', form)\n )\n ])\n )\n ]);\n }\n };\n\n Misago.addService('route:request-activation', function(_) {\n _.route('request-activation', requestActivation);\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 form = {\n view: function(ctrl, form, _) {\n return m('.well.well-form',\n m('form', {onsubmit: form.submit}, [\n m('.form-group',\n m('.control-input',\n Misago.input({\n disabled: form.isBusy,\n value: form.email,\n placeholder: gettext(\"Your e-mail address\")\n })\n )\n ),\n _.component('button', {\n class: '.btn-primary.btn-block',\n submit: true,\n loading: form.isBusy,\n label: gettext(\"Send link\")\n })\n ])\n );\n }\n };\n\n Misago.addService('component:request-link-form', function(_) {\n _.component('request-link-form', form);\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 var persistent = function(el, isInit, context) {\n context.retain = true;\n };\n\n var refresh = function() {\n document.location.reload();\n };\n\n var registerComplete = {\n controller: function(message, _) {\n if (message.activation === 'active') {\n _.runloop.runOnce(\n refresh, 'refresh-after-registration', 10000);\n }\n },\n view: function(ctrl, message, _) {\n var messageHtml = null;\n\n if (message.activation === 'active') {\n messageHtml = this.active(message);\n } else {\n messageHtml = this.inactive(message);\n }\n\n return m('.modal-dialog.modal-message.modal-register[role=\"document\"]',\n {config: persistent},\n m('.modal-content', [\n _.component('modal:header', gettext('Registration complete')),\n m('.modal-body',\n messageHtml\n )\n ])\n );\n },\n active: function(message) {\n var lead = gettext(\"%(username)s, your account has been created and you were signed in.\");\n return [\n m('.message-icon',\n m('span.material-icon', 'check')\n ),\n m('.message-body', [\n m('p.lead',\n interpolate(lead, {'username': message.username}, true)\n ),\n m('p',\n gettext('The page will refresh automatically in 10 seconds.')\n ),\n m('p',\n m('button[type=\"button\"].btn.btn-default', {onclick: refresh},\n gettext('Refresh page')\n )\n )\n ])\n ];\n },\n inactive: function(message) {\n var lead = null;\n var help = null;\n\n if (message.activation === 'user') {\n lead = gettext(\"%(username)s, your account has been created but you need to activate it before you will be able to sign in.\");\n help = gettext(\"We have sent an e-mail to %(email)s with link that you have to click to activate your account.\");\n } else if (message.activation === 'admin') {\n lead = gettext(\"%(username)s, your account has been created but board administrator will have to activate it before you will be able to sign in.\");\n help = gettext(\"We will send an e-mail to %(email)s when this takes place.\");\n }\n\n return [\n m('.message-icon',\n m('span.material-icon', 'info_outline')\n ),\n m('.message-body', [\n m('p.lead',\n interpolate(lead, {'username': message.username}, true)\n ),\n m('p',\n interpolate(help, {'email': message.email}, true)\n )\n ])\n ];\n }\n };\n\n Misago.addService('modal:register-complete', function(_) {\n _.modal('register-complete', registerComplete);\n },\n {\n after: 'modals'\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 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 var activateButton = null;\n\n if (ctrl.form.showActivation) {\n activateButton = m('a.btn.btn-block.btn-success',\n {href: _.router.url('request_activation')},\n gettext('Activate account')\n );\n }\n\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 activateButton,\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\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.passwordMinLength(_.settings)\n ],\n 'captcha': _.captcha.validator()\n };\n\n this.clean = function() {\n if (this.errors === null) {\n _.validate(this);\n }\n\n _.captcha.clean(this);\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 _.modal('register-complete', data);\n };\n\n this.error = function(rejection) {\n if (rejection.status === 400) {\n _.alert.error(gettext(\"Form contains errors.\"));\n $.extend(self.errors, rejection);\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 RequestLink = function(options, _) {\n var self = this;\n\n this.email = m.prop('');\n\n this.validation = {\n 'email': [\n Misago.validators.email()\n ]\n };\n\n this.clean = function() {\n if (!_.validate(this)) {\n _.alert.error(gettext(\"Enter a valid email address.\"));\n return false;\n } else {\n return true;\n }\n };\n\n this.submit = function() {\n _.api.endpoint('auth').endpoint(options.endpoint).post({\n email: self.email()\n }).then(function(user) {\n self.success(user);\n }, function(error) {\n self.error(error);\n });\n };\n\n this.success = function(user) {\n options.success(user);\n };\n\n this.error = function(rejection) {\n if (rejection.status === 400) {\n options.error(rejection, _);\n } else if (rejection.status === 403 && rejection.ban) {\n _.router.error403({\n message: '',\n ban: rejection.ban\n });\n } else {\n _.api.alert(rejection);\n }\n };\n\n this.reset = function() {\n this.email('');\n options.reset();\n };\n };\n\n Misago.addService('form:request-link', function(_) {\n _.form('request-link', RequestLink);\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\n // Board index\n urls.url('/', 'index');\n\n // Account activation\n urls.url('/activation/', 'request_activation');\n urls.url('/activation/:user_id/:token/', 'activate_by_token');\n\n // Legal pages\n urls.url('/terms-of-service/', 'terms_of_service');\n urls.url('/privacy-policy/', '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/"}
|