aboutsummaryrefslogblamecommitdiff
path: root/static/js/autorefresh.js
blob: af61c8b9d5748b32b120db33267001590b725d23 (plain) (tree)



















                                        

                                                                   



                                                           








                              







                                                         




                                                                    
                                          
                    
                                    
 
                                            






                                    
            
                                  
     








                                                                    

                           





                                                                                                           
                       

                                                                  
                       

                                                                
                       
                  
               
                 















                                                             
       
            
                     

                                    



























                                          
                









                                          
         























                                             
              
                                                                

                                 



























                                                                                       


       







                                               



                                                                                


                         
                                     
                             


                                                               
          
                                                  





                                                                                                          

                                                                          













                                     
                                                                   



                          
                                                       

                                              


                                                                 

































                                                                       


                                                                 


                                                          
                                                           












































                                                                           
                                          




                                             
                                                                      










                                                                         
                                      





                                                           
  
















                                                          
 


                                                 

                                                             


                                                    

                                                   
var lastTime = 0;
var refreshInterval;
var refreshMaxTime = 30;
var refreshTime;
var manual = 0;
var serviceType = 0; // 2 = BBS, 3 = IB
var thread_length = 0;
var thread_lastreply = 0;
var thread_title = "";
var thread_first_length = 0;
var http_request = new XMLHttpRequest();

function checkNew(e) {
  e.preventDefault();
  manual = 1;
  loadJSON();
  if (chk.checked) refreshMaxTime = 25;
}

function loadJSON() {
  if (chk.checked) stopCounter("...");
  if (manual) document.getElementById("counter").innerText = "...";
  var data_file;
  if (serviceType == 2 || serviceType == 3) {
    board = document.getElementsByName("board")[0].value;
    parent = document.getElementsByName("parent")[0].value;
    data_file =
      "/cgi/api/thread?dir=" +
      board +
      "&id=" +
      parent +
      "&offset=" +
      thread_length +
      "&time=" +
      lastTime;
  } else {
    return false;
  }
  http_request.open("GET", data_file, true);
  http_request.send();
}

