function _myform2(key, token, ajaxvalidation, clear_key, scrolling_to_err) {

    var obj = this;

    this.key = key;
    this.clear_key = clear_key;
    this.token = token;

    this.DOM_form = null;

    this.ajaxValidate = false;
    this.scrolling_to_err = false;

    this.fields_multi = [];
    this.fields_ajax = [];

    this.init = function() {
        obj.getDomElements();
        obj.blockEnterKeyPress();
        obj.tabEngine();
        obj.additionalFunctions();
        obj.runMultiSelect();
        obj.runAjaxFields();
        obj.fieldEvents();
        obj.maskStart();
        obj.imageCheckbox();
        obj.imageRadio();
        obj.selectFieldPopup();
        obj.ajaxFieldPopup();
        obj.fixedScrollBar();
        obj.myform2CancelInfo();

        if(ajaxvalidation==1) {
            obj.ajaxValidate = new _ajaxvalidation(obj.DOM_form, key, token);
        }
        if(scrolling_to_err==1) {
            this.scrolling_to_err = scrolling_to_err;
            obj.scrollErrors();
        }
    };

    this.getDomElements = function() {
        obj.DOM_form = $(".myform2_"+key);
    };

    this.blockEnterKeyPress = function() {
        $(obj.DOM_form).find('input').keypress(function(e){
            if (e.which == 13) {
                return false;
            }
        });
    }

    this.tabEngine = function() {
        $(obj.DOM_form).find(".myform2_tab_multi_box_all").each(function(){
            var tabs_box = $(this);
            var buttons = $(tabs_box).children(".myform2_tab_multi_buttons").children("li");
            var tabs = $(tabs_box).children(".row").children("div").children(".myform2_tab_box");
            var max_in_one_time = $(tabs_box).attr("maxinonetime");

            var active_count = 0;

            setDefault();
            buttonsClickEvent();


            function setDefault() {
                var first_index = 0;
                var find_error = false;
                $(buttons).each(function(){
                    if($(this).hasClass("error")&&find_error==false) {
                        find_error = true;
                        first_index = $(this).index();
                    }
                });
                $(tabs).eq(first_index).closest(".row").addClass("on");
                $(buttons).eq(first_index).addClass("on");
                active_count = 1;
            }

            function buttonsClickEvent() {
                $(buttons).click(function(){
                    var button = $(this);
                    if(max_in_one_time>1) {
                        if ($(button).hasClass("on")) {
                            hideTab($(this));
                        }
                        else {
                            showTab($(this));
                        }
                    }
                    else {
                        hideAllTab();
                        showTab($(this));
                    }
                });
            }

            function showTab(button) {
                if(active_count<max_in_one_time) {
                    active_count++;
                    $(button).addClass("on");
                    var index = $(button).index();
                    $(tabs).eq(index).closest(".row").addClass("on");
                    setTabWidth();
                    $(obj.DOM_form).trigger('heightChange');
                }
            }

            function hideTab(button) {
                if(active_count>1) {
                    active_count--;
                    $(button).removeClass("on");
                    var index = $(button).index();
                    $(tabs).eq(index).closest(".row").removeClass("on");
                    setTabWidth();
                }
            }

            function hideAllTab() {
                active_count = 0;
                $(buttons).removeClass("on");
                $(tabs).closest(".row").removeClass("on");
            }

            function setTabWidth() {
                var lp = 0;
                var percent_width = 100/active_count;
                $(tabs).each(function(){
                    var tab = $(this);
                    var row = $(tab).closest(".row");
                    if($(row).hasClass("on")) {
                        lp++;
                        $(row).css("width",percent_width+"%");

                        $(row).css("padding-right","2px");
                    }
                    else {
                        $(row).css("padding-right","0px");
                    }
                });

                var lp = 0;
                $(buttons).each(function(){
                    var button = $(this);
                    if($(button).hasClass("on")) {
                        lp++;
                        if(lp>1) {
                            $(button).css({
                                'position':'absolute',
                                'top':0,
                                'left':((lp-1)*percent_width)+"%"
                            });
                        }
                        else {
                            $(button).css({'position':'static'});
                        }
                    }
                    else {
                        $(button).css({'position':'static'});
                    }
                });
            }
        });
    };

    this.commatodot = function() {
        var fields = $(".commatodot");
        if(fields.length>0) {
            $(fields).each(function(){
                var field = $(this);
                $(field).keyup(function(){
                    var val = $(this).val().replace(",",".");
                    $(this).val(val);
                });
            });
        }
    };

    this.fileclear = function() {
        $(".file_clear").click(function(){
            $(this).closest(".file_box").find(".file_field").fadeIn(0);
            $(this).closest(".file_box").find(".file_result").remove();
            return false;
        });
    };

    this.additionalFunctions = function() {
        obj.commatodot();
        obj.fileclear();
    };

    this.runMultiSelect = function() {
        $(obj.DOM_form).find(".select_multi_box").each(
            function() {
                if(!$(this).hasClass("run")) {
                    let multi_obj = new _multiSelect(obj, $(this));
                    obj.fields_multi.push(multi_obj);
                    $(this).addClass("run");
                }
            }
        );
    };

    this.findMultiSelectByName = function(name) {
        var finded_obj = null;
        obj.fields_multi.forEach(function(multi_obj){
            if(multi_obj.field_name==name) {
                finded_obj = multi_obj;
            }
        });
        return finded_obj;
    }

    this.getValues = function() {
        obj.getDomElements();
        return $(obj.DOM_form).serialize();
    };

    this.checkRelations = function(name) {
        if(obj.fields_multi.length>0) {
            obj.fields_multi.forEach(function(v){
                v.relationsEvent(name);
            });
        }
        if(obj.fields_ajax.length>0) {
            obj.fields_ajax.forEach(function(v){
                v.relationsEvent(name);
            });
        }
    };

    this.runAfterEvent = function(name) {
        if(name!=undefined) {
            obj.ajaxValidateFunc(name);
            obj.checkRelations(name);
        }
    };

    this.ajaxValidateFunc = function(name) {
        if(obj.ajaxValidate!==false) {
            obj.ajaxValidate.runAfterEvent(name);
        }
    };

    this.runAjaxFields = function() {
        $(obj.DOM_form).find(".ajax_field").each(
            function() {
                obj.fields_ajax.push(new _ajaxfields(obj, $(this), obj.token));
            }
        );
    };

    this.fieldEvents = function() {
        let bounce = null;
        $(obj.DOM_form).find("input").bind('keyup input',function(){
            clearTimeout(bounce);
            var field = $(this);
            bounce = setTimeout(function(){
                var name = $(field).attr("name");
                obj.runAfterEvent(name);
            },100);
        });

        $(obj.DOM_form).find('input[type="checkbox"]').bind('click',function(){
            var field = $(this);
            var name = $(field).attr("name");
            obj.runAfterEvent(name);
        });

        $(obj.DOM_form).find('input[type="radio"]').bind('click',function(){
            var field = $(this);
            var name = $(field).attr("name");
            obj.runAfterEvent(name);
        });

        $(obj.DOM_form).find('input[type="hidden"]').bind('change',function(){
            var field = $(this);
            var name = $(field).attr("name");
            obj.runAfterEvent(name);
        });

        $(obj.DOM_form).find("select").change(function () {
            var field = $(this);
            var name = $(field).attr("name");
            obj.runAfterEvent(name);
        });

        $(obj.DOM_form).find('input.input_date_clear').each(function(){
            $(this).on('changeDate', function(e) {
                if($(this).hasClass("run")) {
                    var field = $(this);
                    var name = $(field).attr("name");
                    obj.runAfterEvent(name);
                }
                else {
                    $(this).addClass("run");
                }
            });
        });

        setTimeout(function(){
            if(typeof CKEDITOR!=='undefined') {
                var cke_timeout = null;
                for (var i in CKEDITOR.instances) {
                    if($(CKEDITOR.instances[i].element).attr('data-css')) {
                        CKEDITOR.instances[i].config.contentsCss = $(CKEDITOR.instances[i].element).attr('data-css');
                    }
                    if($(CKEDITOR.instances[i].element).attr('data-style-set')) {
                        CKEDITOR.instances[i].config.stylesSet = $(CKEDITOR.instances[i].element).attr('data-style-set');
                    }
                    CKEDITOR.instances[i].on('change', function () {
                        clearTimeout(cke_timeout);
                        var ckedit = this;
                        cke_timeout = setTimeout(function () {
                            var val = ckedit.getData();
                            var text_area = ckedit.element.$;
                            $(text_area).val(val);
                            var name = $(text_area).attr("name");
                            if (name.search(obj.key) == 0) {
                                obj.runAfterEvent(name);
                            }
                        }, 100);
                    });
                }
            }
        },30);
    };

    this.maskStart = function() {
        $(obj.DOM_form).find("input").each(
            function(){
                var input = $(this);
                var mask = $(this).attr("data-mask");
                if(mask!=''&&mask!=undefined) {
                    $(input).mask(mask);
                }
            }
        );
    };

    this.imageCheckbox = function() {
        $(obj.DOM_form).find(".checkbox_image_box").each(function(){
            new _imageCheckbox($(this));
        });
    };

    this.imageRadio = function() {
        $(obj.DOM_form).find(".field_radio_image").each(function(){
            new _imageRadio($(this));
        });

        function _imageRadio(box) {
            var $_box = $(box);
            var $_input = $(box).find("input");
            var $_radios = $(box).find(".radio_image_box");

            var start_value = $_input.val();

            $($_box).find('.radio_box[data-value="'+start_value+'"]').addClass("on");

            $_radios.on('click', function(e){
                changeEngine($(this));
            });

            $_radios.on('keypress', function(e){
                if (e.which === 13 || e.type === 'click') {
                    changeEngine($(this));
                }
            });

            $_radios.on('setchecked', function(e){
                changeEngine($(this));
            });

            function changeEngine(clicked_obj) {
                if($(clicked_obj).find(".radio_box").attr("data-value")==$_input.val()) {
                    $_radios.find(".radio_box.on").removeClass("on");
                    $(clicked_obj).find(".radio_box").removeClass("on");
                    var value = '';
                    $_input.val(value);
                    $_input.trigger("change");
                }
                else {
                    $_radios.find(".radio_box.on").removeClass("on");
                    $(clicked_obj).find(".radio_box").addClass("on");
                    var value = $(clicked_obj).find(".radio_box").attr("data-value");
                    $_input.val(value);
                    $_input.trigger("change");
                }
            }
        }
    };

    this.selectFieldPopup = function() {
        $(obj.DOM_form).find(".popup_select").each(function(){
            var select = $(this).find("select");
            var but = $(this).find(".select_add_popup");
            var multi = false;
            if($(this).find(".select_multi_box").length==1) {
                multi = true;
            }

            $(but).click(function(){
                let popup_title = $(this).html();
                let popup_width = 1020;
                if($(this).attr('data-popup-width')!=undefined) {
                    popup_width = $(this).attr('data-popup-width');
                }
                let popup_height = 1020;
                if($(this).attr('data-popup-height')!=undefined) {
                    popup_height = $(this).attr('data-popup-height');
                }
                var link = $(this).attr("href");
                popup.openNew(link,popup_title,popup_width,popup_height,true,function(arr){
                    if(arr.list!=undefined) {
                        var ret_val = arr.val;
                        var list = JSON.parse(arr.list);
                        for(var k in list) {
                            var v = list[k];
                            if($(select).find('option[value="'+k+'"]').length==0) {
                                $(select).append('<option value="' + k + '" selected="selected">' + v + '</option>');
                                $(select).trigger("chosen:updated");
                                if(multi) {
                                    setTimeout(function(){
                                        if(obj.fields_multi.length>0) {
                                            obj.fields_multi.forEach(function(field){
                                                if($(select).hasClass("field_"+field.field_name)) {
                                                    field.getDomElements();
                                                    field.add(k);
                                                }
                                            });
                                        }
                                    },10);
                                }
                            }
                        }
                    }
                });
                return false;
            });
        });

    };

    this.ajaxFieldPopup = function() {
        $(obj.fields_ajax).each(function(){
            let ajax_field_obj = this;
            var ajax_field = $(ajax_field_obj.DOM_field_box[0]).closest(".field_content");
            var but = $(ajax_field).find(".ajax_add_popup");
            $(but).click(function(){
                var link = $(this).attr("href");

                let popup_title = $(this).html();
                let popup_width = 1020;
                if($(this).attr("data-popupwidth")!=undefined) {
                    popup_width = $(this).attr("data-popupwidth");
                }
                let popup_height = 600;
                if($(this).attr("data-popupheight")!=undefined) {
                    popup_height = $(this).attr("data-popupheight");
                }

                popup.openNew(link,popup_title,popup_width,popup_height,true,function(arr){
                    if(arr.val!=undefined) {
                        var ret_val = arr.val;
                        var ret_text = arr.text;
                        // let new_element = $('<li class="active-result chosen_' + ret_val + '" data-option-array-index="' + ret_val + '">' + ret_text + ' </li>');
                        let new_element = $('<li class="select2-results__option" role="option" data-option-array-index="' + ret_val + '" style="cursor: pointer;">' + ret_text + '</li>');
                        $(ajax_field).find('.js_ajax_results_list').append(new_element);
                        ajax_field_obj.choseResultEvent_clientEventEngine(new_element);
                        ajax_field_obj.choseResultEvent_engine(new_element);
                        $(ajax_field).find('.js_ajax_select_single').trigger('add_ajax_value');
                    }
                });
                return false;
            });
        });

    };

    this.scrollErrors = function(){
        var first_err = null;
        $(obj.DOM_form).find(".ico_err").each(
            function(){
                if($(this).css('opacity')==1){
                    first_err = $(this);
                    return false;
                }
            }
        );
        if(first_err) {
            $('html, body').animate({
                scrollTop: first_err.parents('.general_row').position().top,
                scrollLeft: first_err.parents('.general_row').position().left
            }, 1000);

        }
    };

    obj.fixedScrollBar = function() {

        var top_line = 0;
        var bottom_line = 0;

        var parent = $(obj.DOM_form).parent();
        if($(parent).hasClass("default_form2")) {
            setTimeout(function(){
                setLines();
                $(window).resize(setLines);
                $(obj.DOM_form).on('heightChange',function(){
                    setLines();
                    setFixed();
                });
                setFixed();
                $(window).scroll(function(){
                    setFixed();
                });
            },300);
        }

        function setFixed() {
            var wtop = $(window).scrollTop();
            if(wtop>bottom_line) {
                $(parent).removeClass("fixed_pos_submit_bar");
            }
            else if(wtop>top_line) {
                $(parent).addClass("fixed_pos_submit_bar");
            }
        }

        function setLines() {
            top_line = $(parent).offset().top-$(window).outerHeight();
            bottom_line = $(parent).offset().top+$(parent).outerHeight()-$(window).outerHeight();
        }
    };

    this.myform2CancelInfo = function() {
        $(obj.DOM_form).find(".cancel_button").click(function(){
            if(confirm("Czy na pewno chcesz anulować?")) {
                return true;
            }
            else {
                return false;
            }
        });
    }

    obj.init();

}

