User:Bluedeck/serve/easy-archive.js

From Meta, a Wikimedia project coordination wiki

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
// Author: Bluedeck <bluedeck@outlook.com>
// Licence: CC-BY-SA
// Currently English(US), Japanese(Japan), Chinese(China, Hong Kong, Taiwan) are the five supported languages of this tool.
// It will adapt the language of the interface to the best of its ability to the MediaWiki interface language and the user's browser interface.
// This tool can expand the spectrum of languages it supports easily. Please provide the interface translation of your language to the author and it will go online in no time.
// Your contributions will be listed below.
//
// contributors:
// Thanks to zh:User:Wong128hk for providing zh_hk interface translation
//
// strict mode where possible

if(!window.bluedeck)
{
    window.bluedeck = {};
}


if(!window.bluedeck.easy_archive) {

    window.bluedeck.easy_archive = {
        version: function(){return "2017.3.3";},
        iteration: function(){return "ab34";},
        build: function(){return parseInt(this.iteration().replace(/[^0-9]+/g, ""));},
        ver: function(){return this.version() + " / " + this.iteration();}
    };

    (function (easy) {

        "use strict";

        if(!("mw" in window))
            throw new Error("Easy Archive cannot function without mw object.");

        // minified code dependency functions
        var Pare_str = (function(){
            "use strict";

            function Pare_str(pare_string, config)
            {
                this.str = pare_string;
                this.left = "(";
                this.delim = ":";
                this.right = ")";

                if(typeof config !== "string")
                    config = String(config);

                if(pare_string.length > 6 && /[@#%][sS][eE][tT]/.test(pare_string.slice(0,4)) && config.indexOf("ignore-set") === -1)
                {
                    this.left = pare_string[4];
                    this.delim = pare_string[5];
                    this.right = pare_string[6];

                    if(this.left === this.right || this.left === this.delim || this.right == this.delim)
                    {
                        throw new SyntaxError("Pound set statement has repetitive characters. E.g. '#set|:|' is illegal.")
                    }
                }
            }

            Pare_str.prototype.find = function(lookup_key)
            {
                lookup_key = this.left + lookup_key + this.delim;

                if(this.str.indexOf(lookup_key) === -1)
                {
                    return null;
                }
                else
                {
                    return this.str.split(lookup_key)[1].split(this.right)[0];
                }
            };

            Pare_str.prototype.new = function(new_key, new_value) // will not check for existance
            {
                if (new_key.indexOf(this.left) !== -1 || new_key.indexOf(this.right) !== -1 || new_key.indexOf(this.delim) !== -1 ||
                    new_value.indexOf(this.left) !== -1 || new_value.indexOf(this.right) !== -1)
                {
                    throw new Error("Pare_str: Illegal key or value. Key mustn't have any bound or delimiter, value mustn't have any bound.");
                }

                this.str = this.left + new_key + this.delim + new_value + this.right + this.str;

                return this;
            };

            Pare_str.prototype.update = function(lookup_key, new_value) // will create if not exist
            {
                if(this.find(lookup_key) === null)
                {
                    this.new(lookup_key, new_value);
                }
                else
                {
                    var new_str = this.str.split(this.left + lookup_key + this.delim);
                    new_str[1] = new_str[1].split(this.right);
                    new_str[1][0] = new_value;
                    new_str[1] = new_str[1].join(this.right);
                    new_str = new_str.join(this.left + lookup_key + this.delim);
                    this.str = new_str;
                }

                return this;
            };

            function intep(celldata)
            {
                if(/^\$[fF]alse$/.test(celldata))
                    return false;
                else if(/^\$[tT]rue$/.test(celldata))
                    return true;
                else if(/^\$-?(0*|[1-9][0-9]*)(|.[0-9]+)(|[eE](|\+|-)[0-9]*)$/.test(celldata))
                    return parseFloat(celldata.slice(1));
                else if(/^\$[nN](ull|one|il)$/.test(celldata))
                    return null;
                else
                    return celldata;
            }

            Pare_str.prototype.intep = function(lookup_key)
            {
                return intep(this.find(lookup_key));
            };

            return Pare_str;

        })();

        // bluedeck common repo.
        var expose = (function(){

            var glb={
                url: mw.config.values.wgServer,
                p: mw.config.values.wgPageName,
                un: mw.config.values.wgUserName,
                u: "User:"+mw.config.values.wgUserName,
                ut: "User_talk:"+mw.config.values.wgUserName,
                t: null
            };

            glb.a=glb.url+"/w/api.php";

            loadTokenSilently();

            function ding(a, b) {}

            var eur=encodeURIComponent;

            function asyncGet(url, fn)
            {
                var a=new XMLHttpRequest();
                a.onreadystatechange=fn;
                a.open("GET",url,true);
                a.send(null);
            }

            function asyncPost(url, body, fn)
            {
                var z1="Content-Type";
                var z2="application/x-www-form-urlencoded";
                var a=new XMLHttpRequest();
                a.onreadystatechange=fn;
                a.open("POST",url,true);
                a.setRequestHeader(z1,z2);
                a.send(body);
            }

            function loadTokenSilently()
            {
                var f=function(){
                    if(this.readyState===4){
                        try {
                            glb.t=JSON.parse(this.responseText).query.tokens.csrftoken;
                        } catch (e) {
                            mw.log.warn( 'FIXME: CORS Missing Allow Origin');
                            //  Uncaught SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data
                        }
                    }
                };
                var z="action=query&meta=tokens&format=json";
                asyncPost(glb.a, z, f);
                setTimeout(loadTokenSilently, 1800000);
            }

            function takeToken()
            {
                if(glb.t)
                {
                    return glb.t;
                }
                else
                {
                    loadTokenSilently();
                    return false;
                }
            }

            function getPage(a, fn)		// a: pagename / fn: function for execution
            {
                // ding("Requesting page: "+a,1);
                var z="action=query&prop=revisions&rvprop=ids|flags|timestamp|user|userid|size|comment|tags|content&format=json&titles=";
                asyncPost(glb.a, z+eur(a), fn);
            }

            function getPageSection(a, b, fn)		// a: pagename / b: section id numeric / fn: function for execution
            {
                ding("Requesting page: "+a+" in section: "+b,1);
                var z="action=query&prop=revisions&rvprop=content&format=json&titles=";
                asyncPost(glb.a,z+eur(a)+"&rvsection="+eur(b),fn);
            }

            function pickPageContent(a)
            {
                if(typeof a==="string")
                {
                    var b=JSON.parse(a);
                    if(typeof b==="object")
                    {
                        for(var x in b.query.pages)
                        {
                            var c=b.query.pages[x];
                            return c.revisions[0]["*"];
                        }
                    }
                    else
                    {
                        return false;
                    }
                }
                else		// from now on pick functions will only work with string inputs. DO NOT parse pages before passing them into pick functions.
                {
                    return false;
                }
            }

            function tellPageExist(a)
            {
                try {a = JSON.parse(a);}catch(e){return false;}

                if(typeof a !== "object") return false;

                if(!("query" in a)) return false;

                if(!("pages" in a.query)) return false;

                if(-1 in a.query.pages) return false;

                return true;
            }

            function edit(a, b, c, d, f)
            {
                // ding("Requesting page edit for: "+a+" Summary: "+c,1);
                var fn = typeof f === "function" ? (function(){if(this.readyState===4){f();}}) : function(){if(this.readyState===4){ding("Following page edited: "+a+" Detail: "+this.responseText)}};		// from now on, f is definable.
                if(!d){d=takeToken();}
                var z="action=edit&format=json&title=";
                asyncPost(glb.a, z+eur(a)+"&text="+eur(b)+"&summary="+eur(c)+"&token="+eur(d), fn);
            }

            function editPro(a, b, c, d, e, f)
            {
                // ding("Requesting page edit for: "+a+" in section: "+b+" Summary: "+d,1);
                var fn = typeof f === "function" ? (function(){if(this.readyState===4){f();}}) : function(){if(this.readyState===4){ding("Following page edited: "+a+" Section: "+b+" Detail: "+this.responseText)}};
                var z="action=edit&format=json&title=";
                asyncPost(glb.a, z+eur(a)+"&section="+eur(b)+"&text="+eur(c)+"&summary="+eur(d)+"&token="+eur(e), fn);
            }

            function editAppend(a, b, c, d, fn)
            {
                var f = function()
                {
                    if(this.readyState===4)
                    {
                        var original_content;

                        if(tellPageExist(this.responseText) === false)
                            original_content = "";
                        else
                            original_content = pickPageContent(this.responseText);
                        edit(a, original_content+""+b, c, d, fn);
                    }
                };
                getPage(a,f);
            }

            function archive_section(page_name, section, to, callback, summary)
            {
                getPageSection(page_name, section, function()
                {
                    var doneness = 0;

                    function done()
                    {
                        doneness++;
                        if(doneness === 2)
                            callback();
                    }

                    if(this.readyState === 4)
                    {
                        editAppend(to, "\n\n"+pickPageContent(this.responseText), summary, takeToken(), done);
                        editPro(page_name, section.toString(), "", summary, takeToken(), done);
                    }
                });
            }

            function delete_section(page_name, section, callback, summary)
            {
                editPro(page_name, section.toString(), "", summary, takeToken(), callback);
            }

            return {
                a: archive_section,
                d: delete_section
            };

        })();

        // default settings:
        easy.settings_string =
            "#set%|?                                     \n" +
            "display section delete link   %sec-del|1?   \n" +
            "display section archive line  %sec-arc|1?   \n" +
            "display control bar at top    %top-bar|0?   \n" +
            "archive location              %arc-loc|?    \n" +
            "subsection effectiveness      %sub-sec|2?   \n" +
            "confirm action                %confirm|0?   \n" +
            "is this data initialized      %data-init|0? \n";
        easy.settings = new Pare_str(easy.settings_string);
        easy.my_user_talk = null;

        try
        {
            easy.never_enable_on_these_pages_regex = window.bluedeck.external_config.easy_archive.never_enable_on_these_pages_regex;
        }
        catch(e)
        {
            easy.never_enable_on_these_pages_regex = [];
        }

        easy.dis_support_these_pages_regex = [
            /^File:.*$/,
            /^MediaWiki:.*$/,
            /^Module:.*$/,
            /^Category:.*$/,
            /^Template:.*$/,
            /^Special:.*$/,
            /^User:.*\/?.*\.js$/,
            /^User:.*\/?.*\.css$/,
            /^User:.*\/?.*\.json$/
        ];

        var settings_span_collection = document.getElementsByClassName("bluedeck_easy_archive_data_point_collection");
        var settings_span = settings_span_collection[0];
        var settings = settings_span ? new Pare_str(settings_span.innerHTML) : new Pare_str("");
        if(settings.find("data-init") === "1")
        {
            easy.settings_string = settings_span.innerHTML;
            easy.settings = new Pare_str(easy.settings_string)
        }

        try
        {
            var settings_archive_link = settings.find("sec-arc").indexOf("1") !== -1;
            var settings_delete_link = settings.find("sec-del").indexOf("1") !== -1;
            var settings_control_bar = settings.find("top-bar").indexOf("1") !== -1;
            var settings_archive_location_general = settings.find("arc-loc");
            var settings_subsection_level = settings.find("sub-sec").indexOf("1") !== -1;
            var settings_confirm_needed = settings.find("confirm").indexOf("1") !== -1;
        }
        catch(e){}

        // language selection logic

        var raw_lang_code;

        if(mw.config.values.wgUserLanguage)
            raw_lang_code = mw.config.values.wgUserLanguage;

        if(!raw_lang_code)
            raw_lang_code = wgUserLanguage;

        if(!raw_lang_code)
            raw_lang_code = navigator.language;

        var lang_code_preparse = raw_lang_code.split("-").join("_").toLowerCase();
        var lang_code_pr = lang_code_preparse.slice(0,2);
        var lang_code;

        if(lang_code_preparse === "zh" || lang_code_preparse === "zh_sg" || lang_code_preparse === "zh_hans" ||
            lang_code_preparse === "zh_my" || lang_code_preparse === "zh_mo" || lang_code_preparse === "")
            lang_code = "zh_cn";
        else if(lang_code_preparse === "zh_hant" || lang_code_preparse === "yue" || lang_code_preparse === "lzh")
            lang_code = "zh_hk";
        else if(lang_code_pr === "en")  // redirect all English users to US variant.
            lang_code = "en_us";
        else if(lang_code_pr === "ja")
            lang_code = "ja_jp";
        else if(lang_code_pr === "fr")
            lang_code = "en_us";
        else if(lang_code_pr === "sv")
            lang_code = "en_us";
        else
            lang_code = lang_code_preparse;

        if(!(lang_code === "en_us" || lang_code === "ja_jp" || lang_code === "zh_cn" ||
            lang_code === "zh_hk" || lang_code === "zh_tw"))
        {
            lang_code = "en_us";
        }

        easy.lang_code = lang_code;

        // ... lang done

        // identify if Easy Archive can be used on the page - compatibility

        easy.on_user_talk = (mw.config.values.wgNamespaceNumber === 3);
        easy.my_user_talk = easy.on_user_talk && ((function () {
                var page_name = mw.config.values.wgPageName.split(":");
                page_name[0] = "";
                page_name = page_name.join("");
                page_name = page_name.split("/")[0];
                var user_name = mw.config.values.wgUserName;
                return (user_name.split("_").join("").split(" ").join("") === page_name.split("_").join("").split(" ").join(""));
            })());
        easy.has_template = (settings.find("data-init") === "1");
        easy.others_user_talk = (easy.my_user_talk === false && easy.on_user_talk === true);
        easy.on_article = (mw.config.values.wgNamespaceNumber === 0);
        easy.on_hist_version = (mw.config.values.wgCurRevisionId - mw.config.values.wgRevisionId !== 0);


        // this nested IEFE is unnecessary. but it doesn't hurt to keep the scope clean.

        (function(){
            "use strict";
            if(!easy.lang)
                easy.lang = {};
            easy.lang.delete = {
                en_us: "delete",
                ja_jp: "削除",
                zh_cn: "删除",
                zh_hk: "刪除",
                zh_tw: "刪除"
            };
            easy.lang.archive = {
                en_us: "archive",
                ja_jp: "アーカイブ",
                zh_cn: "存档",
                zh_hk: "存檔",
                zh_tw: "存檔"
            };
            easy.lang.supports = {
                en_us: "Easy Archive is enabled on this talk page",
                ja_jp: "この会話ページでは Easy Archive ツールが適用されています",
                zh_cn: "本讨论页面支持 Easy Archive 快速存档",
                zh_hk: "本頁支援 Easy Archive",
                zh_tw: "本頁支援 Easy Archive"
            };
            easy.lang.others_page = {
                en_us: "This page is other user's talk page. Easy Archive is disabled.",
                ja_jp: "この会話ページは他人の利用者会話ページです。なので Easy Archive が適用しません。",
                zh_cn: "本页面是他人的用户讨论页面,因此不支持 Easy Archive 快速存档。",
                zh_hk: "本頁為他人用戶討論頁面,故不支援 Easy Archive 快速存檔。",
                zh_tw: "本頁為他人用戶討論頁面,故不支援 Easy Archive 快速存檔。"
            };
            easy.lang.to_enable = {
                en_us: "This page is not using Easy Archive.",
                ja_jp: "このページで Easy Archive がオンにされていません。",
                zh_cn: "本页面没有启用 Easy Archive。",
                zh_hk: "本頁没有啟用 Easy Archive。",
                zh_tw: "本頁没有啟用 Easy Archive。"
            };
            easy.lang.enable_on_generic_page = {
                en_us: "<div>This page is not your user talk page. However Easy Archive still can be used if needed.</div><div>To enable it, add {{Easy Archive|to=[Archive location]}} to this page.</div>",
                ja_jp: "<div>このページはあなたの利用者会話ページではありませんが、必要であれば Easy Archive がここでも機能できます。</div><div>Easy Archive を使用するなら、テンプレート {{Easy Archive|to=アーカイブ先}} を書き添えてください。</div>",
                zh_cn: "<div>本页面不是您的用户讨论页面。不过,如果需要,本页面是可以使用 Easy Archive 的。</div><div>如果要在本页面使用 Easy Archive,请加入 {{Easy Archive|to=存档位置}}。</div>",
                zh_hk: "<div>本頁面不是您的用戶討論頁面。不過,如果需要,本頁面是可以使用 Easy Archive 的。</div><div>如果要在本頁面使用 Easy Archive,請加入 {{Easy Archive|to=存檔位置}}。</div>",
                zh_tw: "<div>本頁面不是您的用戶討論頁面。不過,如果需要,本頁面是可以使用 Easy Archive 的。</div><div>如果要在本頁面使用 Easy Archive,請加入 {{Easy Archive|to=存檔位置}}。</div>"
            };
            easy.lang.please_enable = {
                en_us: "<div>Add {{Easy Archive|to=[Archive location]}} to this page to start using Easy Archive.</div>",
                ja_jp: "<div>このページで、テンプレート {{Easy Archive|to=アーカイブ先}} を書き添えて Easy Archive をオンにしてください。</div>",
                zh_cn: "<div>请在本页面加入 {{Easy Archive|to=存档地址}} 来启用 Easy Archive。</div>",
                zh_hk: "<div>請在本頁加入 {{Easy Archive|to=存檔位置}} 來啟用 Easy Archive。</div>",
                zh_tw: "<div>請在本頁加入 {{Easy Archive|to=存檔位置}} 來啟用 Easy Archive。</div>"
            };
            easy.lang.please_enable_elaborate = {
                en_us: "<div>You have the Easy Archive functionality enabled but your talk page hasn't been configured yet. </div><div>To take advantage of Easy Archive, add {{Easy Archive|to=[Archive location]}} template to this page.</div>",
                ja_jp: "<div>Easy Archive はすでにインストールされていますが、この機能を利用するには、自分の利用者会話ページでテンプレートも必要です。</div><div>{{Easy Archive|to=アーカイブ先}} をこのページで書き添えて、Easy Archive の使用を開始しましょう。</div>",
                zh_cn: "<div>您的帐户已经支持 Easy Archive,但是,为了开始使用该功能,您还需要在自己的用户讨论页面上添加模板 {{Easy Archive|to=存档位置}}。</div>",
                zh_hk: "<div>您的帳戶已經支持 Easy Archive,但是,為了開始使用該功能,您還需要在自己的用戶討論頁面上添加模板 {{Easy Archive|to=存檔位置}}。</div>",
                zh_tw: "<div>您的帳戶已經支持 Easy Archive,但是,為了開始使用該功能,您還需要在自己的用戶討論頁面上添加模板 {{Easy Archive|to=存檔位置}}。</div>"
            };
            easy.lang.arc_all = {
                en_us: "Archive all topics",
                ja_jp: "全てアーカイブ",
                zh_cn: "存档全部讨论",
                zh_hk: "全部討論存檔",
                zh_tw: "全部討論存檔"
            };
            easy.lang.arc_old_percent = {
                en_us: "Archive oldest ${1}",
                ja_jp: "${1}をアーカイブ",
                zh_cn: "存档最旧${1}",
                zh_hk: "存檔最舊${1}",
                zh_tw: "存檔最舊${1}"
            };
            easy.lang.arc_old = {
                en_us: "Archive oldest ${1} topic${2}",  // ${2} = 's' if plural
                ja_jp: "${1}つをアーカイブ",
                zh_cn: "存档最旧${1}个",
                zh_hk: "存檔最舊${1}個",
                zh_tw: "存檔最舊${1}個"
            };
            easy.lang.arc_all_but = {
                en_us: "Archive all but ${1} topic${2}",  // ${2} = 's' if plural
                ja_jp: "${1}つを残す",
                zh_cn: "只留下${1}个最新",
                zh_hk: "只留最新${1}個",
                zh_tw: "只留最新${1}個"
            };
            easy.lang.settings = {
                en_us: "Preference",
                ja_jp: "設定",
                zh_cn: "设置",
                zh_hk: "設定",
                zh_tw: "設定"
            };
            easy.lang.stop_using = {
                en_us: "Turn off",
                ja_jp: "オフにする",
                zh_cn: "停用",
                zh_hk: "停用",
                zh_tw: "停用"
            };
            easy.lang.change = {
                en_us: "Change",
                ja_jp: "変更",
                zh_cn: "更改",
                zh_hk: "更改",
                zh_tw: "更改"
            };
            easy.lang.left_par_split = {
                en_us: " (",
                ja_jp: "(",
                zh_cn: "(",
                zh_hk: "(",
                zh_tw: "("
            };
            easy.lang.right_par = {
                en_us: ")",
                ja_jp: ")",
                zh_cn: ")",
                zh_hk: ")",
                zh_tw: ")"
            };
            easy.lang.full_stop_split = {
                en_us: ". ",
                ja_jp: "。",
                zh_cn: "。",
                zh_hk: "。",
                zh_tw: "。"
            };
            easy.lang.archive_path_colon_split = {
                en_us: "Archive location: ",
                ja_jp: "アーカイブ先:",
                zh_cn: "存档地址:",
                zh_hk: "存檔至:",
                zh_tw: "存檔至:"
            };
            easy.lang.warning_stop_using = {
                en_us: "<div>Once Easy Archive is turned off, and you want it back on, you'll have to turn it on manually.</div><div>Do you want to turn it off? <div style='height:0.5em'></div><button onclick='window.bluedeck.easy_archive.turn_off(1)'>Yes</button><button onclick='window.bluedeck.easy_archive.elaborate_notice(3163);'>No</button></div>",
                ja_jp: "<div>Easy Archive をオフにしたら、戻ってオンにしたい時、手動でする必要があります。</div><div>Easy Archive をオフにしますか?<div style='height:0.5em'></div><button onclick='window.bluedeck.easy_archive.turn_off(1)'>はい</button><button onclick='window.bluedeck.easy_archive.elaborate_notice(3163);'>いいえ</button></div>",
                zh_cn: "<div>停用 Easy Archive 后,如要再次启用,只能手工操作。</div><div>要现在停用 Easy Archive 吗?<div style='height:0.5em'></div><button onclick='window.bluedeck.easy_archive.turn_off(1)'>是</button><button onclick='window.bluedeck.easy_archive.elaborate_notice(3163);'>否</button></div>",
                zh_hk: "<div>停用 Easy Archive 後,如要再次啟用,則必須手動重啟。</div><div>要現在停用 Easy Archive 嗎?<div style='height:0.5em'></div><button onclick='window.bluedeck.easy_archive.turn_off(1)'>是</button><button onclick='window.bluedeck.easy_archive.elaborate_notice(3163);'>否</button></div>",
                zh_tw: "<div>停用 Easy Archive 後,如要再次啟用,則必須手動重啟。</div><div>要現在停用 Easy Archive 嗎?<div style='height:0.5em'></div><button onclick='window.bluedeck.easy_archive.turn_off(1)'>是</button><button onclick='window.bluedeck.easy_archive.elaborate_notice(3163);'>否</button></div>"
            };
            easy.lang.stop_manually = {
                en_us: "<div>Cannot turn off Easy Archive automatically. </div><div>To manually discontinue use, delete the template {{Easy Archive|to=[Archive location]}} from this page.</div>",
                ja_jp: "<div>Easy Archive を自動的にオフにできませんでした。</div><div>Easy Archive を手動でオフにするなら、このページからテンプレート {{Easy Archive|to=アーカイブ先}} を削除してください。</div>",
                zh_cn: "<div>经过尝试,无法自动停用 Easy Archive。请手动停用。</div><div>请从本页面删除如下模版:{{Easy Archive|to=存档位置}}。</div>",
                zh_hk: "<div>經過嘗試,恕無法自動停用 Easy Archive。請手動停用。</div><div>請從本頁刪除以下模板︰{{Easy Archive|to=存檔位置}}。</div>",
                zh_tw: "<div>經過嘗試,恕無法自動停用 Easy Archive。請手動停用。</div><div>請從本頁刪除以下模板︰{{Easy Archive|to=存檔位置}}。</div>"
            };
            easy.lang.change_location_to = {
                en_us: "<div>Change archive location to: <input type='text'/></div>",
                ja_jp: "<div>アーカイブ先を変更:<input type='text'/></div>",
                zh_cn: "<div>将存档地址更改为:<input type='text'/></div>",
                zh_hk: "<div>将存檔地址更改为:<input type='text'/></div>",
                zh_tw: "<div>将存檔地址更改为:<input type='text'/></div>"
            };
            easy.lang.change_manually = {
                en_us: "<div>Cannot update Easy Archive location automatically. </div><div>To update manually, find the template {{Easy Archive|to=[Archive location]}} and update the location.</div>",
                ja_jp: "<div>アーカイブ先が自動的に変更できませんでした。</div><div>手動で変更するなら、このページでテンプレート {{Easy Archive|to=アーカイブ先}} を探し、アーカイブ先を取って替えてください。</div>",
                zh_cn: "<div>无法自动更改 Easy Archive 存档地址。请手动更改。</div><div>请在本页面找到如下模版:{{Easy Archive|to=存档位置}},并更改存档位置。</div>",
                zh_hk: "<div>恕無法自動更改 Easy Archive 存檔地址。請手動更改。</div><div>請在本頁找到以下模板︰{{Easy Archive|to=存檔位置}},并更改存檔位置。</div>",
                zh_tw: "<div>恕無法自動更改 Easy Archive 存檔地址。請手動更改。</div><div>請在本頁找到以下模板︰{{Easy Archive|to=存檔位置}},并更改存檔位置。</div>"
            };
            easy.lang.loading_section_i = {
                en_us: "<div>Loading section ${1}</div>",
                ja_jp: "<div>セクション ${1} を読み込んでいます</div>",
                zh_cn: "<div>正在读取第 ${1} 节的内容</div>",
                zh_hk: "<div>正在讀取第 ${1} 節的內容</div>",
                zh_tw: "<div>正在讀取第 ${1} 節的內容</div>"
            };
            easy.lang.deleting_section_i = {
                en_us: "<div>Deleting section ${1}</div>",
                ja_jp: "<div>セクション ${1} を削除しています</div>",
                zh_cn: "<div>正在删除第 ${1} 节的内容</div>",
                zh_hk: "<div>正在刪除第 ${1} 節的內容</div>",
                zh_tw: "<div>正在刪除第 ${1} 節的內容</div>"
            };
            easy.lang.done_section_i = {
                en_us: "<div>Section ${1} has been archived to ${2}</div>",
                ja_jp: "<div>セクション ${1} が ${2} にアーカイブされました</div>",
                zh_cn: "<div>已经将第 ${1} 节存档到 ${2}</div>",
                zh_hk: "<div>已經將第 ${1} 節存檔到 ${2}</div>",
                zh_tw: "<div>已經將第 ${1} 節存檔到 ${2}</div>"
            };
            easy.lang.done_deleting_section_i = {
                en_us: "<div>Section ${1} has been deleted</div>",
                ja_jp: "<div>セクション ${1} が削除されました</div>",
                zh_cn: "<div>已经将第 ${1} 节删除</div>",
                zh_hk: "<div>已經將第 ${1} 節刪除</div>",
                zh_tw: "<div>已經將第 ${1} 節刪除</div>"
            };
            easy.lang.being_archived = {
                en_us: "being archived",
                ja_jp: "アーカイブされています",
                zh_cn: "存档中",
                zh_hk: "存檔中",
                zh_tw: "存檔中"
            };
            easy.lang.being_deleted = {
                en_us: "being deleted",
                ja_jp: "削除されています",
                zh_cn: "删除中",
                zh_hk: "刪除中",
                zh_tw: "刪除中"
            };
            easy.lang.already_archived = {
                en_us: "archived",
                ja_jp: "すでにアーカイブされました",
                zh_cn: "已存档",
                zh_hk: "已存檔",
                zh_tw: "已存檔"
            };
            easy.lang.already_deleted = {
                en_us: "deleted",
                ja_jp: "すでに削除されました",
                zh_cn: "已删除",
                zh_hk: "已刪除",
                zh_tw: "已刪除"
            };
            easy.lang.others_talk_elaborate = {
                en_us: "This page is another user's talk page. You cannot archive the topics on this page for him/her",
                ja_jp: "この会話ページは他人の利用者会話ページです。Easy Archive によって他人の代わりにアーカイブできません。",
                zh_cn: "这是另一名用户的讨论页面,您不能代替另一名用户存档。",
                zh_hk: "這是另一名用戶的討論頁面,您不能代替另一名用戶存檔。",
                zh_tw: "這是另一名用戶的討論頁面,您不能代替另一名用戶存檔。"
            };
            easy.lang.page_not_supported = {
                en_us: "This page is not supported by Easy Archive.",
                ja_jp: "このページが Easy Archive にサポートされていません。",
                zh_cn: "本页面不支持 Easy Archive。",
                zh_hk: "本頁面不支持 Easy Archive。",
                zh_tw: "本頁面不支持 Easy Archive。"
            };
            easy.lang.page_not_supported_elaborate = {
                en_us: "<div>These pages are not supported by Easy Archive: </div><div>File, Template, Module, MediaWiki, Category, Special, JavaScript, CSS, JSON.</div>",
                ja_jp: "<div>これらのページが Easy Archive にサポートされません:</div><div>File、Template、Module、MediaWiki、Category、Special、JavaScript、CSS、JSON。</div>",
                zh_cn: "<div>这些页面不受 Easy Archive 支持:</div><div>File、Template、Module、MediaWiki、Category、Special、JavaScript、CSS、JSON。</div>",
                zh_hk: "<div>這些頁面不受 Easy Archive 支持:</div><div>File、Template、Module、MediaWiki、Category、Special、JavaScript、CSS、JSON。</div>",
                zh_tw: "<div>這些頁面不受 Easy Archive 支持:</div><div>File、Template、Module、MediaWiki、Category、Special、JavaScript、CSS、JSON。</div>"
            };
            easy.lang.cancelled = {
                en_us: "<div>Cancelled</div>",
                ja_jp: "<div>キャンセルしました</div>",
                zh_cn: "<div>已取消</div>",
                zh_hk: "<div>已取消</div>",
                zh_tw: "<div>已取消</div>"
            };
            easy.lang.clickable_questionmark_split_before = {
                en_us: " (<a href='${1}'>?</a>)",
                ja_jp: "(<a href='${1}'>?</a>)",
                zh_cn: "(<a href='${1}'>?</a>)",
                zh_hk: "(<a href='${1}'>?</a>)",
                zh_tw: "(<a href='${1}'>?</a>)"
            };
            easy.lang.problem_with_archive_location_main_space = {
                en_us: "<div>Currently the archive location of this page, \"${1}\", is under the article namespace, where archives should not be normally directed to. </div><div>Please check if you have the correct archive location.</div>",
                ja_jp: "<div>今のところ、このページのアーカイブ先は「${1}」であり、記事名前空間にあります。</div><div>通常は記事名前空間にアーカイブするべきではないので、アーカイブ先が正しいかどうか、チェックしてください。</div>",
                zh_cn: "<div>本页面目前的存档地址是“${1}”,在条目名称空间之下。</div><div>一般而言不应向条目名称空间进行存档,请检查存档地址。</div>",
                zh_hk: "<div>本頁面當前的存檔地址是「${1}」,在條目名稱空間之下。</div><div>一般而言不應向條目名稱空間進行存檔,請檢查存檔地址。</div>",
                zh_tw: "<div>本頁面當前的存檔地址是「${1}」,在條目名稱空間之下。</div><div>一般而言不應向條目名稱空間進行存檔,請檢查存檔地址。</div>"
            };
            easy.lang.problem_with_archive_location_same_page = {
                en_us: "<div>Currently the archive location of this page, \"${1}\", is this page itself, Easy archive cannot operate like this. </div>",
                ja_jp: "<div>今のところ、このページのアーカイブ先は「${1}」であり、このページ自身です。Easy Archive はこのまま働けません。</div>",
                zh_cn: "<div>本页面目前的存档地址是“${1}”,和本页面名称相同。Easy Archive 无法按此地址存档。</div>",
                zh_hk: "<div>本頁面當前的存檔地址是「${1}」,和本頁面名稱相同。Easy Archive 無法按此地址存檔。</div>",
                zh_tw: "<div>本頁面當前的存檔地址是「${1}」,和本頁面名稱相同。Easy Archive 無法按此地址存檔。</div>"
            };
            easy.lang.archive_summary = {
                en_us: "archive section",
                ja_jp: "セクションをアーカイブ",
                zh_cn: "存档段落",
                zh_hk: "存檔段落",
                zh_tw: "存檔段落"
            };
            easy.lang.delete_summary = {
                en_us: "delete section",
                ja_jp: "セクションを削除",
                zh_cn: "删除段落",
                zh_hk: "刪除段落",
                zh_tw: "刪除段落"
            };

        })();

        (function(){

            function sanitize_html(string)
            {
                return string.split("&").join("&amp;").split("<").join("&lt;");
            }

            // multi language selector definition

            var ml = function (tag, para_list, lang_code) // multi-lang
            {
                "use strict";

                if(window.bluedeck.language_code_overwrite)
                {
                    lang_code = window.bluedeck.language_code_overwrite;
                }

                if(!lang_code)
                    lang_code = easy.lang_code;
                if(!para_list)
                    para_list = [];

                try
                {
                    var lang_content = easy.lang[tag][lang_code];

                    for(var has_unfulfilled_para = true, i=0; has_unfulfilled_para; i++)
                    {
                        var search = "${" + (i+1) + "}";
                        if(lang_content.indexOf(search) === -1)
                            has_unfulfilled_para = false;
                        else
                        {
                            if(para_list[i])
                                lang_content = lang_content.split(search).join(para_list[i]);
                            else
                                lang_content = lang_content.split(search).join("");
                        }
                    }

                    return lang_content;
                }
                catch(e)
                {
                    return "(!) undefined language content";
                }
            };

            function actual_section(nominal_section_number)
            {
                var less = 0;
                for(var i=0; i<nominal_section_number; i++)
                {
                    if(nominal_sections[i] === true)
                    {
                        less++;
                    }
                }
                return nominal_section_number - less;
            }

            // ... interface done

            // archiving logic injection

            function report_doneness_ui(section_number, doneness_type, to, ongoing_or_done)
            {
                var tag_ding, tag_section, ding_type, ding_ttl;

                if(ongoing_or_done === "ongoing")
                {
                    ding_type = "info";
                    ding_ttl = "long";
                    if(doneness_type === "delete")
                    {
                        tag_ding = "deleting_section_i";
                        tag_section = "being_deleted";
                    }
                    else if(doneness_type === "archive")
                    {
                        tag_ding = "loading_section_i";
                        tag_section = "being_archived";
                    }
                }
                else if(ongoing_or_done === "done")
                {
                    ding_type = "success";
                    ding_ttl = false;
                    if(doneness_type === "delete")
                    {
                        tag_ding = "done_deleting_section_i";
                        tag_section = "already_deleted";
                    }
                    else if(doneness_type === "archive")
                    {
                        tag_ding = "done_section_i";
                        tag_section = "already_archived";
                    }
                }
                ding(ml(tag_ding, [section_number.toString(), to]), ding_type, ding_ttl, false, false);
                var node = document.getElementsByClassName("bluedeck-easy-archive-section-id-span-order-" + section_number)[0];
                var pnode = node.parentNode;
                for(var i=1; i<pnode.childNodes.length-2; i++)
                {
                    pnode.childNodes[i].style.display = "none";
                }
                node.innerHTML = ml(tag_section);
                node.style.display = "inline";
                node.style.color = "rgba(0,0,0,0.5)";
            }

            easy.delete_section = function (section_number, nominal)
            {
                var actual_section_number = actual_section(section_number);
                report_doneness_ui(nominal, "delete", "", "ongoing");
                expose.d(mw.config.values.wgPageName, actual_section_number, function(){
                    report_doneness_ui(nominal, "delete", "", "done");
                    nominal_sections[section_number] = true;
                }, ml("delete_summary"));
            };

            easy.archive_section = function(section_number, nominal)
            {
                var actual_section_number = actual_section(section_number);
                var to = easy.settings.find("arc-loc");
                report_doneness_ui(nominal, "archive", to, "ongoing");
                expose.a(mw.config.values.wgPageName, actual_section_number, to, function(){
                    report_doneness_ui(nominal, "archive", to, "done");
                    nominal_sections[section_number] = true;
                }, ml("archive_summary"));
            };

            easy.archive_sections = function (starting_section_number, count) {

                if(starting_section_number < 1)
                    return;  // cannot allow section 0 archiving. much less anything negative.

                for(var i=starting_section_number; i<(count+starting_section_number); i++)
                {
                    easy.ding(ml("loading_section_i", [i]), "info");
                }
                setTimeout(function(){easy.ding(ml("done_section_i", [starting_section_number, sanitize_html(settings.find("arc-loc"))]), "success");},1000);
            };

            easy.mass_archive_all = function() {easy.mass_archive_percentage(1);};
            easy.mass_archive_percentage = function(percentage) {easy.mass_archive_oldest(Math.ceil((easy.section_count) * percentage));};
            easy.mass_archive_leave_latest = function(amount_to_leave_behind) {easy.mass_archive_oldest(easy.section_count - amount_to_leave_behind);};

            easy.mass_archive_oldest = function(amount_to_archive)
            {
                if(amount_to_archive > easy.section_count)
                    amount_to_archive = easy.section_count;
                else if(amount_to_archive < 0)
                    amount_to_archive = 0;

                easy.archive_sections(1, amount_to_archive);
            };

            easy.turn_off = function(stage)
            {
                "use strict";
                if(stage === 0)
                    easy.elaborate_notice(227);
                else if(stage === 1)
                    easy.elaborate_notice(27);
            };

            easy.change_location = function(para)
            {
                "use strict";
                if(para === 0)
                    easy.elaborate_notice(395);
                else
                    easy.elaborate_notice(37);
            };

            easy.elaborate_notice = function(notice_tag_acronym)
            {
                // acronym scheme: refer to qwerty keyboard layout. (p=9)

                var notice_tag_dictionary = {
                    27:   ["stop_manually", "warning"],
                    37:   ["change_manually", "warning"],
                    227:  ["warning_stop_using", "warning", "long", false, true],
                    395:  ["change_location_to", "info", "long", false, true],
                    933:  ["please_enable_elaborate"],
                    953:  ["others_talk_elaborate"],
                    3163: ["cancelled", "warning", 1000],
                    3959: ["enable_on_generic_page"],
                    9219: ["problem_with_archive_location_main_space", "warning", "long", false, false, [sanitize_html(easy.settings.find("arc-loc"))]],
                    9220: ["problem_with_archive_location_same_page", "warning", "long", false, false, [sanitize_html(easy.settings.find("arc-loc"))]],
                    9623: ["page_not_supported_elaborate"]
                };

                var notice_set = notice_tag_dictionary[notice_tag_acronym] ? notice_tag_dictionary[notice_tag_acronym] : false;

                if(notice_set !== false)
                {
                    var ntag = notice_set[0];
                    var ntype = notice_set[1];
                    var nttl = notice_set[2] ? notice_set[2] : 9000;
                    var nhist = notice_set[3];
                    var npersist = notice_set[4];
                    var nsubst = notice_set[5];
                    easy.ding(ml(ntag, nsubst), ntype, nttl, nhist, npersist);
                }
            };

            // ding and its prerequisites.

            if(!document.getElementById("bluedeck_ding"))
            {
                document.getElementsByTagName("body")[0].insertAdjacentHTML("afterbegin", "<style>#bluedeck_ding button{margin: 0 0.2em; background:transparent; border:0.2em solid white; border-radius: 9em; padding: 0 0.7em; box-sizing: border-box; color: inherit; font-weight: inherit;}#bluedeck_ding button:active{background:rgba(255,255,255,0.6)}</style>");
                document.getElementsByTagName("body")[0].insertAdjacentHTML("afterbegin", "<div id='bluedeck_ding'></div>");
            }

            if(!document.getElementById("bluedeck_ding_history"))
            {
                document.getElementsByTagName("body")[0].insertAdjacentHTML("afterbegin", "<div id='bluedeck_ding_history'></div>");
            }

            easy.ding = function(message, type, ttl, history, persist)  // default type="info", ttl=3500, history=true, persist = false.
            {
                if(!type)
                    type = "info";

                if(typeof ttl === "number" && ttl < 1)
                    ttl = 1;

                if(!ttl)
                    ttl = 3500;

                if(ttl === "long")
                    ttl = "long";

                if(!history)
                    history = true;

                if(!persist)
                    persist = false;

                var ding_ele = document.getElementById("bluedeck_ding");
                var ding_hist_ele = document.getElementById("bluedeck_ding_history");

                if(ding_ele.lastChild)
                {
                    var previous_ding = ding_ele.lastChild;
                    previous_ding.style.transform = "translateY(-130%)";
                    setTimeout(function(){previous_ding.remove();}, 500);
                }

                if(message === false || message === null || message === 0 || typeof message === "undefined")
                    return;

                var color_sets = {
                    warning:   {text: "rgba(255, 255, 255, 1)", background: "rgba(221, 51,  51,  1)"},
                    info:      {text: "rgba(255, 255, 255, 1)", background: "rgba(51,  102, 204, 1)"},
                    success:   {text: "rgba(255, 255, 255, 1)", background: "rgba(0,   175, 137, 1)"},
                    confusion: {text: "rgba(0,   0,   0,   1)", background: "rgba(234, 236, 240, 1)"},
                    default:   {text: "rgba(0,   0,   0,   1)", background: "rgba(234, 236, 240, 1)"}
                };

                if(!color_sets[type])
                    type = "confusion";

                var retractant = persist ? "" : "onclick='this.style.transform = \"translateY(-130%)\";setTimeout(function(){this.remove()}.bind(this), 500);' ";

                ding_ele.insertAdjacentHTML("beforeend",
                    "<div " +
                    retractant +
                    "style='" +
                    "position:fixed; top:0; left:0; right:0; margin: 0 0 auto 0; height: auto; line-height: 1.4em; " +
                    "padding: 0.6em 2em; opacity: 1; text-align: center; z-index: 9999; font-size: 86%; box-shadow: 0 2px 5px rgba(0,0,0,0.2); " +
                    "font-weight: bold; transform: translateY(-130%); transition: all 0.2s;" +
                    "background: " + color_sets[type].background + "; color:" + color_sets[type].text + "; ' " +
                    ">" +
                    message +
                    "</div>"
                );

                var notice_ele = ding_ele.lastChild;

                setTimeout(function(){notice_ele.style.transform = "translateY(0%)";}, 10);
                if(ttl !== "long")
                {
                    setTimeout(function(){notice_ele.style.transform = "translateY(-130%)";}, ttl + 10);
                    setTimeout(function(){notice_ele.remove();}, ttl + 510);
                }

            };

            var ding = easy.ding;


            // real deal here
            // interface injection - prepare

            var i = 0, for_loop_sentinel, j = 0, escape_counter, ele, element_for_manipulation, nominal, actual;
            var editSectionCollection = document.getElementsByClassName("mw-editsection");
            var pipe_html = '<span style="margin:0 0.2em; opacity:0.7">|</span>';
            var section_delete_interface_inhibit = easy.settings.find("sec-del") === "0" || easy.settings.find("data-init") === "0";
            var section_archive_interface_inhibit = easy.settings.find("sec-arc") === "0" || easy.settings.find("data-init") === "0";
            var page_top_control_bar_inhibit = easy.settings.find("top-bar") === "0";
            var section_delete_interface_html;
            var section_archive_interface_html;
            var section_id_span_html = '<span class="bluedeck-easy-archive-section-id-span bluedeck-easy-archive-section-id-span-order-@@" style="display: none;">section</span>';

            var footer_info_ele, position_of_insertion;
            if(document.getElementById("footer-info"))
            {
                footer_info_ele = document.getElementById("footer-info");
                position_of_insertion = "afterbegin";
            }
            else
            {
                footer_info_ele = {insertAdjacentHTML: function(){}};
                position_of_insertion = "";
            }

            // ... interface injection - logic

            if(easy.on_article || easy.on_hist_version)
            {
                // insert no interface on an article page or a history version.
            }
            else if((function(black_list){
                    for(var i=0; i<black_list.length; i++)
                    {
                        if(black_list[i].test(mw.config.values.wgPageName))
                            return true;
                    }
                    return false;
                })(easy.never_enable_on_these_pages_regex))
            {
                // insert no interface if the page name is blacklisted.
            }
            else if((function(black_list){
                    for(var i=0; i<black_list.length; i++)
                    {
                        if(black_list[i].test(mw.config.values.wgPageName))
                            return true;
                    }
                    return false;
                })(easy.dis_support_these_pages_regex))
            {
                // insert not supported notice if the page name indicates that it is not supported.

                footer_info_ele.insertAdjacentHTML(position_of_insertion, "<li id='bluedeck_easy_archive_enable_notice'><a style='color:inherit' href='javascript:window.bluedeck.easy_archive.elaborate_notice(9623)'>" + ml("page_not_supported") + "</a></li>");
            }
            else if(mw.config.values.wgPageName === easy.settings.find("arc-loc"))
            {
                easy.elaborate_notice(9220);
            }
            else if(easy.has_template && !easy.others_user_talk)
            {
                // any page that has template that's not others' talk page. function normally.

                // !! the archive location in main space and needs attention !!
                if(/.+:.+/.test(easy.settings.find("arc-loc")) !== true)
                {
                    easy.elaborate_notice(9219);
                }

                for (i = 0; i < editSectionCollection.length; i++) {
                    ele = editSectionCollection[i];

                    if ((ele.parentNode.tagName === "H2" || ele.parentNode.tagName === "h2") && decodeURIComponent(ele.childNodes[1].href.split(/[?&]title=/)[1].split("&")[0]) === mw.config.values.wgPageName)
                    {

                        actual = parseInt(ele.childNodes[1].href.split(/[&?]section=/)[1].split("&")[0]);
                        nominal = i - j + 1;

                        section_delete_interface_html = section_delete_interface_inhibit ? "" : pipe_html +
                            '<a href="javascript:window.bluedeck.easy_archive.delete_section(' + actual + ', ' + nominal + ')">' + ml("delete") + '</a>';
                        section_archive_interface_html = section_archive_interface_inhibit ? "" : pipe_html +
                            '<a href="javascript:window.bluedeck.easy_archive.archive_section(' + actual + ', ' + nominal + ')">' + ml("archive") + '</a>';

                        ele.childNodes[1].insertAdjacentHTML("afterend",
                            section_delete_interface_html + section_archive_interface_html + section_id_span_html.replace("@@", nominal.toString()));
                    }
                    else {
                        j++;
                    }
                }

                easy.section_count = i - j + 1;

                footer_info_ele.insertAdjacentHTML(position_of_insertion,
                    "<li>" + ml("supports") + ml("left_par_split") +
                    //     "<a href='javascript:window.bluedeck.easy_archive.mass_archive_all()'>" + ml("arc_all") + "</a>" + pipe_html +
                    //     "<a href='javascript:window.bluedeck.easy_archive.mass_archive_percentage(0.5)'>" + ml("arc_old_percent", ["50%"]) + "</a>" + pipe_html +
                    //     "<a href='javascript:window.bluedeck.easy_archive.mass_archive_oldest(5)'>" + ml("arc_old", ["5", "s"]) + "</a>" + pipe_html +
                    //     "<a href='javascript:window.bluedeck.easy_archive.mass_archive_leave_latest(5)'>" + ml("arc_all_but", ["5", "s"]) + "</a>" + pipe_html +
                    //     "<a href='javascript:window.bluedeck.easy_archive.turn_to_settings()'>" + ml("settings") + "</a>" + pipe_html +
                    "<a href='javascript:window.bluedeck.easy_archive.turn_off(0)'>" + ml("stop_using") + "</a>"+
                    ml("right_par") + ml("full_stop_split") + "</li>" +
                    "<li>"+ ml("archive_path_colon_split") +"<a href='/wiki/" + sanitize_html(easy.settings.find("arc-loc")) + "'" + ">" + sanitize_html(easy.settings.find("arc-loc"))
                    //     + "</a>(<a href='javascript:window.bluedeck.easy_archive.change_location(0)'>" + ml("change") + "</a>)"
                );

            }
            else if(easy.others_user_talk === true)
            {
                // others user talk.

                footer_info_ele.insertAdjacentHTML(position_of_insertion, "<li id='bluedeck_easy_archive_enable_notice'><a style='color:inherit' href='javascript:window.bluedeck.easy_archive.elaborate_notice(953)'>" + ml("others_page") + "</a></li>");
            }
            else if(easy.my_user_talk === false)
            {
                // a generic page that did not enable easy archive.

                footer_info_ele.insertAdjacentHTML(position_of_insertion, "<li id='bluedeck_easy_archive_enable_notice'><a style='color:inherit' href='javascript:window.bluedeck.easy_archive.elaborate_notice(3959)'>" + ml("to_enable") + "</a></li>");
            }
            else // then assert: (easy.my_user_talk === true), (easy.has_template === false).
            {
                // my user talk -- installed easy archive but lacking template.

                footer_info_ele.insertAdjacentHTML(position_of_insertion, "<li id='bluedeck_easy_archive_enable_notice'><a style='color:inherit' href='javascript:window.bluedeck.easy_archive.elaborate_notice(933)'>" + ml("please_enable") + "</a></li>");
            }

            var nominal_sections = (function(count){
                var arr = new Array(count);
                for(var i=0; i<count; i++)
                {
                    arr[i] = false;
                }
                return arr;
            })(easy.section_count);

            var queue = [];

        })();

    })(window.bluedeck.easy_archive);
}