Greasy Fork is available in English.

Produs (Proddable Pardus)

Makes Pardus a little more touch-friendly.

// ==UserScript==
// @name            Produs (Proddable Pardus)
// @namespace       Produs
// @description     Makes Pardus a little more touch-friendly.
// @grant           none
// @include         http*://*.pardus.at/*
// @version         9
// @author          Richard Broker (Beigeman)
// @license         MIT License
// ==/UserScript==

var TEXT_NODE = 3;
var PRODUS_CMD_ID_SUFFIX = "ProdusCommand";
var mod = { STARBASE : 0, PLANET : 1, BUILDING : 2,  MY_BUILDING : 3, NEW_BUILDING : 4, WARP : 5, AMBUSH : 6, RETREAT : 7, REFUEL : 8, DOCK : 9, HARVEST : 10, XWARP : 11, WRECK : 12, EXITSB : 13, VIEWAMBUSH : 14, CLEAN_WH : 15};
var PROT = { UNKNOWN : 0, YES : 1, NO : 2 };

var my_document = document;
var nav_size_ver = unsafeWindow.navSizeVer;
var nav_size_hor = unsafeWindow.navSizeHor;
var img_dir = unsafeWindow.imgDir;
var tile_res = unsafeWindow.tileRes;
var current_url = my_document.URL;
var sector, coords, aps_left, field_res, fuel;
var ap_img, res_img, fuel_img;
var starbase, planet, building, my_building, new_building, ambush, retreat, dock, harvest, refuel, warp, xwarp, xwarp_menu, wreck, exitsb, view_ambush, clean_wh, mine_ore;
var partial_refresh = false;
var in_callback = false;

universe();

/* Add a callback to support partial page refreshes. */
if (unsafeWindow.addUserFunction !== undefined) {
    unsafeWindow.addUserFunction(reflowNav);
}

/*
 * Reflow Pardus web pages.
 */
function universe()
{
    reflowButtons();
    reflowLinks();
    reflowNav();
    reflowStarbase();
    reflowPlanet();
    reflowTrade();    
}

function reflowNav()
{
    if (current_url.indexOf("main.php") == -1)
        return;

    if (my_document.getElementById("nav"))
        partial_refresh = true;

    /* Get rid of the left column as soon as possible, so the popping is less noticeable. */
    var left_column = my_document.getElementById("tdTabsLeft");
    var middle_column = my_document.getElementById("tdSpaceChart");
    var right_column = my_document.getElementById("tdTabsRight");

    middle_column.setAttribute('width', ((tile_res * nav_size_hor) + 50) + "px");
    left_column.setAttribute('style', 'display:none;');
    middle_column.childNodes[2].setAttribute('align', 'center');
    right_column.setAttribute('align', 'left');


    /* Add ship status & remove previously modded cmd elements. */
    if (partial_refresh)
    {
        var previous_clone = my_document.getElementById('yourship_clone');
        if (previous_clone)
        {
            previous_clone.parentNode.removeChild(previous_clone);
        }
    }

    var otherships = my_document.getElementById('otherships');
    var your_ship = getClone("yourship");
    your_ship.id = "yourship_clone";

    var produs_br = my_document.getElementById('produs_br');
    if (produs_br)
    {
        right_column.insertBefore(your_ship, produs_br);
    }
    else
    {
        right_column.insertBefore(your_ship, otherships);
        var br_container = my_document.createElement('div');
        br_container.id = "produs_br";
        br_container.appendChild(my_document.createElement('br'));
        br_container.appendChild(my_document.createElement('br'));
        right_column.insertBefore(br_container, otherships);
    }

    /* Grab the page elements we're interested in moving. */
    sector = getClone("sector");
    coords = getClone("coords");
    aps_left = getClone("apsleft");
    field_res = getClone("fieldres");
    fuel = getClone("fuel");

    ap_img = getClone("tdStatusApsImg");
    res_img = getClone("tdStatusResImg");
    fuel_img = getClone("tdStatusFuelImg");

    var status_box = getClone("status");

    var links = my_document.getElementsByTagName('a');

    starbase = modNode(my_document.getElementById("aCmdStarbase"), mod.STARBASE);
    planet = modNode(my_document.getElementById("aCmdPlanet"), mod.PLANET);
    building = modNode(my_document.getElementById("aCmdBuilding"), mod.BUILDING);
    my_building = modNode(my_document.getElementById("aCmdOwnBuilding"), mod.MY_BUILDING);
    new_building = modNode(my_document.getElementById("aCmdBuild"), mod.NEW_BUILDING);
    warp = modNode(my_document.getElementById("aCmdWarp"), mod.WARP);
    xwarp = modNode(my_document.getElementById("aCmdWarpX"), mod.XWARP);
    ambush = modNode(my_document.getElementById("aCmdAmbush"), mod.AMBUSH);
    retreat = modNode(my_document.getElementById("aCmdRetreatInfo"), mod.RETREAT);
    refuel = modNode(my_document.getElementById("aCmdTank"), mod.REFUEL);
    dock = modNode(my_document.getElementById("aCmdDock"), mod.DOCK);
    harvest = modNode(my_document.getElementById("aCmdCollect"), mod.HARVEST);
    wreck = modNode(my_document.getElementById("aCmdWreck"), mod.WRECK);
    exitsb = modNode(my_document.getElementById("aCmdExitSb"), mod.EXITSB);
    view_ambush = modNode(my_document.getElementById("aCmdAmbushSettings"), mod.VIEWAMBUSH);
    clean_wh = modNode(my_document.getElementById("aCmdCleanWh"), mod.CLEAN_WH);
    
    let nodelist = null;
    if (partial_refresh)
        nodelist = my_document.querySelectorAll("a[href='javascript:collect(\"asteroids\", 1)']");
    else
        nodelist = my_document.querySelectorAll("a[href='main.php?collect_type=asteroids']");
        
    if (nodelist.length >= 1)
        mine_ore = modNode(nodelist[0], mod.HARVEST);

    var nav_table = getNavTable();
    
    //addGrid(nav_table);

    /* Reflow the elements we've manipulated. */
    prepend_status(nav_table);
    append_commands(nav_table);
}

/*
* Reflows the starbase screen.
*/
function reflowStarbase()
{
    if (current_url.indexOf("starbase.php") == -1)
        return;

    var popularity_value = my_document.getElementById("popularity_value");

    if (popularity_value)
    {
        var popularity_greeting = my_document.getElementById("popularity_greeting");
        popularity_value.parentNode.removeChild(popularity_value);
        popularity_greeting.parentNode.removeChild(popularity_greeting);
    }

    var table = firstEChild(my_document.body);
    var tbody = firstEChild(table);
    var content = tbody.childNodes[1];
    var content_td = content.childNodes[1];

    /* Remove gossiper portraits. */
    var tables = my_document.getElementsByTagName('table');
    var content_div = my_document.getElementsByTagName('div')[0];
    content_div.removeChild(content_div.childNodes[1]); /* Gossipers 1&2. */
    content_div.removeChild(content_div.childNodes[4]); /* Gossipers 3&4 (empty innerHTML if missing, just remove anyway).*/
    
    /* Remove short range scanner notification */
    var table_headers = my_document.getElementsByTagName('th');
    if (table_headers)
    {
        for (var i = 0; i < table_headers.length; i++)
        {
            if (table_headers[i].textContent == "Short Range Scan")
            {
                var srs_table = table_headers[i].parentNode.parentNode.parentNode.parentNode;
                srs_table.parentNode.removeChild(srs_table);                
            }
        }
    }

    /* Remove starbase population display. */
    var popSpan = my_document.getElementsByTagName('span')[1];
    popSpan.parentNode.removeChild(popSpan);

    /* Only NPC starbases have popularity, so we use that to determine conditional actions. */
    if (!popularity_value)
    {
        /* Remove commander name, alliance links. */
        var commander = tables[4];
        commander.parentNode.removeChild(commander);

        /* Remove the custom welcome message. */
        if (tables.length  > 5)
        {
            var welcome_message = tables[5];
            welcome_message.parentNode.removeChild(welcome_message);
        }
    }

    /* Align things properly. */
    content_div.setAttribute('style', 'clear:both');
    tables[3].setAttribute('align', 'left');

    /* Make the service links touch-friendly */
    padLinks();
}

