Browse Source

fix comment

Rafał Pitoń 9 years ago
parent
commit
b1c2154c59

+ 1 - 0
misago/legal/views.py

@@ -90,6 +90,7 @@ API_PAGES = {
 
 @api_view(['GET'])
 def legal_page(request, page):
+    raise Http404()
     if page not in API_PAGES:
         raise Http404()
 

+ 1 - 1
misago/static/misago/js/misago.js

@@ -1,2 +1,2 @@
-!function(){"use strict";window.Misago=function(){var t=Object.getPrototypeOf(this),e=this;this.context={SETTINGS:{}},this._services=[],this.addService=function(t,e,r){this._services.push({name:t,item:e,after:this.get(r,"after"),before:this.get(r,"before")})},this._initServices=function(r){var i=new t.OrderedList(r).order(!1);i.forEach(function(t){var r=null;r=void 0!==t.item.factory?t.item.factory:t.item;var i=r(e);i&&(e[t.name]=i)})},this._destroyServices=function(r){var i=new t.OrderedList(r).order();i.reverse(),i.forEach(function(t){void 0!==t.destroy&&t.destroy(e)})},this.registerCoreServices=function(){this.addService("conf",t.Conf),this.addService("component",t.ComponentFactory),this.addService("router",t.RouterFactory),this.addService("api",t.Api),this.addService("outlet",t.Outlet),this.addService("title",t.PageTitle),this.addService("start-routing",t.startRouting)},this.setup=!1,this.init=function(e){this.setup={fixture:t.get(e,"fixture",null),in_test:t.get(e,"in_test",!1)},this._initServices(this._services)},this.destroy=function(){this._destroyServices()}}}(),function(t){"use strict";var e=function(t,e,r){r.retain=!0};t.ForumLayout={view:function(r,i){return[i.component(t.ForumNavbar),m("#router-fixture",{config:e}),i.component(t.ForumFooter)]}}}(Misago.prototype),function(t){"use strict";var e={controller:function(){var t=e.container;t.setTitle(t.settings.forum_index_title)},view:function(){return m(".container",[m("h1","Forum index page!"),m("p","Lorem ipsum dolor met sit amet elit."),m("p","Sequar elit dolor nihi putto.")])}};t.IndexPage=e}(Misago.prototype),function(t){"use strict";var e=function(e,r){var i=e.replace(/_/g,"-"),n={is_destroyed:!0,controller:function(){var r=n.container;return n.is_destroyed=!1,t.get(r.settings,e+"_link")?window.location=t.get(r.settings,e+"_link"):n.vm.init(r),{onunload:function(){n.is_destroyed=!0}}},vm:{is_busy:!1,is_ready:!1,content:null,init:function(t){var e=this;e.is_ready?t.setTitle(e.title):(t.setTitle(),e.is_busy||(e.is_busy=!0,t.api.one("legal-pages",i).then(function(i){e.title=i.title||r,e.body=i.body,e.is_busy=!1,e.is_ready=!0,n.is_destroyed||(t.setTitle(e.title),m.redraw())})))}},view:function(){var e=this.container;return this.vm.is_ready?m(".page.page-legal.page-legal-"+i,[e.component(t.PageHeader,{title:this.vm.title}),m(".container",m.trust(this.vm.body))]):e.component(t.LoadingPage)}};return n};t.TermsOfServicePage=e("terms_of_service",gettext("Terms of service")),t.PrivacyPolicyPage=e("privacy_policy",gettext("Privacy policy"))}(Misago.prototype),function(t){"use strict";t.Loader={view:function(){return m(".loader.sk-folding-cube",[m(".sk-cube1.sk-cube"),m(".sk-cube2.sk-cube"),m(".sk-cube4.sk-cube"),m(".sk-cube3.sk-cube")])}},t.LoadingPage={view:function(e,r){return m(".page.page-loading",r.component(t.Loader))}}}(Misago.prototype),function(t){"use strict";var e=function(t,e,r){r.retain=!0};t.MisagoMarkup={view:function(t,r){return m("article.misago-markup",{config:e},m.trust(r))}}}(Misago.prototype),function(t){"use strict";t.PageHeader={view:function(t,e){return m(".page-header",m(".container",[m("h1",e.title)]))}}}(Misago.prototype),function(t){"use strict";var e=function(e,r,i){var n=t.get(e.settings,r+"_link");return!n&&t.get(e.settings,r)&&(n=e.router.url(r)),n?m("li",m("a",{href:n},t.get(e.settings,r+"_title",i))):null};t.FooterNav={isVisible:function(t){return-1!==[!!t.forum_footnote,!!t.terms_of_service,!!t.terms_of_service_link,!!t.privacy_policy,!!t.privacy_policy_link].indexOf(!0)},view:function(t,r){var i=[];return r.settings.forum_footnote&&i.push(m("li.forum-footnote",m.trust(r.settings.forum_footnote))),i.push(e(r,"terms_of_service",gettext("Terms of service"))),i.push(e(r,"privacy_policy",gettext("Privacy policy"))),m("ul.list-inline.footer-nav",i)}}}(Misago.prototype),function(t){"use strict";t.ForumFooter={view:function(e,r){var i=null;return t.FooterNav.isVisible(r.settings)&&(i=r.component(t.FooterNav)),m("footer.forum-footer",[m(".container",m(".footer-content",[i,r.component(t.FooterMisagoBranding)]))])}}}(Misago.prototype),function(t){"use strict";t.FooterMisagoBranding={view:function(){return m("a.misago-branding[href=http://misago-project.org]",["powered by ",m("strong","misago")])}}}(Misago.prototype),function(t){"use strict";t.BrandFull={view:function(t,e,r){var i=[m("img",{src:r.router.staticUrl("misago/img/site-logo.png"),alt:r.settings.forum_name})];return e&&i.push(e),m("a.navbar-brand",{href:r.router.url("index")},i)}}}(Misago.prototype),function(t){"use strict";t.ForumNavbar={view:function(e,r){var i=[];return r.settings.forum_branding_display&&i.push(r.component(t.BrandFull,r.settings.forum_branding_text)),i.push(m("ul.nav.navbar-nav",[m("li",m("a",{config:m.route,href:r.router.url("index")},"Index")),m("li",m("a",{config:m.route,href:r.router.url("test")},"Test"))])),m('nav.navbar.navbar-default.navbar-static-top[role="navigation"]',[m(".container.navbar-full.hidden-xs.hidden-sm",i)])}}}(Misago.prototype),function(t){"use strict";var e=function(e){var r=new RegExp(e.context.CSRF_COOKIE_NAME+"=([^;]*)");this.csrf_token=t.get(document.cookie.match(r),0).split("=")[1],this.ajax=function(t,e,r,i){var n=m.deferred(),o={url:e,method:t,headers:{"X-CSRFToken":this.csrf_token},data:r|{},dataType:"json",success:function(t){n.resolve(t)},error:function(t){n.reject(t)}};return i?void 0:($.ajax(o),n.promise)},this.get=function(r){var i=t.pop(e.preloaded_data,r);if(i){var n=m.deferred();return n.resolve(i),n.promise}return this.ajax("GET",r)},this.post=function(t){return this.ajax("POST",t)},this.buildUrl=function(t,r,i){var n=e.router.base_url;return n+="api/"+t+"/"},this.one=function(t,e){var r=this.buildUrl(t)+e+"/";return this.get(r)},this.many=function(t,e){},this.call=function(t,e,r,i){}};t.Api=function(t){return new e(t)}}(Misago.prototype),function(t){"use strict";t.ComponentFactory=function(t){t.component=function(){for(var e=[],r=0;r<arguments.length;r+=1)e.push(arguments[r]);return e.push(t),m.component.apply(void 0,e)}}}(Misago.prototype),function(t){"use strict";t.Conf=function(e){e.settings=t.get(e.context,"SETTINGS",{})}}(Misago.prototype),function(t){"use strict";t.Outlet={factory:function(e){e.setup.fixture&&m.mount(document.getElementById(e.setup.fixture),e.component(t.ForumLayout))},destroy:function(t){t.setup.fixture&&m.mount(t.setup.fixture,null)}}}(Misago.prototype),function(t){"use strict";var e=function(e){var r=this;this.base_url=$("base").attr("href"),this.static_url=t.get(e.context,"STATIC_URL","/"),this.media_url=t.get(e.context,"MEDIA_URL","/"),this.urls={},this.reverses={};var i=function(t){t.patterns().forEach(function(t){t.component.container=e;var i=r.base_url+t.pattern;i=i.replace("//","/"),r.urls[i]=t.component,r.reverses[t.name]=i})};this.startRouting=function(t,e){i(t),this.fixture=e,m.route.mode="pathname",m.route(e,"/",this.urls)},this.url=function(t){return this.reverses[t]},this.delegate_element=null,this.delegate_name="click.misago-router",this.cleanUrl=function(t){if(t){var e="/"===t.substr(0,1)&&"//"!==t.substr(0,2);if(!e){var r=window.location;if("//"!==t.substr(0,2)){var i=t.substr(0,r.protocol.length+2);if(i!==r.protocol+"//")return;t=t.substr(r.protocol.length+2)}else t=t.substr(2);if(t.substr(0,r.host.length)!==r.host)return;t=t.substr(r.host.length)}if(t.substr(0,this.base_url.length)===this.base_url&&t.substr(0,this.static_url.length)!==this.static_url&&t.substr(0,this.media_url.length)!==this.media_url){var n="/user-avatar/";if(t.substr(0,n.length)!==n)return t}}},this.delegateClicks=function(t){this.delegate_element=t,$(this.delegate_element).on(this.delegate_name,"a",function(t){var e=r.cleanUrl(t.target.href);e&&(e!=m.route()&&m.route(e),t.preventDefault())})},this.destroy=function(){$(this.delegate_element).off(this.delegate_name)};var n=function(t){return function(e){return t+e}};this.staticUrl=n(this.static_url),this.mediaUrl=n(this.media_url)};t.RouterFactory=function(t){return new e(t)},t.startRouting=function(e){e.router.startRouting(t.urls,document.getElementById("router-fixture")),e.router.delegateClicks(document.getElementById(e.setup.fixture))}}(Misago.prototype),function(t){"use strict";t.PageTitle=function(t){t._setTitle=function(t){"string"==typeof t&&(t={title:t});var e=t.title;"undefined"!=typeof t.page&&t.page>1&&(e+=" ("+interpolate(gettext("page %(page)s"),{page:t.page},!0)+")"),"undefined"!=typeof t.parent&&(e+=" | "+t.parent),document.title=e+" | "+this.settings.forum_name},t.setTitle=function(t){t?this._setTitle(t):document.title=this.settings.forum_name}}}(Misago.prototype),function(t){"use strict";t.has=function(t,e){return void 0!==t?t.hasOwnProperty(e):!1},t.get=function(e,r,i){return t.has(e,r)?e[r]:void 0!==i?i:void 0},t.pop=function(e,r,i){var n=t.get(e,r,i);return t.has(e,r)&&delete e[r],n}}(Misago.prototype),function(t){"use strict";t.OrderedList=function(e){this.is_ordered=!1,this._items=e||[],this.add=function(e,r,i){this._items.push({key:e,item:r,after:t.get(i,"after"),before:t.get(i,"before")})},this.get=function(t,e){for(var r=0;r<this._items.length;r++)if(this._items[r].key===t)return this._items[r].item;return e},this.has=function(t){return void 0!==this.get(t)},this.values=function(){for(var t=[],e=0;e<this._items.length;e++)t.push(this._items[e].item);return t},this.order=function(t){return this.is_ordered||(this._items=this._order(this._items),this.is_ordered=!0),t||"undefined"==typeof t?this.values():this._items},this._order=function(t){function e(t){var e=-1;-1===n.indexOf(t.key)&&(t.after?(e=n.indexOf(t.after),-1!==e&&(e+=1)):t.before&&(e=n.indexOf(t.before)),-1!==e&&(i.splice(e,0,t),n.splice(e,0,t.key)))}var r=[];t.forEach(function(t){r.push(t.key)});var i=[],n=[];t.forEach(function(t){t.after||t.before||(i.push(t),n.push(t.key))});for(var o=200;o>0&&r.length!==n.length;)o-=1,t.forEach(e);return i}}}(Misago.prototype),function(t){"use strict";t.startsWith=function(t,e){return 0===t.indexOf(e)},t.endsWith=function(t,e){return-1!==t.indexOf(e,t.length-e.length)}}(Misago.prototype),function(t){"use strict";t.UrlConfInvalidComponentError=function(){this.message="component argument should be array or object"},t.UrlConf=function(){var e=this;this._patterns=[],this.patterns=function(){return this._patterns};var r=function(t,e){return(t+e).replace("//","/")},i=function(t,i){for(var n=0;n<i.length;n++)e.url(r(t,i[n].pattern),i[n].component,i[n].name)};this.url=function(e,r,n){if("object"!=typeof r)throw new t.UrlConfInvalidComponentError;""===e&&(e="/"),r instanceof t.UrlConf?i(e,r.patterns()):this._patterns.push({pattern:e,component:r,name:n})}}}(Misago.prototype),function(t){"use strict";t.loadingPage=function(e){return m(".page.page-loading",e.component(t.Loader))}}(Misago.prototype),function(t,e){"use strict";var r=new e;r.url("/",t.IndexPage,"index"),r.url("/terms-of-service/",t.TermsOfServicePage,"terms_of_service"),r.url("/privacy-policy/",t.PrivacyPolicyPage,"privacy_policy"),t.urls=r}(Misago.prototype,Misago.prototype.UrlConf);
+!function(){"use strict";window.Misago=function(){var t=Object.getPrototypeOf(this),e=this;this.context={SETTINGS:{}},this._services=[],this.addService=function(t,e,r){this._services.push({name:t,item:e,after:this.get(r,"after"),before:this.get(r,"before")})},this._initServices=function(r){var n=new t.OrderedList(r).order(!1);n.forEach(function(t){var r=null;r=void 0!==t.item.factory?t.item.factory:t.item;var n=r(e);n&&(e[t.name]=n)})},this._destroyServices=function(r){var n=new t.OrderedList(r).order();n.reverse(),n.forEach(function(t){void 0!==t.destroy&&t.destroy(e)})},this.registerCoreServices=function(){this.addService("conf",t.Conf),this.addService("component",t.ComponentFactory),this.addService("router",t.RouterFactory),this.addService("ajax",t.ajax),this.addService("api",t.api),this.addService("outlet",t.Outlet),this.addService("title",t.PageTitle),this.addService("start-routing",t.startRouting)},this.setup=!1,this.init=function(e){this.setup={fixture:t.get(e,"fixture",null),inTest:t.get(e,"inTest",!1)},this._initServices(this._services)},this.destroy=function(){this._destroyServices()}}}(),function(t){"use strict";var e=function(e){var r=new RegExp(e.context.CSRF_COOKIE_NAME+"=([^;]*)");this.csrfToken=t.get(document.cookie.match(r),0).split("=")[1];var n={};this.ajax=function(e,r,i,o){var s=m.deferred(),u={url:r,method:e,headers:{"X-CSRFToken":this.csrfToken},data:i|{},dataType:"json",success:function(i){"GET"===e&&t.pop(n,r),s.resolve(i)},error:function(i){"GET"===e&&t.pop(n,r);var o=i.responseJSON||{};o.status=i.status,o.statusText=i.statusText,s.reject(o)}};return o?void 0:($.ajax(u),s.promise)},this.get=function(r){var i=t.pop(e.context,r);if(i){var o=m.deferred();return o.resolve(i),o.promise}return void 0!==n[r]?n[r]:(n[r]=this.ajax("GET",r),n[r])},this.post=function(t){return this.ajax("POST",t)}};t.ajax=function(t){return new e(t)}}(Misago.prototype),function(t){"use strict";var e=function(t){this.buildUrl=function(e,r,n){var i=t.router.baseUrl;return i+="api/"+e+"/"},this.one=function(e,r){var n=this.buildUrl(e)+r+"/";return t.ajax.get(n)},this.many=function(t,e){},this.call=function(t,e,r,n){}};t.api=function(t){return new e(t)}}(Misago.prototype),function(t){"use strict";t.ComponentFactory=function(t){t.component=function(){for(var e=[],r=0;r<arguments.length;r+=1)e.push(arguments[r]);return e.push(t),m.component.apply(void 0,e)}}}(Misago.prototype),function(t){"use strict";t.Conf=function(e){e.settings=t.get(e.context,"SETTINGS",{})}}(Misago.prototype),function(t){"use strict";t.Outlet={factory:function(e){e.setup.fixture&&m.mount(document.getElementById(e.setup.fixture),e.component(t.ForumLayout))},destroy:function(t){t.setup.fixture&&m.mount(t.setup.fixture,null)}}}(Misago.prototype),function(t){"use strict";var e=function(){};t.route=function(r){r.isActive=!0;var n=r.controller||e;if(r.controller=function(){r.isActive=!0;var t=n.apply(r,arguments)||{},i=t.onunload||e;return t.onunload=function(){i.apply(r,arguments),r.isActive=!1},t},r.vm&&r.vm.init){var i=r.vm.init;r.vm.init=function(){var t=arguments,e=i.apply(r.vm,t);e&&e.then(function(){if(r.isActive&&r.vm.ondata){for(var e=[],n=0;n<arguments.length;n++)e.push(arguments[n]);for(var i=0;i<t.length;i++)e.push(t[i]);r.vm.ondata.apply(r.vm,e)}},function(t){r.isActive&&r.container.router.errorPage(t)})},r.loading||(r.loading=function(){var e=this.container;return m(".page.page-loading",e.component(t.Loader))});var o=r.view;r.view=function(){return r.vm.isReady?o.apply(r,arguments):r.loading.apply(r,arguments)}}return r}}(Misago.prototype),function(t){"use strict";var e=function(e){var r=this;this.baseUrl=$("base").attr("href");var n=t.get(e.context,"STATIC_URL","/"),i=t.get(e.context,"MEDIA_URL","/");this.urls={},this.reverses={};var o=function(t){return t.container=e,t},s=function(t){t.patterns().forEach(function(t){var e=r.baseUrl+t.pattern;e=e.replace("//","/"),r.urls[e]=o(t.component),r.reverses[t.name]=e})};this.startRouting=function(t,e){s(t),this.fixture=e,m.route.mode="pathname",m.route(e,"/",this.urls)},this.url=function(t){return this.reverses[t]},this.delegateElement=null,this.delegateName="click.misago-router",this.cleanUrl=function(t){if(t){var e="/"===t.substr(0,1)&&"//"!==t.substr(0,2);if(!e){var r=window.location;if("//"!==t.substr(0,2)){var o=t.substr(0,r.protocol.length+2);if(o!==r.protocol+"//")return;t=t.substr(r.protocol.length+2)}else t=t.substr(2);if(t.substr(0,r.host.length)!==r.host)return;t=t.substr(r.host.length)}if(t.substr(0,this.baseUrl.length)===this.baseUrl&&t.substr(0,n.length)!==n&&t.substr(0,i.length)!==i){var s="/user-avatar/";if(t.substr(0,s.length)!==s)return t}}},this.delegateClicks=function(t){this.delegateElement=t,$(this.delegateElement).on(this.delegateName,"a",function(t){var e=r.cleanUrl(t.target.href);e&&(e!=m.route()&&m.route(e),t.preventDefault())})},this.destroy=function(){$(this.delegateElement).off(this.delegateName)};var u=function(t){return function(e){return t+e}};this.staticUrl=u(n),this.mediaUrl=u(i),this.error403=function(e){var r=null;r=o(e.ban?t.ErrorBannedRoute:t.Error403Route),r.vm=e,m.mount(this.fixture,r)},this.error404=function(){m.mount(this.fixture,o(t.Error404Route))},this.error500=function(){m.mount(this.fixture,o(t.Error500Route))},this.errorPage=function(t){500===t.status&&this.error500(),404===t.status&&this.error404(),403===t.status&&this.error403(t)}};t.RouterFactory=function(t){return new e(t)},t.startRouting=function(e){e.router.startRouting(t.urls,document.getElementById("router-fixture")),e.router.delegateClicks(document.getElementById(e.setup.fixture))}}(Misago.prototype),function(t){"use strict";t.PageTitle=function(t){t._setTitle=function(t){"string"==typeof t&&(t={title:t});var e=t.title;"undefined"!=typeof t.page&&t.page>1&&(e+=" ("+interpolate(gettext("page %(page)s"),{page:t.page},!0)+")"),"undefined"!=typeof t.parent&&(e+=" | "+t.parent),document.title=e+" | "+this.settings.forum_name},t.setTitle=function(t){t?this._setTitle(t):document.title=this.settings.forum_name}}}(Misago.prototype),function(t){"use strict";t.Error403Route=t.route({controller:function(){this.container.setTitle(gettext("Page not available"))},error:null,view:function(t){return m(".container",[m("h1","Error 403!"),m("p.lead",this.error||"No perm to see this page")])}}),t.Error404Route=t.route({controller:function(){this.container.setTitle(gettext("Page not found"))},view:function(t){return m(".container",[m("h1","Error 404!"),m("p.lead","Requested page could not be found.")])}}),t.Error500Route=t.route({controller:function(){this.container.setTitle(gettext("Application error occured"))},view:function(t){return m(".container",[m("h1","Error 500!"),m("p.lead","Application has derped.")])}})}(Misago.prototype),function(t){"use strict";t.IndexRoute=t.route({controller:function(){var t=this.container;document.title=t.settings.forum_index_title||t.settings.forum_name;var e=m.prop(0);return{count:e,increment:function(){console.log("increment()"),e(e()+1)}}},view:function(t){return m(".container",[m("h1",["Count: ",m("strong",t.count())]),m("p","Clicky click button to increase count!."),m("p",m("button.btn.btn-primary",{onclick:t.increment},"Clicky clicky!"))])}})}(Misago.prototype),function(t){"use strict";var e=function(e,r){var n=e.replace(/_/g,"-");return t.route({controller:function(){var r=this.container;t.get(r.settings,e+"_link")?window.location=t.get(r.settings,e+"_link"):this.vm.init(this,r)},vm:{isReady:!1,init:function(t,e){return this.isReady?void e.setTitle(this.title):(e.setTitle(),e.api.one("legal-pages",n))},ondata:function(t,e,n){m.startComputation(),this.title=t.title||r,this.body=t.body,this.isReady=!0,m.endComputation(),e.isActive&&n.setTitle(t.title)}},view:function(){var e=this.container;return m(".page.page-legal.page-legal-"+n,[e.component(t.PageHeader,{title:this.vm.title}),m(".container",m.trust(this.vm.body))])}})};t.TermsOfServiceRoute=e("terms_of_service",gettext("Terms of service")),t.PrivacyPolicyRoute=e("privacy_policy",gettext("Privacy policy"))}(Misago.prototype),function(t){"use strict";var e=function(e,r,n){var i=t.get(e.settings,r+"_link");return!i&&t.get(e.settings,r)&&(i=e.router.url(r)),i?m("li",m("a",{href:i},t.get(e.settings,r+"_title",n))):null};t.FooterNav={isVisible:function(t){return-1!==[!!t.forum_footnote,!!t.terms_of_service,!!t.terms_of_service_link,!!t.privacy_policy,!!t.privacy_policy_link].indexOf(!0)},view:function(t,r){var n=[];return r.settings.forum_footnote&&n.push(m("li.forum-footnote",m.trust(r.settings.forum_footnote))),n.push(e(r,"terms_of_service",gettext("Terms of service"))),n.push(e(r,"privacy_policy",gettext("Privacy policy"))),m("ul.list-inline.footer-nav",n)}}}(Misago.prototype),function(t){"use strict";t.ForumFooter={view:function(e,r){var n=null;return t.FooterNav.isVisible(r.settings)&&(n=r.component(t.FooterNav)),m("footer.forum-footer",[m(".container",m(".footer-content",[n,r.component(t.FooterMisagoBranding)]))])}}}(Misago.prototype),function(t){"use strict";t.FooterMisagoBranding={view:function(){return m("a.misago-branding[href=http://misago-project.org]",["powered by ",m("strong","misago")])}}}(Misago.prototype),function(t){"use strict";t.BrandFull={view:function(t,e,r){var n=[m("img",{src:r.router.staticUrl("misago/img/site-logo.png"),alt:r.settings.forum_name})];return e&&n.push(e),m("a.navbar-brand",{href:r.router.url("index")},n)}}}(Misago.prototype),function(t){"use strict";t.ForumNavbar={view:function(e,r){var n=[];return r.settings.forum_branding_display&&n.push(r.component(t.BrandFull,r.settings.forum_branding_text)),n.push(m("ul.nav.navbar-nav",[m("li",m("a",{config:m.route,href:r.router.url("index")},"Index")),m("li",m("a",{config:m.route,href:r.router.url("test")},"Test"))])),m('nav.navbar.navbar-default.navbar-static-top[role="navigation"]',[m(".container.navbar-full.hidden-xs.hidden-sm",n)])}}}(Misago.prototype),function(t){"use strict";var e=function(t,e,r){r.retain=!0};t.ForumLayout={view:function(r,n){return[n.component(t.ForumNavbar),m("#router-fixture",{config:e}),n.component(t.ForumFooter)]}}}(Misago.prototype),function(t){"use strict";t.Loader={view:function(){return m(".loader.sk-folding-cube",[m(".sk-cube1.sk-cube"),m(".sk-cube2.sk-cube"),m(".sk-cube4.sk-cube"),m(".sk-cube3.sk-cube")])}},t.LoadingPage={view:function(e,r){return m(".page.page-loading",r.component(t.Loader))}}}(Misago.prototype),function(t){"use strict";var e=function(t,e,r){r.retain=!0};t.MisagoMarkup={view:function(t,r){return m("article.misago-markup",{config:e},m.trust(r))}}}(Misago.prototype),function(t){"use strict";t.PageHeader={view:function(t,e){return m(".page-header",m(".container",[m("h1",e.title)]))}}}(Misago.prototype),function(t){"use strict";t.has=function(t,e){return void 0!==t?t.hasOwnProperty(e):!1},t.get=function(e,r,n){return t.has(e,r)?e[r]:void 0!==n?n:void 0},t.pop=function(e,r,n){var i=t.get(e,r,n);return t.has(e,r)&&delete e[r],i}}(Misago.prototype),function(t){"use strict";t.OrderedList=function(e){this.isOrdered=!1,this._items=e||[],this.add=function(e,r,n){this._items.push({key:e,item:r,after:t.get(n,"after"),before:t.get(n,"before")})},this.get=function(t,e){for(var r=0;r<this._items.length;r++)if(this._items[r].key===t)return this._items[r].item;return e},this.has=function(t){return void 0!==this.get(t)},this.values=function(){for(var t=[],e=0;e<this._items.length;e++)t.push(this._items[e].item);return t},this.order=function(t){return this.isOrdered||(this._items=this._order(this._items),this.isOrdered=!0),t||"undefined"==typeof t?this.values():this._items},this._order=function(t){function e(t){var e=-1;-1===i.indexOf(t.key)&&(t.after?(e=i.indexOf(t.after),-1!==e&&(e+=1)):t.before&&(e=i.indexOf(t.before)),-1!==e&&(n.splice(e,0,t),i.splice(e,0,t.key)))}var r=[];t.forEach(function(t){r.push(t.key)});var n=[],i=[];t.forEach(function(t){t.after||t.before||(n.push(t),i.push(t.key))});for(var o=200;o>0&&r.length!==i.length;)o-=1,t.forEach(e);return n}}}(Misago.prototype),function(t){"use strict";t.startsWith=function(t,e){return 0===t.indexOf(e)},t.endsWith=function(t,e){return-1!==t.indexOf(e,t.length-e.length)}}(Misago.prototype),function(t){"use strict";t.UrlConfInvalidComponentError=function(t){this.message="route's "+t+" component should be an array or object",this.toString=function(){return this.message}},t.UrlConf=function(){var e=this;this._patterns=[],this.patterns=function(){return this._patterns};var r=function(t,e){return(t+e).replace("//","/")},n=function(t,n){for(var i=0;i<n.length;i++)e.url(r(t,n[i].pattern),n[i].component,n[i].name)};this.url=function(e,r,i){if("object"!=typeof r)throw new t.UrlConfInvalidComponentError(i);""===e&&(e="/"),r instanceof t.UrlConf?n(e,r.patterns()):this._patterns.push({pattern:e,component:r,name:i})}}}(Misago.prototype),function(t){"use strict";t.loadingPage=function(e){return m(".page.page-loading",e.component(t.Loader))}}(Misago.prototype),function(t,e){"use strict";var r=new e;r.url("/",t.IndexRoute,"index"),r.url("/terms-of-service/",t.TermsOfServiceRoute,"terms_of_service"),r.url("/privacy-policy/",t.PrivacyPolicyRoute,"privacy_policy"),t.urls=r}(Misago.prototype,Misago.prototype.UrlConf);
 //# sourceMappingURL=/misago.js.map

+ 1 - 1
misago/static/misago/js/misago.js.map

@@ -1 +1 @@
-{"version":3,"sources":["misago.js"],"names":["window","Misago","ns","Object","getPrototypeOf","this","self","context","SETTINGS","_services","addService","name","factory","order","push","item","after","get","before","_initServices","services","ordered_services","OrderedList","forEach","undefined","service_instance","_destroyServices","reverse","destroy","registerCoreServices","Conf","ComponentFactory","RouterFactory","Api","Outlet","PageTitle","startRouting","setup","init","fixture","in_test","persistent","el","isInit","retain","ForumLayout","view","ctrl","_","component","ForumNavbar","m","config","ForumFooter","prototype","controller","container","setTitle","settings","forum_index_title","IndexPage","legalPageFactory","type_name","default_title","dashed_type_name","replace","is_destroyed","location","vm","onunload","is_busy","is_ready","content","title","api","one","then","data","body","redraw","PageHeader","trust","LoadingPage","TermsOfServicePage","gettext","PrivacyPolicyPage","Loader","setupMarkup","MisagoMarkup","options","legalLink","legal_type","url","router","href","FooterNav","isVisible","forum_footnote","terms_of_service","terms_of_service_link","privacy_policy","privacy_policy_link","indexOf","items","nav","FooterMisagoBranding","BrandFull","branding","children","src","staticUrl","alt","forum_name","desktop_navbar","forum_branding_display","forum_branding_text","route","cookie_regex","RegExp","CSRF_COOKIE_NAME","csrf_token","document","cookie","match","split","ajax","method","progress","deferred","ajax_settings","headers","X-CSRFToken","dataType","success","resolve","error","jqXHR","reject","$","promise","preloaded_data","pop","post","buildUrl","model","call","querystrings","base_url","id","many","filters","target","arguments_array","i","arguments","length","apply","mount","getElementById","Router","attr","static_url","media_url","urls","reverses","populatePatterns","urlconf","patterns","final_pattern","pattern","mode","delegate_element","delegate_name","cleanUrl","is_relative","substr","protocol","host","avatars_url","delegateClicks","element","on","e","clean_url","preventDefault","off","prefixUrl","prefix","mediaUrl","_setTitle","complete_title","page","interpolate","parent","has","obj","key","hasOwnProperty","value","returnValue","is_ordered","_items","add","values","values_only","_order","unordered","insertItem","insertAt","ordering","ordered","splice","index","iterations","startsWith","string","beginning","endsWith","tail","UrlConfInvalidComponentError","message","UrlConf","_patterns","prefixPattern","include","loadingPage"],"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\n    var ns = Object.getPrototypeOf(this);\n    var self = this;\n\n    // Context data\n    this.context = {\n      // Empty settings\n      SETTINGS: {}\n    };\n\n    // Services\n    this._services = [];\n    this.addService = function(name, factory, order) {\n      this._services.push({\n        name: name,\n        item: factory,\n        after: this.get(order, 'after'),\n        before: this.get(order, 'before')\n      });\n    };\n\n    this._initServices = function(services) {\n      var ordered_services = new ns.OrderedList(services).order(false);\n      ordered_services.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 service_instance = factory(self);\n        if (service_instance) {\n          self[item.name] = service_instance;\n        }\n      });\n    };\n\n    this._destroyServices = function(services) {\n      var ordered_services = new ns.OrderedList(services).order();\n      ordered_services.reverse();\n      ordered_services.forEach(function (item) {\n        if (item.destroy !== undefined) {\n          item.destroy(self);\n        }\n      });\n    };\n\n    this.registerCoreServices = function() {\n      this.addService('conf', ns.Conf);\n      this.addService('component', ns.ComponentFactory);\n      this.addService('router', ns.RouterFactory);\n      this.addService('api', ns.Api);\n      this.addService('outlet', ns.Outlet);\n      this.addService('title', ns.PageTitle);\n      this.addService('start-routing', ns.startRouting);\n    };\n\n    // App init/destory\n    this.setup = false;\n    this.init = function(setup) {\n      this.setup = {\n        fixture: ns.get(setup, 'fixture', null),\n        in_test: ns.get(setup, 'in_test', false)\n      };\n\n      this._initServices(this._services);\n    };\n\n    this.destroy = function() {\n      this._destroyServices();\n    };\n  };\n}());\n\n\n(function (ns) {\n  'use strict';\n\n  var persistent = function(el, isInit, context) {\n    context.retain = true;\n  };\n\n  ns.ForumLayout = {\n    view: function(ctrl, _) {\n      return [\n        _.component(ns.ForumNavbar),\n        m('#router-fixture', {config: persistent}),\n        _.component(ns.ForumFooter)\n      ];\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  var self = {\n    controller: function() {\n      var _ = self.container;\n      _.setTitle(_.settings.forum_index_title);\n    },\n    view: function() {\n      return m('.container', [\n        m('h1', 'Forum index page!'),\n        m('p', 'Lorem ipsum dolor met sit amet elit.'),\n        m('p', 'Sequar elit dolor nihi putto.')\n      ]);\n    }\n  };\n  ns.IndexPage = self;\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  var legalPageFactory = function(type_name, default_title) {\n    var dashed_type_name = type_name.replace(/_/g, '-');\n\n    var self = {\n      is_destroyed: true,\n      controller: function() {\n        var _ = self.container;\n        self.is_destroyed = false;\n\n        if (ns.get(_.settings, type_name + '_link')) {\n          window.location = ns.get(_.settings, type_name + '_link');\n        } else {\n          self.vm.init(_);\n        }\n\n        return {\n          onunload: function() {\n            self.is_destroyed = true;\n          }\n        };\n      },\n      vm: {\n        is_busy: false,\n        is_ready: false,\n        content: null,\n\n        init: function(_) {\n\n          var vm = this;\n          if (vm.is_ready) {\n            _.setTitle(vm.title);\n          } else {\n            _.setTitle();\n\n            if (!vm.is_busy) {\n              vm.is_busy = true;\n\n              _.api.one('legal-pages', dashed_type_name).then(function(data) {\n                vm.title = data.title || default_title;\n                vm.body = data.body;\n                vm.is_busy = false;\n                vm.is_ready = true;\n\n                if (!self.is_destroyed) {\n                  _.setTitle(vm.title);\n                  m.redraw();\n                }\n              });\n            }\n          }\n        }\n      },\n      view: function() {\n        var _ = this.container;\n\n        if (this.vm.is_ready) {\n          return m('.page.page-legal.page-legal-' + dashed_type_name, [\n            _.component(ns.PageHeader, {title: this.vm.title}),\n            m('.container',\n              m.trust(this.vm.body)\n            )\n          ]);\n        } else {\n          return _.component(ns.LoadingPage);\n        }\n      }\n    };\n    return self;\n  };\n\n  ns.TermsOfServicePage = legalPageFactory(\n    'terms_of_service', gettext('Terms of service'));\n  ns.PrivacyPolicyPage = legalPageFactory(\n    'privacy_policy', gettext('Privacy policy'));\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.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  ns.LoadingPage = {\n    view: function(ctrl, _) {\n      return m('.page.page-loading',\n        _.component(ns.Loader)\n      );\n    }\n  };\n} (Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  var setupMarkup = function(el, isInit, context) {\n    context.retain = true;\n  };\n\n  ns.MisagoMarkup = {\n    view: function(ctrl, content) {\n      return m('article.misago-markup', {config: setupMarkup}, m.trust(content));\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.PageHeader = {\n    view: function(ctrl, options) {\n      return m('.page-header',\n        m('.container', [\n          m('h1', options.title),\n        ])\n      );\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  var legalLink = function(_, legal_type, default_title) {\n    var url = ns.get(_.settings, legal_type + '_link');\n    if (!url && ns.get(_.settings, legal_type)) {\n      url = _.router.url(legal_type);\n    }\n\n    if (url) {\n      return m('li',\n        m('a', {href: url}, ns.get(_.settings, legal_type + '_title', default_title))\n      );\n    } else {\n      return null;\n    }\n  };\n\n  ns.FooterNav = {\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(legalLink(_, 'terms_of_service', gettext('Terms of service')));\n      items.push(legalLink(_, 'privacy_policy', gettext('Privacy policy')));\n\n      return m('ul.list-inline.footer-nav', items);\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.ForumFooter = {\n    view: function(ctrl, _) {\n      var nav = null;\n      if (ns.FooterNav.isVisible(_.settings)) {\n        nav = _.component(ns.FooterNav);\n      }\n\n      return m('footer.forum-footer', [\n        m('.container',\n          m('.footer-content', [\n            nav,\n            _.component(ns.FooterMisagoBranding)\n          ])\n        )\n      ]);\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.FooterMisagoBranding = {\n    view: function() {\n      return m('a.misago-branding[href=http://misago-project.org]', [\n        \"powered by \", m('strong', \"misago\")\n      ]);\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.BrandFull = {\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}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.ForumNavbar = {\n    view: function(ctrl, _) {\n      var desktop_navbar = [];\n\n      if (_.settings.forum_branding_display) {\n        desktop_navbar.push(_.component(ns.BrandFull, _.settings.forum_branding_text));\n      }\n\n      desktop_navbar.push(m('ul.nav.navbar-nav', [\n        m('li', m(\"a\", {config: m.route, href: _.router.url('index')}, 'Index')),\n        m('li', m(\"a\", {config: m.route, href: _.router.url('test')}, 'Test'))\n      ]));\n\n      return m('nav.navbar.navbar-default.navbar-static-top[role=\"navigation\"]', [\n        m('.container.navbar-full.hidden-xs.hidden-sm', desktop_navbar)\n      ]);\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  var Api = function(_) {\n    // Ajax implementation\n    var cookie_regex = new RegExp(_.context.CSRF_COOKIE_NAME + '\\=([^;]*)');\n    this.csrf_token = ns.get(document.cookie.match(cookie_regex), 0).split('=')[1];\n\n    this.ajax = function(method, url, data, progress) {\n      var deferred = m.deferred();\n\n      var ajax_settings = {\n        url: url,\n        method: method,\n        headers: {\n          'X-CSRFToken': this.csrf_token\n        },\n\n        data: data | {},\n        dataType: 'json',\n\n        success: function(data) {\n          deferred.resolve(data);\n        },\n        error: function(jqXHR) {\n          deferred.reject(jqXHR);\n        }\n      };\n\n      if (progress) {\n        return; // not implemented... yet!\n      }\n\n      $.ajax(ajax_settings);\n      return deferred.promise;\n    };\n\n    this.get = function(url) {\n      var preloaded_data = ns.pop(_.preloaded_data, url);\n      if (preloaded_data) {\n        var deferred = m.deferred();\n        deferred.resolve(preloaded_data);\n        return deferred.promise;\n      } else {\n        return this.ajax('GET', url);\n      }\n    };\n\n    this.post = function(url) {\n      return this.ajax('POST', url);\n    };\n\n    // API\n    this.buildUrl = function(model, call, querystrings) {\n      var url = _.router.base_url;\n      url += 'api/' + model + '/';\n      return url;\n    };\n\n    this.one = function(model, id) {\n      var url = this.buildUrl(model) + id + '/';\n      return this.get(url);\n    };\n\n    this.many = function(model, filters) {\n\n    };\n\n    this.call = function(model, target, call, data) {\n\n    };\n  };\n\n  ns.Api = function(_) {\n    return new Api(_);\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.ComponentFactory = function(_) {\n    // Component factory\n    _.component = function() {\n      var arguments_array = [];\n      for (var i = 0; i < arguments.length; i += 1) {\n        arguments_array.push(arguments[i]);\n      }\n\n      arguments_array.push(_);\n      return m.component.apply(undefined, arguments_array);\n    };\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.Conf = function(_) {\n    _.settings = ns.get(_.context, 'SETTINGS', {});\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.Outlet = {\n    factory: function(_) {\n      if (_.setup.fixture) {\n        m.mount(document.getElementById(_.setup.fixture),\n                _.component(ns.ForumLayout));\n      }\n    },\n\n    destroy: function(_) {\n      if (_.setup.fixture) {\n        m.mount(_.setup.fixture, null);\n      }\n    }\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  var Router = function(_) {\n    var self = this;\n    this.base_url = $('base').attr('href');\n\n    this.static_url = ns.get(_.context, 'STATIC_URL', '/');\n    this.media_url = ns.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        // set service container on component\n        url.component.container = _;\n\n        var final_pattern = self.base_url + url.pattern;\n        final_pattern = final_pattern.replace('//', '/');\n\n        self.urls[final_pattern] = url.component;\n        self.reverses[url.name] = final_pattern;\n      });\n    };\n\n    this.startRouting = function(urlconf, fixture) {\n      populatePatterns(urlconf);\n      this.fixture = fixture;\n\n      m.route.mode = 'pathname';\n      m.route(fixture, '/', this.urls);\n    };\n\n    this.url = function(name) {\n      return this.reverses[name];\n    };\n\n    // Delegate clicks\n    this.delegate_element = null;\n    this.delegate_name = 'click.misago-router';\n\n    this.cleanUrl = function(url) {\n      if (!url) { return; }\n\n      // Is link relative?\n      var is_relative = url.substr(0, 1) === '/' && url.substr(0, 2) !== '//';\n\n      // If link contains host, validate to see if its outgoing\n      if (!is_relative) {\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.base_url.length) !== this.base_url) { return; }\n\n      // Is link to media/static/avatar server?\n      if (url.substr(0, this.static_url.length) === this.static_url) { return; }\n\n      if (url.substr(0, this.media_url.length) === this.media_url) { return; }\n\n      var avatars_url = '/user-avatar/';\n      if (url.substr(0, avatars_url.length) === avatars_url) { return; }\n\n      return url;\n    };\n\n    this.delegateClicks = function(element) {\n      this.delegate_element = element;\n      $(this.delegate_element).on(this.delegate_name, 'a', function(e) {\n        var clean_url = self.cleanUrl(e.target.href);\n        if (clean_url) {\n          if (clean_url != m.route()) {\n            m.route(clean_url);\n          }\n          e.preventDefault();\n        }\n      });\n    };\n\n    this.destroy = function() {\n      $(this.delegate_element).off(this.delegate_name);\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(this.static_url);\n    this.mediaUrl = prefixUrl(this.media_url);\n  };\n\n  ns.RouterFactory = function(_) {\n    return new Router(_);\n  };\n\n  ns.startRouting = function(_) {\n    _.router.startRouting(ns.urls, document.getElementById('router-fixture'));\n    _.router.delegateClicks(document.getElementById(_.setup.fixture));\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.PageTitle = function(_) {\n    _._setTitle = function(title) {\n      if (typeof title === 'string') {\n        title = {title: title};\n      }\n\n      var complete_title = title.title;\n\n      if (typeof title.page !== 'undefined' && title.page > 1) {\n        complete_title += ' (' + interpolate(gettext('page %(page)s'), { page:title.page }, true) + ')';\n      }\n\n      if (typeof title.parent !== 'undefined') {\n        complete_title += ' | ' + title.parent;\n      }\n\n      document.title = complete_title + ' | ' + this.settings.forum_name;\n    };\n\n    _.setTitle = function(title) {\n      if (title) {\n        this._setTitle(title);\n      } else {\n        document.title = this.settings.forum_name;\n      }\n    };\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.has = function(obj, key) {\n    if (obj !== undefined) {\n      return obj.hasOwnProperty(key);\n    } else {\n      return false;\n    }\n  };\n\n  ns.get = function(obj, key, value) {\n    if (ns.has(obj, key)) {\n      return obj[key];\n    } else if (value !== undefined) {\n      return value;\n    } else {\n      return undefined;\n    }\n  };\n\n  ns.pop = function(obj, key, value) {\n    var returnValue = ns.get(obj, key, value);\n    if (ns.has(obj, key)) {\n      delete obj[key];\n    }\n    return returnValue;\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.OrderedList = function(items) {\n    this.is_ordered = 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: ns.get(order, 'after'),\n        before: ns.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.is_ordered) {\n        this._items = this._order(this._items);\n        this.is_ordered = 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: 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 (ns) {\n  'use strict';\n\n  ns.startsWith = function(string, beginning) {\n    return string.indexOf(beginning) === 0;\n  };\n\n  ns.endsWith = function(string, tail) {\n    return string.indexOf(tail, string.length - tail.length) !== -1;\n  };\n}(Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.UrlConfInvalidComponentError = function() {\n    this.message = 'component argument should be array or object';\n  };\n\n  ns.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 (typeof component !== 'object') {\n        throw new ns.UrlConfInvalidComponentError();\n      }\n\n      if (pattern === '') {\n        pattern = '/';\n      }\n\n      if (component instanceof ns.UrlConf) {\n        include(pattern, component.patterns());\n      } else {\n        this._patterns.push({\n          pattern: pattern,\n          component: component,\n          name: name\n        });\n      }\n    };\n  };\n} (Misago.prototype));\n\n(function (ns) {\n  'use strict';\n\n  ns.loadingPage = function(_) {\n    return m('.page.page-loading', _.component(ns.Loader));\n  };\n} (Misago.prototype));\n\n(function (ns, UrlConf) {\n  'use strict';\n\n  var urls = new UrlConf();\n  urls.url('/', ns.IndexPage, 'index');\n\n  // Legal pages\n  urls.url('/terms-of-service/', ns.TermsOfServicePage, 'terms_of_service');\n  urls.url('/privacy-policy/', ns.PrivacyPolicyPage, 'privacy_policy');\n\n  ns.urls = urls;\n} (Misago.prototype, Misago.prototype.UrlConf));\n"],"sourceRoot":"/source/"}
+{"version":3,"sources":["misago.js"],"names":["window","Misago","ns","Object","getPrototypeOf","this","self","context","SETTINGS","_services","addService","name","factory","order","push","item","after","get","before","_initServices","services","orderedServices","OrderedList","forEach","undefined","serviceInstance","_destroyServices","reverse","destroy","registerCoreServices","Conf","ComponentFactory","RouterFactory","ajax","api","Outlet","PageTitle","startRouting","setup","init","fixture","inTest","Ajax","_","cookieRegex","RegExp","CSRF_COOKIE_NAME","csrfToken","document","cookie","match","split","runningGets","method","url","data","progress","promise","m","deferred","ajax_settings","headers","X-CSRFToken","dataType","success","pop","resolve","error","jqXHR","rejection","responseJSON","status","statusText","reject","$","preloaded","post","prototype","Api","buildUrl","model","call","querystrings","router","baseUrl","one","id","many","filters","target","component","argumentsArray","i","arguments","length","apply","settings","mount","getElementById","ForumLayout","noop","route","isActive","__controller","controller","__onunload","onunload","vm","__init","initArgs","then","ondata","finalArgs","f","container","errorPage","loading","Loader","__view","view","isReady","Router","attr","staticUrl","mediaUrl","urls","reverses","routedComponent","populatePatterns","urlconf","patterns","finalPattern","pattern","replace","mode","delegateElement","delegateName","cleanUrl","isRelative","substr","location","protocol","host","avatarsUrl","delegateClicks","element","on","e","href","preventDefault","off","prefixUrl","prefix","error403","ban","ErrorBannedRoute","Error403Route","error404","Error404Route","error500","Error500Route","_setTitle","title","completeTitle","page","interpolate","gettext","parent","forum_name","setTitle","ctrl","IndexRoute","forum_index_title","count","prop","increment","console","log","onclick","legalPageFactory","typeName","defaultTitle","dashedTypeName","startComputation","body","endComputation","PageHeader","trust","TermsOfServiceRoute","PrivacyPolicyRoute","legalLink","legalType","FooterNav","isVisible","forum_footnote","terms_of_service","terms_of_service_link","privacy_policy","privacy_policy_link","indexOf","items","ForumFooter","nav","FooterMisagoBranding","BrandFull","branding","children","src","alt","ForumNavbar","desktopNavbar","forum_branding_display","forum_branding_text","config","persistent","el","isInit","retain","LoadingPage","setupMarkup","MisagoMarkup","content","options","has","obj","key","hasOwnProperty","value","returnValue","isOrdered","_items","add","values","values_only","_order","unordered","insertItem","insertAt","ordering","ordered","splice","index","iterations","startsWith","string","beginning","endsWith","tail","UrlConfInvalidComponentError","message","toString","UrlConf","_patterns","prefixPattern","include","loadingPage"],"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\n    var ns = Object.getPrototypeOf(this);\n    var self = this;\n\n    // Context data\n    this.context = {\n      // Empty settings\n      SETTINGS: {}\n    };\n\n    // Services\n    this._services = [];\n    this.addService = function(name, factory, order) {\n      this._services.push({\n        name: name,\n        item: factory,\n        after: this.get(order, 'after'),\n        before: this.get(order, 'before')\n      });\n    };\n\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.name] = 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    this.registerCoreServices = function() {\n      this.addService('conf', ns.Conf);\n      this.addService('component', ns.ComponentFactory);\n      this.addService('router', ns.RouterFactory);\n      this.addService('ajax', ns.ajax);\n      this.addService('api', ns.api);\n      this.addService('outlet', ns.Outlet);\n      this.addService('title', ns.PageTitle);\n      this.addService('start-routing', ns.startRouting);\n    };\n\n    // App init/destory\n    this.setup = false;\n    this.init = function(setup) {\n      this.setup = {\n        fixture: ns.get(setup, 'fixture', null),\n        inTest: ns.get(setup, 'inTest', false)\n      };\n\n      this._initServices(this._services);\n    };\n\n    this.destroy = function() {\n      this._destroyServices();\n    };\n  };\n}());\n\n(function (Misago) {\n  'use strict';\n\n  var Ajax = function(_) {\n    var cookieRegex = new RegExp(_.context.CSRF_COOKIE_NAME + '\\=([^;]*)');\n    this.csrfToken = Misago.get(document.cookie.match(cookieRegex), 0).split('=')[1];\n\n    // list of gets underway\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) {\n      return this.ajax('POST', url);\n    };\n  };\n\n  Misago.ajax = function(_) {\n    return new Ajax(_);\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var Api = function(_) {\n    this.buildUrl = function(model, call, querystrings) {\n      var url = _.router.baseUrl;\n      url += 'api/' + model + '/';\n      return url;\n    };\n\n    this.one = function(model, id) {\n      var url = this.buildUrl(model) + id + '/';\n      return _.ajax.get(url);\n    };\n\n    this.many = function(model, filters) {\n\n    };\n\n    this.call = function(model, target, call, data) {\n\n    };\n  };\n\n  Misago.api = function(_) {\n    return new Api(_);\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.ComponentFactory = function(_) {\n    // Component factory\n    _.component = function() {\n      var argumentsArray = [];\n      for (var i = 0; i < arguments.length; i += 1) {\n        argumentsArray.push(arguments[i]);\n      }\n\n      argumentsArray.push(_);\n      return m.component.apply(undefined, argumentsArray);\n    };\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.Conf = function(_) {\n    _.settings = Misago.get(_.context, 'SETTINGS', {});\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.Outlet = {\n    factory: function(_) {\n      if (_.setup.fixture) {\n        m.mount(document.getElementById(_.setup.fixture),\n                _.component(Misago.ForumLayout));\n      }\n    },\n\n    destroy: function(_) {\n      if (_.setup.fixture) {\n        m.mount(_.setup.fixture, null);\n      }\n    }\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var noop = function() {};\n\n  Misago.route = function(component) {\n    /*\n      Boilerplate for Misago top-level components\n    */\n\n    // Component state\n    component.isActive = true;\n\n    // Wrap controller to store lifecycle methods\n    var __controller = component.controller || noop;\n    component.controller = function() {\n      component.isActive = true;\n\n      var controller = __controller.apply(component, arguments) || {};\n\n      // wrap onunload for lifestate\n      var __onunload = controller.onunload || noop;\n      controller.onunload = function() {\n        __onunload.apply(component, arguments);\n        component.isActive = false;\n      };\n\n      return controller;\n    };\n\n    // Add state callbacks to View-Model\n    if (component.vm && component.vm.init) {\n      // 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              component.container.router.errorPage(error);\n            }\n          });\n        }\n      };\n\n      // setup default loading view\n      if (!component.loading) {\n        component.loading = function () {\n          var _ = this.container;\n          return m('.page.page-loading',\n            _.component(Misago.Loader)\n          );\n        };\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\n    return component;\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 routedComponent = function(component) {\n      component.container = _;\n      return component;\n    };\n\n    var populatePatterns = function(urlconf) {\n      urlconf.patterns().forEach(function(url) {\n        // set service container on component\n\n        var finalPattern = self.baseUrl + url.pattern;\n        finalPattern = finalPattern.replace('//', '/');\n\n        self.urls[finalPattern] = routedComponent(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      m.route.mode = 'pathname';\n      m.route(fixture, '/', this.urls);\n    };\n\n    this.url = function(name) {\n      return this.reverses[name];\n    };\n\n    // Delegate clicks\n    this.delegateElement = null;\n    this.delegateName = 'click.misago-router';\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    this.delegateClicks = function(element) {\n      this.delegateElement = element;\n      $(this.delegateElement).on(this.delegateName, 'a', function(e) {\n        var cleanUrl = self.cleanUrl(e.target.href);\n        if (cleanUrl) {\n          if (cleanUrl != m.route()) {\n            m.route(cleanUrl);\n          }\n          e.preventDefault();\n        }\n      });\n    };\n\n    this.destroy = function() {\n      $(this.delegateElement).off(this.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 = routedComponent(Misago.ErrorBannedRoute);\n      } else {\n        component = routedComponent(Misago.Error403Route);\n      }\n\n      component.vm = error;\n      m.mount(this.fixture, component);\n    };\n\n    this.error404 = function() {\n      m.mount(this.fixture, routedComponent(Misago.Error404Route));\n    };\n\n    this.error500 = function() {\n      m.mount(this.fixture, routedComponent(Misago.Error500Route));\n    };\n\n    this.errorPage = function(error) {\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.RouterFactory = function(_) {\n    return new Router(_);\n  };\n\n  Misago.startRouting = function(_) {\n    _.router.startRouting(Misago.urls, document.getElementById('router-fixture'));\n    _.router.delegateClicks(document.getElementById(_.setup.fixture));\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.PageTitle = function(_) {\n    _._setTitle = 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        completeTitle += ' (' + interpolate(gettext('page %(page)s'), { page:title.page }, true) + ')';\n      }\n\n      if (typeof title.parent !== 'undefined') {\n        completeTitle += ' | ' + title.parent;\n      }\n\n      document.title = completeTitle + ' | ' + this.settings.forum_name;\n    };\n\n    _.setTitle = function(title) {\n      if (title) {\n        this._setTitle(title);\n      } else {\n        document.title = this.settings.forum_name;\n      }\n    };\n  };\n}(Misago.prototype));\n\n\n(function (Misago) {\n  'use strict';\n\n  Misago.Error403Route = Misago.route({\n    controller: function() {\n      this.container.setTitle(gettext('Page not available'));\n    },\n    error: null,\n    view: function(ctrl) {\n      return m('.container', [\n        m('h1', 'Error 403!'),\n        m('p.lead', this.error || 'No perm to see this page')\n      ]);\n    }\n  });\n\n  Misago.Error404Route = Misago.route({\n    controller: function() {\n      this.container.setTitle(gettext('Page not found'));\n    },\n    view: function(ctrl) {\n      return m('.container', [\n        m('h1', 'Error 404!'),\n        m('p.lead', 'Requested page could not be found.')\n      ]);\n    }\n  });\n\n  Misago.Error500Route = Misago.route({\n    controller: function() {\n      this.container.setTitle(gettext('Application error occured'));\n    },\n    view: function(ctrl) {\n      return m('.container', [\n        m('h1', 'Error 500!'),\n        m('p.lead', 'Application has derped.')\n      ]);\n    }\n  });\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.IndexRoute = Misago.route({\n    controller: function() {\n      var _ = this.container;\n      document.title = _.settings.forum_index_title || _.settings.forum_name;\n\n      var count = m.prop(0);\n\n      return {\n        count: count,\n        increment: function() {\n          console.log('increment()');\n          count(count() + 1);\n        }\n      };\n    },\n    view: function(ctrl) {\n      return m('.container', [\n        m('h1', ['Count: ', m('strong', ctrl.count())]),\n        m('p', 'Clicky click button to increase count!.'),\n        m('p',\n          m('button.btn.btn-primary', {onclick: ctrl.increment}, 'Clicky clicky!')\n        )\n      ]);\n    }\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 Misago.route({\n      controller: function() {\n        var _ = this.container;\n\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        isReady: false,\n        init: function(component, _) {\n          if (this.isReady) {\n            _.setTitle(this.title);\n          } else {\n            _.setTitle();\n            return _.api.one('legal-pages', dashedTypeName);\n          }\n        },\n        ondata: function(data, component, _) {\n          m.startComputation();\n\n          this.title = data.title || defaultTitle;\n          this.body = data.body;\n          this.isReady = true;\n\n          m.endComputation();\n\n          if (component.isActive) {\n            _.setTitle(data.title);\n          }\n        }\n      },\n      view: function() {\n        var _ = this.container;\n\n        return m('.page.page-legal.page-legal-' + dashedTypeName, [\n          _.component(Misago.PageHeader, {title: this.vm.title}),\n          m('.container',\n            m.trust(this.vm.body)\n          )\n        ]);\n      }\n    });\n  };\n\n  Misago.TermsOfServiceRoute = legalPageFactory(\n    'terms_of_service', gettext('Terms of service'));\n  Misago.PrivacyPolicyRoute = legalPageFactory(\n    'privacy_policy', gettext('Privacy policy'));\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}, Misago.get(_.settings, legalType + '_title', defaultTitle))\n      );\n    } else {\n      return null;\n    }\n  };\n\n  Misago.FooterNav = {\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(legalLink(_, 'terms_of_service', gettext('Terms of service')));\n      items.push(legalLink(_, 'privacy_policy', gettext('Privacy policy')));\n\n      return m('ul.list-inline.footer-nav', items);\n    }\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.ForumFooter = {\n    view: function(ctrl, _) {\n      var nav = null;\n      if (Misago.FooterNav.isVisible(_.settings)) {\n        nav = _.component(Misago.FooterNav);\n      }\n\n      return m('footer.forum-footer', [\n        m('.container',\n          m('.footer-content', [\n            nav,\n            _.component(Misago.FooterMisagoBranding)\n          ])\n        )\n      ]);\n    }\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.FooterMisagoBranding = {\n    view: function() {\n      return m('a.misago-branding[href=http://misago-project.org]', [\n        \"powered by \", m('strong', \"misago\")\n      ]);\n    }\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.BrandFull = {\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}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.ForumNavbar = {\n    view: function(ctrl, _) {\n      var desktopNavbar = [];\n\n      if (_.settings.forum_branding_display) {\n        desktopNavbar.push(_.component(Misago.BrandFull, _.settings.forum_branding_text));\n      }\n\n      desktopNavbar.push(m('ul.nav.navbar-nav', [\n        m('li', m(\"a\", {config: m.route, href: _.router.url('index')}, 'Index')),\n        m('li', m(\"a\", {config: m.route, href: _.router.url('test')}, 'Test'))\n      ]));\n\n      return m('nav.navbar.navbar-default.navbar-static-top[role=\"navigation\"]', [\n        m('.container.navbar-full.hidden-xs.hidden-sm', desktopNavbar)\n      ]);\n    }\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  Misago.ForumLayout = {\n    view: function(ctrl, _) {\n      return [\n        _.component(Misago.ForumNavbar),\n        m('#router-fixture', {config: persistent}),\n        _.component(Misago.ForumFooter)\n      ];\n    }\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.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.LoadingPage = {\n    view: function(ctrl, _) {\n      return m('.page.page-loading',\n        _.component(Misago.Loader)\n      );\n    }\n  };\n} (Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  var setupMarkup = function(el, isInit, context) {\n    context.retain = true;\n  };\n\n  Misago.MisagoMarkup = {\n    view: function(ctrl, content) {\n      return m('article.misago-markup', {config: setupMarkup}, m.trust(content));\n    }\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.PageHeader = {\n    view: function(ctrl, options) {\n      return m('.page-header',\n        m('.container', [\n          m('h1', options.title),\n        ])\n      );\n    }\n  };\n}(Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.has = function(obj, key) {\n    if (obj !== undefined) {\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      delete obj[key];\n    }\n    return returnValue;\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: keep iterating items\n      // until we hit iterations limit or finish\n      // ordering list\n      function insertItem(item) {\n        var insertAt = -1;\n        if (ordering.indexOf(item.key) === -1) {\n          if (item.after) {\n            insertAt = ordering.indexOf(item.after);\n            if (insertAt !== -1) {\n              insertAt += 1;\n            }\n          } else if (item.before) {\n            insertAt = ordering.indexOf(item.before);\n          }\n\n          if (insertAt !== -1) {\n            ordered.splice(insertAt, 0, item);\n            ordering.splice(insertAt, 0, item.key);\n          }\n        }\n      }\n\n      var iterations = 200;\n      while (iterations > 0 && index.length !== ordering.length) {\n        iterations -= 1;\n        unordered.forEach(insertItem);\n      }\n\n      return ordered;\n    };\n  };\n} (Misago.prototype));\n\n(function (Misago) {\n  'use strict';\n\n  Misago.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.UrlConfInvalidComponentError = function(name) {\n    this.message = \"route's \" + name + \" component should be an array or object\";\n\n    this.toString = function() {\n      return this.message;\n    };\n  };\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 (typeof component !== 'object') {\n        throw new Misago.UrlConfInvalidComponentError(name);\n      }\n\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,\n          name: name\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', _.component(Misago.Loader));\n  };\n} (Misago.prototype));\n\n(function (Misago, UrlConf) {\n  'use strict';\n\n  var urls = new UrlConf();\n  urls.url('/', Misago.IndexRoute, 'index');\n\n  // Legal pages\n  urls.url('/terms-of-service/', Misago.TermsOfServiceRoute, 'terms_of_service');\n  urls.url('/privacy-policy/', Misago.PrivacyPolicyRoute, 'privacy_policy');\n\n  Misago.urls = urls;\n} (Misago.prototype, Misago.prototype.UrlConf));\n"],"sourceRoot":"/source/"}