function _ajaxvalidation(form, key, token) {

    var obj = this;

    this.form = form;
    this.token = token;
    this.key = key;

    this.interval = [];

    this.init = function() {
        // obj.changeEvents();
    };

    this.runAfterEvent = function(name) {
        clearTimeout(obj.interval[name]);
        obj.interval[name] = setTimeout(function(){
            obj.validateField(name);
        },800);
    };

    this.validateField = function(name) {
        var form_values = obj.getFormValues();
        $.post('/pioro/myform2/ajaxvalidation',{'_token':token,'key':obj.key, 'values':form_values, 'field_db_name':name}, function(ret){
            obj.addCheckClassToField(name);
            var errors = JSON.parse(ret);
            for(var k in errors) {
                var v = errors[k];
                if(v==null) {
                    obj.setFieldIsOk(k);
                }
                else {
                    obj.setFieldHasErrors(k, v);
                }
            }
        });
    };

    this.getFormValues = function() {
        return $(obj.form).serialize();
    };

    this.addCheckClassToField = function(field_name) {
        field_name = obj.convertFieldName(field_name);
        var a = ".field_"+field_name;
        var field = $(".field_"+field_name);
        if(!$(field).hasClass('check')) {
            $(field).addClass("check");
        }
    };

    this.setFieldIsOk = function(field_name) {
        field_name = obj.convertFieldName(field_name);
        var field = $(".field_"+field_name);
        var field_anchor = $(".field_err_anchor_class_"+field_name);
        if($(field).hasClass("check")) {
            var err_box = $(".field_err_anchor_text" + field_name);
            if (!$(field).hasClass('ok')) {
                $(field).addClass("ok");
                $(field_anchor).addClass("ok");
            }
            $(field).removeClass("err");
            $(field_anchor).removeClass("err");
            $(err_box).html("");
            obj.addOrRemoveClassToAnotherItems(field, 'ok');
        }
    };

    this.setFieldHasErrors = function(field_name, error) {
        field_name = obj.convertFieldName(field_name);
        var field = $(".field_"+field_name);
        var field_anchor = $(".field_err_anchor_class_"+field_name);
        if($(field).hasClass("check")) {
            var err_box = $(".field_err_anchor_text" + field_name);
            if (!$(field).hasClass('err')) {
                $(field).addClass("err");
                $(field_anchor).addClass("err");
            }
            $(field).removeClass("ok");
            $(field_anchor).removeClass("ok");
            $(err_box).html("");
            let err_class = 'err_txt';
            if($(err_box).data('err-class')) {
                err_class = $(err_box).data('err-class');
            }
            $(err_box).append('<p class="'+err_class+'">' + error + "</p>");
            obj.addOrRemoveClassToAnotherItems(field, 'err');
        }
    };

    this.addOrRemoveClassToAnotherItems = function(field, classs) {
        // var items = [];
        // items[0] = $(field).next(".chosen-container");
        //
        // $(items).each(function(){
        //     if($(this)!==undefined) {
        //         $(this).removeClass("ok");
        //         $(this).removeClass("err");
        //         $(this).addClass(classs);
        //     }
        // });
    };

    this.convertFieldName = function(name) {
        if(name!=undefined) {
            var tmp = name.split('[');
            return tmp[0];
        }
        else {
            return null;
        }
    };

    obj.init();

}

