misc/flags_js.xhtml
author alfadur
Wed, 27 Mar 2024 02:57:44 +0300
changeset 16002 e915ed28726e
parent 15978 20adaa127663
permissions -rw-r--r--
thread server reference through dispatch to ensure rooms can be auto dropped

<!DOCTYPE HTML>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<!-- There is, at present, no official xsd for (X)HTML5. A pity. Usefulness would depend on the parser and extensions made by the site.  -->
    <title>Hedgewars Flags</title>

    <style type="text/css">
* {padding: 0; margin: 0; }
body
{
    background-color: #0B203D;
    color: #FFD902;
    background-size: 100% 100%;
    font-family: sans-serif;
}
form, p
{
    background-color: #0B203D;
    padding: 1em;
    margin: 1em;
    border-style: solid;
    border-radius: 5px;
    border-width: 2px;
    border-color: #FFD902;
}
h1 {
    margin:10px;
}
a {
    color: #BFBED0;
    text-decoration: none;
}
.flag
{
    margin-top: 12px;
    margin-left: 20px;
    float: left;
    border-radius: 3px;
    border-color: white;
    border-width: 1px;
    border-style: solid;
    height: 17px;
    width: 24px;
    color: transparent;
}
a div
{
    height: 15px;
    width: 22px;
    border-radius: 3px;
    border-color: black;
    border-width: 1px;
    border-style: solid;
}
    </style>
    <script type="application/ecmascript">
//<![CDATA[
"use strict";
let IS_LOCAL=false; // set to true to fetch flags locally. Useful for testing.
let flags;
if (IS_LOCAL) {
/* JavaScript version of a sprite sheet - this could be pretty trivially done in pure HTML, but maintenance
would be easier with a server-side portion. list of sprites could be gotten from server, but would require XSS whitelisting */
// Last updated: 1.0.0
flags=["afghanistan","albania","algeria","american_samoa","andorra","angola","anguilla","antigua_and_barbuda","arabemirates",
"argentina","armenia","aruba","australia","austria","azerbaijan","bahamas","bahrain","bangladesh","barbados","belarus","belgium",
"belize","benin","bhutan","bolivia","bosnia_and_herzegovina","botswana","brazil","brunei","bulgaria","burkina_faso","burundi",
"cambodia","cameroon","canada","cape_verde","central_african_republic","chad","chile","china","christmas_island","cm_42",
"cm_anarchy","cm_balls","cm_balrog","cm_bars","cm_belarus","cm_binary","cm_birdy","cm_bloodyblade","cm_brittany","cm_bubbles",
"cm_bustamove","cm_cheese","cm_cog","cm_crossedswords","cm_crosshair","cm_cyborg","cm_danger_fire","cm_danger_stripes",
"cm_dragonrb","cm_duckhead","cm_earth2","cm_earth","cm_eyeofhorus","cm_eyes","cm_face","cm_fcw","cm_female","cm_firstaid",
"cm_flames","cm_flower","cm_galaxy","cm_girder","cm_grenade","cm_hax0r","cm_heart","cm_hellish","cm_hurrah","cm_hw2",
"cm_hw","cm_iluvu","cm_kiwi","cm_lips","cm_magicskull","cm_male","cm_mog","cm_music","cm_pacman2","cm_pacman","cm_pentagram",
"cm_piet","cm_pirate","cm_pokemon","cm_scout","cm_shoppa","cm_sine","cm_skull","cm_sonic","cm_soviet","cm_spider","cm_star",
"cm_swordshield2","cm_swordshield","cm_test","cm_vampire","cm_waves","cm_yinyang","colombia","comoros",
"congo-brazzaville","congo_kinshasa","cook_islands","costa_rica","cote_divoire","croatia","cuba","cyprus",
"czech_republic","denmark","djibouti","dominican_republic","dominica","easttimor","ecuador","egypt","el_salvador",
"equatorial_guinea","eritrea","esperanto","estonia","ethiopia","europeanunion","fiji","finland","france","gabon","gambia",
"georgia","germany","ghana","greece","grenada","guam","guatemala","guinea","guyana","haiti","hedgewars","honduras","hungary",
"iceland","india","indonesia","iran","iraq","ireland","israel","italy","jamaica","japan","jordan","kazakhstan","kenya","kiribati",
"kuwait","kyrgyzstan","laos","latvia","lebanon","lesotho","liberia","libya","liechtenstein","lithuania","luxembourg","macau",
"macedonia","madagascar","malawi","malaysia","maldives","mali","malta","marshall_islands","mauritania","mauritius",
"mexico","micronesia","moldova","monaco","mongolia","montenegro","montserrat","morocco","mozambique","myanmar","namibia","nauru",
"nepal","netherlands","new_zealand","nicaragua","nigeria","niger","niue","northern_mariana","northkorea","norway","oman",
"pakistan","palau","palestine","panama","papua_new_guinea","paraguay","peru","philippines","poland","portugal","puerto_rico",
"qatar","quebec","romania","russian_federation","rwanda","saint_kitts_and_nevis","saint_lucia","saint_vincent_and_the_grenadines",
"samoa","san_marino","saotomeandprincipe","saudiarabia","senegal","serbia_and_montenegro","serbia","seychelles","sicily",
"sierra_leone","singapore","slovakia","slovenia","solomon_islands","somalia","south_africa","south_korea","south_sudan","spain",
"sri_lanka","sudan","suisse","suriname","swaziland","sweden","syrian_arab_republic","taiwan","tajikistan","tanzania","thailand",
"tibet","timor_leste","togo","tokelau","tonga","trinidad_and_tobago","tunisia","turkey","turkmenistan","tuvalu","uganda","ukraine",
"uk_scotland","united_arab_emirates","united_kingdom","united_states","uruguay","uzbekistan","vanuatu","vatican","venezuela","vietnam",
"western_sahara","yemen","yugoslavia","zambia","zimbabwe"
//,"cpu","cpu_plain"
];
}
else
{
flags = [];
}