/*
* Reflows planet screens.
*/
function reflowPlanet()
{
    if (current_url.indexOf("planet.php") == -1)
        return;

    var popularity_value = my_document.getElementById("popularity_value");

    if (popularity_value)
    {
        var popularity_greeting = my_document.getElementById("popularity_greeting");
        popularity_value.parentNode.removeChild(popularity_value);
        popularity_greeting.parentNode.removeChild(popularity_greeting);
    }

    var table = firstEChild(my_document.body);
    var tbody = firstEChild(table);
    var content = tbody.childNodes[1];
    var content_tbl = content.childNodes[1];
    content_tbl.setAttribute('align', 'left');
    var links = firstEChild(firstEChild(firstEChild((content_tbl.childNodes[3]))));

    /* Remove gossiper portraits. */
    var tables = document.getElementsByTagName('table');
    var content_div = document.getElementsByTagName('div')[0];
    content_div.removeChild(content_div.childNodes[1]); /* Gossipers 1&2. */
    content_div.removeChild(content_div.childNodes[4]); /* Gossipers 3&4 (empty innerHTML if missing, just remove anyway).*/

    /* Remove starbase population display. */
    var popSpan = document.getElementsByTagName('span')[1];
    popSpan.parentNode.removeChild(popSpan);

    links.setAttribute('align', 'left');
    links.removeChild(links.childNodes[2]);
    links.childNodes[1].setAttribute('align', 'left');

    padLinks();
}

function reflowTrade()
{
    if ((current_url.indexOf("_trade.php") == -1) && (current_url.indexOf("blackmarket.php") == -1))
        return;

    var els = my_document.querySelectorAll("input[type=text]");

    for (var i = 0; i < els.length; i++)
    {
        els[i].type = "number";
        els[i].style.height = "35px";
        els[i].style.width = "50px";
    }
}

function reflowButtons()
{
    var els = my_document.querySelectorAll("input[type=submit]");

    for (var i = 0; i < els.length; i++)
    {        
        els[i].style.height = "45px";
        els[i].style.width = (((els[i].value.length) * 6) + 35) + "px";
    }
}

function reflowLinks()
{
    var els = my_document.querySelectorAll("a");

    for (var i = 0; i < els.length; i++)
    {
        if (els[i].querySelector("img"))
            continue;

        improveClickability(els[i]);
        els[i].style.padding = "1em";
    }
}

function addGrid(nav_table)
{
    var navFields = nav_table.querySelectorAll('.nf');
    
    for (var i = 0; i < navFields.length; ++i)
    {
        if (navFields[i].parentNode.tagName != 'A')
            continue;  
    
        navFields[i].style.boxShadow = "inset 0px 0px 0px 1px rgba(200,200,200,1.0)";
        
        if (navFields[i].parentNode.parentNode.className == "navClear")
        {
            navFields[i].parentNode.parentNode.style.boxShadow = "inset 0px 0px 0px 1px rgba(200,200,200,1.0)";
            navFields[i].style.height -= 1;
            navFields[i].style.width -= 1;
        }
    }
    
    var navClear = nav_table.querySelectorAll('.navClear');
    
    for (var i = 0; i < navClear.length; ++i)
    {    
        navClear[i].style.boxShadow = "inset 0px 0px 0px 1px rgba(200,200,200,1.0)";
    }
}

/* Clones node "node_str" from original document. */
function getClone(node_str)
{
    var node = my_document.getElementById(node_str);

    if (node != null)
        return node.cloneNode(true);

    return null;
}

/*
 * Generic link padding for better clickability on planets/starbases.
 */
function padLinks()
{
    var images = my_document.getElementsByTagName('img');
    for(var i = 0; i < images.length; i++)
    {
        if (images[i].src.indexOf("/factions/sign_") == -1)
            continue;

        if (images[i].parentNode.childNodes.length < 2)
            images[i].parentNode.parentNode.removeChild(images[i].parentNode);
        else
            images[i].parentNode.removeChild(images[i]);

        /* We just removed an element, so adjust our index accordingly. */
        i--;
    }

    var separators = my_document.getElementsByTagName('hr');

    for(var i = 0; i < separators.length; i++)
    {
        separators[i].setAttribute('style', 'display:none');
    }

    var links = my_document.getElementsByTagName('a');

    for(var i = 0; i < links.length; i++)
    {
        if (links[i].href != "javascript:showStory();")
        {
            links[i].setAttribute('style', 'display:block;padding:15px 0;border-top-style:solid;border-bottom-style:solid;border-width:1px;');
        }
        else
        {
            links[i].setAttribute('style', 'display:none');
        }
    }

    var br = my_document.getElementsByTagName('br');
    while(br.length > 0)
    {
        br[0].parentNode.removeChild(br[0]);
    }
}

/*
 * Gets the first child node which is not a text node.
 */
function firstEChild(node)
{
    for (var i = 0; i < node.childNodes.length; i++)
    {
        if (node.childNodes[i].nodeType != TEXT_NODE)
            return node.childNodes[i];
    }

    return null;
}

/*
 * Replaces the given node with a modified version.
 */
function modNode(node, mod_desired)
{
    if (!node)
        return null;

    var mod = getModElement(mod_desired);
    removeChildNodes(node);
    node.appendChild(mod);
    node.id += PRODUS_CMD_ID_SUFFIX;
    improveClickability(node);
    return node;
}

/*
 * Makes the entire containing TD clickable.
 */
function improveClickability(node)
{
    node.setAttribute('style', 'display:inline-block');
    node.setAttribute('width', '100%');
    node.setAttribute('height', '100%');
}

/*
 * Returns true, if the script has detected that there is protection on this tile.
 */
function getProtectionStatus()
{
    var protection_node = my_document.getElementById("tdStatusTerritory");

    if (!protection_node)
        return PROT.UNKNOWN;

    var protection_text = firstEChild(protection_node);

    if (!protection_text)
        return PROT.UNKNOWN;

    switch (protection_text.textContent)
    {
        case "You cannot be attacked here.":
            return PROT.YES;
        case "You can be attacked here.":
            return PROT.NO;
        default:
            return PROT.UNKNOWN;
    }
}

/*
 * Destroys all child nodes of the given node.
 * - Assumes "hasChildNodes" has already been called.
 */
function removeChildNodes(node)
{
    if (node.childNodes == null)
        return;
    
    
    while (node.childNodes.length > 0)
    {
        node.removeChild(node.firstChild );
    }
}

