|
-{"version":3,"sources":["misago.js"],"names":["window","Misago","ns","Object","getPrototypeOf","this","self","_initServices","services","orderedServices","OrderedList","order","forEach","item","factory","undefined","serviceInstance","key","_destroyServices","reverse","destroy","context","SETTINGS","setup","init","fixture","get","test","api","_services","proto","prototype","addService","name","push","after","before","PermissionDenied","message","detail","status","toString","has","obj","hasOwnProperty","value","pop","returnValue","persistent","el","isInit","retain","input","kwargs","options","disabled","config","placeholder","autocomplete","element","id","type","oninput","m","withAttr","noop","stateHooks","component","loadingState","errorState","_hasLifecycleHooks","isActive","errorHandler","bind","_controller","controller","apply","arguments","_onunload","onunload","e","vm","loading","loadingHandler","_view","view","isReady","_init","initArgs","promise","then","ondata","finalArgs","i","length","f","error","items","isOrdered","_items","add","values","values_only","_order","unordered","insertItem","insertAt","ordering","indexOf","ordered","splice","index","iterations","serializeDatetime","serialized","format","deserializeDatetime","deserialized","moment","startsWith","string","beginning","endsWith","tail","UrlConf","_patterns","patterns","prefixPattern","prefix","pattern","replace","include","url","loadingPage","_","getCsrfToken","cookie_name","document","cookie","cookieRegex","RegExp","match","split","Ajax","refreshCsrfToken","csrfToken","CSRF_COOKIE_NAME","runningGets","ajax","method","data","progress","deferred","ajax_settings","headers","X-CSRFToken","dataType","success","resolve","jqXHR","rejection","responseJSON","statusText","reject","$","preloaded","post","patch","put","ALERT_BASE_DISPLAY_TIME","ALERT_LENGTH_FACTOR","ALERT_MAX_DISPLAY_TIME","ALERT_HIDE_ANIMATION_LENGTH","Alert","isVisible","show","displayTime","runloop","runOnce","startComputation","endComputation","set","stop","info","warning","filtersUrl","filters","encodedKey","encodeURIComponent","encodedValue","join","Query","call","path","related","model","relation","endpoint","results","map","models","Api","alert","gettext","Auth","user","deserialize","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","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","link","Rank","slug","description","css_class","is_tab","User","username","full_title","rank","avatar_hash","acl","deserializeUser","joined_on","viewModel","param","activateByToken","auth","ctrl","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","footer","hasNav","forum_footnote","terms_of_service","terms_of_service_link","privacy_policy","privacy_policy_link","nav","branding","legalLink","legalType","header","data-dismiss","aria-label","aria-hidden","refresh","reload","registerComplete","messageHtml","active","lead","register","footnote","termsUrl","terms","style","showActivation","navbar","mainNav","links","dropdown","showSignIn","openUserMenu","userMenu","data-misago-routed","mobileNav","mobileLinks","src","alt","button","showRegister","account_activation","sync","logout","decision","confirm","brand","children","forum_branding_display","forum_branding_text","dropdownToggle","data-toggle","aria-haspopup","aria-expanded","authChanged","textFields","formGroup","groupClass","controlType","attrs","controlId","feedbackId","feedbackIcon","showFeedbackIcon","isValidated","for","labelFor","forumLayout","loader","markup","content","tabindex","aria-labelledby","styles","labels","passwordStrength","role","aria-valuenow","aria-valuemin","aria-valuemax","avatar","defaultSize","size","finalSize","width","height","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 after: Misago.get(order, 'after'),\n before: Misago.get(order, 'before')\n });\n };\n\n this.get = function(key, value) {\n for (var i = 0; i < this._items.length; i++) {\n if (this._items[i].key === key) {\n return this._items[i].item;\n }\n }\n\n return value;\n };\n\n this.has = function(key) {\n return this.get(key) !== undefined;\n };\n\n this.values = function() {\n var values = [];\n for (var i = 0; i < this._items.length; i++) {\n values.push(this._items[i].item);\n }\n return values;\n };\n\n this.order = function(values_only) {\n if (!this.isOrdered) {\n this._items = this._order(this._items);\n this.isOrdered = true;\n }\n\n if (values_only || typeof values_only === 'undefined') {\n return this.values();\n } else {\n return this._items;\n }\n };\n\n this._order = function(unordered) {\n // Index of unordered items\n var index = [];\n unordered.forEach(function (item) {\n index.push(item.key);\n });\n\n // Ordered items\n var ordered = [];\n var ordering = [];\n\n // First pass: register items that\n // don't specify their order\n unordered.forEach(function (item) {\n if (!item.after && !item.before) {\n ordered.push(item);\n ordering.push(item.key);\n }\n });\n\n // Second pass: register items that\n // specify their before to \"_end\"\n unordered.forEach(function (item) {\n if (item.before === \"_end\") {\n ordered.push(item);\n ordering.push(item.key);\n }\n });\n\n // Third pass: keep iterating items\n // until we hit iterations limit or finish\n // ordering list\n function insertItem(item) {\n var insertAt = -1;\n if (ordering.indexOf(item.key) === -1) {\n if (item.after) {\n insertAt = ordering.indexOf(item.after);\n if (insertAt !== -1) {\n insertAt += 1;\n }\n } else if (item.before) {\n insertAt = ordering.indexOf(item.before);\n }\n\n if (insertAt !== -1) {\n ordered.splice(insertAt, 0, item);\n ordering.splice(insertAt, 0, item.key);\n }\n }\n }\n\n var iterations = 200;\n while (iterations > 0 && index.length !== ordering.length) {\n iterations -= 1;\n unordered.forEach(insertItem);\n }\n\n return ordered;\n };\n };\n} (Misago.prototype));\n\n(function (Misago) {\n Misago.serializeDatetime = function(serialized) {\n return serialized ? serialized.format() : null;\n };\n\n Misago.deserializeDatetime = function(deserialized) {\n return deserialized ? moment(deserialized) : null;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.startsWith = function(string, beginning) {\n return string.indexOf(beginning) === 0;\n };\n\n Misago.endsWith = function(string, tail) {\n return string.indexOf(tail, string.length - tail.length) !== -1;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.UrlConf = function() {\n var self = this;\n this._patterns = [];\n\n this.patterns = function() {\n return this._patterns;\n };\n\n var prefixPattern = function(prefix, pattern) {\n return (prefix + pattern).replace('//', '/');\n };\n\n var include = function(prefix, patterns) {\n for (var i = 0; i < patterns.length; i ++) {\n self.url(prefixPattern(prefix, patterns[i].pattern),\n patterns[i].component,\n patterns[i].name);\n }\n };\n\n this.url = function(pattern, component, name) {\n if (pattern === '') {\n pattern = '/';\n }\n\n if (component instanceof Misago.UrlConf) {\n include(pattern, component.patterns());\n } else {\n this._patterns.push({\n pattern: pattern,\n component: component.replace(/_/g, '-'),\n name: name || component\n });\n }\n };\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.loadingPage = function(_) {\n return m('.page.page-loading',\n _.component('loader')\n );\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var getCsrfToken = function(cookie_name) {\n if (document.cookie.indexOf(cookie_name) !== -1) {\n var cookieRegex = new RegExp(cookie_name + '\\=([^;]*)');\n var cookie = Misago.get(document.cookie.match(cookieRegex), 0);\n return cookie.split('=')[1];\n } else {\n return null;\n }\n };\n\n var Ajax = function(_) {\n this.refreshCsrfToken = function() {\n this.csrfToken = getCsrfToken(_.context.CSRF_COOKIE_NAME);\n };\n this.refreshCsrfToken();\n\n /*\n List of GETs underway\n We are limiting number of GETs to API to 1 per url\n */\n var runningGets = {};\n\n this.ajax = function(method, url, data, progress) {\n var promise = m.deferred();\n\n var ajax_settings = {\n url: url,\n method: method,\n headers: {\n 'X-CSRFToken': this.csrfToken\n },\n\n data: data || {},\n dataType: 'json',\n\n success: function(data) {\n if (method === 'GET') {\n Misago.pop(runningGets, url);\n }\n promise.resolve(data);\n },\n error: function(jqXHR) {\n if (method === 'GET') {\n Misago.pop(runningGets, url);\n }\n\n var rejection = jqXHR.responseJSON || {};\n\n rejection.status = jqXHR.status;\n rejection.statusText = jqXHR.statusText;\n\n promise.reject(rejection);\n }\n };\n\n if (progress) {\n return; // not implemented... yet!\n }\n\n $.ajax(ajax_settings);\n return promise.promise;\n };\n\n this.get = function(url) {\n var preloaded = Misago.pop(_.context, url);\n if (preloaded) {\n var deferred = m.deferred();\n deferred.resolve(preloaded);\n return deferred.promise;\n } else if (runningGets[url] !== undefined) {\n return runningGets[url];\n } else {\n runningGets[url] = this.ajax('GET', url);\n return runningGets[url];\n }\n };\n\n this.post = function(url, data) {\n return this.ajax('POST', url, data);\n };\n\n this.patch = function(url, data) {\n return this.ajax('PATCH', url, data);\n };\n\n this.put = function(url, data) {\n return this.ajax('PUT', url, data);\n };\n\n this.delete = function(url) {\n return this.ajax('DELETE', url);\n };\n };\n\n Misago.addService('ajax', function(_) {\n return new Ajax(_);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var ALERT_BASE_DISPLAY_TIME = 5 * 1000;\n var ALERT_LENGTH_FACTOR = 70;\n var ALERT_MAX_DISPLAY_TIME = 9 * 1000;\n var ALERT_HIDE_ANIMATION_LENGTH = 300;\n\n var Alert = function(_) {\n var self = this;\n\n this.type = '';\n this.message = null;\n this.isVisible = false;\n\n var show = function(type, message) {\n self.type = type;\n self.message = message;\n self.isVisible = true;\n\n var displayTime = ALERT_BASE_DISPLAY_TIME;\n displayTime += message.length * ALERT_LENGTH_FACTOR;\n if (displayTime > ALERT_MAX_DISPLAY_TIME) {\n displayTime = ALERT_MAX_DISPLAY_TIME;\n }\n\n _.runloop.runOnce(function () {\n m.startComputation();\n self.isVisible = false;\n m.endComputation();\n }, 'flash-message-hide', displayTime);\n };\n\n var set = function(type, message) {\n _.runloop.stop('flash-message-hide');\n _.runloop.stop('flash-message-show');\n\n if (self.isVisible) {\n self.isVisible = false;\n _.runloop.runOnce(function () {\n m.startComputation();\n show(type, message);\n m.endComputation();\n }, 'flash-message-show', ALERT_HIDE_ANIMATION_LENGTH);\n } else {\n show(type, message);\n }\n };\n\n this.info = function(message) {\n set('info', message);\n };\n\n this.success = function(message) {\n set('success', message);\n };\n\n this.warning = function(message) {\n set('warning', message);\n };\n\n this.error = function(message) {\n set('error', message);\n };\n };\n\n Misago.addService('alert', {\n factory: function(_) {\n return new Alert(_);\n }\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var filtersUrl = function(filters) {\n if (typeof filters === 'object') {\n var values = [];\n for (var key in filters) {\n if (filters.hasOwnProperty(key)) {\n var encodedKey = encodeURIComponent(key);\n var encodedValue = encodeURIComponent(filters[key]);\n values.push(encodedKey + '=' + encodedValue);\n }\n }\n return '?' + values.join('&');\n } else {\n return filters + '/';\n }\n };\n\n var Query = function(_, call) {\n this.url = call.url || _.setup.api;\n\n if (call.path) {\n this.url += call.path + '/';\n } else if (call.related) {\n this.url += call.related + '/';\n } else {\n this.url += call.model + 's' + '/';\n }\n\n if (call.filters) {\n this.url += filtersUrl(call.filters);\n }\n\n if (call.model) {\n this.related = function(model, filters) {\n return new Query(_, {\n url: this.url,\n relation: call.model,\n related: model,\n filters: filters,\n });\n };\n }\n\n this.endpoint = function(path, filters) {\n return new Query(_, {\n url: this.url,\n path: path,\n filters: filters\n });\n };\n\n this.get = function() {\n var model = null;\n if (call.related) {\n model = call.relation + ':' + call.related;\n } else if (call.model) {\n model = call.model;\n }\n\n return _.ajax.get(this.url).then(function(data) {\n if (model) {\n if (data.results) {\n data.results.map(function(item) {\n return _.models.new(model, item);\n });\n return data;\n } else {\n return _.models.new(model, data);\n }\n } else {\n return data;\n }\n });\n };\n\n this.post = function(data) {\n return _.ajax.post(this.url, data);\n };\n\n this.patch = function(data) {\n return _.ajax.patch(this.url, data);\n };\n\n this.put = function(data) {\n return _.ajax.put(this.url, data);\n };\n\n this.delete = function() {\n return _.ajax.delete(this.url);\n };\n\n // shortcut for get()\n this.then = function(resolve, reject) {\n return this.get().then(resolve, reject);\n };\n };\n\n var Api = function(_) {\n this.model = function(model, filters) {\n return new Query(_, {\n model: model,\n filters: filters,\n });\n };\n\n this.endpoint = function(path, filters) {\n return new Query(_, {\n path: path,\n filters: filters\n });\n };\n\n this.alert = function(rejection) {\n // Shorthand for API errors\n var message = gettext(\"Unknown error has occured.\");\n\n if (rejection.status === 0) {\n message = gettext(\"Lost connection with application.\");\n }\n\n if (rejection.status === 403) {\n message = rejection.detail;\n if (message === \"Permission denied\") {\n message = gettext(\n \"You don't have permission to perform this action.\");\n }\n }\n\n if (rejection.status === 404) {\n message = gettext(\"Action link is invalid.\");\n }\n\n _.alert.error(message);\n };\n };\n\n Misago.addService('api', function(_) {\n return new Api(_);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Auth = function(_) {\n 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(function (Misago) {\n 'use strict';\n\n var Router = function(_) {\n var self = this;\n this.baseUrl = $('base').attr('href');\n\n var staticUrl = Misago.get(_.context, 'STATIC_URL', '/');\n var mediaUrl = Misago.get(_.context, 'MEDIA_URL', '/');\n\n // Routing\n this.urls = {};\n this.reverses = {};\n\n var populatePatterns = function(urlconf) {\n urlconf.patterns().forEach(function(url) {\n var finalPattern = self.baseUrl + url.pattern;\n finalPattern = finalPattern.replace('//', '/');\n\n self.urls[finalPattern] = _.route(url.component);\n self.reverses[url.name] = finalPattern;\n });\n };\n\n this.startRouting = function(urlconf, fixture) {\n populatePatterns(urlconf);\n this.fixture = fixture;\n\n if (_.setup.test) {\n m.route.mode = 'search';\n } else {\n m.route.mode = 'pathname';\n }\n\n m.route(fixture, '/', this.urls);\n };\n\n this.url = function(name) {\n return this.reverses[name];\n };\n\n this.route = function(url) {\n m.route(url);\n };\n\n // Delegate clicks\n this.delegateElement = null;\n\n this.cleanUrl = function(url) {\n if (!url) { return; }\n\n // Is link relative?\n var isRelative = url.substr(0, 1) === '/' && url.substr(0, 2) !== '//';\n\n // If link contains host, validate to see if its outgoing\n if (!isRelative) {\n var location = window.location;\n\n // If protocol matches current one, strip it from string\n // otherwhise stop handler\n if (url.substr(0, 2) !== '//') {\n var protocol = url.substr(0, location.protocol.length + 2);\n if (protocol !== location.protocol + '//') { return; }\n url = url.substr(location.protocol.length + 2);\n } else {\n url = url.substr(2);\n }\n\n // Host checks out?\n if (url.substr(0, location.host.length) !== location.host) { return; }\n url = url.substr(location.host.length);\n }\n\n // Is link within Ember app?\n if (url.substr(0, this.baseUrl.length) !== this.baseUrl) { return; }\n\n // Is link to media/static/avatar server?\n if (url.substr(0, staticUrl.length) === staticUrl) { return; }\n\n if (url.substr(0, mediaUrl.length) === mediaUrl) { return; }\n\n var avatarsUrl = '/user-avatar/';\n if (url.substr(0, avatarsUrl.length) === avatarsUrl) { return; }\n\n return url;\n };\n\n var delegateName = 'click.misago-router';\n 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 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 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 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: '/not-yet/'}, [\n m('span.material-icon',\n 'done_all'\n ),\n gettext(\"Edit account\")\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 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 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 // Legal pages\n urls.url('/terms-of-service/', 'terms_of_service');\n urls.url('/privacy-policy/', 'privacy_policy');\n\n // Catch-all 404 not found route\n urls.url('/:rest...', 'error:404', 'not_found');\n\n Misago.urls = urls;\n} (Misago.prototype, Misago.prototype.UrlConf));\n"],"sourceRoot":"/source/"}
|
|
|
|
|
|
+{"version":3,"sources":["misago.js"],"names":["window","Misago","ns","Object","getPrototypeOf","this","self","_initServices","services","orderedServices","OrderedList","order","forEach","item","factory","undefined","serviceInstance","key","_destroyServices","reverse","destroy","context","SETTINGS","setup","init","fixture","get","test","api","_services","proto","prototype","addService","name","push","after","before","PermissionDenied","message","detail","status","toString","has","obj","hasOwnProperty","value","pop","returnValue","persistent","el","isInit","retain","input","kwargs","options","disabled","config","placeholder","autocomplete","element","id","type","oninput","m","withAttr","noop","stateHooks","component","loadingState","errorState","_hasLifecycleHooks","isActive","errorHandler","bind","_controller","controller","apply","arguments","_onunload","onunload","e","vm","loading","loadingHandler","_view","view","isReady","_init","initArgs","promise","then","ondata","finalArgs","i","length","f","error","items","isOrdered","_items","add","values","values_only","_order","unordered","insertItem","insertAt","ordering","indexOf","ordered","splice","index","iterations","serializeDatetime","serialized","format","deserializeDatetime","deserialized","moment","Site","_","isFinalized","_pages","addPage","page","getPages","finalize","getDefaultLink","link","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_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","viewModel","param","activateByToken","auth","ctrl","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","forum","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","src","size","finalSize","alt","width","height","data-dismiss","aria-label","registerComplete","messageHtml","active","lead","register","footnote","termsUrl","terms_of_service_link","terms_of_service","terms","showActivation","navbar","mainNav","links","showSignIn","openUserMenu","userMenu","data-misago-routed","mobileNav","mobileLinks","showRegister","account_activation","sync","logout","decision","confirm","footer","hasNav","forum_footnote","privacy_policy","privacy_policy_link","nav","branding","legalLink","legalType","brand","children","forum_branding_display","forum_branding_text","dropdownToggle","data-toggle","aria-haspopup","aria-expanded","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 after: Misago.get(order, 'after'),\n before: Misago.get(order, 'before')\n });\n };\n\n this.get = function(key, value) {\n for (var i = 0; i < this._items.length; i++) {\n if (this._items[i].key === key) {\n return this._items[i].item;\n }\n }\n\n return value;\n };\n\n this.has = function(key) {\n return this.get(key) !== undefined;\n };\n\n this.values = function() {\n var values = [];\n for (var i = 0; i < this._items.length; i++) {\n values.push(this._items[i].item);\n }\n return values;\n };\n\n this.order = function(values_only) {\n if (!this.isOrdered) {\n this._items = this._order(this._items);\n this.isOrdered = true;\n }\n\n if (values_only || typeof values_only === 'undefined') {\n return this.values();\n } else {\n return this._items;\n }\n };\n\n this._order = function(unordered) {\n // Index of unordered items\n var index = [];\n unordered.forEach(function (item) {\n index.push(item.key);\n });\n\n // Ordered items\n var ordered = [];\n var ordering = [];\n\n // First pass: register items that\n // don't specify their order\n unordered.forEach(function (item) {\n if (!item.after && !item.before) {\n ordered.push(item);\n ordering.push(item.key);\n }\n });\n\n // Second pass: register items that\n // specify their before to \"_end\"\n unordered.forEach(function (item) {\n if (item.before === \"_end\") {\n ordered.push(item);\n ordering.push(item.key);\n }\n });\n\n // Third pass: keep iterating items\n // until we hit iterations limit or finish\n // ordering list\n function insertItem(item) {\n var insertAt = -1;\n if (ordering.indexOf(item.key) === -1) {\n if (item.after) {\n insertAt = ordering.indexOf(item.after);\n if (insertAt !== -1) {\n insertAt += 1;\n }\n } else if (item.before) {\n insertAt = ordering.indexOf(item.before);\n }\n\n if (insertAt !== -1) {\n ordered.splice(insertAt, 0, item);\n ordering.splice(insertAt, 0, item.key);\n }\n }\n }\n\n var iterations = 200;\n while (iterations > 0 && index.length !== ordering.length) {\n iterations -= 1;\n unordered.forEach(insertItem);\n }\n\n return ordered;\n };\n };\n} (Misago.prototype));\n\n(function (Misago) {\n Misago.serializeDatetime = function(serialized) {\n return serialized ? serialized.format() : null;\n };\n\n Misago.deserializeDatetime = function(deserialized) {\n return deserialized ? moment(deserialized) : null;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.Site = function(name, _) {\n var self = this;\n\n this.name = name\n this.isFinalized = false;\n this._pages = [];\n\n var finalize = function() {\n if (!this.isFinalized) {\n this.isFinalized = true;\n\n var visible = [];\n this._pages.forEach(function (item) {\n if (!item.visibleIf || item.visibleIf(_)) {\n visible.push(item);\n }\n });\n this._pages = Misago.OrderedList(visible).order();\n }\n };\n\n this.addPage = function(page) {\n if (this.isFinalized) {\n throw (this.name + \" site was initialized already and no longer accepts new pages\");\n }\n\n this._pages.push(page);\n };\n\n this.getPages = function() {\n this.finalize();\n return this._pages;\n };\n\n this.getDefaultLink = function() {\n this.finalize();\n return this._pages[0].link;\n };\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 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 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 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 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 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 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 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/"}
|