// ==UserScript==
// @name           Tumblr AutoPager
// @namespace      http://kgcreative.tumblr.com/
// @description    Automatically load the next page of a tumblelog
// @include        http://kgcreative.tumblr.com/*
// @exclude        http://*.tumblr.com/post/*
// ==/UserScript==

var pager = {
  page: 2,
  foot: document.getElementById("footer"),

  scroll: function(){
    var scrollHeight = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);
    if (scrollHeight - window.innerHeight - window.scrollY > 100)
      return;

    if (this.requested == pager.page)
      return; // already loading the next page

    this.requested = pager.page;

    pager.foot.style.display = "block";
    pager.foot.textContent = "Loading...";

    //GM_log("http://" + location.host + "/page/" + pager.page);

    GM_xmlhttpRequest({
      method: "GET",
      url: "http://" + location.host + "/page/" + pager.page,
      onload: pager.loaded,
      onerror: pager.error
    });
  },

  loaded: function(data){
    var result = document.createElement('div');
    result.innerHTML = data.responseText;

    var posts = document.evaluate("//div[@class='post']", result, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);

    if (!posts.snapshotLength)
      window.removeEventListener("scroll", pager.scroll, true);

    for (var i = 0; i < posts.snapshotLength; i++)
      pager.foot.parentNode.insertBefore(posts.snapshotItem(i), pager.foot);

    pager.foot.style.display = "none";
    pager.page++;
  },

  error: function(){
    window.removeEventListener("scroll", pager.scroll, true);
  }
}

if (pager.foot)
  window.addEventListener("scroll", pager.scroll, true);