MediaWiki:MarcEditorDynamicLinks.js: mudanças entre as edições

De Wikincat
Ir para navegação Ir para pesquisar
(fix link)
(replace jquery)
Linha 1: Linha 1:
// Author: @vitorsilverio
// Author: @vitorsilverio
// Author: @jaideraf
// Author: @jaideraf
if (document.readyState === 'complete' || (document.readyState !== 'loading')) {
main();
} else {
document.addEventListener('DOMContentLoaded', main);
}


function main() {
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
// make collapsible CSS clickable (space or enter to click)
// make collapsible CSS clickable (space or enter to click)
// from: https://alligator.io/css/collapsible/
// from: https://alligator.io/css/collapsible/
"use strict";
"use strict";
let myCollapsibleLabels = document.querySelectorAll(".lbl-toggle");
let myCollapsibleLabels = document.querySelectorAll(".lbl-toggle");


Array.from(myCollapsibleLabels).forEach(label => {
Array.from(myCollapsibleLabels).forEach(label => {
label.addEventListener("keydown", e => {
label.addEventListener("keydown", e => {
// 32 === spacebar
// 32 === spacebar
// 13 === enter
// 13 === enter
if (e.which === 32 || e.which === 13) {
if (e.which === 32 || e.which === 13) {
e.preventDefault();
e.preventDefault();
label.click();
label.click();
}
}
});
});
});
///////////////////////////////////////////////////////////////////
});
let tag = "";
///////////////////////////////////////////////////////////////////
let tag = "";
let tagFromDropdown = "";
let tagFromDropdown = "";


function createMarcFieldHelpLink() {
function createMarcFieldHelpLink() {
const tagInputs = document.body.querySelectorAll('.tagInput');
const tagInputs = document.body.querySelectorAll('.tagInput');
tagInputs.forEach(elem => {
tagInputs.forEach(elem => {
const marcFieldHelpLink = document.createElement('a');
const marcFieldHelpLink = document.createElement('a');
marcFieldHelpLink.setAttribute('target', '_blank');
marcFieldHelpLink.setAttribute('target', '_blank');
marcFieldHelpLink.innerText = `(?)`;
marcFieldHelpLink.innerText = `(?)`;


const marcFieldHelpLinkClass = elem.closest('table').querySelector('.marcFieldHelpLink');
const marcFieldHelpLinkClass = elem.closest('table').querySelector('.marcFieldHelpLink');
marcFieldHelpLinkClass.appendChild(marcFieldHelpLink);
marcFieldHelpLinkClass.appendChild(marcFieldHelpLink);


// find the tag value from the chosen dropdown
// find the tag value from the chosen dropdown
marcFieldHelpLinkClass.addEventListener('mouseover', event => {
marcFieldHelpLinkClass.addEventListener('mouseover', event => {
tagFromDropdown = event.target.closest('.instanceMain').querySelector('.select2-selection__rendered').getAttribute('title');
tagFromDropdown = event.target.closest('.instanceMain').querySelector('.select2-selection__rendered').getAttribute('title');
tagFromDropdown = tagFromDropdown.substring(0, 3);
tagFromDropdown = tagFromDropdown.substring(0, 3);
marcFieldHelpLink.setAttribute('title',
marcFieldHelpLink.setAttribute('title',
`Documentação do campo ${tagFromDropdown}`);
`Documentação do campo ${tagFromDropdown}`);
// build the URL
// build the URL
if (window.location.href.match(/A\d{6}/) ||
if (window.location.href.match(/A\d{6}/) ||
window.location.href.match(/AutRecord/)) {
window.location.href.match(/AutRecord/)) {
marcFieldHelpLink.setAttribute('href', 'http://marc.febab.org/a' + tagFromDropdown);
marcFieldHelpLink.setAttribute('href', 'http://marc.febab.org/a' + tagFromDropdown);
} else {
} else {
marcFieldHelpLink.setAttribute('href', `https://www.loc.gov/marc/bibliographic/bd${tagFromDropdown}.html`);
marcFieldHelpLink.setAttribute('href', `https://www.loc.gov/marc/bibliographic/bd${tagFromDropdown}.html`);
}
}
});
});
});
});
}
}


function createAuthorityLinks() {
function createAuthorityLinks() {
const textareas = document.body.querySelectorAll('textarea.has-authority-control');
const textareas = document.body.querySelectorAll('textarea.has-authority-control');
textareas.forEach(elem => {
textareas.forEach(elem => {
let authorityLink = document.createElement('a');
let authorityLink = document.createElement('a');
authorityLink.setAttribute('title', 'Abre uma nova aba para criar ou editar um registro de autoridade');
authorityLink.setAttribute('title', 'Abre uma nova aba para criar ou editar um registro de autoridade');
authorityLink.setAttribute('target', '_blank');
authorityLink.setAttribute('target', '_blank');
authorityLink.innerText = 'Criar autoridade';
authorityLink.innerText = 'Criar autoridade';
authorityLink.style.display = 'none';
authorityLink.style.display = 'none';


let createAuthorityLink = elem.closest('table').querySelector('.createAuthorityLink');
let createAuthorityLink = elem.closest('table').querySelector('.createAuthorityLink');


createAuthorityLink.appendChild(authorityLink);
createAuthorityLink.appendChild(authorityLink);


let pattern1 = /\$0\sA\d{6}/;
let pattern1 = /\$0\sA\d{6}/;
let pattern2 = /\$0\s\(BN\)\d{9}/;
let pattern2 = /\$0\s\(BN\)\d{9}/;


elem.addEventListener('focusout', () => {
elem.addEventListener('focusout', () => {
// if already recorded
// if already recorded
if (pattern1.test(elem.value)) {
if (pattern1.test(elem.value)) {
// build the URL for Wikincat aut record edit
// build the URL for Wikincat aut record edit
authorityLink.innerText = 'Editar autoridade';
authorityLink.innerText = 'Editar autoridade';
authorityLink.setAttribute('href',
authorityLink.setAttribute('href',
'/wiki/Special:FormEdit/AutRecord/Autoridade:' +
'/wiki/Special:FormEdit/AutRecord/Autoridade:' +
elem.value.match(/A\d{6}/));
elem.value.match(/A\d{6}/));
} else if (pattern2.test(elem.value)) {
} else if (pattern2.test(elem.value)) {
// build the URL for BN aut record view
// build the URL for BN aut record view
authorityLink.innerText = 'Ver autoridade na BN';
authorityLink.innerText = 'Ver autoridade na BN';
authorityLink.setAttribute('href',
authorityLink.setAttribute('href',
'http://acervo.bn.br/sophia_web/autoridade/detalhe/' +
'http://acervo.bn.br/sophia_web/autoridade/detalhe/' +
elem.value.match(/\d{9}/));
elem.value.match(/\d{9}/));
} else {
} else {
// find the tag value from the chosen dropdown
// find the tag value from the chosen dropdown
tagFromDropdown = elem.closest(".instanceMain")
tagFromDropdown = elem.closest(".instanceMain")
// PageForms 4.8
// PageForms 4.8
// .find(".select2-chosen").text();
// .find(".select2-chosen").text();
// Page forms 4.9.1
// Page forms 4.9.1
.querySelector('.select2-selection__rendered')
.querySelector('.select2-selection__rendered')
.getAttribute('title');
.getAttribute('title');
tagFromDropdown = tagFromDropdown.substring(0, 3);
tagFromDropdown = tagFromDropdown.substring(0, 3);
// find the tag value from checked radio button
// find the tag value from checked radio button


let tagFromRadio = elem.closest('.instanceMain')
let tagFromRadio = elem.closest('.instanceMain')
.querySelector("input[origname='Field[authorityType]']:checked")
.querySelector("input[origname='Field[authorityType]']:checked")
.value;
.value;


let authorityTypes = {
let authorityTypes = {
"Pessoa": "100",
"Pessoa": "100",
"Entidade coletiva": "110",
"Entidade coletiva": "110",
"Evento": "111",
"Evento": "111",
"Título uniforme": "130",
"Título uniforme": "130",
"Tópico": "150",
"Tópico": "150",
"Local": "151"
"Local": "151"
};
};


if (tagFromRadio in authorityTypes) {
if (tagFromRadio in authorityTypes) {
tag = authorityTypes[tagFromRadio];
tag = authorityTypes[tagFromRadio];
}
}


// declare the indicators default values
// declare the indicators default values
let ind1 = elem.closest(".instanceMain")
let ind1 = elem.closest(".instanceMain")
.querySelector("select[origname='Field[ind1]'] option:checked")
.querySelector("select[origname='Field[ind1]'] option:checked")
.value;
.value;
let ind2 = elem.closest(".instanceMain")
let ind2 = elem.closest(".instanceMain")
.querySelector("select[origname='Field[ind2]'] option:checked")
.querySelector("select[origname='Field[ind2]'] option:checked")
.value;
.value;


// declare the 008 field default values
// declare the 008 field default values
let directOrIndirectGeogSubdiv = "", // 06
let directOrIndirectGeogSubdiv = "", // 06
kindOfRecord = "", // 09
kindOfRecord = "", // 09
descriptiveCatalogingRules = "c", // 10
descriptiveCatalogingRules = "c", // 10
subjectHeadingSystem = "n", // 11
subjectHeadingSystem = "n", // 11
typeOfSeries = "n", // 12
typeOfSeries = "n", // 12
numberedOrUnnumberedSeries = "n", // 13
numberedOrUnnumberedSeries = "n", // 13
headingUseMainOrAddedEntry = "a", // 14
headingUseMainOrAddedEntry = "a", // 14
headingUseSubjectAddedEntry = "a", // 15
headingUseSubjectAddedEntry = "a", // 15
headingUseSeriesAddedEntry = "b", // 16
headingUseSeriesAddedEntry = "b", // 16
typeOfSubjectSubdivision = "n", // 17
typeOfSubjectSubdivision = "n", // 17
undifferentiatedPersonalName = "n", // 32
undifferentiatedPersonalName = "n", // 32
levelOfEstablishment = "a"; // 33
levelOfEstablishment = "a"; // 33


// set the 008 field and indicadors specific values
// set the 008 field and indicadors specific values
if (tag === "100") {
if (tag === "100") {
undifferentiatedPersonalName = "a";
undifferentiatedPersonalName = "a";
ind2 = "";
ind2 = "";
}
if (tag === "110") {
// in case of autocomplete of 260
if (tagFromDropdown === "260") {
directOrIndirectGeogSubdiv = "n";
kindOfRecord = "b";
headingUseMainOrAddedEntry = "b";
headingUseSubjectAddedEntry = "b";
levelOfEstablishment = "n";
ind1 = "1";
}
}
ind2 = "";
if (tag === "110") {
}
// in case of autocomplete of 260
if (tag === "111") {
if (tagFromDropdown === "260") {
ind1 = "2";
directOrIndirectGeogSubdiv = "n";
ind2 = "";
kindOfRecord = "b";
}
headingUseMainOrAddedEntry = "b";
if (tag === "130") {
headingUseSubjectAddedEntry = "b";
typeOfSeries = "a";
levelOfEstablishment = "n";
numberedOrUnnumberedSeries = "b";
ind1 = "1";
headingUseSeriesAddedEntry = "a";
}
if (tagFromDropdown === "130" ||
ind2 = "";
tagFromDropdown === "630" ||
tagFromDropdown === "730") {
ind2 = ind1; // an inverted value happens here, see and
ind1 = ""; // compare bib. and auth. 130 MARC definitions
}
}
ind1 = "";
if (tag === "111") {
}
ind1 = "2";
if (tag === "150" || tag === "151") {
ind2 = "";
descriptiveCatalogingRules = "n";
subjectHeadingSystem = "z";
headingUseMainOrAddedEntry = "b";
ind1 = ""; // 150 and 151 indicators must be empty in
ind2 = ""; // authority MARC records
if (tag === "151") {
typeOfSubjectSubdivision = "d";
}
}
}
if (tag === "130") {
// build the URL
typeOfSeries = "a";
let autRecordParams = {
numberedOrUnnumberedSeries = "b";
"AutRecord": {
headingUseSeriesAddedEntry = "a";
"directOrIndirectGeogSubdiv": directOrIndirectGeogSubdiv,
if (tagFromDropdown === "130" ||
"kindOfRecord": kindOfRecord,
tagFromDropdown === "630" ||
"descriptiveCatalogingRules": descriptiveCatalogingRules,
tagFromDropdown === "730") {
"subjectHeadingSystem": subjectHeadingSystem,
ind2 = ind1; // an inverted value happens here, see and
"typeOfSeries": typeOfSeries,
ind1 = ""; // compare bib. and auth. 130 MARC definitions
"numberedOrUnnumberedSeries": numberedOrUnnumberedSeries,
"headingUseMainOrAddedEntry": headingUseMainOrAddedEntry,
"headingUseSubjectAddedEntry": headingUseSubjectAddedEntry,
"headingUseSeriesAddedEntry": headingUseSeriesAddedEntry,
"typeOfSubjectSubdivision": typeOfSubjectSubdivision,
"undifferentiatedPersonalName": undifferentiatedPersonalName,
"levelOfEstablishment": levelOfEstablishment
},
"Field": {
"1": {
"tag": "040",
"data": "$a BR-FlWIK $b por $c BR-FlWIK $d BR-FlUSC"
},
"2": {
"tag": tag,
"ind1": ind1,
"ind2": ind2,
"data": elem.value
},
"3": {
"tag": "670",
"data": "$a+"
}
}
ind1 = "";
}
}
};
if (tag === "150" || tag === "151") {
descriptiveCatalogingRules = "n";
subjectHeadingSystem = "z";
headingUseMainOrAddedEntry = "b";
ind1 = ""; // 150 and 151 indicators must be empty in
ind2 = ""; // authority MARC records
if (tag === "151") {
typeOfSubjectSubdivision = "d";
}
}
// build the URL
let autRecordParams = {
"AutRecord": {
"directOrIndirectGeogSubdiv": directOrIndirectGeogSubdiv,
"kindOfRecord": kindOfRecord,
"descriptiveCatalogingRules": descriptiveCatalogingRules,
"subjectHeadingSystem": subjectHeadingSystem,
"typeOfSeries": typeOfSeries,
"numberedOrUnnumberedSeries": numberedOrUnnumberedSeries,
"headingUseMainOrAddedEntry": headingUseMainOrAddedEntry,
"headingUseSubjectAddedEntry": headingUseSubjectAddedEntry,
"headingUseSeriesAddedEntry": headingUseSeriesAddedEntry,
"typeOfSubjectSubdivision": typeOfSubjectSubdivision,
"undifferentiatedPersonalName": undifferentiatedPersonalName,
"levelOfEstablishment": levelOfEstablishment
},
"Field": {
"1": {
"tag": "040",
"data": "$a BR-FlWIK $b por $c BR-FlWIK $d BR-FlUSC"
},
"2": {
"tag": tag,
"ind1": ind1,
"ind2": ind2,
"data": elem.value
},
"3": {
"tag": "670",
"data": "$a "
}
}
};


let url = new URL(location.origin + '/wiki/Special:FormEdit/AutRecord');
let url = new URL(location.origin + '/wiki/Special:FormEdit/AutRecord');
const makeUrlParams = (obj) => {
const makeUrlParams = (obj) => {
for (const [key, value] of Object.entries(obj)) {
for (const [key, value] of Object.entries(obj)) {
if (typeof value === 'object') {
if (typeof value === 'object') {
for (const [key2, value2] of Object.entries(value)) {
for (const [key2, value2] of Object.entries(value)) {
if (typeof value2 === 'object') {
if (typeof value2 === 'object') {
for (const [key3, value3] of Object.entries(value2)) {
for (const [key3, value3] of Object.entries(value2)) {
url.searchParams.set(`${key}[${key2}][${key3}]`, value3);
url.searchParams.set(`${key}[${key2}][${key3}]`, value3);
}
} else {
url.searchParams.set(`${key}[${key2}]`, value2);
}
}
} else {
url.searchParams.set(`${key}[${key2}]`, value2);
}
}
} else {
url.searchParams.set(key, value);
}
}

} else {
url.searchParams.set(key, value);
}
}
};
makeUrlParams(autRecordParams);
authorityLink.innerText = 'Criar autoridade';
authorityLink.setAttribute("href", url.pathname + url.search);
}
authorityLink.style.display = '';
});
});
}


function rmCarriageReturn() {
}
const textareas = document.body.querySelectorAll('textarea');
};
textareas.forEach(elem => {
makeUrlParams(autRecordParams);
authorityLink.innerText = 'Criar autoridade';
elem.value = elem.value.replace("
", "");
authorityLink.setAttribute("href", url.pathname + url.search);
}
authorityLink.style.display = '';
});
});
});
}
}


function rmCarriageReturn() {
function rmHtmlTags() {
const textareas = document.body.querySelectorAll('textarea');
const textareas = document.body.querySelectorAll('textarea');
textareas.forEach(elem => {
textareas.forEach(elem => {
elem.value = elem.value.replace("
", "");
elem.value = elem.value.replace(/<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>/g, "");
});
});
}
}


function rmHtmlTags() {
function rmTxtFromHiddenTexareas() {
const textareas = document.body.querySelectorAll('textarea');
const textareas = document.body.querySelectorAll('span.hiddenByPF');
textareas.forEach(elem => {
textareas.forEach(elem => {
elem.querySelectorAll('textarea').forEach(elem => {
elem.value = elem.value.replace(/<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>/g, "");
elem.value = '';
});
});
}
});
}


function rmTxtFromHiddenTexareas() {
function normalizeInput() {
const textareas = document.body.querySelectorAll('span.hiddenByPF');
const textareas = document.body.querySelectorAll('textarea');
textareas.forEach(elem => {
textareas.forEach(elem => {
let normalizedInput = elem.value;
elem.querySelectorAll('textarea').forEach(elem => {
elem.value = '';
normalizedInput = elem.value
// "$a Bar \n$b Baz" > " $a Bar $b Baz"
.replace(/\s*(\$[a-z0-8])\s*/g, " $1 ")
// "$a Bar\nFoo" > "$a Bar Foo" ou "$a Bar Foo" > "$a Bar Foo"
.replace(/\n|\s\s+|\t/g, " ")
// replace "|" by "%7C" (Ex.: http://viaf.org/processed/WKP|Q2484404)
.replace("|", "%7C");
elem.value = normalizedInput;
});
});
});
}
}

function normalizeInput() {
const textareas = document.body.querySelectorAll('textarea');
textareas.forEach(elem => {
let normalizedInput = elem.value;
normalizedInput = elem.value
// "$a Bar \n$b Baz" > " $a Bar $b Baz"
.replace(/\s*(\$[a-z0-8])\s*/g, " $1 ")
// "$a Bar\nFoo" > "$a Bar Foo" ou "$a Bar Foo" > "$a Bar Foo"
.replace(/\n|\s\s+|\t/g, " ")
// replace "|" by "%7C" (Ex.: http://viaf.org/processed/WKP|Q2484404)
.replace("|", "%7C");
elem.value = normalizedInput;
});
}


$(document).ready(function () {
// calls main functions
// calls main functions
createMarcFieldHelpLink();
createMarcFieldHelpLink();
Linha 319: Linha 324:
normalizeInput();
normalizeInput();
});
});
}

});

