//===============================================================================================================
// System  : Color Syntax Highlighter
// File    : Highlight.js
// Author  : Eric Woodruff  (Eric@EWoodruff.us)
// Updated : 04/06/2021
// Note    : Copyright 2006-2021, Eric Woodruff, All rights reserved
//
// This contains the script to expand and collapse the regions in the syntax highlighted code
//
//===============================================================================================================

// Ignore Spelling: copycode lineno collapsebox endblock

// Expand/collapse a region
function HighlightExpandCollapse(showId, hideId)
{
    var showSpan = document.getElementById(showId),
        hideSpan = document.getElementById(hideId);

    showSpan.style.display = "inline";
    hideSpan.style.display = "none";
}

// Copy the code if Enter or Space is hit with the image focused
function CopyColorizedCodeCheckKey(titleDiv, eventObj)
{
    if(eventObj !== undefined && (eventObj.keyCode === 13 || eventObj.keyCode === 32))
        CopyColorizedCode(titleDiv);
}

// Change the icon as the mouse moves in and out of the Copy Code link.  There should be an image with the same
// name but an "_h" suffix just before the extension.
function CopyCodeChangeIcon(linkSpan)
{
    var image = linkSpan.firstChild.src;
    var pos = image.lastIndexOf(".");

    if(linkSpan.className === "highlight-copycode")
    {
        linkSpan.className = "highlight-copycode_h";
        linkSpan.firstChild.src = image.substr(0, pos) + "_h" + image.substr(pos);
    }
    else
    {
        linkSpan.className = "highlight-copycode";
        linkSpan.firstChild.src = image.substr(0, pos - 2) + image.substr(pos);
    }
}

// Copy the code from a colorized code block to the clipboard.
function CopyColorizedCode(titleDiv)
{
    var idx, line, block, htmlLines, lines, codeText, hasLineNos, hasRegions, clip, trans, copyObject, clipID;
    var reLineNo = /^\s*\d{1,4}/;
    var reRegion = /^\s*\d{1,4}\+.*?\d{1,4}-/;
    var reRegionText = /^\+.*?-/;

    // Find the <pre> tag containing the code.  It should be in the next element or one of its children.
    block = titleDiv.nextSibling;

    while(block.nodeName === "#text")
        block = block.nextSibling;

    while(block.tagName !== "PRE")
    {
        block = block.firstChild;

        while(block.nodeName === "#text")
            block = block.nextSibling;
    }

    if(block.innerText !== undefined)
        codeText = block.innerText;
    else
        codeText = block.textContent;

    hasLineNos = block.innerHTML.indexOf("highlight-lineno");
    hasRegions = block.innerHTML.indexOf("highlight-collapsebox");
    htmlLines = block.innerHTML.split("\n");
    lines = codeText.split("\n");

    // Remove the line numbering and collapsible regions if present
    if(hasLineNos !== -1 || hasRegions !== -1)
    {
        codeText = "";

        for(idx = 0; idx < lines.length; idx++)
        {
            line = lines[idx];

            if(hasRegions && reRegion.test(line))
                line = line.replace(reRegion, "");
            else
            {
                line = line.replace(reLineNo, "");

                // Lines in expanded blocks have an extra space
                if(htmlLines[idx].indexOf("highlight-expanded") !== -1 || htmlLines[idx].indexOf("highlight-endblock") !== -1)
                    line = line.substr(1);
            }

            if(hasRegions && reRegionText.test(line))
                line = line.replace(reRegionText, "");

            codeText += line;

            // Not all browsers keep the line feed when split
            if(line[line.length - 1] !== "\n")
                codeText += "\n";
        }
    }

    // IE or FireFox/Netscape?
    if(window.clipboardData)
        window.clipboardData.setData("Text", codeText);
    else
        if(window.netscape)
        {
            // Give unrestricted access to browser APIs using XPConnect
            try
            {
                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
            }
            catch(e)
            {
                alert("Universal Connect was refused, cannot copy to clipboard.  Go to about:config and set " +
                    "signed.applets.codebase_principal_support to true to enable clipboard support.");
                return;
            }

            // Creates an instance of nsIClipboard
            clip = Components.classes["@mozilla.org/widget/clipboard;1"].createInstance(
                Components.interfaces.nsIClipboard);

            // Creates an instance of nsITransferable
            if(clip)
                trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(
                    Components.interfaces.nsITransferable);

            if(!trans)
            {
                alert("Copy to Clipboard is not supported by this browser");
                return;
            }

            // Register the data flavor
            trans.addDataFlavor("text/unicode");

            // Create object to hold the data
            copyObject = new Object();

            // Creates an instance of nsISupportsString
            copyObject = Components.classes["@mozilla.org/supports-string;1"].createInstance(
                Components.interfaces.nsISupportsString);

            // Assign the data to be copied
            copyObject.data = codeText;

            // Add data objects to transferable
            trans.setTransferData("text/unicode", copyObject, codeText.length * 2);

            clipID = Components.interfaces.nsIClipboard;

            if(!clipID)
            {
                alert("Copy to Clipboard is not supported by this browser");
                return;
            }

            // Transfer the data to the clipboard
            clip.setData(trans, null, clipID.kGlobalClipboard);
        }
        else
            alert("Copy to Clipboard is not supported by this browser");
}
