diff options
Diffstat (limited to 'static/js/home.js')
-rw-r--r-- | static/js/home.js | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/static/js/home.js b/static/js/home.js new file mode 100644 index 0000000..0c921ec --- /dev/null +++ b/static/js/home.js @@ -0,0 +1,173 @@ +console.log("%c¡Es calidad BaI!", "font-size: 50px; font-weight: bold;"); + +function set_stylesheet(styletitle) { + opcs.style = styletitle; + parse(); + var links=document.getElementsByTagName("link"); + var found=false; + for(var i=0;i<links.length;i++) { + var rel=links[i].getAttribute("rel"); + var title=links[i].getAttribute("title"); + if(rel.indexOf("style")!=-1&&title) { + links[i].disabled=true; // IE needs this to work. IE needs to die. + if(styletitle==title) { links[i].disabled=false; found=true; } + } + } +} + +function get_active_stylesheet() { + var links=document.getElementsByTagName("link"); + for(var i=0;i<links.length;i++) { + var rel=links[i].getAttribute("rel"); + var title=links[i].getAttribute("title"); + if(rel.indexOf("style")!=-1&&title&&!links[i].disabled) return title; + } + return null; +} + +function check_news() { + var last_t = opcs.last; + var items = document.getElementsByClassName('ni'); + var dates = document.getElementsByClassName('ni-d'); + for(var i=0; i<items.length; i++) if(parseInt(items[i].dataset.t) > last_t) { + items[i].className += ' urgent'; + dates[i].innerHTML = '<img src="/new.gif" style="width:18px;height:7px;"><br />' + dates[i].innerHTML; + } + opcs.last = Date.now() / 1000 | 0; + parse(); +} + +var lastTime = 0; +var refreshInterval; +var refreshMaxTime = 30; +var refreshTime; +var unread = {}; +var last_threads = 0; +var last_serverTime = 0; +var http_request = new XMLHttpRequest(); + +function loadJSON() { + stopCounter("..."); + var data_file = "/cgi/api/lastage?time=" + lastTime + "&limit=" + document.getElementById("limit").value; + http_request.open("GET", data_file, true); + http_request.send(); +} + +function setRead(threadId) { + if (threadId in unread) { + unread[threadId] = false; + updatePostList(last_threads, last_serverTime); + } +} + +function updatePostList(threads, serverTime) { + if (refreshMaxTime <= 120) refreshMaxTime += 5; + var arrayLength = threads.length; + if (!arrayLength) return; + + html = ""; + last_threads = threads; + last_serverTime = serverTime; + + var newposts = 0; + var newTitle = "Bienvenido a Internet BBS/IB"; + var new_unread = false; + var news = []; + + for (var i = 0; i < arrayLength; i++) { + thread = threads[i]; + if (thread.bumped >= lastTime) { + unread[thread.id] = true; + news.push('- ' + thread.board_fulln + ': ' + thread.content); + new_unread = true; + } + if (unread[thread.id]) html += '<span class="new">'; + html += '<a href="' + thread.url + '" class="thread" data-brd="' + thread.board_fulln + '" data-unix="' + thread.timestamp + '" data-last="' + thread.bumped + '" data-img="' + thread.thumb + '"><span class="brd">[' + thread.board_name + ']</span> <span class="cont">' + thread.content + '</span> <span class="rep">(' + thread.length + ')</span></a>'; + if (unread[thread.id]) { + html += '</span>'; + newposts++; + } + } + if (newposts) newTitle = '(' + newposts + ') ' + newTitle; + if (new_unread) { + document.getElementById("newposts").style = "color:red"; + notif('Bienvenido a Internet BBS/IB', 'Hay nuevos mensajes:\n' + news.join('\n')); + refreshMaxTime = 10; + if (document.getElementById('autosound').checked) { + document.getElementById("machina").volume = 0.6; + document.getElementById("machina").play(); + } + } + window.parent.document.title = newTitle; + document.title = newTitle; + document.getElementById("postlist").innerHTML = html; +} + +function notif(title, msg) { + var n = new Notification(title, { body: msg }); + setTimeout(n.close.bind(n), 10000); +} + +function counter() { + if (refreshTime < 1) loadJSON(); + else { + refreshTime--; + document.getElementById("counter").innerHTML = "– " + (refreshTime + 1); + } +} + +function startCounter() { + refreshTime = refreshMaxTime; + counter(); + refreshInterval = setInterval(counter, 1000); +} + +function stopCounter(str) { + clearInterval(refreshInterval); + document.getElementById("counter").innerHTML = str; +} + +function autoRefresh(e) { + if (chk.checked) { + if (chk_snd) chk_snd.disabled = false; + Notification.requestPermission(); + lastTime = Math.floor(Date.now() / 1000); + refreshTime = refreshMaxTime; + startCounter(); + } else { + if (chk_snd) chk_snd.disabled = true; + stopCounter(""); + } +} + +http_request.onreadystatechange = function() { + if (http_request.readyState == 4) { + var jsonObj = JSON.parse(http_request.responseText); + if (jsonObj.state == "success") { + updatePostList(jsonObj.threads, jsonObj.time); + lastTime = jsonObj.time; + if (chk.checked) startCounter(); + } + } +} + +function parse() { localStorage.setItem("home", JSON.stringify(opcs)); } + +document.addEventListener("DOMContentLoaded", function() { + if (localStorage.hasOwnProperty("home")) opcs=JSON.parse(localStorage.getItem("home")); + else { opcs={"style":"IB","auto":false,"sound":false,"last":0}; parse(); } + set_stylesheet(opcs.style); + + var css = document.getElementById("change_style").getElementsByTagName("a"); + for(var j=0;j<css.length;j++) { + css[j].addEventListener("click", function(e) { e.preventDefault(); set_stylesheet(this.textContent); }); + } + document.getElementById("autorefresh").addEventListener("click", function(e) { opcs.auto=!opcs.auto; autoRefresh(); parse(); }); + document.getElementById("autosound").addEventListener("click", function(e) { opcs.sound=!opcs.sound; parse(); }); + check_news(); + + chk=document.getElementById("autorefresh"); + chk_snd=document.getElementById("autosound"); + if (opcs.auto) { chk.checked=true; autoRefresh(); } else chk.checked=false; + if (opcs.sound) chk_snd.checked=true; else chk_snd.checked=false; +});
\ No newline at end of file |