function Navigation(modules) { var articles = modules.cache.make(function(key) { var url = ["", blog.path.articlesPath, key + '.md'].join('/'); return modules.async.bind( modules.async.http({method: 'GET', url: url}), function(queryResult) { if(queryResult.status == 200) { return modules.async.wrap(queryResult.responseText); } else { return modules.async.fail( "Could not load article " + url + " (" + queryResult.status + " " + queryResult.statusText + ")" ); } } ); }); window.addEventListener('popstate', function(e) {navigate(e.state.url);}); history.replaceState({url: window.location.pathname}, 'Blog - title', window.location.pathname); return { hijackLinks: hijackLinks }; function hijackLinks(domElem) { domElem = domElem || document; var links = domElem.getElementsByTagName('a'); for(var i = 0; i < links.length; i++) { var a = links[i]; if(a.classList.contains("navigation")) { a.addEventListener('click', visit(a.getAttribute("href"))); } } } function visit(url) { return function(e) { e.preventDefault(); history.pushState({url: url}, 'Blog - title', url); navigate(url); }; } function navigate(url) { var path = url.split("/").slice(1); if(blog.tags[path[0]] != undefined) { show(getArticlesList(path[0], path[1] == "all.html")); } else if(path[0] == blog.path.articlesPath) { show(getArticle(path[1].replace(/\.html$/, ''))); } else { show(getArticlesList(null, path[0] == "all.html")); } } function getArticle(key) { return modules.async.bind( articles.get(key), modules.async.map( function(contents) {return [modules.domRenderer.article(key, contents)];} ) ); } function preview(key) { return modules.async.bind( articles.get(key), function(contents) { return modules.async.wrap( modules.domRenderer.article( key, contents, blog.skin.previewLinesCount ) ); } ); } function articleIds(tag, all) { var ids = tag != undefined ? blog.tags[tag] : Object.keys(blog.articles); var reverseDate = function (id) {return -blog.articles[id].metadata.date;}; ids.sort(modules.fun.compare(reverseDate)); return ids.slice(0, all ? undefined : blog.skin.previewArticlesCount); } function getArticlesList(tag, all) { return modules.async.bind( modules.async.parallel.apply(null, articleIds(tag, all).map(preview)), modules.async.map(modules.domRenderer.articlesList(tag, all)) ); } function show(contents) { modules.async.run( modules.async.bind( contents, modules.async.map(function (domElems) { domElems = domElems.filter(modules.fun.defined); var div = document.getElementById('contents'); modules.dom.clear(div); for(var i = 0; i < domElems.length; i++) { div.appendChild(domElems[i]); } hijackLinks(div); }) ) ); } }