var oceny = (function ($, undefined) {
    "use strict"
    var view = $('#OcenyPracownikow'),
        archive = $('.checkbox'),
        body = null, //body formularz
        elementData = null,
        elementyOceny = [],
        displayButtonForce = false;

    var tabsInfo = {
        moje: ['moje', 'tab1'],
        pracownikow: ['pracownikow', 'tab2'],
        udostepnione: ['udostepnione', 'tab3'],
        robocze: ['robocze', 'tab4'],
        administracja: ['administracja', 'tab5'],
        administracja_robocze: ['administracja_robocze', 'tab6'],
        tab1: ['moje', 'tab1'],
        tab2: ['pracownikow', 'tab2'],
        tab3: ['udostepnione', 'tab3'],
        tab4: ['robocze', 'tab4'],
        tab5: ['administracja', 'tab5'],
        tab6: ['administracja_robocze', 'tab6']
    }

    $(document).on('submit', 'form', function (e) {
        e.preventDefault();
        return false;
    });

    //=========================================
    //	START INIT LISTENER LISTA
    //=========================================

    //view.ready(function() {
    ajaxList(oceny_tab_active.name, oceny_tab_active.id, oceny_tab_active.archive);
    $('.tab-pane').removeClass('active');
    $('#' + oceny_tab_active.id).addClass('active');

    var checkbox = checkboxByTab(oceny_tab_active.id);
    if (checkbox.length > 0 && oceny_tab_active.archive == 1) {
        checkbox.prop('checked', true);
    }
    //});

    view.on('click', 'li', function () {
        var item = $(this),
            a = item.children('a').eq(0),
            filter = a.data('value');

        if (filter !== undefined) {

            oceny_tab_active.name = tabsInfo[filter][0];
            oceny_tab_active.id = tabsInfo[filter][1];

            var checkbox = checkboxByTab(oceny_tab_active.id);
            var dodaj = dodajByTab(oceny_tab_active.id);

            if (dodaj.length > 0 && oceny_tab_active.name == 'udostepnione') {
                dodaj.addClass('disabled');
            } else if (dodaj.length > 0 && dodaj.hasClass('disabled')) {
                dodaj.removeClass('disabled');
            }

            if (checkbox.is(':checked')) {
                oceny_tab_active.archive = 1;
                ajaxList(oceny_tab_active.name, oceny_tab_active.id, 1);
            } else {
                oceny_tab_active.archive = 0;
                ajaxList(oceny_tab_active.name, oceny_tab_active.id, 0);
            }


        }
    });

    // archive.on('click', function () {
    //     var input = $(this).find('input');
    //
    //     if (input.length > 0 && input.is(':checked')) {
    //         ajaxList(oceny_tab_active.name, oceny_tab_active.id, 1);
    //     } else {
    //         ajaxList(oceny_tab_active.name, oceny_tab_active.id);
    //     }
    // });

    const archiveInput = archive.find('input');

    archiveInput.on('click', function () {
        if ($(this).length > 0 && $(this).is(':checked')) {
            ajaxList(oceny_tab_active.name, oceny_tab_active.id, 1);
        } else {
            ajaxList(oceny_tab_active.name, oceny_tab_active.id);
        }
    });

    view.on('click', '.oceny-button-trigger', function (event) {
        event.preventDefault();
        var elem = $(this);
        var url = elem.attr('href'),
            run = elem.data('run'),
            data = null;

        if (elem.hasClass('disabled')) {
            return;
        }

        var input = $('#' + oceny_tab_active.id + ' .checkbox > label > input'),
            isArchive = 0;

        if (input.length > 0 && input.is(':checked')) {
            isArchive = 1;
        }

        oceny_tab_active.archive = isArchive;

        if (run == 'add' && (oceny_tab_active.name == 'pracownikow' || oceny_tab_active.name == 'administracja')) {
            run = 'add-pracownikow';
        } else if (run == 'add' && oceny_tab_active.name == 'robocze') {
            run = 'add-robocze';
        }

        if (run == 'remove') {
            if (confirm('Czy na pewno chcesz usunąć?')) {
                ajaxButton(url, run, oceny_tab_active.name, isArchive);
            }
        } else if (run == 'save') {
            data = $('.form-oceny').serializeArray();
            if (data.length > 1 && data.shift()) {
                ajaxButton(url, run, oceny_tab_active.name, isArchive, 'POST', data);
            }
        } else if (run == 'off') {
            alert('funkcja w przygotowaniu');
        } else if ($.inArray(run, ['modal', 'public-save', 'add-pracownikow-save', 'add-robocze-save', 'add-tworca-save']) !== -1) {
            var form = $('.form-modal-oceny');
            url = form.attr('action');
            data = form.serializeArray();
            if (data.length > 1 && data.shift()) {
                if (oceny_tab_active.name == 'pracownikow' || oceny_tab_active.name == 'robocze') {
                    url = url.match(/ajax\/.*/);
                    if (run == 'public-save') {
                        run = 'public-save';
                    } else if (run == 'add-tworca-save') {
                        run = 'add-tworca-save';
                    } else {
                        run = 'add';
                    }
                    ajaxButton(url[0].replace(/\?.*/, ''), run, oceny_tab_active.name, isArchive, 'POST', data);
                } else {
                    $.ajax({
                        url: url,
                        method: 'POST',
                        data: {
                            formularz: data
                        },
                        success: function (data) {
                            var response = JSON.parse(data);
                            if (response.error != undefined) {
                                showError(response.error);
                            } else {
                                showSuccess(response.message);
                            }
                            ajaxList(oceny_tab_active.name, oceny_tab_active.id);
                        }
                    });
                }
            } else {
                showError('Nie wybrano pracownika');
            }
            $('#modal-oceny').modal('hide');
        } else {
            ajaxButton(url, run, oceny_tab_active.name, isArchive);
        }
    });

    view.on('change', '#search', function () {

        var tr = $('#table-ocena > tbody > tr'), td = null, txt = null;
        var search = $(this).val(), res = false;

        for (var i = 0; i < tr.length; i++) {
            td = $(tr[i]).find('.search-val');
            res = false;
            for (var j = 0; j < td.length; j++) {
                txt = $(td[j]).text().trim();
                if (txt.toLowerCase().indexOf(search.toLowerCase()) >= 0) {
                    $(tr[i]).show();
                    res = true;
                }
            }
            if (!res) {
                $(tr[i]).hide();
            }
        }
    });

    //=========================================
    //	END INIT LISTENER LISTA
    //=========================================

    //=========================================
    //	START FUNCTIONS LISTA
    //=========================================

    function checkboxByTab(tab) {
        return $('#' + tab).find('.checkbox').find('input');
    }

    function dodajByTab(tab) {
        return $('#' + tab).find('#form-dodaj');
    }

    function ajaxList(filter, tab, archive) {
        var loader = $('#' + tab + ' .custom-loader'),
            container = $('#' + tab + ' .box-body');

        $.ajax({
            url: local_url + 'ajax/oceny/lista_' + filter,
            method: 'GET',
            data: {
                archive: archive,
                tab: filter
            },
            beforeSend: function () {
                loader.css('display', 'block');
            },
            success: function (data) {
                if (trim(data) === 'login') {
                    window.location = local_url + 'login';
                }
                container.html(data);
            },
            complete: function (xhr, status) {
                loader.css('display', 'none');
            }
        });
    }

    function ajaxButton(url, run, tab, archive, method, data) {
        var container = view;

        $.ajax({
            url: local_url + url,
            method: method !== undefined ? method : 'GET',
            cache: false,
            data: {
                tab: tab,
                run: run,
                archive: archive,
                formularz: data
            },
            beforeSend: function () {
                showLoader('show');
            },
            success: function (data) {
                var response, anuluj;
                if (trim(data) === 'login') {
                    window.location = local_url + 'login';
                }
                if ($.inArray(run, ['show', 'edit', 'add']) !== -1) {
                    if (/^{"error":".*"}$/.test(data)) {
                        response = JSON.parse(data);
                        showError(response.error);
                    } else {
                        setTimeout(function () {
                            container.html(data);
                        }, 500);
                    }
                } else if ($.inArray(run, ['public-szablon', 'add-pracownikow', 'add-robocze', 'add-tworca']) !== -1) {
                    var modal = container.find('#modal-oceny');
                    if (modal.length > 0) {
                        modal.remove();
                    }
                    container.append(data);
                    $('#modal-oceny').modal('show');
                } else if ($.inArray(run, ['save']) !== -1) {
                    response = JSON.parse(data);
                    if (response.error != undefined) {
                        showError(response.error);
                    } else {
                        showSuccess(response.message);
                        anuluj = $('#form-anuluj');
                        if (anuluj.length > 0) {
                            anuluj.click();
                        }
                    }
                } else {
                    response = JSON.parse(data);
                    if (response.error != undefined) {
                        showError(response.error);
                    } else {
                        showSuccess(response.message);
                    }
                    anuluj = $('#form-anuluj');
                    if (anuluj.length > 0) {
                        anuluj.click();
                    } else {
                        ajaxList(oceny_tab_active.name, oceny_tab_active.id, archive);
                    }
                }
            },
            complete: function (xhr, status) {
                showLoader('hide');
            }
        });
    }

    function showLoader(show) {
        var loader = $('#table-loading2[data-main-loader]');

        if (show === 'show') {
            loader
                .css('visibility', 'visible')
                .css('opacity', '1')
                .css('display', 'block');
        } else if (show === 'hide') {
            loader
                .css('visibility', 'hidden')
                .css('opacity', '0')
                .css('display', 'none');
        }
    }

    function receiversFiltering() {
        $.expr[":"].contains = $.expr.createPseudo(function (arg) {
            return function (elem) {
                return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
            };
        });
        $('#receivers-filter').keyup(function () {
            var filter = $(this).val();
            if (filter.length > 0) {
                $('#addresses-list > div').hide();
                $('#addresses-list > div:contains(' + filter + ')').show();
            } else {
                $('#addresses-list > div').show();
            }
        });
    }

    //=========================================
    //	END FUNCTIONS LISTA
    //=========================================

    //=========================================
    //	START INIT LISTENER FORMULARZ
    //=========================================

    view.on('click', '.btn-default', function () {
        var button = $(this);

        if (button.css('background-color') === 'rgb(231, 231, 231)') {
            button.css('background-color', 'rgb(0, 166, 90)');
        } else if (button.css('background-color') === 'rgb(0, 166, 90)') {
            button.css('background-color', 'rgb(231, 231, 231)');
        }
    });

    view.on('click', '.fa-edit', function () {
        var td = $(this).parent('td'),
            input = td.find('input[type="hidden"]');
        if (input.length > 0 && (input.hasClass('element-etykieta') || input.hasClass('element-opis'))) {
            td.html('<div class="input-group"><textarea rows="4" class="form-control ' + input.attr('class') + '" name="EtykietaOpis" data-name="' + input.data('gid') + '">' +
                parserSpanInput(input.val(), 'toInput') + '</textarea><span class="input-group-addon"><i class="fa fa-check"></i></span></div>');
        }
    });

    view.on('click', '.fa-check', function () {
        var td = $(this).parents('td'),
            input = td.find('textarea[name="EtykietaOpis"]');
        if (input.length > 0) {
            if (input.hasClass('element-etykieta')) {
                td.html(elementByRodzajWartosci('edytowacEtykieteTak', parserSpanInput(input.val(), 'toSpan'), input.data('name')));
            } else if (input.hasClass('element-opis')) {
                td.html(elementByRodzajWartosci('edytowacOpisTak', parserSpanInput(input.val(), 'toSpan'), input.data('name')));
            }
            app.renderWartoscHeight();
        }
    });

    view.on('click', '.element-udostepnij', function () {
        var button = $(this),
            gid = button.data('gid'),
            element = ElementOcenySearch(gid),
            modalElem = $('#modal-element'),
            modalTitle = modalElem.find('.modal-title'),
            modalBody = modalElem.find('.modal-body'),
            modalButton = modalElem.find('.modal-footer button'),
            modalGid = modalElem.find('input[name="GidElementOceny"]');

        if (button.hasClass('disabled')) {
            return;
        }

        if (element) {
            $.ajax({
                url: local_url + 'ajax_daj_adresy/UDOSTEPNIENIE_OCENY',
                method: 'GET',
                beforeSend: function () {
                    showLoader('show');
                },
                success: function (data) {
                    modalGid.val(element.Nazwa);
                    modalButton.data('run', 'modal-element-apply');
                    modalTitle.text('Udostępnij pracownikowi');
                    modalBody.html(data);

                    var row = $('input[type="hidden"][name="data[FormularzOceny][' + element.Nazwa + '][Udostepnienie]"]');
                    if (row.length > 0) {
                        var arr = parserArrayString(row.val(), 'toArray');
                        modalBody.find('input[type="checkbox"]').each(function () {
                            var checkbox = $(this);
                            if ($.inArray(checkbox.attr('id'), arr) !== -1) {
                                checkbox.prop('checked', true);
                            } else {
                                checkbox.prop('checked', false);
                            }
                        });
                    }
                    modalElem.modal('show');
                    receiversFiltering();
                },
                complete: function (xhr, status) {
                    showLoader('hide');
                }
            });
        } else {
            showError('Element musi być wcześniej zapisany');
        }


    });

    view.on('click', '.element-dodaj', function () {
        var button = $(this),
            gid = button.data('gid'),
            element = ElementOcenySearch(gid),
            modalElem = $('#modal-element'),
            modalTitle = modalElem.find('.modal-title'),
            modalBody = modalElem.find('.modal-body'),
            modalButton = modalElem.find('.modal-footer button'),
            modalGid = modalElem.find('input[name="GidElementOceny"]');

        if (button.hasClass('disabled')) {
            return;
        }

        if (element && modalElem.length > 0 && element.MozliweNoweElementy.length > 0) {
            var input = '<div><select name="MozliweNoweElementy" class="form-control">';

            $.each(element.MozliweNoweElementy, function (idx, val) {
                input += '<option value="' + val.bGid + '">' + val.bNazwa + '</option>';
            });

            input += '</select></div>';
            modalGid.val(element.Gid);
            modalTitle.text('Dodaj nowy element');
            modalBody.html(input);
            modalButton.data('run', 'modal-element-add');
            modalElem.modal('show');

        } else {
            showError('Brak możliwych elementów do dodania')
        }
    });

    view.on('click', '.element-button-trigger', function (event) {
        event.preventDefault();
        var run = $(this).data('run'),
            form = $('.form-modal-element'),
            gid = null, row = null;

        switch (run) {
            case 'modal-element-apply':
                gid = form.find('input[name="GidElementOceny"]');
                var arr = [];

                form.find('input:checked').each(function () {
                    arr.push($(this).attr('id'));
                });

                if (arr.length > 0) {
                    row = $('input[type="hidden"][name="data[FormularzOceny][' + gid.val() + '][Udostepnienie]"]');
                    if (row.length > 0) {
                        row.val(parserArrayString(arr, 'toString'));
                    }
                }
                break;

            case 'modal-element-add':
                var values = form.serializeArray(),
                    insert = null;
                if (values.length >= 3) {
                    gid = [values[1].value, values[2].value];
                    var element = ElementOcenySearch(gid[0]);
                    if (element) {
                        var SGB = form.find('input[name="SGB"]').val();
                        $.each(element.MozliweNoweElementy, function (idx, val) {
                            if (val.bGid == gid[1]) {
                                insert = new ElementOceny(val);
                                return false;
                            }
                        });
                        if (insert) {
                            insert.Nazwa = insert.Nazwa + Math.floor((Math.random() * 1000) + 1);
                            insert.Gid = uuidv4();
                            row = $('.element-row[data-gid="' + gid[0] + '"]');
                            row.after(buildElement(insert, row.data('group'), SGB));
                        }
                    }
                }
                break;
        }

        datepickerFromToInit();

        $('#modal-element').modal('hide');
    });

    /* TODO do wykorzystania w przyszlosci
    view.on('change', '.element-wartosc', function(){
        var wartosc = sumWartosc();
        $('.element-sum').text(wartosc);
    });
     */

    view.on('click', '.element-usun', function () {
        var button = $(this),
            row = button.parents('div .element-row');

        if (button.hasClass('disabled')) {
            return;
        }

        if (row.length > 0 && body.length > 0) {
            row.remove();
        }
    });

    view.on('click', '.element-direction', function () {
        var direction = $(this).children(),
            group = direction.data('group');

        var rows = $('div.element-row[data-group="' + group + '"]');

        if (direction.hasClass('fa-arrow-circle-down')) {
            direction.removeClass('fa-arrow-circle-down');
            direction.addClass('fa-arrow-circle-up');

            if (rows.length > 0) {
                rows.fadeOut('slow');
            }

        } else if (direction.hasClass('fa-arrow-circle-up')) {
            direction.removeClass('fa-arrow-circle-up');
            direction.addClass('fa-arrow-circle-down');

            if (rows.length > 0) {
                rows.fadeIn('slow');
            }
        }

    });

    view.on('change', 'select[name="Rodzaj"]', function () {
        var select = $(this),
            nrewid = $('.form-modal-oceny').find('select[name="Nrewid"]'),
            checkbox = $('.form-modal-oceny').find('input[name="Pracownik"]');

        if (select.val() == 'WzorFormularzaOceny') {
            nrewid.prop('disabled', true);
            checkbox.prop('disabled', true);
            checkbox.prop('checked', false);
        } else {
            nrewid.prop('disabled', false);
            checkbox.prop('disabled', false);
        }
    });

    view.on('change', 'input[name="Pracownik"]', function () {
        var checkbox = $(this),
            nrewid = $('.form-modal-oceny').find('select[name="Nrewid"]');

        if (checkbox.is(':checked')) {
            nrewid.prop("disabled", true);
        } else {
            nrewid.prop("disabled", false);
        }
    });

    view.on('change', 'input[name="data[FormularzOceny][bCzyOdwolanie]"]', function () {
        var checkbox = $(this),
            elem = $('.element-odwolanie');

        if (checkbox.is(':checked')) {
            $('#FormularzOcenyBDataOdwolania').val(moment().format('YYYY-MM-DD'));
            elem.css('display', 'table-row');
        } else {
            elem.css('display', 'none');
        }
    });

    view.on('change', '.element-umc2', function () {
        var element, avg = avg_element_umc2();
        $('.element-umc3').each(function () {
            element = $(this);
            if (avg > element.data('w_min') && avg <= element.data('w_max')) {
                element.prop('checked', true);
            } else {
                element.prop('checked', false);
            }
        });
    });

    //=========================================
    //	END INIT LISTENER FORMULARZ
    //=========================================

    //=========================================
    //	START FUNCTIONS FORMULARZ
    //=========================================

    var elementyOcenyRodzaj = {
        Tytul: 'Tytul',
        Podtytul: 'Podtytul',
        ElementZwyczajny: 'ElementZwyczajny',
        ElementZwyczajnyUMC: 'ElementZwyczajnyUMC',
        ElementZwyczajnyUMC2: 'ElementZwyczajnyUMC2',
        ElementZwyczajnyUMC3: 'ElementZwyczajnyUMC3',
        Text: 'Text'
    }

    function avg_element_umc2() {
        var sum = 0, i = 0, res;
        $('.element-umc2').each(function () {
            sum += parseInt($(this).val());
            i++;
        });
        res = i > 0 ? sum / i : 0;
        $('#FormularzOcenyBOcena').val((Math.round(res * 10) / 10));
        return res;
    }

    function uuidv4() {
        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
            var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
            return v.toString(16);
        });
    }

    function parserSpanInput(txt, dir) {
        if (dir == 'toSpan') {
            return txt.replace(/(?:\r\n|\r|\n)/g, '<br>');//.replace(/>/g, "&gt;").replace(/</g, "&lt;");
        } else if (dir == 'toInput') {
            return txt.replace(/(?:<br>)/g, '\n');
        } else {
            return txt;
        }
    }

    function parserArrayString(value, dir) {
        if (value.cguid !== undefined) {
            if (typeof value.cguid === 'string') {
                value = new Array(value.cguid);
            } else {
                value = value.cguid
            }
        }

        if (dir == 'toString' && Array.isArray(value)) {
            if (value.length > 0) {
                return value.join('|');
            }
            return '';
        } else if (dir == 'toArray' && typeof value === 'string') {
            if (value !== '') {
                return value.split('|');
            }
            return [];
        }
    }

    function getWartosciOfRodzaj(element, swartosc) {
        switch (element.RodzajWartosci) {
            case 'wString':
                if (swartosc == 1) {
                    return parserWartosc(element.SWartosc1);
                } else if (swartosc == 2) {
                    return parserWartosc(element.SWartosc2);
                } else if (swartosc == 3) {
                    return parserWartosc(element.SWartosc3);
                } else {
                    return parserWartosc(element.SWartosc);
                }
                break;
            case 'wInt':
                return element.IWartosc;

            case 'wDecimal':
                return element.DWartosc;

            case 'wBool':
                return element.BWartosc;

            case 'wDostepneWartosci':
                return element.SWartosciMozliwe;

            case 'wNull':
                return '';
        }
    }

    function fillMaXHeight(element1, element2, element3) {

        var h1 = element1 !== undefined ? element1.height() : 0,
            h2 = element2 !== undefined ? element2.height() : 0,
            h3 = element3 !== undefined ? element3.height() : 0

        var maxValue = Math.max.apply(Math, [h1, h2, h3]);

        if (maxValue > 0) {
            if (element1 !== undefined) {
                element1.height(maxValue);
            }
            if (element2 !== undefined) {
                element2.height(maxValue);
            }
            if (element3 !== undefined) {
                element3.height(maxValue);
            }
        }
    }

    function parserWartosc(value) {
        return typeof value === 'string' ? value : value.toString();
    }

    function elementByRodzajWartosci(rodzaj, value, name, SGB) {
        var input = '',
            iconEdit = '<i class="fa fa-edit"></i>';

        value = value.replace(/(&#xD;)/g, ''); //powrot karetki
        value = value.replace(/&lt;/g, '<').replace(/&gt;/g, '>');

        switch (rodzaj) {

            case 'wString':
                input += '<textarea rows=3 class="form-control element-wartosc" name="data[FormularzOceny][' + name + '][SWartosc]"' +
                    (app.type == 'show' ? ' readonly="readonly"' : ' ') + '>' + value + '</textarea>';
                break;
            case 'wStringWyl':
                input += '<textarea rows=3 class="form-control element-wartosc" name="data[FormularzOceny][' + name + '][SWartosc]" readonly="readonly">' + value + '</textarea>';
                break;

            case 'wInt':
                input += '<input type="text" class="form-control input-125 element-wartosc" name="data[FormularzOceny][' + name + '][IWartosc]" value="' + value + '"' +
                    (app.type == 'show' ? ' readonly="readonly"' : ' ') + '/>';
                break;
            case 'wDecimal':
                input += '<input type="text" class="form-control input-125 element-wartosc" name="data[FormularzOceny][' + name + '][DWartosc]" value="' + value + '"' +
                    (app.type == 'show' ? ' readonly="readonly"' : ' ') + '/>';
                break;

            case 'wBool':
                input += '<input type="checkbox" class="element-wartosc" name="data[FormularzOceny][' + name + '][BWartosc]" ' + (value === 'true' ? 'checked' : '') +
                    (app.type == 'show' ? ' disabled="disabled"' : ' ') + '/>';
                break;

            case 'wDostepneWartosci':
                input += '<select class="form-control element-wartosc" name="data[FormularzOceny][' + name + '][SWartosc]"' +
                    (app.type == 'show' ? ' readonly="readonly"' : ' ') + '>';
                for (var i = 0; value.length; i++) {
                    input += '<option value="' + value[i] + '">' + value[i] + '</option>';
                }
                input += '</select>'
                break;

            case 'edytowacEtykieteTak':
                input += '<input type="hidden" class="element-etykieta" name="data[FormularzOceny][' + name + '][Etykieta]" value=\'' + value + '\' data-gid="' + name + '">'
                input += '<span class="element-etykieta">' + value + '</span> ';
                if (app.type !== 'show') {
                    input += iconEdit;
                }
                break;

            case 'edytowacEtykieteNie':
                input += '<input type="hidden" class="element-etykieta" name="data[FormularzOceny][' + name + '][Etykieta]" value=\'' + value + '\' data-gid="' + name + '">'
                input += '<span class="element-etykieta">' + value + '</span>';
                break;

            case 'edytowacOpisTak':
                input += '<input type="hidden" class="element-opis" name="data[FormularzOceny][' + name + '][Opis]" value=\'' + value + '\' data-gid="' + name + '">'
                input += '<span class="element-opis">' + value + '</span> ';
                if (app.type !== 'show') {
                    input += iconEdit;
                }
                break;

            case 'edytowacOpisNie':
                input += '<input type="hidden" class="element-opis" name="data[FormularzOceny][' + name + '][Opis]" value=\'' + value + '\' data-gid="' + name + '">'
                input += '<span class="element-opis">' + value + '</span>';
                break;

            case 'edytowacEtykiete2Tak':
                input += '<input type="hidden" class="element-etykieta" name="data[FormularzOceny][' + name + '][Etykieta]" value=\'' + value + '\' data-gid="' + name + '">'
                input += '<div class="element-etykieta" onfocusout="oceny.contentedit(\'Etykieta\',\'' + name + '\',this.innerText)" contenteditable="true">' + value + '</div> ';
                break;

            case 'edytowacEtykiete2Nie':
                input += '<input type="hidden" class="element-etykieta" name="data[FormularzOceny][' + name + '][Etykieta]" value=\'' + value + '\' data-gid="' + name + '">'
                input += '<div class="element-etykieta">' + value + '</div> ';
                break;

            case 'SWartosc1':
                if (SGB) {
                    input += '<label class="oceniany" style="font-size: 90%">podsumowanie realizacji celu (perspektywa pracownika)</label>';
                } else {
                    input += '<label class="oceniany" style="font-size: 90%">oceniany</label>';
                }
                input += '<input type="hidden" class="element-etykieta" name="data[FormularzOceny][' + name + '][SWartosc1]" value=\'' + value + '\' data-gid="' + name + '">'
                input += '<div style="border: 1px inset grey; text-align: left; padding: 5px; min-height: 30px" class="element-etykieta" onfocusout="oceny.contentedit(\'SWartosc1\',\'' + name + '\',this.innerText)" contenteditable="true">' + value + '</div> ';
                break;

            case 'SWartosc1Wyl':
                if (SGB) {
                    input += '<label class="oceniany" style="font-size: 90%">podsumowanie realizacji celu (perspektywa pracownika)</label>';
                } else {
                    input += '<label class="oceniany" style="font-size: 90%">oceniany</label>';
                }
                input += '<input type="hidden"  class="element-etykieta" name="data[FormularzOceny][' + name + '][SWartosc1]" value=\'' + value + '\' data-gid="' + name + '">'
                input += '<div style="border: 1px inset green; text-align: left; padding: 5px; min-height: 30px" class="element-etykieta">' + value + '</div> ';
                break;

            case 'SWartosc2':
                if (SGB) {
                    input += '<label class="oceniajacy" style="font-size: 90%">podsumowanie realizacji celu (perspektywa przełożonego)</label>';
                } else {
                    input += '<label class="oceniajacy" style="font-size: 90%">oceniajacy</label>';
                }
                input += '<input type="hidden" class="element-etykieta" name="data[FormularzOceny][' + name + '][SWartosc2]" value=\'' + value + '\' data-gid="' + name + '">'
                input += '<div style="border: 1px inset grey; text-align: left; padding: 5px; min-height: 30px" class="element-etykieta" onfocusout="oceny.contentedit(\'SWartosc2\',\'' + name + '\',this.innerText)" contenteditable="true">' + value + '</div> ';
                break;

            case 'SWartosc2Wyl':
                if (SGB) {
                    input += '<label class="oceniajacy" style="font-size: 90%">podsumowanie realizacji celu (perspektywa przełożonego)</label>';
                } else {
                    input += '<label class="oceniajacy" style="font-size: 90%">oceniajacy</label>';
                }
                input += '<input type="hidden" class="element-etykieta" name="data[FormularzOceny][' + name + '][SWartosc2]" value=\'' + value + '\' data-gid="' + name + '">'
                input += '<div style="border: 1px inset green; text-align: left; padding: 5px; min-height: 30px" class="element-etykieta">' + value + '</div> ';
                break;

            case 'SWartosc3':
                if (SGB) {
                    input += '<label class="informacja_zwrotna" style="font-size: 90%">podsumowanie realizacji celu (perspektywa współpracownika)</label>';
                } else {
                    input += '<label class="informacja_zwrotna" style="font-size: 90%">informacja zwrotna</label>';
                }
                input += '<input type="hidden" class="element-etykieta" name="data[FormularzOceny][' + name + '][SWartosc3]" value=\'' + value + '\' data-gid="' + name + '">'
                input += '<div style="border: 1px inset grey; text-align: left; padding: 5px; min-height: 30px" class="element-etykieta" onfocusout="oceny.contentedit(\'SWartosc3\',\'' + name + '\',this.innerText)" contenteditable="true">' + value + '</div> ';
                break;

            case 'SWartosc3Wyl':
                if (SGB) {
                    input += '<label class="informacja_zwrotna" style="font-size: 90%">podsumowanie realizacji celu (perspektywa współpracownika)</label>';
                } else {
                    input += '<label class="informacja_zwrotna" style="font-size: 90%">informacja zwrotna</label>';
                }
                input += '<input type="hidden" class="element-etykieta" name="data[FormularzOceny][' + name + '][SWartosc3]" value=\'' + value + '\' data-gid="' + name + '">'
                input += '<div style="border: 1px inset green; text-align: left; padding: 5px; min-height: 30px" class="element-etykieta">' + value + '</div> ';
                break;

            default:
                input += value;

        }

        return input;
    }

    var elementOcenyHtml = {
        Tytul: function (element) {
            var button = '';
            if ((element.CzyMoznaDodawac === 'true' && app.type !== 'show' && element.MozliweNoweElementy.length > 0) || displayButtonForce) {
                button += '<button style="margin-left: 15px;" class="btn btn-primary element-dodaj' + (element.CzyMoznaDodawac === 'true' ? '' : ' disabled') + '" data-gid="' + element.Gid + '">Dodaj</button>';
            }
            var col1 = $('<div class="col-xs-2" style="text-align: left; padding: 10px 0px 10px 0px;">')
                .append(button);
            var title = '<div style="display: inline-block; width: 100%;">' +
                '<div style="text-align: center; float: left; width: 97%;"><h4 style="color: white; margin-left: 3%;">' + parserWartosc(element.Tytul) + '</h4></div>' +
                '<div style="text-align: right; float: left; width: 3%; cursor: pointer;" class="element-direction"><i class="fa fa-arrow-circle-down" style="margin-top: 20%;" data-group="' + element.Nazwa + '"></i></div>' +
                '</div>';

            var div = $('<div class="col-xs-12" style="background-color: #00a65a; margin: 5px 0px 5px 0px;">').append(title);
            return $('<div class="row element-row" data-gid="' + element.Gid + '">').append(div).append(col1);
        },
        Podtytul: function (element, group) {
            var button = '';
            if ((element.CzyMoznaDodawac === 'true' && app.type !== 'show' && element.MozliweNoweElementy.length > 0) || displayButtonForce) {
                button += '<button style="margin-left: 15px;" class="btn btn-primary element-dodaj' + (element.CzyMoznaDodawac === 'true' ? '' : ' disabled') + '" data-gid="' + element.Gid + '">Dodaj</button>';
            }

            var title = '<span style="margin-left: -20%; font-size: 20px; font-weight: 600;">' + parserWartosc(element.Podtytul) + '</span>';
            var col1 = $('<div class="col-xs-2" style="text-align: left; padding: 10px 0px 10px 0px;">')
                .append(button);
            var col2 = $('<div class="col-xs-10" style="text-align: center; padding: 10px 0px 10px 0px;">')
                .append(title);

            if (element.CzyNiewidoczny === 'true') {
                return $('<div class="row element-row" data-group="hidden">');
            } else {
                return $('<div class="row element-row" data-group="' + group + '" data-gid="' + element.Gid + '">').append(col1).append(col2);
            }
        },
        ElementZwyczajny: function (element, group, SGB) {
            var table = $('<table class="element-table">'),
                tytulKolumny = '',
                wartoscKolumny = '',
                actionKolumny = '',
                countKolumny = 0,
                tytul = 0,
                style = 'border: 1px solid black;';

            if (element.CzyEtykieta === 'true') {
                if (parserWartosc(element.TytulKolumnyEtykiety) !== '') {
                    tytul++;
                }
                tytulKolumny += '<td style="' + style + '"><span class="element-tytul" style="font-weight: bold">' + parserWartosc(element.TytulKolumnyEtykiety) + '</span></td>';
                wartoscKolumny += '<td style="' + style + '">' + elementByRodzajWartosci(
                    (element.CzyMoznaEdytowacEtykiete === 'true' ? 'edytowacEtykiete2Tak' : 'edytowacEtykiete2Nie'),
                    parserWartosc(element.Etykieta), element.Nazwa, SGB) + '</span></td>';
                countKolumny++;
            }

            if (element.CzyWartosc === 'true') {
                if (parserWartosc(element.TytulKolumnyWartosci) !== '') {
                    tytul++;
                }
                tytulKolumny += '<td style="' + style + '"><span class="element-tytul" style="font-weight: bold">' + parserWartosc(element.TytulKolumnyWartosci) + '<span></td>';
                wartoscKolumny += '<td style="' + style + '">';
                if (element.CzySwartoscWidoczna === 'true') {
                    wartoscKolumny += elementByRodzajWartosci(
                        element.CzySwartoscWlaczona === 'true' ? 'wString' : 'wStringWyl', getWartosciOfRodzaj(element), element.Nazwa, SGB)
                } else if (element.CzySwartosc1Widoczna === 'true' || element.CzySwartoscWidoczna2 === 'true' || element.CzySwartosc3Widoczna === 'true') {
                    if (element.CzySwartosc1Widoczna === 'true') {
                        wartoscKolumny += elementByRodzajWartosci(
                            element.CzySwartosc1Wlaczona === 'false' || app.type == 'show' ? 'SWartosc1Wyl' : 'SWartosc1', getWartosciOfRodzaj(element, 1), element.Nazwa, SGB)
                    }
                    if (element.CzySwartosc2Widoczna === 'true') {
                        wartoscKolumny += elementByRodzajWartosci(
                            element.CzySwartosc2Wlaczona === 'false' || app.type == 'show' ? 'SWartosc2Wyl' : 'SWartosc2', getWartosciOfRodzaj(element, 2), element.Nazwa, SGB)
                    }
                    if (element.CzySwartosc3Widoczna === 'true') {
                        wartoscKolumny += elementByRodzajWartosci(
                            element.CzySwartosc3Wlaczona === 'false' || app.type == 'show' ? 'SWartosc3Wyl' : 'SWartosc3', getWartosciOfRodzaj(element, 3), element.Nazwa, SGB)
                    }
                } else {
                    wartoscKolumny += '<td style="' + style + '">' + elementByRodzajWartosci(
                        element.RodzajWartosci, getWartosciOfRodzaj(element), element.Nazwa, SGB) + '</td>';
                    countKolumny++;
                }
                wartoscKolumny += '</td>';
                countKolumny++;
            }

            if (element.CzyOpis === 'true') {
                if (parserWartosc(element.TytulKolumnyOpisu) !== '') {
                    tytul++;
                }
                tytulKolumny += '<td style="' + style + '"><span class="element-tytul" style="font-weight: bold">' + parserWartosc(element.TytulKolumnyOpisu) + '</span></td>';
                wartoscKolumny += '<td style="' + style + '">' +
                    elementByRodzajWartosci(
                        (element.CzyMoznaEdytowacOpis === 'true' ? 'edytowacOpisTak' : 'edytowacOpisNie'),
                        parserWartosc(element.Opis), element.Nazwa, SGB) + '</td>';
                countKolumny++;
            }

            actionKolumny += '<td colspan="' + countKolumny + '" style="text-align: right"><span class="btn-group">';
            if ((element.CzyMoznaUsunac === 'true' && app.type !== 'show') || displayButtonForce) {
                actionKolumny += '<button class="btn btn-danger element-usun' + (element.CzyMoznaUsunac === 'true' ? '' : ' disabled') + '">usuń</button>';
            }
            if ((element.CzyMoznaUdostepnic === 'true' && app.type !== 'show') || displayButtonForce) {
                var cgiud = parserArrayString(element.Udostepnienie, 'toString');
                actionKolumny += '<button class="btn ' + (cgiud !== '' ? 'btn-success' : 'btn-default') + ' element-udostepnij' + (element.CzyMoznaUdostepnic === 'true' ? '' : ' disabled') + '" data-gid="' + element.Gid + '">proszę o informację zwrotną</button>';
                actionKolumny += '<input type="hidden" name="data[FormularzOceny][' + element.Nazwa + '][Udostepnienie]" value="' + cgiud + '"/>';
            }
            actionKolumny += '</span></td>';


            if (tytul > 0) {
                if (wartoscKolumny !== '') {
                    table.append($('<tr width="35%">').append(tytulKolumny));
                } else {
                    table.append($('<tr>').append(tytulKolumny));
                }
            }

            if (wartoscKolumny !== '') {
                table.append($('<tr width="30%" class="element-table-row">').append(wartoscKolumny));
                table.append($('<tr width="35%">').append(actionKolumny));
            }

            table.addClass('table');
            table.css('table-layout', 'fixed');

            var div = $('<div class="col-xs-12" style="text-align: center;">');
            if (tytul > 0 || wartoscKolumny !== '') {
                div.append(table);
            }

            if (element.CzyNiewidoczny === 'true') {
                return $('<div class="row element-row" data-group="hidden">');
            } else {
                return $('<div class="row element-row" data-group="' + group + '" data-gid="' + element.Gid + '">').append(div);
            }
        },
        ElementZwyczajnyUMC: function (element, group) {
            var table = $('<table class="element-table">'),
                wartoscKolumny = '',
                actionKolumny = '',
                countKolumny = 0,
                i = 0,
                selected = '',
                style = 'padding: 0 0 0 0;',
                items;

            if (Array.isArray(element.SEtykietyMozliwe.cstring)) {
                items = element.SEtykietyMozliwe.cstring;
            } else if (typeof element.SEtykietyMozliwe.cstring == 'string') {
                items = [element.SEtykietyMozliwe.cstring];
            } else {
                items = [];
            }

            wartoscKolumny += '<td style="' + style + '">';
            wartoscKolumny += '<select name="data[FormularzOceny][' + element.Nazwa + '][Etykieta]" style="width: 100%; height: 100%; text-align-last: center; min-height: 40px;" ' +
                (element.CzyMoznaEdytowacEtykiete === 'true' ? '' : 'disabled') + '>';
            for (i in items) {
                selected = parserWartosc(element.Etykieta) == items[i] ? 'selected' : '';
                wartoscKolumny += '<option value="' + items[i] + '" ' + selected + '>' + items[i] + '</option>';
            }
            wartoscKolumny += '</select>';
            wartoscKolumny += '</td>';
            countKolumny++;

            wartoscKolumny += '<td style="' + style + '">';
            wartoscKolumny += '<select name="data[FormularzOceny][' + element.Nazwa + '][DWartosc]" style="width: 100%; height: 100%; text-align-last: center; min-height: 40px;" ' +
                (element.CzyMoznaEdytowacOpis === 'true' ? '' : 'disabled') + '>';
            for (i = element.DWartoscMin; i <= element.DWartoscMax; i++) {
                selected = element.DWartosc == i ? 'selected' : '';
                wartoscKolumny += '<option value="' + i + '" ' + selected + '>' + i + '</option>';
            }
            wartoscKolumny += '</select>';
            wartoscKolumny += '</td>';
            countKolumny++;

            actionKolumny += '<td colspan="' + countKolumny + '" style="text-align: right"><span class="btn-group">';
            if ((element.CzyMoznaUsunac === 'true' && app.type !== 'show') || displayButtonForce) {
                actionKolumny += '<button class="btn btn-danger element-usun' + (element.CzyMoznaUsunac === 'true' ? '' : ' disabled') + '">usuń</button>';
            }
            if ((element.CzyMoznaUdostepnic === 'true' && app.type !== 'show') || displayButtonForce) {
                var cgiud = parserArrayString(element.Udostepnienie, 'toString');
                actionKolumny += '<button class="btn ' + (cgiud !== '' ? 'btn-success' : 'btn-default') + ' element-udostepnij' + (element.CzyMoznaUdostepnic === 'true' ? '' : ' disabled') + '" data-gid="' + element.Gid + '">proszę o informację zwrotną</button>';
                actionKolumny += '<input type="hidden" name="data[FormularzOceny][' + element.Nazwa + '][Udostepnienie]" value="' + cgiud + '"/>';
            }
            actionKolumny += '</span></td>';


            if (wartoscKolumny !== '') {
                table.append($('<tr width="30%" class="element-table-row">').append(wartoscKolumny));
                table.append($('<tr width="35%">').append(actionKolumny));
            }

            table.addClass('table');
            table.css('table-layout', 'fixed');

            var div = $('<div class="col-xs-12" style="text-align: center;">');
            if (wartoscKolumny !== '') {
                div.append(table);
            }

            if (element.CzyNiewidoczny === 'true') {
                return $('<div class="row element-row" data-group="hidden">');
            } else {
                return $('<div class="row element-row" data-group="' + group + '" data-gid="' + element.Gid + '">').append(div);
            }
        },
        ElementZwyczajnyUMC2: function (element, group) {
            var table = $('<table class="element-table">'),
                wartoscKolumny = '',
                actionKolumny = '',
                countKolumny = 0,
                i = 0,
                selected = '',
                style = 'border: 1px solid black;';


            wartoscKolumny += '<td style="' + style + '">' + elementByRodzajWartosci(
                'edytowacEtykiete2Nie', parserWartosc(element.Etykieta), element.Nazwa) + '</span></td>';
            countKolumny++;

            wartoscKolumny += '<td style="' + style + '">';
            wartoscKolumny += '<select class="element-umc2" name="data[FormularzOceny][' + element.Nazwa + '][DWartosc]" style="width: 100%; height: 100%; text-align-last: center; min-height: 40px;"' +
                (element.CzyMoznaEdytowacOpis === 'true' ? '' : 'disabled') + '>';
            for (i = element.DWartoscMin; i <= element.DWartoscMax; i++) {
                selected = element.DWartosc == i ? 'selected' : '';
                if (wartoscKolumny.length < 65000) {
                    wartoscKolumny += '<option value="' + i + '" ' + selected + '>' + i + '</option>';
                }
            }
            wartoscKolumny += '</select>';
            wartoscKolumny += '</td>';
            countKolumny++;

            actionKolumny += '<td colspan="' + countKolumny + '" style="text-align: right"><span class="btn-group">';
            if ((element.CzyMoznaUsunac === 'true' && app.type !== 'show') || displayButtonForce) {
                actionKolumny += '<button class="btn btn-danger element-usun' + (element.CzyMoznaUsunac === 'true' ? '' : ' disabled') + '">usuń</button>';
            }
            if ((element.CzyMoznaUdostepnic === 'true' && app.type !== 'show') || displayButtonForce) {
                var cgiud = parserArrayString(element.Udostepnienie, 'toString');
                actionKolumny += '<button class="btn ' + (cgiud !== '' ? 'btn-success' : 'btn-default') + ' element-udostepnij' + (element.CzyMoznaUdostepnic === 'true' ? '' : ' disabled') + '" data-gid="' + element.Gid + '">proszę o informację zwrotną</button>';
                actionKolumny += '<input type="hidden" name="data[FormularzOceny][' + element.Nazwa + '][Udostepnienie]" value="' + cgiud + '"/>';
            }
            actionKolumny += '</span></td>';


            if (wartoscKolumny !== '') {
                table.append($('<tr width="30%" class="element-table-row">').append(wartoscKolumny));
                table.append($('<tr width="35%">').append(actionKolumny));
            }

            table.addClass('table');
            table.css('table-layout', 'fixed');

            var div = $('<div class="col-xs-12" style="text-align: center;">');
            if (wartoscKolumny !== '') {
                div.append(table);
            }

            if (element.CzyNiewidoczny === 'true') {
                return $('<div class="row element-row" data-group="hidden">');
            } else {
                return $('<div class="row element-row" data-group="' + group + '" data-gid="' + element.Gid + '">').append(div);
            }
        },
        ElementZwyczajnyUMC3: function (element, group) {
            var table = $('<table class="element-table">'),
                wartoscKolumny = '',
                countKolumny = 0,
                style = 'border: 1px solid black;';

            wartoscKolumny += '<td style="' + style + '">' + elementByRodzajWartosci(
                'edytowacEtykiete2Nie', parserWartosc(element.Etykieta), element.Nazwa) + '</span></td>';
            countKolumny++;

            var value, avg = avg_element_umc2();

            if (avg > element.DWartoscMin && avg <= element.DWartoscMax) {
                value = 'true';
            } else {
                value = 'false';
            }

            wartoscKolumny += '<td style="' + style + '">' +
                '<input type="checkbox" class="element-wartosc element-umc3" data-w_min="' + element.DWartoscMin + '" data-w_max="' + element.DWartoscMax + '" name="data[FormularzOceny][' + element.Nazwa + '][BWartosc]" ' + (value === 'true' ? 'checked' : '') + ' disabled="disabled"/>' +
                '</td>';
            countKolumny++;


            wartoscKolumny += '<td style="' + style + '">' +
                elementByRodzajWartosci(
                    'edytowacOpisNie', parserWartosc(element.Opis), element.Nazwa) + '</td>';
            countKolumny++;

            if (wartoscKolumny !== '') {
                table.append($('<tr width="30%" class="element-table-row">').append(wartoscKolumny));
            }

            table.addClass('table');
            table.css('table-layout', 'fixed');

            var div = $('<div class="col-xs-12" style="text-align: center;">');
            if (wartoscKolumny !== '') {
                div.append(table);
            }

            if (element.CzyNiewidoczny === 'true') {
                return $('<div class="row element-row" data-group="hidden">');
            } else {
                return $('<div class="row element-row" data-group="' + group + '" data-gid="' + element.Gid + '">').append(div);
            }
        },
        Text: function (element, group, SGB) {
            var input = '<div class="form-group">' +
                '<label>' + element.Podtytul + '</label>' +
                '<input type="text" placeholder="Data spotkania" name="data[FormularzOceny][' + element.Nazwa + '][Data]" class="form-control datepicker-from input-125" value="' + element.Data + '"' +
                (app.type == 'show' ? ' readonly="readonly"' : ' ') + '><br>' +
                '<textarea class="form-control element-wartosc" rows="3" placeholder="Podsumowanie spotkania" name="data[FormularzOceny][' + element.Nazwa + '][SWartosc1]"' +
                (app.type == 'show' ? ' readonly="readonly"' : ' ') + '>' + element.SWartosc + '</textarea></div>';

            var button = '<div style="width: 100%; text-align: right"><span class="btn-group">';

            if ((element.CzyMoznaUsunac === 'true' && app.type !== 'show') || displayButtonForce) {
                button += '<button class="btn btn-danger element-usun' + (element.CzyMoznaUsunac === 'true' ? '' : ' disabled') + '">usuń</button>';
            }
            if ((element.CzyMoznaUdostepnic === 'true' && app.type !== 'show') || displayButtonForce) {
                var cgiud = parserArrayString(element.Udostepnienie, 'toString');
                button += '<button class="btn ' + (cgiud !== '' ? 'btn-success' : 'btn-default') + ' element-udostepnij' + (element.CzyMoznaUdostepnic === 'true' ? '' : ' disabled') + '" data-gid="' + element.Gid + '">proszę o informację zwrotną</button>';
                button += '<input type="hidden" name="data[FormularzOceny][' + element.Nazwa + '][Udostepnienie]" value="' + cgiud + '"/>';
            }
            button += '</span></div>';

            var div = $('<div class="col-xs-12" style="text-align: center;">');

            if (element.CzyWartosc === 'true') {
                div.append(input).append(button);
            }

            if (element.CzyNiewidoczny === 'true') {
                return $('<div class="row element-row" data-group="hidden">');
            } else {
                return $('<div class="row element-row" data-group="' + group + '" data-gid="' + element.Gid + '">').append(div);
            }
        }
    }

    /**
     * @return ElementOceny
     */
    function ElementOcenySearch(gid) {
        var element = null;

        $.each(elementyOceny, function (idx, element1) {
            var i = 0, j = 0, k = 0,
                element2 = null,
                element3 = null,
                element4 = null;

            if (element1.Gid == gid) {
                element = element1;
                return false;
            }
            if (element1.Elementy.length > 0) {
                //drugi poziom podtytul
                for (i = 0; i < element1.Elementy.length; i++) {
                    element2 = new ElementOceny(element1.Elementy[i]);
                    if (element2.Gid == gid) {
                        element = element2;
                        return false;
                    }
                    // trzeci poziom element zwykly
                    for (j = 0; j < element2.Elementy.length; j++) {
                        element3 = new ElementOceny(element2.Elementy[j]);
                        if (element3.Gid == gid) {
                            element = element3;
                            return false;
                        }
                        //czwarty poziom element text
                        for (k = 0; k < element3.Elementy.length; k++) {
                            element4 = new ElementOceny(element3.Elementy[k]);
                            if (element4.Gid == gid) {
                                element = element4;
                                return false;
                            }
                        }
                    }
                }
            }
        });

        return element;
    }

    function ElementData(data) {

        if (typeof data !== 'object') {
            throw new Error("element is not object");
        }

        this.Imie = data.Imie
        this.KomorkaKod = data.KomorkaKod;
        this.KomorkaKodOpis = data.KomorkaKodOpis;
        this.Nazwisko = data.Nazwisko;
        this.Ni = data.Ni;
        this.Nrewid = data.Nrewid;
        this.StanowiskoKod = data.StanowiskoKod;
        this.StanowiskoKodOpis = data.StanowiskoKodOpis;
        this.AdresOcenianego = data.bAdresOcenianego;
        this.AdresPrzelozonego = data.bAdresPrzelozonego0;
        this.AdresTworcy = data.bAdresTworcy;
        this.CzyArchiwalny = data.bCzyArchiwalny;
        this.CzyMozeArchiwizowac = data.bCzyMozeArchiwizowac;
        this.CzyMozeDodac = data.bCzyMozeDodac;
        this.CzyMozeEdytowac = data.bCzyMozeEdytowac;
        this.CzyMozeOpublikowac = data.bCzyMozeOpublikowac;
        this.CzyMozePrzegladac = data.bCzyMozePrzegladac;
        this.CzyMozePrzywrocic = data.bCzyMozePrzywrocic;
        this.CzyMozeUsunac = data.bCzyMozeUsunac;
        this.CzyMozeZdjac = data.bCzyMozeZdjac;
        this.CzyOdwolanie = data.bCzyOdwolanie;
        this.CzyUMC = data.bCzyUMC;
        this.CzyOpublikowany = data.bCzyOpublikowany;
        this.DataOceny = data.bDataOceny;
        this.DataPublikacji = data.bDataPublikacji;
        this.DataUtworzenia = data.bDataUtworzenia;
        this.DataWystawieniaOceny = data.bDataWystawieniaOceny;
        this.Gid = data.bGid;
        this.Info = data.bInfo;
        this.Nazwa = data.Nazwa;
        this.Ocena = data.bOcena;
        this.Odwolanie = data.bOdwolanie;
        this.Powod = data.bPowod;
        this.OkresOcenyDo = data.bOkresOcenyDo;
        this.OkresOcenyOd = data.bOkresOcenyOd
        this.Rodzaj = data.bRodzaj;
        this.Powiazanie = data.bPowiazanie;
    }

    function setElementy(elementy) {
        if (elementy.bElementOceny === undefined) {
            return [];
        } else if (Array.isArray(elementy.bElementOceny) == false) {
            return Array(elementy.bElementOceny);
        } else {
            return elementy.bElementOceny
        }
    }

    function ElementOceny(element, SGB) {

        if (typeof element !== 'object') {
            throw new Error("element is not object");
        }

        this.BWartosc = element.bBWartosc;
        this.CzyEtykieta = element.bCzyEtykieta;
        this.CzyMoznaDodawac = element.bCzyMoznaDodawac;
        this.CzyMoznaEdytowacEtykiete = element.bCzyMoznaEdytowacEtykiete;
        this.CzyMoznaEdytowacOpis = element.bCzyMoznaEdytowacOpis;
        this.CzyMoznaUdostepnic = element.bCzyMoznaUdostepnic;
        this.CzyMoznaUsunac = element.bCzyMoznaUsunac;
        this.CzyNiewidoczny = element.bCzyNiewidoczny;
        this.CzyOpis = element.bCzyOpis;
        this.CzySwartosc1Widoczna = element.bCzySwartosc1Widoczna;
        this.CzySwartosc1Wlaczona = element.bCzySwartosc1Wlaczona;
        this.CzySwartosc2Widoczna = element.bCzySwartosc2Widoczna;
        this.CzySwartosc2Wlaczona = element.bCzySwartosc2Wlaczona;
        this.CzySwartosc3Widoczna = element.bCzySwartosc3Widoczna;
        this.CzySwartosc3Wlaczona = element.bCzySwartosc3Wlaczona;
        this.CzySwartoscWidoczna = element.bCzySwartoscWidoczna;
        this.CzySwartoscWlaczona = element.bCzySwartoscWlaczona;
        this.CzyTylkoDoOdczytu = element.bCzyTylkoDoOdczytu;
        this.CzyWartosc = element.bCzyWartosc;
        this.CzyWyliczanyPrzezUsulge = element.bCzyWyliczanyPrzezUsulge;
        this.Data = element.bData;
        this.DWartosc = element.bDWartosc;
        this.DWartoscMax = element.bDWartoscMax;
        this.DWartoscMin = element.bDWartoscMin;
        this.Elementy = setElementy(element.bElementy);
        this.Etykieta = element.bEtykieta;
        this.Gid = element.bGid;
        this.GidFormularza = element.bGidFormularza;
        this.GidRodzica = element.bGidRodzica;
        this.GidStatyczny = element.bGidStatyczny;
        this.IWartosc = element.bIWartosc;
        this.IWartoscMax = element.bIWartoscMax;
        this.IWartoscMin = element.bIWartoscMin;
        this.Indeks = element.bIndeks;
        this.MozliweNoweElementy = setElementy(element.bMozliweNoweElementy);
        this.Nazwa = element.bNazwa;
        this.Opis = element.bOpis;
        this.Podtytul = element.bPodtytul;
        this.Rodzaj = element.bRodzaj;
        this.RodzajWartosci = element.bRodzajWartosci;
        this.SEtykietyMozliwe = element.bSEtykietyMozliwe;
        this.SWartosc = element.bSWartosc;
        this.SWartosc1 = element.bSWartosc1;
        this.SWartosc2 = element.bSWartosc2;
        this.SWartosc3 = element.bSWartosc3;
        this.SWartosciMozliwe = element.bSWartosciMozliwe;
        this.Tytul = element.bTytul;
        this.TytulKolumnyEtykiety = element.bTytulKolumnyEtykiety;
        this.TytulKolumnyOpisu = element.bTytulKolumnyOpisu;
        this.TytulKolumnyWartosci = element.bTytulKolumnyWartosci;
        this.Udostepnienie = element.bUdostepnienie;

    }

    function buildElement(element, group, sgb) {
        switch (element.Rodzaj) {
            case elementyOcenyRodzaj.Tytul:
                return elementOcenyHtml.Tytul(element);
            case elementyOcenyRodzaj.Podtytul:
                return elementOcenyHtml.Podtytul(element, group);
            case elementyOcenyRodzaj.ElementZwyczajny:
                return elementOcenyHtml.ElementZwyczajny(element, group, sgb);
            case elementyOcenyRodzaj.ElementZwyczajnyUMC:
                return elementOcenyHtml.ElementZwyczajnyUMC(element, group);
            case elementyOcenyRodzaj.ElementZwyczajnyUMC2:
                return elementOcenyHtml.ElementZwyczajnyUMC2(element, group);
            case elementyOcenyRodzaj.ElementZwyczajnyUMC3:
                return elementOcenyHtml.ElementZwyczajnyUMC3(element, group);
            case elementyOcenyRodzaj.Text:
                return elementOcenyHtml.Text(element, group, sgb);
            default:
                return '';
        }
    }

    function sumWartosc() {
        var wartosc = 0, val = null;
        $('.element-wartosc').each(function (idx, input) {
            val = parseInt($(input).val());
            if (isNaN(val) == false) {
                wartosc += val;
            }
        });
        return wartosc;
    }

    //=========================================
    //	END FUNCTIONS FORMULARZ
    //=========================================


    console.log('v1.0');

    var app = {
        type: '',
        setType: function (type) {
            this.type = type
        },
        loadElementyOceny: function (elements, SGB) {
            $.each(elements, function (idx, element) {
                elementyOceny.push(new ElementOceny(element, SGB));
            });
        },
        loadData: function (data) {
            elementData = new ElementData(data);
        },
        buildElementyOceny: function (SGB) {
            var build = false, wartosc = 0;
            body = $('.ocena-build');
            $.each(elementyOceny, function (idx, element1) {
                var i = 0, j = 0, k = 0,
                    element2 = null,
                    element3 = null,
                    element4 = null;

                var group = element1.Nazwa;
                //pierwszy poziom title
                body.append(buildElement(element1, group, SGB));
                if (element1.Elementy.length > 0) {
                    //drugi poziom podtytul
                    for (i = 0; i < element1.Elementy.length; i++) {
                        element2 = new ElementOceny(element1.Elementy[i], SGB);
                        body.append(buildElement(element2, group, SGB));
                        // trzeci poziom element zwykly
                        for (j = 0; j < element2.Elementy.length; j++) {
                            element3 = new ElementOceny(element2.Elementy[j], SGB);
                            body.append(buildElement(element3, group, SGB));
                            //czwarty poziom element text
                            for (k = 0; k < element3.Elementy.length; k++) {
                                element4 = new ElementOceny(element3.Elementy[k], SGB);
                                body.append(buildElement(element4, group, SGB));
                            }
                        }
                    }
                }
                build = true;
            });

            /* TODO do wykorzystania w przyszlosci
            if (build) {
                wartosc = sumWartosc();
            }

            var sum = '<div class="row" style="border: #0c0c0c solid 1px; margin: 15px 0 5px 0;">' +
                '<div class="col-xs-8 text-center"><label>Ocena roczna:</label></div>' +
                '<div class="col-xs-4 text-center"><span class="element-sum">' + wartosc + '</span> pkt.</div>' +
                '</div>'

            body.append(sum);
             */

        },
        renderWartoscHeight: function () {
            $('.element-table-row').each(function () {
                var row = $(this),
                    elem = row.find('.element-wartosc'),
                    h1 = row.height();
                if (elem.length > 0 && (h1 - 31) > elem.height()) {
                    elem.height((h1 - 31));
                }
            });
        },
        resizeHeightToContent: function () {
            $('textarea.element-wartosc').each(function () {
                $(this).height(this.scrollHeight);
            });
        },
        contentedit: function (typ, name, txt) {
            var input = $('input[name="data[FormularzOceny][' + name + '][' + typ + ']"]');
            if (input.length >= 1) {
                input.val(txt);
            }
        }
    }

    return app;

})(jQuery);