Edição das 14h11min de 9 de agosto de 2022

// Author: @vitorsilverio
// Author: @jaideraf
if (document.readyState === 'complete' || (document.readyState !== 'loading')) {
    main();
} else {
    document.addEventListener('DOMContentLoaded', main);
}

function main() {
    ///////////////////////////////////////////////////////////////////
    // make collapsible CSS clickable (space or enter to click)
    // from: https://alligator.io/css/collapsible/
    "use strict";
    let myCollapsibleLabels = document.querySelectorAll(".lbl-toggle");

    Array.from(myCollapsibleLabels).forEach(label => {
        label.addEventListener("keydown", e => {
            // 32 === spacebar
            // 13 === enter
            if (e.which === 32 || e.which === 13) {
                e.preventDefault();
                label.click();
            }
        });
    });
    ///////////////////////////////////////////////////////////////////
    let tag = "";
    let tagFromDropdown = "";

    function createMarcFieldHelpLink() {
        const tagInputs = document.body.querySelectorAll('.tagInput');
        tagInputs.forEach(elem => {
            const marcFieldHelpLink = document.createElement('a');
            marcFieldHelpLink.setAttribute('target', '_blank');
            marcFieldHelpLink.innerText = `(?)`;

            const marcFieldHelpLinkClass = elem.closest('table').querySelector('.marcFieldHelpLink');
            marcFieldHelpLinkClass.appendChild(marcFieldHelpLink);

            // find the tag value from the chosen dropdown
            marcFieldHelpLinkClass.addEventListener('mouseover', event => {
                tagFromDropdown = event.target.closest('.instanceMain').querySelector('.select2-selection__rendered').getAttribute('title');
                tagFromDropdown = tagFromDropdown.substring(0, 3);
                marcFieldHelpLink.setAttribute('title',
                    `Documentação do campo ${tagFromDropdown}`);
                // build the URL
                if (window.location.href.match(/A\d{6}/) ||
                    window.location.href.match(/AutRecord/)) {
                    marcFieldHelpLink.setAttribute('href', 'http://marc.febab.org/a' + tagFromDropdown);
                } else {
                    marcFieldHelpLink.setAttribute('href', `https://www.loc.gov/marc/bibliographic/bd${tagFromDropdown}.html`);
                }
            });
        });
    }

    function createAuthorityLinks() {
        const textareas = document.body.querySelectorAll('textarea.has-authority-control');
        textareas.forEach(elem => {
            let authorityLink = document.createElement('a');
            authorityLink.setAttribute('title', 'Abre uma nova aba para criar ou editar um registro de autoridade');
            authorityLink.setAttribute('target', '_blank');
            authorityLink.innerText = 'Criar autoridade';
            authorityLink.style.display = 'none';

            let createAuthorityLink = elem.closest('table').querySelector('.createAuthorityLink');

            createAuthorityLink.appendChild(authorityLink);

            let pattern1 = /\$0\sA\d{6}/;
            let pattern2 = /\$0\s\(BN\)\d{9}/;

            elem.addEventListener('focusout', () => {
                // if already recorded
                if (pattern1.test(elem.value)) {
                    // build the URL for Wikincat aut record edit
                    authorityLink.innerText = 'Editar autoridade';
                    authorityLink.setAttribute('href',
                        '/wiki/Special:FormEdit/AutRecord/Autoridade:' +
                        elem.value.match(/A\d{6}/));
                } else if (pattern2.test(elem.value)) {
                    // build the URL for BN aut record view
                    authorityLink.innerText = 'Ver autoridade na BN';
                    authorityLink.setAttribute('href',
                        'http://acervo.bn.br/sophia_web/autoridade/detalhe/' +
                        elem.value.match(/\d{9}/));
                } else {
                    // find the tag value from the chosen dropdown
                    tagFromDropdown = elem.closest(".instanceMain")
                        // PageForms 4.8
                        // .find(".select2-chosen").text();
                        // Page forms 4.9.1
                        .querySelector('.select2-selection__rendered')
                        .getAttribute('title');
                    tagFromDropdown = tagFromDropdown.substring(0, 3);
                    // find the tag value from checked radio button

                    let tagFromRadio = elem.closest('.instanceMain')
                        .querySelector("input[origname='Field[authorityType]']:checked")
                        .value;

                    let authorityTypes = {
                        "Pessoa": "100",
                        "Entidade coletiva": "110",
                        "Evento": "111",
                        "Título uniforme": "130",
                        "Tópico": "150",
                        "Local": "151"
                    };

                    if (tagFromRadio in authorityTypes) {
                        tag = authorityTypes[tagFromRadio];
                    }

                    // declare the indicators default values
                    let ind1 = elem.closest(".instanceMain")
                        .querySelector("select[origname='Field[ind1]'] option:checked")
                        .value;
                    let ind2 = elem.closest(".instanceMain")
                        .querySelector("select[origname='Field[ind2]'] option:checked")
                        .value;

                    // declare the 008 field default values
                    let directOrIndirectGeogSubdiv = "", // 06
                        kindOfRecord = "", // 09
                        descriptiveCatalogingRules = "c", // 10
                        subjectHeadingSystem = "n", // 11
                        typeOfSeries = "n", // 12
                        numberedOrUnnumberedSeries = "n", // 13
                        headingUseMainOrAddedEntry = "a", // 14
                        headingUseSubjectAddedEntry = "a", // 15
                        headingUseSeriesAddedEntry = "b", // 16
                        typeOfSubjectSubdivision = "n", // 17
                        undifferentiatedPersonalName = "n", // 32
                        levelOfEstablishment = "a"; // 33

                    // set the 008 field and indicadors specific values
                    if (tag === "100") {
                        undifferentiatedPersonalName = "a";
                        ind2 = "";
                    }
                    if (tag === "110") {
                        // in case of autocomplete of 260
                        if (tagFromDropdown === "260") {
                            directOrIndirectGeogSubdiv = "n";
                            kindOfRecord = "b";
                            headingUseMainOrAddedEntry = "b";
                            headingUseSubjectAddedEntry = "b";
                            levelOfEstablishment = "n";
                            ind1 = "1";
                        }
                        ind2 = "";
                    }
                    if (tag === "111") {
                        ind1 = "2";
                        ind2 = "";
                    }
                    if (tag === "130") {
                        typeOfSeries = "a";
                        numberedOrUnnumberedSeries = "b";
                        headingUseSeriesAddedEntry = "a";
                        if (tagFromDropdown === "130" ||
                            tagFromDropdown === "630" ||
                            tagFromDropdown === "730") {
                            ind2 = ind1; // an inverted value happens here, see and
                            ind1 = "";   // compare bib. and auth. 130 MARC definitions
                        }
                        ind1 = "";
                    }
                    if (tag === "150" || tag === "151") {
                        descriptiveCatalogingRules = "n";
                        subjectHeadingSystem = "z";
                        headingUseMainOrAddedEntry = "b";
                        ind1 = ""; // 150 and 151 indicators must be empty in
                        ind2 = ""; // authority MARC records
                        if (tag === "151") {
                            typeOfSubjectSubdivision = "d";
                        }
                    }
                    // build the URL
                    let autRecordParams = {
                        "AutRecord": {
                            "directOrIndirectGeogSubdiv": directOrIndirectGeogSubdiv,
                            "kindOfRecord": kindOfRecord,
                            "descriptiveCatalogingRules": descriptiveCatalogingRules,
                            "subjectHeadingSystem": subjectHeadingSystem,
                            "typeOfSeries": typeOfSeries,
                            "numberedOrUnnumberedSeries": numberedOrUnnumberedSeries,
                            "headingUseMainOrAddedEntry": headingUseMainOrAddedEntry,
                            "headingUseSubjectAddedEntry": headingUseSubjectAddedEntry,
                            "headingUseSeriesAddedEntry": headingUseSeriesAddedEntry,
                            "typeOfSubjectSubdivision": typeOfSubjectSubdivision,
                            "undifferentiatedPersonalName": undifferentiatedPersonalName,
                            "levelOfEstablishment": levelOfEstablishment
                        },
                        "Field": {
                            "1": {
                                "tag": "040",
                                "data": "$a BR-FlWIK $b por $c BR-FlWIK $d BR-FlUSC"
                            },
                            "2": {
                                "tag": tag,
                                "ind1": ind1,
                                "ind2": ind2,
                                "data": elem.value
                            },
                            "3": {
                                "tag": "670",
                                "data": "$a "
                            }
                        }
                    };

                    let url = new URL(location.origin + '/wiki/Special:FormEdit/AutRecord');
                    const makeUrlParams = (obj) => {
                        for (const [key, value] of Object.entries(obj)) {
                            if (typeof value === 'object') {
                                for (const [key2, value2] of Object.entries(value)) {
                                    if (typeof value2 === 'object') {
                                        for (const [key3, value3] of Object.entries(value2)) {
                                            url.searchParams.set(`${key}[${key2}][${key3}]`, value3);
                                        }
                                    } else {
                                        url.searchParams.set(`${key}[${key2}]`, value2);
                                    }
                                }
                            } else {
                                url.searchParams.set(key, value);
                            }

                        }
                    };
                    makeUrlParams(autRecordParams);
                    authorityLink.innerText = 'Criar autoridade';
                    authorityLink.setAttribute("href", url.pathname + url.search);
                }
                authorityLink.style.display = '';
            });
        });
    }

    function rmCarriageReturn() {
        const textareas = document.body.querySelectorAll('textarea');
        textareas.forEach(elem => {
            elem.value = elem.value.replace("&#13;", "");
        });
    }

    function rmHtmlTags() {
        const textareas = document.body.querySelectorAll('textarea');
        textareas.forEach(elem => {
            elem.value = elem.value.replace(/<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>/g, "");
        });
    }

    function rmTxtFromHiddenTexareas() {
        const textareas = document.body.querySelectorAll('span.hiddenByPF');
        textareas.forEach(elem => {
            elem.querySelectorAll('textarea').forEach(elem => {
                elem.value = '';
            });
        });
    }

    function normalizeInput() {
        const textareas = document.body.querySelectorAll('textarea');
        textareas.forEach(elem => {
            let normalizedInput = elem.value;
            normalizedInput = elem.value
                // "$a   Bar   \n$b    Baz" > " $a Bar $b Baz"
                .replace(/\s*(\$[a-z0-8])\s*/g, " $1 ")
                // "$a Bar\nFoo" > "$a Bar Foo" ou "$a Bar  Foo" > "$a Bar Foo"
                .replace(/\n|\s\s+|\t/g, " ")
                // replace "|" by "%7C" (Ex.: http://viaf.org/processed/WKP|Q2484404)
                .replace("|", "%7C");
            elem.value = normalizedInput;
        });
    }

    // calls main functions
    createMarcFieldHelpLink();
    createAuthorityLinks();
    rmCarriageReturn();
    rmHtmlTags();

    // Como instâncias do formulário são criadas pelo botão "Adicionar campo",
    // é necessário observar o DOM a partir da classe ".multipleTemplateList".
    // Toda vez que o DOM é alterado (mais especificamente, quando uma nova
    // child de ".multipleTemplateList" é criada), a função
    // marcEditorDynamicLinks() é novamente chamada.
    // https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver

    // create an observer instance
    let observer = new MutationObserver(function (mutations) {
        mutations.forEach(function (mutation) {
            let newNodes = mutation.addedNodes; // DOM NodeList
            if (newNodes.length !== 0) { // if there are new nodes added
                createMarcFieldHelpLink();
                createAuthorityLinks();
            }
        });
    });

    // select the target node
    let target = document.querySelector(".multipleTemplateList");

    // configuration of the observer
    let config = {
        childList: true,
        attributes: false,
        subtree: false
    };

    // pass in the target node, as well as the observer options
    observer.observe(target, config);

    // when clicking save...
    const saveBtn = document.body.querySelector('#wpSave');
    saveBtn.addEventListener('click', () => {
        observer.disconnect();
        rmTxtFromHiddenTexareas();
        rmCarriageReturn();
        rmHtmlTags();
        normalizeInput();
    });
}