function _multiSelect(form_obj, field) {

    var obj = this;
    this.form_obj = form_obj;
    this.field = field;
    this.field_name = null;

    this.DOM_input = null;
    this.DOM_select = null;
    this.DOM_list = null;

    this.values = new Map();

    this.isAjax = false;

    this.relations = null;

    this.init = function() {
        obj.getDomElements();
        obj.selectEvent();
        obj.setDefaultValues();
    };

    this.setSortableEvents = function(){
        obj.DOM_list = $(obj.field).find('ul.multi_list');
        if(obj.DOM_list.hasClass('sortable')) {
            obj.DOM_list.sortable({
                handle: '.sortable_handler_ico',
                update: function(e, ui) {
                    obj.refreshInputValues();
                }
            });
        }
    };

    this.getDomElements = function() {
        if($(obj.field).hasClass("ajax_field")) {
            obj.isAjax = true;
        }
        obj.DOM_input = $(obj.field).find('input.multi_result_input');
        obj.DOM_select = $(obj.field).find('select');
        obj.DOM_list = $(obj.field).find('ul.multi_list');
        if(obj.isAjax==0) {
            obj.field_name = $(obj.DOM_input).attr("name");
        }
        else {
            obj.field_name = $(obj.DOM_input).attr("name");
            obj.checkRelations();
        }
    };

    this.setDefaultValues = function() {
        var dval = $(obj.DOM_input).val();
        if(dval!=''&&dval!=undefined) {
            var tmp = dval.split('||').join('|').split('|');
            $(tmp).each(function(k,v){
                if(v!='') {
                    if(!obj.isAjax) {
                        obj.pushToValuesArray(v);
                    }
                    if(obj.isAjax) {
                        let one = true;
                        $(obj.DOM_input).on('list_updated',function(){
                            if(one) {
                                one = false;
                                obj.pushToValuesArray(v);
                                $(obj.field).find('.chosen_' + v).remove();
                                obj.resetList();
                            }
                        });

                    }
                }
            });
            obj.resetList();
        }
    };

    this.selectEvent = function() {
        if(!obj.isAjax) {
            $(obj.DOM_select).change(function () {
                var val = $(this).val();
                obj.selectEvent_engine(val);
            });
        }
        else {
            var time_tmp = null;
            $(obj.field).find(".chosen-results").click(function () {
                clearTimeout(time_tmp);
                time_tmp = setTimeout(function(){
                    obj.selectEvent_multiSelectEngine_chosen();
                },10);
            });

            $(obj.field).find(".js_ajax_select_single").on('add_ajax_value',function(){
                clearTimeout(time_tmp);
                time_tmp = setTimeout(function(){
                    obj.selectEvent_multiSelectEngine_chosen();
                },10);
            });

            let rand = $(obj.field).find(".js_ajax_select_container").attr('data-select-handler');
            if(rand!=undefined) {

                $(".select2-handler-"+rand).find(".select2-dropdown").click(function () {
                    clearTimeout(time_tmp);
                    time_tmp = setTimeout(function(){
                        obj.selectEvent_multiSelectEngine_select2();
                    },10);
                });

                $(".select2-handler-"+rand).find(".js_ajax_select_single").on('add_ajax_value',function(){
                    clearTimeout(time_tmp);
                    time_tmp = setTimeout(function(){
                        obj.selectEvent_multiSelectEngine_select2();
                    },10);
                });

            }


        }
    };

    this.selectEvent_multiSelectEngine_chosen = function() {
        var span = $(obj.field).find(".chosen-single span");
        var val = $(span).attr("rel");
        obj.selectEvent_engine(val);
    }

    this.selectEvent_multiSelectEngine_select2 = function() {
        var span = $(obj.field).find(".js_ajax_result_text");
        var val = $(span).attr("rel");
        obj.selectEvent_engine(val);
    }

    this.selectEvent_engine = function(val) {
        obj.add(val);
        obj.form_obj.ajaxValidateFunc(obj.field_name);
        obj.form_obj.checkRelations(obj.field_name);
    }

    this.add = function(val) {
        obj.pushToValuesArray(val);
        obj.unselect();
        obj.resetList();
    };

    this.pushToValuesArray = function(val) {
        if(obj.values.get(val)==undefined) {
            if(!obj.isAjax) {
                obj.values.set(val,$(obj.DOM_select).find('option[value="' + val + '"]').html());
            }
            else {
                if($(obj.field).find('.chosen_'+val).length==1) {
                    obj.values.set(val, $(obj.field).find('.chosen_' + val).html());
                }
                else {
                    let rand = $(obj.field).find(".js_ajax_select_container").attr('data-select-handler');
                    if(rand!=undefined) {
                        obj.values.set(val, $(".select2-handler-" + rand).find('.select2-results__option[data-option-array-index="' + val + '"]').html());
                    }
                }
            }
        }
    };

    this.setValue = function(val, name) {
        if(obj.values.get(val)==undefined) {
            obj.values.set(val, name);
            obj.unselect();
            obj.resetList();
        }
    }

    this.deleteValue = function(val) {
        if(obj.values.get(val)!=undefined) {
            obj.values.delete(val);
            obj.resetList();
        }
    }

    this.getValues = function() {
        return obj.values;
    }

    this.unselect = function() {
        if(!obj.isAjax) {
            $(obj.DOM_select).val('').trigger('chosen:updated');
        }
        else {
            var placeholder = $(obj.field).find(".chosen-single span").attr("placeholder");
            $(obj.field).find(".chosen-single span").html(placeholder);
        }
    };

    this.resetList = function() {
        $(obj.DOM_list).html("");

        obj.values.forEach(function(v,k){
            if(v!=undefined) {
                if(obj.DOM_list.hasClass('sortable')) {
                    var html = '<li rel="' + k + '" class="ui-sortable-handle">' + v + ' <span class="glyphicon glyphicon-remove" tabindex="0" aria-label="Usuń '+v+'"></span><div class="sortable_handler_ico multiselect_sortable_icon"><i class="fas fa-arrows-alt-v"></i></div></li>';
                } else {
                    var html = '<li rel="' + k + '">' + v + ' <span class="glyphicon glyphicon-remove" tabindex="0" aria-label="Usuń '+v+'"></span></li>';
                }

                $(obj.DOM_list).append(html);
            }
        });
        obj.deleteEvent();
        obj.setValueString();
        obj.setSortableEvents();
    };

    this.deleteEvent = function() {
        $(obj.DOM_list).find("li").children("span").on('click keypress',function(e){
            if (e.which === 13 || e.type === 'click') {
                var id = $(this).closest("li").attr("rel");
                obj.deleteValue(id);
            }
        });
    };

    this.setValueString = function() {
        var string = '';
        obj.values.forEach(function(v,k){
            if(v!=undefined) {
                string += '|'+k+'|';
            }
        });
        $(obj.DOM_input).val(string);
    };

    this.checkRelations = function() {
        var rel = $(obj.field).attr("data-relations");
        if(rel!=undefined) {
            obj.relations  = rel.split(" ");
        }
    };

    this.refreshInputValues = function() {
        var string = '';
        $(obj.DOM_list).find('li').each(function(){
            var id = $(this).attr("rel");
            string += '|'+id+'|';
            $(obj.DOM_input).val(string);
        });
    };

    this.relationsEvent = function(name) {
        if(obj.relations!=null&&obj.relations.length>0) {
            obj.relations.forEach(function(v){
                if (v==name) {
                    obj.clearList();
                    obj.form_obj.ajaxValidateFunc(obj.field_name);
                    obj.form_obj.checkRelations(obj.field_name);
                }
            });
        }
    };

    this.clearList = function() {
        obj.values = new Map();
        obj.resetList();
    };

    obj.init();
}

