/***************************************************
Manager.js
    A Vonalkód Rendszerház időzítések kezeléséhez
    készült metódusok és események.
----------------------
Alapítva:
    2019.09.01.-09.05. Wittmann Antal
Módosult:
****************************************************/
/*##### EVENTS #####*/
$(document).ready(function () {
    'use strict';

    var thisfn = 'iScheduler.Manager.js: ready event: ';
    console.log(thisfn + 'PING');

    // Resize figyelése, hogy a card-body mérete kitöltse a képernyőt
    $(window).resize(function () {
        console.log(thisfn + 'window.resize event')
        vrhct.masterdata.resizeCardBody();
    });
    vrhct.masterdata.resizeCardBody();
    if (typeof vrhmenu != 'undefined') {
        vrhmenu.MenuSwapEventFunction = function () {
            vrhct.masterdata.resizeCardBody();  // menüváltozáskor is hívja meg a resize-t
        } 
    }

    vrhsms.InitTable();

    console.log(thisfn + 'END');
}); // $(document).ready END 
/*##### EVENTS END #####*/


/**
 * Az ütemezések kezeléséhez készült prototípus.
 * 
 * @param {ExportToSchedulerManagerScript} imp Paraméter objektum, cshtml-ből küldött és ott feltöltött állandókat tartalmaz.
 */
