// ==UserScript==
// @name            Delicious Auto Pager
// @namespace       http://opera.higeorange.com/
// @include         http://del.icio.us/*
// ==/UserScript==

// Released under the GPL license
// http://www.gnu.org/copyleft/gpl.html

// This script was made based on Delicious Auto Pager. (http://d.hatena.ne.jp/nirvash/20050729/1122668281) and GoogleAutoPager. (http://la.ma.la/blog/diary_200506231749.htm)

(function() {
    var isEnable = 1;
    var insertPoint = document.evaluate(
        '//ol[@class="posts"]',
        document.body,
        null,
        XPathResult.FIRST_ORDERED_NODE_TYPE,
        null
    ).singleNodeValue;
    var nextUrl;
    var query;
    var offset;

    var do_request = function() {
        if (this.requested == offset) {
            return;
        }

        // create loading status
        var load = document.createElement('span');
            load.style.position   = "fixed";
            load.style.top        = "0px";
            load.style.right      = "0px";
            load.style.background = "#c33";
            load.style.color      = "#fff";
            load.style.fontSize   = "12px";
            load.style.padding    = "3px";
            load.appendChild(document.createTextNode("loading..."));
        document.body.appendChild(load);

        this.requested = offset;
        var xmlhttp;
        xmlhttp = new XMLHttpRequest();

        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4) {
                var v = xmlhttp.responseText;
                var isEnd = 0;

                var div = document.createElement('div');
                div.innerHTML = v;

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

                for(var i=0,len=data.snapshotLength;i<len;i++) {
                    insertPoint.appendChild(data.snapshotItem(i));
                }

                window.status = "loading page " + offset + " done.";
                offset += 1;
                //remove loading status
                document.body.removeChild(load);
            }
        };

        xmlhttp.open("GET", nextUrl.replace(/page=\d*/, "page=" + offset), true)
        window.status = "loading page " + offset;
        xmlhttp.send(null);
    };

    var watch_scroll = function() {
        try {
            if (isEnable == 1) {
                var sc, total;
                sc = document.body.scrollTop;
                total = (document.body.scrollHeight - document.body.clientHeight);
                var remain = total - sc;
                if (remain < 300) {
                    do_request();
                }
            }
        } catch (e) {
        };
        var self = arguments.callee;
//        setTimeout(self, 100);
    };


    var init_autopager = function() {
        // find prev
        var atag = document.getElementsByTagName("a");
        var len = atag.length;
        var prev;
        for (var i=0; i<len; i++) {
            if (atag[i].rel == "prev") {
                prev = atag[i];
            }
        }

        nextUrl = prev.href;
        query = nextUrl.substr(nextUrl.indexOf("?")); 
        offset = (query.match(/page=(\d*)/))[1] - 0;
    };

    

    // initialize
    if (window.location.href.indexOf("del.icio.us") != -1) {
        init_autopager();
        document.addEventListener('scroll', watch_scroll, false);
    }
})();

