/***************************************************
Editor.js
    A Vonalkód Rendszerház időzítések kezelésének
    szerkesztéséhez készült metódusok és események.
----------------------
Alapítva:
    2019.09.06.-09.08. Wittmann Antal
Módosult:
****************************************************/

/*##### EVENTS #####*/

$(document).ready(function () {
    'use strict'

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

    vrhschedit.Init(); 

})// $(document).ready event VÉGE

/*##### EVENTS END #####*/


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

    /*##### PROTOTYPE VARIABLES #####*/

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

    // selector cache
    var $EditorBootboxId = $('#' + imp.EDITOR_DIALOG_ID);
    var $EditorForm = $('#' + imp.EDITOR_FORM_ID);
    var $ObjectIdValue = $('#' + imp.Ids.Input.OBJECTIDVALUE);
    var $ObjectGroupId = $('#' + imp.Ids.Input.OBJECTGROUPID);
    var $OperationTime = $('#' + imp.Ids.Input.OPERATIONTIME);
    var $inputNumberOf = $('input[name=NumberOf]');
    var $labelNumberOf = $('label[for=NumberOf]');

    /*##### PROTOTYPE VARIABLES END #####*/


    /*##### PROPERTIES #####*/
    this.DTPicker = new VrhDateTimePicker(imp.LCID);
    /*##### PROPERTIES END #####*/


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

    /** 
     *  Az editor kezeléséhez szükséges inicializálások.
     *  A ready eseményben kell meghívni!!! 
     */
    this.Init = function () {
        var thisfn = thispt + 'Init method: ';
        console.log(thisfn + 'PING imp.IsItemOfSeries=%s', imp.IsItemOfSeries);

        //Autocomplete inicializálás
        vrhct.autocomplete.init({ textName: imp.Ids.Input.OBJECTIDTEXT, valueName: imp.Ids.Input.OBJECTIDVALUE, url: imp.URL_FOR_OBJECTID });
        vrhct.autocomplete.init({ textName: imp.Ids.Input.OPERATIONIDTEXT, valueName: imp.Ids.Input.OPERATIONIDVALUE, url: imp.URL_FOR_OPERATIONID });

        var $schType = imp.IsItemOfSeries ? $('#ScheduleType') : $('input[name=ScheduleType]:checked');
        var $preType = $('#PreviousScheduleType');
        var stype = $schType.val();
        var ptype = $preType.val();
        console.log(thisfn + 'ScheduleType="%s", PreviousScheduleType="%s"', stype, ptype);
        $preType.val(stype);

        me.NumberOfChange();

        $('input[type=radio][name=ScheduleType]').change(function () {
            console.log(thispt + 'ScheduleType change event occured.');
            $EditorForm.submit();
        });

        $EditorForm.on("submit", function (e) {
            //e.preventDefault(); // cancel the actual submit
            var checked = document.getElementById('IsScheduleExecute').checked;
            console.log(thisfn + "Form submit event occured. IsScheduleExecute=", checked);
            if (checked) {
                $('#buttoncontainer').hide();
                $('#waitmessagecontainer').show();
            }
            //return false; //nem folytatja a submit-ot
        });

    } // Init method END

    /** 
     *  Hét számának megjelenítése 
     */
    this.NumberOfChange = function () {
        var thisfn = thispt + 'NumberOfChange method: ';
        var vl = $inputNumberOf.val();
        //console.log(thisfn + ' PING. vl', vl);
        $labelNumberOf.text(imp.NUMBER_OF_LABEL + ': ' + vl);
        setSeriesName();
    } // NumberOfChange method END

    /**
     * Az ütemezés végrehajtásának eredményét mutatja meg.
     * 
     * @param {number} scheduleid 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_SHOWSTATE);

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


    /** 
     *  Az ütemezendő objektum szerkesztőjének meghívása. 
     */
    this.OpenObjectEditor = function () {
        var varObjId = '@' + imp.VARIABLE_OBJECTID + '@';
        var varGrpId = '@' + imp.VARIABLE_GROUPID + '@';
        var objectid = $ObjectIdValue.val();
        var groupid = $ObjectGroupId.val();
        if (objectid && objectid != '-1') {
            if (groupid) {
                var url = imp.URL_OBJECTEDITOR;
                console.log('iScheduler.Editor.openObjectEditor: before url', url);
                while (url.includes(varObjId)) url = url.replace(varObjId, objectid);
                while (url.includes(varGrpId)) url = url.replace(varGrpId, groupid);
                console.log('iScheduler.Editor.openObjectEditor: after url', url);
                vrhct.bootbox.show(url, {
                    size: 'xl'
                });
            } else {
                bootbox.alert('Előbb adjon meg egy csoport!');
            }
        }
        else {
            bootbox.alert('Előbb válasszon ki egy objektumot!');
        }
    }// OpenObjectEditor method END

    /**
     * Ütemezés törlése a sorozatból. 
     */
    this.RemoveScheduleFromSeries = function () {

        var thisfn = thispt + 'RemoveScheduleFromSeries method: ';
        console.log(thisfn + 'PING');

        $EditorBootboxId.addClass('darken');
        var dialog = bootbox.dialog({
            title: imp.CONFIRM_HEADER,
            message: imp.CONFIRM_FROMSERIES,
            onEscape: function (event) {
                dialog.modal('hide');
                $EditorBootboxId.removeClass('darken');
            },
            buttons: {
                ok: {
                    label: imp.BUTTON_LABEL_YES,
                    className: 'btn btn-danger',
                    callback: function () {
                        console.log(thisfn + 'Biztos a törlési szándékában.');
                        dialog.modal('hide');
                        $EditorBootboxId.removeClass('darken');
                        $('#SeriesId').val(null);   // kitörlöm a sorozatra vonatkozó jelzést
                        $('#ScheduleType').val('SE');
                        $('#PreviousScheduleType').val('SE');
                        //console.log(thisfn + ScheduleType, $('#ScheduleType').val());
                        $EditorForm.submit();     // mentés
                    }
                },
                cancel: {
                    label: imp.BUTTON_LABEL_NO,
                    className: 'btn btn-primary',
                    callback: function () {
                        $EditorBootboxId.removeClass('darken');
                    }
                }
            }
        });
    }// RemoveScheduleFromSeries function VÉGE

    /**
     * Egy ütemezés vagy ütemezés sorozat törlése.
     * 
     * @param {number} scheduleId A törlendő ütemezés egyedi azonosítója.
     * @param {string} viewMode Melyik nézetből hívták a törlést.
     * @param {boolean} isDeleteSeries Igaz, ha a teljes sorozatot törölni szeretné.
     */
    this.DeleteScheduleFromEditor = function (scheduleId, viewMode, isDeleteSeries) {
        var thisfn = thispt + 'DeleteScheduleFromEditor method: '
        console.log(thisfn + 'PING scheduleId=%i; viewMode="%s"; isDeleteSeries=%s', scheduleId, viewMode, isDeleteSeries);

        vrhct.bootbox.delete({
            ajax: {
                url: imp.URL_DELETE,
                data: { id: scheduleId, isDeleteSeries: isDeleteSeries },
            },
            confirm: isDeleteSeries ? imp.CONFIRM_DELETESERIES : imp.CONFIRM_DELETE, // ha sorozat törlés, akkor más a szöveg
            title: imp.CONFIRM_HEADER,
            success: function (errorMessage) {
                console.log(thisfn + 'Sikeres törlés. viewMode', viewMode);
                if (viewMode == imp.VIEWMODE_LIST) {
                    vrhsms.ScheduleTable.Table.draw('page');
                }
                if (viewMode == imp.VIEWMODE_CALENDAR) {
                    $calendar.fullCalendar('refetchEvents');
                }
                vrhct.bootbox.hide(imp.EDITOR_DIALOG_ID);
            }
        });
    }// DeleteScheduleFromEditor function VÉGE

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


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

    function setSeriesName() {
        var seriesid = $('#SeriesId').val();
        if (!seriesid) { //csak akkor írjuk felül, ha nincs még azonosítója
            var start = $OperationTime.val();
            var vl = $inputNumberOf.val();
            $('#SeriesName').val(start + '-W' + vl);
        }
    }

    /*##### PRIVATE FUNCTIONS END #####*/
} // SchedulerEditorScript prototype END