/*
 * Returns an element representing the desired modification.
 */
function getModElement(mod_desired)
{
    var new_element = my_document.createElement('img');

    switch (mod_desired)
    {
        case mod.STARBASE:
            new_element.setAttribute('src', getImgSrcByPartName("/foregrounds/starbase"));
        break;

        case mod.PLANET:
            new_element.setAttribute('src', getImgSrcByPartName("/foregrounds/planet"));
        break;

        case mod.BUILDING:
        case mod.MY_BUILDING:
            new_element.setAttribute('src', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gwWDwoCS9/8JgAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAACvklEQVR42u2aPZLqMAzH5bcchD0EtXwVDkFtpecQew+KyE0aanr7IvErsDMmSxLnbchmHvrPZIZJhD9+SLIdBCASiUQi0dtKLdiWjtda4nj9SLslASCi0fr1DJgZrLWwBIAlRcaYsIaMMQEAaIlB/3n3HCAA3h3AkkkQmBmIpkNTaw3PkiUzAzMX9bNFAGytTdl5arnEIQBVVdnC7M6bA1A4KAIAnGiHJAcIAAEgAASAABAAAkAACAABIAAEgAAQAAJAAAgAASAABIAAEAACQAAIgGW1+41Oh/5EXfJPz1KpX5i/hvFaIoaNlb6I/mepH7jqWq7bH8ei/YwlweKytxeXrXXjWLs8rrjsbcmytbFxvKKf3ZzlKtX29Gt54mc9MLjkskMh1Xfpvp3+hzAtDpMxAP2aHw2xtudJLY9GRNRaY3JTxHsVTPZ9ijb90EngEqTOLnP5ocmXtLmKK3bP6rruQgMRQ/ZrBET8Fj7RhuKEGBFDXdcP7aTPWb+d7TNl/U4msMW3wilMlFLWWlvF2xi9wSqlrFKqC63s19OIiOk+EYFSCgaScGcb7axSqlJK2XQP7y64PgAiAnv3W8quCgA6X0bEpxPLc0xso7LW2mdb5KFaw6lna50F8iT0kCdm7Pc5A4hjwIkIk03bttC27aYOQ12yYmbQWoO1FowxRVWlJTqdTt/uXa/X7QBIk8/CA2C8WDJfVvVUyJ3PZ5slPZwzuFXeB5TGY9pfaK1TEjP9Za5v2xcidkvwZgCkwRIRhBAwhIBElE9Ap1UiXwVCCEPvCDjZZm2aEAIeDodkU1Rz/DH3UOKcA2YG7/3DRmjkGXjvP51z+/SciOB4PIJzDpxz4L3fxwF/JdsEIbfL2v4CAOe9/2Tm/e12g8vlAk3TQNM0+So0CUDNBTCQ6adObCUny6ktc0m/8lJFJJqnv3TcgKkE1HFuAAAAAElFTkSuQmCC');
        break;

        case mod.WARP:

            var src = getImgSrcByPartName("wormhole.png");

            if (src == null)
            {
                src = getImgSrcByPartName("foregrounds/wormholeseal_");
            }

            new_element.setAttribute('src', src);
        break;

        case mod.XWARP:
            var src = getImgSrcByPartName("foregrounds/xhole.png");

            if (src === null)
            {
                src = getImgSrcByPartName("foregrounds/yhole.png");
            }
            new_element.setAttribute('src', src);
        break;

        case mod.WRECK:
            new_element.setAttribute('src', getImgSrcByPartName(img_dir + "/foregrounds/wreck_"));
        break;


        case mod.AMBUSH:
            new_element.setAttribute('src', "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABmJLR0QAdAB0AHTxgYjZAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gwWDwsKXB9FVQAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAADbklEQVR42u1aW47rIAw1KPuydxa6spqV+X4U5noojyQFkpmJJaSWEgzmHD9IAW655ZZbbrnlz4qZqItCawmHNkWWmQZAxJWobANmBu89zDTATHHrukpN1nWVsHmatSh7JfgTESAi/koDICLW4B8NEMbQLCPYaQ7g/+YuhQJ7FvyZGZxzwMyHDPWjDJCDPzPD4/F4M8CBsHlpA9DrUPed6kwa2LNOP568/nwGDYZTILeZkPB4AHh47/2ZNLCj4d9IeV0p65tFA3sm/Gt9s2hgT4R/3DGfSQN7Ivy5Vf3NoIGdCf9R2eMlKVCCfwnqtd9G0sDOhH+G/9DyA6NpYE+Af47zVT8wkgb2CvA/kwb2AvA/lQbLZPgfOsmIqHBfeFkDVCu/0IehVTe7wXgMFxSHiPJ8PmWEPJ9PQUQJ9cM1fcBIjz1qbtsT/pOQ1lVXNwP0SH3PuClaRkN0S/zfOt+IaLCMhGS8+W3E/+yczIzOuRLvLxUNit7/g1ddBACce5XWOxrYkfBv5fkb7wuGRgM7Cv49ZEZt8LEBSt7/qPObXRvYUfDfUPxcggZ2MPwZxnrqj2mwfKgcY6jLIaCXH6jMj5+GQ3NxBFwBZbf8ajENyPWCl553FmQP6XSIKCLS+/LBIeKQC41PdS4Nh9Ot6IhRwZh5/83conNJszpmBmMMiAgQEXrvtQFqXlmPqVGIkhPhwvyt/tJatujMjnOx4gIAUZ9dAVaS0IUBgDN9lM5dGFODbdpPWleULToLel8Tqh+/HkgXGEvSnBQW5PRzOxbtCofjtK/KraGlU4+zGv4A8O2vKwBQLDqICIwx3hjjdfGT9uV4GccQETDzocJG8zu2Un2gdD5Ka9MW5mBBzpxGOo429LnCGMroOISAiNrQaut6m8tqZ8LMICIoIquIoLJSzuHknM2WeMtJO1wqxxMPKIIA4l3p8qLhn7uEjDQI0aB3gkI7x38T7z1ESItI3MOutS4Jn9L6nSISesTvyHfvvVP+pXbx6XR4VuO0z/ryBSICe9e6ROuGyTnlHhFFKnRBQNjIF73CNXc0PEXHGE4Ua+W1KonfULvHANr7c4ZrBOqlZuXFZ7Uvfvfew8v/fNu8i7pf1H4zUMpvTseVjFm6UdLFkGs4ilbG1crSuMH3VG/rDmBrJrg1q7zlllv+sPwDc6U2Rgd+YvUAAAAASUVORK5CYII=");
        break;

        case mod.RETREAT:
            new_element.setAttribute('src', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gwWDwcAEH/jRwAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAEYUlEQVR42u2a/3HzIAyG5S8ZhE4Co3QTK5vkmyRiEzyJ+0fBJyv8SgKu05q73LWJjdFjSYgXAI52tKMd7Wh/tw0bPsv4T6mR//wKANxoo7XWxqQZEBFYay0D0B3G0Nl45EYbY6AEgIhiMDb1ilbGk9Z6vt1u8zPtdrvN4zjOWuvZG2/+jPESxDtBaGr8FhBa5wDUWo+ImIx1Hud39DI5gogAEcFaewEA3O3bH8exNqZRfIqeM47jvFfjw9uPGiBcGBNuXAwfD2C3uQBTb/+BgWchMJDNvODfhoBq5nICALTW2lieKNURz7TzD5TCNRCIiDQiRpPh2wEwxgARaWvtkvBKEKy18F0IJiG9Tw5IJELcQzI7tXZxpRQope5+DN8rpZT5DmQzTdMHACixaHLvCgCmafrwBkZ/V0otiYzDSADZBEZLAC4MPuUFKRgSiIDRFcSpdYfTNH0451QNhJJ3bAGiNQAHAO5ZCBJGBIRrDeHUwatWEJxzi1GvgHDOqR4QTp1CK0CYrLVDCxC9IPQCECBQDARfEtcCERCmVsVQTwApEKGtgNTA8ADAWju08oItAEgQFAHyEIzWXrAXMeVHhJFTJ2M+WXlbU9U54RnZaTSyf/Djq0Fu6GoDxA/2kRVc0ASQiHTr9X83AFrrMbYB4oXMWi1Aiie6d+w11QNiig3TAh4BYLZaKreSxKhCxqo1yoDYUpPx31oV6i6IVKrCwfhNleFNBBEuhiSEkPD51Frr0saKtfY/AFxbDHpoDABrDMi58K/eHdrj/mAPPUABgHll9Zd58xbqVOVdlLUv7xJvcUZgVydEZI7Y4pTIrs4IJep86unyezwl1t3oox0tHwI5V33FNXm/uX5qQ4X3UXNP9Jnn2oWIT07myXl46RcASvrAammdSZR8LNl7aseeXYi8WIktx2cq5CwsVZKRsTyyM21SHmBCHR+EDFmjIyIgolzbp9yP2ANNqAH8HM/fBtXUBIWxZO/JjH0dAmGQiAiXy4XPxSYhT61Cxj9EupyRxRAAaC+SQAmAGEd45rLgkocoIvdkr69WhLx8zYuTO+OD5/i/w4mQXbdzzH3CWwqaHKvOuGuvlr7DMATqZp5n7RcwOuyCBA8Sb4hKEhsfh5DZkuEh78ldfxaylkFEzfftGRjNtD3M1fbBC7zLhadqkR+K3hHrPxgiSmZTuoetJikJAL7laGOtvYt5lh+iiWee55XHNBEa2VvjSfRyuQAA8KWxySVBBgtzAFbZXMR8NpHEZo0W4iULFwjH5gKE1AmyROKsKoSWYkLE/CMDDW+jpZ5PPjwREXUIr9iU9miIRWcB5mrFRBL+99Pm8r0v+HLn/KrqgEh4IvcEtuHSZBZYkiCbyrKJhCdNngNCLeDjlHwdsZphauqAmCf4ZCwPXzbRBB2Ioy08416vV5lIlusB4O56mXRCv8vDnINpmmKxaoKmSER31/B+fB/K65CQuqf3arBUCueuq+mvpp9DUDnak+0LX2/I7fo9xIkAAAAASUVORK5CYII=');
        break;

        case mod.NEW_BUILDING:
            new_element.setAttribute('src', "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gwWDQIiu+yCiAAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAC4ElEQVR42u1b27HcIAzVfRSSVCJ1Zm0n24mlTnAlm4+Ahzjgp2DwXTTjH8bWmmMh6RxYgG7dunXr1u1t7cPID/nL2sRfxezbCgBEHIjsMBARUFWKACgChhUAQETAzKYAiAgCAEZgcOmIOGs8DMOrlI3j+ELEl5+86VL7vEOiCtGFiOijgN4KgAQI1FwO2FjLhyebSqhh3OcDssgHVQB4PB564GVJRJCZsyCICC4qRLtJcBiGl1+3R3oKQcTXOI5WPm+VAwQAWFX16NL5SUlQaoX3barAuwGQ5RZnqsrdACAAYETEVBXwbbFaLZHvmpM6QKySZTD6+nIbAPwk0F+nGyERAWY2/frVALhCk8NXj0KfbwWAUSdZrDw2D0CInkgTaKoFrqIHlNQEbsMGAx1mZlRVtsoFzbLBAEIMxAKEH80GeY0Rep8mS6FZNrjGCInITBlqmQxlS97V3qKzwQ7APQAgKLPd1nwnGCZOa5TYShNolg6n+oASmsBt6HApTaB5OlxaEbpVFbilImQ5ceuv3zwAmYlLkwAEzc4agFITD9b6GSGAirtE3d7RPoxD/Gy4Lv1LNL7HNx2491QS3DwGd/Ek1+zf+wEAgMSYHHjeFIDNY3C+CpgKlpEGOINice+lMphjYgnBMhfCyXBX1SMvvvRxugKdAiCh8hIAzBuafiK5sMyFOyzH1phlYIw77q/HBZbREaIip/GnJO8N4jRPPr43gFclAtbo7WL3tkRjNG+dR78HfwViqAdACu0o+UhBAObfj8FW1XkzpUoOyMlRiBhvYFbhS77i8BHBpUgSHIYBE1WgefssEZ4VSVNovKhqDkglwVCSVtRaghWl9+gSjI7MYvUqkFNql1Ugflnwf3y4uuZVlZg5LLfLGsTXkc7LOfePShNfz+fzvzM80zT9ds79Ck6cc6Cq4JyD4GuaptDF0I6xJwC42O+Kz11ol2aDe57LMb81Nrjlt4so3brtsz/AtXPP5JvNxAAAAABJRU5ErkJggg==");
        break;

        case mod.REFUEL:
            new_element.setAttribute('src', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gwWDwYQFNPCYgAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAADdUlEQVR42u1abXLjIAxVdnuQ9iTSVXoSqzfpTSJugk/C/gjqYAoB25DFiTXj6UzaoPJ4evrAAKeddtppp532snZptA75p7WJf7rZWysAEHEiaoeBiIAxhgIAuoDRCgAgImDmpgCICAIABmBwb0ZsNZ6myfWy6/XqENH5zTcNtT9HECplFyKiZwG9FAAJEGg4DSjE8urNpgRVP/d6QC304CEAfH19mRX/LIkIMnMWBBHBKEOMK4LTNDkft2tqCkFEd71eW615KA0QAGBjjFkbOs8kgvIoeh8mC7waAL16i0MAQADAiIipLLAlrf7XNBhuakVjlU2Dvi8wrTSiOwB+E+ifXYVQcPoPE8khmqGeDdEhsoCIADMr9Zu2xG+jb1yfHpsfFoDExmX4idDabjAndEEDBQDQ5dRH6AZJRFBBiIHwHR/cDv8YtrYb1Log2/X1HIONkAXEA5Dt+nqOwUZKg3KLkrxO9AZhhDpAjDGGmWtAeE4ANBTugeCFsnmXOEolWJwCEdHTj8XX6MHT9gJSYkHrUBgOgHssiELhKQGoygotWXDIsXhLQRx6LP4IQRx5IPKQUGjWDerUJvX5zlBgZs5OiOE2a6StLfOj3hHaM8yoOeEuw5LTXsEuG+jWi9I9aBz7+uUjFsHi624739giSFx7BeOv5gDofnI+3nI5tqD2aIzhDSD8XHvtzBD1Dv1+/L1CfRosFSEehDD9lKhNt6/Tzxp+8rtgR+o7GQo3CaW7AKSmuQDwc3EZILqgtiIehQuF1NefSk3/O4yomqNwjb8qEP40EhpGRAyLIQWptmbXjaRG5NHnvza/xV+RAblbXT2NIDwWcX25XJQ15JzDQDOMb3BQ1wgYRlB/e7y4Pr/jbz8A8WlkrqwWcZ1bxxijiGFc7vpn9fV5wd9+DdBT1kUzV1YU0XXVuwANFH6XvxoRhPDFxdKVVeOGqGh7/ZW6QfFtKTMzqtomUmAqc9BOJhSr0hb+arLAYkKT6sM1XOLTQES4ifL2zJI74Vb+atPgYkITpRvQwQUzg3MOnXOTcy4sd4svNYVr+zUwU4xJC39qf1O0s9aCiMA8z4uF5nn+sNa+AwBYa2Ge53fv7Hue5w8AeNfvZt7syK4frq2n+/n5CdZaiP7+GwDsXn+13aAkKkG6V+oWStMtpS2s/Ptaf6eddhrAP2FlQCgKYtGgAAAAAElFTkSuQmCC');
        break;

        case mod.DOCK:
            new_element.setAttribute('src', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gwWDwc3qMJGSAAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAADDUlEQVR42u1aUbLbIAzctD6IexLpZpZPFnGT5iTuR8FDGOxgRzBOHprxvCQPO7DsCkkR0K1bt27duv1Yuxk9h/1lZeqv6jZYAUBEE/P7GKgqnHMcgaCfwCSZpmmxsPv9vkzTtBDR4hcvxux6st9WDPD29oPGcQQzYxxHjOM4AuDH4/EHwF9/fTcDcoyI2GDOhF9X1xYzQ0RARFRDDkPtBagqVLV4sTkZBRBEhCIH+TkAzPPsCibNqkoBhBSI8JkHwBSEqj5gmqbFU7cklhAASkTL/X7f8wfyjT4gHHninHM52UTMMAu8rugE9b9y8r6DmYND/FoAAEALWPDVx+AuCyzzjyvHAbsssJLBpQHYOuosZXD5SLC2dQA6AB2ADkAHoAPQAbikbYa6R4osHw0AEVEu4vOl85Iiy2dL4EXIq98MQBP6XxUABiAt6A80KIqe2HUmIhKR6vRvCQDjdSFzdXpb2remfxMA/ELIX6ednqpCREzpb2nVfhqr/fPY5SPBZOfFeveHKy88XLUWfzkAYieXHHdaS/eDNVXffUbi5KotPNgVe4SqL7pbt26nfECJzlvoN53HW9955BTY7QVs2N+3zsN/J1o5zd1wN+nvkxbzONB9YhsH5LKyqJEp18ezJZ8cU3JjSxh1ShqnAUgan1hV1xxeVeNurmyBI5KMJEA9jd0Yt1lEARBkYS6NPeoxAM38nxE1PQWZhNdJhvc0NrZkXDoPDfdlxjbLBrfotlZ3AEBEMM8z4vdRo8NTJYiZcbvd4vrAVkMEERGpamijO5Q4NSmIBP8Q4nzn3JNkAmW3xvrFu3RnAzjJPYeyxtbZoPoJSkGFSCMZxccr5ypIZ0tlVhKwTIYOZ6Dh75m+oeHNRUus9RCcvOjsksJJxmMJmcKqP43W7zzTSjuc1TWSQmdOv/54XCfnj0ciIuTACu/9rq5j/dG2tbvOOQcRoeg+RoXo8Ewk2OIYFB8DpEdjkRSOJENSkAvkSlh7gZArDITicZLkAnP0eRwIzSVhcqts0DIU3gp5TbPEbj/F/gElRPopq5cMoQAAAABJRU5ErkJggg==');
        break;

        case mod.HARVEST:
            new_element.setAttribute('src', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gwWDDIrHLRm6AAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAEB0lEQVR42u1a65HiMAz+9o5CTCVSKekkopNQCXIndiXcD+ycMXHeQFiiGWZ2vI4UfZZkPQLstNNOO+30vfTzYnkcfkOk4fcrAEiVZiIi5jIGqgprrU0AeCoYPy9Q/E5pZsYQAKqagyGvsog1lVciutZ1fb1cLtc5dLlcrkR0DcrLSPfZjvJzFc9BqOs6BYK/Rvkea+AtxgAGIEREIlL089THHxiMiA8iAmvtKbjEpkj6Tr7DlCX7jYoZdV1v0hUYgNZ1vSSYcQpEH5CBl3zE6c/w3cE4sjUrKJ7+gsA11qIWW8FhDQBK2d2CREZvjyupahsY+wLoOwEYit5zU1m11rKIUApAR5r8VgCKxc0Kp6UAxFrLN51fXygtCn5bva5y+rNR8/8cAD6ddgB2AHYAdgB2AHYAlqRr/RkfL0yEOOkXPCWh+ruUgff+aIwxXcmQc8547/2CZKgiotoYw977IwCTAOG2UAzFTI9KGWKWx0+uMyIfVSUAFAoiTmTrOwGYUjBNfdG2zE7T7eBypKoUwNW3ukBU0BgDY0zJDY7BZN0EnlVVVaaqqrt/RBmqCu+93UKtMbZ7M7YyZHxYS6y3LP6WpiiPefGlbfFnDEc+ajAiIjidTpselg5awgqjMcHGaVUQPm04+gDC1sfjX/+BxP6JzBtcY4wZP1XpnXYadoEuU11iljk/TdZfYfap/Ds5hzGRe4UanImoDnV92yPoWNMnKS9ERAB65RTv7iwZmZOJSawWQyUnhbWnFmpdcg55A0JEHu5jZoaIxA+U8gZHKbKv6TJ9PPvcNe8q3VWdAPSQt59i0ZHcxayqLTCh/cWJAMnv9sRl5iQwU3g+7M32PSRhoa3WdpP+5AlKln0JbjN6KyIRQZsrn1Z/0VqCz01NXzuVj3wznkX5c2QP+SPjsT3d+laSs1871mRCDMj9NdYAGuNSyrMkP/4dzTyTc1dXjJ0LpA0Mzev3xGpO1lobv+vpS3mLJtDzXP6/kvxg3qUaQtP1w4ygVApuKUi0+O4K/hp5jQBTM/fQMeXzodCp4a5AF+5RfkdTIr7fs74SU2stq2oMhGStjWbSXo/B1GigqclrKRzaX/EQaEwATfaOOqhDatYRgKDsnfkl92h6PSL6ewCNiKjdO+e0Ss8FA7ybNJXkh31DB6UA9G4w4r0/OudMVLqqKjAznHNomiYOI84AmnR/BMgYgzjISHKJBoDhG6UBCx1rGnkaY8DM8TljjIFzLg5DGgCuS37HPoNkcGNukxWOM8sUABeYemvtj3POOOegqmiaBufz2QblFf+nPC4FDUALVtbJYQAc+YWXQ8daqxgQ3xWl7lCn/K4uUtc7xqnSGtXgmLR1ajW4Vir8rOp2p51+C/0DkzjscRhTcjIAAAAASUVORK5CYII=');
        break;

        case mod.EXITSB:
            new_element.setAttribute('src', 'data:image/png;base64,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');
        break;
        
        case mod.VIEWAMBUSH:
            new_element.setAttribute('src', 'data:image/png;base64,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');
        break;
        
        case mod.CLEAN_WH:
            new_element.setAttribute('src', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4QgcBjsnpkbngAAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAEpUlEQVR42u1a8XHrLAyX3+seJRt0A7FJ3UkQm7STGG3QEaxJ+P4I8lOIHbtx0jpfrbtc7gAj9EMSkgBgp5122mmn30vNN/Pz5TdHqfz+FwBYoT0iovfTGKSUgJnZAHBXMJpvEPxEaO89zAGQUqrBoO/SiFsKnxAxhxBy13X5Guq6LiNiLsLTQvPZjvDXCl6DEEKwQPhfI/wFbfBb9AEeAAgRkYgm7dza+NkEC/wDEQEzx2ISmyK6tPMjqkzVb5HPCCFs0hQ8AKQQwhpn5i0Ql4Asc9FD7P4VtjvrR7amBZO7v8JxLdWo1VrwdAsApqK7FYFMOn6eMKU0OMZLDvQnAZjz3teGsomZPRGhBWAkTP5RACaTmxvsVgIAYmZ/lPn7E6VVzm+rx1VNfzaq/o8DwKPTDsAOwA7ADsAOwA7AmnDtcsTnVwZC3tQL7hJQ/V07gYgcnHNuLBjq+96JiKwIhlpEDM45LyIHAHAGiH4LyZBGejgVIVZx/JfzDJ0npYQAgCUh8oZ3+kkAvpIwfXWhQ5ptw+1icphSwgJu+lETUAGdc+CcmzKDQ1HZ/gtztm3burZtTzqUR0oJRIS3kGssrd4szQw9PFhJ7GJa/FuKon7JwteWxe9xOfJQFyNEBDHGTV+WzmrCDa7GCDZONwXh0S5Hz0DY+vX4r38gsT+R+QHTWKLGdxV6p53WmcCYGluVrfs3rc6T2SAiQtu2g8cWEQ8AbSlSvLZt6/2x0xYr1NGFtm21T8qRCJrZHZv+8bBt9yJEBOfcPB9EhBACdF0HOWfIOZ+d62PZmYnSSMeUrI0AAEIIkHOGEMLAa6ztXsJ3XTfK56keSERjMbu3Mb6O0XOdiPTxkh/J+T0AQIwRYown5lHaxkwoXTgx0kz/2VhTVboMgKp7EWa0NFXKXHpO+5QSGkDOSmPPz8/onFNwqI4DTImLQgipgARzY9XUVDBmBkSE6i2BBwDy3icrn45fqiaEiGeFiDJuMA0Tsr5bE3h9fc1zJlTF+brDWfmOjD0xtTrU7rruJHlSc1b5EP/t058lqWjVPqhrzjnB8RFDNG/3+qn6nppK0zTcNE1smoa1DY+r8laTmJnL2MHsxtaoay9jWZ/V2B3X/xjjye6vvhcIISRE1B1JIzXBRQCbPgKACABstXOuTnBtzrC6KmwdW4xxEfOcM475C9WqpmkGrfnCM5t0Tbr8tKRSU7UPZe6maQbHVlTWL6n82lOk5mHnVFVmZgghjH63lgYAmBmUYeUlh9daRASlHk9ltwfbLt/gQq1hs1s45i/Mu2CeOmFuCoDugp7rZtdTjHF4s1cWNqiwjRuK3fZ2seUIHDSstmX1yNYxXbL3K0P3ZQAwM2iwYx1TjPHkzd7ITY0CMGWwJ99bH2DAtrHF8DK8gF2boh/jFULQwOoE4xp8q+FnuYCIADND3/fQ970y7UWkFxFh5qbve6d97+/v8PHxwSLyURblAMBr/+fnJ7y8vLyV7w8AMHyrv9qDi8jB8iAieHt7G9YkIq4ANvAREfbep+KHbDuISNTTSE8mzQnunQ1qgtTOFETqjHFpmOtnQmT1Md9d+Nlpp0eh/wBGwih8LyQSAQAAAABJRU5ErkJggg==');
        break;

        default:
            alert("Undefined desired mod: " + mod_desired);
        break;
    }

    new_element.setAttribute('height', '48');
    new_element.setAttribute('width', '48');

    return new_element;
}

/*
 * Tries to find the correct image for a link by a part filepath match.
 */
function getImgSrcByPartName(match)
{
    var imgs = my_document.getElementsByTagName('img');

    for(var i = 0; i < imgs.length; i++)
    {
        if (imgs[i].src.indexOf(match) != -1)
        {
            return imgs[i].src;
        }
    }

    return null;
}

/*
 * Retrieves a reference to the ship information area.
 */
function getShipInfoTable()
{
    var tables = my_document.getElementsByTagName("table");

    for(i = 0; i < tables.length; i++)
    {
        if ((tables[i].border == 0) && (tables[i].align == "center"))
            return tables[i];
    }
}

/*
 * Retrieves a reference to the nav tiles.
 */
function getNavTable()
{
    var area = my_document.getElementById("navareatransition");

    if (area)
        return area;
    else
        return my_document.getElementById("navarea");
}

function createMaxWidthSpacer(spacer_tr)
{
    for(var i = 0; i < nav_size_hor; i++)
    {
        create_spacer(spacer_tr);
    }
}

function addProtectionStatusImage(protection_td)
{

    var protection_href = my_document.createElement('a');
    var protection_img;
    var protection = getProtectionStatus();
    
    protection_td.style = "border: 1px solid rgba(200, 200, 200, 0.5);";

     // Add the link to check for current protection status, and apply relevant image.
    if (protection == PROT.UNKNOWN)
    {
        protection_img = my_document.createElement('img');
        protection_img.setAttribute('src', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAg9JREFUSMetleFt2zAQhT8JHkAjqBPEBu5/lAnqThB7gsQTuJqg6QR2Jqg3iP3/AKsTVCNog/bPk8HQlC2neQABiTzeI98d7zKuwN1LoALugTJaboEDsDez9pKf7AJBBaxFMgZ7oDaz/Sgidy+ADTAPpnfAbzkLUQF3CdulmXWDRO4+Bd6AQlM1sL0mi+RdSAGADngws+aMKCJpdKqGGyAfG2Aak2WBXG8yaGTQJU69DhKiVUzahPRnvnKtP0enSJEcJU+lsQCOWjtBex/kayrf5DrBk+xWMYmwlqS1mWVmlil+RRCXmGyl3yd3L3JlTAG0ZrYdkL+Ug++Bs/57mtogX618zyd6iACvF+K8CjIxxGxgnsDnGrifBMHdD2TSsT+1uw9lW2Nms4FHvAbKfETWTj/DJud21Bo3IVcajj15/366kba9zy5X9QX4OnJzeYNtb3fIVQQBKlXsa3hMtIuh6t/72+UqIf37+ZHY0yRuVF6xCX1tzawNa90fvYmtmS35D7j7RiWqA2YnIi3OgV/6fTGz1QcICt1koalvZrZ7l96aqG/MwJBkERRe1Gb6+DOJ7O+GNHf3Km7TQcAfo/axjG2zhK4AX/o+M9DaU+iAn5L97J1NErouzazV/LNayFDhbDQOwG6gxZykC0legE63mwcEH2rt76Rz979Xyk19oU+NxkS3mCuYXSRFwyfhH7CD3j/Lh+YKAAAAB3RJTUUH3AUIEBwxD/MvfAAAAABJRU5ErkJggg==');

        if (partial_refresh)
            protection_href.setAttribute('href', 'javascript:clusterprot()');
        else
            protection_href.setAttribute('href', current_url + '?ccp=1');

        protection_href.appendChild(protection_img);
        protection_td.appendChild(protection_href);
        improveClickability(protection_href);
    }
    else if (protection == PROT.NO)
    {
        protection_img = my_document.createElement('img');
        protection_img.setAttribute('src', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAASFJREFUSMfVltFRwzAMhj9zHSAjdAQeNIA7QckGjAATpEwAmaTdgAyg3GUERmCD9EXmfAHnEtfhQE+ypNxnW7/tOCJT1T3QAB7YW/gD6IBWRAYyzUWQk0Hm7EVETtkgVX0CXhd+8ywib2tBd6paTVYyALWIOBFxQG2xYI1t8ToQ8AhUUT8OInIJBeYfLIfVPuSAjtG4FZHPaZHF2ih0zAH5aNzN1MY5nwOKZ56U7y3S/gba0nZzyXEck+fuh1z6DDmXBqlq1ff9Oacf096qau2mM3POBdB7AcgXbK5HvmCL/C6sYGv7NdXdAhrsHpzehevlveDJuJhwAM7/fuuahF8cdJ/wt9k6ezjZUgzhP4PNQUt686dU1xXkzF6qdSFYB9RXqCRS5RA5dcAAAAAHdElNRQfcBQgQHR69OSNkAAAAAElFTkSuQmCC');
        protection_td.appendChild(protection_img);
    }
    else if (protection == PROT.YES)
    {
        protection_img = my_document.createElement('img');
        protection_img.setAttribute('src', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAARRJREFUSMfVltFtgzAQhj9HHYARMkIf/gGSCVo26AjtBCQTJEySjuABDokROkI3IC+2hBAgQ0zV/E+nuzMfnH8Zu67rGJNzbjRvZnugAg7APqR/AA/UktrR5y0BmdkpQOZ0lnRaDTKzT+BCmr4kXfuJXcoqMysGX9ICpSQnyQFlyEVVYcTLQMAHUPT24yjpOxZDfAw1Qu/7GtBbL64l/Q4bQq6eWJMMOvRiP9PnJ9Ykg/pv3q6pLQat1ay9p2pZQU3TFMBtOOsV8kA5N7ockGiK2y7RaQ/D/swMTwFqwxk3POdG9fIA6BzPOzOL5nnu0VUTcXbQ60S8zejCT5EtzRDvEGwOStmbf+U6n5Hj50BlJpgHyjuee1TKj0wZywAAAAd0SU1FB9wFCBAdN/+LuwgAAAAASUVORK5CYII=');
        protection_td.appendChild(protection_img);
    }

    return protection_td;
}


/*
 * Adds status information retrieved earlier and hacks it into a new row above the nav tiles.
 */
function prepend_status(nav_table)
{
    var tbody = firstEChild(nav_table);
    var first_row = tbody.childNodes[0];
    var status_tr_1 = my_document.createElement('tr');
    var status_tr_2 = my_document.createElement('tr');
    var spacer_tr = my_document.createElement('tr');
    var table;
    var sector_td = create_status_td();
    var coords_td = create_status_td();
    var aps_td = create_status_td();
    var res_td = create_status_td();
    var fuel_td = create_status_td();
    var protection_td = create_status_td();

    createMaxWidthSpacer(spacer_tr);

    addProtectionStatusImage(protection_td);

    // Complete the table data cells entry.
    sector_td.appendChild(sector);
    coords_td.appendChild(coords);
    aps_td.appendChild(ap_img);
    aps_td.appendChild(create_spacer_text());
    aps_td.appendChild(aps_left);
    res_td.appendChild(res_img);
    res_td.appendChild(create_spacer_text());
    res_td.appendChild(field_res);
    fuel_td.appendChild(fuel_img);
    fuel_td.appendChild(create_linebreak());
    fuel_td.appendChild(fuel);

    // Add all the TDs to the TRs.
    status_tr_1.appendChild(sector_td);
    status_tr_1.appendChild(coords_td);
    status_tr_1.appendChild(aps_td);
    status_tr_2.appendChild(res_td);
    status_tr_2.appendChild(fuel_td);
    status_tr_2.appendChild(protection_td);

    var status_table = create_status_table();
    status_tr_1.setAttribute("width", "100%");
    status_table.appendChild(status_tr_1);
    status_table.appendChild(status_tr_2);
    status_table.appendChild(spacer_tr);

    // Prepend desired elements. Include hack for different behaviour
    // with partial refreshes enabled.
    if (partial_refresh)
    {
        var previous_status_table = my_document.getElementById("produs_status_table");
        var nav = my_document.getElementById("nav");
        var navtransition = my_document.getElementById("navtransition");

        /* Remove any previously added information before adding more. */
        if    (previous_status_table)
        {
            previous_status_table.parentNode.removeChild(previous_status_table);
        }

        /* Add new status information. */
        status_table.id = "produs_status_table";
        nav.parentNode.id = "produs_nav_id";
        nav.style.top = "92px";
        navtransition.style.top = "92px";
        nav_table.parentNode.parentNode.insertBefore(status_table, nav_table.parentNode);
    }
    else
    {
        nav_table.parentNode.insertBefore(status_table, nav_table);
    }
}

function create_status_td()
{
    var td = my_document.createElement('td');
    td.setAttribute('align', 'center');
    td.setAttribute('width', '33.33%');
    return td;
}

/*
 * Creates a table to fill max width
 */
function create_status_table()
{
    var span_table = my_document.createElement('table');

    span_table.setAttribute('width', '100%');
    span_table.setAttribute('height', '64px');
    span_table.setAttribute('cellspacing', '0');
    span_table.setAttribute('cellpadding', '0');
    span_table.setAttribute('border', '0');

    return span_table;
}


/*
 * Creates a table inside the tr, which spans all of the nav columns, allowing cleaner layout.
 */
function create_max_colspan_table(tr)
{
    var spanning_td = my_document.createElement('td');
    var span_table = my_document.createElement('table');
    var span_tbody = my_document.createElement('tbody');

    span_table.setAttribute('width', '100%');
    spanning_td.setAttribute('colspan', nav_size_hor);

    span_table.appendChild(span_tbody);
    spanning_td.appendChild(span_table);
    tr.appendChild(spanning_td);

    return span_tbody;
}

/*
 * Fills out the row with a separator bar, to separate new areas from the nav tiles.
 */
function create_spacer(tr)
{
    var spacer_td = my_document.createElement('td');
    var spacer_text = my_document.createTextNode('\u00A0');

    spacer_td.setAttribute('style', 'background-image:url(' + img_dir + '/text7.png);background-repeat:repeat-x;');
    spacer_td.appendChild(spacer_text);

    tr.appendChild(spacer_td);
}


/*
 * Creates a line break.
 */
function create_linebreak()
{
    return my_document.createElement('BR');
}

/*
 * Used to separate images from text.
 */
function create_spacer_text()
{
    return my_document.createTextNode(" ");
}

function create_bordered_element(element_type)
{
    var el = my_document.createElement(element_type);
    el.style = "border: 1px solid rgba(200, 200, 200, 0.5);";
    return el;
}

/*
 * Attaches commands to the end of the the nav screen tiles.
 */
function append_commands(nav_table)
{
    var rows;
    var tbody = firstEChild(nav_table);
    var commands = new Array();
    var commands_tr = my_document.createElement('tr');
    var table;
    var commands_tr_1 = my_document.createElement('tr');
    var commands_tr_2 = my_document.createElement('tr');
    var commands_tr_3 = my_document.createElement('tr');
    var spacer_tr = my_document.createElement('tr');
    var context_td_1, building_td, ambush_td, harvest_td, dock_td, refuel_td, retreat_td, xwarp_td, view_ambush_td, clean_wh_td, mine_ore_td;

    createMaxWidthSpacer(spacer_tr);
    
    context_td_1 = create_bordered_element('td');

    if (starbase)
    {
        context_td_1.appendChild(starbase);
    }
    else if (planet)
    {
        context_td_1.appendChild(planet);
    }
    else if (building)
    {
        context_td_1.appendChild(building);
    }
    else if (my_building)
    {
        context_td_1.appendChild(my_building);
    }
    else if (exitsb)
    {
        context_td_1.appendChild(exitsb);
    }
    else if (warp)
    {
        context_td_1.appendChild(warp);
    }
    else if (xwarp)
    {
        context_td_1.appendChild(xwarp);
        xwarp_td = create_bordered_element('td');
        var warp_box = my_document.getElementById('xholebox');
        warp_box.firstChild.setAttribute('style', 'width:48px;height:48px;text-align:center;padding:12px 0;');
        warp_box.firstChild.firstChild.text = "?";
        xwarp_td.appendChild(warp_box);
    }
    else if (wreck)
    {
        context_td_1.appendChild(wreck);
    }
    else
    {
        var closed_wh = getImgSrcByPartName("wormholeseal_closed");

        if (closed_wh)
        {
            var new_element = create_bordered_element('img');
            new_element.setAttribute('height', '48');
            new_element.setAttribute('width', '48');
            new_element.setAttribute('src', closed_wh);
            context_td_1.appendChild(new_element);
        }
    }

    /* If we're on a nex hole, then ensure that we can select a destination. */
    if (xwarp_td)
    {
        commands.push(xwarp_td);
    }

    /* Add to the command array, there wont be something here if the PR callback is made without the page having changed. */
    if (context_td_1.childNodes.length > 0)
        commands.push(context_td_1);

    if (new_building)
    {
        building_td = create_bordered_element('td');
        building_td.appendChild(new_building);
        commands.push(building_td);
    }

    if (harvest)
    {
        harvest_td = create_bordered_element('td');
        harvest_td.appendChild(harvest);
        commands.push(harvest_td);
    }
    
    if (mine_ore)
    {
        mine_ore_td = create_bordered_element('td');
        mine_ore_td.appendChild(mine_ore);
        commands.push(mine_ore_td);
    }

    if (refuel)
    {
        refuel_td = create_bordered_element('td');
        refuel_td.appendChild(refuel);
        commands.push(refuel_td);
    }
    
    if (clean_wh)
    {
        clean_wh_td = create_bordered_element('td');
        clean_wh_td.appendChild(clean_wh);
        commands.push(clean_wh_td);
    }


    /* Add optional commands if they exist. */
    if (ambush)
    {
        ambush_td = create_bordered_element('td');
        ambush_td.appendChild(ambush);
        commands.push(ambush_td);
    }

    if (retreat)
    {
        retreat_td = create_bordered_element('td');
        retreat_td.appendChild(retreat);
        commands.push(retreat_td);
    }
    
    if (view_ambush)
    {
        view_ambush_td = create_bordered_element('td');
        view_ambush_td.appendChild(view_ambush);
        commands.push(view_ambush_td);
    }

    if (dock)
    {
        dock_td = create_bordered_element('td');
        dock_td.appendChild(dock);
        commands.push(dock_td);
    }

    // Make things a little bit tidier.
    tidy_td_arr(commands);

    // Add the new table entries.
    if (commands.length > 0)
    {
        var produs_commands_spacer = my_document.getElementById("produs_commands_spacer");
        if (produs_commands_spacer)
            produs_commands_spacer.parentNode.removeChild(produs_commands_spacer);
    }
            
    tbody.appendChild(spacer_tr);
    table = create_max_colspan_table(commands_tr);

    if (commands.length <= nav_size_hor)
    {
        rows = 1;
        add_one_row(commands, commands_tr_1);
        table.appendChild(commands_tr_1);
    }
    else if (commands.length >= (nav_size_hor * 2))
    {
        rows = 3;
        add_three_rows(commands, commands_tr_1, commands_tr_2, commands_tr_3);
        table.appendChild(commands_tr_1);
        table.appendChild(commands_tr_2);
        table.appendChild(commands_tr_3);
    }
    else
    {
        rows = 2;
        add_two_rows(commands, commands_tr_1, commands_tr_2);
        table.appendChild(commands_tr_1);
        table.appendChild(commands_tr_2);
    }

    /* Hacks for partial refresh. */
    if (partial_refresh && (commands.length > 0))
    {
        /* Remove existing tr before adding new content. */
        var produs_commands = my_document.getElementById("produs_commands");
        if (produs_commands)
            produs_commands.parentNode.removeChild(produs_commands);

        var produs_nav = my_document.getElementById("produs_nav_id");
        produs_nav.style.height = ((tile_res * nav_size_ver) + (rows * 50) + 115) + "px";
        produs_nav.style.backgroundImage = "";

        commands_tr.id = "produs_commands";
        spacer_tr.id = "produs_commands_spacer";
    }

    // Add the new table entries.    
    tbody.appendChild(commands_tr);
}

/*
 * Configures the tds to have a tidy layout for each nav screen size.
 */
function tidy_td_arr(tds)
{
    for(var i = 0; i < tds.length; i++)
    {
        tds[i].setAttribute('align', 'center');
        if (tds.length < nav_size_hor)
        {
            tds[i].setAttribute('width', (100 / tds.length) + "%");
        }
        else
        {
            tds[i].setAttribute('width', (100 / nav_size_hor) + "%");
        }
    }
}

/*
 * Just adds one tr below the nav tiles.
 */
function add_one_row(commands, tr1)
{
    for(var i = 0; i < commands.length; i++)
    {
        tr1.appendChild(commands[i]);
    }
}

/*
 * Splits commands into two trs below the nav tiles, we have too many
 * to fit in one row.
 */
function add_two_rows(commands, tr1, tr2)
{
    for(var i = 0; i < commands.length; i++)
    {
        if (i < nav_size_hor)
        {
            tr1.appendChild(commands[i]);
        }
        else
        {
            tr2.appendChild(commands[i]);
        }
    }
}

/*
 * Adds three rows, only needed when sitting on one's own building.
 */
function add_three_rows(commands, tr1, tr2, tr3)
{
    for( var i = 0; i < commands.length; i++)
    {
        if (i < nav_size_hor)
        {
            tr1.appendChild(commands[i]);
        }
        else if (i >= (nav_size_hor * 2))
        {
            tr3.appendChild(commands[i]);
        }
        else
        {
            tr2.appendChild(commands[i]);
        }
    }
}