/* ***********************************
 *	jQuery
 * ***********************************/

(function ($) {
    $(function () {
        /*---------------------------------------
        :: Bootsrap Select initialization
        -------------------------------------- */

        // dependent select boxes
        if (window.FormStuff && $.isFunction(FormStuff.showDomain)) {
            $("select[id$='P_FOTIP']").on("change", function () {
                var $ptip = $("select[id$='P_TIP']");
                if ($ptip.data('selectpicker')) {
                    $ptip.selectpicker('refresh');
                }
            });
        }
    });
})(jQuery);

function checkBackgroundJobStatus($root, url, jobId, timeout) {
    $.ajax({
        type: "GET",
        url: url,
        cache: false,
        dataType: "html",
        success: function (data, textStatus, jqXHR) {
            if (jqXHR.status === 204) {
                setTimeout(function () {
                    checkBackgroundJobStatus($root, url, jobId, timeout);
                }, timeout)
                return;
            }
            $root.html(data);
            initPairForms($root);
            initBootstrapSelectPicker($root);
            initBootstrapModal($root);
            initDataTable($root);
            initDatePicker($root);
            initValidation($root);
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            console.error(errorThrown);
            $root.html("Hiba a PAIR kommunik&aacute;ci&oacute; k&ouml;zben!");
        }
    });
}

Liferay.on(
    'allPortletsReady',

    function () {
        initPairForms();
    }
);

function initPairForms($root) {
    $root = $root || $(document);

    // Submit eseménykor fusson le a saveFormData eljárás. Alapértelmezetten elküldéskor nem marad meg a session tartalma
    $root.find('.pair-content form').attr('onsubmit', 'saveFormData()');

    generateButtons($root);
    resetForm($root);
    checkNavigationType($root);
}

function checkNavigationType($root) {
    if (!$root.find('.pair-content form').length) {
        // nincs form az oldalon, nem csinálunk semmit
        return;
    }
    if (navigator.userAgent.indexOf("Safari") != -1) {
        if (performance.navigation.type == 2) {
            loadFormData($root);
        } else {
            sessionStorage.clear();
        }
    }

    let perfEntries = performance.getEntriesByType('navigation');

    for (let i = 0; i < perfEntries.length; i++) {
        if (perfEntries[i].type === 'back_forward') {
            loadFormData($root);
        } else {
            sessionStorage.clear();
        }
    }
}

// Gombok generálása minden select elem mellé, amelyek nem rendelkeznek '.P_RENDEZ' osztállyal. (Ezek egy sorban helyezkednek el egymás mellett)
function generateButtons($root) {
    let currentDropdowns = $root.find('table tr .bootstrap-select').not('.P_RENDEZ');
    let divToAppend = '<button class="btn btn-primary btn-reset reset-current" type="button"> Törlés </button>';
    currentDropdowns.closest('tr td').append(divToAppend);

    // 2019.12.10 - a dátum mezők után is legyen törlés gomb
    $root.find("tr:has('.date-picker')").find('td:last-child').append(divToAppend);
}

function resetForm($root) {
    let currentButton = $root.find('.btn-reset');

    currentButton.on('click', function () {
        // select elemek
        let currentRow = jQuery(this).closest('tr');
        let currentSelect = currentRow.find('select');
        let currentOptions = currentRow.find('.bootstrap-select li');

        // érték, és a kiválasztott elem stílusának törlése
        currentSelect.val('');
        currentOptions.each(function () {
            jQuery(this).removeClass('active selected');
        })

        /* opciók hozzáadása/törlése esetén szükséges frissíteni a select elemet, hogy az aktuális opciókat jelenítse meg
        - https://developer.snapappointments.com/bootstrap-select/methods/#selectpickerrefresh */
        currentSelect.selectpicker("refresh");

        // 2019.12.10 datepicker elemek
        let currentDates = currentRow.find('.date-picker');
        currentDates.val('');
    })
}

// form adatok elmentése lekérdezés után sessionStorage-ba

