B.O.R.E.D.

By O_Lawd Last update Jan 29, 2013 — Installed 1,905 times.

There are 31 previous versions of this script.

Add Syntax Highlighting (this will take a few seconds, probably freezing your browser while it works)

// ==UserScript==
// @name        Bored
// @namespace   http://userscripts.org/O_Lawd
// @include     http://derpiboo.ru/*
// @include     http://www.derpiboo.ru/*
// @include     http://derpibooru.org/*
// @include     http://www.derpibooru.org/*
// @include     https://derpiboo.ru/*
// @include     https://www.derpiboo.ru/*
// @include     https://derpibooru.org/*
// @include     https://www.derpibooru.org/*
// @version     0.2.6c
// @updateURL   http://userscripts.org/scripts/source/137452.meta.js
// @description Booru On Rails Extension Demo: Various (Likely Temp) Tweaks for Derpiboo.ru
// ==/UserScript==

function BOREDInit() {
    'use strict';

    // Options.
    // TODO: I think code will end up cleaner if I make this a function and tie
    // it directly to respective feature functions.
    var BOREDConfig = {
            MOVE_WATCHED_LINK: true,
            AUTO_EXPAND_COMMENT_IMAGES: true,
            HIDE_COMMENT_IMAGES: false,
            SHOW_REVERSE_SEARCH_LINKS: true,
            SHOW_ZOOM_CURSOR: true,
            ENABLE_MARKITUP: true,
            ENABLE_FILE_UPLOAD_PREVIEW: true,
            NOSTALGIA_MODE: false,
            SAVE_DRAFTS: true,
            ENABLE_RANDOM_BUTTON: true,
    
            PANEL: {
                'Layout': {
                    MOVE_WATCHED_LINK: 'Move "Watched" Link to Top-Right ' +
                                       'Corner',
                    NOSTALGIA_MODE: 'Nostalgia Mode (Not Serious!)',
                    ENABLE_RANDOM_BUTTON: 'Random Image Link (Fun! Fun! Fun!)'
                },
                'Images': {
                    AUTO_EXPAND_COMMENT_IMAGES: 'Click to Expand Comment ' +
                                                'Images',
                    ENABLE_FILE_UPLOAD_PREVIEW: 'Preview Manual File Uploads',
                    SHOW_ZOOM_CURSOR: 'Show Zoom Cursors',
                    SHOW_REVERSE_SEARCH_LINKS: 'Reverse Image Search Links'
                },
                'Comment Editing': {
                    ENABLE_MARKITUP: 'Enable markItUp! WYSIWYM Editing',
                    SAVE_DRAFTS: 'Save comment draft on unload. (Recommended!)'
                }
            }
        },
        menusEnabled = false,
        $imageInput,
        zin = 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAeUlEQVQ4jZ2SSxLAIAhDE8f7X5ku+hmUYFF21PASsUQsm3oKjTw0ADAb50kqbQDYPBiENyhAWiZ2zstqFfcnIhD3gy5ihn5lIK+wU0OC16ni7BOwsrDsFXqU1pw/sJ9TwyId08aDhMbEt/V//gPXS9mFnABmyHEZAFz7NScel1h+CQAAAABJRU5ErkJggg==), auto',
        zout = 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAaElEQVQ4jc1SQQ6AMAwC4/+/jAdj4lrs6rzIbSvQdoPIUDjTcGxRACCNepKOmwwUhYl4GiWTrVQ1wE73aordEBKqBp9XGCbornLHP37hwixITmPT9RRlmbs65xNz/yhvTVYMoskyBAAHxlghFIXfFBsAAAAASUVORK5CYII=), auto';

    BOREDConfig.setOpt = function (optName, val) {
        BOREDConfig[optName] = val;
        BOREDConfig.saveSettings();
    };

    BOREDConfig.makePanel = function () {
        var $settingsLink = $('<a href="#">Ext</a>'),
            $panelDiv = $('<form class="boredpanel"></form>'),
            $submit = $('<input type="submit" value="Save and Reload" />'),
            $cancel = $('<input type="reset" value="Cancel" />'),
            widgets = [];

        if ($('a[href="/users/sign_in"]').length) {
            $settingsLink.insertBefore('.userbox > a[href="/users/sign_in"]');
        } else {
            $settingsLink.insertBefore('.userbox > a[href="/users/sign_out"]');
        }

        // Create the HTML and option widgets.
        $panelDiv.append('<h2>B.O.R.E.D. Settings</h2>');
        $.each(BOREDConfig.PANEL, function (header, options) {
            $panelDiv.append('<h3>' + header + '</h3>');

            // Every option at the moment is a plain Boolean. In the future,
            // I'll make text and integer widgets with tests done with the
            // instanceof operator.
            $.each(options, function (name, description) {
                var widget = new BOREDConfig.BooleanWidget(name, description,
                                                           BOREDConfig[name]);
                $panelDiv.append(widget.element);
                widgets.push(widget);
            });
        });
        $panelDiv.append($submit).append($cancel);

        // Panel CSS.
        $panelDiv.css({
            display: 'none',
            position: 'absolute',
            right: '4px',
            top: '40px',
            width: '400px',
            zIndex: '9001',
            overflow: 'hidden'
        });
        $panelDiv.addClass('image_description');
        $('.field', $panelDiv).css({
            marginTop: '0.5em',
            marginBottom: '0.5em'
        });
        $('.field label', $panelDiv).css('width', '300px');
        $('h2,h3', $panelDiv).css('text-align', 'center');
        $('h2', $panelDiv).css({
            fontWeight: 'bold',
            marginBottom: '0.5em'
        });
        $('h3', $panelDiv).css({
            marginTop: '1em',
            marginBottom: '0.5em'
        });
        $submit.css({
            width: '80%',
            margin: '1em auto 0.5em 10%'
        });
        $cancel.css({
            width: '80%',
            margin: '0 auto 0.3em 10%',
            // It defaults to Courier New, lol
            fontFamily: 'verdana,arial,helvetica,sans-serif'
        });

        $panelDiv.insertAfter('#header');

        $settingsLink.click(function () {
            $('.boredpanel').stop(true, true).slideToggle('fast');
            return false;
        });

        $panelDiv.submit(function () {
            $.each(widgets, function(i, widget) {
                widget.writeSetting();
            });
            BOREDConfig.saveSettings();
        });

        $panelDiv.on('reset', function () {
            $settingsLink.click();
        });
    };

    BOREDConfig.BooleanWidget = function (name, label, initial) {
        var id = 'BORED-' + name,
            $el = $('<div class="field"><input type="checkbox" id="' + id +
                    (initial ? '" checked="checked" ' : '" ') + '/>' +
                    '<label for="' + id + '">' + label + '</label></div>');

        this.name = name;
        this.element = $el;
    };

    BOREDConfig.BooleanWidget.prototype.getInput = function () {
        return $('input', this.element);
    };

    BOREDConfig.BooleanWidget.prototype.writeSetting = function () {
        BOREDConfig[this.name] = this.getInput().is(':checked');
    };

    BOREDConfig.loadSettings = function () {
        var cooks = document.cookie.split(/\s*;\s*/).map(function(cook) {
            return cook.substring(0, cook.indexOf("="));
        }).filter(function(cook) {
            return cook.indexOf("BOREDConfig") === 0;
        });
        // Checks if there are still some cookie-based config options
        if (cooks.length) {
            cooks.forEach(function(cook) {
                var value = $.cookie(cook), option = cook.substring(12);
                if (value && option !== "PANEL") {
                    BOREDConfig[option] = JSON.parse(value);
                }
                $.cookie(cook, null); // Erases the cookie.
            });
            this.saveSettings(); // Saves the settings with the new method
        } else {
            $.each(this, function(option, val) {
                var value;
                if (!(val instanceof Function) && option !== 'PANEL') {
                    value = localStorage['BOREDConfig_' + option];
                    if (value && option !== 'PANEL') {
                        BOREDConfig[option] = JSON.parse(value);
                    }
                }
            });
        }
    };

    BOREDConfig.saveSettings = function () {
        $.each(BOREDConfig, function(option, val) {
            if (!(val instanceof Function) && option !== 'PANEL') {
                localStorage['BOREDConfig_' + option] = JSON.stringify(val);
            }
        });
    };

    // Slide-down menu functionality for the metabar.
    function SlideDownMenu($element, minWidth) {
        var $m = $('<div class="slidedownmenu" ' +
                   'style="display:inline;vertical-align:top;">' +
                   '<div class="slidedownmenu-inner" ' +
                   'style="position:absolute;display:none;' +
                   'min-width:' + minWidth + '"></div></div>'),
            $menu = $('div.slidedownmenu-inner', $m);

        if (!menusEnabled) {
            $(document).on('mouseenter', 'div.slidedownmenu', function () {
                $(this).find('.slidedownmenu-inner').stop(true, true)
                       .slideDown('fast');
            }).on('mouseleave', 'div.slidedownmenu', function () {
                $(this).find('.slidedownmenu-inner').stop(true, true)
                       .slideUp('fast');
            });
            menusEnabled = true;
        }

        $element.insertBefore($menu);

        this.body = $menu;
        this.top = $m;
    }

    // Utility function for inserting at caret for selected <textarea>s.
    // It's almost 4AM, and I don't feel like messing with DOM (or IE), so
    // this snippet is from
    // http://stackoverflow.com/questions/946534/insert-text-into-textarea-with-jquery
    // Thanks go to Aniebiet Udoh.
    $.fn.extend({
        insertAtCaret: function(myValue) {
            return this.each(function(i) {
                if (document.selection) {
                    //For browsers like Internet Explorer
                    this.focus();
                    document.selection.createRange().text = myValue;
                    this.focus();
                } else if (this.selectionStart || this.selectionStart === 0) {
                    //For browsers like Firefox and Webkit based
                    var startPos = this.selectionStart,
                        endPos = this.selectionEnd,
                        scrollTop = this.scrollTop;
                    this.value = this.value.substring(0, startPos) + myValue +
                                 this.value.substring(endPos, this.value.length);
                    this.focus();
                    this.selectionStart = startPos + myValue.length;
                    this.selectionEnd = startPos + myValue.length;
                    this.scrollTop = scrollTop;
                } else {
                    this.value += myValue;
                    this.focus();
                }
            });
        }
    });

    function zoomCursors() {
        $('div#image_target').css('cursor', zin).click(function () {
            var $this = $(this);
            if ($this.data('expanded')) {
                $this.data('expanded', false);
                $this.css('cursor', zin);
            } else {
                $this.data('expanded', true);
                $this.css('cursor', zout);
            }
        });
    }

    // Move the "Watched" link to the user nav bar.
    function moveWatched() {
        $('div#navigation > a[href="/images/watched"]')
            .insertBefore('div.userbox > a[href="/messages"]');
    }

    // Related images link. I should probably make this a menu for TinEye, too.
    function relImages() {
        var $metabar = $('div.metabar'),
            $insertPoint,
            url,
            $header,
            menu;

        if (!$metabar.data('attachedRel')) {
            $insertPoint = $metabar.find('div.metasection:nth-last-child(2)');
            url =  $insertPoint.find('a:first-child').attr('href');
            $header = $('<a href="#">Rev. Img. Search \u25BC</a>');
            menu = new SlideDownMenu($header, '12em');
        
            $insertPoint.prepend(menu.top);
        
            menu.body.append(
                '<a style="display:block" href="https://www.google.com/' +
                    'searchbyimage?num=10&hl=en&site=imghp&image_url=' + url +
                    '" target="_blank">Google</a><a style="display:block" ' +
                    'href="http://www.tineye.com/search/?url=' + url +
                    '" target="_blank">TinEye</a></div></div>'
            );
            $metabar.data('attachedRel', true);
        }
    }
    
    function loadDraft(draftId, txtSel) {
        var draft = localStorage["BOREDDraft_" + draftId];

        if (!draft) return;
        try {
            draft = JSON.parse(draft);
        } catch(e) { // Something wrong has happened
            localStorage.removeItem("BOREDDraft_" + draftId);
            return;
        }

        if (draft.timeStamp < Date.now() - 12096e5) {
            // Drafts older than 2 weeks are trashed
            localStorage.removeItem("BOREDDraft_" + draftId);
            return;
        }
        if (draft.content) {
            // There shouldn't be empty drafts...
            $(txtSel).val(draft.content);
        }
    }

    function saveDraft(draftId, txtSel) {
        var content = $(txtSel).val();
        if (content)
            localStorage["BOREDDraft_" + draftId] = JSON.stringify({
                timeStamp: Date.now(),
                content: content
            });
        else localStorage.removeItem("BOREDDraft_" + draftId);
    }

    function manageDrafts() {
        var txtSel, draftId, $comments, firstTime = true;

        // The assignment in the if condition is intentional
        if (draftId = location.pathname.match(/^\/(?:images\/)?(\d+)$/)) {
            txtSel = "#comment_body";
            draftId = draftId[1];
            $comments = $('#comments');
            $comments.ajaxSend(function(evt, xhr, opts) {
                // Saving the draft when changing comment page
                if (opts.url.indexOf('/images/' + draftId + '/comments')
                        !== -1) {
                    if (firstTime) {
                        firstTime = false;
                    } else if (opts.type === "GET") {
                        saveDraft(draftId, txtSel);
                    }
                }
            });
            $(document).ajaxComplete(function(evt, xhr, opts) {
                // If the request was a POST, then a comment was posted.
                // saveDraft just trashes the draft, then.
                if (opts.type === "POST") saveDraft(draftId, txtSel);
                else loadDraft(draftId, txtSel);
            });
            loadDraft(draftId, txtSel);
        } else if (draftId
                = location.pathname.match(/^\/messages\/([\da-f]+)$/)) {
            txtSel = "#body";
            draftId = draftId[1];
            loadDraft(draftId, txtSel);
            $($(txtSel)[0].form).submit(function() {
                localStorage.removeItem("BOREDDraft_" + draftId);
            });
        }

        $(window).unload(function() {saveDraft(draftId, txtSel);});
    }

    function ImageResizer($image, maxWidth, maxHeight) {
        var expander = this;

        this.maxWidth = maxWidth || 500;
        this.maxHeight = maxHeight || 500;
        this.image = $image;
        this.domImage = $image[0];
        this.origWidth = this.domImage.naturalWidth || this.domImage.width;
        this.origHeight = this.domImage.naturalHeight || this.domImage.height;
        this.expanded = false;

        // CSS workaround.
        $image.css('max-width', this.origWidth);

        this.shrinkImageSize();

        $image.click(function () {
            if (expander.expanded) {
                expander.shrinkImageSize();
            } else {
                expander.expandImageSize();
            }
        });
    }

    ImageResizer.prototype.shrinkImageSize = function () {
        var domImage = this.domImage,
            maxWidth = this.maxWidth,
            maxHeight = this.maxHeight;

        if (domImage.width > maxWidth) {
            domImage.height = domImage.height / domImage.width * maxWidth;
            domImage.width = maxWidth;
        }

        if (domImage.height > maxHeight) {
            domImage.width = domImage.width / domImage.height * maxHeight;
            domImage.height = maxHeight;
        }

        this.image.parent().css('overflow', '');
        if (BOREDConfig.SHOW_ZOOM_CURSOR) {
            this.image.css('cursor', zin);
        }
        this.expanded = false;
    };

    ImageResizer.prototype.expandImageSize = function () {
        var $img = this.image;

        $img.attr('width', this.origWidth);
        $img.attr('height', this.origHeight);

        if (BOREDConfig.SHOW_ZOOM_CURSOR) {
            $img.css('cursor', zout);
        }
        $img.parent().css('overflow', 'visible');
        this.expanded = true;
    };

    // Image Previewing on upload.
    function imagePreview($imageInput) {
        var fr = new FileReader(),
            readFile = function () {
                var fileArr = $imageInput[0].files;
                if ( fileArr && fileArr.length ) {
                    fr.readAsDataURL(fileArr[0]);
                }
            },
            $clearLink = 
                $('<a href="#" style="margin-left:2em">\u2718 Clear</a>'),
            newImage = function (source) {
                var img = new Image(),
                    $img = $(img);

                img.addEventListener('load', function (e) {
                    this.title = 'Original Dimensions: ' + e.target.width +
                                 'x' + e.target.height;
                    this.alt = 'Image Preview';

                    new ImageResizer($img);

                    $img.addClass('preview');
                    $img.css({
                        display: 'block',
                        margin: '1em 0 1em 5em'
                    });
                    $clearLink.after($img);
                }, false);
               
                img.src = source;
            };
         
        // The clear link.
        $clearLink.click(function () {
            $imageInput.val('');
            $('img.preview').remove();
            return false;
        });
        $imageInput.after($clearLink);
  
        fr.onload = function (e) {
            $('img.preview').remove();
            newImage(e.target.result);
        };

        $imageInput.on('change', readFile);
        readFile();
    }

    function makeCommentImagesExpandable() {
        function bind($img) {
            if (!$img.data('expansionEnabled')) {
                $img.load(function (e) {
                    new ImageResizer($(this), 600, 1000);
                });
                $img.data('expansionEnabled', true);
            }
        }

        function execute() {
            var $commentImages = $('img', 'div[id^="image_comments"]');

            $commentImages.each(function () {
                bind($(this));
            });
        }

        $(document).ajaxComplete(execute);
        execute();
    }

    function CommentImagesToggler() {
        var me = this;
        this.eventsAttached = false;

        function execute() {
            var $ins = $('div.metabar.metabar_redux').first();
            if (!$ins.data('executed')) {
                $ins.append('<form action="#" style="float:right">' + 
                            '<label for="bored-disable-images">No ' +
                            'Images</label><input type="checkbox" ' +
                            'id="bored-disable-images" /></form>');
                $('#bored-disable-images').change(function () {
                    me.toggle($(this).is(':checked'));
                }).prop('checked', BOREDConfig.HIDE_COMMENT_IMAGES);

                $ins.data('executed', true);
            }
        }

        $(document).ajaxComplete(execute);
        execute();

        if (BOREDConfig.HIDE_COMMENT_IMAGES) {
            this.toggle(true);
        }
    }

    CommentImagesToggler.prototype.hideImages = function () {
        var $commentImages = $('img', 'div[id^="image_comments"]');
        $commentImages.each(function () {
            $(this).css('display', 'none');
        });
    };

    CommentImagesToggler.prototype.toggle = function (hide) {       
        if (hide) {
            if (!this.eventsAttached) {
                $(document).on('ajaxComplete', this.hideImages);
            }
            this.eventsAttached = true;
            this.hideImages();
        } else {
            $(document).off('ajaxComplete', this.hideImages);
            this.eventsAttached = false;
            $('img', 'div[id^="image_comments"]').css('display', '');
        }

        BOREDConfig.setOpt('HIDE_COMMENT_IMAGES', hide);
    };

    function doMarkItUp() {
        // TODO: Rewrie this to take advantage of jQuery.

        // data:URIs. This won't be pretty, but it will be fairly efficient
        // bandwidth-wise.
        var handleImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAGAgMAAABROz0wAAAAA3NCSVQICAjb4U/gAAAADFBMVEWwuL/////39/eyub9nsXv9AAAABHRSTlP/AP//07BylAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8yMS8wN4dieEgAAAAfdEVYdFNvZnR3YXJlAE1hY3JvbWVkaWEgRmlyZXdvcmtzIDi1aNJ4AAAAMElEQVQImWNwDBF1DGFgaIwQbYxgYFgaFbo0yoEhlDUglNWBIYw1IQxETc0Mm+oAANc3CrOvsJfnAAAAAElFTkSuQmCC',
            codeImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAALtSURBVBgZTcFLaFxVAIDh/5577jwzj0wSUmqMtKIiBltbbJ1FUCxVoQu3FrHGVRU3BVcKrkTcKOhCUOtOAyJ23WIQtFawpoooZWKJpnbsNJN5PzP3PO5xArPo93nOOfasXCgfAz48mE8UhzpiqCN0FLFrog7QA+qABVpAA/gC+FYyERlz/NC+qeIbT85xt4GKckMV5Voju6A09ELLzXqfi38PTgLnJBORMfPZmMeectsSeB7SA19CPBAsxgW+EAQ+PLaQZH8uXTj/S+UDwYTVOitxmAh6yqOjoR1CZwSdETR2Yadv2fPm6i2KB9IszQZzkgkVmvnLZcuP21VeO1rgs+tdAu1YOZxlKiHw8fA9iADPdvn5nxa/3epUBGOH39sqjETu2UJG4oUwDB2RcmRSHuevdtjpWgZhxEBH4KDaDflobbNrlVoRh97demHpgfTth+5J5ZpNw5kjWQxw6mCa7aYlk4bPr7X54XqfkfGIHNjAYpQ6cOH1x9fEw/cnP13M+Ik7bc3ZYxniMR9PQCElObmYptox7E97XK0MscbhHJgwxKrQMiZ+v9Y9u3knHBUCn08ut6m2DQJHe6C5WOqQl4KbVcXR2QSxwENbS38wNEapLmNi4/0Hv/r3zxvHN0p1YnGP1e/r4ODr9TbZlKBTU7xSnKG4lCUZQKMfYkJVvfT2c44xyVjKr6lpEUI3g3UOPIE1lu6O5aUTcyRjPjhISUGttYtVYYUJuXxudRZ4p/jIvZx+eoHvSopmz/Ly8jyJwBFIkD7EfMimYLM8xChVZUJapU4Ap34tbdHalfRDh7aOUHsoE2FsROQchVyOV5/Zx3ZjiFWqxoS0Wh95/qlHk2+9+AR3sw60dSgDOPj4UoVUAL3+EKt1gwlptd7arnf4cq1EfipJPpsgn46TS8fJpGLEY4K4FJxenicuodbsYbX+jwkZGfPNlfWNhSvrG/cBM8AMMA1MA7lELAgSiYBsOkk+m+KPv8o3gJ+Y+B9yFXCQeyJWrQAAAABJRU5ErkJggg==',
            boldImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADCSURBVCjPY/jPgB8yUEtBeUL5+ZL/Be+z61PXJ7yPnB8sgGFCcX3m/6z9IFbE/JD/XucxFOTWp/5PBivwr/f77/gfQ0F6ffz/aKACXwG3+27/LeZjKEioj/wffN+n3vW8y3+z/Vh8EVEf/N8LLGEy3+K/2nl5ATQF/vW+/x3BCrQF1P7r/hcvQFPgVg+0GWq0zH/N/wL1aAps6x3+64M9J12g8p//PZcCigKbBJP1uvvV9sv3S/YL7+ft51SgelzghgBKWvx6E5D1XwAAAABJRU5ErkJggg==',
            italicImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAABxSURBVCjPY/jPgB8yUFtBdkPqh4T/kR+CD+A0Ie5B5P/ABJwmxBiE//f/gMeKkAlB/90W4FHg88Dzv20ATgVeBq7/bT7g8YXjBJf/RgvwKLB4YPFfKwCnAjMH0/8a/3EGlEmD7gG1A/IHJDfQOC4wIQALYP87Y6unEgAAAABJRU5ErkJggg==',
            linkImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADpSURBVCjPY/jPgB8y0EmBHXdWaeu7ef9rHuaY50jU3J33v/VdVqkdN1SBEZtP18T/L/7f/X/wf+O96kM3f9z9f+T/xP8+XUZsYAWGfsUfrr6L2Ob9J/X/pP+V/1P/e/+J2LbiYfEHQz+ICV1N3yen+3PZf977/9z/Q//X/rf/7M81Ob3pu1EXWIFuZvr7aSVBOx1/uf0PBEK3/46/gnZOK0l/r5sJVqCp6Xu99/2qt+v+T/9f+L8CSK77v+pt73vf65qaYAVqzPYGXvdTvmR/z/4ZHhfunP0p+3vKF6/79gZqzPQLSYoUAABKPQ+kpVV/igAAAABJRU5ErkJggg==',
            pictureImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHwSURBVDjLpZM9a1RBFIafM/fevfcmC7uQjWEjUZKAYBHEVEb/gIWFjVVSWEj6gI0/wt8gprPQykIsTP5BQLAIhBVBzRf52Gw22bk7c8YiZslugggZppuZ55z3nfdICIHrrBhg+ePaa1WZPyk0s+6KWwM1khiyhDcvns4uxQAaZOHJo4nRLMtEJPpnxY6Cd10+fNl4DpwBTqymaZrJ8uoBHfZoyTqTYzvkSRMXlP2jnG8bFYbCXWJGePlsEq8iPQmFA2MijEBhtpis7ZCWftC0LZx3xGnK1ESd741hqqUaqgMeAChgjGDDLqXkgMPTJtZ3KJzDhTZpmtK2OSO5IRB6xvQDRAhOsb5Lx1lOu5ZCHV4B6RLUExvh4s+ZntHhDJAxSqs9TCDBqsc6j0iJdqtMuTROFBkIcllCCGcSytFNfm1tU8k2GRo2pOI43h9ie6tOvTJFbORyDsJFQHKD8fw+P9dWqJZ/I96TdEa5Nb1AOavjVfti0dfB+t4iXhWvyh27y9zEbRRobG7z6fgVeqSoKvB5oIMQEODx7FLvIJo55KS9R7b5ldrDReajpC+Z5z7GAHJFXn1exedVbG36ijwOmJgl0kS7lXtjD0DkLyqc70uPnSuIIwk9QCmWd+9XGnOFDzP/M5xxBInhLYBcd5z/AAZv2pOvFcS/AAAAAElFTkSuQmCC',
            strokeImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAACfSURBVCjPY/jPgB8yUFNBiWDBzOy01PKEmZG7sSrIe5dVDqIjygP/Y1GQm5b2P7kDwvbAZkK6S8L/6P8hM32N/zPYu2C1InJ36P/A/x7/bc+YoSooLy3/D4Px/23+SyC5G8kEf0EIbZSmfdfov9wZDCvc0uzLYWyZ/2J3MRTYppn/14eaIvKOvxxDgUma7ju1M/LlkmnC5bwdNIoL7BAAWzr8P9A5d4gAAAAASUVORK5CYII=',
            subscriptImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpERkYyQjI1ODA4RDNFMTExQTVBRjgxRDBDNDA3RkJBRSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo3NTcyMEQ1RkQzNEMxMUUxOTA2Q0FEQ0FBQTZGRjZEQyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo3NTcyMEQ1RUQzNEMxMUUxOTA2Q0FEQ0FBQTZGRjZEQyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1LjEgV2luZG93cyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjFCNjY1QTM0NEFEM0UxMTFBNkYxRURGM0E4QUREQTEwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkRGRjJCMjU4MDhEM0UxMTFBNUFGODFEMEM0MDdGQkFFIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+HVL3WgAAAMxJREFUKM9j+M+AHzIMGQVLHJZdWPx/xv+WgGyHoP82D4wdMEyYoTD5Q9v/AoXgCeYXDASwWlHfUPA/7ILFBX0BHG5IEwj9YPVf3wCnI70czP/r/1dfAOOvUKoQRFJgaWD8QNdB7YH8fykFEH9b6IwzgWfgCowM9B5oAg2XLZD4L3IAJNJ9N9ZF6520MViBXoLWB9UL8kCdYguE/gv855/gb2z2Tt1Y4h3UBA0DZQdZBwmg6wUd+B34gFBLUO6dyCr+cjwhKezClwZhAQCz7O+bUgO2KAAAAABJRU5ErkJggg==',
            superscriptImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpERkYyQjI1ODA4RDNFMTExQTVBRjgxRDBDNDA3RkJBRSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo2MzYyMzhEQkQzNEMxMUUxQkQyRkMzMTJFQzY1M0MwMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2MzYyMzhEQUQzNEMxMUUxQkQyRkMzMTJFQzY1M0MwMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1LjEgV2luZG93cyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjVCNDlCN0Q4MEJEM0UxMTFBNUFGODFEMEM0MDdGQkFFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkRGRjJCMjU4MDhEM0UxMTFBNUFGODFEMEM0MDdGQkFFIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+GdwPmAAAAMxJREFUKM9j+M+AHzKQqWD1u3n/U9P0/yuX41DQaJz4Ti9NuhyPFdrvJM/gdYPUKoE0uIIlDssuLP4/439LQLZD0H+bB8YOioLCZ1AcOUNh8oe2/wUKwRPMLxgIaM6UeidgjOaL+oaC/2EXLC7oC+DwZppA6Aer//oGOMPBy8H8v/5/9QU4FFgaGD/QdVB7IP9fSgGLAiMDvQeaQMNlCyT+ixzAUKCXoPVB9YI8UKfYAqH/Av/5J6Ap0DBQdpB1kAC6XtCB34EPCEmKTQCZjPE4N8a4DgAAAABJRU5ErkJggg==',
            insertImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1ODQ5QjdEODBCRDNFMTExQTVBRjgxRDBDNDA3RkJBRSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpERDFFOThDM0QzNEIxMUUxQjgxNkMyNTE3NDU5NkE1QiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpERDFFOThDMkQzNEIxMUUxQjgxNkMyNTE3NDU5NkE1QiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1LjEgV2luZG93cyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjFBNjY1QTM0NEFEM0UxMTFBNkYxRURGM0E4QUREQTEwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU4NDlCN0Q4MEJEM0UxMTFBNUFGODFEMEM0MDdGQkFFIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+iqTydQAAATFJREFUeNrMUz1qhGAQHUN6sREvEdjcQDvLHGHrNEntKdKlzQGsbfUIGmyVBQvx/xf8RTMjCEEXdrNJkQFR5pv3vvdmRmaeZ/hNMP+LQNM0EV9i3/dQ1zXkeQ5ZlhlJkpyCIDj6vg9VVcE4jh+WZZ3OKlBV9a3ruhcqTNNUUhTFoLwkSWJZljqePdq2ba71d1tJeGuOt0IURbCCKXRdN9q2he9givstAclsmgZQ9s4vEWxjR+B5HqBUCMPwNgLXdRcC9LorHobhMkEcx0shTWIb2H1rm9s1Ef2b1AN6BEE4rHmO4w7TNOUXCdCnSV5JASoR1zyCX3HkxlWbyPP8Ey0Lglg8X2WbRVEcf7TKLMsuFhBoXrXKDMN8yrL8QN+O4yxjQyVwZleeEff+Jz/TlwADADkE3v7LFnqxAAAAAElFTkSuQmCC',
            draftImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OUJEQUVDQkUzMzdGMTFFMkI0MEREODc1RkU2Q0IyNUEiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OUJEQUVDQkQzMzdGMTFFMkI0MEREODc1RkU2Q0IyNUEiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmRpZDpDMTYxRTVFOTdFMzNFMjExODcxRTk4MDIxODdGOEIzNSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDMTYxRTVFOTdFMzNFMjExODcxRTk4MDIxODdGOEIzNSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PrJskssAAAGYUExURQQEBPv7+wsLCwwMDAMDA+zs7A0NDQUFBQYGBra2tikpKRQUFPyxG6qqqiMjI2RkZPDw8FxcXCoqKhoaGpqamqyikd3d3aOjo6ioqDEmE8XFxcbGxunp6aurq9bW1kNDQ0dHR+jo6CYmJv77/v3z/fb29v/9//y3PvnKXdDQ0OWeGfbS+f7dnF1aVjs0KP75/v31/hIPDP7Vfvy2O/nHKFtbW/729ayJMXR0dK1fEeDa4f7LKfn5+bSysP7HJKmpqf2/IBsbG8pvFPnBIjo6OhgQCAoKCgcHB3RBDtbSz9LS0hUMA/XJ+BERERgYGP3EI/28HyshEfSsK9nZ2f///z4+PvPz8/arG8xyFFBAIv22Hc7Ozvy1Nr29vWs9D8nJyf3w2P24K8e/szk5OWdaRfbfs/vIQJOTk/Hx8f/36emhMvXI+KSkpOHh4e7W7n19fe67I9/f3/KrI/nn7fPD9/fW+fbt3gEBAQYDAbq6ut7e3tra2urS7MB5FWpqakMkB9bV1Jubmw4ODr15GyAgIP3FIwAAAP///42JeAQAAACIdFJOU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wAYt9YPAAAA10lEQVQYGQXBA2IDAQBFwb8bO6lt225T27Zt29h37c4IAAAAQJD//DJzFgagYBaR5ntwB2PmDuahqvQO4bAsyy67O3Ol4Xz0JE8YY987cYkh30DFfsvrba4I23qjBjwtXf5t3VQihs2sJAP26jqvNwFRbIukG5S1TpbsAogNW33AqOlYnk4OAgiPGQkUTfhX4/tjAcSpWd7Y46+9D7m8AOKr7+dtofDI06V3ANG+3r14vN00rt8MADH00Tw45ZTLmwqA+KweeZQz58IBAKItIWXtKvsQAOAfF8xWDojKVBgAAAAASUVORK5CYII=',
            header = document.getElementsByTagName('head')[0],
            cssInlineDom = document.createElement('style'),
            id = (
                location.pathname.match(
                    /^\/(?:images\/)?(\d+)$/
                ) || location.pathname.match(
                    /^\/messages\/([\da-f]+)$/
                )
            ),
            markItUp;

        if (id) {
            id = id[1];
        }

        // Execute markItUp! once it's loaded.
        function doMarkItUpInit() {
            var settings = {
                nameSpace: 'bored',
                resizeHandle: true,
                onShiftEnter: {
                    keepDefault: false,
                    replaceWith: '\n\n'
                },
                markupSet: [
                   {name:'Bold', key:'B', closeWith:'(!(*|!|*])!)',
                    openWith:'(!(*|!|[*)!)', multiline: true}, 
                   {name:'Italic', key:'I', closeWith:'(!(_|!|_])!)',
                    openWith:'(!(_|!|[_)!)', multiline: true},
                   {name:'Strike-through', key:'S', closeWith:'(!(-|!|-])!)',
                    openWith:'(!(-|!|[-)!)', multiline: true},
                   {name:'Underline', key:'U', closeWith:'(!(+|!|+])!)',
                    openWith:'(!(+|!|[+)!)', multiline: true},
                   {separator:'---------------'},
                   {name:'Picture', replaceWith:'![![Source:!:http://]!]' +
                                                '([![Alternative text]!])!'},
                   {name:'Link', openWith:'"',
                    closeWith:'([![Title]!])":' +'[![Link:!:http://]!]',
                    placeHolder:'Your text to link here...',
                    multiline: true },
                   {separator:'---------------'},
                   {name:'Superscript', closeWith:'(!(^]|!|^)!)',
                    openWith:'(!([^|!|^)!)', multiline: true},
                   {name:'Subscript', closeWith:'(!(~]|!|~)!)',
                    openWith:'(!([~|!|~)!)', multiline:true},
                   {name:'Code', openWith:'@', closeWith:'@', multiline: true},
                   {separator:'---------------'},
                   {name:'Save Draft', call:'options.saveDraft',
                    className: 'draftButton'}
                ]
            };
            
            function markCommentBodyUp() {
                $('textarea:not([id $= "tag_list"])').each(function () {
                    var $this = $(this),
                        stsr,
                        el;

                    if (!$this.data('wysiwiymEnabled')) {
                        if (this.id === 'comment_body' || this.id === 'body') {
                            el = this;

                            settings.saveDraft = function () {
                                saveDraft(id, el);
                            };
                        }
                        $this.markItUp(settings);
                        $this.data('wysiwiymEnabled', true);
                    }
                });
            }

            // AJAX binding.
            markCommentBodyUp();
            $(document).ajaxComplete(markCommentBodyUp);
        }

        if (document.getElementsByTagName('textarea').length) {
            // MarkItUp! JS
            markItUp = document.createElement('script');
            // Add dummy version variable for cache-busting older versions.
            markItUp.setAttribute('src', 'https://s3.amazonaws.com/Linkable' +
                                         'Libraries/jquery.markitup.js?v=1.1');
            header.appendChild(markItUp);
            markItUp.addEventListener('load', function () {
                doMarkItUpInit();
            }, false);

            // MarkItUp! CSS
            cssInlineDom.setAttribute('type', 'text/css');
            cssInlineDom.textContent = 
                '.markItUp * {' +
                '    margin: 0px; padding:0px;' +
                '    outline: none;' +
                '}' +
                '.markItUp a:link,' +
                '.markItUp a:visited {' +
                '    color: #000;' +
                '    text-decoration: none;' +
                '}' +
                '.markItUp {' +
                '    width: 700px;' +
                '    margin: 5px 0 5px 180px;' +
                '    border: 5px solid #F5F5F5;    ' +
                '}' +
                '.markItUpContainer {' +
                '    border: 1px solid #3C769D;    ' +
                '    background: #FFF;'+
                '    padding: 5px 5px 2px 5px;' +
                '    font: 11px Verdana, Arial, Helvetica, sans-serif;' +
                '}' +
                '.markItUpEditor {' +
                '    font: 12px "Courier New", Courier, monospace;' +
                '    padding: 5px 5px 5px 5px;' +
                '    border: 3px solid #3C769D;' +
                '    width: 670px !important;' +
                '    height: 320px;' +
                '    clear: both;' +
                '    line-height: 18px;' +
                '    overflow: auto;' +
                '}' +
                '.markItUpPreviewFrame {' +
                '    overflow: auto;' +
                '    background-color: #FFFFFF;' +
                '    border: 1px solid #3C769D;' +
                '    width: 99.9%;' +
                '    height: 300px;' +
                '    margin: 5px 0;' +
                '}' +
                '.markItUpFooter {' +
                '    width: 100%;' +
                '    cursor: n-resize;' +
                '}' +
                '.markItUpResizeHandle {' +
                '    overflow: hidden;' +
                '    width: 22px; height:5px;' +
                '    margin-left: auto;' +
                '    margin-right: auto;' +
                '    background-image: url(' + handleImg + ');' +
                '    cursor: n-resize;' +
                '}' +
                '/* first row of buttons */' +
                '.markItUpHeader ul li {' +
                '    list-style: none;' +
                '    float: left;' +
                '    position: relative;' +
                '}' +
                '.markItUpHeader ul li ul {' +
                '    display: none;' +
                '}' +
                '.markItUpHeader ul li:hover > ul {' +
                '    display: block;' +
                '}' +
                '.markItUpHeader ul .markItUpDropMenu li {' +
                '    margin-right: 0px;' +
                '}' +
                '.markItUpHeader ul .markItUpSeparator {' +
                '    margin: 0 10px;' +
                '    width: 1px;' +
                '    height: 16px;' +
                '    overflow: hidden;' +
                '    background-color: #CCC;' +
                '}' +
                '.markItUpHeader ul ul .markItUpSeparator {' +
                '    width: auto; height:1px;' +
                '    margin: 0px;' +
                '}' +
                '/* next rows of buttons */' +
                '.markItUpHeader ul ul {' +
                '    display: none;' +
                '    position: absolute;' +
                '    top: 18px; left:0px;    ' +
                '    background: #F5F5F5;' +
                '    border: 1px solid #3C769D;' +
                '    height: inherit;' +
                '}' +
                '.markItUpHeader ul ul li {' +
                '    float: none;' +
                '    border-bottom: 1px solid #3C769D;' +
                '}' +
                '/* next rows of buttons */' +
                '.markItUpHeader ul ul ul {' +
                '    position: absolute;' +
                '    top: -1px; left:150px;' +
                '}' +
                '.markItUpHeader ul ul ul li {' +
                '    float: none;' +
                '}' +
                '.markItUpHeader ul a {' +
                '    display: block;' +
                '    width: 16px; height:16px;' +
                '    text-indent: -10000px;' +
                '    background-repeat: no-repeat;' +
                '    padding: 3px;' +
                '    margin: 0px;' +
                '}' +
                '.markItUpHeader ul ul a {' +
                '    display: block;' +
                '    padding-left: 0px;' +
                '    text-indent: 0;' +
                '    width: 120px;' +
                '    padding: 5px 5px 5px 25px;' +
                '    background-position: 2px 50%;' +
                '}' +
                '.markItUpHeader ul ul a:hover {' +
                '    color: #FFF;' +
                '    background-color: #3C769D;' +
                '}' +
                '.bored .markItUpButton1 a {' +
                '    background-image: url(' + boldImg + ');' +
                '}' +
                '.bored .markItUpButton2 a {' +
                '    background-image: url(' + italicImg + ');' +
                '}' +
                '.bored .markItUpButton3 a {' +
                '    background-image: url(' + strokeImg + ');' +
                '}' +
                '.bored .markItUpButton4 a {' +
                '    background-image: url(' + insertImg + ');' +
                '}' +
                '.bored .markItUpButton5 a {' +
                '    background-image: url(' + pictureImg + ');' +
                '}' +
                '.bored .markItUpButton6 a {' +
                '    background-image: url(' + linkImg + ');' +
                '}' +
                '.bored .markItUpButton7 a {' +
                '    background-image: url(' + superscriptImg + ');' +
                '}' +
                '.bored .markItUpButton8 a {' +
                '    background-image: url(' + subscriptImg + ');' +
                '}' +
                '.bored .markItUpButton9 a {' +
                '    background-image: url(' + codeImg + ');' +
                '}' +
                '.bored .draftButton a {' +
                '   background-image:url(' + draftImg + ');' +
                '}';

            header.appendChild(cssInlineDom);
        }
    }

    // Random Image Button. (It's fun!)
    function doRandomImage() {
        var $imageList = $('#imagelist_container'),
            apiUrl,
            extractNumber = false;
        
        function makeLink(url, takeFromJson) {
            var biggestNum,
                imgNum,
                maxIndex;

            $.get(url, function(data) {
                if (takeFromJson) {
                    maxIndex = data.length - 1;
                    imgNum = data[Math.floor(Math.random() * maxIndex)]
                             .id_number;
                } else {
                    biggestNum = data[0].id_number;
                    imgNum = Math.floor(Math.random() * biggestNum);
                }
                $('.searchbox').before(
                    '<div class="metasection">' + 
                    '    <a href="/images/' + imgNum +
                         '" style="background-color: pink">' +
                    '        Random Img.' +
                    '    </a>' +
                    '</div>'
                );
            });
        }

        if ($imageList.find('.metasection').first().text()
                             .indexOf('Top Commented') !== -1) {
            apiUrl = '/lists/top_commented.json';
            extractNumber = true;
        } else if ($imageList.find('.metasection').first().text()
                             .indexOf('All Time Top Scoring') !== -1) {
            apiUrl = '/lists/all_time_top_scoring.json';
            extractNumber = true;
        } else if ($imageList.find('.metasection').first().text()
                             .indexOf('Top Scoring') !== -1) {
            apiUrl = '/lists/top_scoring.json';
            extractNumber = true;
        } else {
            apiUrl = '/images.json';
        }
        
        apiUrl +=
            '?nocomments=1&nofav=1' + ((extractNumber) ? '' : '&perpage=1');
        makeLink(apiUrl, extractNumber);
    }
   
    // Execution.
    BOREDConfig.loadSettings();
    BOREDConfig.makePanel();

    if (BOREDConfig.SHOW_ZOOM_CURSOR) {
        zoomCursors();
    }
  
    if (BOREDConfig.MOVE_WATCHED_LINK) {
        moveWatched();
    }

    if (BOREDConfig.SHOW_REVERSE_SEARCH_LINKS && $('div#image_target').length) {
        relImages();
        $(document).ajaxComplete(relImages);
    }
    
    if (BOREDConfig.SAVE_DRAFTS) {
        manageDrafts();
    }

    if (BOREDConfig.ENABLE_FILE_UPLOAD_PREVIEW) {
        $imageInput = $('input#image_image');
        if ($imageInput.length) {
            imagePreview($imageInput);
        }
    }

    if ($('textarea').length || $('#comments').length) {
        if ($('#comments').length) {
            new CommentImagesToggler();

            if (!BOREDConfig.HIDE_COMMENT_IMAGES &&
                BOREDConfig.AUTO_EXPAND_COMMENT_IMAGES) {
                makeCommentImagesExpandable();
            }
        }
        if (BOREDConfig.ENABLE_MARKITUP) {
            doMarkItUp();
        }
    }
    
    if (BOREDConfig.ENABLE_RANDOM_BUTTON) {
        doRandomImage();
    }

    // Honestly, this is a bit insulting to the site, but I figured it'd be
    // fun to do and actually looks good with the format. Only the link is
    // changed. I should add the sidebar thing later.
    if (BOREDConfig.NOSTALGIA_MODE) {
        $('div#header > a:first-child').text('Ponibooru')
            .css({
                fontWeight: 'bold',
                color: '#006FFA'
            }).hover(function () {
                $(this).css('color', '#33CFFF');
            }, function () {
                $(this).css('color', '#006FFA');
            });
    }   
}

// if __name__ == '__main__':
(function () {
    'use strict';

    var script = document.createElement('script');

    script.textContent = '(' + BOREDInit.toString() + ')();';
    document.body.appendChild(script);
}());