let on_xml_loaded = function(ex)
{
    let resp = this.responseText;
    let r = />([^<]*).png</g;
    let x;
    while(x = r.exec(resp))
    {
        flags.push(x[1]);
    }
    on_flags_loaded();
}

let on_xml_error = function()
{
    let p = document.createElement("p");
    p.appendChild(document.createTextNode("ERROR: List of flags could not be fetched from the server!"));
    document.body.appendChild(p);
}

let on_flags_loaded;

window.onload = function()
{
    // Load list of flags
    if (!IS_LOCAL) {
        // Request list of flags from repository URL
        let xml=new XMLHttpRequest();
        xml.open("GET", "//hg.hedgewars.org/hedgewars/file/tip/share/hedgewars/Data/Graphics/Flags/");
        xml.addEventListener("error", on_xml_error);
        xml.onload = on_xml_loaded;
        xml.send();
    }
    else
    {
        on_flags_loaded();
    }
}

on_flags_loaded = function()
{
    // Sort flags
    let flag_compare = function(a, b)
    {
        if (a === "hedgewars")
            return -1;
        else if (b === "hedgewars")
            return 1;
        else if (a.startsWith("cm_") && !b.startsWith("cm_"))
            return 1;
        else if (!a.startsWith("cm_") && b.startsWith("cm_"))
            return -1;
        else if (a > b)
            return 1;
        else if (a < b)
            return -1;
        else
            return 0;
    }

    flags.sort(flag_compare);

    // Render flags
    let img;
    let j = 0;
    let toDelete = [];
    let a = document.createElement("a");
    a.className="flag";
    a.appendChild(document.createElement("div"));
    a.lastChild.appendChild(document.createTextNode(""));

    let flagState = 0; // 0 = hedgewars, 1 = country flag, 2 = community flag ("cm_")

    for (let i=0;i<flags.length;i++)
    {
        let flag = flags[i];
        // Skip CPU flags
        if (flag === "cpu" || flag === "cpu_plain")
            continue;

        let oldFlagState = flagState;
        if (flagState === 0 && flag !== "hedgewars")
            flagState++;
        else if (flagState === 1 && flag.startsWith("cm_"))
            flagState++;
        if (flagState !== oldFlagState)
        {
            j = 0;
            document.body.appendChild(document.createElement("br"));
            document.body.appendChild(document.createElement("br"));
            document.body.appendChild(document.createElement("br"));
        }

        let h = document.body.appendChild(a.cloneNode(true));
        if (IS_LOCAL)
            h.href = "../share/hedgewars/Data/Graphics/Flags/"+flag+".png";
        else
            h.href = "//hg.hedgewars.org/hedgewars/raw-file/tip/share/hedgewars/Data/Graphics/Flags/"+flag+".png";

        img = new Image();
        img.onload = function() {
            let name = this.id.substr(7);
            if (this.height === 32) {
                staticMasks[name] = true;
            }
            this.remove();
        }
        img.src = h.href;
        img.id = "__flag_"+flag;

        h.lastChild.style.backgroundImage = 'url("'+h.href+'")';
        h.title = flag;

        if (j%17 === 16 || i === flags.length-1)
        {
            document.body.appendChild(document.createElement("br"));
            document.body.appendChild(document.createElement("br"));
            j = 0;
        } else
            j++;
    }

}

//]]>
    </script>
</head>
<body>
<h1>List of Hedgewars flags</h1>
<noscript>
<p><strong>ERROR</strong>: We're so sorry, but this webpage only works with JavaScript enabled. It seems JavaScript is disabled or not supported in your browser.<br/>
Normally, this webpage would display a preview of the flags in Hedgewars.</p>
</noscript>
</body>
</html>