﻿if (!window.EntryPager) {
    window.EntryPager = {}
    EntryPager.downloadStack = {}
    EntryPager.scrollChecking = false;
    EntryPager.addingContent = false;

    EntryPager.__startup = function() {
        var pagingSize = document.getElementById("pagingSize");
        EntryPager.pagingSize = parseInt(pagingSize.innerHTML);
        var currentPage = document.getElementById("currentPage");
        EntryPager.currentPage = parseInt(currentPage.innerHTML);
        var numPages = document.getElementById("numPages");
        EntryPager.numPages = parseInt(numPages.innerHTML);
        var pagingUrl = document.getElementById("pagingUrl");
        EntryPager.pagingUrl = pagingUrl.innerHTML;

        for (var page = EntryPager.currentPage + 1; page < EntryPager.numPages + 1; page++) {
            EntryPager.downloadStack[page] = {
                "pageUrl": EntryPager.pagingUrl.replace("{page}", page).replace("{size}", EntryPager.pagingSize),
                "body": ""
            }
        }

        EntryPager.startDownload();
    }


    EntryPager.startDownload = function() {

        var readMoreDiv = document.getElementById("readMore");

        if (EntryPager.currentPage >= EntryPager.numPages) {
            readMoreDiv.className = "done";
            return;  // done!
        }
        EntryPager.downloadingPage = EntryPager.currentPage + 1;
        EntryPager.downloadedPage = EntryPager.currentPage;
        var xmlHttp = null;
        if (window.XMLHttpRequest) {
            // If IE7, Mozilla, Safari, and so on: Use native object.
            xmlHttp = new XMLHttpRequest();
        }
        else {
            if (window.ActiveXObject) {
                // ...otherwise, use the ActiveX control for IE5.x and IE6.
                xmlHttp = new ActiveXObject('MSXML2.XMLHTTP.3.0');
            }
        }

        EntryPager.xmlHttp = xmlHttp;
        xmlHttp.onreadystatechange = EntryPager.loadProgress;
        xmlHttp.open("GET", EntryPager.downloadStack[EntryPager.downloadingPage].pageUrl, true);
        readMoreDiv.className = "loading";
        xmlHttp.send(null);
    }

    EntryPager.extractBody = function(body) {
        var startDelim = "<!-- begin writingsList -->";
        var endDelim = "<!-- end writingsList -->";
        var sdlen = startDelim.length;
        var start = body.indexOf(startDelim);
        var end = body.indexOf(endDelim);
        if (start == -1 || end == -1) return "";

        return body.substr(start + sdlen, end - (start + sdlen));
    }

    EntryPager.loadProgress = function() {
        var xmlHttp = EntryPager.xmlHttp;
        if (xmlHttp.readyState != 4) return;

        if (xmlHttp.status == 200) {
            var body = EntryPager.extractBody(xmlHttp.responseText);
            EntryPager.downloadStack[EntryPager.downloadingPage].body = body;
            EntryPager.downloadedPage = EntryPager.downloadingPage;
            var readMoreDiv = document.getElementById("readMore");
            readMoreDiv.className = "";
        }
    }

    EntryPager.showMoreEntries = function() {
        if (EntryPager.currentPage >= EntryPager.numPages) return;

        if (EntryPager.downloadedPage == EntryPager.downloadingPage) {
            var newDiv = document.createElement("div");
            newDiv.innerHTML = EntryPager.downloadStack[EntryPager.downloadedPage].body;
            var writingsDiv = document.getElementById("writingsList");
            EntryPager.addingContent = true;
            while (newDiv.children.length > 0) {
                writingsDiv.insertAdjacentElement("beforeEnd", newDiv.children[0]);
                EntryPager.incrementEntryCounts();
            }
            EntryPager.currentPage = EntryPager.downloadedPage;
            EntryPager.addingContent = false;

            EntryPager.startDownload();
        }
        else {
            // need to wait awhile
            setTimeout(EntryPager.showMoreEntries, 1000);
        }
    }

    EntryPager.incrementEntryCounts = function() {
        var entriesCountSpan = document.getElementById("entriesCount");
        var entriesLastSpan = document.getElementById("entriesLast");

        if (entriesCountSpan) entriesCountSpan.innerHTML = parseInt(entriesCountSpan.innerHTML) + 1;
        if (entriesLastSpan) entriesLastSpan.innerHTML = parseInt(entriesLastSpan.innerHTML) + 1;
    }

    EntryPager.scrollCheck = function() {
        if (!EntryPager.scrollChecking && !EntryPager.addingContent) {
            EntryPager.scrollChecking = true;
            setTimeout(EntryPager.scrollCheckAfterDelay, 600);
        }
    }

    EntryPager.scrollCheckAfterDelay = function() {
        var scrOfY = 0;
        if (typeof (window.pageYOffset) == 'number') {
            //Netscape compliant
            scrOfY = window.pageYOffset;
        } else if (document.body && (document.body.scrollLeft || document.body.scrollTop)) {
            //DOM compliant
            scrOfY = document.body.scrollTop;
        } else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
            //IE6 standards compliant mode
            scrOfY = document.documentElement.scrollTop;
        }

        var writingsListDiv = document.getElementById("writingsList");
        var writings = writingsListDiv.children;
        var testNode = null;

        for (var child = writings.length - 1; child >= 0; child--) {
            testNode = writings[child];

            if (testNode.nodeName.toLowerCase() == "div") break;
        }

        if (testNode.offsetTop - testNode.offsetHeight < scrOfY + 300) {
            // comment out the statement below if you don't want it to scroll on mousewheel
            EntryPager.showMoreEntries();
        }
        EntryPager.scrollChecking = false;

    }

    if (window.addEventListener) {
        window.addEventListener('scroll', EntryPager.scrollCheck, false);
    } else {
        window.attachEvent('onscroll', EntryPager.scrollCheck);
    }
    
    EntryPager.__loaded = true;

}

if (typeof HTMLElement != "undefined" && !HTMLElement.prototype.insertAdjacentElement) {
    HTMLElement.prototype.insertAdjacentElement = function(where, parsedNode) {
        switch (where) {
            case 'beforeBegin':
                this.parentNode.insertBefore(parsedNode, this)
                break;
            case 'afterBegin':
                this.insertBefore(parsedNode, this.firstChild);
                break;
            case 'beforeEnd':
                this.appendChild(parsedNode);
                break;
            case 'afterEnd':
                if (this.nextSibling)
                    this.parentNode.insertBefore(parsedNode, this.nextSibling);
                else this.parentNode.appendChild(parsedNode);
                break;
        }
    }
}

if (window.addEventListener) {
    window.addEventListener('load', EntryPager.__startup, false);
} else {
    window.attachEvent('onload', EntryPager.__startup);
}