|
-{"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","test","get","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","Page","_","isFinalized","_sections","finalize","visible","visibleIf","addSection","section","link","getSections","getDefaultLink","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","isDesynced","newUser","handleAuthChange","isAuthenticated","localstore","handleUserChange","extend","syncSession","watch","signOut","isAnonymous","desktopMount","getElementById","compactMount","desktopComponent","dataset","componentName","compactComponent","newDesktopName","newCompactName","mount","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","Dropdown","slots","toggle","elementId","hasChildNodes","removeClass","console","log","addClass","dropdown","boilerplate","_submit","submit","_success","_error","hasErrors","constructor","_forms","script","remote","STATIC_URL","cache","setLinks","baseUrl","attr","staticUrl","mediaUrl","prefixUrl","LocalStore","storage","localStorage","watchers","handleStorageEvent","newValueJson","JSON","parse","newValue","each","watcher","keyName","oldValue","callback","addEventListener","prefixKey","setItem","stringify","itemString","getItem","Modal","off","remove","modal","open","on","hide","_modal","_modals","Models","classes","deserializers","String","json","locale","mountPage","addMount","_mounts","activeMounts","RunLoop","_intervals","stopInterval","clearTimeout","run","callable","delay","setTimeout","result","loop","showBannedPage","ban","changeState","title","history","pushState","BANNED_URL","ticks","PageTitle","forum_name","_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","Rank","slug","description","css_class","is_tab","User","username","full_title","rank","avatar_hash","acl","absolute_url","deserializeUser","joined_on","style","ViewModel","code","SEND_ACTIVATION_API_URL","ctrl","done","onclick","onsubmit","header","data-dismiss","aria-label","aria-hidden","trust","refresh","location","reload","registerComplete","activation","messageHtml","active","inactive","lead","help","register","footnote","TERMS_OF_SERVICE_URL","href","terms","signin","activateButton","showActivation","REQUEST_ACTIVATION_URL","FORGOTTEN_PASSWORD_URL","showSignIn","button","showRegister","account_activation","sync","logout","decision","confirm","USERCP_URL","nav","openUserMenu","dropdownToggle","data-toggle","data-misago-routed","aria-haspopup","aria-expanded","authChanged","auth","banExpirationMessage","container","expirationMessage","isAfter","fromNow","bannedPage","error_message","textFields","formGroup","groupClass","controlType","attrs","controlId","feedbackId","feedbackIcon","showFeedbackIcon","isValidated","for","labelFor","inactivePage","loader","markup","content","styles","labels","passwordStrength","role","aria-valuenow","aria-valuemin","aria-valuemax","avatar","defaultSize","src","size","finalSize","alt","width","height","Register","RequestLink","SignIn","$form","find","val","route","donePage","activationMessage","SEND_PASSWORD_RESET_API_URL","CHANGE_PASSWORD_API_URL","ResetPassword"],"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 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\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 'use strict';\n\n Misago.Page = function(name, _) {\n var self = this;\n\n this.name = name;\n this.isFinalized = false;\n this._sections = [];\n\n var finalize = function() {\n if (!self.isFinalized) {\n self.isFinalized = true;\n\n var visible = [];\n self._sections.forEach(function (item) {\n if (!item.visibleIf || item.visibleIf(_)) {\n visible.push(item);\n }\n });\n self._sections = new Misago.OrderedList(visible).order(true);\n }\n };\n\n this.addSection = function(section) {\n if (this.isFinalized) {\n throw (this.name + \" page was initialized already and no longer accepts new sections\");\n }\n\n this._sections.push({\n key: section.link,\n item: section,\n\n after: section.after,\n before: section.before\n });\n };\n\n this.getSections = function() {\n finalize();\n return this._sections;\n };\n\n this.getDefaultLink = function() {\n finalize();\n return this._sections[0].link;\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 var self = this;\n\n _.user = _.models.deserialize('user', _.context.user);\n\n // Auth state synchronization across tabs\n this.isDesynced = false; // becomes true if auth state between tabs differs\n this.newUser = null; // becomes user obj to which we want to sync\n\n var handleAuthChange = function(isAuthenticated) {\n if (!self.isDesynced) {\n m.startComputation();\n\n // display annoying \"you were desynced\" message\n self.isDesynced = true;\n\n if (isAuthenticated) {\n self.newUser = _.localstore.get('auth-user');\n }\n\n m.endComputation();\n }\n };\n\n var handleUserChange = function(newUser) {\n if (!self.isDesynced) {\n m.startComputation();\n\n if (_.user.id !== newUser.id) {\n self.isDesynced = true;\n self.newUser = newUser;\n } else if (newUser) {\n _.user = $.extend(_.user, newUser);\n }\n\n m.endComputation();\n }\n };\n\n var syncSession = function() {\n _.localstore.set('auth-user', _.user);\n _.localstore.set('auth-is-authenticated', _.user.isAuthenticated);\n\n _.localstore.watch('auth-is-authenticated', handleAuthChange);\n _.localstore.watch('auth-user', handleUserChange);\n };\n\n syncSession();\n\n // Shorthand for signing user out\n this.signOut = function() {\n _.user.isAuthenticated = false;\n _.user.isAnonymous = true;\n\n syncSession();\n\n var desktopMount = document.getElementById('user-menu-mount');\n var compactMount = document.getElementById('user-menu-compact-mount');\n\n var desktopComponent = desktopMount.dataset.componentName;\n var compactComponent = compactMount.dataset.componentName;\n\n var newDesktopName = desktopComponent.replace('user-nav', 'guest-nav');\n var newCompactName = compactComponent.replace('user-nav', 'guest-nav');\n\n m.mount(desktopMount, _.component(newDesktopName));\n m.mount(compactMount, _.component(newCompactName));\n };\n };\n\n Misago.addService('auth',\n 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 Dropdown = function(_) {\n var slots = {};\n\n this.toggle = function(elementId, component) {\n var element = document.getElementById(elementId);\n\n if (element.hasChildNodes() && slots[elementId] === component) {\n slots[elementId] = null;\n m.mount(element, null);\n $(element).removeClass('open');\n } else {\n console.log(element.hasChildNodes());\n slots[elementId] = component;\n m.mount(element, _.component(component));\n $(element).addClass('open');\n }\n };\n\n this.destroy = function() {\n var element = null;\n\n for (var elementId in slots) {\n if (slots.hasOwnProperty(elementId)) {\n element = document.getElementById(elementId);\n if (element && element.hasChildNodes()) {\n m.mount(element, null);\n }\n }\n }\n };\n };\n\n Misago.addService('dropdown', {\n factory: function(_) {\n return new Dropdown(_);\n },\n destroy: function(_) {\n _.dropdown.destroy();\n }\n },\n {\n before: 'components'\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 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 setLinks = function(_) {\n _.baseUrl = $('base').attr('href');\n\n var staticUrl = Misago.get(_.context, 'STATIC_URL', '/');\n var mediaUrl = Misago.get(_.context, 'MEDIA_URL', '/');\n\n // Media/Static urls\n var prefixUrl = function(prefix) {\n return function(url) {\n return prefix + url;\n };\n };\n\n _.staticUrl = prefixUrl(staticUrl);\n _.mediaUrl = prefixUrl(mediaUrl);\n };\n\n Misago.addService('links', function(_) {\n setLinks(_);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var LocalStore = function() {\n var storage = window.localStorage;\n var prefix = '_misago_';\n var watchers = [];\n\n var handleStorageEvent = function(e) {\n var newValueJson = JSON.parse(e.newValue);\n $.each(watchers, function(i, watcher) {\n if (watcher.keyName === e.key && e.oldValue !== e.newValue) {\n watcher.callback(newValueJson);\n }\n });\n };\n\n window.addEventListener('storage', handleStorageEvent);\n\n var prefixKey = function(keyName) {\n return prefix + keyName;\n };\n\n this.set = function(keyName, value) {\n storage.setItem(prefixKey(keyName), JSON.stringify(value));\n };\n\n this.get = function(keyName) {\n var itemString = storage.getItem(prefixKey(keyName));\n if (itemString) {\n return JSON.parse(itemString);\n } else {\n return null;\n }\n };\n\n this.watch = function(keyName, callback) {\n watchers.push({keyName: prefixKey(keyName), callback: callback});\n };\n\n this.destroy = function() {\n this.watchers = [];\n };\n };\n\n Misago.addService('localstore', {\n factory: function() {\n return new LocalStore();\n },\n destroy: function(_) {\n _.localstore.destroy();\n }\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('modal-mount');\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 before: 'mount-components'\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\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\n this.new = function(name, data) {\n if (this.classes[name]) {\n // Coerce ID to string\n // This is done to avoid type comparisions gotchas\n // later into app\n data.id = data.id ? String(data.id) : null;\n\n return new this.classes[name](data);\n } else {\n return data;\n }\n };\n\n this.deserialize = function(name, json) {\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 mount = document.getElementById('page-mount');\n\n Misago.addService('mount-page', function(_) {\n _.mountPage = function(component) {\n m.mount(mount, component);\n };\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var addMount = function(name) {\n if (this._mounts.indexOf(name) === -1) {\n this._mounts.push(name);\n }\n };\n\n Misago.addService('mounts', function(_) {\n // Default monts\n _._mounts = [\n 'alert-mount',\n 'auth-changed-message-mount',\n 'page-component',\n 'user-menu-mount',\n 'user-menu-compact-mount'\n ];\n\n // Function for including new mounts\n _.addMount = addMount;\n\n // List of active mounts, for debugging\n _.activeMounts = {};\n });\n\n Misago.addService('mount-components', {\n factory: function(_) {\n _._mounts.forEach(function(elementId) {\n var mount = document.getElementById(elementId);\n if (mount) {\n _.activeMounts[elementId] = mount.dataset.componentName;\n m.mount(mount, _.component(mount.dataset.componentName));\n }\n });\n },\n destroy: function() {\n _._mounts.forEach(function(elementId) {\n var mount = document.getElementById(elementId);\n if (mount && mount.hasChildNodes()) {\n m.mount(mount, null);\n }\n });\n }\n },\n {\n before: '_end'\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 destroy: function(_) {\n _.runloop.stop();\n }\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('show-banned-page', function(_) {\n _.showBannedPage = function(ban, changeState) {\n var component = _.component(\n 'banned-page', _.models.deserialize('ban', ban));\n\n if (typeof changeState === 'undefined' || !changeState) {\n _.title.set(gettext(\"You are banned\"));\n window.history.pushState({}, \"\", _.context.BANNED_URL);\n }\n\n _.mountPage(component);\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 Rank = function(data) {\n this.id = data.id;\n\n this.name = data.name;\n this.slug = data.slug;\n\n this.description = data.description;\n\n this.title = data.title;\n this.css_class = data.css_class;\n\n this.is_tab = data.is_tab;\n };\n\n Misago.addService('model:rank', function(_) {\n _.models.add('rank', {\n class: Rank\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.username = data.username;\n this.slug = data.slug;\n\n this.email = data.email;\n\n this.full_title = data.full_title;\n this.rank = data.rank;\n\n this.avatar_hash = data.avatar_hash;\n\n this.acl = data.acl;\n\n this.absolute_url = data.absolute_url;\n };\n\n var deserializeUser = function(data, models) {\n if (data.joined_on) {\n data.joined_on = Misago.deserializeDatetime(data.joined_on);\n }\n\n if (data.rank) {\n data.rank = models.deserialize('rank', data.rank);\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: 'model:rank'\n });\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var style = '.well.well-form.well-form-request-activation-link';\n\n var ViewModel = function(api) {\n this.api = api;\n this.user = null;\n\n this.success = function(user) {\n this.user = user;\n };\n\n this.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\n this.reset = function() {\n this.user = null;\n };\n };\n\n var form = {\n controller: function(_) {\n var vm = new ViewModel(_.context.SEND_ACTIVATION_API_URL);\n\n return {\n vm: vm,\n form: _.form('request-link', vm)\n };\n },\n view: function(ctrl, _) {\n if (ctrl.vm.user) {\n return this.done(ctrl.vm, ctrl.form, _);\n } else {\n return this.form(ctrl.form, _);\n }\n },\n done: function(vm, form, _) {\n var message = gettext(\"Activation link sent to %(email)s.\");\n\n return m(style + '.well-done',\n m('.done-message', [\n m('.message-icon',\n m('span.material-icon', 'check')\n ),\n m('.message-body',\n m('p',\n interpolate(message, {\n email: vm.user.email\n }, true)\n )\n ),\n _.component('button', {\n class: '.btn-default.btn-block',\n submit: false,\n label: gettext(\"Request another link\"),\n onclick: form.reset.bind(form)\n })\n\n ])\n );\n },\n form: function(form, _) {\n return m(style,\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-activation-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\n if (_.context.TERMS_OF_SERVICE_URL) {\n footnote = m('a', {href: _.context.TERMS_OF_SERVICE_URL},\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: _.context.REQUEST_ACTIVATION_URL},\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 m('a.btn.btn-block.btn-default',\n {href: _.context.FORGOTTEN_PASSWORD_URL},\n gettext(\"Forgot password?\")\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 dropdown = {\n controller: function(_) {\n return {\n showSignIn: function() {\n _.modal('sign-in');\n }\n };\n },\n view: function(ctrl, _) {\n return m('ul.dropdown-menu.user-dropdown.dropdown-menu-right[role=\"menu\"]',\n m('li.guest-preview', [\n m('h4',\n gettext(\"You are browsing as guest.\")\n ),\n m('p',\n gettext('Sign in or register to start and participate in discussions.')\n ),\n m('.row', [\n m('.col-xs-6',\n _.component('button', {\n class: '.btn.btn-default.btn-block',\n onclick: ctrl.showSignIn,\n disabled: ctrl.isBusy,\n label: gettext('Sign in')\n })\n ),\n m('.col-xs-6',\n _.component(\n 'navbar:register-button', '.btn.btn-primary.btn-block')\n )\n ])\n ])\n );\n }\n };\n\n Misago.addService('component:navbar:dropdown:guest', function(_) {\n _.component('navbar:dropdown:guest', dropdown);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var button = {\n controller: function(style, _) {\n return {\n isBusy: false,\n\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, style, _) {\n return _.component('button', {\n class: style,\n onclick: ctrl.showRegister.bind(ctrl),\n loading: ctrl.isBusy,\n label: gettext('Register')\n });\n }\n };\n\n Misago.addService('component:navbar:register-button', function(_) {\n _.component('navbar:register-button', button);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var dropdown = {\n class: '.dropdown-menu.user-dropdown.dropdown-menu-right',\n\n controller: function() {\n return {\n logout: function() {\n var decision = confirm(gettext(\"Are you sure you want to sign out?\"));\n if (decision) {\n $('#hidden-logout-form').submit();\n }\n }\n };\n },\n view: function(ctrl, _) {\n return m('ul' + this.class + '[role=\"menu\"]', [\n m('li.dropdown-header',\n m('strong',\n _.user.username\n )\n ),\n m('li.divider'),\n m('li',\n m('a', {href: _.user.absolute_url}, [\n m('span.material-icon',\n 'account_circle'\n ),\n gettext(\"See your profile\")\n ])\n ),\n m('li',\n m('a', {href: _.context.USERCP_URL}, [\n m('span.material-icon',\n 'done_all'\n ),\n gettext(\"Change options\")\n ])\n ),\n m('li',\n m('button.btn-link[type=\"button\"]', [\n m('span.material-icon',\n 'face'\n ),\n gettext(\"Change avatar\")\n ])\n ),\n m('li.divider'),\n m('li.dropdown-footer',\n m('button.btn.btn-default.btn-block', {onclick: ctrl.logout},\n gettext(\"Logout\")\n )\n )\n ]);\n }\n };\n\n Misago.addService('component:navbar:dropdown:user', function(_) {\n _.component('navbar:dropdown:user', dropdown);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var nav = {\n controller: function(_) {\n return {\n openUserMenu: function() {\n _.dropdown.toggle('navbar-dropdown', 'navbar:dropdown:guest');\n }\n };\n },\n view: function(ctrl, _) {\n return m('button', {type: 'button', onclick: ctrl.openUserMenu},\n _.component('user-avatar', null, 64)\n );\n }\n };\n\n Misago.addService('component:navbar:compact:guest-nav', function(_) {\n _.component('navbar:compact:guest-nav', nav);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var nav = {\n controller: function(_) {\n return {\n openUserMenu: function() {\n _.dropdown.toggle('navbar-dropdown', 'navbar:dropdown:user');\n return false;\n }\n };\n },\n view: function(ctrl, _) {\n var config = {\n onclick: ctrl.openUserMenu,\n href: _.user.absolute_url\n };\n\n return m('a', config,\n _.component('user-avatar', _.user, 64)\n );\n }\n };\n\n Misago.addService('component:navbar:compact:user-nav', function(_) {\n _.component('navbar:compact:user-nav', nav);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var nav = {\n controller: function(_) {\n return {\n showSignIn: function() {\n _.modal('sign-in');\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('navbar:register-button', '.navbar-btn.btn-primary')\n ]);\n }\n };\n\n Misago.addService('component:navbar:desktop:guest-nav', function(_) {\n _.component('navbar:desktop:guest-nav', nav);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var nav = {\n controller: function(_) {\n return {\n dropdownToggle: {\n href: _.user.absolute_url,\n\n 'data-toggle': 'dropdown',\n 'data-misago-routed': 'false',\n\n 'aria-haspopup': 'true',\n 'aria-expanded': 'false'\n }\n };\n },\n view: function(ctrl, _) {\n return m('ul.nav.navbar-nav.nav-user', [\n m('li.dropdown', [\n m('a.dropdown-toggle[role=\"button\"]', ctrl.dropdownToggle,\n _.component('user-avatar', _.user, 64)\n ),\n _.component('navbar:dropdown:user')\n ])\n ]);\n }\n };\n\n Misago.addService('component:navbar:desktop:user-nav', function(_) {\n _.component('navbar:desktop:user-nav', nav);\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 var config = {\n config: persistent,\n class: _.alert.isVisible ? 'in' : 'out'\n };\n\n return m('.alerts', config,\n m('p.alert', {class: this.classes[_.alert.type]},\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 function persistent(el, isInit, context) {\n context.retain = true;\n }\n\n var authChanged = {\n refresh: function() {\n window.location.reload();\n },\n view: function(ctrl, _) {\n var message = '';\n\n var options = {\n config: persistent,\n class: (_.auth.isDesynced ? 'show' : null)\n };\n\n if (_.auth.isDesynced) {\n if (_.auth.newUser && _.auth.newUser.isAuthenticated) {\n message = gettext(\"You have signed in as %(username)s. Please refresh this page before continuing.\");\n message = interpolate(message, {username: _.auth.newUser.username}, true);\n } else {\n message = gettext(\"%(username)s, you have been signed out. Please refresh this page before continuing.\");\n message = interpolate(message, {username: _.user.username}, true);\n }\n }\n\n return m('.auth-changed-message', options,\n m('',\n m('.container', [\n m('p',\n message\n ),\n m('p', [\n m('button.btn.btn-default[type=\"button\"]', {onclick: this.refresh},\n gettext(\"Reload page\")\n ),\n m('span.hidden-xs.hidden-sm.text-muted',\n gettext(\"or press F5 key.\")\n )\n ])\n ])\n )\n );\n }\n };\n\n Misago.addService('component:auth-changed-message', function(_) {\n _.component('auth-changed-message', authChanged);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var banExpirationMessage = {\n controller: function(ban, container) {\n var _ = container || ban;\n\n if (container) {\n return ban;\n } else {\n return _.models.deserialize('ban', _.context.ban);\n }\n },\n view: function(ban) {\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\n return m('p', expirationMessage);\n }\n };\n\n Misago.addService('component:ban-expiration-message', function(_) {\n _.component('ban-expiration-message', banExpirationMessage);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var bannedPage = {\n view: function(ctrl, ban, _) {\n var error_message = [];\n\n if (ban.message.html) {\n error_message.push(m('.lead', m.trust(ban.message.html)));\n } else {\n error_message.push(m('p.lead', ban.message.plain));\n }\n\n error_message.push(_.component('ban-expiration-message', ban));\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 Misago.addService('component:banned-page', function(_) {\n _.component('banned-page', bannedPage);\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 inactivePage = {\n view: function(ctrl, activation, _) {\n var activateButton = null;\n\n if (activation.type === 'inactive_user') {\n activateButton = m('p',\n m('a', {href: _.context.REQUEST_ACTIVATION_URL},\n gettext(\"Activate your account.\")\n )\n );\n }\n\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 is inactive.\")\n ),\n m('p',\n activation.message\n ),\n activateButton\n ])\n ])\n )\n );\n }\n };\n\n Misago.addService('component:inactive-page', function(_) {\n _.component('inactive-page', inactivePage);\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 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 avatar = {\n defaultSize: 100,\n\n src: function(user, size, _) {\n var src = _.baseUrl + 'user-avatar/';\n\n if (user && user.id) {\n // just avatar hash, size and user id\n src += user.avatar_hash + '/' + size + '/' + user.id + '.png';\n } else {\n // just append avatar size to file to produce no-avatar placeholder\n src += size + '.png';\n }\n\n return src;\n },\n view: function(ctrl, user, size, _) {\n var finalSize = size || this.defaultSize;\n return m('img', {\n alt: user && user.username ? user.username : gettext(\"Unregistered\"),\n width: finalSize,\n height: finalSize,\n src: this.src(user, finalSize, _)\n });\n }\n };\n\n Misago.addService('component:user-avatar', function(_) {\n _.component('user-avatar', avatar);\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(vm, _) {\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 _.ajax.post(vm.api, {\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 vm.success(user);\n };\n\n this.error = function(rejection) {\n if (rejection.status === 400) {\n vm.error(rejection, _);\n } else {\n _.api.alert(rejection);\n }\n };\n\n this.reset = function() {\n this.email('');\n vm.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 _.showBannedPage(rejection.detail);\n _.modal();\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) {\n 'use strict';\n\n var donePage = {\n controller: function(user, _) {\n _.title.set(gettext(\"Your password has been changed.\"));\n\n return {\n showSignIn: function() {\n _.modal('sign-in');\n }\n };\n },\n view: function(ctrl, user) {\n var button = 'button.btn.btn-primary[type=\"button\"]';\n var message = gettext(\"%(username)s, your password has been changed successfully.\");\n\n return m('.page.page-message.page-message-success.page-password-reset-done',\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: user.username\n }, true)\n ),\n m('p',\n gettext(\"You will have to sign in using new password before continuing.\")\n ),\n m('p',\n m(button, {onclick: ctrl.showSignIn},\n gettext(\"Sign in\")\n )\n )\n ])\n ])\n )\n );\n }\n };\n\n Misago.addService('component:forgotten-password:done-page', function(_) {\n _.component('forgotten-password:done-page', donePage);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var style = '.well.well-form.well-form-request-password-reset-link';\n\n var ViewModel = function(api) {\n this.api = api;\n this.user = null;\n\n this.activation = null;\n this.activationMessage = null;\n\n this.success = function(user) {\n this.user = user;\n };\n\n this.error = function(rejection, _) {\n if (['inactive_user', 'inactive_admin'].indexOf(rejection.code) > -1) {\n var component = _.component('inactive-page', {\n 'type': rejection.code,\n 'message': rejection.detail\n });\n\n _.mountPage(component);\n } else {\n _.alert.error(rejection.detail);\n }\n };\n\n this.reset = function() {\n this.user = null;\n this.activation = null;\n this.activationMessage = null;\n };\n };\n\n var component = {\n controller: function(_) {\n var vm = new ViewModel(_.context.SEND_PASSWORD_RESET_API_URL);\n\n return {\n vm: vm,\n form: _.form('request-link', vm)\n };\n },\n view: function(ctrl, _) {\n if (ctrl.vm.user) {\n return this.done(ctrl.vm, ctrl.form, _);\n } else {\n return this.form(ctrl.form, _);\n }\n },\n done: function(vm, form, _) {\n var message = gettext(\"Reset password link sent to %(email)s.\");\n\n return m(style + '.well-done',\n m('.done-message', [\n m('.message-icon',\n m('span.material-icon', 'check')\n ),\n m('.message-body',\n m('p',\n interpolate(message, {\n email: vm.user.email\n }, true)\n )\n ),\n _.component('button', {\n class: '.btn-default.btn-block',\n submit: false,\n label: gettext(\"Request another link\"),\n onclick: form.reset.bind(form)\n })\n\n ])\n );\n },\n form: function(form, _) {\n return m(style,\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:forgotten-password:request-link', function(_) {\n _.component('forgotten-password:request-link', component);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var style = '.well.well-form.well-form-reset-password';\n\n var ViewModel = function(api) {\n this.api = api;\n\n this.success = function(user, _) {\n _.auth.signOut();\n _.mountPage(_.component('forgotten-password:done-page', user));\n };\n };\n\n var component = {\n controller: function(_) {\n var vm = new ViewModel(_.context.CHANGE_PASSWORD_API_URL);\n\n return {\n form: _.form('reset-password', vm)\n };\n },\n view: function(ctrl, _) {\n return m(style,\n m('form', {onsubmit: ctrl.form.submit}, [\n m('.form-group',\n m('.control-input',\n Misago.input({\n disabled: ctrl.form.isBusy,\n value: ctrl.form.password,\n type: 'password',\n placeholder: gettext(\"Enter new password\")\n })\n )\n ),\n _.component('button', {\n class: '.btn-primary.btn-block',\n submit: true,\n loading: ctrl.form.isBusy,\n label: gettext(\"Change password\")\n })\n ])\n );\n }\n };\n\n Misago.addService('component:forgotten-password:reset-password', function(_) {\n _.component('forgotten-password:reset-password', component);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var ResetPassword = function(vm, _) {\n var self = this;\n\n this.password = m.prop('');\n\n this.validation = {\n 'password': [\n Misago.validators.passwordMinLength(_.settings)\n ]\n };\n\n this.clean = function() {\n if (!_.validate(this)) {\n if ($.trim(this.password()).length) {\n _.alert.error(this.errors.password);\n } else {\n _.alert.error(gettext(\"Enter new password.\"));\n }\n return false;\n } else {\n return true;\n }\n };\n\n this.submit = function() {\n _.ajax.post(vm.api, {\n password: self.password()\n }).then(function(user) {\n self.success(user);\n }, function(error) {\n self.error(error);\n });\n };\n\n this.success = function(user) {\n vm.success(user, _);\n };\n\n this.error = function(rejection) {\n _.api.alert(rejection);\n };\n };\n\n Misago.addService('form:reset-password', function(_) {\n _.form('reset-password', ResetPassword);\n },\n {\n after: 'forms'\n });\n} (Misago.prototype));\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","test","get","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","Page","_","isFinalized","_sections","finalize","visible","visibleIf","addSection","section","link","getSections","getDefaultLink","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","isDesynced","newUser","handleAuthChange","isAuthenticated","localstore","handleUserChange","extend","syncSession","watch","signOut","isAnonymous","desktopMount","getElementById","compactMount","desktopComponent","dataset","componentName","compactComponent","newDesktopName","newCompactName","mount","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","Dropdown","slots","toggle","elementId","hasChildNodes","removeClass","console","log","addClass","dropdown","boilerplate","_submit","submit","_success","_error","hasErrors","constructor","_forms","script","remote","STATIC_URL","cache","setLinks","baseUrl","attr","staticUrl","mediaUrl","prefixUrl","LocalStore","storage","localStorage","watchers","handleStorageEvent","newValueJson","JSON","parse","newValue","each","watcher","keyName","oldValue","callback","addEventListener","prefixKey","setItem","stringify","itemString","getItem","Modal","off","remove","modal","open","on","hide","_modal","_modals","Models","classes","deserializers","String","json","locale","mountPage","addMount","_mounts","activeMounts","RunLoop","_intervals","stopInterval","clearTimeout","run","callable","delay","setTimeout","result","loop","showBannedPage","ban","changeState","title","history","pushState","BANNED_URL","ticks","PageTitle","forum_name","_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","Rank","slug","description","css_class","is_tab","User","username","full_title","rank","avatar_hash","acl","absolute_url","deserializeUser","joined_on","ctrl","authChanged","refresh","location","reload","auth","onclick","banExpirationMessage","container","expirationMessage","isAfter","fromNow","bannedPage","error_message","trust","button","textFields","formGroup","groupClass","controlType","attrs","controlId","feedbackId","feedbackIcon","showFeedbackIcon","isValidated","aria-hidden","for","labelFor","loader","markup","content","header","data-dismiss","aria-label","styles","labels","passwordStrength","style","role","aria-valuenow","aria-valuemin","aria-valuemax","avatar","defaultSize","src","size","finalSize","alt","width","height","RequestLink","ViewModel","code","SEND_ACTIVATION_API_URL","done","onsubmit","donePage","showSignIn","inactivePage","activation","activateButton","href","REQUEST_ACTIVATION_URL","activationMessage","SEND_PASSWORD_RESET_API_URL","CHANGE_PASSWORD_API_URL","ResetPassword","nav","openUserMenu","dropdownToggle","data-toggle","data-misago-routed","aria-haspopup","aria-expanded","showRegister","account_activation","sync","logout","decision","confirm","USERCP_URL","messageHtml","active","inactive","lead","help","footnote","TERMS_OF_SERVICE_URL","terms","Register","showActivation","SignIn","$form","find","val","route","FORGOTTEN_PASSWORD_URL"],"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 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\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 'use strict';\n\n Misago.Page = function(name, _) {\n var self = this;\n\n this.name = name;\n this.isFinalized = false;\n this._sections = [];\n\n var finalize = function() {\n if (!self.isFinalized) {\n self.isFinalized = true;\n\n var visible = [];\n self._sections.forEach(function (item) {\n if (!item.visibleIf || item.visibleIf(_)) {\n visible.push(item);\n }\n });\n self._sections = new Misago.OrderedList(visible).order(true);\n }\n };\n\n this.addSection = function(section) {\n if (this.isFinalized) {\n throw (this.name + \" page was initialized already and no longer accepts new sections\");\n }\n\n this._sections.push({\n key: section.link,\n item: section,\n\n after: section.after,\n before: section.before\n });\n };\n\n this.getSections = function() {\n finalize();\n return this._sections;\n };\n\n this.getDefaultLink = function() {\n finalize();\n return this._sections[0].link;\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 var self = this;\n\n _.user = _.models.deserialize('user', _.context.user);\n\n // Auth state synchronization across tabs\n this.isDesynced = false; // becomes true if auth state between tabs differs\n this.newUser = null; // becomes user obj to which we want to sync\n\n var handleAuthChange = function(isAuthenticated) {\n if (!self.isDesynced) {\n m.startComputation();\n\n // display annoying \"you were desynced\" message\n self.isDesynced = true;\n\n if (isAuthenticated) {\n self.newUser = _.localstore.get('auth-user');\n }\n\n m.endComputation();\n }\n };\n\n var handleUserChange = function(newUser) {\n if (!self.isDesynced) {\n m.startComputation();\n\n if (_.user.id !== newUser.id) {\n self.isDesynced = true;\n self.newUser = newUser;\n } else if (newUser) {\n _.user = $.extend(_.user, newUser);\n }\n\n m.endComputation();\n }\n };\n\n var syncSession = function() {\n _.localstore.set('auth-user', _.user);\n _.localstore.set('auth-is-authenticated', _.user.isAuthenticated);\n\n _.localstore.watch('auth-is-authenticated', handleAuthChange);\n _.localstore.watch('auth-user', handleUserChange);\n };\n\n syncSession();\n\n // Shorthand for signing user out\n this.signOut = function() {\n _.user.isAuthenticated = false;\n _.user.isAnonymous = true;\n\n syncSession();\n\n var desktopMount = document.getElementById('user-menu-mount');\n var compactMount = document.getElementById('user-menu-compact-mount');\n\n var desktopComponent = desktopMount.dataset.componentName;\n var compactComponent = compactMount.dataset.componentName;\n\n var newDesktopName = desktopComponent.replace('user-nav', 'guest-nav');\n var newCompactName = compactComponent.replace('user-nav', 'guest-nav');\n\n m.mount(desktopMount, _.component(newDesktopName));\n m.mount(compactMount, _.component(newCompactName));\n };\n };\n\n Misago.addService('auth',\n 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 Dropdown = function(_) {\n var slots = {};\n\n this.toggle = function(elementId, component) {\n var element = document.getElementById(elementId);\n\n if (element.hasChildNodes() && slots[elementId] === component) {\n slots[elementId] = null;\n m.mount(element, null);\n $(element).removeClass('open');\n } else {\n console.log(element.hasChildNodes());\n slots[elementId] = component;\n m.mount(element, _.component(component));\n $(element).addClass('open');\n }\n };\n\n this.destroy = function() {\n var element = null;\n\n for (var elementId in slots) {\n if (slots.hasOwnProperty(elementId)) {\n element = document.getElementById(elementId);\n if (element && element.hasChildNodes()) {\n m.mount(element, null);\n }\n }\n }\n };\n };\n\n Misago.addService('dropdown', {\n factory: function(_) {\n return new Dropdown(_);\n },\n destroy: function(_) {\n _.dropdown.destroy();\n }\n },\n {\n before: 'components'\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 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 setLinks = function(_) {\n _.baseUrl = $('base').attr('href');\n\n var staticUrl = Misago.get(_.context, 'STATIC_URL', '/');\n var mediaUrl = Misago.get(_.context, 'MEDIA_URL', '/');\n\n // Media/Static urls\n var prefixUrl = function(prefix) {\n return function(url) {\n return prefix + url;\n };\n };\n\n _.staticUrl = prefixUrl(staticUrl);\n _.mediaUrl = prefixUrl(mediaUrl);\n };\n\n Misago.addService('links', function(_) {\n setLinks(_);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var LocalStore = function() {\n var storage = window.localStorage;\n var prefix = '_misago_';\n var watchers = [];\n\n var handleStorageEvent = function(e) {\n var newValueJson = JSON.parse(e.newValue);\n $.each(watchers, function(i, watcher) {\n if (watcher.keyName === e.key && e.oldValue !== e.newValue) {\n watcher.callback(newValueJson);\n }\n });\n };\n\n window.addEventListener('storage', handleStorageEvent);\n\n var prefixKey = function(keyName) {\n return prefix + keyName;\n };\n\n this.set = function(keyName, value) {\n storage.setItem(prefixKey(keyName), JSON.stringify(value));\n };\n\n this.get = function(keyName) {\n var itemString = storage.getItem(prefixKey(keyName));\n if (itemString) {\n return JSON.parse(itemString);\n } else {\n return null;\n }\n };\n\n this.watch = function(keyName, callback) {\n watchers.push({keyName: prefixKey(keyName), callback: callback});\n };\n\n this.destroy = function() {\n this.watchers = [];\n };\n };\n\n Misago.addService('localstore', {\n factory: function() {\n return new LocalStore();\n },\n destroy: function(_) {\n _.localstore.destroy();\n }\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('modal-mount');\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 before: 'mount-components'\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\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\n this.new = function(name, data) {\n if (this.classes[name]) {\n // Coerce ID to string\n // This is done to avoid type comparisions gotchas\n // later into app\n data.id = data.id ? String(data.id) : null;\n\n return new this.classes[name](data);\n } else {\n return data;\n }\n };\n\n this.deserialize = function(name, json) {\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 mount = document.getElementById('page-mount');\n\n Misago.addService('mount-page', function(_) {\n _.mountPage = function(component) {\n m.mount(mount, component);\n };\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var addMount = function(name) {\n if (this._mounts.indexOf(name) === -1) {\n this._mounts.push(name);\n }\n };\n\n Misago.addService('mounts', function(_) {\n // Default monts\n _._mounts = [\n 'alert-mount',\n 'auth-changed-message-mount',\n 'page-component',\n 'user-menu-mount',\n 'user-menu-compact-mount'\n ];\n\n // Function for including new mounts\n _.addMount = addMount;\n\n // List of active mounts, for debugging\n _.activeMounts = {};\n });\n\n Misago.addService('mount-components', {\n factory: function(_) {\n _._mounts.forEach(function(elementId) {\n var mount = document.getElementById(elementId);\n if (mount) {\n _.activeMounts[elementId] = mount.dataset.componentName;\n m.mount(mount, _.component(mount.dataset.componentName));\n }\n });\n },\n destroy: function() {\n _._mounts.forEach(function(elementId) {\n var mount = document.getElementById(elementId);\n if (mount && mount.hasChildNodes()) {\n m.mount(mount, null);\n }\n });\n }\n },\n {\n before: '_end'\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 destroy: function(_) {\n _.runloop.stop();\n }\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('show-banned-page', function(_) {\n _.showBannedPage = function(ban, changeState) {\n var component = _.component(\n 'banned-page', _.models.deserialize('ban', ban));\n\n if (typeof changeState === 'undefined' || !changeState) {\n _.title.set(gettext(\"You are banned\"));\n window.history.pushState({}, \"\", _.context.BANNED_URL);\n }\n\n _.mountPage(component);\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 Rank = function(data) {\n this.id = data.id;\n\n this.name = data.name;\n this.slug = data.slug;\n\n this.description = data.description;\n\n this.title = data.title;\n this.css_class = data.css_class;\n\n this.is_tab = data.is_tab;\n };\n\n Misago.addService('model:rank', function(_) {\n _.models.add('rank', {\n class: Rank\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.username = data.username;\n this.slug = data.slug;\n\n this.email = data.email;\n\n this.full_title = data.full_title;\n this.rank = data.rank;\n\n this.avatar_hash = data.avatar_hash;\n\n this.acl = data.acl;\n\n this.absolute_url = data.absolute_url;\n };\n\n var deserializeUser = function(data, models) {\n if (data.joined_on) {\n data.joined_on = Misago.deserializeDatetime(data.joined_on);\n }\n\n if (data.rank) {\n data.rank = models.deserialize('rank', data.rank);\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: 'model:rank'\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 var config = {\n config: persistent,\n class: _.alert.isVisible ? 'in' : 'out'\n };\n\n return m('.alerts', config,\n m('p.alert', {class: this.classes[_.alert.type]},\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 function persistent(el, isInit, context) {\n context.retain = true;\n }\n\n var authChanged = {\n refresh: function() {\n window.location.reload();\n },\n view: function(ctrl, _) {\n var message = '';\n\n var options = {\n config: persistent,\n class: (_.auth.isDesynced ? 'show' : null)\n };\n\n if (_.auth.isDesynced) {\n if (_.auth.newUser && _.auth.newUser.isAuthenticated) {\n message = gettext(\"You have signed in as %(username)s. Please refresh this page before continuing.\");\n message = interpolate(message, {username: _.auth.newUser.username}, true);\n } else {\n message = gettext(\"%(username)s, you have been signed out. Please refresh this page before continuing.\");\n message = interpolate(message, {username: _.user.username}, true);\n }\n }\n\n return m('.auth-changed-message', options,\n m('',\n m('.container', [\n m('p',\n message\n ),\n m('p', [\n m('button.btn.btn-default[type=\"button\"]', {onclick: this.refresh},\n gettext(\"Reload page\")\n ),\n m('span.hidden-xs.hidden-sm.text-muted',\n gettext(\"or press F5 key.\")\n )\n ])\n ])\n )\n );\n }\n };\n\n Misago.addService('component:auth-changed-message', function(_) {\n _.component('auth-changed-message', authChanged);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var banExpirationMessage = {\n controller: function(ban, container) {\n var _ = container || ban;\n\n if (container) {\n return ban;\n } else {\n return _.models.deserialize('ban', _.context.ban);\n }\n },\n view: function(ban) {\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\n return m('p', expirationMessage);\n }\n };\n\n Misago.addService('component:ban-expiration-message', function(_) {\n _.component('ban-expiration-message', banExpirationMessage);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var bannedPage = {\n view: function(ctrl, ban, _) {\n var error_message = [];\n\n if (ban.message.html) {\n error_message.push(m('.lead', m.trust(ban.message.html)));\n } else {\n error_message.push(m('p.lead', ban.message.plain));\n }\n\n error_message.push(_.component('ban-expiration-message', ban));\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 Misago.addService('component:banned-page', function(_) {\n _.component('banned-page', bannedPage);\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 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 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 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 avatar = {\n defaultSize: 100,\n\n src: function(user, size, _) {\n var src = _.baseUrl + 'user-avatar/';\n\n if (user && user.id) {\n // just avatar hash, size and user id\n src += user.avatar_hash + '/' + size + '/' + user.id + '.png';\n } else {\n // just append avatar size to file to produce no-avatar placeholder\n src += size + '.png';\n }\n\n return src;\n },\n view: function(ctrl, user, size, _) {\n var finalSize = size || this.defaultSize;\n return m('img', {\n alt: user && user.username ? user.username : gettext(\"Unregistered\"),\n width: finalSize,\n height: finalSize,\n src: this.src(user, finalSize, _)\n });\n }\n };\n\n Misago.addService('component:user-avatar', function(_) {\n _.component('user-avatar', avatar);\n },\n {\n after: 'components'\n });\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var RequestLink = function(vm, _) {\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 _.ajax.post(vm.api, {\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 vm.success(user);\n };\n\n this.error = function(rejection) {\n if (rejection.status === 400) {\n vm.error(rejection, _);\n } else {\n _.api.alert(rejection);\n }\n };\n\n this.reset = function() {\n this.email('');\n vm.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 style = '.well.well-form.well-form-request-activation-link';\n\n var ViewModel = function(api) {\n this.api = api;\n this.user = null;\n\n this.success = function(user) {\n this.user = user;\n };\n\n this.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\n this.reset = function() {\n this.user = null;\n };\n };\n\n var form = {\n controller: function(_) {\n var vm = new ViewModel(_.context.SEND_ACTIVATION_API_URL);\n\n return {\n vm: vm,\n form: _.form('request-link', vm)\n };\n },\n view: function(ctrl, _) {\n if (ctrl.vm.user) {\n return this.done(ctrl.vm, ctrl.form, _);\n } else {\n return this.form(ctrl.form, _);\n }\n },\n done: function(vm, form, _) {\n var message = gettext(\"Activation link sent to %(email)s.\");\n\n return m(style + '.well-done',\n m('.done-message', [\n m('.message-icon',\n m('span.material-icon', 'check')\n ),\n m('.message-body',\n m('p',\n interpolate(message, {\n email: vm.user.email\n }, true)\n )\n ),\n _.component('button', {\n class: '.btn-default.btn-block',\n submit: false,\n label: gettext(\"Request another link\"),\n onclick: form.reset.bind(form)\n })\n\n ])\n );\n },\n form: function(form, _) {\n return m(style,\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-activation-link-form', function(_) {\n _.component('request-activation-link-form', form);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var donePage = {\n controller: function(user, _) {\n _.title.set(gettext(\"Your password has been changed.\"));\n\n return {\n showSignIn: function() {\n _.modal('sign-in');\n }\n };\n },\n view: function(ctrl, user) {\n var button = 'button.btn.btn-primary[type=\"button\"]';\n var message = gettext(\"%(username)s, your password has been changed successfully.\");\n\n return m('.page.page-message.page-message-success.page-forgotten-password-done',\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: user.username\n }, true)\n ),\n m('p',\n gettext(\"You will have to sign in using new password before continuing.\")\n ),\n m('p',\n m(button, {onclick: ctrl.showSignIn},\n gettext(\"Sign in\")\n )\n )\n ])\n ])\n )\n );\n }\n };\n\n Misago.addService('component:forgotten-password:done-page', function(_) {\n _.component('forgotten-password:done-page', donePage);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var inactivePage = {\n view: function(ctrl, activation, _) {\n var activateButton = null;\n\n if (activation.type === 'inactive_user') {\n activateButton = m('p',\n m('a', {href: _.context.REQUEST_ACTIVATION_URL},\n gettext(\"Activate your account.\")\n )\n );\n }\n\n return m('.page.page-message.page-message-info.page-forgotten-password-inactive',\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 is inactive.\")\n ),\n m('p',\n activation.message\n ),\n activateButton\n ])\n ])\n )\n );\n }\n };\n\n Misago.addService('component:forgotten-password:inactive-page', function(_) {\n _.component('forgotten-password:inactive-page', inactivePage);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var style = '.well.well-form.well-form-request-password-reset-link';\n\n var ViewModel = function(api) {\n this.api = api;\n this.user = null;\n\n this.activation = null;\n this.activationMessage = null;\n\n this.success = function(user) {\n this.user = user;\n };\n\n this.error = function(rejection, _) {\n if (['inactive_user', 'inactive_admin'].indexOf(rejection.code) > -1) {\n var component = _.component('forgotten-password:inactive-page', {\n 'type': rejection.code,\n 'message': rejection.detail\n });\n\n _.mountPage(component);\n } else {\n _.alert.error(rejection.detail);\n }\n };\n\n this.reset = function() {\n this.user = null;\n this.activation = null;\n this.activationMessage = null;\n };\n };\n\n var component = {\n controller: function(_) {\n var vm = new ViewModel(_.context.SEND_PASSWORD_RESET_API_URL);\n\n return {\n vm: vm,\n form: _.form('request-link', vm)\n };\n },\n view: function(ctrl, _) {\n if (ctrl.vm.user) {\n return this.done(ctrl.vm, ctrl.form, _);\n } else {\n return this.form(ctrl.form, _);\n }\n },\n done: function(vm, form, _) {\n var message = gettext(\"Reset password link sent to %(email)s.\");\n\n return m(style + '.well-done',\n m('.done-message', [\n m('.message-icon',\n m('span.material-icon', 'check')\n ),\n m('.message-body',\n m('p',\n interpolate(message, {\n email: vm.user.email\n }, true)\n )\n ),\n _.component('button', {\n class: '.btn-default.btn-block',\n submit: false,\n label: gettext(\"Request another link\"),\n onclick: form.reset.bind(form)\n })\n\n ])\n );\n },\n form: function(form, _) {\n return m(style,\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:forgotten-password:request-link', function(_) {\n _.component('forgotten-password:request-link', component);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var style = '.well.well-form.well-form-reset-password';\n\n var ViewModel = function(api) {\n this.api = api;\n\n this.success = function(user, _) {\n _.auth.signOut();\n _.mountPage(_.component('forgotten-password:done-page', user));\n };\n };\n\n var component = {\n controller: function(_) {\n var vm = new ViewModel(_.context.CHANGE_PASSWORD_API_URL);\n\n return {\n form: _.form('reset-password', vm)\n };\n },\n view: function(ctrl, _) {\n return m(style,\n m('form', {onsubmit: ctrl.form.submit}, [\n m('.form-group',\n m('.control-input',\n Misago.input({\n disabled: ctrl.form.isBusy,\n value: ctrl.form.password,\n type: 'password',\n placeholder: gettext(\"Enter new password\")\n })\n )\n ),\n _.component('button', {\n class: '.btn-primary.btn-block',\n submit: true,\n loading: ctrl.form.isBusy,\n label: gettext(\"Change password\")\n })\n ])\n );\n }\n };\n\n Misago.addService('component:forgotten-password:reset-password', function(_) {\n _.component('forgotten-password:reset-password', component);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var ResetPassword = function(vm, _) {\n var self = this;\n\n this.password = m.prop('');\n\n this.validation = {\n 'password': [\n Misago.validators.passwordMinLength(_.settings)\n ]\n };\n\n this.clean = function() {\n if (!_.validate(this)) {\n if ($.trim(this.password()).length) {\n _.alert.error(this.errors.password);\n } else {\n _.alert.error(gettext(\"Enter new password.\"));\n }\n return false;\n } else {\n return true;\n }\n };\n\n this.submit = function() {\n _.ajax.post(vm.api, {\n password: self.password()\n }).then(function(user) {\n self.success(user);\n }, function(error) {\n self.error(error);\n });\n };\n\n this.success = function(user) {\n vm.success(user, _);\n };\n\n this.error = function(rejection) {\n _.api.alert(rejection);\n };\n };\n\n Misago.addService('form:reset-password', function(_) {\n _.form('reset-password', ResetPassword);\n },\n {\n after: 'forms'\n });\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var nav = {\n controller: function(_) {\n return {\n openUserMenu: function() {\n _.dropdown.toggle('navbar-dropdown', 'navbar:dropdown:guest');\n }\n };\n },\n view: function(ctrl, _) {\n return m('button', {type: 'button', onclick: ctrl.openUserMenu},\n _.component('user-avatar', null, 64)\n );\n }\n };\n\n Misago.addService('component:navbar:compact:guest-nav', function(_) {\n _.component('navbar:compact:guest-nav', nav);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var nav = {\n controller: function(_) {\n return {\n openUserMenu: function() {\n _.dropdown.toggle('navbar-dropdown', 'navbar:dropdown:user');\n return false;\n }\n };\n },\n view: function(ctrl, _) {\n var config = {\n onclick: ctrl.openUserMenu,\n href: _.user.absolute_url\n };\n\n return m('a', config,\n _.component('user-avatar', _.user, 64)\n );\n }\n };\n\n Misago.addService('component:navbar:compact:user-nav', function(_) {\n _.component('navbar:compact:user-nav', nav);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var nav = {\n controller: function(_) {\n return {\n showSignIn: function() {\n _.modal('sign-in');\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('navbar:register-button', '.navbar-btn.btn-primary')\n ]);\n }\n };\n\n Misago.addService('component:navbar:desktop:guest-nav', function(_) {\n _.component('navbar:desktop:guest-nav', nav);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var nav = {\n controller: function(_) {\n return {\n dropdownToggle: {\n href: _.user.absolute_url,\n\n 'data-toggle': 'dropdown',\n 'data-misago-routed': 'false',\n\n 'aria-haspopup': 'true',\n 'aria-expanded': 'false'\n }\n };\n },\n view: function(ctrl, _) {\n return m('ul.nav.navbar-nav.nav-user', [\n m('li.dropdown', [\n m('a.dropdown-toggle[role=\"button\"]', ctrl.dropdownToggle,\n _.component('user-avatar', _.user, 64)\n ),\n _.component('navbar:dropdown:user')\n ])\n ]);\n }\n };\n\n Misago.addService('component:navbar:desktop:user-nav', function(_) {\n _.component('navbar:desktop:user-nav', nav);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var dropdown = {\n controller: function(_) {\n return {\n showSignIn: function() {\n _.modal('sign-in');\n }\n };\n },\n view: function(ctrl, _) {\n return m('ul.dropdown-menu.user-dropdown.dropdown-menu-right[role=\"menu\"]',\n m('li.guest-preview', [\n m('h4',\n gettext(\"You are browsing as guest.\")\n ),\n m('p',\n gettext('Sign in or register to start and participate in discussions.')\n ),\n m('.row', [\n m('.col-xs-6',\n _.component('button', {\n class: '.btn.btn-default.btn-block',\n onclick: ctrl.showSignIn,\n disabled: ctrl.isBusy,\n label: gettext('Sign in')\n })\n ),\n m('.col-xs-6',\n _.component(\n 'navbar:register-button', '.btn.btn-primary.btn-block')\n )\n ])\n ])\n );\n }\n };\n\n Misago.addService('component:navbar:dropdown:guest', function(_) {\n _.component('navbar:dropdown:guest', dropdown);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var button = {\n controller: function(style, _) {\n return {\n isBusy: false,\n\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, style, _) {\n return _.component('button', {\n class: style,\n onclick: ctrl.showRegister.bind(ctrl),\n loading: ctrl.isBusy,\n label: gettext('Register')\n });\n }\n };\n\n Misago.addService('component:navbar:register-button', function(_) {\n _.component('navbar:register-button', button);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var dropdown = {\n class: '.dropdown-menu.user-dropdown.dropdown-menu-right',\n\n controller: function() {\n return {\n logout: function() {\n var decision = confirm(gettext(\"Are you sure you want to sign out?\"));\n if (decision) {\n $('#hidden-logout-form').submit();\n }\n }\n };\n },\n view: function(ctrl, _) {\n return m('ul' + this.class + '[role=\"menu\"]', [\n m('li.dropdown-header',\n m('strong',\n _.user.username\n )\n ),\n m('li.divider'),\n m('li',\n m('a', {href: _.user.absolute_url}, [\n m('span.material-icon',\n 'account_circle'\n ),\n gettext(\"See your profile\")\n ])\n ),\n m('li',\n m('a', {href: _.context.USERCP_URL}, [\n m('span.material-icon',\n 'done_all'\n ),\n gettext(\"Change options\")\n ])\n ),\n m('li',\n m('button.btn-link[type=\"button\"]', [\n m('span.material-icon',\n 'face'\n ),\n gettext(\"Change avatar\")\n ])\n ),\n m('li.divider'),\n m('li.dropdown-footer',\n m('button.btn.btn-default.btn-block', {onclick: ctrl.logout},\n gettext(\"Logout\")\n )\n )\n ]);\n }\n };\n\n Misago.addService('component:navbar:dropdown:user', function(_) {\n _.component('navbar:dropdown:user', dropdown);\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 modal = {\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', modal);\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 modal = {\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\n if (_.context.TERMS_OF_SERVICE_URL) {\n footnote = m('a', {href: _.context.TERMS_OF_SERVICE_URL},\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', modal);\n },\n {\n after: 'modals'\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 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 _.showBannedPage(rejection.detail);\n _.modal();\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) {\n 'use strict';\n\n function persistent(el, isInit, context) {\n context.retain = true;\n }\n\n var modal = {\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: _.context.REQUEST_ACTIVATION_URL},\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 m('a.btn.btn-block.btn-default',\n {href: _.context.FORGOTTEN_PASSWORD_URL},\n gettext(\"Forgot password?\")\n )\n ])\n ])\n ])\n );\n }\n };\n\n Misago.addService('modal:sign-in', function(_) {\n _.modal('sign-in', modal);\n },\n {\n after: 'modals'\n });\n}(Misago.prototype));\n"],"sourceRoot":"/source/"}
|