/** 
 *  Az Editor.js számára szükséges konstansok, melyek a cshtml-ben kapnak értéket
 *  A prototípus számára küldendő állandó értékek osztálya. 
 *  Azért a prototype, hogy gépelés közben legyen intellisense.
 */
function ExportToSchedulerEditorScript() {
    'use strict';

    // Üzenetek és labelek
    this.WAIT_MESSAGE = '';
    this.CONFIRM_HEADER = '';
    this.CONFIRM_DELETE = '';
    this.CONFIRM_FROMSERIES = '';
    this.CONFIRM_DELETESERIES = '';
    this.BUTTON_LABEL_YES = '';
    this.BUTTON_LABEL_NO = '';
    this.NUMBER_OF_LABEL = '';
    this.EXECUTE_WAIT_MESSAGE = '';
    this.TITLE_RESULTOFTHEOPERATION = '';

    // Url-ek
    this.URL_DELETE = '';
    this.URL_FOR_OBJECTID = '';
    this.URL_FOR_OPERATIONID = '';
    this.URL_OBJECTEDITOR = '';
    this.URL_SHOWSTATE = '';

    // Egyéb állandók
    this.EDITOR_DIALOG_ID = '';
    this.EDITOR_FORM_ID = '';
    this.VARIABLE_OBJECTID = '';
    this.VARIABLE_GROUPID = '';
    this.LCID = '';

    this.VIEWMODE_LIST = '';
    this.VIEWMODE_CALENDAR = '';

    /** Annak jelzése, hogy az időzítés sorozathoz tartozik-e */
    this.IsItemOfSeries = false,

    /** A nézeten lévő html objektumok azonosítóinak gyűjtőhelye */
    this.Ids = {
        Input: {
            OBJECTGROUPID: '',
            OBJECTIDTEXT: '',
            OBJECTIDVALUE: '',
            OPERATIONIDTEXT: '',
            OPERATIONIDVALUE: '',
            OPERATIONTIME: ''
        }
    };

    /** A nézeten lévő objektumok címkéinek gyűjtőhelye */
    this.Labels = {
        ReturnValue: '',
    };

}