function saveFormData() {
    /* CHECKBOX */

    let checkboxArr = jQuery('.pair-content input[type="checkbox"]').map(function () {
        return this.checked;
    }).get();

    sessionStorage.setItem("checked", JSON.stringify(checkboxArr));

    /* TEXT INPUT */
    let textValues = [];
    let textInputs = jQuery('.pair-content input[type="text"]:not([type=hidden]):not(".bs-searchbox input"):not(".date-picker")');

    textInputs.each(function () {
        textValues.push(jQuery(this).val());
    })

    sessionStorage.setItem('textVals', JSON.stringify(textValues));

    /* BOOTSTRAP-SELECT */

    let selectValues = [];
    let selectElements = jQuery('.pair-content select');

    selectElements.each(function () {
        selectValues.push(jQuery(this).val());
    })

    sessionStorage.setItem('selectedVals', JSON.stringify(selectValues));

    /* DATEPICKER */
    let dateValues = [];
    let dateInputs = jQuery('.pair-content input.date-picker');

    dateInputs.each(function () {
        dateValues.push(jQuery(this).val());
    })

    sessionStorage.setItem('dateVals', JSON.stringify(dateValues));

    /* RADIO BUTTONS */
    let radioValues = [];
    let radioButtons = jQuery('.pair-content input[type="radio"]');

    radioButtons.each(function () {
        radioValues.push(jQuery(this).is(':checked'));
    })

    sessionStorage.setItem('radioVals', JSON.stringify(radioValues));

    /* P_MODUL mentése az URL-ből. A sessionStorage ne töltse ki valamennyi form adatát az adott tabon belül, a P_MODUL alapján csak az adott
    lekérdezésre legyen érvényes */

    let currentFormURL = location.href.substring(location.href.indexOf('p_modul'));
    sessionStorage.setItem('sessionFormURL', currentFormURL);
}

function loadFormData($root) {
    /* session-be elmentett URL részlet összehasonlítása a jelenleg megnyitott form URL-jével. Ha nem egyezik, akkor törölni kell a sessionStorage-t,
    ha egyezik, akkor visszatértünk a lekérdezéshez, az adatok visszatöltődnek */
    let currentFormURL = location.href.substring(location.href.indexOf('p_modul'));
    let savedUrl = sessionStorage.getItem('sessionFormURL');

    if (currentFormURL !== savedUrl) {
        // új form, régi adatait töröljük
        sessionStorage.clear();
    } else {
        // előző formra térünk vissza
        let checkboxArr = JSON.parse(sessionStorage.getItem('checked')) || [];

        checkboxArr.forEach(function (isChecked, i) {
            $root.find('.pair-content input[type="checkbox"]').eq(i).prop('checked', isChecked);
        });

        /* TEXT INPUT */

        // ha nincs egy-egy típusú input elem az adott lekérdezésben, akkor üres tömb legyen ( undefined errort dob )
        let textArr = JSON.parse(sessionStorage.getItem('textVals')) || [];
        let textInputs = $root.find('.pair-content input[type="text"]:not([type=hidden]):not(".bs-searchbox input"):not(".date-picker")');

        textInputs.each(function (item) {
            jQuery(this).val(textArr[item]);
        })

        /* BOOTSTRAP-SELECT */

        let selectArr = JSON.parse(sessionStorage.getItem('selectedVals')) || [];
        let selectElements = $root.find('.pair-content select');

        selectElements.each(function (item) {
            jQuery(this).selectpicker('val', selectArr[item]);
        })
        $root.find('.pair-content select').selectpicker('render');

        /* DATEPICKER */
        let dateArr = JSON.parse(sessionStorage.getItem('dateVals')) || [];
        let dateInputs = $root.find('.pair-content input.date-picker');

        dateInputs.each(function (item) {
            jQuery(this).val(dateArr[item]);
        })

        /* RADIO BUTTONS */

        let radioArr = JSON.parse(sessionStorage.getItem('radioVals')) || [];

        radioArr.forEach(function (isChecked, i) {
            $root.find('.pair-content input[type="radio"]').eq(i).prop('checked', isChecked);
        });
    }
}