function SchedulerManagerScript(imp) {
    'use strict';

    /*##### PROTOTYPE VARIABLES #####*/
    var me = this;  // hogy a belső függvényekben is tudjak hivatkozni a prototype tulajdonságaira
    var thispt = 'SchedulerManagerScript: ';

    var isInEdit = false;           // annak jelzése, hogy a szerkesztés ablakot aktiválták
    var isInDelete = false;         // annak jelzése, hogy a törlő ablakot aktiválták
    var isInButtonOnClick = false;  // annak jelzése, hogy egy gombot aktiváltak

    // selector cache
    var $consistencyTitle = $('#' + imp.Ids.ConsistencyCheck.Title);
    var $consistencyInput = $('#' + imp.Ids.ConsistencyCheck.Button);

    // DataTable oszlopok definciója
    var dtColumns = [
        {
            data: imp.Data.OperationTime,
            render: function (data, type, row) {
                var html = moment(data).format('L') + " " + moment(data).format('LTS');
                return html;
            }
        },
        { data: imp.Data.ObjectName },
        { data: imp.Data.OperationName },
        { data: imp.Data.ObjectGroupId },
        { data: imp.Data.SeriesType },
        {
            data: imp.Data.State,
            render: function (data, type, row) {
                var html = row.ReturnMessage == "" ? data : ('<a href="#" onclick="vrhsms.ShowStateMessage(' + row.Id + ');">' + data + '</a>');
                return html;
            }
        },
        {   // a műveletek oszlopa
            render: function (data, type, row) {
                var temp = document.createElement('div');

                var spane = document.createElement('span');
                $(spane).attr('title', imp.Titles.ScheduleEdit);
                $(spane).addClass('fas fa-pencil-alt datatableActionIcon');
                $(spane).attr('onclick', 'vrhsms.Edit(' + row.Id + ')');
                $(temp).append(spane);

                var spand = document.createElement('span');
                $(spand).attr('title', imp.Titles.UserDelete);
                $(spand).addClass('fas fa-trash-alt datatableActionIcon');
                $(spand).attr('onclick', 'vrhsms.Delete("' + row.Id + '", "' + row.OperationTime + '", "' + row.ObjectName + '", "' + row.OperationName + '")');

                $(temp).append(spand);
                return $(temp).html();
            }
        }
    ];
    var dtColumnDefs = [
        { targets: [0], width: '150px' },                                       // OperationTime
        { targets: [3], width: '75px', bVisible: imp.VisibleGroupCol },         // ObjectGroupId 
        { targets: [5], width: '75px', className: 'column-state' },             // State
        { targets: [6], width: '45px', bSortable: false, bSearchable: false }   // műveletek
    ];
    var dtFilterDefs = [
        { column: 5, id: imp.Ids.Input.FilterStates },
    ];
    /*##### PROTOTYPE VARIABLES END #####*/


    /*##### PROPERTIES #####*/

    /** Az inicializált tábla DataTable objektuma */
    this.ScheduleTable = null;

    /*##### PROPERTIES END #####*/


    /*##### METHODS #####*/

    /**
     * Tábla inicializálása.
     */
    this.InitTable = function () {
        var thisfn = thispt + 'InitTable method: ';
        console.log(thisfn + 'VrhDataTable példányosítása előtt.');
        me.ScheduleTable = new VrhDataTable({
            ajax: { url: imp.Url.GetData }, // az adatlistát eredményező akció
            autoWidth: false,
            columns: dtColumns,
            columnDefs: dtColumnDefs,
            filterDefs: dtFilterDefs,
            lcid: imp.LCID,
            initComplete: function (setting, json) { // a táblázat elkészültekor meghívott függvény
                console.log(thisfn + 'Table.initComplete callback: PING');
                var col = me.ScheduleTable.Table.column(3);
                col.visible(imp.VisibleGroupCol);
            },
            stateSave: true,// ha true, akkor a csoport oszlop mindig a legutóbbi beállítás szerint látszódik, ezért van az initComplete-ben
            tableId: imp.Ids.Table,
        });
    };// InitTable method END

    //this.ChangeTemporary = function () {
    //    var thisfn = thispt + 'ChangeTemporary method: ';
    //    var urlGetData = imp.Url.GetData + '&isTemporary=' + $('#' + imp.Ids.Input.CheckBoxTemp).is(':checked');
    //    console.log(thisfn + 'url=%s', urlGetData);
    //    me.ScheduleTable.Table.ajax.url(urlGetData);
    //    me.ScheduleTable.Table.draw('page');
    //};


    /**
     * Ütemezés szerkesztés ablak inicializálása.
     * 
     * @param {number} scheduleId A felhasználó neve. Ha üres, akkor felvitel.
     */
    this.Edit = function (scheduleId) {
        try {
            if (isInEdit) return;
            isInEdit = true;

            var thisfn = thispt + 'Edit method: ';
            var head = scheduleId === 0 ? imp.Titles.ScheduleAdd : imp.Titles.ScheduleEdit; 
            console.log(thisfn + 'scheduleId="%i", CallingViewMode="%s", head="%s"', scheduleId, imp.CallingViewMode, head);
            vrhct.bootbox.edit({
                ajax: {
                    url: imp.Url.Editor,
                    data: { id: scheduleId, callingViewMode: imp.CallingViewMode }
                },
                buttonsDefault: false,
                title: head,
                formid: imp.Ids.Form.Editor,
                size: 'large',
                shown: function () {
                    isInEdit = false;
                }
            });
        } catch (e) {
            console.error(e);
            isInEdit = false;
        }
    }; // Edit method END


    /**
     * Ütemezés törlésének indítása.
     * 
     * @param {number} scheduleId A törlendő ütemezés azonosítója.
     * @param {string} time A törlendő ütemezés időpontja.
     * @param {string} name A törlendő ütemezésben megadott objektum neve.
     * @param {string} operation A törlendő ütemezésben megadott objektumon végrehajtandó művelet neve.
     */
    this.Delete = function (scheduleId, time, name, operation) {
        try {
            if (isInDelete) return;
            isInDelete = true;

            var thisfn = thispt + 'Delete method: ';
            console.log(thisfn + 'scheduleId=%i, time="%s", name="%s", operation="%s"', scheduleId, time, name, operation);

            var confirmMessage = '<table>'
                + '<tr><td>' + imp.Labels.OperationTime + ':</td><td style="padding-left:4px;">' + time + '</td></tr>'
                + '<tr><td>' + imp.Labels.ObjectName + ':</td><td style="padding-left:4px;">' + name + '</td></tr>'
                + '<tr><td>' + imp.Labels.OperationName + ':</td><td style="padding-left:4px;">' + operation + '</td></tr>'
                + '</table>'
                + '<br />'
                + '<div style="font-weight:bold;">' + imp.Confirmations.ScheduleDelete;

            vrhct.bootbox.delete({
                ajax: {
                    url: imp.Url.Delete,
                    data: { id: scheduleId, isDeleteSeries: false }
                },
                title: imp.Titles.Confirmation,
                confirm: confirmMessage,
                shown: function () {
                    isInDelete = false;
                },
                success: function () {
                    console.log(thisfn + 'Sikeres törlés. Itt vagyunk a callback-ben.');
                    me.ScheduleTable.Table.draw('page');
                }
            });
        } catch (e) {
            console.error(e);
            isInDelete = false;
        }
    }; // Delete method END   


    /**
     * Az xml fájl "Button" elemében definiált gomb megnyomásakor hívódik meg.
     * A metódus aktiválja a paraméterben megadott URL-t.
     * 
     * @param {string} url A meghívandó URL.
     * @param {boolean} isDialog Ha igaz, akkor ablakban jelenik meg a hívás eredménye.
     * @param {string} widthDialog Ha dialógus ablak nyílik, akkor annak mérete.
     */
    this.ButtonOnClick = function (url, isDialog, widthDialog) {
        try {
            if (isInButtonOnClick) return;
            isInButtonOnClick = true;

            var thisfn = thispt + 'ButtonOnClick method: ';
            console.log(thisfn + 'url="%s", isDialog="%o", widthDialog="%s"', url, isDialog, widthDialog);

            if (isDialog) {
                var prefix = (url.indexOf('?') != -1) ? '&' : '?';
                url = url + prefix + 'callingViewMode=' + imp.CallingViewMode;
                vrhct.bootbox.show(url, {
                    styles: [
                        { name: "max-width", value: widthDialog }
                    ],
                    shown: function () {
                        isInButtonOnClick = false;
                    },
                });
            } else {
                vrhct.bootbox.wait(imp.Messages.Wait);
                setTimeout(function () {
                    isInButtonOnClick = false;
                }, 1000);
                window.location.assign(url);
            }
        } catch (e) {
            console.error(e);
            isInButtonOnClick = false;
        }
    }; // ButtonOnClick method END


    /**
     * Az ütemezés végrehajtásának eredményét mutatja meg.
     * 
     * @param {number} id Az ütemezés egyedi belső azonosítója.
     */
    this.ShowStateMessage = function (scheduleid) {
        var thisfn = thispt + 'ShowStateMessage method: ';
        console.log(thisfn + 'scheduleid=%i; url="%s"', scheduleid, imp.Url.ShowStateMessage);

        vrhct.bootbox.show(imp.Url.ShowStateMessage, {
            ajax: {
                data: { id: scheduleid }
            },
            className: 'ShowStateMessage',
            isReturnInfoJSON: true,
            labelReturnValue: imp.Labels.ReturnValue,
            title: imp.Titles.ResultOfTheOperation,
            sizeError: 'extra-large'
        });
    }; // ShowStateMessage method END


    /**
     * Konzisztencia ellenőrzés
     * 
     * @param {any} checkbox
     */
    this.ConsistencyCheck = function (checkbox) {
        var thisfn = thispt + 'ConsistencyCheck method: '
        console.log(thisfn + 'checked', checkbox.checked);

        if (checkbox.checked) {
            $consistencyTitle.text(imp.Titles.ConsistencyCheck);
            //var diagwait = waitMessageDialog('@Html.Raw(Model.Trans(typeof(WordCodes.iScheduler.Manager.ConsistencyWaitMessage)))');
            $('.allowhide').css('visibility', 'hidden');
            $.ajax({
                cache: false,
                url: imp.Url.ConsistencyCheck,
                type: 'get',
                contenttype: 'application/json',
                datatype: 'json',
                data: null,
                success: function (response) {
                    console.log(thisfn + 'response', response);
                    if (response.ErrorMessage == "") {
                        var variable = '@' + imp.VarNames.ObjectList + '@';
                        var checkurl = imp.Url.CheckObjects;
                        console.log(thisfn + 'checkurl before = "%s"', checkurl);
                        while (checkurl.includes(variable)) checkurl = checkurl.replace(variable, response.ObjectIdList);
                        console.log(thisfn + 'checkurl after  = "%s"', checkurl);
                        $.ajax({
                            cache: false,
                            url: checkurl,
                            type: 'get',
                            contenttype: 'application/json',
                            datatype: 'json',
                            data: null,
                            success: function (checklistJSON) {
                                console.log(thisfn + 'CheckObjects hívás sikeres. checklistJSON', checklistJSON);
                                var list = "";
                                var prefix = "";
                                for (var i = 0; i < checklistJSON.length; i++) {
                                    if (checklistJSON[i].Checked == false) {
                                        list += prefix + checklistJSON[i].Value;
                                        prefix = ",";
                                    }
                                }
                                //diagwait.modal('hide');
                                console.log(thisfn + 'list', list);
                                me.ScheduleTable.Table.ajax.url(imp.Url.GetData + '&checkList=' + list + '&isConsistencyCheck=true').load();

                                //dataTableBuild(sAjaxSource + '&checkList=' + list + '&isConsistencyCheck=true');
                            },
                            error: function (jqXHR, exception) {
                                console.log(thisfn + 'CheckObjects hívás sikertelen! ', jqXHR.responseText);
                                //diagwait.modal('hide');
                                $consistencyInput.bootstrapToggle('off')
                            }
                        });

                    } else {
                        //diagwait.modal('hide');
                        bootbox.alert({ message: response.ErrorMessage, size: 'lg' });
                        $consistencyInput.bootstrapToggle('off');
                    }
                },
                error: function (jqXHR, exception) {
                    console.log(thisfn + 'ConsistencyCheck.GET hívás sikertelen! ', jqXHR.responseText);
                    //diagwait.modal('hide');
                    $consistencyInput.bootstrapToggle('off')
                }
            });

        } else { //kikapcsolt állapotot mutat
            $consistencyTitle.text('');
            //$('.allowhide').show();
            $('.allowhide').css('visibility', 'visible');
            me.ScheduleTable.Table.ajax.url(imp.Url.GetData).load();
            //dataTableBuild(sAjaxSource);
        }
    }; // ConsistencyCheck method END

    /*##### METHODS END #####*/


    /*##### PRIVATE FUNCTIONS #####*/
    /*##### PRIVATE FUNCTIONS END #####*/

} // SchedulerManagerScript prototype END