function _ajaxfields(form_js_obj, field, token) {
    var obj = this;

    this.form_js_obj = form_js_obj;

    this.key = form_js_obj.key;
    this.token = token;


    this.DOM_field_box = field;
    this.DOM_result_input = null;
    this.DOM_chosen_box = null;
    this.DOM_chosen_result = null;
    this.DOM_chosen_serach_input = null;
    this.DOM_chosen_list = null;

    this.open = false;
    this.timeout = null;
    this.ismulti = false;
    this.relations = null;
    this.string_option = false;
    this.placeholder = $(field).find(".js_ajax_result_text").data('ph');
    if(this.placeholder=='') {
        this.placeholder = 'Wybierz';
    }

    this.field_name = null;

    this.select_plugin_type = 'select2';

    this.wcag_select_elements_index = 0;

    this.init = function() {
        obj.getDomElements();
        obj.openAndCloseEvent();
        obj.searchEvent();
        obj.checkRelations();
        obj.ajax_getRecords('');
    };

    this.getDomElements = function() {
        if($(obj.DOM_field_box).hasClass("select_multi_box")) {
            obj.ismulti = true;
        }
        if($(obj.DOM_field_box).hasClass("string_option")) {
            obj.string_option = true;
        }
        obj.DOM_result_input = $(obj.DOM_field_box).find(".js_ajax_result");
        obj.DOM_chosen_box = $(obj.DOM_field_box).find(".js_ajax_select_container");
        obj.DOM_select_handler = $(obj.DOM_field_box).find(".js_ajax_select_handler");
        obj.DOM_chosen_result = $(obj.DOM_field_box).find(".js_ajax_select_single");
        obj.DOM_chosen_serach_input = $(obj.DOM_field_box).find(".js_ajax_search_input");
        obj.DOM_chosen_list = $(obj.DOM_field_box).find(".js_ajax_results_list");
        obj.DOM_chosen_list_handler = $(obj.DOM_field_box).find(".js_ajax_select_result_list_handler");
        obj.DOM_chosen_list_handler_width = $(obj.DOM_field_box).find(".js_ajax_select_result_list_handler_width");
        $("body").append(obj.DOM_chosen_list_handler);
        if(obj.ismulti==0) {
            obj.field_name = $(obj.DOM_field_box).children('input[type="hidden"]').attr("name");
        }
        else {
            obj.field_name = $(obj.DOM_field_box).children('input[type="hidden"]').attr("name");
        }

        if($(obj.DOM_chosen_box).hasClass('chosen-container')) {
            obj.select_plugin_type = 'chosen';
        }
    };

    this.openAndCloseEvent = function() { //
        $(obj.DOM_chosen_result).click(function(){
            if(!obj.open) {
                obj.chosenOpen();
            }
            else {
                obj.chosenClose();
            }
        });

        $(obj.DOM_select_handler).bind('keypress click',function(e){
            if (e.which === 13 || e.type === 'click') {
                if(!obj.open) {
                    obj.chosenOpen();
                }
                else {
                    obj.chosenClose();
                }
                return false;
            }
        });

        $("body").click(function(event){
            if($(obj.DOM_chosen_box).find(event.target).length==0){
                obj.chosenClose();
            }
        });
    };

    this.chosenOpen = function() {
        if(!$(obj.DOM_chosen_box).hasClass('js_ajax_open')) {
            $(obj.DOM_chosen_box).addClass('js_ajax_open');
            obj.open = true;

            if(obj.select_plugin_type=='select2') {
                $(obj.DOM_chosen_box).children(".select2").addClass('select2-container--open');
                $(obj.DOM_chosen_list_handler).css({'position':'absolute','top':$(obj.DOM_chosen_box).offset().top+$(obj.DOM_chosen_box).height(),'left':$(obj.DOM_chosen_box).offset().left}).show();
                $(obj.DOM_chosen_list_handler_width).css({'width':$(obj.DOM_chosen_box).width()+'px'}).show();
                $(obj.DOM_select_handler).attr('aria-expanded',true);
            }
            else if(obj.select_plugin_type=='chosen') {
                if(!$(obj.DOM_chosen_box).hasClass('chosen-container-active')) {
                    $(obj.DOM_chosen_box).addClass('chosen-container-active');
                    $(obj.DOM_chosen_box).addClass('chosen-with-drop');
                }
            }

            $(obj.DOM_chosen_serach_input).focus();
        }
    };

    this.chosenClose = function() {
        if($(obj.DOM_chosen_box).hasClass('js_ajax_open')) {
            $(obj.DOM_chosen_box).removeClass('js_ajax_open');
            obj.open = false;

            if(obj.select_plugin_type=='select2') {
                $(obj.DOM_chosen_box).children(".select2").removeClass('select2-container--open');
                $(obj.DOM_chosen_list_handler).hide();
                $(obj.DOM_select_handler).attr('aria-expanded',false);
            }
            else if(obj.select_plugin_type=='chosen') {
                if($(obj.DOM_chosen_box).hasClass('chosen-container-active')) {
                    $(obj.DOM_chosen_box).removeClass('chosen-container-active');
                    $(obj.DOM_chosen_box).removeClass('chosen-with-drop');
                }
            }
        }
    };

    this.searchEvent = function() {
        $(obj.DOM_chosen_serach_input).keyup(function(e){
            if(e.keyCode!=40&&e.keyCode!=38&&e.keyCode!=13) {
                if (obj.string_option) {
                    $(obj.DOM_field_box).find(".js_ajax_result_text").html("");
                    $(obj.DOM_chosen_result).find("span").html("");
                    $(obj.DOM_chosen_result).find("span").attr("rel", "");
                }
                clearTimeout(obj.timeout);
                obj.timeout = setTimeout(function () {
                    var val = $(obj.DOM_chosen_serach_input).val();
                    obj.ajax_getRecords(val);
                    if (obj.string_option) {
                        $(obj.DOM_result_input).val(val).trigger('change');
                    }
                }, 100);
            }
        });
    };

    this.ajax_getRecords = function(value) {
        var data = obj.form_js_obj.getValues();
        $.post('/pioro/myform2/ajaxfieldsearch',{'_token':obj.token,'key':obj.key,'field_name':obj.field_name,'value':value,'data':data},function(ret){
            obj.clearList();
            if(ret!='') {
                obj.setValuesToList(ret);
            }
        });
    };

    this.setValuesToList = function(json) {
        var json = JSON.parse(json);
        // if(!this.ismulti) {
        console.log(obj.placeholder);
        if(obj.select_plugin_type=='select2') {
            $(obj.DOM_chosen_list).append('<li class="select2-results__option " data-option-array-index="" style="">'+obj.placeholder+'</li>');
        }
        else {
            $(obj.DOM_chosen_list).append('<li class="active-result chosen_0 " data-option-array-index="" style="">'+obj.placeholder+'</li>');
        }
        // }
        for(var k in json) {
            var v = json[k];
            k = k.substr(1,1000);
            if(obj.select_plugin_type=='select2') {
                let id = str_random(6);
                $(obj.DOM_chosen_list).append('<li id="'+id+'" class="select2-results__option" role="option" data-option-array-index="' + k + '" >' + v + '</li>')
            }
            else {
                $(obj.DOM_chosen_list).append('<li class="active-result chosen_' + k + '" data-option-array-index="' + k + '" style="">' + v + '</li>');
            }
        }

        if(obj.select_plugin_type=='select2') {
            $(obj.DOM_chosen_list).find("li").css({'cursor':'pointer'}).hover(function(){
                $(this).addClass('select2-results__option--highlighted');
                let id = $(this).attr('id');
                $(obj.DOM_chosen_serach_input).attr('aria-activedescendant',id);
            },function(){
                $(this).removeClass('select2-results__option--highlighted');
            });
        }

        $(obj.DOM_field_box).find('input[type="hidden"]').trigger('list_updated');

        obj.choseResultEvent();
        obj.setValuesToList_wcagEvents();
    };

    this.setValuesToList_wcagEvents = function() {
        obj.wcag_select_elements_index = 0;
        $(obj.DOM_chosen_serach_input).unbind('keydown').keydown(function(e){
            if(e.keyCode==38) { // gora
                if(obj.wcag_select_elements_index>0) {
                    obj.wcag_select_elements_index--;
                    updateFocusPosition();
                    return false;
                }
            }
            else if(e.keyCode==40) { // dol
                if(obj.wcag_select_elements_index<($(obj.DOM_chosen_list).find("li").length-1)) {
                    obj.wcag_select_elements_index++;
                    updateFocusPosition();
                    return false;
                }
            }
            else if(e.keyCode==13) { // enter
                let li_el = $(obj.DOM_chosen_list).children("li.select2-results__option--highlighted");
                if(li_el.length==1) {
                    $(li_el).trigger('click');
                    $(obj.DOM_select_handler).focus();
                }
                return false;
            }
        });

        function updateFocusPosition() {
            $(obj.DOM_chosen_list).find(".select2-results__option--highlighted").removeClass('select2-results__option--highlighted');
            $(obj.DOM_chosen_list).find("li").eq(obj.wcag_select_elements_index-1).addClass('select2-results__option--highlighted');
            let id = $(obj.DOM_chosen_list).find("li").eq(obj.wcag_select_elements_index-1).attr('id');
            $(obj.DOM_chosen_serach_input).attr('aria-activedescendant',id);
        }
    }

    this.choseResultEvent = function() {
        $(obj.DOM_chosen_list).children("li").each(function(){
            obj.choseResultEvent_clientEventEngine($(this));
        });
    };

    this.choseResultEvent_clientEventEngine = function(li_el) {

        $(li_el).hover(
            function(){
                $(this).addClass("select2-results__option--highlighted");
                $(this).attr('aria-selected',false);
            },
            function(){
                $(this).removeClass("select2-results__option--highlighted");
                $(this).attr('aria-selected',null);
            })
        ;

        $(li_el).click(function(){
            obj.choseResultEvent_engine(li_el);
        });
    }

    this.choseResultEvent_engine = function(li_el) {
        var text = $(li_el).html();
        var key = $(li_el).attr("data-option-array-index");
        if(!obj.ismulti) {
            if(obj.string_option) {
                key = key+"_-_"+text;
            }
            $(obj.DOM_result_input).val(key).trigger('change');
        }
        $(obj.DOM_field_box).find(".js_ajax_result_text").html(text);
        $(obj.DOM_field_box).find(".js_ajax_result_text").attr("rel",key);
        obj.chosenClose();
        obj.form_js_obj.ajaxValidateFunc(obj.field_name);
        obj.form_js_obj.checkRelations(obj.field_name);
        if(obj.string_option) {
            $(obj.DOM_chosen_serach_input).val("");
        }
    }

    this.checkRelations = function() {
        var rel = $(obj.DOM_field_box).attr("data-relations");
        if(rel!=undefined) {
            obj.relations  = rel.split(" ");
        }
    };

    this.relationsEvent = function(name) {
        if(obj.relations!=null&&obj.relations.length>0) {
            obj.relations.forEach(function(v){
                if (v==name) {
                    obj.clearAll();
                    obj.ajax_getRecords('');
                }
            });
        }
    };

    this.clearList = function() {
        $(obj.DOM_chosen_list).html("");
    };

    this.clearAll = function() {
        obj.clearList();
        $(obj.DOM_result_input).val("");
        $(obj.DOM_chosen_serach_input).val("");
        $(obj.DOM_field_box).find(".js_ajax_result_text").attr("rel","");

        let placeholder = 'Wybierz';
        if($(obj.DOM_field_box).find(".js_ajax_result_text").length>0&&$(obj.DOM_field_box).find(".js_ajax_result_text").data("ph")!=undefined) {
            placeholder = $(obj.DOM_field_box).find(".js_ajax_result_text").data("ph");
        }
        $(obj.DOM_field_box).find(".js_ajax_result_text").html(placeholder);
        obj.form_js_obj.checkRelations(obj.field_name);
    };

    obj.init();
}