function updateThread(posts, total_replies, serverTime) {
  var threadDiv = document.getElementsByClassName("thread")[0];
  if (serviceType == 2) {
    var repliesDiv = threadDiv.getElementsByClassName("replies")[0];
  }

  for (var i = 0; i < posts.length; i++) {
    post = posts[i];
    var num = thread_length + i + 1;

    var div = document.createElement("div");
    div.id = 'p' + post.id;
    if (serviceType == 2) {
      div.dataset.n = num;
      div.className = "reply";
      if (post.IS_DELETED > 0) {
        div.className += " deleted";
      }
    } else {
      div.className = "replycont";
    }
    
    var s_name = '';
    if (post.email) s_name += '<a href="mailto:' + post.email + '>';
    s_name += '<span class="name"><b>' + post.name + '</b>';
    if (post.tripcode) s_name += ' ' + post.tripcode;
    s_name += '</span>';
    if (post.email) s_name += '</a>';

    var s_img = '';
    if (serviceType == 2) {
      if (post.file) {
        s_img = '<a class="thumb" href="/' + board + '/src/' + post.file + '" target="_blank">' +
        '<img src="/' + board + '/thumb/' + post.thumb + '" width="' + post.thumb_width +
        '" height="' + post.thumb_height + '" title="' + post.file + '-(' + post.file_size + ' B)" /></a>';
      }

      if (post.IS_DELETED == 1) {
        div.innerHTML =
          '<h4>' + num + " : Mensaje eliminado por usuario.</h4>";
      } else if (post.IS_DELETED == 2) {
        div.innerHTML =
          '<h4>' + num + " : Mensaje eliminado por staff.</h4>";
      } else {
        div.innerHTML =
          '<h4>' +
          num +
          " : " +
          s_name +
          ' : <span class="date" data-unix="' +
          post.timestamp +
          '">' +
          post.timestamp_formatted +
          '</span> <span class="del"><a href="/cgi/report/' +
          board +
          "/" +
          post.id +
          "/" +
          num +
          '">rep</a> <a href="#">del</a></span></h4>' +
          s_img +
          '<div class="msg">' +
          post.message +
          "</div>";
      }
    } else {
      var s_msg = '';
      if (post.file) {
        if (post.image_width != 0) {
          s_img =
            '<div class="fs"><a href="/' +
            board +
            "/src/" +
            post.file +
            '" class="expimg" data-id="' +
            post.id +
            '" data-thumb="/' +
            board +
            "/thumb/" +
            post.thumb +
            '" data-w="' +
            post.image_width +
            '" data-h="' +
            post.image_height +
            '" data-tw="' +
            post.thumb_width +
            '" data-th="' +
            post.thumb_height +
            '">' +
            post.file +
            "</a>-(" +
            post.file_size +
            " B, " +
            post.image_width +
            "x" +
            post.image_height +
            ")</div>";
        } else {
          s_img =
            '<div class="fs"><a href="/' +
            board +
            "/src/" +
            post.file +
            '" target="_blank">' +
            post.file +
            "</a>-(" +
            post.file_size +
            " B)</div>";
        }
        s_img +=
          '<a target="_blank" href="/' +
          board +
          "/src/" +
          post.file +
          '" id="thumb' +
          post.id +
          '"><img class="thumb" alt="' +
          post.id +
          '" src="/' +
          board +
          "/thumb/" +
          post.thumb +
          '" width="' +
          post.thumb_width +
          '" height="' +
          post.thumb_height +
          '" /></a>';
        s_msg =
          '<blockquote style="margin-left:' +
          (post.thumb_width + 40) +
          'px;">' +
          post.message +
          "</blockquote>";
      } else {
        s_msg = "<blockquote>" + post.message + "</blockquote>";
      }
      if (post.IS_DELETED == 0) {
        div.innerHTML =
          '<table border="0"><tr><td class="ell">…</td><td class="reply" id="reply' +
          post.id +
          '"><div class="info"><input type="checkbox" name="delete" value="' +
          post.id +
          '" />' +
          (post.subject
            ? ' <span class="subj">' + post.subject + "</span>"
            : "") +
          " " +
          s_name +
          " " +
          '<span class="date" data-unix="' +
          post.timestamp +
          '">' +
          post.timestamp_formatted +
          '</span> <span class="reflink"><a href="#' +
          post.id +
          '">No.</a><a href="#" class="postid">' +
          post.id +
          '</a></span> <a class="rep" href="/cgi/report/' +
          board +
          "/" +
          post.id +
          '">rep</a></div>' +
          s_img +
          s_msg +
          "</td></tr></table>";
      }
    }

    if (serviceType == 2) {
      repliesDiv.appendChild(div);
    } else {
      threadDiv.appendChild(div);
    }

    threadDiv.setAttribute("data-length", num);

    if (serviceType == 2)
      document
        .getElementsByTagName("h3")[0]
        .getElementsByTagName("span")[0].innerText = "(" + num + " respuestas)";
  }

  if (posts.length > 0) {
    if (!manual) refreshMaxTime = 10;
    if (!document.hasFocus())
      if (posts.length > 1)
        notif(thread_title, posts.length + " nuevos mensajes");
      else notif(thread_title, "Un nuevo mensaje");
  } else {
    if (refreshMaxTime <= 60) refreshMaxTime += 5;
  }

  thread_length = parseInt(total_replies) + 1;
  //document.getElementsByClassName("thread")[0].firstChild.children[0].innerHTML = "("+thread_length+")";
  new_unread = thread_length - thread_first_length;

  if (new_unread) document.title = "(" + new_unread + ") " + thread_title;
  else document.title = thread_title;
}

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 detectService() {
  if (document.body.classList.contains("threadpage")) {
    if (!document.getElementById("n")) return;
    thread_title = document.title;
    thread_length = parseInt(
      document.getElementsByClassName("thread")[0].dataset.length
    );
    thread_first_length = thread_length;
    replylist = document.getElementsByClassName("reply");
    lastr = replylist[replylist.length - 1].textContent;
    thread_lastreply = parseInt(lastr.substr(0, lastr.indexOf(" :")));
    if (thread_length == thread_lastreply) {
      serviceType = 2;
      document.getElementById("n").addEventListener("click", checkNew);
      var footer = document.getElementsByClassName("lastposts")[0];
      var in1 = document.createElement("input");
      in1.id = "autorefresh";
      in1.setAttribute("type", "checkbox");
      in1.addEventListener("click", autoRefresh);
      in1.style.display = "none";
      var in2 = document.createElement("label");
      in2.id = "n2";
      in2.setAttribute("for", "autorefresh");
      in2.style.marginRight = "4px";
      in2.style.cursor = "pointer";
      in2.textContent = "Auto refresh";
      var in3 = document.createElement("span");
      in3.id = "counter";
      in3.style.position = "absolute";
      in3.textContent = "OFF";
      footer.appendChild(document.createTextNode(" | "));
      footer.appendChild(in1);
      footer.appendChild(in2);
      footer.appendChild(in3);
      return true;
    } else {
      return false;
    }
  } else if (document.body.className === "res") {
    serviceType = 3;
    thread_title = document.title;
    thread_length = parseInt(
      document.getElementsByClassName("thread")[0].dataset.length
    );
    thread_first_length = thread_length;
    replylist = document.getElementsByClassName("thread");
    replylist += document.getElementsByClassName("reply");
    var footer = document.getElementsByClassName("nav")[1];
    var mnl = document.createElement("a");
    mnl.id = "shownew";
    mnl.href = "#";
    mnl.textContent = "Ver nuevos posts";
    var in1 = document.createElement("input");
    in1.id = "autorefresh";
    in1.setAttribute("type", "checkbox");
    in1.addEventListener("click", autoRefresh);
    in1.style.display = "none";
    var in2 = document.createElement("label");
    in2.setAttribute("for", "autorefresh");
    in2.style.cursor = "pointer";
    in2.title = "Ver nuevos posts automáticamente";
    in2.textContent = "Auto";
    var in4 = document.createElement("span");
    in4.id = "counter";
    in4.textContent = "OFF";
    footer.appendChild(document.createTextNode(" ["));
    footer.appendChild(mnl);
    document.getElementById("shownew").addEventListener("click", checkNew);
    footer.appendChild(document.createTextNode("] ["));
    footer.appendChild(in1);
    footer.appendChild(in2);
    footer.appendChild(document.createTextNode("] "));
    footer.appendChild(in4);
    return true;
  } else {
    return false;
  }
}

