Tumblr. extend shortcut key

Tumblr. extend shortcut key for blog select and reblog button

// ==UserScript==
// @name        Tumblr. extend shortcut key
// @namespace   http://www.sharkpp.net/
// @version     0.4
// @description Tumblr. extend shortcut key for blog select and reblog button
// @author      sharkpp
// @copyright   2014-2015, sharkpp
// @license     MIT License
// @include     https://www.tumblr.com/dashboard*
// @include     https://www.tumblr.com/reblog/*
// @include     https://www.tumblr.com/blog/*
// @include     https://www.tumblr.com/tagged/*
// @include     https://www.tumblr.com/search/*
// ==/UserScript==
(function () {
    var evaluate = function(xpath, resultOnce) {
        resultOnce = undefined == typeof resultOnce ? false : resultOnce;
        var items = document.evaluate(xpath, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
        if (resultOnce)
            return items.snapshotLength ? items.snapshotItem(0) : null;
        var results = [];
        for (var i = 0; i < items.snapshotLength; i++)
            results[results.length] = items.snapshotItem(i);
        return results;
    };
    var clickByXPath = function(xpath) {
        var elm = evaluate(xpath, true);
        if (!elm)
            return false;
        elm.click();
        return true;
    };

    var getBlogSelectMenuItem = function() {
        return evaluate('//*[@data-js-tumblelogchoice]', false);
    };
    var getActionSelectMenuItem = function() {
        return evaluate('//*[@data-js-publish or @data-js-queue or @data-js-draft or @data-js-private]', false);
    };
    var selectBlog = function(n) {
        var menuVisibled = 0 < getBlogSelectMenuItem().length;
        if (!menuVisibled)
            clickByXPath('//*[@data-js-clickabletumbleloglabel]');
        var result = clickByXPath('//*[@data-js-tumblelogchoice][' + (n + 1) + ']');
        if (menuVisibled)
            clickByXPath('//*[@data-js-clickabletumbleloglabel]');
        return result;
    };
    var actionSelect = function(act){
        var menuVisibled = 0 < getActionSelectMenuItem().length;
        if (!menuVisibled)
            clickByXPath('//*[@data-js-clickablesavedropdown]');
        clickByXPath('//*[@data-js-' + act + ']');
        return clickByXPath('//*[@data-js-clickablesave]');
    };
    var onshortcutkey = function (e) {//console.log(e);
            e = e || window.event; // for IE
            if (e.altKey) {
                if (0xE5 == e.keyCode) {
                } else if (49 <= e.keyCode && e.keyCode <= 57) { // Alt + '1' ... Alt + '9'
                    var n = (e.keyCode - 0x30) - 1;
                    if (!selectBlog(n))
                        return;
                } else if (82 == e.keyCode) { // Alt + 'r'
                    if (!actionSelect('publish'))
                        return;
                } else if (69 == e.keyCode) { // Alt + 'e'
                    if (!actionSelect('queue'))
                        return;
                } else if (68 == e.keyCode) { // Alt + 'd'
                    if (!actionSelect('draft'))
                        return;
                } else if (80 == e.keyCode) { // Alt + 'p'
                    if (!actionSelect('private'))
                        return;
                } else {
                    return;
                }
                e.preventDefault();
                e.stopPropagation();
            }
        };
    var addShortcutKeyElements = function (elm, keys) {
            for (var i = 0, s; s = keys[i]; i++) {
                var span = document.createElement('span');
                    span.style.cssText = ['background-color:#fff',
                                          'border:1px solid #ccc',
                                          'border-radius:5px',
                                          'border-width:1px 1px 5px 5px',
                                          'padding:1px'].join(';');
                    span.innerHTML = s;
                elm.appendChild(span);
                if (i + 1 < keys.length)
                    elm.appendChild(document.createTextNode(' + '));
            }
        };
    var mo = new MutationObserver(function(mr){
        // append shortcut key for blog select menu when create menu
        var items1 = getBlogSelectMenuItem();
        if (items1.length &&
            !items1[0].getAttribute('_6588-flag1'))
        {
            items1[0].setAttribute('_6588-flag1', '1');
            // append shortcut key
            for (var i = 0, item; item = items1[i]; i++)
            {
                var div = document.createElement('div');
                    div.style.cssText = ['margin-right:5px',
                                         'text-align:right',
                                         'height:100%',
                                         'line-height:25px',
                                         'position:absolute',
                                         'right:0',
                                         'top:5px'].join(';');
                addShortcutKeyElements(div, ["alt", (i + 1).toString()]);
                item.lastChild.appendChild(div);
            }
        }
        // append shortcut key for reblog action menu when create menu
        var items2 = getActionSelectMenuItem();
        if (items2.length &&
            !items2[0].getAttribute('_6588-flag2'))
        {
            items2[0].setAttribute('_6588-flag2', '1');
            // append shortcut key
            for (var i = 0, item; item = items2[i]; i++)
            {
                var div2 = document.createElement('div');
                    div2.style.cssText = ['text-align: right',
                                          'height: 100%',
                                          'line-height: 25px',
                                          'position: absolute',
                                          'top: 0px',
                                          'right: 10px'].join(';');
                addShortcutKeyElements(div2, ["alt", ['R', 'E', 'D', 'P'][i]]);
                var div = document.createElement('div');
                    div.style.cssText = ['width: 200px'].join(';');
                    div.appendChild(div2);
                item.appendChild(div2);
                item.parentNode.parentNode.style.cssText = 'width:230px';
            }
        }
    });
    mo.observe(document.body, {childList: true, subtree:true});
    document.addEventListener('keydown', onshortcutkey, true);
})();