function _imageCheckbox(box) {

    var obj = this;

    var $_box = $(box);
    var $_input = $(box).find("input");
    updateClasses($_box);

    if (!$_box.hasClass('run')) {
        $_box.addClass('run');

        let rand = str_random(8);
        if(window.save_objects==undefined) {
            window.save_objects = {};
        }
        window.save_objects[rand] = obj;
        $_box.attr('data-save-rand',rand);

        $_box.on('keypress', function (e) {
            if (e.which === 13 || e.type === 'click') {
                engineClickFunc();
            }
        });

        $(box).find(".yes,.no").on('click', function (e) {
            engineClickFunc();
        });

        $(box).closest('.js_parent_checkbox').on('click', function (e) {
            if(!$(e.target).is('.yes')&&!$(e.target).is(".no")&&!$(e.target).is("input")) {
                engineClickFunc();
            }
        });

        $_input.on('setchecked',function(){
            obj.setChecked(false);
        });

        $_input.on('setunchecked',function(){
            obj.setUnChecked(false);
        });

        function engineClickFunc() {
            if(!obj.isChecked()) {
                obj.setChecked();
            } else {
                obj.setUnChecked();
            }

        }
    }

    this.setChecked = function(triggered = true) {
        $_input.val(1);
        updateClasses($_box);
        if(triggered) {
            $_input.trigger('click');
            $_input.trigger('change');
        }
    }

    this.setUnChecked = function(triggered = true) {
        $_input.val(0);
        updateClasses($_box);
        if(triggered) {
            $_input.trigger('click');
            $_input.trigger('change');
        }
    }

    this.isChecked = function() {
        if ($_input.val() == 0) {
            return false;
        } else {
            return true;
        }
    }

    function updateClasses(box) {
        var $_input = box.find("input");
        var $_yes = box.find(".yes");
        var $_no = box.find(".no");
        var $_parent_js = box.closest(".js_parent_checkbox");

        if ($_input.val() == 0) {
            $_no.addClass("on");
            $_yes.removeClass("on");
            $_parent_js.removeClass("on");
            $(box).attr('aria-checked',false);
        } else {
            $_yes.addClass("on");
            $_no.removeClass("on");
            $_parent_js.addClass("on");
            $(box).attr('aria-checked',true);
        }
    }
}

