|
-{"version":3,"sources":["misago.js"],"names":["window","Misago","ns","Object","getPrototypeOf","this","self","_initServices","services","orderedServices","OrderedList","order","forEach","item","factory","undefined","serviceInstance","key","_destroyServices","reverse","destroy","context","SETTINGS","setup","init","fixture","get","test","api","_services","proto","prototype","addService","name","push","after","before","PermissionDenied","message","detail","status","toString","has","obj","hasOwnProperty","value","pop","returnValue","persistent","el","isInit","retain","input","kwargs","options","disabled","config","placeholder","autocomplete","element","id","type","oninput","m","withAttr","noop","stateHooks","component","loadingState","errorState","_hasLifecycleHooks","isActive","errorHandler","bind","_controller","controller","apply","arguments","_onunload","onunload","e","vm","loading","loadingHandler","_view","view","isReady","_init","initArgs","promise","then","ondata","finalArgs","i","length","f","error","items","isOrdered","_items","add","values","values_only","_order","unordered","insertItem","insertAt","ordering","indexOf","ordered","splice","index","iterations","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","denyAuthenticated","denyAnonymous","isAnonymous","NoCaptcha","load","QACaptcha","question","prop","label","labelClass","controlClass","control","validate","form","isBusy","validation","errors","validationKey","helpText","help_text","validator","ReCaptcha","included","wait","grecaptcha","reset","controlConfig","render","sitekey","settings","recaptcha_site_key","getResponse","clean","captcha","Captcha","types","no","qa","re","captcha_type","_components","argumentsArray","dropdownConfig","on","removeClass","off","Dropdown","slots","slot","toggle","getElementById","hasChildNodes","mount","addClass","boilerplate","_submit","submit","_success","_error","hasErrors","constructor","_forms","script","remote","STATIC_URL","cache","LocalStore","storage","localStorage","watchers","handleStorageEvent","newValueJson","JSON","parse","newValue","each","watcher","keyName","oldValue","callback","addEventListener","prefixKey","setItem","stringify","itemString","getItem","Modal","delegateName","hide","remove","modal","open","_modal","_modals","Models","classes","deserializers","String","json","locale","attr","Router","baseUrl","staticUrl","mediaUrl","urls","reverses","populatePatterns","urlconf","finalPattern","route","startRouting","mode","redirect","delegateElement","cleanUrl","isRelative","substr","location","protocol","host","avatarsUrl","delegateSelector","delegateClicks","currentTarget","href","preventDefault","prefixUrl","error403","ban","error404","error500","error0","errorPage","waitForFixture","router","setTimeout","_hasRouteBoilerplate","loadingView","container","onerror","_routes","RunLoop","_intervals","stopInterval","clearTimeout","run","callable","delay","result","loop","ticks","PageTitle","forum_name","title","_set_complex","completeTitle","page","page_label","interpolate","parent","EMAIL","USERNAME","validators","required","trim","email","minLength","limit_value","returnMessage","ngettext","show_value","maxLength","usernameMinLength","username_length_min","usernameMaxLength","username_length_max","usernameContent","passwordMinLength","password_length_min","validateField","validateForm","isValid","Zxcvbn","scorePassword","password","inputs","zxcvbn","score","Ban","html","plain","expires_on","deserializeBan","class","LegalPage","body","Rank","slug","description","css_class","is_tab","User","username","full_title","rank","avatar_hash","acl","deserializeUser","joined_on","forum","ctrl","auth","viewModel","param","activateByToken","rejected","changePassword","signin","complete","onsubmit","onclick","error_message","help","code","icon","errorBanned","trust","expirationMessage","isAfter","fromNow","forum_index_title","activation","legalPageFactory","typeName","defaultTitle","dashedTypeName","ViewModel","requestActivation","completed","activationMessage","requestPasswordChange","inactive","activateButton","brand","branding","children","src","alt","nav","showSignIn","links","navbar","mainNav","forum_branding_display","forum_branding_text","dropdownToggle","data-toggle","data-misago-routed","aria-haspopup","aria-expanded","authChanged","refresh","reload","button","textFields","formGroup","groupClass","controlType","attrs","controlId","feedbackId","feedbackIcon","showFeedbackIcon","isValidated","aria-hidden","for","labelFor","forumLayout","dropdown","loader","markup","content","tabindex","aria-labelledby","header","styles","labels","passwordStrength","style","role","aria-valuenow","aria-valuemin","aria-valuemax","avatar","defaultSize","size","finalSize","width","height","openUserMenu","userMenu","mobileNav","mobileLinks","showRegister","account_activation","sync","logout","decision","confirm","footer","hasNav","forum_footnote","terms_of_service","terms_of_service_link","privacy_policy","privacy_policy_link","legalLink","legalType","data-dismiss","aria-label","registerComplete","messageHtml","active","lead","register","footnote","termsUrl","terms","showActivation","ChangePassword","Register","RequestLink","SignIn","$form","find","val"],"mappings":"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","file":"misago.js","sourcesContent":["/* global -Misago */\n/* exported Misago */\n(function () {\n 'use strict';\n\n window.Misago = function() {\n var ns = Object.getPrototypeOf(this);\n var self = this;\n\n // Services init/destroy\n this._initServices = function(services) {\n var orderedServices = new ns.OrderedList(services).order(false);\n orderedServices.forEach(function (item) {\n var factory = null;\n if (item.item.factory !== undefined) {\n factory = item.item.factory;\n } else {\n factory = item.item;\n }\n\n var serviceInstance = factory(self);\n if (serviceInstance) {\n self[item.key] = serviceInstance;\n }\n });\n };\n\n this._destroyServices = function(services) {\n var orderedServices = new ns.OrderedList(services).order();\n orderedServices.reverse();\n orderedServices.forEach(function (item) {\n if (item.destroy !== undefined) {\n item.destroy(self);\n }\n });\n };\n\n // Context data\n this.context = {\n // Empty settings\n SETTINGS: {}\n };\n\n // App init/destory\n this.setup = false;\n this.init = function(setup, context) {\n this.setup = {\n fixture: ns.get(setup, 'fixture', null),\n test: ns.get(setup, 'test', false),\n api: ns.get(setup, 'api', '/api/')\n };\n\n if (context) {\n this.context = context;\n }\n\n this._initServices(ns._services);\n };\n\n this.destroy = function() {\n this._destroyServices(ns._services);\n };\n };\n\n // Services\n var proto = window.Misago.prototype;\n\n proto._services = [];\n proto.addService = function(name, factory, order) {\n proto._services.push({\n key: name,\n item: factory,\n after: proto.get(order, 'after'),\n before: proto.get(order, 'before')\n });\n };\n\n // Exceptions\n proto.PermissionDenied = function(message) {\n this.detail = message;\n this.status = 403;\n\n this.toString = function() {\n return this.detail || 'Permission denied';\n };\n };\n}());\n\n(function (Misago) {\n 'use strict';\n\n Misago.has = function(obj, key) {\n if (obj) {\n return obj.hasOwnProperty(key);\n } else {\n return false;\n }\n };\n\n Misago.get = function(obj, key, value) {\n if (Misago.has(obj, key)) {\n return obj[key];\n } else if (value !== undefined) {\n return value;\n } else {\n return undefined;\n }\n };\n\n Misago.pop = function(obj, key, value) {\n var returnValue = Misago.get(obj, key, value);\n if (Misago.has(obj, key)) {\n obj[key] = null;\n }\n return returnValue;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n function persistent(el, isInit, context) {\n context.retain = true;\n }\n\n Misago.input = function(kwargs) {\n var options = {\n disabled: kwargs.disabled || false,\n config: kwargs.config || persistent\n };\n\n if (kwargs.placeholder) {\n options.placeholder = kwargs.placeholder;\n }\n\n if (kwargs.autocomplete === false) {\n options.autocomplete = 'off';\n }\n\n var element = 'input';\n\n if (kwargs.id) {\n element += '#' + kwargs.id;\n options.key = 'field-' + kwargs.id;\n }\n\n element += '.form-control' + (kwargs.class || '');\n element += '[type=\"' + (kwargs.type || 'text') + '\"]';\n\n if (kwargs.value) {\n options.value = kwargs.value();\n options.oninput = m.withAttr('value', kwargs.value);\n }\n\n return m(element, options);\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var noop = function() {};\n\n Misago.stateHooks = function(component, loadingState, errorState) {\n /*\n Boilerplate for Misago components with lifecycles\n */\n\n // Component boilerplated (this may happen in tests)\n if (component._hasLifecycleHooks) {\n return component;\n }\n component._hasLifecycleHooks = true;\n\n // Component active state\n component.isActive = true;\n\n var errorHandler = errorState.bind(component);\n\n // Wrap controller to store lifecycle methods\n var _controller = component.controller || noop;\n component.controller = function() {\n try {\n component.isActive = true;\n var controller = _controller.apply(component, arguments) || {};\n\n // wrap onunload for lifestate\n var _onunload = controller.onunload || noop;\n controller.onunload = function() {\n _onunload.apply(component, arguments);\n component.isActive = false;\n };\n\n return controller;\n } catch (e) {\n errorHandler(e);\n }\n };\n\n // Add state callbacks to View-Model\n if (component.vm && component.vm.init) {\n // setup default loading view\n if (!component.loading) {\n var loadingHandler = loadingState.bind(component);\n component.loading = loadingHandler;\n }\n\n var _view = component.view;\n component.view = function() {\n if (component.vm.isReady) {\n return _view.apply(component, arguments);\n } else {\n return component.loading.apply(component, arguments);\n }\n };\n\n // wrap vm.init in promise handler\n var _init = component.vm.init;\n component.vm.init = function() {\n var initArgs = arguments;\n var promise = _init.apply(component.vm, initArgs);\n\n if (promise) {\n promise.then(function() {\n if (component.isActive && component.vm.ondata) {\n var finalArgs = [];\n for (var i = 0; i < arguments.length; i++) {\n finalArgs.push(arguments[i]);\n }\n for (var f = 0; f < initArgs.length; f++) {\n finalArgs.push(initArgs[f]);\n }\n\n component.vm.ondata.apply(component.vm, finalArgs);\n }\n }, function(error) {\n if (component.isActive) {\n errorHandler(error);\n }\n });\n }\n };\n }\n\n return component;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.OrderedList = function(items) {\n this.isOrdered = false;\n this._items = items || [];\n\n this.add = function(key, item, order) {\n this._items.push({\n key: key,\n item: item,\n\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 // Access controls\n this.denyAuthenticated = function(message) {\n if (_.user.isAuthenticated) {\n throw new Misago.PermissionDenied(\n message || gettext(\"This page is not available to signed in users.\"));\n }\n };\n\n this.denyAnonymous = function(message) {\n if (_.user.isAnonymous) {\n throw new Misago.PermissionDenied(\n message || gettext(\"This page is not available to guests.\"));\n }\n };\n };\n\n Misago.addService('auth',\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 dropdownConfig = function(element, isInit, context) {\n if (!isInit) {\n context.retain = true;\n\n $(element).on('click', function() {\n $(element).removeClass('open');\n });\n\n context.onunload = function() {\n $(element).removeClass('open');\n $(element).off();\n };\n }\n };\n\n var Dropdown = function(_) {\n var slots = {};\n\n this.slot = function(name) {\n return m('#dropdown-' + name + '.dropdown.mobile-dropdown', {\n config: dropdownConfig\n });\n };\n\n this.toggle = function(slot, component) {\n var element = document.getElementById('dropdown-' + slot);\n\n if (element.hasChildNodes() && slots[slot] === component) {\n slots[slot] = null;\n m.mount(element, null);\n $(element).removeClass('open');\n } else {\n slots[slot] = component;\n m.mount(element, _.component(component));\n $(element).addClass('open');\n }\n };\n };\n\n Misago.addService('dropdown', {\n factory: function(_) {\n return new Dropdown(_);\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 Misago.addService('forum-layout', {\n factory: function(_) {\n if (_.setup.fixture) {\n m.mount(document.getElementById(_.setup.fixture),\n _.component('forum-layout'));\n }\n },\n\n destroy: function(_) {\n if (_.setup.fixture) {\n m.mount(document.getElementById(_.setup.fixture), null);\n }\n }\n },\n {\n before: 'start-routing'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var include = function(script, remote) {\n if (!remote) {\n script = this.context.STATIC_URL + script;\n }\n\n $.ajax({\n url: script,\n cache: true,\n dataType: 'script'\n });\n };\n\n Misago.addService('include', function(_) {\n _.include = include;\n },\n {\n after: 'conf'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var 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('misago-modal');\n\n // href clicks within modal should close it\n var delegateName = 'click.misago-modal';\n $(element).on(delegateName, 'a', function() {\n self.hide();\n });\n\n this.destroy = function() {\n $(element).off();\n $('body').removeClass('modal-open');\n $('.modal-backdrop').remove();\n };\n\n // Open/close modal\n var modal = $(element).modal({show: false});\n this.open = false;\n\n modal.on('hidden.bs.modal', function () {\n if (self.open) {\n m.mount(element, null);\n this.open = false;\n }\n });\n\n this.show = function(component) {\n this.open = true;\n m.mount(element, component);\n modal.modal('show');\n };\n\n this.hide = function() {\n modal.modal('hide');\n };\n };\n\n Misago.addService('_modal', {\n factory: function() {\n return new Modal();\n },\n destroy: function(_) {\n _._modal.destroy();\n }\n },\n {\n after: 'start-routing'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var modal = function(name, component) {\n if (this._modals[name]) {\n var argumentsArray = [this._modals[name]];\n for (var i = 1; i < arguments.length; i += 1) {\n argumentsArray.push(arguments[i]);\n }\n argumentsArray.push(this);\n this._modal.show(m.component.apply(m, argumentsArray));\n } else if (name) {\n this._modals[name] = component;\n } else {\n this._modal.hide();\n }\n };\n\n Misago.addService('modals', function(_) {\n _._modals = {};\n _.modal = modal;\n },\n {\n after: '_modal'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Models = function() {\n this.classes = {};\n this.deserializers = {};\n\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\n(function (Misago) {\n 'use strict';\n\n var Router = function(_) {\n var self = this;\n this.baseUrl = $('base').attr('href');\n\n var staticUrl = Misago.get(_.context, 'STATIC_URL', '/');\n var mediaUrl = Misago.get(_.context, 'MEDIA_URL', '/');\n\n // Routing\n this.urls = {};\n this.reverses = {};\n\n var populatePatterns = function(urlconf) {\n urlconf.patterns().forEach(function(url) {\n var finalPattern = self.baseUrl + url.pattern;\n finalPattern = finalPattern.replace('//', '/');\n\n self.urls[finalPattern] = _.route(url.component);\n self.reverses[url.name] = finalPattern;\n });\n };\n\n this.startRouting = function(urlconf, fixture) {\n populatePatterns(urlconf);\n this.fixture = fixture;\n\n if (_.setup.test) {\n m.route.mode = 'search';\n } else {\n m.route.mode = 'pathname';\n }\n\n m.route(fixture, '/', this.urls);\n };\n\n this.url = function(name) {\n return this.reverses[name];\n };\n\n this.route = function(url) {\n m.route(url);\n };\n\n this.redirect = function(name) {\n this.route(this.url(name));\n };\n\n // Delegate clicks\n this.delegateElement = null;\n\n this.cleanUrl = function(url) {\n if (!url) { return; }\n\n // Is link relative?\n var isRelative = url.substr(0, 1) === '/' && url.substr(0, 2) !== '//';\n\n // If link contains host, validate to see if its outgoing\n if (!isRelative) {\n var location = window.location;\n\n // If protocol matches current one, strip it from string\n // otherwhise stop handler\n if (url.substr(0, 2) !== '//') {\n var protocol = url.substr(0, location.protocol.length + 2);\n if (protocol !== location.protocol + '//') { return; }\n url = url.substr(location.protocol.length + 2);\n } else {\n url = url.substr(2);\n }\n\n // Host checks out?\n if (url.substr(0, location.host.length) !== location.host) { return; }\n url = url.substr(location.host.length);\n }\n\n // Is link within JS app?\n if (url.substr(0, this.baseUrl.length) !== this.baseUrl) { return; }\n\n // Is link to media/static/avatar server?\n if (url.substr(0, staticUrl.length) === staticUrl) { return; }\n\n if (url.substr(0, mediaUrl.length) === mediaUrl) { return; }\n\n var avatarsUrl = '/user-avatar/';\n if (url.substr(0, avatarsUrl.length) === avatarsUrl) { return; }\n\n return url;\n };\n\n var delegateName = 'click.misago-router';\n var delegateSelector = 'a:not([data-misago-routed=\"false\"])';\n\n this.delegateClicks = function(element) {\n this.delegateElement = element;\n $(this.delegateElement).on(delegateName, delegateSelector, function(e) {\n var cleanUrl = self.cleanUrl(e.currentTarget.href);\n if (cleanUrl) {\n if (cleanUrl != m.route()) {\n self.route(cleanUrl);\n }\n e.preventDefault();\n }\n });\n };\n\n this.destroy = function() {\n $(this.delegateElement).off(delegateName);\n };\n\n // Media/Static url\n var prefixUrl = function(prefix) {\n return function(url) {\n return prefix + url;\n };\n };\n\n this.staticUrl = prefixUrl(staticUrl);\n this.mediaUrl = prefixUrl(mediaUrl);\n\n // Errors\n this.error403 = function(error) {\n var component = null;\n if (error.ban) {\n component = _.route('error:banned',\n error.detail,\n _.models.deserialize('ban', error.ban));\n } else {\n component = _.route('error:403', error.detail);\n }\n m.mount(this.fixture, component);\n };\n\n this.error404 = function() {\n m.mount(this.fixture, _.route('error:404'));\n };\n\n this.error500 = function() {\n m.mount(this.fixture, _.route('error:500'));\n };\n\n this.error0 = function() {\n m.mount(this.fixture, _.route('error:0'));\n };\n\n this.errorPage = function(error) {\n if (error.status === 0) {\n this.error0();\n }\n\n if (error.status === 500) {\n this.error500();\n }\n\n if (error.status === 404) {\n this.error404();\n }\n\n if (error.status === 403) {\n this.error403(error);\n }\n };\n };\n\n Misago.addService('router', function(_) {\n return new Router(_);\n });\n\n Misago.addService('start-routing', function(_) {\n // In edge cases layout gets rendered in same frame routing starts\n // which causes getElementById to return null and crash Mithril.js\n var waitForFixture = function() {\n var fixture = document.getElementById('router-fixture');\n if (fixture) {\n _.router.startRouting(\n Misago.urls, document.getElementById('router-fixture'));\n _.router.delegateClicks(document.getElementById(_.setup.fixture));\n } else {\n window.setTimeout(function() {\n waitForFixture();\n }, 10);\n }\n };\n waitForFixture();\n },\n {\n before: '_end'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var boilerplate = function(component) {\n // Component already boilerplated (this may happen in tests)\n if (component._hasRouteBoilerplate) {\n return component;\n }\n component._hasRouteBoilerplate = true;\n\n // Add lifecycle hooks\n var loadingView = function () {\n var _ = this.container;\n return m('.page.page-loading',\n _.component('loader')\n );\n };\n\n var errorHandler = function(error) {\n if (this.isActive && typeof error.status !== \"undefined\") {\n if (this.vm && this.vm.onerror) {\n this.vm.onerror(error, this.container);\n } else {\n this.container.router.errorPage(error);\n }\n } else {\n throw error;\n }\n };\n\n return Misago.stateHooks(component, loadingView, errorHandler);\n };\n\n Misago.addService('routes', function(_) {\n _._routes = {};\n _.route = function(name, component) {\n if (this._routes[name]) {\n if (arguments.length > 1) {\n var argumentsArray = [this._routes[name]];\n for (var i = 1; i < arguments.length; i += 1) {\n argumentsArray.push(arguments[i]);\n }\n argumentsArray.push(this);\n return m.component.apply(undefined, argumentsArray);\n } else {\n return m.component(this._routes[name], this);\n }\n } else if (component) {\n component.container = _;\n this._routes[name] = boilerplate(component);\n } else {\n throw '\"' + name + '\" route is not registered and can\\'t be created';\n }\n };\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var RunLoop = function(_) {\n var self = this;\n\n this._intervals = {};\n\n var stopInterval = function(name) {\n if (self._intervals[name]) {\n window.clearTimeout(self._intervals[name]);\n self._intervals[name] = null;\n }\n };\n\n this.run = function(callable, name, delay) {\n this._intervals[name] = window.setTimeout(function() {\n stopInterval(name);\n var result = callable(_);\n if (result !== false) {\n self.run(callable, name, delay);\n }\n }, delay);\n };\n\n this.runOnce = function(callable, name, delay) {\n this._intervals[name] = window.setTimeout(function() {\n stopInterval(name);\n callable(_);\n }, delay);\n };\n\n this.stop = function(name) {\n for (var loop in this._intervals) {\n if (!name || name === loop) {\n stopInterval(loop);\n }\n }\n };\n };\n\n Misago.addService('runloop', {\n factory: function(_) {\n return new RunLoop(_);\n },\n destroy: function(_) {\n _.runloop.stop();\n }\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('start-tick', function(_) {\n var ticks = m.prop();\n\n _.runloop.run(function() {\n m.startComputation();\n // just tick once a minute so stuff gets rerendered\n ticks(ticks() + 1);\n // syncing dynamic timestamps, etc ect\n m.endComputation();\n }, 'tick', 60000);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var PageTitle = function(forum_name) {\n this.set = function(title) {\n if (title) {\n this._set_complex(title);\n } else {\n document.title = forum_name;\n }\n };\n\n this._set_complex = function(title) {\n if (typeof title === 'string') {\n title = {title: title};\n }\n\n var completeTitle = title.title;\n\n if (typeof title.page !== 'undefined' && title.page > 1) {\n var page_label = interpolate(\n gettext('page %(page)s'), { page:title.page }, true);\n completeTitle += ' (' + page_label + ')';\n }\n\n if (typeof title.parent !== 'undefined') {\n completeTitle += ' | ' + title.parent;\n }\n\n document.title = completeTitle + ' | ' + forum_name;\n };\n };\n\n Misago.addService('page-title', function(_) {\n _.title = new PageTitle(_.settings.forum_name);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var EMAIL = /^(([^<>()[\\]\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})$/i;\n var USERNAME = new RegExp('^[0-9a-z]+$', 'i');\n\n // Validators namespace\n Misago.validators = {\n required: function() {\n return function(value) {\n if ($.trim(value).length === 0) {\n return gettext(\"This field is required.\");\n }\n };\n },\n email: function(message) {\n return function(value) {\n if (!EMAIL.test(value)) {\n return message || gettext(\"Enter a valid email address.\");\n }\n };\n },\n minLength: function(limit_value, message) {\n return function(value) {\n var returnMessage = '';\n var length = $.trim(value).length;\n\n if (length < limit_value) {\n if (message) {\n returnMessage = message(limit_value, length);\n } else {\n returnMessage = ngettext(\n \"Ensure this value has at least %(limit_value)s character (it has %(show_value)s).\",\n \"Ensure this value has at least %(limit_value)s characters (it has %(show_value)s).\",\n limit_value);\n }\n return interpolate(returnMessage, {\n limit_value: limit_value,\n show_value: length\n }, true);\n }\n };\n },\n maxLength: function(limit_value, message) {\n return function(value) {\n var returnMessage = '';\n var length = $.trim(value).length;\n\n if (length > limit_value) {\n if (message) {\n returnMessage = message(limit_value, length);\n } else {\n returnMessage = ngettext(\n \"Ensure this value has at most %(limit_value)s character (it has %(show_value)s).\",\n \"Ensure this value has at most %(limit_value)s characters (it has %(show_value)s).\",\n limit_value);\n }\n return interpolate(returnMessage, {\n limit_value: limit_value,\n show_value: length\n }, true);\n }\n };\n },\n usernameMinLength: function(settings) {\n var message = function(limit_value) {\n return ngettext(\n \"Username must be at least %(limit_value)s character long.\",\n \"Username must be at least %(limit_value)s characters long.\",\n limit_value);\n };\n return this.minLength(settings.username_length_min, message);\n },\n usernameMaxLength: function(settings) {\n var message = function(limit_value) {\n return ngettext(\n \"Username cannot be longer than %(limit_value)s character.\",\n \"Username cannot be longer than %(limit_value)s characters.\",\n limit_value);\n };\n return this.maxLength(settings.username_length_max, message);\n },\n usernameContent: function() {\n return function(value) {\n if (!USERNAME.test($.trim(value))) {\n return gettext(\"Username can only contain latin alphabet letters and digits.\");\n }\n };\n },\n passwordMinLength: function(settings) {\n var message = function(limit_value) {\n return ngettext(\n \"Valid password must be at least %(limit_value)s character long.\",\n \"Valid password must be at least %(limit_value)s characters long.\",\n limit_value);\n };\n return this.minLength(settings.password_length_min, message);\n }\n };\n\n var validateField = function(value, validators) {\n var result = Misago.validators.required()(value);\n var errors = [];\n\n if (result) {\n return [result];\n } else {\n for (var i in validators) {\n result = validators[i](value);\n\n if (result) {\n errors.push(result);\n }\n }\n }\n\n return errors.length ? errors : true;\n };\n\n var validateForm = function(form) {\n var errors = {};\n var value = null;\n\n var isValid = true;\n\n for (var key in form.validation) {\n if (form.validation.hasOwnProperty(key)) {\n value = form[key]();\n errors[key] = validateField(form[key](), form.validation[key]);\n if (errors[key] !== true) {\n isValid = false;\n }\n }\n }\n\n form.errors = errors;\n return isValid;\n };\n\n var validate = function(form, name) {\n if (name) {\n return function(value) {\n var errors = null;\n if (typeof value !== 'undefined') {\n errors = validateField(value, form.validation[name]);\n if (errors) {\n if (!form.errors) {\n form.errors = {};\n }\n form.errors[name] = errors;\n }\n form[name](value);\n return form[name](value);\n } else {\n return form[name]();\n }\n };\n } else {\n return validateForm(form);\n }\n };\n\n Misago.addService('validate', {\n factory: function() {\n return validate;\n }\n });\n}(Misago.prototype));\n\n/* global zxcvbn */\n(function (Misago) {\n 'use strict';\n\n var Zxcvbn = function(_) {\n this.included = false;\n\n this.scorePassword = function(password, inputs) {\n // 0-4 score, the more the stronger password\n return zxcvbn(password, inputs).score;\n };\n\n // loading\n this.include = function() {\n _.include('misago/js/zxcvbn.js');\n this.included = true;\n };\n\n var wait = function(promise) {\n if (typeof zxcvbn !== \"undefined\") {\n promise.resolve();\n } else {\n _.runloop.runOnce(function() {\n wait(promise);\n }, 'loading-zxcvbn', 150);\n }\n };\n\n var deferred = m.deferred();\n this.load = function() {\n if (!this.included) {\n this.include();\n }\n wait(deferred);\n return deferred.promise;\n };\n };\n\n Misago.addService('zxcvbn', function(_) {\n return new Zxcvbn(_);\n },\n {\n after: 'include'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Ban = function(data) {\n this.message = {\n html: data.message.html,\n plain: data.message.plain,\n };\n\n this.expires_on = data.expires_on;\n };\n\n var deserializeBan = function(data) {\n data.expires_on = Misago.deserializeDatetime(data.expires_on);\n\n return data;\n };\n\n Misago.addService('model:ban', function(_) {\n _.models.add('ban', {\n class: Ban,\n deserialize: deserializeBan\n });\n },\n {\n after: 'models'\n });\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var LegalPage = function(data) {\n this.title = data.title;\n this.body = data.body;\n this.link = data.link;\n };\n\n Misago.addService('model:legal-page', function(_) {\n _.models.add('legal-page', {\n class: LegalPage\n });\n },\n {\n after: 'models'\n });\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var 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\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 forum = {\n view: function(ctrl, _) {\n return m('', [\n _.component('header', {\n title: gettext(\"Options\")\n }),\n m('.container',\n m('p', 'Lorem ipsum dolor met.')\n )\n ]);\n }\n };\n\n Misago.addService('component:options:nav:dropdown', function(_) {\n _.component('options:nav:dropdown', forum);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var email = {\n controller: function(_) {\n _.auth.denyAnonymous(\n gettext(\"You have to be signed in to change your options.\"));\n\n this.container.title.set({\n title: gettext(\"E-mail\"),\n parent: gettext(\"Options\")\n });\n },\n view: function(ctrl, _) {\n return m('.page.page-options.page-forum-options', [\n _.component('header', {\n title: gettext(\"Change options\")\n }),\n m('.container',\n m('p', 'Lorem ipsum dolor met.')\n )\n ]);\n }\n };\n\n Misago.addService('route:options:email', function(_) {\n _.route('options-email', email);\n },\n {\n after: 'routes'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var forum = {\n controller: function(_) {\n _.auth.denyAnonymous(\n gettext(\"You have to be signed in to change your options.\"));\n\n this.container.title.set({\n title: gettext(\"Forum options\"),\n parent: gettext(\"Options\")\n });\n },\n view: function(ctrl, _) {\n return m('.page.page-options.page-forum-options', [\n _.component('header', {\n title: gettext(\"Options\")\n }),\n m('.container',\n m('p', 'Lorem ipsum dolor met.')\n )\n ]);\n }\n };\n\n Misago.addService('route:options:forum', function(_) {\n _.route('options-forum', forum);\n },\n {\n after: 'routes'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var index = {\n controller: function(_) {\n _.auth.denyAnonymous(\n gettext(\"You have to be signed in to change your options.\"));\n\n _.router.redirect('options_forum');\n }\n };\n\n Misago.addService('route:options', function(_) {\n _.route('options', index);\n },\n {\n after: 'routes'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var password = {\n controller: function(_) {\n _.auth.denyAnonymous(\n gettext(\"You have to be signed in to change your options.\"));\n\n this.container.title.set({\n title: gettext(\"Password\"),\n parent: gettext(\"Options\")\n });\n },\n view: function(ctrl, _) {\n return m('.page.page-options.page-forum-options', [\n _.component('header', {\n title: gettext(\"Change options\")\n }),\n m('.container',\n m('p', 'Lorem ipsum dolor met.')\n )\n ]);\n }\n };\n\n Misago.addService('route:options:password', function(_) {\n _.route('options-password', password);\n },\n {\n after: 'routes'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var forum = {\n view: function(ctrl, _) {\n return m('.list-group.nav-side', [\n\n ]);\n }\n };\n\n Misago.addService('component:options:nav:side', function(_) {\n _.component('options:nav:side', forum);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var viewModel = {\n error: null,\n username: null,\n isReady: false,\n\n init: function(_) {\n this.error = null;\n this.user = null;\n this.isReady = false;\n\n var endpoint = _.api.endpoint('auth').endpoint('activate-account');\n endpoint = endpoint.endpoint(m.route.param('user_id'));\n endpoint = endpoint.endpoint(m.route.param('token'));\n\n return endpoint.post();\n },\n ondata: function(data, _) {\n m.startComputation();\n\n _.title.set(gettext(\"Account activated\"));\n\n this.username = data.username;\n this.isReady = true;\n\n m.endComputation();\n },\n onerror: function(error, _) {\n if (error.status === 400) {\n m.startComputation();\n\n this.error = error;\n this.isReady = true;\n\n m.endComputation();\n } else {\n _.router.errorPage(error);\n }\n }\n };\n\n var activateByToken = {\n controller: function(_) {\n _.auth.denyAuthenticated(\n gettext(\"You have to be signed out to activate account.\"));\n\n _.title.set(gettext(\"Account activation\"));\n this.vm.init(_);\n },\n vm: viewModel,\n view: function(ctrl, _) {\n if (this.vm.error) {\n return this.rejected(this.vm.error, _);\n } else {\n return this.success(this.vm.username, _);\n }\n },\n success: function(username) {\n var message = gettext(\"%(username)s, your account has been successfully activated!\");\n\n return m('.page.page-message.page-message-success',\n m('.container',\n m('.message-panel', [\n m('.message-icon',\n m('span.material-icon', 'check')\n ),\n m('.message-body', [\n m('p.lead',\n interpolate(message, {\n username: username\n }, true)\n ),\n m('p',\n gettext('You can now sign in to finish setting up your account and to participate in or start new discussions.')\n )\n ])\n ])\n )\n );\n },\n rejected: function(error) {\n return m('.page.page-message.page-message-info',\n m('.container',\n m('.message-panel', [\n m('.message-icon',\n m('span.material-icon', 'info_outline')\n ),\n m('.message-body', [\n m('p.lead',\n gettext(\"Your account can't be activated at this time.\")\n ),\n m('p',\n error.detail\n )\n ])\n ])\n )\n );\n },\n loading: function(ctrl, _) {\n return m('.page.page-loading', [\n _.component('loader'),\n m('p.lead', gettext(\"Activating account...\"))\n ]);\n }\n };\n\n Misago.addService('route:activate-by-token', function(_) {\n _.route('activate-by-token', activateByToken);\n },\n {\n after: 'routes'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var viewModel = {\n error: null,\n isReady: false,\n\n form: null,\n\n init: function(_) {\n this.error = null;\n this.user = null;\n this.isReady = false;\n\n var endpoint = _.api.endpoint('auth').endpoint('change-password');\n endpoint = endpoint.endpoint(m.route.param('user_id'));\n endpoint = endpoint.endpoint(m.route.param('token'));\n\n return endpoint.get();\n },\n ondata: function(data, _) {\n m.startComputation();\n\n _.title.set(gettext(\"Change forgotten password\"));\n\n this.form = _.form('change-password');\n this.isReady = true;\n\n m.endComputation();\n },\n onerror: function(error, _) {\n if (error.status === 400) {\n m.startComputation();\n\n this.error = error;\n this.isReady = true;\n\n m.endComputation();\n } else {\n _.router.errorPage(error);\n }\n }\n };\n\n var changePassword = {\n controller: function(_) {\n this.vm.init(_);\n\n return {\n signin: function() {\n _.modal('sign-in');\n }\n };\n },\n vm: viewModel,\n view: function(ctrl, _) {\n if (this.vm.error) {\n return this.rejected(this.vm.error, _);\n } else {\n if (this.vm.form.username) {\n return this.complete(ctrl, this.vm.form.username, _);\n } else {\n return this.form(this.vm.form, _);\n }\n }\n },\n form: function(form, _) {\n return m('.page.page-change-password', [\n _.component('header', {\n title: gettext(\"Change forgotten password\")\n }),\n m('.container',\n m('.row',\n m('.col-md-4.col-md-offset-4',\n m('.well.well-form',\n m('form', {onsubmit: form.submit}, [\n m('.form-group',\n m('.control-input',\n Misago.input({\n disabled: form.isBusy,\n value: form.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: form.isBusy,\n label: gettext(\"Change password\")\n })\n ])\n )\n )\n )\n )\n ]);\n },\n complete: function(ctrl, username, _) {\n var message = gettext(\"%(username)s, your password has been changed successfully.\");\n\n return m('.page.page-message.page-message-success',\n m('.container',\n m('.message-panel', [\n m('.message-icon',\n m('span.material-icon', 'check')\n ),\n m('.message-body', [\n m('p.lead',\n interpolate(message, {\n username: username\n }, true)\n ),\n m('p',\n gettext(\"You can now sign in to your account using your new password.\")\n ),\n m('p',\n _.component('button', {\n class: '.btn-default',\n submit: false,\n label: gettext(\"Sign in\"),\n onclick: ctrl.signin\n })\n )\n ])\n ])\n )\n );\n },\n rejected: function(error) {\n return m('.page.page-message.page-message-info',\n m('.container',\n m('.message-panel', [\n m('.message-icon',\n m('span.material-icon', 'info_outline')\n ),\n m('.message-body', [\n m('p.lead',\n gettext(\"Your account can't be activated at this time.\")\n ),\n m('p',\n error.detail\n )\n ])\n ])\n )\n );\n }\n };\n\n Misago.addService('route:change-password', function(_) {\n _.route('change-password', changePassword);\n },\n {\n after: 'routes'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var errorPage = function(error) {\n var error_message = [\n m('p.lead', error.message)\n ];\n\n if (error.help) {\n error_message.push(m('p.help', error.help));\n }\n\n return m('.page.page-error.page-error-' + error.code,\n m('.container',\n m('.message-panel', [\n m('.message-icon',\n m('span.material-icon', error.icon)\n ),\n m('.message-body', error_message)\n ])\n )\n );\n };\n\n var errorBanned = {\n controller: function() {\n this.container.title.set(gettext('You are banned'));\n },\n view: function(ctrl, message, ban) {\n var error_message = [];\n\n if (ban.message.html) {\n error_message.push(m('.lead', m.trust(ban.message.html)));\n } else if (message) {\n error_message.push(m('p.lead', message));\n } else {\n error_message.push(m('p.lead', gettext('You are banned.')));\n }\n\n var expirationMessage = null;\n if (ban.expires_on) {\n if (ban.expires_on.isAfter(moment())) {\n expirationMessage = interpolate(\n gettext('This ban expires %(expires_on)s.'),\n {'expires_on': ban.expires_on.fromNow()},\n true);\n } else {\n expirationMessage = gettext('This ban has expired.');\n }\n } else {\n expirationMessage = gettext('This ban is permanent.');\n }\n error_message.push(m('p', expirationMessage));\n\n return m('.page.page-error.page-error-banned',\n m('.container',\n m('.message-panel', [\n m('.message-icon',\n m('span.material-icon', 'highlight_off')\n ),\n m('.message-body', error_message)\n ])\n )\n );\n }\n };\n\n var error403 = {\n controller: function() {\n this.container.title.set(gettext('Page not available'));\n },\n view: function(ctrl, message) {\n if (message === \"Permission denied\") {\n message = gettext(\"You don't have permission to access this page.\");\n }\n\n return errorPage({\n code: 403,\n icon: 'remove_circle_outline',\n message: gettext(\"This page is not available.\"),\n help: message\n });\n }\n };\n\n var error404 = {\n controller: function() {\n this.container.title.set(gettext('Page not found'));\n },\n view: function() {\n return errorPage({\n code: 404,\n icon: 'info_outline',\n message: gettext(\"Requested page could not be found.\"),\n help: gettext(\"The link you followed was incorrect or the page has been moved or deleted.\")\n });\n }\n };\n\n var error500 = {\n controller: function() {\n this.container.title.set(gettext('Application error occured'));\n },\n view: function() {\n return errorPage({\n code: 500,\n icon: 'error_outline',\n message: gettext(\"Requested page could not be displayed due to an error.\"),\n help: gettext(\"Please try again later or contact site staff if error persists.\")\n });\n }\n };\n\n var error0 = {\n controller: function() {\n this.container.title.set(gettext('Lost connection with application'));\n },\n view: function() {\n return errorPage({\n code: 0,\n icon: 'sync_problem',\n message: gettext(\"Could not connect to application.\"),\n help: gettext(\"This may be caused by problems with your connection or application server. Please check your internet connection and refresh page if problem persists.\")\n });\n }\n };\n\n Misago.addService('route:error-pages', function(_) {\n _.route('error:banned', errorBanned);\n _.route('error:403', error403);\n _.route('error:404', error404);\n _.route('error:500', error500);\n _.route('error:0', error0);\n },\n {\n after: 'routes'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var index = {\n controller: function(_) {\n document.title = _.settings.forum_index_title || _.settings.forum_name;\n\n return {\n activation: function() {\n _.router.url('request_activation');\n }\n };\n },\n view: function(ctrl, _) {\n return m('.container', [\n m('h1', 'Activation'),\n m('p', 'Test auth blocks'),\n m('p',\n m('a', {href: _.router.url('request_activation')},\n 'Request activation.'\n )\n )\n ]);\n }\n };\n\n Misago.addService('route:index', function(_) {\n _.route('index', index);\n },\n {\n after: 'routes'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var legalPageFactory = function(typeName, defaultTitle) {\n var dashedTypeName = typeName.replace(/_/g, '-');\n\n return {\n controller: function(_) {\n if (Misago.get(_.settings, typeName + '_link')) {\n window.location = Misago.get(_.settings, typeName + '_link');\n } else {\n this.vm.init(this, _);\n }\n },\n vm: {\n page: null,\n isReady: false,\n init: function(component, _) {\n if (this.isReady) {\n _.title.set(this.title);\n } else {\n _.title.set();\n return _.api.model('legal-page', dashedTypeName);\n }\n },\n ondata: function(page, component, _) {\n m.startComputation();\n\n if (page.link) {\n window.location = page.link;\n } else {\n page.title = page.title || defaultTitle;\n this.page = page;\n this.isReady = true;\n\n m.endComputation();\n\n if (component.isActive) {\n _.title.set(this.page.title);\n }\n }\n }\n },\n view: function(ctrl, _) {\n return m('.page.page-legal.page-legal-' + dashedTypeName, [\n _.component('header', {title: this.vm.page.title}),\n m('.container',\n _.component('markup', this.vm.page.body)\n )\n ]);\n }\n };\n };\n\n Misago.addService('route:legal-pages', function(_) {\n _.route('terms-of-service', legalPageFactory(\n 'terms_of_service', gettext('Terms of service')));\n _.route('privacy-policy', legalPageFactory(\n 'privacy_policy', gettext('Privacy policy')));\n },\n {\n after: 'routes'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var ViewModel = function() {\n this.endpoint = 'send-activation';\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 requestActivation = {\n controller: function(_) {\n _.auth.denyAuthenticated(\n gettext(\"You have to be signed out to activate account.\"));\n\n _.title.set(gettext(\"Activate your account\"));\n\n var vm = new ViewModel();\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.completed(ctrl.form, ctrl.vm, _);\n } else {\n return this.form(ctrl.form, _);\n }\n },\n completed: function(form, vm, _) {\n var message = gettext(\"%(username)s, we have sent your activation link to %(email)s.\");\n\n return m('.page.page-message.page-message-success',\n m('.container',\n m('.message-panel', [\n m('.message-icon',\n m('span.material-icon', 'check')\n ),\n m('.message-body', [\n m('p.lead',\n gettext(\"Activation link has been sent.\")\n ),\n m('p',\n interpolate(message, {\n username: vm.user.username,\n email: vm.user.email\n }, true)\n ),\n m('p',\n _.component('button', {\n class: '.btn-default',\n submit: false,\n label: gettext(\"Request another link\"),\n onclick: form.reset.bind(form)\n })\n )\n ])\n ])\n )\n );\n },\n form: function(form, _) {\n return m('.page.page-request-activation', [\n _.component('header', {\n title: gettext(\"Request activation link\")\n }),\n m('.container',\n m('.row', [\n m('.col-md-8', [\n m('p',\n gettext(\"Site administrator may impose requirement on newly regitered accounts to be activated before users will be able to sign in.\")\n ),\n m('p',\n gettext(\"Depending on time of registration, you will be able activate your account by clicking special activation link. This link will be valid only for your browser, for seven days or until your account is activated.\")\n ),\n m('p',\n gettext(\"To receive this link, enter your account's e-mail addres in form and press \\\"Send link\\\" button.\")\n )\n ]),\n m('.col-md-4',\n _.component('request-link-form', form)\n )\n ])\n )\n ]);\n }\n };\n\n Misago.addService('route:request-activation', function(_) {\n _.route('request-activation', requestActivation);\n },\n {\n after: 'routes'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var ViewModel = function() {\n this.endpoint = 'send-password-form';\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 this.activation = rejection.code;\n this.activationMessage = rejection.detail;\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 requestPasswordChange = {\n controller: function(_) {\n _.title.set(gettext(\"Change forgotten password\"));\n\n var vm = new ViewModel();\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.completed(ctrl.form, ctrl.vm, _);\n } else if (ctrl.vm.activation) {\n return this.inactive(ctrl.form, ctrl.vm, _);\n } else {\n return this.form(ctrl.form, _);\n }\n },\n completed: function(form, vm, _) {\n var message = gettext(\"%(username)s, we have sent link to your password change form to %(email)s.\");\n\n return m('.page.page-message.page-message-success',\n m('.container',\n m('.message-panel', [\n m('.message-icon',\n m('span.material-icon', 'check')\n ),\n m('.message-body', [\n m('p.lead',\n gettext(\"Change password form link sent.\")\n ),\n m('p',\n interpolate(message, {\n username: vm.user.username,\n email: vm.user.email\n }, true)\n ),\n m('p',\n _.component('button', {\n class: '.btn-default',\n submit: false,\n label: gettext(\"Request another link\"),\n onclick: form.reset.bind(form)\n })\n )\n ])\n ])\n )\n );\n },\n inactive: function(form, vm, _) {\n var activateButton = null;\n\n if (vm.activation === 'inactive_user') {\n activateButton = m('a.btn.btn-primary',\n {href: _.router.url('request_activation')},\n gettext(\"Activate account\")\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 vm.activationMessage\n ),\n m('p', [\n activateButton,\n _.component('button', {\n class: '.btn-default',\n submit: false,\n label: gettext(\"Request another link\"),\n onclick: form.reset.bind(form)\n })\n ])\n ])\n ])\n )\n );\n },\n form: function(form, _) {\n return m('.page.page-request-activation', [\n _.component('header', {\n title: gettext(\"Change forgotten password\")\n }),\n m('.container',\n m('.row', [\n m('.col-md-8', [\n m('p',\n gettext(\"Because user passwords are processed in an irreversible way before being saved to database, it is not possible for us to simply send you your password.\")\n ),\n m('p',\n gettext(\"Instead, you can change your password using special secure form that will be available by special link valid only for your browser, for seven days or until your password is changed.\")\n ),\n m('p',\n gettext(\"To receive this link, enter your account's e-mail addres in form and press \\\"Send link\\\" button.\")\n )\n ]),\n m('.col-md-4',\n _.component('request-link-form', form)\n )\n ])\n )\n ]);\n }\n };\n\n Misago.addService('route:request-password-change', function(_) {\n _.route('request-password-change', requestPasswordChange);\n },\n {\n after: 'routes'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var brand = {\n view: function(ctrl, branding, _) {\n var children = [\n m('img', {\n src: _.router.staticUrl('misago/img/site-logo.png'),\n alt: _.settings.forum_name\n })\n ];\n\n if (branding) {\n children.push(branding);\n }\n\n return m('a.navbar-brand', {href: _.router.url('index')}, children);\n }\n };\n\n Misago.addService('component:navbar:desktop:brand', function(_) {\n _.component('navbar:desktop:brand', brand);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var 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 view: function(ctrl, links) {\n return m('ul.nav.navbar-nav', [\n links.map(function(link) {\n return m('li',\n m(\"a\", link.config || {href: link.url},\n link.label\n )\n );\n })\n ]);\n }\n };\n\n Misago.addService('component:navbar:desktop:main-nav', function(_) {\n _.component('navbar:desktop:main-nav', nav);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var navbar = {\n view: function(ctrl, mainNav, _) {\n var brand = null;\n var user = null;\n\n if (_.settings.forum_branding_display) {\n brand = _.component(\n 'navbar:desktop:brand', _.settings.forum_branding_text);\n }\n\n if (_.user.isAuthenticated) {\n user = _.component('navbar:desktop:user-nav');\n } else {\n user = _.component('navbar:desktop:guest-nav');\n }\n\n return m('.container.navbar-full.hidden-xs.hidden-sm', [\n brand,\n _.component('navbar:desktop:main-nav', mainNav),\n user\n ]);\n }\n };\n\n Misago.addService('component:navbar:desktop', function(_) {\n _.component('navbar:desktop', navbar);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var nav = {\n controller: function() {\n return {\n dropdownToggle: {\n href: '/not-yet/',\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 return m(\n '.alerts',\n {\n config: persistent,\n class: _.alert.isVisible ? 'in' : 'out'\n },\n m('p.alert',\n {\n class: this.classes[_.alert.type]\n },\n _.alert.message\n )\n );\n }\n };\n\n Misago.addService('component:alert', function(_) {\n _.component('alert', alert);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n 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 button = {\n view: function(ctrl, kwargs) {\n var options = {\n disabled: kwargs.disabled || kwargs.loading || false,\n config: kwargs.config || null,\n loading: kwargs.loading || false,\n type: kwargs.submit ? 'submit' : 'button',\n onclick: kwargs.onclick || null\n };\n\n var element = 'button[type=\"' + options.type + '\"].btn';\n if (options.loading) {\n element += '.btn-loading';\n }\n\n if (kwargs.id) {\n element += '#' + kwargs.id;\n }\n\n element += (kwargs.class || '');\n\n var label = kwargs.label;\n if (options.loading) {\n label = [\n label,\n m('.loader-compact', [\n m('.bounce1'),\n m('.bounce2'),\n m('.bounce3')\n ])\n ];\n }\n\n return m(element, options, label);\n },\n };\n\n Misago.addService('component:button', function(_) {\n _.component('button', button);\n },\n {\n after: 'components'\n });\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var textFields = ['text', 'password', 'email'];\n\n var formGroup = {\n view: function(ctrl, kwargs) {\n var groupClass = '.form-group';\n var errors = null;\n var helpText = null;\n\n var controlType = kwargs.control.attrs.type;\n var controlId = kwargs.control.attrs.id;\n\n var feedbackId = controlId + '_feedback';\n var feedbackIcon = null;\n var showFeedbackIcon = null;\n\n var isValidated = kwargs.validationKey && kwargs.validation !== null;\n\n kwargs.control.attrs['aria-describedby'] = '';\n\n if (isValidated && kwargs.validation[kwargs.validationKey]) {\n showFeedbackIcon = textFields.indexOf(controlType) >= 0;\n kwargs.control.attrs['aria-describedby'] = feedbackId;\n\n if (kwargs.validation[kwargs.validationKey] === true) {\n groupClass += '.has-success';\n feedbackIcon = [\n m('span.material-icon.form-control-feedback',\n {\n 'aria-hidden': 'true'\n },\n 'check'\n ),\n m('span.sr-only#' + feedbackId, gettext(\"(success)\"))\n ];\n } else {\n groupClass += '.has-error';\n errors = kwargs.validation[kwargs.validationKey];\n feedbackIcon = [\n m('span.material-icon.form-control-feedback',\n {\n 'aria-hidden': 'true'\n },\n 'clear'\n ),\n m('span.sr-only#' + feedbackId, gettext(\"(error)\"))\n ];\n }\n }\n\n if (kwargs.helpText) {\n if (typeof kwargs.helpText === 'string' ||\n kwargs.helpText instanceof String) {\n helpText = m('p.help-block', kwargs.helpText);\n } else {\n helpText = kwargs.helpText;\n }\n }\n\n return m(groupClass, [\n m('label.control-label' + (kwargs.labelClass || ''),\n {\n for: kwargs.labelFor || controlId\n },\n kwargs.label + ':'\n ),\n m(kwargs.controlClass || '', [\n kwargs.control,\n showFeedbackIcon ? feedbackIcon : null,\n errors ? m('.help-block.errors', errors.map(function(item) {\n return m('p', item);\n })) : null,\n helpText\n ])\n ]);\n },\n };\n\n Misago.addService('component:form-group', function(_) {\n _.component('form-group', formGroup);\n },\n {\n after: 'components'\n });\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var persistent = function(el, isInit, context) {\n context.retain = true;\n };\n\n var forumLayout = {\n view: function(ctrl, _) {\n return [\n _.component('auth-changed-message'),\n _.component('alert'),\n _.component('navbar'),\n m('.navbar-dropdown',\n _.dropdown.slot('navbar-dropdown')\n ),\n m('#router-fixture', {config: persistent}),\n _.component('footer'),\n _.component('modal')\n ];\n }\n };\n\n Misago.addService('component:layout', function(_) {\n _.component('forum-layout', forumLayout);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var loader = {\n view: function() {\n return m('.loader.sk-folding-cube', [\n m('.sk-cube1.sk-cube'),\n m('.sk-cube2.sk-cube'),\n m('.sk-cube4.sk-cube'),\n m('.sk-cube3.sk-cube')\n ]);\n }\n };\n\n Misago.addService('component:loader', function(_) {\n _.component('loader', loader);\n },\n {\n after: 'components'\n });\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var persistent = function(el, isInit, context) {\n context.retain = true;\n };\n\n var markup = {\n view: function(ctrl, content) {\n return m('article.misago-markup', {config: persistent},\n m.trust(content)\n );\n }\n };\n\n Misago.addService('component:markup', function(_) {\n _.component('markup', markup);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var persistent = function(el, isInit, context) {\n context.retain = true;\n };\n\n var modal = {\n view: function() {\n return m(\n '#misago-modal.modal.fade[role=\"dialog\"]',\n {\n config: persistent,\n tabindex: \"-1\",\n \"aria-labelledby\": \"misago-modal-label\"\n }\n );\n }\n };\n\n Misago.addService('component:modal', function(_) {\n _.component('modal', modal);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var header = {\n view: function(ctrl, options) {\n return m('.page-header',\n m('.container', [\n m('h1', options.title),\n ])\n );\n }\n };\n\n Misago.addService('component:header', function(_) {\n _.component('header', header);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var persistent = function(el, isInit, context) {\n context.retain = true;\n };\n\n var styles = [\n 'progress-bar-danger',\n 'progress-bar-warning',\n 'progress-bar-warning',\n 'progress-bar-primary',\n 'progress-bar-success'\n ];\n\n var labels = [\n gettext('Entered password is very weak.'),\n gettext('Entered password is weak.'),\n gettext('Entered password is average.'),\n gettext('Entered password is strong.'),\n gettext('Entered password is very strong.')\n ];\n\n var passwordStrength = {\n view: function(ctrl, kwargs, _) {\n var score = _.zxcvbn.scorePassword(kwargs.password, kwargs.inputs);\n var options = {\n config: persistent,\n class: styles[score],\n style: \"width: \" + (20 + (20 * score)) + '%',\n 'role': \"progressbar\",\n 'aria-valuenow': score,\n 'aria-valuemin': \"0\",\n 'aria-valuemax': \"4\"\n };\n\n return m('.help-block.password-strength', {key: 'password-strength'}, [\n m('.progress',\n m('.progress-bar', options,\n m('span.sr-only', labels[score])\n )\n ),\n m('p.text-small', labels[score])\n ]);\n },\n };\n\n Misago.addService('component:password-strength', function(_) {\n _.component('password-strength', passwordStrength);\n },\n {\n after: 'components'\n });\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var avatar = {\n defaultSize: 100,\n\n src: function(user, size, _) {\n var src = _.router.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 navbar = {\n style: '.navbar.navbar-misago.navbar-default.navbar-static-top',\n mainNav: function(_) {\n var links = [\n {\n label: gettext(\"Threads\"),\n icon: 'chat',\n url: _.router.url('index')\n },\n {\n label: gettext(\"Forums\"),\n icon: 'forum',\n url: '/not-yet/forums/'\n },\n {\n label: gettext(\"Users\"),\n icon: 'group',\n url: '/not-yet/users/'\n }\n ];\n\n return links;\n },\n view: function(ctrl, _) {\n var links = this.mainNav(_);\n\n return m('nav' + this.style + '[role=\"navigation\"]', [\n _.component('navbar:desktop', links),\n _.component('navbar:mobile', links)\n ]);\n }\n };\n\n Misago.addService('component:navbar', function(_) {\n _.component('navbar', navbar);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var 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 navbar = {\n style: '.nav.navbar-nav.navbar-compact-nav.hidden-md.hidden-lg',\n controller: function(links, _) {\n return {\n openUserMenu: function() {\n if (_.user.isAuthenticated) {\n _.dropdown.toggle('navbar-dropdown', 'navbar:dropdown:user');\n } else {\n _.dropdown.toggle('navbar-dropdown', 'navbar:dropdown:guest');\n }\n\n return false;\n }\n };\n },\n userMenu: function(ctrl, _) {\n if (_.user.isAuthenticated) {\n return {\n element: _.component('user-avatar', _.user, 64),\n config: {\n onclick: ctrl.openUserMenu,\n url: '/not-yet/',\n\n 'data-misago-routed': 'false'\n }\n };\n } else {\n return {\n element: _.component('user-avatar', null, 64),\n config: {\n onclick: ctrl.openUserMenu,\n href: '#',\n\n 'data-misago-routed': 'false'\n }\n };\n }\n },\n mobileNav: function(ctrl, links, _) {\n var mobileLinks = [\n {\n element: m('img', {\n src: _.router.staticUrl('misago/img/site-icon.png'),\n alt: _.settings.forum_name\n }),\n url: _.router.url('index')\n }\n ];\n\n links.forEach(function(link) {\n if (link.url !== mobileLinks[0].url) {\n mobileLinks.push(link);\n }\n });\n\n mobileLinks.push(this.userMenu(ctrl, _));\n\n return mobileLinks;\n },\n view: function(ctrl, links, _) {\n var mobileLinks = this.mobileNav(ctrl, links, _);\n\n return m('ul' + this.style + '.with-' + mobileLinks.length + '-items',\n mobileLinks.map(function(link) {\n return m('li',\n m('a', link.config || {href: link.url},\n link.element || m('span.material-icon', {title:link.label},\n link.icon\n )\n )\n );\n })\n );\n }\n };\n\n Misago.addService('component:navbar:mobile', function(_) {\n _.component('navbar:mobile', navbar);\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: '/not-yet/'}, [\n m('span.material-icon',\n 'account_circle'\n ),\n gettext(\"See your profile\")\n ])\n ),\n m('li',\n m('a', {href: _.router.url('options')}, [\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 footer = {\n hasNav: function(_) {\n return [\n !!_.settings.forum_footnote,\n !!_.settings.terms_of_service,\n !!_.settings.terms_of_service_link,\n !!_.settings.privacy_policy,\n !!_.settings.privacy_policy_link\n ].indexOf(true) !== -1;\n },\n view: function(ctrl, _) {\n var nav = null;\n if (this.hasNav(_)) {\n nav = _.component('footer:nav');\n }\n\n return m('footer.forum-footer', [\n m('.container',\n m('.footer-content', [\n nav,\n _.component('footer:branding')\n ])\n )\n ]);\n }\n };\n\n Misago.addService('component:footer', function(_) {\n _.component('footer', footer);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var branding = {\n view: function() {\n return m('a.misago-branding[href=http://misago-project.org]', [\n \"powered by \", m('strong', \"misago\")\n ]);\n }\n };\n\n Misago.addService('component:footer:branding', function(_) {\n _.component('footer:branding', branding);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var legalLink = function(_, legalType, defaultTitle) {\n var url = Misago.get(_.settings, legalType + '_link');\n if (!url && Misago.get(_.settings, legalType)) {\n url = _.router.url(legalType);\n }\n\n if (url) {\n return m('li',\n m('a', {href: url},\n Misago.get(_.settings, legalType + '_title', defaultTitle)\n )\n );\n } else {\n return null;\n }\n };\n\n var nav = {\n isVisible: function(settings) {\n return [\n !!settings.forum_footnote,\n !!settings.terms_of_service,\n !!settings.terms_of_service_link,\n !!settings.privacy_policy,\n !!settings.privacy_policy_link\n ].indexOf(true) !== -1;\n },\n view: function(ctrl, _) {\n var items = [];\n\n if (_.settings.forum_footnote) {\n items.push(m('li.forum-footnote', m.trust(_.settings.forum_footnote)));\n }\n\n items.push(\n legalLink(_, 'terms_of_service', gettext('Terms of service')));\n items.push(\n legalLink(_, 'privacy_policy', gettext('Privacy policy')));\n\n return m('ul.list-inline.footer-nav', items);\n }\n };\n\n Misago.addService('component:footer:nav', function(_) {\n _.component('footer:nav', nav);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var form = {\n view: function(ctrl, form, _) {\n return m('.well.well-form',\n m('form', {onsubmit: form.submit}, [\n m('.form-group',\n m('.control-input',\n Misago.input({\n disabled: form.isBusy,\n value: form.email,\n placeholder: gettext(\"Your e-mail address\")\n })\n )\n ),\n _.component('button', {\n class: '.btn-primary.btn-block',\n submit: true,\n loading: form.isBusy,\n label: gettext(\"Send link\")\n })\n ])\n );\n }\n };\n\n Misago.addService('component:request-link-form', function(_) {\n _.component('request-link-form', form);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var header = {\n view: function(ctrl, title) {\n return m('.modal-header', [\n m('button.close[type=\"button\"]',\n {'data-dismiss': 'modal', 'aria-label': gettext('Close')},\n m('span', {'aria-hidden': 'true'}, m.trust('×'))\n ),\n m('h4#misago-modal-label.modal-title', title)\n ]);\n }\n };\n\n Misago.addService('component:modal:header', function(_) {\n _.component('modal:header', header);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var persistent = function(el, isInit, context) {\n context.retain = true;\n };\n\n var refresh = function() {\n document.location.reload();\n };\n\n var registerComplete = {\n controller: function(message, _) {\n if (message.activation === 'active') {\n _.runloop.runOnce(\n refresh, 'refresh-after-registration', 10000);\n }\n },\n view: function(ctrl, message, _) {\n var messageHtml = null;\n\n if (message.activation === 'active') {\n messageHtml = this.active(message);\n } else {\n messageHtml = this.inactive(message);\n }\n\n return m('.modal-dialog.modal-message.modal-register[role=\"document\"]',\n {config: persistent},\n m('.modal-content', [\n _.component('modal:header', gettext('Registration complete')),\n m('.modal-body',\n messageHtml\n )\n ])\n );\n },\n active: function(message) {\n var lead = gettext(\"%(username)s, your account has been created and you were signed in.\");\n return [\n m('.message-icon',\n m('span.material-icon', 'check')\n ),\n m('.message-body', [\n m('p.lead',\n interpolate(lead, {'username': message.username}, true)\n ),\n m('p',\n gettext('The page will refresh automatically in 10 seconds.')\n ),\n m('p',\n m('button[type=\"button\"].btn.btn-default', {onclick: refresh},\n gettext('Refresh page')\n )\n )\n ])\n ];\n },\n inactive: function(message) {\n var lead = null;\n var help = null;\n\n if (message.activation === 'user') {\n lead = gettext(\"%(username)s, your account has been created but you need to activate it before you will be able to sign in.\");\n help = gettext(\"We have sent an e-mail to %(email)s with link that you have to click to activate your account.\");\n } else if (message.activation === 'admin') {\n lead = gettext(\"%(username)s, your account has been created but board administrator will have to activate it before you will be able to sign in.\");\n help = gettext(\"We will send an e-mail to %(email)s when this takes place.\");\n }\n\n return [\n m('.message-icon',\n m('span.material-icon', 'info_outline')\n ),\n m('.message-body', [\n m('p.lead',\n interpolate(lead, {'username': message.username}, true)\n ),\n m('p',\n interpolate(help, {'email': message.email}, true)\n )\n ])\n ];\n }\n };\n\n Misago.addService('modal:register-complete', function(_) {\n _.modal('register-complete', registerComplete);\n },\n {\n after: 'modals'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var persistent = function(el, isInit, context) {\n context.retain = true;\n };\n\n var register = {\n controller: function(_) {\n return {\n form: _.form('register')\n };\n },\n view: function(ctrl, _) {\n var captcha = _.captcha.component({\n form: ctrl.form,\n\n labelClass: '.col-md-4',\n controlClass: '.col-md-8'\n });\n\n var footnote = null;\n var termsUrl = _.settings.terms_of_service_link;\n\n if (!termsUrl && _.settings.terms_of_service) {\n termsUrl = _.router.url('terms_of_service');\n }\n\n if (termsUrl) {\n footnote = m('a', {href: termsUrl},\n m.trust(interpolate(gettext(\"By registering you agree to site's %(terms)s.\"), {\n terms: '<strong>' + gettext(\"terms and conditions\") + '</strong>'\n }, true))\n );\n }\n\n return m('.modal-dialog.modal-form.modal-register[role=\"document\"]',\n {config: persistent},\n m('.modal-content', [\n _.component('modal:header', gettext('Register')),\n m('form.form-horizontal',\n {\n onsubmit: ctrl.form.submit\n },\n [\n m('input[type=\"text\"]', {\n name:'_username',\n style: 'display: none'\n }),\n m('input[type=\"password\"]', {\n name:'_password',\n style: 'display: none'\n }),\n m('.modal-body', [\n _.component('form-group', {\n label: gettext(\"Username\"),\n labelClass: '.col-md-4',\n controlClass: '.col-md-8',\n control: _.input({\n value: _.validate(ctrl.form, 'username'),\n id: 'id_username',\n disabled: ctrl.form.isBusy\n }),\n validation: ctrl.form.errors,\n validationKey: 'username'\n }),\n _.component('form-group', {\n label: gettext(\"E-mail\"),\n labelClass: '.col-md-4',\n controlClass: '.col-md-8',\n control: _.input({\n value: _.validate(ctrl.form, 'email'),\n id: 'id_email',\n disabled: ctrl.form.isBusy\n }),\n validation: ctrl.form.errors,\n validationKey: 'email'\n }),\n _.component('form-group', {\n label: gettext(\"Password\"),\n labelClass: '.col-md-4',\n controlClass: '.col-md-8',\n control: _.input({\n value: _.validate(ctrl.form, 'password'),\n type: 'password',\n id: 'id_password',\n disabled: ctrl.form.isBusy\n }),\n validation: ctrl.form.errors,\n validationKey: 'password',\n helpText: _.component('password-strength', {\n inputs: [\n ctrl.form.username(),\n ctrl.form.email()\n ],\n password: ctrl.form.password()\n })\n }),\n captcha\n ]),\n m('.modal-footer', [\n footnote,\n _.component('button', {\n class: '.btn-primary',\n submit: true,\n loading: ctrl.form.isBusy,\n label: gettext(\"Register account\")\n })\n ])\n ])\n ])\n );\n }\n };\n\n Misago.addService('modal:register', function(_) {\n _.modal('register', register);\n },\n {\n after: 'modals'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n function persistent(el, isInit, context) {\n context.retain = true;\n }\n\n var signin = {\n controller: function(_) {\n return {\n form: _.form('sign-in')\n };\n },\n view: function(ctrl, _) {\n var activateButton = null;\n\n if (ctrl.form.showActivation) {\n activateButton = m('a.btn.btn-block.btn-success',\n {href: _.router.url('request_activation')},\n gettext(\"Activate account\")\n );\n }\n\n return m('.modal-dialog.modal-sm.modal-signin[role=\"document\"]',\n {config: persistent},\n m('.modal-content', [\n _.component('modal:header', gettext(\"Sign in\")),\n m('form', {onsubmit: ctrl.form.submit}, [\n m('.modal-body', [\n m('.form-group',\n m('.control-input',\n Misago.input({\n disabled: ctrl.form.isBusy,\n value: ctrl.form.username,\n placeholder: gettext(\"Username or e-mail\")\n })\n )\n ),\n m('.form-group',\n m('.control-input',\n Misago.input({\n type: 'password',\n disabled: ctrl.form.isBusy,\n value: ctrl.form.password,\n placeholder: gettext(\"Password\")\n })\n )\n )\n ]),\n m('.modal-footer', [\n activateButton,\n _.component('button', {\n class: '.btn-primary.btn-block',\n submit: true,\n loading: ctrl.form.isBusy,\n label: gettext(\"Sign in\")\n }),\n m('a.btn.btn-block.btn-default',\n {href: _.router.url('request_password_change')},\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 ChangePassword = function(_) {\n var self = this;\n\n this.username = null;\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 var endpoint = _.api.endpoint('auth').endpoint('change-password');\n endpoint = endpoint.endpoint(m.route.param('user_id'));\n endpoint = endpoint.endpoint(m.route.param('token'));\n\n endpoint.post({\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 this.username = user.username;\n };\n\n this.error = function(rejection) {\n if (rejection.status === 403 && rejection.ban) {\n _.router.error403({\n message: '',\n ban: rejection.ban\n });\n } else if (rejection.status === 400) {\n _.alert.error(rejection.detail);\n } else {\n _.api.alert(rejection);\n }\n };\n };\n\n Misago.addService('form:change-password', function(_) {\n _.form('change-password', ChangePassword);\n },\n {\n after: 'forms'\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 _.api.endpoint('auth').endpoint(vm.endpoint).post({\n email: self.email()\n }).then(function(user) {\n self.success(user);\n }, function(error) {\n self.error(error);\n });\n };\n\n this.success = function(user) {\n vm.success(user);\n };\n\n this.error = function(rejection) {\n if (rejection.status === 400) {\n vm.error(rejection, _);\n } else if (rejection.status === 403 && rejection.ban) {\n _.router.error403({\n message: '',\n ban: rejection.ban\n });\n } else {\n _.api.alert(rejection);\n }\n };\n\n this.reset = function() {\n this.email('');\n 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 _.modal();\n _.router.error403({\n message: '',\n ban: rejection.detail\n });\n } else {\n _.alert.error(rejection.detail);\n }\n } else {\n _.api.alert(rejection);\n }\n };\n };\n\n Misago.addService('form:sign-in', function(_) {\n _.form('sign-in', SignIn);\n },\n {\n after: 'forms'\n });\n} (Misago.prototype));\n\n(function (Misago, UrlConf) {\n 'use strict';\n\n var urls = new UrlConf();\n\n // Board index\n urls.url('/', 'index');\n\n // Account activation\n urls.url('/activation/', 'request_activation');\n urls.url('/activation/:user_id/:token/', 'activate_by_token');\n\n // Password reset\n urls.url('/forgotten-password/', 'request_password_change');\n urls.url('/forgotten-password/:user_id/:token/', 'change_password');\n\n // User control panel\n urls.url('/options/', 'options');\n urls.url('/options/forum/', 'options_forum');\n urls.url('/options/email/', 'options_email');\n urls.url('/options/password/', 'options_password');\n\n // Legal pages\n urls.url('/terms-of-service/', 'terms_of_service');\n urls.url('/privacy-policy/', 'privacy_policy');\n\n // Catch-all 404 not found route\n urls.url('/:rest...', 'error:404', 'not_found');\n\n Misago.urls = urls;\n} (Misago.prototype, Misago.prototype.UrlConf));\n"],"sourceRoot":"/source/"}
|
|
|
|
|
|
+{"version":3,"sources":["misago.js"],"names":["window","Misago","ns","Object","getPrototypeOf","this","self","_initServices","services","orderedServices","OrderedList","order","forEach","item","factory","undefined","serviceInstance","key","_destroyServices","reverse","destroy","context","SETTINGS","setup","init","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","denyAuthenticated","denyAnonymous","isAnonymous","NoCaptcha","load","QACaptcha","question","prop","label","labelClass","controlClass","control","validate","form","isBusy","validation","errors","validationKey","helpText","help_text","validator","ReCaptcha","included","wait","grecaptcha","reset","controlConfig","render","sitekey","settings","recaptcha_site_key","getResponse","clean","captcha","Captcha","types","no","qa","re","captcha_type","_components","argumentsArray","dropdownConfig","on","removeClass","off","Dropdown","slots","slot","toggle","getElementById","hasChildNodes","mount","addClass","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","remove","modal","open","hide","_modal","_modals","Models","classes","deserializers","String","json","locale","RunLoop","_intervals","stopInterval","clearTimeout","run","callable","delay","setTimeout","result","loop","ticks","PageTitle","forum_name","title","_set_complex","completeTitle","page","page_label","interpolate","parent","EMAIL","USERNAME","validators","required","trim","email","minLength","limit_value","returnMessage","ngettext","show_value","maxLength","usernameMinLength","username_length_min","usernameMaxLength","username_length_max","usernameContent","passwordMinLength","password_length_min","validateField","validateForm","isValid","Zxcvbn","scorePassword","password","inputs","zxcvbn","score","Ban","html","plain","expires_on","deserializeBan","class","LegalPage","body","Rank","slug","description","css_class","is_tab","User","username","full_title","rank","avatar_hash","acl","absolute_url","deserializeUser","joined_on","ctrl","onsubmit","header","data-dismiss","aria-label","aria-hidden","trust","refresh","location","reload","registerComplete","activation","messageHtml","active","inactive","lead","onclick","help","register","footnote","termsUrl","terms_of_service_link","terms_of_service","router","href","terms","style","signin","activateButton","showActivation","REQUEST_ACTIVATION_URL","FORGOTTEN_PASSWORD_URL","dropdown","showSignIn","navbar","links","openUserMenu","userMenu","data-misago-routed","mobileNav","mobileLinks","src","alt","icon","button","showRegister","account_activation","sync","logout","decision","confirm","USERCP_URL","nav","dropdownToggle","data-toggle","aria-haspopup","aria-expanded","authChanged","auth","textFields","formGroup","groupClass","controlType","attrs","controlId","feedbackId","feedbackIcon","showFeedbackIcon","isValidated","for","labelFor","loader","markup","content","styles","labels","passwordStrength","role","aria-valuenow","aria-valuemin","aria-valuemax","avatar","defaultSize","size","finalSize","width","height","ChangePassword","route","param","ban","error403","Register","RequestLink","SignIn","$form","find","val","code","dataset","componentName","mountDesktop"],"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 // Access controls\n this.denyAuthenticated = function(message) {\n if (_.user.isAuthenticated) {\n throw new Misago.PermissionDenied(\n message || gettext(\"This page is not available to signed in users.\"));\n }\n };\n\n this.denyAnonymous = function(message) {\n if (_.user.isAnonymous) {\n throw new Misago.PermissionDenied(\n message || gettext(\"This page is not available to guests.\"));\n }\n };\n };\n\n Misago.addService('auth',\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 dropdownConfig = function(element, isInit, context) {\n if (!isInit) {\n context.retain = true;\n\n $(element).on('click', function() {\n $(element).removeClass('open');\n });\n\n context.onunload = function() {\n $(element).removeClass('open');\n $(element).off();\n };\n }\n };\n\n var Dropdown = function(_) {\n var slots = {};\n\n this.slot = function(name) {\n return m('#dropdown-' + name + '.dropdown.mobile-dropdown', {\n config: dropdownConfig\n });\n };\n\n this.toggle = function(slot, component) {\n var element = document.getElementById('dropdown-' + slot);\n\n if (element.hasChildNodes() && slots[slot] === component) {\n slots[slot] = null;\n m.mount(element, null);\n $(element).removeClass('open');\n } else {\n slots[slot] = component;\n m.mount(element, _.component(component));\n $(element).addClass('open');\n }\n };\n };\n\n Misago.addService('dropdown', {\n factory: function(_) {\n return new Dropdown(_);\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('misago-modal');\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:page-component'\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 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('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 form = {\n view: function(ctrl, form, _) {\n return m('.well.well-form',\n m('form', {onsubmit: form.submit}, [\n m('.form-group',\n m('.control-input',\n Misago.input({\n disabled: form.isBusy,\n value: form.email,\n placeholder: gettext(\"Your e-mail address\")\n })\n )\n ),\n _.component('button', {\n class: '.btn-primary.btn-block',\n submit: true,\n loading: form.isBusy,\n label: gettext(\"Send link\")\n })\n ])\n );\n }\n };\n\n Misago.addService('component:request-link-form', function(_) {\n _.component('request-link-form', form);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var header = {\n view: function(ctrl, title) {\n return m('.modal-header', [\n m('button.close[type=\"button\"]',\n {'data-dismiss': 'modal', 'aria-label': gettext('Close')},\n m('span', {'aria-hidden': 'true'}, m.trust('×'))\n ),\n m('h4#misago-modal-label.modal-title', title)\n ]);\n }\n };\n\n Misago.addService('component:modal:header', function(_) {\n _.component('modal:header', header);\n },\n {\n after: 'components'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var persistent = function(el, isInit, context) {\n context.retain = true;\n };\n\n var refresh = function() {\n document.location.reload();\n };\n\n var registerComplete = {\n controller: function(message, _) {\n if (message.activation === 'active') {\n _.runloop.runOnce(\n refresh, 'refresh-after-registration', 10000);\n }\n },\n view: function(ctrl, message, _) {\n var messageHtml = null;\n\n if (message.activation === 'active') {\n messageHtml = this.active(message);\n } else {\n messageHtml = this.inactive(message);\n }\n\n return m('.modal-dialog.modal-message.modal-register[role=\"document\"]',\n {config: persistent},\n m('.modal-content', [\n _.component('modal:header', gettext('Registration complete')),\n m('.modal-body',\n messageHtml\n )\n ])\n );\n },\n active: function(message) {\n var lead = gettext(\"%(username)s, your account has been created and you were signed in.\");\n return [\n m('.message-icon',\n m('span.material-icon', 'check')\n ),\n m('.message-body', [\n m('p.lead',\n interpolate(lead, {'username': message.username}, true)\n ),\n m('p',\n gettext('The page will refresh automatically in 10 seconds.')\n ),\n m('p',\n m('button[type=\"button\"].btn.btn-default', {onclick: refresh},\n gettext('Refresh page')\n )\n )\n ])\n ];\n },\n inactive: function(message) {\n var lead = null;\n var help = null;\n\n if (message.activation === 'user') {\n lead = gettext(\"%(username)s, your account has been created but you need to activate it before you will be able to sign in.\");\n help = gettext(\"We have sent an e-mail to %(email)s with link that you have to click to activate your account.\");\n } else if (message.activation === 'admin') {\n lead = gettext(\"%(username)s, your account has been created but board administrator will have to activate it before you will be able to sign in.\");\n help = gettext(\"We will send an e-mail to %(email)s when this takes place.\");\n }\n\n return [\n m('.message-icon',\n m('span.material-icon', 'info_outline')\n ),\n m('.message-body', [\n m('p.lead',\n interpolate(lead, {'username': message.username}, true)\n ),\n m('p',\n interpolate(help, {'email': message.email}, true)\n )\n ])\n ];\n }\n };\n\n Misago.addService('modal:register-complete', function(_) {\n _.modal('register-complete', registerComplete);\n },\n {\n after: 'modals'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var persistent = function(el, isInit, context) {\n context.retain = true;\n };\n\n var register = {\n controller: function(_) {\n return {\n form: _.form('register')\n };\n },\n view: function(ctrl, _) {\n var captcha = _.captcha.component({\n form: ctrl.form,\n\n labelClass: '.col-md-4',\n controlClass: '.col-md-8'\n });\n\n var footnote = null;\n var termsUrl = _.settings.terms_of_service_link;\n\n if (!termsUrl && _.settings.terms_of_service) {\n termsUrl = _.router.url('terms_of_service');\n }\n\n if (termsUrl) {\n footnote = m('a', {href: termsUrl},\n m.trust(interpolate(gettext(\"By registering you agree to site's %(terms)s.\"), {\n terms: '<strong>' + gettext(\"terms and conditions\") + '</strong>'\n }, true))\n );\n }\n\n return m('.modal-dialog.modal-form.modal-register[role=\"document\"]',\n {config: persistent},\n m('.modal-content', [\n _.component('modal:header', gettext('Register')),\n m('form.form-horizontal',\n {\n onsubmit: ctrl.form.submit\n },\n [\n m('input[type=\"text\"]', {\n name:'_username',\n style: 'display: none'\n }),\n m('input[type=\"password\"]', {\n name:'_password',\n style: 'display: none'\n }),\n m('.modal-body', [\n _.component('form-group', {\n label: gettext(\"Username\"),\n labelClass: '.col-md-4',\n controlClass: '.col-md-8',\n control: _.input({\n value: _.validate(ctrl.form, 'username'),\n id: 'id_username',\n disabled: ctrl.form.isBusy\n }),\n validation: ctrl.form.errors,\n validationKey: 'username'\n }),\n _.component('form-group', {\n label: gettext(\"E-mail\"),\n labelClass: '.col-md-4',\n controlClass: '.col-md-8',\n control: _.input({\n value: _.validate(ctrl.form, 'email'),\n id: 'id_email',\n disabled: ctrl.form.isBusy\n }),\n validation: ctrl.form.errors,\n validationKey: 'email'\n }),\n _.component('form-group', {\n label: gettext(\"Password\"),\n labelClass: '.col-md-4',\n controlClass: '.col-md-8',\n control: _.input({\n value: _.validate(ctrl.form, 'password'),\n type: 'password',\n id: 'id_password',\n disabled: ctrl.form.isBusy\n }),\n validation: ctrl.form.errors,\n validationKey: 'password',\n helpText: _.component('password-strength', {\n inputs: [\n ctrl.form.username(),\n ctrl.form.email()\n ],\n password: ctrl.form.password()\n })\n }),\n captcha\n ]),\n m('.modal-footer', [\n footnote,\n _.component('button', {\n class: '.btn-primary',\n submit: true,\n loading: ctrl.form.isBusy,\n label: gettext(\"Register account\")\n })\n ])\n ])\n ])\n );\n }\n };\n\n Misago.addService('modal:register', function(_) {\n _.modal('register', register);\n },\n {\n after: 'modals'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n function persistent(el, isInit, context) {\n context.retain = true;\n }\n\n var signin = {\n controller: function(_) {\n return {\n form: _.form('sign-in')\n };\n },\n view: function(ctrl, _) {\n var activateButton = null;\n\n if (ctrl.form.showActivation) {\n activateButton = m('a.btn.btn-block.btn-success',\n {href: _.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 navbar = {\n style: '.nav.navbar-nav.navbar-compact-nav.hidden-md.hidden-lg',\n controller: function(links, _) {\n return {\n openUserMenu: function() {\n if (_.user.isAuthenticated) {\n _.dropdown.toggle('navbar-dropdown', 'navbar:dropdown:user');\n } else {\n _.dropdown.toggle('navbar-dropdown', 'navbar:dropdown:guest');\n }\n\n return false;\n }\n };\n },\n userMenu: function(ctrl, _) {\n if (_.user.isAuthenticated) {\n return {\n element: _.component('user-avatar', _.user, 64),\n config: {\n onclick: ctrl.openUserMenu,\n url: '/not-yet/',\n\n 'data-misago-routed': 'false'\n }\n };\n } else {\n return {\n element: _.component('user-avatar', null, 64),\n config: {\n onclick: ctrl.openUserMenu,\n href: '#',\n\n 'data-misago-routed': 'false'\n }\n };\n }\n },\n mobileNav: function(ctrl, links, _) {\n var mobileLinks = [\n {\n element: m('img', {\n src: _.router.staticUrl('misago/img/site-icon.png'),\n alt: _.settings.forum_name\n }),\n url: _.router.url('index')\n }\n ];\n\n links.forEach(function(link) {\n if (link.url !== mobileLinks[0].url) {\n mobileLinks.push(link);\n }\n });\n\n mobileLinks.push(this.userMenu(ctrl, _));\n\n return mobileLinks;\n },\n view: function(ctrl, links, _) {\n var mobileLinks = this.mobileNav(ctrl, links, _);\n\n return m('ul' + this.style + '.with-' + mobileLinks.length + '-items',\n mobileLinks.map(function(link) {\n return m('li',\n m('a', link.config || {href: link.url},\n link.element || m('span.material-icon', {title:link.label},\n link.icon\n )\n )\n );\n })\n );\n }\n };\n\n Misago.addService('component:navbar:mobile', function(_) {\n _.component('navbar:mobile', navbar);\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\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 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, 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 ChangePassword = function(_) {\n var self = this;\n\n this.username = null;\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 var endpoint = _.api.endpoint('auth').endpoint('change-password');\n endpoint = endpoint.endpoint(m.route.param('user_id'));\n endpoint = endpoint.endpoint(m.route.param('token'));\n\n endpoint.post({\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 this.username = user.username;\n };\n\n this.error = function(rejection) {\n if (rejection.status === 403 && rejection.ban) {\n _.router.error403({\n message: '',\n ban: rejection.ban\n });\n } else if (rejection.status === 400) {\n _.alert.error(rejection.detail);\n } else {\n _.api.alert(rejection);\n }\n };\n };\n\n Misago.addService('form:change-password', function(_) {\n _.form('change-password', ChangePassword);\n },\n {\n after: 'forms'\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 _.api.endpoint('auth').endpoint(vm.endpoint).post({\n email: self.email()\n }).then(function(user) {\n self.success(user);\n }, function(error) {\n self.error(error);\n });\n };\n\n this.success = function(user) {\n vm.success(user);\n };\n\n this.error = function(rejection) {\n if (rejection.status === 400) {\n vm.error(rejection, _);\n } else if (rejection.status === 403 && rejection.ban) {\n _.router.error403({\n message: '',\n ban: rejection.ban\n });\n } else {\n _.api.alert(rejection);\n }\n };\n\n this.reset = function() {\n this.email('');\n 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 _.modal();\n _.router.error403({\n message: '',\n ban: rejection.detail\n });\n } else {\n _.alert.error(rejection.detail);\n }\n } else {\n _.api.alert(rejection);\n }\n };\n };\n\n Misago.addService('form:sign-in', function(_) {\n _.form('sign-in', SignIn);\n },\n {\n after: 'forms'\n });\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var mount = document.getElementById('misago-alert-mount');\n\n Misago.addService('mount:alert', {\n factory: function(_) {\n m.mount(mount, _.component('alert'));\n },\n destroy: function() {\n m.mount(mount, null);\n }\n },\n {\n before: 'mount:page-component'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var mount = document.getElementById('misago-auth-changed-message-mount');\n\n Misago.addService('mount:auth-changed-message', {\n factory: function(_) {\n m.mount(mount, _.component('auth-changed-message'));\n },\n destroy: function() {\n m.mount(mount, null);\n }\n },\n {\n before: 'mount:page-component'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var mount = document.getElementById('page-component');\n\n Misago.addService('mount:page-component', {\n factory: function(_) {\n if (mount) {\n m.mount(mount, _.component(mount.dataset.componentName));\n }\n },\n destroy: function() {\n if (mount) {\n m.mount(mount, null);\n }\n }\n },\n {\n before: '_end'\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var mountDesktop = document.getElementById('misago-user-menu-mount');\n //var mountCompact = document.getElementById('misago-user-menu-compact-mount');\n\n Misago.addService('mount:user-menu', {\n factory: function(_) {\n if (_.user.isAuthenticated) {\n m.mount(mountDesktop, _.component('navbar:desktop:user-nav'));\n //m.mount(mountCompact, _.component('navbar:compact:user-nav'));\n } else {\n m.mount(mountDesktop, _.component('navbar:desktop:guest-nav'));\n //m.mount(mountCompact, _.component('navbar:compact:guest-nav'));\n }\n },\n destroy: function() {\n m.mount(mountDesktop, null);\n //m.mount(mountCompact, null);\n }\n },\n {\n before: 'mount:page-component'\n });\n}(Misago.prototype));\n"],"sourceRoot":"/source/"}
|