User:Bradv/splitpreview.js

From OpenWetWare
Jump to navigationJump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/*
* Split-screen Edit Preview
*     Author: User:Bradv
*/
splitPreview = {
    enabled:   true,
    width:     null
};
 
splitPreview.init = function() {
    if (wgAction == "edit" || wgAction == "submit") {
        splitPreview.loadCookies();
        if (splitPreview.enabled) {
            splitPreview.draw();
        }
    }
};

splitPreview.loadCookies=function() {
    function readCookie(name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for(var i=0;i < ca.length;i++) {
            var c = ca[i];
            while (c.charAt(0)==' ') { c = c.substring(1,c.length); }
            if (c.indexOf(nameEQ) === 0) { return c.substring(nameEQ.length,c.length); }
        }
        return '';
    }

    var w = readCookie('splitPreview_width');
    if (w) {
        splitPreview.width = w;
    }
};

splitPreview.saveCookies=function() {
    var cend = "; expires=Tue, 31-Dec-2030 23:59:59 GMT; path=/";
    document.cookie = 'splitPreview_width=' + splitPreview.width.toString() + cend;
};

splitPreview.draw=function() {
    var wp = document.getElementById('wikiPreview');

    if (wp) {
        var w = splitPreview.width;
        if (!w) {
            w = window.innerWidth / 3 + 'px';
        }
        //Make room
        var topbar = document.evaluate('//div[@id="p-personal"]//div[@class="pBody"]', 
            document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
        if (topbar.singleNodeValue) {
            topbar = topbar.singleNodeValue;
            topbar.style.marginRight=w;
        }

        //Find the container where the placeholder goes.
        //This differs between monobook and modern skins.
        var container = document.getElementById('content');
        if (!container) {
            container = document.getElementById('mw_content');
        }
        container.style.marginRight = w;

        var ph = document.createElement('div');
        with (ph) {
            id='splitPreview_placeholder';
            style.width=w;
            style.top='0px';
            style.right='0px';
            style.bottom='0px';
            style.zIndex=90;
            style.position='fixed';
            style.backgroundColor=document.defaultView.getComputedStyle(document.body, null).backgroundColor;
            //innerHTML = "<div style='width:"+ph.style.width+";position:relative'>Testing...</div>";
        }
        container.appendChild(ph);

        var slider = document.createElement('div');
        with (slider) {
            id='splitPreview_slider';
            style.position='absolute';
            style.width='.5em';
            style.top='0px';
            style.left='0px';
            style.bottom='0px';
            style.borderLeft='1px solid #aaaaaa';
            style.cursor='w-resize';
            style.float='left';
        }
        ph.appendChild(slider);

        slider.onmousedown=function(event) {
            event.preventDefault();
            slider.initialWidth = parseInt( window.innerWidth - event.clientX - ph.offsetWidth );
            window.onmouseup=function(event) {
                window.onmousemove=null;
                window.onmouseup=null;
                with (splitPreview) {
                    width=w;
                    saveCookies();
                }
            }
            window.onmousemove=function(event) {
                if (event.clientX > (window.innerWidth / 3)) {
                    w=window.innerWidth - event.clientX - slider.initialWidth+'px';
                    topbar.style.marginRight=w;
                    ph.style.width=w;
                    container.style.marginRight=w;
                }
            }
        }

        with (wp) {
            style.position='absolute';
            style.top='0px';
            style.left='0.5em';
            style.right='0.5em';
            style.bottom='0px';
            style.float='right';
            style.overflow='auto';
        }
        ph.appendChild(wp);
    }
};

addOnloadHook(splitPreview.init);