function _field_file_ajax2(csrf_token, key, field_name, full_field_name, options_json) {

    let obj = this;
    obj.box = $("."+key+"_"+field_name+"_box");
    obj.input_result = $(obj.box).children("input.field_"+full_field_name);
    obj.default_input = $(obj.box).children("input.default_files_json");
    obj.preview_container = $(obj.box).find(".previewsContainer");
    obj.upload_plugins_box = $(obj.box).find(".upload_plugins_box");
    obj.repo_button = $(obj.box).find(".repo_button");

    obj.last_add_row = null;
    obj.last_add_file_arr = null;

    if(options_json!='') {
        obj.options = JSON.parse(options_json);
    }

    obj.row = $(obj.preview_container).find(".row").clone();
    $(obj.row).css({'display':'table-row'});

    $(obj.preview_container).find(".row").remove();
    if(obj.options.sortable===undefined||obj.options.sortable!=true) {
        $(obj.row).find(".sortable").remove();
    }
    if(obj.options.one_file==true) {
        $(obj.box).find(".upload_progres_bars").before(obj.preview_container);
    }

    obj.files = [];

    this.init = function () {
        obj.setDefaultFiles();

        if(obj.options.dropbox!==undefined&&obj.options.dropbox==true) {
            obj.dropZoneStart();
        }
        if(obj.options.repo!==undefined&&obj.options.repo==true) {
            obj.repoFileStart();
        }

        obj.listSortable();
    };

    this.setDefaultFiles = function() {
        let default_files_string = $(obj.default_input).val();
        if(default_files_string!='') {
            let defailt_files_arr = JSON.parse(default_files_string);
            if(defailt_files_arr.length>0) {
                for(let k in defailt_files_arr) {
                    let v = defailt_files_arr[k];
                    obj.preparePreview(v);
                }
            }
            obj.updateResultJson();
        }
    };

    this.dropZoneStart = function () {
        $(obj.box).find(".dropzone_box").dropzone(
            {
                url: '/pioro/myform2/ajaxfile2/'+key+'/'+full_field_name+'/file_upload_dropbox',
                paramName: "file",
                maxFilesize: obj.options.max_file_size,
                timeout: 300000,
                headers: {
                    'x-csrf-token': csrf_token,
                    'fieldtoken': obj.options.token
                },
                previewTemplate: document.getElementById(key+'_'+field_name+'_preview-template').innerHTML,
                previewsContainer: '.upload_progres_bars_'+field_name,
                autoProcessQueue: true,
                parallelUploads: 1,
                init: function () {
                    this.on("complete", function (file) {
                        if(file.status=='success') {

                            if(obj.options.one_file_overwriting_mode==1) {
                                if(obj.last_add_row) {
                                    obj.deleteFileEngine(obj.last_add_row, obj.last_add_file_arr);
                                }
                            }

                            var response = JSON.parse(file.xhr.response);
                            if (response.status == 'success') {

                                if (obj.options['active_switch']) {
                                    response.param[obj.options['active_switch']] = obj.options['active_switch_default_value'];
                                }

                                obj.preparePreview(response);
                                $(file.previewElement).remove();
                            } else {
                                $(file.previewElement).find(".dz-progress").html(response.info);
                            }
                        }
                        else if(file.status=='error') {
                            if(file.previewElement.textContent.search('too big')!=-1) {
                                $(file.previewElement).find(".dz-progress").html('Plik jest za duży, dupuszczalny rozmiar: '+obj.options.max_file_size+'MB');
                            }
                        }
                    });
                },
            }
        );
    };

    this.repoFileStart = function() {

        $(obj.repo_button).click(function(){
            popup.openNew('/panel/plugin_repo/list?conf='+obj.options.conf,'Repozytorium plików',1020,600,true,function(arr){
                if(arr.files_json!=undefined) {
                    arr.files_arr = JSON.parse(arr.files_json);
                }
                if(arr.files_arr!==undefined&&arr.files_arr.length>0) {
                    let file_paths = [];
                    for(let k in arr.files_arr) {
                        let v = arr.files_arr[k];
                        file_paths.push(v.file_path);
                    }
                    if(file_paths.length>0) {
                        $.ajax({
                            url:'/pioro/myform2/ajaxfile2/'+key+'/'+full_field_name+'/file_upload_repo',
                            type:'post',
                            data:{
                                '_token':csrf_token,
                                'file_paths':file_paths
                            },
                            headers: {
                                'fieldtoken': obj.options.token
                            },
                            success: function(ret){
                                if(ret.length>0) {
                                    for(let k in ret) {
                                        let v = ret[k];
                                        if(v.status=='success') {

                                            if(obj.options['active_switch']) {
                                                v.param[obj.options['active_switch']] = obj.options['active_switch_default_value'];
                                            }

                                            obj.preparePreview(v);
                                        }
                                        else {
                                            $(obj.box).find(".upload_progres_bars").append('<div class="el dz-processing dz-image-preview dz-success dz-complete"><div class="dz-filename"><span data-dz-name="">'+v.clear_name+'</span></div><div class="dz-size" data-dz-size=""><strong>'+v.size+'</strong> MB</div><div class="dz-progress">'+v.info+'</div></div>');
                                        }
                                    }
                                }
                            }
                        });
                    }
                }
            });
            return false;
        });

    };

    this.preparePreview = function(file_arr) {

        var row = $(obj.row).clone();

        $(row).find(".lp").html($(obj.preview_container).children().length + 1);

        if (file_arr.type.length > 8) {
            file_arr.type = '';
        }

        let thumb = '<div class="file"><span class="glyphicon glyphicon-file"></span> ' + file_arr.type + '</div>';
        if (file_arr.thumb != '') {
            thumb = '<div class="image_img"><img src="' + file_arr.thumb + '" /></div>';
        }

        $(row).find(".thumb").html(thumb);
        $(row).find(".long_name").html(file_arr.clear_name);

        // {{--if(short_name!=undefined&&short_name!='') {--}}
        //     {{--$(row).find(".short_name").parent().show();--}}
        //     {{--$(row).find(".short_name").html(short_name);--}}
        //     {{--}--}}
        // {{--else {--}}
        //     {{--$(row).find(".short_name").parent().hide();--}}
        //     {{--}--}}
        //
        // {{--if((image_mode&&obj.sizable==1)||obj.param_fields_count>0) {--}}
        //
        //     {{--}--}}

        if(obj.options.edit!=true) {
            $(row).find(".action .edit").remove();
        }

        $(row).find(".action .download a").attr("href", '/pioro/myform2/ajaxfile2/' + key + '/' + full_field_name + '/download/' + file_arr.full_path);

        if (obj.options.one_file == true && (obj.options.one_file_overwriting_mode==undefined||obj.options.one_file_overwriting_mode == 0)) {
            $(obj.upload_plugins_box).hide();
        }
        $(obj.preview_container).append(row);
        if($(row).find("select").length>0) {
            $(row).find("select").select2();
        }

        obj.last_add_row = row;
        obj.last_add_file_arr = file_arr;

        obj.deleteFile(row, file_arr);
        obj.updateRowResult(row, file_arr);
        obj.updateFastParamForm(row, file_arr);
        obj.editRow(row, file_arr);
    };

    obj.deleteFile = function(row, file_arr) {
        $(row).find(".delete").click(function() {
            obj.deleteFileEngine(row, file_arr);
        });
    };

    obj.deleteFileEngine = function(row, file_arr) {
        $(row).remove();

        $.ajax({
            url:'/pioro/myform2/ajaxfile2/'+key+'/'+full_field_name+'/remove/'+file_arr.full_path,
            type:'get',
            headers: {
                'fieldtoken': obj.options.token
            }
        });

        obj.updateResultJson();
        $(obj.upload_plugins_box).show();
    }

    this.editRow = function(row, file_arr) {
        $(row).find(".edit").click(function(){

            let params = {};
            for(let k in file_arr.param) {
                let v = file_arr.param[k];
                params[k] = v;
            }

            $.post('/pioro/myform2/ajaxfile2/'+key+'/'+full_field_name+'/form_start_value',{'startvalues':params,'_token':csrf_token},function(ftoken){
                if(ftoken!='') {
                    popup.openNew('/pioro/myform2/ajaxfile2/' + key + '/' + full_field_name + '/form/' + file_arr.full_path + "/" + ftoken, 'Dodatkowe parametry', 1020, 800, true, function (arr) {
                        if (arr.param !== undefined && arr.param != '') {
                            let new_param = JSON.parse(arr.param);
                            file_arr.param = new_param;
                            obj.updateRowResult(row, file_arr);
                            obj.updateFastParamForm(row, file_arr);
                        }
                    });
                }
            });


        });

        $(row).find(".field_ajax_additional_fields").find("input, select").bind('input, change, keyup',function(){
            let k = $(this).attr("name").replace(full_field_name+"_","");
            let v = $(this).val();
            file_arr.param[k] = v;
            obj.updateRowResult(row, file_arr);
        });

        if($(row).find(".field_ajax_additional_fields").find("select").length>0) {
            $(row).find(".field_ajax_additional_fields").find("select").change(function () {
                let k = $(this).attr("name").replace(full_field_name + "_", "");
                let v = $(this).val();
                file_arr.param[k] = v;
                obj.updateRowResult(row, file_arr);
            });
        }

        if(obj.options['active_switch']) {
            $(row).find(".lcs_check").lc_switch();
            $(row).find(".lcs_check").unbind('lcs-on');
            $(row).find(".lcs_check").bind('lcs-on',function(){
                file_arr.param[obj.options['active_switch']] = 1;
                obj.updateRowResult(row, file_arr);
            });
            $(row).find(".lcs_check").unbind('lcs-off');
            $(row).find(".lcs_check").bind('lcs-off',function(){
                file_arr.param[obj.options['active_switch']] = 0;
                obj.updateRowResult(row, file_arr);
            });
        }
    };

    this.updateFastParamForm = function(row, file_arr) {
        for(let k in file_arr.param) {

            let v = file_arr.param[k];

            if(k==obj.options['active_switch']) {
                if(v==1) {
                    $(row).find('.lcs_check').prop("checked",true);
                }
            }
            else {
                let name = full_field_name + '_' + k;

                $(row).find('input[name="' + name + '"]').val(v);
                $(row).find('select[name="' + name + '"]').find('option[value="' + v + '"]').attr("selected", 1);
                $(row).find('select[name="' + name + '"]').trigger("chosen:updated");
            }
        }
    };

    this.updateRowResult = function(row, file_arr) {

        let params = {};
        for(let k in file_arr.param) {
            let v = file_arr.param[k];
            params[k] = v;
        }

        $(row).find(".result").val(JSON.stringify({
            'file':file_arr.full_path,
            'param':params
        }));
        obj.updateResultJson();
    };

    this.updateResultJson = function(){
        let files = [];
        $(obj.preview_container).find(".row").each(function(){
            let row = $(this);
            files.push(JSON.parse($(row).find(".result").val()));
        });
        $(obj.input_result).val(JSON.stringify({
            fieldtoken: obj.options.token,
            files:files
        }));
    };

    this.listSortable = function() {
        if(obj.options.sortable==true) {
            $(obj.preview_container).sortable({
                handle: ".sortable_handler_ico",
                update: function (e, ui) {
                    obj.updateResultJson();
                }
            });
        }
    };

    obj.init();
}