/** A prototípus számára küldendő állandó értékek osztálya. */
function ExportToSchedulerManagerScript() {
    /** Honnan hívják az Editor-t. */
    this.CallingViewMode = '',
    /** Megerősítést kérő üzenetek gyűjtőhelye */
    this.Confirmations = {
        ScheduleDelete: '',
    };
    /** A táblázat oszlopainak adatelérése */
    this.Data = {
        OperationTime: '',
        ObjectName: '',
        OperationName: '',
        SeriesType: '',
        State: '',
        ObjectGroupId: ''
    };
    /** A nézeten lévő html objektumok azonosítóinak gyűjtőhelye */
    this.Ids = {
        ConsistencyCheck: {
            Title: '',
            Button: ''
        },
        Form: {
            Editor: '',
        },
        Input: {
            FilterStates: '',
        },
        Table: '',
    };
    /** A nézeten lévő inputok címkéinek gyűjtőhelye */
    this.Labels = {
        Button: {
        },
        Cancel: '',
        No: '',
        ObjectName: '',
        OK: '',
        OperationName: '',
        OperationTime: '',
        ReturnValue: '',
        Yes: '',
    };
    /** A környetben érvényes nyelvi kód */
    this.LCID = '';
    /** Az üzenetek gyűjtőhelye */
    this.Messages = {
        Wait: '',
    };
    /** A nézeten lévő eszközök feliratozásának, címeinek és tooltipjeinek gyűjtőhelye */
    this.Titles = {
        Confirmation: '',
        ConsistencyCheck: '',
        OperationProgress: '',
        ResultOfTheOperation: '',
        ScheduleAdd: '',
        ScheduleEdit: '',
        ScheduleDelete: '',
    };
    /** A nézeten lévő akciókra mutató url-ek gyűjtőhelye */
    this.Url = {
        CheckObjects: '',
        ConsistencyCheck: '',
        Editor: '',
        Delete: '',
        GetData: '',
    };
    this.VisibleGroupCol = false;
    /** Változók nevei */
    this.VarNames = {
        ObjectList: '',
    };
}
