(function() {
    dvT3ConsentManagementLoadModalContent();
})();

function dvT3ConsentManagementLoadModalContent() {
    const div = document.getElementById('dv_t3_consent_management_loader');
    const Http = new XMLHttpRequest();
    const url = '/dv-t3consentmanagement-api/modal/'+div.dataset.lang+'/'+div.dataset.pid;

    const payload = {
        rootline: div.dataset.rootline,
    };

    // send request
    Http.open('POST', url);
    Http.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
    Http.send(JSON.stringify(payload));

    Http.onreadystatechange = function() {
        // readyState 4: request is done
        // status 200: request was successfull
        if (this.readyState === 4 && this.status === 200) {
            const response = this;
            const responseContent = JSON.parse(response.responseText);

            const newDiv = document.createElement('div');

            if (!responseContent.banner) { return; }

            newDiv.innerHTML = responseContent.banner;
            document.body.appendChild(newDiv);

            //loadScript('/typo3conf/ext/dv_t3_consent_management/Resources/Public/JavaScript/consentModal.js', function() {

            dvT3ConsentManagementSetAccordionListener();

            if(responseContent.showModal) {
                dvT3ConsentManagementOpenModal();
            }
            if(responseContent.htmlSnippets) {
                const snippetkeys = Object.keys(responseContent.htmlSnippets);
                for (let i=0; i<snippetkeys.length;i++) {
                    const idx = snippetkeys[i];
                    parseSnippet(idx, responseContent.htmlSnippets[idx]);
                }
            }
            //});
        }
    }
}

function parseSnippet(place, content) {
    //first parse for JS script tags - they have to be executed
    const regEx = /<script(.*?)>([^]*?)<\/script>/gm;
    regEx.multiline;
    if(hits = content.match(regEx)) {
        // console.log(hits);
        for (let i=0; i<hits.length; i++) {
            const jsString = hits[i];
            content = content.replace(jsString, ''); //eliminate this JS code from given content

            // read script tag
            const t = document.createElement('template');
            t.innerHTML = jsString;
            const el = t.content.cloneNode(true).firstChild;

            //create new DOM element
            const element = document.createElement('script');
            //fill attributes
            for (let j=0; j<el.attributes.length; j++) {
                const attr = el.attributes[j];
                if(attr.name == 'src') {
                    element.src = attr.textContent;
                }
                else {
                    element.setAttribute(attr.name, attr.textContent);
                }
            }
            // fill tag content
            element.innerHTML = el.textContent;

            insertToDom(place, element);
        }
    }

    //add other content
    const t = document.createElement('template');
    t.innerHTML = content;
    insertToDom(place, t.content.cloneNode(true));
}

function insertToDom(place, element) {
    place = place.split('_')
    const segment = place[0];
    const position = place[1];

    let container = (segment === 'HEAD') ? document.head : document.body;
    if(position === 'ABOVE') {
        container.insertBefore(element, container.firstChild);
    }
    else {
        container.appendChild(element);
    }
}

function loadScript(url, callback)
{
    // Adding the script tag to the head as suggested before
    const head = document.head;
    const script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = url;

    // Then bind the event to the callback function.
    // There are several events for cross browser compatibility.
    script.onreadystatechange = callback;
    script.onload = callback;

    // Fire the loading
    head.appendChild(script);
}



// FROM OLD consentModal.js

/**************************
 * START - USED FUNCTIONS *
 **************************/

/**
 * set accordion listener
 */
function dvT3ConsentManagementSetAccordionListener() {
    const acc = document.getElementsByClassName('accordion-button-label');
    for (let i = 0; i < acc.length; i++) {
        acc[i].addEventListener('click', function() {
            /* Toggle between adding and removing the "active" class,
            to highlight the button that controls the panel */
            this.closest('.accordion').classList.toggle('active');

            /* Toggle between hiding and showing the active panel */
            const panel = this.closest('.accordion').nextElementSibling;
            if (panel.style.display === 'block') {
                panel.style.display = 'none';
            } else {
                panel.style.display = 'block';
            }
        });
    }
}

/*********************************
 * ACCEPT CLICK - USED FUNCTIONS *
 *********************************/

/**
 * way from button accept choice
 */
function dvT3ConsentManagementAcceptChoice() {
    const checkboxes = document.getElementsByClassName('dv-cookie-banner-checkbox-category');
    const categories = [];
    for (let i = 0; i < checkboxes.length; i++) {
        // set or delete
        if (checkboxes[i].checked === true) {
            categories.push(checkboxes[i].id.replace('checkbox-category-', ''));
        }
    }
    dvT3ConsentManagementAccept(categories);
}

/**
 * way from button accept all
 */
function dvT3ConsentManagementAcceptAll() {
    dvT3ConsentManagementAccept(dvT3ConsentManagementGetAllShownCategoryUids());
}

/**
 * handling, when accepted a choice
 * @param categories [1, 2, 6]
 */
function dvT3ConsentManagementAccept(categories) {
    document.getElementById('dv-t3-consent-management-button-accept-choice').setAttribute('disabled', 'true');
    document.getElementById('dv-t3-consent-management-button-accept-all').setAttribute('disabled', 'true');
    dvT3ConsentManagementSendDecision(categories);
}

/**
 * http-request to send the decision to backend
 * @param categories
 */
function dvT3ConsentManagementSendDecision(categories) {

    const Http = new XMLHttpRequest();
    const url = '/index.php?eID=dvT3ConsentManagementAccept'
    // prepare data
    const data = new FormData();
    for (let i = 0; i < categories.length; i++) {
        data.append(i.toString(), categories[i]);
    }
    // send request
    Http.open('POST', url);
    Http.send(data);

    Http.onreadystatechange = function() {
        // readyState 4: request is done
        // status 200: request was successfull
        if (this.readyState === 4 && this.status === 200) {
            location.reload();
        }
    }
}

/*********************************
 * FUNCTIONS TO OPEN/CLOSE MODAL *
 *********************************/

function dvT3ConsentManagementOpenModal() {
    document.getElementById('dv-t3-consent-management-modal').setAttribute('style', 'opacity:1; pointer-events: auto;');
}

function  dvT3ConsentManagementGetAllShownCategoryUids() {
    const checkboxes = document.getElementsByClassName('dv-cookie-banner-checkbox-category');
    const categories = [];
    for (let i = 0; i < checkboxes.length; i++) {
        categories.push(checkboxes[i].id.replace('checkbox-category-', ''));
    }
    return categories;
}