function startCounter() {
  refreshTime = refreshMaxTime;
  counter();
  refreshInterval = setInterval(counter, 1000);
}

function stopCounter(str) {
  clearInterval(refreshInterval);
  document.getElementById("counter").innerHTML = str;
}

function autoRefresh(e) {
  chk_snd = document.getElementById("autosound");
  if (document.getElementById("autorefresh").checked) {
    if (chk_snd) chk_snd.disabled = false;
    Notification.requestPermission();
    lastTime = Math.floor(Date.now() / 1000);
    refreshTime = refreshMaxTime;
    startCounter();
  } else {
    if (chk_snd) document.getElementById("autosound").disabled = true;
    stopCounter("OFF");
  }
}

http_request.onreadystatechange = function() {
  if (http_request.readyState == 4) {
    var jsonObj = JSON.parse(http_request.responseText);
    if (jsonObj.state == "success") {
      if (serviceType == 2 || serviceType == 3)
        updateThread(jsonObj.posts, jsonObj.total_replies, jsonObj.time);
      lastTime = jsonObj.time;
      if (chk.checked) startCounter();
    }
    if (!chk.checked) {
      document.getElementById("counter").innerText = "OFF";
    }
    manual = 0;
  }
};
document.addEventListener("DOMContentLoaded", function() {
  if (!detectService()) return;

  chk = document.getElementById("autorefresh");
  chk_snd = document.getElementById("autosound");

  if (localStorage.getItem("autorefresh")) {
    document.getElementById("autorefresh").checked = true;
    autoRefresh();
  }
  if (!chk_snd) return;
  if (localStorage.getItem("mainpage_nosound"))
    document.getElementById("autosound").checked = false;
});

window.addEventListener("unload", function() {
  if (!serviceType) return;

  chk = document.getElementById("autorefresh");
  chk_snd = document.getElementById("autosound");

  if (chk.checked) localStorage.setItem("autorefresh", true);
  else localStorage.removeItem("autorefresh");
  if (!chk_snd) return;
  if (!document.getElementById("autosound").checked)
    localStorage.setItem("mainpage_nosound", true);
  else localStorage.removeItem("mainpage_nosound");
});