function _BRepoField(form_key, field_name, repo_config, sortable_on) {

    if(field_name.search('_rrandd')==-1) {

        let DOM_box = $(".box_" + field_name);
        let DOM_input_result = $(DOM_box).find(".brepo_result");
        let DOM_open_repo_button = $(DOM_box).find(".open_repo");
        let DOM_file_list = $(DOM_box).find(".file-list");
        let DOM_one_file = $(DOM_file_list).find(".one-file").clone();
        $(DOM_one_file).find(".params input, .params select").each(function(){
            $(this).attr("name",$(this).attr("name").replace(field_name+"_",""));
        });
        $(DOM_file_list).find(".one-file").remove();

        let obj = this;

        let files = [];

        this.init = function () {
            obj.openEvent();

            let val = $(DOM_input_result).val();
            if(val!='') {
                let files_tokens = JSON.parse(val);
                let params_arr = {};
                let resizes_arr = {};
                if(files_tokens.length>0) {
                    let files_token_string = '';
                    files_tokens.forEach((file)=>{
                        if(files_token_string!='') {
                            files_token_string += '_';
                        }
                        files_token_string += file.file;
                        params_arr[file.file] = file.params;
                        if(file.resizes!=undefined) {
                            resizes_arr[file.file] = file.resizes;
                        }
                    });
                    $.get('/panel/brepo/getfiles/' + repo_config + '/' + files_token_string,function(ret_files){
                        files = ret_files;
                        if(files.length) {
                            for(let k in files) {
                                let v = files[k];
                                if(params_arr[v.id_token]!=undefined) {
                                    v.params = params_arr[v.id_token];
                                }
                                if(resizes_arr[v.id_token]!=undefined) {
                                    v.resizes = resizes_arr[v.id_token];
                                }
                            }
                        }
                        obj.updateFilesList(files_tokens);
                    });
                }
                else {
                    obj.updateFilesList();
                }
            }
            else {
                obj.updateFilesList();
            }
        }

        this.openEvent = function () {
            $(DOM_open_repo_button).click(function () {

                let files_token_string = '';
                if (files.length > 0) {
                    files.forEach((file) => {
                        if (files_token_string != '') {
                            files_token_string += '_';
                        }
                        files_token_string += file.id_token;
                    });
                }

                popup.openNew('/panel/brepo/chosefiles/' + repo_config + '/' + files_token_string, 'Repozytorium', 1400, 830, false, function (ret) {
                    if (ret != undefined && ret.files != undefined) {

                        let params_arr = {};
                        files.forEach((file)=>{
                            params_arr[file.id_token] = file.params;
                        });

                        let new_files = new Array();
                        files.forEach((file)=>{
                            ret.files.forEach((repo_file)=>{
                                if(file.id_token==repo_file.id_token) {
                                    if(params_arr[file.id_token]!=undefined) {
                                        file.params = params_arr[file.id_token];
                                    }
                                    new_files.push(file);
                                }
                            });
                        });

                        ret.files.forEach((repo_file)=>{
                            let is_in_files = false;
                            files.forEach((file)=>{
                                if(file.id_token==repo_file.id_token) {
                                    is_in_files = true;
                                }
                            });
                            if(!is_in_files) {
                                if(params_arr[repo_file.id_token]!=undefined) {
                                    repo_file.params = params_arr[repo_file.id_token];
                                }
                                new_files.push(repo_file);
                            }
                        });

                        files = new_files;
                        // files = ret.files;
                        // files.forEach((file)=>{
                        //     if(params_arr[file.id_token]!=undefined) {
                        //         file.params = params_arr[file.id_token];
                        //     }
                        // });

                        obj.updateFilesList();
                    }
                });
            });
        }

        this.updateFilesList = function (files_tokens) {
            if(files_tokens==undefined) {
                $(DOM_file_list).html("");
                let lp = 0;
                files.forEach((file) => {
                    lp++;
                    obj.prepareFileRow(lp, file);
                });
                this.updateResultJson();
            }
            else if(files_tokens.length>=files.length) {
                $(DOM_file_list).html("");
                let lp = 0;
                for(let k in files_tokens) {
                    let v = files_tokens[k];
                    let id_token = v.file;
                    files.forEach((file) => {
                        if(file.id_token==id_token) {
                            lp++;
                            obj.prepareFileRow(lp, file);
                        }
                    });
                }
            }
        }

        this.updateResultJson = function() {
            let tokens = [];
            let new_file_arr = [];
            $(DOM_file_list).find(".one-file").each(function(){
                let html_id_token = $(this).attr('data-id');
                files.forEach((file) => {
                    if(file.id_token==html_id_token) {
                        let resizes = {};
                        if (file.resizes != undefined) {
                            resizes = file.resizes;
                        }

                        tokens.push({
                            'file': file.id_token,
                            'params': file.params,
                            'resizes': resizes
                        });

                        new_file_arr.push(file);
                    }
                });
            });

            files = new_file_arr;
            let result = JSON.stringify(tokens);
            $(DOM_input_result).val(result);
        }

        this.prepareFileRow = function (lp, file_obj) {
            let row = $(DOM_one_file).clone();
            $(row).attr('data-id',file_obj.id_token);
            $(row).find(".lp").html(lp + ".");
            $(row).find(".name").html(file_obj.full_name);
            if (file_obj.thumb != '') {
                $(row).find(".image-thumb").css('background-image', 'url(' + file_obj.thumb + ')');
                $(row).find(".file-thumb").remove();
            } else {
                $(row).find('.file-thumb').find("div").html(file_obj.file_type);
                $(row).find(".image-thumb").remove();
            }
            if(file_obj.params!=undefined) {
                for(let k in file_obj.params) {
                    let v = file_obj.params[k];
                    let input = $(row).find('input[name="'+k+'"]');
                    let select = $(row).find('select[name="'+k+'"]');
                    if($(input).length==1) {
                        $(input).val(v);
                    }
                    else if($(select).length==1) {
                        $(select).val(v);
                    }
                }
            }
            $(DOM_file_list).append(row, file_obj);
            obj.rowEngine(row, file_obj);

            $(DOM_file_list).sortable({
                handle: '.move',
                update: function(e, ui) {
                    obj.updateResultJson();
                }
            });
        }

        this.rowEngine = function (row, file_obj) {
            let remove_button = $(row).find(".remove");
            this.paramsEngine(row, file_obj);

            $(remove_button).click(function () {
                files.forEach((file, k) => {
                    if (file_obj.id == file.id) {
                        files.splice(k, 1);
                    }
                });
                obj.updateFilesList();
            });

            let resize_button = $(row).find(".resize");
            if(resize_button.length==1) {
                this.resizeEngine(row, file_obj);
            }
        }

        this.paramsEngine = function(row, file_obj) {
            $(row).find('.params input').keyup(function(){
                obj.updateParams(row, file_obj);
            });
            $(row).find('.params select').select2().change(function(){
                obj.updateParams(row, file_obj);
            });
        }

        this.updateParams = function(row, file_obj) {
            let params = {};
            $(row).find(".params input, .params select").each(function(){
                params[$(this).attr('name')] = $(this).val();
            });
            file_obj.params = params;
            this.updateResultJson();
        }

        this.resizeEngine = function(row, file_obj) {
            let resize_button = $(row).find(".resize");
            $(resize_button).click(function(){
                let additional_url_string = '';
                if(file_obj.resizes!=undefined) {
                    additional_url_string += '&resizes='+encodeURIComponent(JSON.stringify(file_obj.resizes));
                }
                popup.openNew('/pioro/myform2/brepo/resize/'+form_key+'/'+file_obj.id_token+'?config='+repo_config+additional_url_string,'Skaluj zdjęcie',1000,1000,true,function(ret){
                    if(ret.resizes!=undefined) {
                        file_obj.resizes = JSON.parse(ret.resizes);
                        obj.updateResultJson();
                    }
                });
            });
        }


        obj.init();
    }
}
