User:Subh83/JavaScriptTools/selectRightclickMenu.js

Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
/****************************************************
* Created by Subhrajit Bhattacharya [[User:Subh83]] *
* Licensed under GNU-GPL v3.0                       *
*****************************************************/

if (typeof(RightClickMenuKey)=='undefined') RightClickMenuKey = ''; // 'shift', 'alt', 'ctrl' or ''

if (typeof(UserSubh83_utils1)=='undefined') importScript("User:Subh83/JavaScriptTools/utils1.js");

function getSelectionMenuHTML(selText, clickElem)
{
    selText = selText.toString();
    var encodedSelText = XEncodeURIComponent(selText);
    setCookie("lastRightClickSelText", encodedSelText);

    var pageTitle = getPageTitle();

    var sectionEditLinkNode = GetPrevEditsectionLinkElement(clickElem);
    if (sectionEditLinkNode) {
        var EditLink = sectionEditLinkNode.href;
        var secNumMatch = EditLink.match(/section=([\d]+)/);
        if (secNumMatch.length > 1)
            var secNum = secNumMatch[1];
        var WikiBlameFun = "WikiBlameFromSnippet('"+XEncodeURIComponent(pageTitle)+"','"+encodedSelText+"',"+secNum+"); ";
    }
    else {
        var EditLink = (wgServer+wgScript)+"?title="+pageTitle+"&action=edit&section=0";
        var secNum = 0;
        var WikiBlameFun = "WikiBlameFromSnippet('"+XEncodeURIComponent(pageTitle)+"','"+encodedSelText+"',"+secNum+"); ";
        var DiffTableNode = FindNodeUpTree(clickElem, ['table']);
        if (DiffTableNode && DiffTableNode.className.indexOf('diff') >= 0) {
            EditLink = "";
            secNum = -1;
            WikiBlameFun = "WikiBlameFromWikitext('"+XEncodeURIComponent(pageTitle)+"','"+encodedSelText+"'); ";
        }
    }

    // Generate the HTML
    var ret = "<div class='rightclickmenu'> " +
                  "<span class='heading'>\"" + ((selText.length>40)?(selText.substr(0,17)+' ... '+selText.substr(selText.length-17,17)):(selText)) + 
                  "\"</span><hr/><div class='items'>";
    if (EditLink!="") 
        ret +=    "<div class='menuitem'><a href=\""+ EditLink +"\" onClick=\"placeCursorInTextarea(25);\">Edit this text</a></div>";
    ret +=        "<div class='menuitem'><a href=\"javascript:void(0);\" onClick=\"" + WikiBlameFun + 
                                                     "document.getElementById('selectrightclickmenu').style.display='none'; " + 
                                                     "delCookie('lastRightClickSelText');\">Trace history on WikiBlame</a></div>" +
                  "<hr/>" + 
                  "<div class='menuitem'><a href=\"http://www.google.com/search?q="+encodedSelText+"\" target=\"_blank\">Search Google for this text</a></div>" +
              "</div></div>";

    return ret;
}

function showSelectionMenu(e)
{
    var selText = "";
    if (window.getSelection) selText = window.getSelection();
    else if (document.getSelection) selText = document.getSelection();
    else if (document.selection)  selText = document.selection.createRange().text;
    else return;

    if (!e) var e = window.event;
    var rightclick;
    if (e.which) rightclick = (e.which == 3);
    else if (e.button) rightclick = (e.button == 2);

    if (e.target) targ = e.target;
    else if (e.srcElement) targ = e.srcElement;
    if (targ.nodeType == 3) // Safari bug
        targ = targ.parentNode;

    var keyPressed = true;
    if (RightClickMenuKey=='' && (e.shiftKey || e.ctrlKey || e.altKey)) keyPressed = false;
    else if (RightClickMenuKey=='shift' && !e.shiftKey) keyPressed = false;
    else if (RightClickMenuKey=='ctrl' && !e.ctrlKey) keyPressed = false;
    else if (RightClickMenuKey=='alt' && !e.altKey) keyPressed = false;

    var selectrightclickmenu = document.getElementById("selectrightclickmenu");
    if (!selectrightclickmenu) {
        alert("Unable to locate rightclick-menu!");
        return false;
    }
    if (selText != "" && rightclick && keyPressed && targ.tagName.toLowerCase()!='textarea') {
        selectrightclickmenu.innerHTML = getSelectionMenuHTML(selText, targ);
        setMenuPosition (e, selectrightclickmenu);
        selectrightclickmenu.style.zIndex = "10000";
        selectrightclickmenu.style.display = "block";
        return true;
    }
    else {
        selectrightclickmenu.style.display = "none";
        delCookie("lastRightClickSelText");
        return false;
    }
}

function placeCursorInTextarea(retry) {
    var mainTextArea = document.getElementById('wpTextbox1');

    if (!mainTextArea && retry > 0) { // Support for 'secedit' (User:Supadawg/secedit.js)
        setTimeout(placeCursorInTextarea, 200, retry-1);
        return;
    }

    if (mainTextArea) {
        setSelectionInWikitextFromSnippet(mainTextArea, decodeURIComponent(getCookie("lastRightClickSelText")));
        delCookie("lastRightClickSelText");
        if (document.getElementById("selectrightclickmenu")) 
            document.getElementById("selectrightclickmenu").style.display = "none";
    }
}

$( function () {

    // The right-click menu 
    var bodyContent = document.getElementById('bodyContent');
    if (bodyContent) {
        AppendHandlerToEvent( "document.getElementById('bodyContent').onmouseup", showSelectionMenu, 'pre', false, "return (!retNew);" );
        AppendHandlerToEvent( "document.getElementById('bodyContent').oncontextmenu", showSelectionMenu, 'pre', false, "return (!retNew);" );
    }

    var selectrightclickmenu = document.createElement("div");
    selectrightclickmenu.setAttribute("id", "selectrightclickmenu");
    selectrightclickmenu.setAttribute("display", "none");
    var theBody = document.getElementsByTagName("body")[0];
    theBody.insertBefore(selectrightclickmenu, theBody.childNodes[0]);

    // Cursor positioning in editform 
    placeCursorInTextarea(1);

});