Better JCA Beta

A better Jive Cloud Admin experience.

// ==UserScript==
// @name         Better JCA Beta
// @namespace    http://mikebranski.com/
// @version      0.3.0
// @description  A better Jive Cloud Admin experience.
// @author       Mike Branski
// @match        https://cloud.jivesoftware.com/admin/portal.html
// @grant        none
// @homepage     https://github.com/mikebranski/userscripts
// ==/UserScript==

(function(window, undefined) {

    var jcaHomepageUrl,
        instanceUrl,
        selectedOption,
        homepageIframe,
        d;

    // Handy-dandy little debugging class.
    function Debugger() {
        // Need to see what's going on? Switch this to true.
        this.enabled = false;

        // Basically a pass-through for console.log(),
        // but will only fire if this.enabled is true.
        this.log = function() {
            if (this.enabled) {
                console.log.apply(console, arguments);
            }
        }
    }

    // You could have multiple instances of Debugger if you wanted
    // to break them out by type, but for now we just need one.
    d = new Debugger;

    // Note: You must include the #, otherwise Jive will just load whatever tab this script is being ran on.
    jcaHomepageUrl = window.location.href.replace(window.location.hash, "") + "#";

    window.addEventListener('load', init);

    document.querySelector("#installation-dropdown").addEventListener("change", function() {
        // @todo: Clean this up. :D
        document.querySelector("#installation-section").removeChild(document.querySelector("#installation-section a"));
        setTimeout(init, 500);
    });

    function init() {

        if (!window.location.hash) {
            // No hash? We're on the home page and can get the instance's URL from here.
            // Conveniently accessible with its own ID.
            var el = document.querySelector("#current-installation-url");

            if (!el) {
                // UI not loaded yet; delaying.
                window.setTimeout(init, 100);
                return;
            }

            instanceUrl = el.innerHTML.trim();

            enhanceUI();
        } else {
            // The ask: get the instance URL that is only available on the homepage.
            // The problem: being requested via an http request, the JS won't load, meaning we won't be able to get the URL anyway.
            // The solution: load the homepage into an iframe, wait a sec, and grab the instance URL from there.
            createAndParseIframe();
        }
    }

    function createAndParseIframe() {
        d.log("Attempting to parse the homepage embedded in an iframe");

        var targetContainer = document.querySelector("body");

        homepageIframe = document.createElement("iframe");

        if (d.enabled === false) {
            // Hide the iframe if debugging is disabled.
            homepageIframe.style.display = "none";
        } else {
            // Otherwise, add some styles so we can see the contents of the iframe.
            homepageIframe.style.marginTop = "100px";
            homepageIframe.style.border = "3px solid #333";
            homepageIframe.width = "100%";
            homepageIframe.height = "400px";
        }

        homepageIframe.src = jcaHomepageUrl;

        homepageIframe.addEventListener("load", iframeLoaded);

        targetContainer.insertBefore(homepageIframe, targetContainer.firstChild);
    }

    function iframeLoaded() {
        d.log("iframe has loaded");
        getInstanceUrlFromIframe();
    }

    function getInstanceUrlFromIframe() {
        var el = homepageIframe.contentWindow.document.querySelector("#current-installation-url"),
            homeLink,
            currentPageLink;

        // Check for the instance URL.
        if (!el) {

            homeLink = homepageIframe.contentWindow.document.querySelector('#breadcrumb a:first-child');
            d.log("homeLink:", homeLink);

            // If the dashboard link is there, click it so it loads the info we need, then delay.
            if (homeLink) {
                homeLink.click();
            }

            // if (numberOfTries = maximumTries) {
            //     console.log("Nothing more we can do here.");
            //     return false;
            // }

            // The UI hasn't loaded inside the iframe yet, so delay.
            var delay = 1000;

            d.log("Delaying for", delay);

            window.setTimeout(getInstanceUrlFromIframe, delay);

            return;

            /*
            // If it isn't there, try activating the dashboard tab.
            if (homepageIframe.contentWindow.portalShell) {
                console.log("Nothing more we can do here.");
                return false;
            }

            console.log("Activating the dashboard link manually");

            // Tell Jive's script to show the homepage manually.
            homepageIframe.contentWindow.portalShell.activateLink("dashboard");
            */
        }

        d.log('We got something!', el, el.innerHTML.trim());

        instanceUrl = el.innerHTML.trim();

        enhanceUI();

        // All good? Great; remove the iframe to keep things tidy, but first change the source back
        // to the current tab we're on. We do this because JCA remembers what the last tab we
        // accessed was, and loads that regardless of what's in the URL. This means that if
        // the user refreshes the page, it will always show the homepage until they
        // manually navigate back to where they were.
        homepageIframe.removeEventListener("load", iframeLoaded);

        d.log("Resetting the iframe to", window.location.href);

        // Find the link we need to activate.
        currentPageLink = homepageIframe.contentWindow.document.querySelector(".home-action a[href='" + window.location.hash + "']");

        if (currentPageLink) {
            currentPageLink.click();
        }

        // Remove the iframe.
        document.querySelector("body").removeChild(homepageIframe);
    }

    function enhanceUI() {
        d.log("Enhancing the UI!");
        markCurrentInstanceAsSelected();
        addInstanceInfoToNavigation();
    }

    function markCurrentInstanceAsSelected() {
        var label;

        label = document.querySelector("#installation-name").innerHTML.trim();

        selectedOption = document.querySelector("#installation-dropdown option[data-url='" + instanceUrl + "']");

        if (!selectedOption) {
            return false;
        }

        selectedOption.selected = true;
    }

    function addInstanceInfoToNavigation() {
        var targetContainer,
            instanceURLElement,
            role;

        targetContainer = document.querySelector("#installation-section");

        if (!targetContainer) {
            return false;
        }

        // Check for the nested property of `role`.
        // Magic courtesy of SO, of course.
        // http://stackoverflow.com/a/4034468/157385
        //role = ((selectedOption || {}).dataset || {}).role;

        //console.log(role);

        instanceUrlLink = document.createElement("a");

        instanceUrlLink.href = instanceUrl;
        instanceUrlLink.innerHTML = instanceUrl.split("://").pop();
        //if (role) {
        //    instanceUrlLink.innerHTML += " (" + role.toLowerCase() + ")";
        //}
        instanceUrlLink.target = "_blank";

        instanceUrlLink.style.color = "#ffffff";
        instanceUrlLink.style.marginLeft = "1em";

        targetContainer.appendChild(instanceUrlLink);
    }

})(window);