// Copyright (c) 2005 trixiedev@gmail.com
// This script is licensed under the MIT license.  See
// http://opensource.org/licenses/mit-license.php for more details.
//
// ==UserScript==
// @name          Page Break Indicator
// @namespace     http://www.bhelpuri.net/Trixie
// @description	  Adds a page break indicator to aid readability of multi-page documents
// @include       *
// ==/UserScript==

//
// Discussion forum: http://groups.yahoo.com/group/trixieUsers/
//

(function()
{
    var PageBreakIndicator = 
    {
        init : function()
        {
            var divPageBreak = document.createElement("div");
            divPageBreak.style.position = "absolute";
            divPageBreak.style.display = "none";
            divPageBreak.style.borderBottom = "2px dashed #ff0000";
            divPageBreak.style.filter = "alpha(opacity=40)";

            document.body.appendChild(divPageBreak);
            
            var timerId = null;
            var timerOnLoad = null;
            var timeOut = 2000;
            var pageBreakPadding = 30;
            var isFirefox = false;

            if (navigator.userAgent.indexOf("Firefox") > 0)
                isFirefox = true;
            
            var showPageBreak = function()
            {
                if (document.readyState != "complete" || !document.body.createTextRange)
                    return;

                var bounds;
                if (!isFirefox)
                    bounds = document.body.createTextRange().getBoundingClientRect();

                var bodyElem = document.body;
                if (document.compatMode == "CSS1Compat")
                    bodyElem = document.documentElement;
                    
                // todo: do equivalent for firefox - probably innerHeight and clientHeight compare
                if (!isFirefox)
                {                    
                    // If the document is smaller than client size, do nothing
                    //
                    if (bounds.bottom < bodyElem.clientHeight)
                        return;
                }
                
                var divMargin = 40;
                divPageBreak.style.top = bodyElem.clientHeight+bodyElem.scrollTop-pageBreakPadding;
                divPageBreak.style.left = divMargin/2 + "px";
                divPageBreak.style.width = bodyElem.clientWidth-divMargin + "px";
                divPageBreak.style.display = "block";
            }
            
            var showPageBreakDeferred = function()
            {
                if (timerId != null)
                    clearTimeout(timerId);
                    
                timerId = setTimeout(function () { showPageBreak(); clearTimeout(timerId); }, timeOut);
            }
            
            var onResize = function()
            {
                // Hide previous page break
                divPageBreak.style.display = "none";
                showPageBreakDeferred();
            }
            
            timerOnLoad = setTimeout(function () { showPageBreak(); clearTimeout(timerOnLoad); }, timeOut);            

            if (!isFirefox)
            {
                window.attachEvent("onscroll", showPageBreakDeferred);
                window.attachEvent("onresize", onResize);
            }
            else
            {
                window.addEventListener("scroll", showPageBreakDeferred, false);
                window.addEventListener("resize", onResize, false);
            }
        }
    };
    
    PageBreakIndicator.init();
}
)();