/*
* @Copyright (c) 2011 John DeVight
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/

/// <summary>
/// Constructor for the MessageBroker class.  Create an instance of an ArrayList
/// as the container for all the subscribers.
/// </summary>
function MessageBroker() {
    this.subscribers = [];
}

/// <summary>
/// Notify all subscribers who are interested in an event.
/// </summary>
/// <param name="event" type="string">Name of the event to notify subscribers about.</param>
/// <param name="args" type="object">arguments to be passed to the subscribers.</param>
MessageBroker.prototype.Notify = function(event, args) {
    var count = this.subscribers.length;

    // Loop through all the subscribers...
    for (var i = 0; i < count; i++) {
        // If the subscriber is for this event....
        if (this.subscribers[i].Event == event) {
            // Call the function pointer and pass in the arguements.
            this.subscribers[i].Subscriber(args);
        }
    }
}

/// <summary>
/// Add a subscriber for an event.
/// </summary>
/// <param name="event" type="string">Name of the event that the subscriber is interested in.</param>
/// <param name="subsctiber" type="function pointer">Pointer to a function to be called if the event occurs.</param>
MessageBroker.prototype.AddSubscriber = function (event, subscriber) {
    var count = this.subscribers.length;

    for (var i = 0; i < count; i++) {
        if (this.subscribers[i].Event == event && this.subscribers[i].Subscriber == subscriber) {
            return;
        }
    }
    this.subscribers.push({ Event: event, Subscriber: subscriber });
}

/// <summary>
/// Remove a subscriber from an event.
/// </summary>
/// <param name="event" type="string">Name of the event that the subscriber was interested in.</param>
/// <param name="subsctiber" type="function pointer">Pointer to a function that was to be called if the event occurred.</param>
MessageBroker.prototype.RemoveSubscriber = function(event, subscriber) {
    JSON.removeArrayElement(this.subscribers, 'Subscriber', subscriber);
}

/// <summary>
/// Allow an object to inherit from another object.
/// </summary>
/// <param name="base" type="object">Base object to be inherited from.</param>
/// <param name="derived" type="object">Derived object to inherit from the base object.</param>
function inherits(base, derived) {
    for (var property in base) {
        try {
            derived[property] = base[property];
        }
        catch (warning) { }
    }
}

var _messageBroker = new MessageBroker();;
/**
 * DateTime picker
 */

/**
 * Hilfsfunktion f�r Kendo DatePicker - ist ein Datum im Picker zu sperren?
 * @param {bool} date - gew�nschtes Datum
 * @param {bool} dates - Array von Daten, die zu sperren sind
 * @return {bool} - true -> Datum sperren
 */
function dateTimeCompareDates(date, dates) {
    for (var i = 0; i < dates.length; i++) {
        if (dates[i].getDate() == date.getDate() &&
            dates[i].getMonth() == date.getMonth() &&
            dates[i].getYear() == date.getYear()) {
                return true;
        }
    }
}

/**
 * Logging
 */

/**
 * Debugausschrift auf der Konsole ausgeben
 * @param {string} message - Debugausschrift
 */
function log(message) {
    if (typeof console == "object") {
        console.log(message);
    }
}

function isInternetExplorer() {
    let ua = window.navigator.userAgent;
    let is_ie = /MSIE|Trident/.test(ua);

    return is_ie;
}

function disableButtonForJS(id) {
    let element = $('#' + id);
    if (element == undefined) {
        return;
    }
    element.data("href", element.attr("href")).removeAttr("href").addClass("k-state-disabled");
}

function enableButtonForJS(id) {
    let element = $('#' + id);
    if (element == undefined) {
        return;
    }
    if (element.data("href") == undefined){
        return;
    }
    element.attr("href", element.data("href")).removeClass("k-state-disabled");
}

/**
 * SoftConsult stuff - review
 */

var submitNotifications = [];
var now = new Date();
var hours = now.getHours();
var minutes = now.getMinutes();
var nowTimeValue = hours * 60 + minutes;
if ((hours + "").length == 1) hours = '0' + hours;
if ((minutes + "").length == 1) minutes = '0' + minutes;
var nowTimeString = hours + ":" + minutes;
var downloadCancelByUser;

var useStartButtonDisabled = true;
var removeAddedFilterClass = false;

$.fn.origKendoNumericTextBox = $.fn.kendoNumericTextBox;
$.fn.origKendoSplitter = $.fn.kendoSplitter;



var async = true;

var stepLargeData = null;
var needSendAnotherStep = null;
var largeData = null;
var maxSizeJson = 1000000;
var initialUrl = null;
var initialCallback = null;

var callbackStoreLargeData = function (data, param1, param2, param3) {
    ajaxCall(initialUrl, largeData, initialCallback, param1, param2, param3);
};

function ajaxCall(url, obj, callback, param1, param2, param3) {
    initialUrl = url;
    initialCallback = callback;
    largeData = obj;

    var sendUrl = url;
    var callbackFunction = callback;
    var sendData = obj;

    if (needSendAnotherStep != null) {
        sendUrl = storeLargeDataUrl;
        callbackFunction = callbackStoreLargeData;
        if (needSendAnotherStep) {
            if (largeData.substring(maxSizeJson * stepLargeData).length > maxSizeJson) {
                var temp = { json: obj.substring(stepLargeData * maxSizeJson, (stepLargeData + 1) * maxSizeJson) };
                sendData = JSON.stringify(temp);
            }
            else {
                var temp = { json: obj.substring(stepLargeData * maxSizeJson) };
                sendData = JSON.stringify(temp);
                needSendAnotherStep = false;
            }
            stepLargeData++;
        }
        else {
            sendUrl = initialUrl;
            callbackFunction = initialCallback;
            var temp = { isTooLarge: true };
            sendData = JSON.stringify(temp);

            initialUrl = null;
            initialCallback = null;
            largeData = null;
            needSendAnotherStep = null;
            stepLargeData = null;
        }
    }
    else if (largeData != null && largeData.length > maxSizeJson) {
        stepLargeData = 1;
        needSendAnotherStep = true;
        sendUrl = storeLargeDataUrl;
        callbackFunction = callbackStoreLargeData;
        var temp = { firstStep: true, json: largeData.substring(0, maxSizeJson) };
        sendData = JSON.stringify(temp);
    }

    var ajax = $.ajax({
        url: sendUrl,
        type: 'POST',
        data: sendData,
        contentType: 'application/json; charset=utf-8',
        cache: false,
        async: async,
        //dataType:"json",
        success: function (data) {
            //debugger;
            if (verifyReturnMessage(data)) {
                return;
            }
            else {
                if (typeof callbackFunction == 'function') {
                    callbackFunction(data, param1, param2, param3);
                }
            }
            data = null;
            delete data;
        },
        error: function (data, textStatus, exceptionThrown) {

            if (data.status == 500) {
                confirmPrompt(data.responseText.substring(1, data.responseText.length - 1), function () { });
                //console.log("Error: " + data.statusText);
                //console.log(data.responseText);
            }
            $('#manualOverlay').toggle(false);
            $('#manualOverlay').css("z-index", 120000);
            kendo.ui.progress($(document.body), false);

            if (_messageBroker) {
                _messageBroker.Notify("onError", { errorMessage: data.responseText, callbackName: callback.name, param1: param1, param2: param2, param3: param3 });
            }
        },
        complete: function () {
            try {
                ajax.onreadystatechange = null;
                ajax.abort = null;
            } catch (ex) { }
            ajax = null;
        }
    });
    return ajax;
}

function ddl_dataSource_requestEnd(e) {
    if (e.response) {
        verifyReturnMessage(e.response);
    }
}

var sessionExpiredMessageShown = false;

function showSessionExpiredPromt() {
    if (!sessionExpiredMessageShown) {
        sessionExpiredMessageShown = true;
        fromlogout = true;

        confirmPrompt(typeof sessionExpiredText === 'string' ? sessionExpiredText : "Ihre Sitzungszeit ist abgelaufen. Bitte melden Sie sich erneut an!",
            function () {
                if (window.parent) {
                    window.parent.location = rootPath + "Login";
                }
                else {
                    window.location = rootPath + "Login";
                }
            });
        return true;
    }
    return false;
}

function verifyReturnMessage(data) {
    if (data.ErrorCode == "401 UNAUTHORIZED") {
        return showSessionExpiredPromt();
    }
    else if (data.ErrorCode == "403 FORBIDDEN") {
        if (!sessionExpiredMessageShown) {
            // sessionExpiredMessageShown = true;
            //confirmPrompt(noAuthorizedText, function () { window.location = "Login/NoAccess" }); // change this to "unauthorized
            window.location = rootPath +"Login/NoAccess";
            return true;
        }
    }
    else if (data.ErrorCode == "10001 DB_SP_Error") {
        if (!sessionExpiredMessageShown) {
            confirmPrompt(data.ErrorMessage, function () { });
            try {
                if (actionOnError) {
                    actionOnError();
                }
            }
            catch (e) {
            }
            return true;
        }
    }
    else if (data.ErrorCode == "10002 Exception_Error") {
        if (!sessionExpiredMessageShown) {
            confirmPrompt(data.ErrorMessage, function () {
                $('div.k-loading-image').removeClass('div-overlay');
                $('div.k-loading-image').hide();
            });
            try {
                if (actionOnError) {
                    actionOnError();
                }
            }
            catch (e) {
            }
            return true;
        }
    }
    return false;
}


function padNumber(number) {
    if ((number + "").length == 1) {
        return "0" + number;
    }
    return number;
}

function setTimePickerValuesSec(id, value1, value2) {
    var seconds0, minutes0, hours0;

    if (value1 >= 86400) {
        value1 = 86399;
    }
    var date1 = new Date(0, 0, 0, 0, 0, value1);

    if (value2) {
        var seconds1, minutes1, hours1;

        if (value2 >= 86400) {
            value2 = 86399;
        }
        var date2 = new Date(0, 0, 0, 0, 0, value2);

        $("#slider" + id).slider("values", [date1.getHours() * 60 + date1.getMinutes(), date2.getHours() * 60 + date2.getMinutes()]);
        //if (value2 < 86400) {
            seconds1 = date2.getSeconds();
            minutes1 = date2.getMinutes();
            hours1 = date2.getHours();
        //}
        //else {
        //    seconds1 = 59;
        //    minutes1 = 59;
        //    hours1 = 23;
        //}
        $("#timeSelector2" + id + "Preview").html(padNumber(hours1) + ":" + padNumber(minutes1) + ":" + padNumber(seconds1));
        $("#timepicker2" + id).data("kendoTimePicker").value(padNumber(hours1) + ":" + padNumber(minutes1) + ":" + padNumber(seconds1));
    }
    else {
        $("#slider" + id).slider("value", date1.getHours() * 60 + date1.getMinutes());
    }

    //if (value1 < 86400) {
        seconds0 = date1.getSeconds();
        minutes0 = date1.getMinutes();
        hours0 = date1.getHours();
    //}
    //else {
    //    seconds0 = 59;
    //    minutes0 = 59;
    //    hours0 = 23;
    //}
    $("#timeSelector1" + id + "Preview").html(padNumber(hours0) + ":" + padNumber(minutes0) + ":" + padNumber(seconds0));
    $("#timepicker1" + id).data("kendoTimePicker").value(padNumber(hours0) + ":" + padNumber(minutes0) + ":" + padNumber(seconds0));
}

function setTimePickerValues(id, value1, value2) {
    var seconds0, minutes0, hours0;

    if (value2) {
        var seconds1, minutes1, hours1;
        $("#slider" + id).slider("values", [value1, value2]);

        if (value2 < 1440) {
            seconds1 = 0;
            minutes1 = parseInt(value2 % 60, 10);
            hours1 = parseInt(value2 / 60 % 24, 10);
        }
        else {
            seconds1 = 59;
            minutes1 = 59;
            hours1 = 23;
        }
        $("#timeSelector2" + id + "Preview").html(padNumber(hours1) + ":" + padNumber(minutes1) + ":" + padNumber(seconds1));
        $("#timepicker2" + id).data("kendoTimePicker").value(padNumber(hours1) + ":" + padNumber(minutes1) + ":" + padNumber(seconds1));
    }
    else {
        $("#slider" + id).slider("value", value1);
    }

    if (value1 < 1440) {
        seconds0 = 0;
        minutes0 = parseInt(value1 % 60, 10);
        hours0 = parseInt(value1 / 60 % 24, 10);
    }
    else {
        seconds0 = 59;
        minutes0 = 59;
        hours0 = 23;
    }
    $("#timeSelector1" + id + "Preview").html(padNumber(hours0) + ":" + padNumber(minutes0) + ":" + padNumber(seconds0));
    $("#timepicker1" + id).data("kendoTimePicker").value(padNumber(hours0) + ":" + padNumber(minutes0) + ":" + padNumber(seconds0));
}

function getTimePickerValues(id) {
    var obj = {};
    obj.value1 = $("#timepicker1" + id).val();
    obj.value2 = $("#timepicker2" + id).val();
    return obj;
}

function changeTimeEditor(elId, value, controId) {
    if (!$("#slider" + controId).slider("option", "disabled")) {
        $('#' + elId + 'Preview').toggle(!value);
        //$('#' + elId).css("visibility", value ? "visible" : "hidden");
        $('#' + elId).toggle(value);
    }
}

function collapse(el) {
    var panel = $(el).closest(".panelBkg");
    var content = panel.find(".panelContent");
    var panelActions = panel.find(".panelAction");
    var panelActionsLeft = panel.find(".panelActionLeft");
    //var panelTitle = panel.find(".panelHeaderTitle");

    content.slideToggle(500, function () {
        //console.log(content.is(':visible'));
        $(el).removeClass('close-panel open-panel');

        if (content.is(':visible')) {
            panelActions.toggle(true);
            panelActionsLeft.toggle(true);
            //panelTitle.toggle(false);

            $(el).addClass("open-panel");
            _messageBroker.Notify("panelOpenClose", { panel: panel, action: "open" });
        }
        else {
            $(el).addClass('close-panel');
            panelActions.toggle(false);
            panelActionsLeft.toggle(false);
            // panelTitle.toggle(true);
            _messageBroker.Notify("panelOpenClose", { panel: panel, action: "close" });
        }
    });
}

_messageBroker.AddSubscriber("panelOpenClose", panelOpenClose);

function panelOpenClose(obj) {
    resizeElements();
    var tmp = {};
    tmp.panelId = $(obj.panel).attr("id").replace(/_/g, ".");//.replace(/\./g, "_");
    tmp.state = obj.action == "open" ? 1 : 0;

    ajaxCall(storePanelStateUrl, JSON.stringify(tmp), nothing);
}

function SetStartButton(id, text, css, action, panelId, size, withoutDisable) {
    var sizeString = size ? "X" + size : "";

    $('#' + id + " span").removeClass("startActionDisabled startActionEnabled cancelAction");
    $('#' + id).attr('title', text);

    $('#' + id + " span").removeClass("startActionDisabled" + sizeString + " startActionEnabled" + sizeString + " cancelAction" + sizeString);
    $('#' + id + " span").addClass(css + sizeString);

    if (css != "cancelAction") {
        disableControls(false);
    }

    $('#' + id).unbind("click");

    $('#' + id).bind("click", function () {
        if ($(this).attr("resId") && $(this).attr("resId").length > 0) {
            logElementActivity($(this).attr("resId"));
        }

        if (css == "startActionEnabled") {
            disableControls(true);
            storeChanges(panelId, false, id, action, withoutDisable);
            SetStartButton(id, text, "cancelAction", doNothing, panelId, size, withoutDisable);
        }
        action();
    });

    if (_messageBroker) {
        _messageBroker.Notify("setStartButton", {});
    }
}

var filterControls = [];

function disableControls(state) {
    setTimeout(function () {
        if (state) {
            var controls = getFilterControls();
            filterControls = [];

            for (var i = 0; i < controls.length; i++) {
                var control = controls[i];
                if (control.controlType != 'timePicker') {
                    if (!$('#' + control.name).prop('disabled')) {
                        filterControls[filterControls.length] = control;
                    }
                }
                else if (!$("#timepicker1" + control.name).prop('disabled')) {
                        filterControls[filterControls.length] = control;
                }
            }
        }

        for (var i = 0; i < filterControls.length; i++) {
            var control = filterControls[i];

            if (control.isKendoControl) {
                $('#' + control.name).data(control.controlType).enable(!state);
            }
            else {
                if (control.controlType == 'multiselect') {
                    if (state) {
                        $('#' + control.name).multiselect('disable');
                    }
                    else {
                        $('#' + control.name).multiselect('enable');
                    }
                }

                if (control.controlType == 'timePicker') {
                    if (state) {
                        $('#slider' + control.name + '_check').attr("disabled", "disabled");
                    }
                    else {
                        $('#slider' + control.name + '_check').removeAttr("disabled");
                    }
                    $('#slider' + control.name).slider("option", "disabled", state);
                    $("#timepicker1" + control.name).data("kendoTimePicker").enable(!state);
                    $("#timepicker2" + control.name).data("kendoTimePicker").enable(!state);
                }

                if (state) {
                    $('#' + control.name).attr("disabled", "disabled");
                }
                else {
                    $('#' + control.name).removeAttr("disabled");
                }
            }
        }
        if (!state) {
            filterControls = [];
        }
    }, 100);
}

function doNothing() {
}

function getFilterControls() {
    return [];
}

//add tab index for kendo numeric
$.fn.kendoNumericTextBox = function (e) {
    var result = this.origKendoNumericTextBox(e);

    result.prev().attr("tabindex", result.attr("tabindex"));

    return result;
};

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function (obj, start) {
        for (var i = (start || 0), j = this.length; i < j; i++) {
            if (this[i] === obj) { return i; }
        }
        return -1;
    };
}

$(document).ready(function () {
    $(document).find("a").click(clickHandler);
    $(document).find("li").click(clickHandlerLi);

    $(document).find(".file-upload").each(function () {
        $(this).children("input[type='file']").change(function () {
            var id = $(this).attr("id");

            $("#" + id + "_file").val(extractFileName($(this).val()));
        });
    });

    submitNotifications.push(function () {
        $(document).find(".k-grid-add").each(function () {
            var container = $(this).parents(".k-grid");
            var id = container.attr("id");
            var grid = container.data("kendoGrid");
            var hidden = $("#" + id + "Data");
            hidden.val(JSON.stringify(grid.dataSource._data.toJSON()));
        });
    });

    $("form").attr("autocomplete", "off");
    $("input").attr("autocomplete", "off");
    $("textarea").attr("autocomplete", "off");
    $("select").attr("autocomplete", "off");
    //resize element to fill the screen
    $(window).resize(resizeElements);
    setTimeout('resizeElements();', 0);

    setTimeout(function () {
        $(".k-grid").each(function (i, e) {
            var grid = $(this);

            // Diese Funktion verhindert, dass die Grid-Spalten gro� gezogen werden, 
            // indem die Summe der Spaltenbreiten fest f�r Header und Body gesetzt werden!
            // Problem: Funktion betrachtet nur die Grids, die bei der Initialisierung der ersten Seite vorhanden sind!
            // fixGridSize(grid);

            var kGrid = grid.data("kendoGrid");
            if (kGrid) {
                kGrid.bind("columnHide", grid_columnHide);
            }

            if (grid.data("kendoDraggable")) {
                grid.data("kendoDraggable").bind("drag", function (e) {
                    var div = grid.find(".k-grid-header-wrap");
                    var divToScroll = grid.find(".k-grid-content");

                    if (grid.find(".k-scrollbar-vertical").length > 0) {
                        divToScroll = grid.find(".k-virtual-scrollable-wrap");
                    }
                    if (e.x.location < div.offset().left) {
                        divToScroll.scrollLeft(divToScroll.scrollLeft() - 20);
                    }
                    if (e.x.location > div.offset().left + div.width()) {
                        divToScroll.scrollLeft(divToScroll.scrollLeft() + 20);
                    }

                    e.preventDefault();
                });
            }
        });
    }, 0);

    $('.iconGrid').find('.k-grid-toolbar').hide();

    $(document).ajaxError(function (event, jqxhr, settings, thrownError) {
        if (jqxhr.status === 408) {
            console.log("AJAX request FAILED with status code 408 - login required");
            showSessionExpiredPromt();
        }
    });
});


function clickHandlerLi(e) {
    var li = $(this);

    if (li.hasClass("k-state-disabled")) {
        return;
    }
    if (li.attr("resId") && li.attr("resId").length > 0) {
        logElementActivity(li.attr("resId"));
    }
}

//make some changes to the handlers
function clickHandler(e) {
    var a = $(this);

    if (a.hasClass("k-state-disabled")) {
        e.preventDefault();
        a.blur();
        return false;
    }
    if (a.hasClass("preventLostChanges")) {
        if (checkChange()) {
            e.preventDefault();
            a.blur();
            return false;
        }
    }

    if (a.attr("resId") && a.attr("resId").length > 0) {
        logElementActivity(a.attr("resId"));
    }

    //if sumbit first validate and after show busy div
    if (a.hasClass("submit")) {
        var form = a.parents('form');

        if (form.length == 0) {
            form = $(document.forms[0]);
        }

        if (!a.hasClass("validates")) {
            form.validate().cancelSubmit = true;
        }

        for (var i = 0, n = submitNotifications.length; i < n; i++) {
            submitNotifications[i]();
        }

        setTimeout("if ($(document.forms[0]).valid()) kendo.ui.progress($(document.body), true);", 1);
        form.attr('action', a.attr('href')).submit();

        return false;
    }
/*
    //if delete show confirmation
    else if (a.hasClass("grid-delete")) {
        confirmPrompt(
            gridDeleteConfirm,
            function () {
                var form = a.parents('form');

                if (form.length == 0) {
                    form = $(document.forms[0]);
                }

                form.validate().cancelSubmit = true;

                for (var i = 0, n = submitNotifications.length; i < n; i++) {
                    submitNotifications[i]();
                }

                setTimeout("if ($(document.forms[0]).valid()) kendo.ui.progress($(document.body), true);", 1);
                form.attr('action', a.attr('href')).submit();
            },
            function () { }
        );

        return false;
    }
    //not used yet, it's for client delete not db delete
    else if (a.hasClass("grid-client-delete")) {
        confirmPrompt(
            gridDeleteConfirm,
            function () {
                var grid = a.parents(".k-grid").data("kendoGrid");

                grid.select().each(function () { grid.removeRow(this); });
            },
            function () { }
        );

        return false;
    }
    //not used yet, it's for client add not db add
    else if (a.hasClass("k-grid-add")) {
        var grid = a.parents(".k-grid").data("kendoGrid");
        grid.addRow();
        grid.editCell($(".k-grid").data("kendoGrid").table.find("td:not([class]):not([colspan]):first"));

        return false;
    }
*/
    else if (a.hasClass("grid-clear-filters")) {
        a.attr("href", "#");
        var grid = a.parents(".k-grid").data("kendoGrid");
        grid.dataSource.filter({});
    }
    else if (a.hasClass("grid-clear-sorting")) {
        a.attr("href", "#");
        var grid = a.parents(".k-grid").data("kendoGrid");
        grid.dataSource.sort({});
    }
    //change url for export to perform some task before
    else if (a.hasClass("exportbutton")) {
        var id = a.attr("id").replace(/ExportButton/, "");
        exportGrid(id);

        return false;
    }
    else if (a.hasClass("grid-auto-size")) {
        var grid = a.parents(".k-grid");
        autoSizeGrid(grid);
        eval(a.attr("storeState"));
        a.blur();

        return false;
    }
/*
    else if (typeof a.attr("href") != "undefined" && a.attr("href").substring(0, 1) != "#" && !a.hasClass("noprogress")) {
        setTimeout("if ($(document.forms[0]).valid()) kendo.ui.progress($(document.body), true);", 1);
    }
*/
}


var currentFilter = null;
//when screen is to small rearrange column menu to fit
function setFilterPosition(element) {
    if (!element) {
        element = currentFilter;
    }
    var divFilter = $(element).find('.k-animation-container').first();
    if (divFilter.length == 0) {
        currentFilter = element;
        setTimeout("setFilterPosition()", 100);
    }
    else {
        var filterItemSize = $(element).height();
        var maxSize = 6 * filterItemSize;
        var filterSize = divFilter.height();

        if ($(document).height() < 270) {
            if (filterSize < 149)
                divFilter.addClass("filterLower");
            else {
                divFilter.removeClass("filterHigher");
                divFilter.addClass("filterHigherScroller");
            }
        }
        else if (filterSize < 149) {
            divFilter.addClass("filterLower");
		}
        else {
            divFilter.removeClass("filterHigherScroller");
            divFilter.addClass("filterHigher");
        }

        if (removeAddedFilterClass) {
            divFilter.removeClass("filterHigher");
            divFilter.removeClass("filterLower");
        }
        currentFilter = null;
    }
}

//resize element on the screen to fill all screen
function resizeElements() {
    resizeTables($(".table100"));

    $('.k-filter-item').each(function () {
        $(this).mouseenter(function () {
            setFilterPosition(this);
        });
    });

    $(".k-tabstrip:not(.auto-resize-off)").each(function () {
        var availableHeight = $(this).parent().height();
        var fixedRowsHeight = 0;

        $(this).children().not(".k-content").each(function () {
            fixedRowsHeight += $(this).outerHeight();
        });

        $(this).children(".k-content").height(availableHeight - fixedRowsHeight);

        var delta = availableHeight - $(this).outerHeight();
        var ah = availableHeight - fixedRowsHeight + delta;

        $(this).children(".k-content").height(ah);
    });

    resizeTables($(".table100b"));

    $(".k-splitter").each(function () {
        var splitter = $(this);
        var availableHeight = splitter.parent().height();

        splitter.height(availableHeight);

        var delta = availableHeight - splitter.outerHeight();

        splitter.height(availableHeight + delta);
    });

    $(".height100").each(function () {
        var dataArea = $(this).find(".k-grid-content");

        dataArea.height(0);

        var parent = $(this).parent();
        var availableHeight = parent.hasClass("k-tabstrip") ? $(this).height() : parent.height();
        var minHeight = parseInt($(this).css('min-height'), 10);

        if (availableHeight < minHeight) {
            availableHeight = $(this).height();
        }
        var otherElementsHeight = 0;

        $(this).find(".k-grid").children().not(".k-grid-content").each(function () {
            otherElementsHeight += $(this).outerHeight();
        });

        dataArea.height(availableHeight - otherElementsHeight);

        var delta = availableHeight - $(this).outerHeight();

        dataArea.height(availableHeight - otherElementsHeight + delta);
    });

    $(".k-pane").each(function () {
        var pane = $(this);
        var dataArea = pane.children(".k-grid").find(".k-grid-content");

        if (dataArea.length > 0) {
            var availableHeight = pane.height();
            var otherElementsHeight = 0;

            pane.find(".k-grid").children().not(".k-grid-content").each(function () {
                otherElementsHeight += $(this).outerHeight();
            });

            dataArea.height(availableHeight - otherElementsHeight);

            var delta = availableHeight - pane.outerHeight();

            dataArea.height(availableHeight - otherElementsHeight + delta);
        }
    });

    $(".k-treeview").each(function () {
        var tv = $(this);

        tv.height(0);

        var availableHeight = $(this).parent().height();

        tv.height(availableHeight);
    });

    if (_messageBroker) {
        _messageBroker.Notify("resizeWindow", {});
    }
}

//resize table in screen to fill all screen
function resizeTables(tables) {
    tables.each(function () {
        var availableHeight = $(this).parent().height();
        var fixedRowsHeight = 0;

        $(this).children().children("tr.autoheight").children("td").height(availableHeight);

        $(this).children().children("tr").not(".autoheight").each(function () {
            fixedRowsHeight += $(this).outerHeight();
        });

        $(this).children().children("tr.autoheight").children("td").height(availableHeight - fixedRowsHeight);

        $(this).children().children("tr.autoheight").find(".scroller").each(function () {
            $(this).height(availableHeight - fixedRowsHeight);
        });
    });
}

function extractFileName(val) {
    val = val.substring(val.lastIndexOf("\\") + 1);
    val = val.substring(val.lastIndexOf("/") + 1);

    return val;
}

function stripScripts(s) {
    var div = document.createElement('div');
    div.innerHTML = s;
    var scripts = div.getElementsByTagName('script');
    var i = scripts.length;

    while (i--) {
        scripts[i].parentNode.removeChild(scripts[i]);
    }
    return div.innerHTML;
}

//popup with message can be confirm or just alert
function confirmPrompt(text, actionForYes, actionForNo, actionForCancel, componentName, winId) {
    text = text.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, "");
    if (componentName) {
        componentName = ": " + componentName;
    }
    else {
        componentName = "";
    }
    if (!isIframeApp && parent.confirmPrompt && self != top) {
        parent.confirmPrompt(text, actionForYes, actionForNo, actionForCancel);
    }
    else if (!winId || (winId && $('#confirmPromptMessage_' + winId).length == 0)) {
        var zIndex = new Date().valueOf();

        var container12 = $('<div style="position: absolute; top: 0px; width: 100%; height: 100%; background-color: rgba(0,0,0,0.5); z-index: ' + zIndex + '; text-align: center;">'
            + '<div class="k-window" style="position: absolute; margin-top: 20px; text-align: left; min-width: 300px; max-width: 800px; min-height: 150px; max-height: 400px; overflow: auto;">'
            + '<div class="k-header k-window-titlebar" style="text-align: left;"><div class="k-window-title">' + promptTitle + componentName + '</div></div>'
            + '<div class="k-window-content confirmPromptMessage" style="padding: 30px;" id="confirmPromptMessage' + (winId ? '_' + winId : '') + '">' + text + '</div>'
            + '<div class="page-buttons" id="confirmPromptButtons">'
            + (actionForNo
                ? ('<a href="#" class="k-button" id="confirmPromptYes"> ' + promptYes + '</a><a href="#" class="k-button" id="confirmPromptNo"> '  + promptNo  + '</a>')
                : ('<a href="#" class="k-button" id="confirmPromptYes"> ' + promptOK  + '</a>')
            )
            + (actionForCancel
                ? ('<a href="#" class="k-button" id="confirmPromptCancel"> ' + promptYes + '</a>')
                : ('')
            )
            + '</div></div></div>'
        );

        $(document.body).append(container12);

        container12.find('#confirmPromptYes').bind("click", function () {
            container12.remove();
            actionForYes();
        });

        if (actionForNo) {
            container12.find('#confirmPromptNo').bind("click", function () {
                container12.remove();
                actionForNo();
            });
        }

        if (actionForCancel) {
            container12.find('#confirmPromptCancel').bind("click", function () {
                container12.remove();
                actionForCancel();
            });
        }

        var div = container12.find(".k-window");
        div.css("left", (container12.width() - div.width()) / 2);
        div.css("top", (container12.height() - div.height()) / 4);
    }
}

var modelList;
//function that get initila values for check changes
function initFormChangeCheck() {
    modelList = new Object();

    if (document.forms && document.forms.length > 0) {
        for (var i = 0; i < document.forms.length; i++) {
            for (var indexElement = 0; indexElement < document.forms[i].elements.length; indexElement++) {
                el = document.forms[i].elements[indexElement];

                if (el.type == "checkbox") {
                    modelList[el.id] = el.checked;
                }
                else if (el.type == "hidden") {
                    modelList["h" + el.id] = el.value;
                }
                else if (el.type == "textarea") {
                    var editor = $(el).data("kendoEditor");
                    if (editor) {
                        modelList[el.id] = editor.value();
                    }
                    else {
                        modelList[el.id] = el.value;
                    }
                }
                else {
                    modelList[el.id] = el.value;
                }
            }
        }
    }

    //log('save initial value for page');
}

function initFormChangeCheckByElement( element ) {
    modelList = new Object();

    let form = $('#' + element);

    if (form !== undefined && form.length > 0) {
        for (var i = 0; i < form.length; i++) {
            for (var indexElement = 0; indexElement < form[i].elements.length; indexElement++) {
                el = form[i].elements[indexElement];
                if (el.type == "checkbox") {
                    modelList[el.id] = el.checked;
                }
                else if (el.type == "hidden") {
                    modelList["h" + el.id] = el.value;
                }
                else if (el.type == "textarea") {
                    var editor = $(el).data("kendoEditor");
                    if (editor) {
                        modelList[el.id] = editor.value();
                    }
                    else {
                        modelList[el.id] = el.value;
                    }
                }
                else {
                    modelList[el.id] = el.value;
                }
            }
        }
    }
    //log('save initial value for page');
}

//function which compares the initial values to detect changes
function checkChange() {
    if (document.forms && document.forms.length > 0) {
        for (let i = 0; i < document.forms.length; i++) {
            for (let indexElement = 0; indexElement < document.forms[i].elements.length; indexElement++) {
                let el = document.forms[i].elements[indexElement];

                if (modelList[el.id] === undefined) {
                    continue;
                }

                if (el.id && el.id != "" && modelList[el.id] == undefined) {
                    modelList[el.id] = "";
                }


                if (el.type == "checkbox") {
                    // invisible checkboxes cause trouble
                    if (!$('#' + el.id).is(':visible')) {
                        continue;
                    }
                    if (el.id && el.id != "" && modelList[el.id] != el.checked) {
                        return true;
                    }
                }
                else if (el.type == "textarea") {
                    var editor = $(el).data("kendoEditor");
                    if (editor) {
                        if (el.id && el.id != "" && modelList[el.id] != editor.value()) {
                            return true;
                        }
                    }
                    else if (el.id && el.id != "" && modelList[el.id] != el.value) {
                        return true;
                    }
                }
                else if (el.type == "hidden") {
                    if (el.id && el.id != "" && modelList["h" + el.id] != el.value) {
                        return true;
                    }
                }
                else if ((el.dataset != undefined) && (el.dataset.role == "dropdownlist")) {
                    if (el.value == -1 && modelList[el.id] == "") {

                    }
                    else if (el.id && el.id != "" && modelList[el.id] != el.value) {
                        return true;
                    }
                }
                else if (el.id && el.id != "" && modelList[el.id] != el.value) {
                    return true;
                }
            }
        }
    }
    return false;
}

var filterInputs = [];

function storeChanges(panelId, bindChange, buttonId, action, size, withoutDisable) {
    var newId = "#" + panelId.split(".").join("\\.");
    var inputs = $(newId + ' input');

    for (var i = 0; i < inputs.length; i++) {
        if ($(inputs[i]).attr("type") == "checkbox") {
            filterInputs[$(inputs[i]).attr("id")] = document.getElementById($(inputs[i]).attr("id")).checked;
        }
        else
            filterInputs[$(inputs[i]).attr("id")] = $(inputs[i]).val();
        if (bindChange) {
            $(inputs[i]).bind("change", function () {
                if (!$("#" + buttonId + " span").hasClass("cancelAction" + (size ? "X" + size : "")))
                    checkChanges(panelId, buttonId, action, size, withoutDisable);
            });
        }
    }

    var multiselects = $(newId + ' .k-multiselect-button');

    for (var i = 0; i < multiselects.length; i++) {
        var id = $(multiselects[i]).attr("id").substring(0, $(multiselects[i]).attr("id").indexOf("Button"));

        filterInputs[id] = $('#' + id).multiselect("getChecked").map(function () { return this.value; }).get();
        if (bindChange) {
            //$('#' + id).on("multiselectclick", function (event, ui) {
            $('#' + id).bind("multiselectbeforeclose", function () {
                /* event: the original event object ui.value: value of the checkbox ui.text: text of the checkbox ui.checked: whether or not the input was checked or unchecked (boolean) */
                if (!$("#" + buttonId + " span").hasClass("cancelAction" + (size ? "X" + size : "")))
                    checkChanges(panelId, buttonId, action, size, withoutDisable);
            });
        }
    }
}

function checkChanges(panelId, buttonId, action, size, withoutDisable) {
    var newId = "#" + panelId.split(".").join("\\.");
    var inputs = $(newId + ' input');
    for (var i = 0; i < inputs.length; i++) {
        if ($(inputs[i]).attr("type") == "checkbox") {
            if (document.getElementById($(inputs[i]).attr("id")).checked != filterInputs[$(inputs[i]).attr("id")]) {
                SetStartButton(buttonId, startText, "startActionEnabled", action, panelId, size);
                return;
            }
        }
        else
            if ($(inputs[i]).val() != filterInputs[$(inputs[i]).attr("id")]) {
                SetStartButton(buttonId, startText, "startActionEnabled", action, panelId, size);
                return;
            }
    }


    var multiselects = $(newId + ' .k-multiselect-button');
    for (var i = 0; i < multiselects.length; i++) {
        var id = $(multiselects[i]).attr("id").substring(0, $(multiselects[i]).attr("id").indexOf("Button"));
        if (!checkArrays(filterInputs[id], $('#' + id).multiselect("getChecked").map(function () { return this.value; }).get())) {
            SetStartButton(buttonId, startText, "startActionEnabled", action, panelId, size);
            return;
        }
    }

    if (useStartButtonDisabled) {
        SetStartButton(buttonId, startText, "startActionDisabled", doNothing, panelId, size);
    }
}


function printDiv(div) {
    var printDivCSS = "";
    //printDivCSS = new String('<link href="print.css" rel="stylesheet" type="text/css" media="print">');
    $("#print_frame").remove();

    var iframe = $('<iframe />', {
        name: "print_frame",
        id: "print_frame",
        frameborder: 0,
        width: 0,
        height: 0
    });

    iframe.load(function () {
        window.frames["print_frame"].document.body.innerHTML = printDivCSS + div[0].innerHTML;
        window.frames["print_frame"].focus();
        window.frames["print_frame"].print();
    });

    iframe.appendTo('body');
}

var myWindow = null;
function printWindow(div) {
    if (!myWindow) {
        myWindow = window.open("", '_blank');
    }
    myWindow.document.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
    myWindow.document.write("<html>");
    myWindow.document.write("<head></head>");
    myWindow.document.write("<body>");
    myWindow.document.write(div);
    myWindow.document.write("</body>");
    myWindow.document.write("</html>");
    myWindow.document.close();
    myWindow.focus();
    myWindow.print();
    setTimeout("if(myWindow){myWindow.close(); myWindow=null;}", 3000);

}



var windowLater = null;
var urlLater = null;
var windowLoadInterval = null;
var windowNeedLoaded = null;

function printWindowUrl(url, loadLater) {
    var myWindow = window.open("", "", "width=750,height=800");
    var windowLater = myWindow;
    var urlLater = url;
    myWindow.document.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
    myWindow.document.write("<html>");
    myWindow.document.write("<head></head>");
    myWindow.document.write("<body >");
    myWindow.document.write('<table width="710px" height="760px"><tbody><tr><td align="center">' + waitText + '</td></tr></tbody></table>');
    myWindow.document.write("</body>");
    myWindow.document.write("</html>");
    myWindow.document.close();
    if (!loadLater) {
        myWindow.location.href = url;
    }
    else {
        windowLoadInterval = setInterval(function (window) { if (windowNeedLoaded) { windowLater.location.href = urlLater; urlLater = null; windowLater = null; clearInterval(windowLoadInterval); windowNeedLoaded = null; } }, 500);
    }
    myWindow.focus();
}

function onDialogRefresh(e) {
    let that = this;
    setTimeout(function () {
        that.center();
    }, 0);
}

/**
 * Erstellt einen Dialog in einen DIV-Container
 * 
 * @param {string} idContainer
 * @param {any} windowOptions als js-Objekt entsprechend der kendoWindow API; wird die position nicht gesetzt, wird der Dialog zentriert
 * @param {function} onInit wird nach dem Initialisieren des Dialogs aufgerufen wird
 */
function createDialog(idContainer, windowOptions, onInit) {
    if (idContainer == undefined || onInit == undefined) {
        console.log("Abbruch createDialog aufgrund von fehlerhaften Argumenten.");
        console.log("idContainer: " + idContainer + ", windowOptions: " + windowOptions == undefined ? "default" : windowOptions + ", onInit: " + onInit);
        return;
    }

    const dlgTitleBarHeight = 30;
    const dlgDefaultContentHeight = 115;

    // ggf. Defaultconfig setzen

    if (windowOptions == undefined) {
        windowOptions = {
            width: 400,
            height: dlgTitleBarHeight + dlgDefaultContentHeight,
            modal: true,
            autoFocus: false,
            resizable: false,
            scrollable: true
        };
    }
    else {
        if (windowOptions.height != undefined && windowOptions.height !== "auto") {
            windowOptions.height += dlgTitleBarHeight;
        }
    }

    /* Achtung: wenn der Dialog mit Autofocus instanziiert wird (autoFocus: true), scheitert 
     * ggf. das Setzen des Focus auf ein Kind-Element.
     */
    if (windowOptions.autoFocus == undefined) {
        windowOptions.autoFocus = false;
    }

    let container = $("#" + idContainer);

    /* Im Zuge des Schlie�ens des Dialogs wird destroy() aufgerufen. Damit verbunden ist ein Bereinigen
     * des DOMs, allerdings inklusive des Container-Elements. Das muss beim erneuten Oeffnen des Dialogs
     * eingefuegt werden.
     */
    if (!container.length) {
        $(".dynamicDlgRoot").append("<div id='" + idContainer + "'></div>");
        container = $("#" + idContainer);
    }

    let window = container.data("kendoWindow");

    // Dialog noch nicht vorhanden -> Erstellen!
    if (window == undefined) {
        window = $("#" + idContainer).kendoWindow(windowOptions);
        window = $("#" + idContainer).data("kendoWindow");
    }

    let currentFocus = $(':focus');

    if (window != undefined) {
        window.unbind('refresh');
        window.unbind('close');

        window.content(loadingInfo);

        onInit();

        // Wenn die Position nicht gesetzt ist wird der Dialog zentriert dargestellt
        if (windowOptions.position == undefined) {
            window.open().center();
            window.bind("refresh", onDialogRefresh);
        }
        else {
            window.open();
        }

        window.bind('close', function () {
            setTimeout(function(){
                if (currentFocus && currentFocus.length) {
                    $(currentFocus).first().focus();
                    console.log("restored focus");
                }
                window.destroy();
            },800);
        });
    }
}

/**
 * Setze Dialog-H�he neu (beim Refresh einzuf�gen)
 * 
 * @param {kendoWindow} window -
 * @param {string} div Id des �u�eren DIVS
 */
function setDialogHeight(window, div) {
    let dialogHeight = $('#' + div).outerHeight(true) + 20;
    window.setOptions({
        height: dialogHeight
    });
}

function checkArrays(arrA, arrB) {

    //check if lengths are different
    if (arrA.length !== arrB.length) {
        return false;
    }

    //slice so we do not effect the original
    //sort makes sure they are in order
    //join makes it a string so we can do a string compare
    var cA = arrA.slice().sort().join(",");
    var cB = arrB.slice().sort().join(",");

    return cA === cB;
}

$.urlParam = function (name, url) {
    if (!url) {
        url = window.location.href;
    }

    var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(url);
    if (!results) {
        return 0;
    }
    return results[1] || 0;
};

function isElementInViewportVertical(el, parent) {

    if (el instanceof jQuery) {
        el = el[0];
    }
    if (parent instanceof jQuery) {
        parent = parent[0];
    }

    var rect = el.getBoundingClientRect();
    var parentRect = parent.getBoundingClientRect();

    return (
        rect.top <= parentRect.bottom &&
        rect.bottom >= parentRect.top
    );
}

function changeMBRToMax() {
    if (map && maxMBR) {
        map.setView({ bounds: maxMBR });
    }
}

function logElementActivity(id) {
    /*
    TODO : let the service do the  logging
    setTimeout(function () {
        var obj = { id: id };
        ajaxCall(logElementActivityUrl, JSON.stringify(obj), logActivityElementCallBack);
    }, 1000);
    */
}

function logActivityElementCallBack() {
}

/**
 * Ruft eine Funktion basierend auf dem Funktionsbezeichener auf und setzt f�r den this-Pointer den entsprechenden Context
 * @param {any} functionName - Name der Funktion, die ausgefuehrt werden soll
 * @param {any} context - 
 * @returns {any} Rueckgabewert der aufgerufenen Funktion
 */
function executeFunctionByName( functionName, context /*, args */ ) {
    var args, namespaces, func;

    if( typeof functionName === 'undefined' ) { throw 'function name not specified'; }

    if( typeof context !== 'undefined' ) { 
        if( typeof context === 'object' && context instanceof Array === false ) { 
            if( typeof context[ functionName ] !== 'function' ) {
                throw context + '.' + functionName + ' is not a function';
            }
            args = Array.prototype.slice.call( arguments, 2 );

        } else {
            args = Array.prototype.slice.call( arguments, 1 );
            context = window;
        }

    } else {
        if( typeof eval( functionName ) !== 'function' ) { throw functionName + ' is not a function'; }
        context = window;
    }

    namespaces = functionName.split( "." );
    func = namespaces.pop();

    for( var i = 0; i < namespaces.length; i++ ) {
        context = context[ namespaces[ i ] ];
    }

    return context[ func ].apply( context, args );
}

/**
 * 
 * @param {any} idPanelSplitter - ID of the element
 * @param {any} orientationSplitter - "horizontal" or "vertical"
 * @param {any} functionSetSize - resize callback handler
 */
function splitterInit(idPanelSplitter, orientationSplitter, functionSetSize) {
    splitterInitBySelector("#" + idPanelSplitter, { orientation: orientationSplitter }, functionSetSize);
}

/**
 * 
 * @param {any} panelSplitter - selector including the prefix for element or class ("#myDivId" or ".myClass")
 * @param {any} options - Kendo Splitter configuration object
 * @param {any} functionSetSize - resize callback handler
 */
function splitterInitBySelector(panelSplitter, options, functionSetSize) {
    let splitter = $(panelSplitter).data('kendoSplitter');

    if (splitter == undefined) {
        let cfg = options || {};
        splitter = $(panelSplitter).kendoSplitter(cfg);

        setTimeout(function () {
            let splitter = $(panelSplitter).data('kendoSplitter');
            splitter.bind('resize', function () {
                functionSetSize();
            });
        }, 100);
    }
}

function setFieldsVisibility(FieldsVisibility, rootElement, skipEnable) {
    for (var i = 0; i < FieldsVisibility.length; i++) {
        if ((null !== FieldsVisibility[i].Value) && ("" !== FieldsVisibility[i].Value)) {
            var element = $("#" + FieldsVisibility[i].Value);

            if (element === undefined) {
                continue;
            }

            var key = FieldsVisibility[i].Key.split('-');

            switch (Number(key[1])) {
                case 0:
                    element.css("visibility", "hidden");
                    element.children().css("visibility", "hidden");
                    break;
                case 1:
                    if (skipEnable === true) {
                        continue;
                    }
                    element.css("visibility", "visible");
                    element.children().css("visibility", "visible");
                    if (element.style !== undefined) {
                        element.style.setProperty('display', '');
                    }
                    else {
                        element.css("display", "");
                        element.children().css("display", "");
                    }
                    break;
                case 2:
                default:
                    element.addClass("disabledClass");
                    element.off();//?
                    element.keypress(function (e) { e.preventDefault(); });
                    element.click(function (e) { e.preventDefault(); });
                    element.attr("tabindex", -1);
                    element.attr("readonly", "readonly");

                    var elementInput = $("#" + FieldsVisibility[i].Value + " input");
                    if (typeof elementInput !== 'undefined') {
                        elementInput.attr("tabindex", -1);
                        elementInput.attr("readonly", "readonly");
                        elementInput.off();
                    }

                    var elementSpan = $("#" + FieldsVisibility[i].Value + " span");
                    if (typeof elementSpan !== 'undefined') {
                        elementSpan.attr("tabindex", -1);
                        elementSpan.attr("readonly", "readonly");
                        elementSpan.off();
                    }
                    break;
                case 3:
                    if (element.style !== undefined) {
                        element.style.setProperty('display', 'none', 'important');
                    }
                    else {
                        element.css("display", "none");
                        element.children().css("display", "none");
                    }
                    break;
            }
        } else {
            var entry = FieldsVisibility[i].Key.split("-");
            if (entry.length > 1) {
                switch (entry[1]) {
                    case "0"://not visible
                        if (rootElement !== undefined) {
                            $("#" + rootElement).find("[data-coreid='" + entry[0] + "']").css("visibility", "hidden");
                        }
                        else {
                            $("[data-coreid='" + entry[0] + "']").css("visibility", "hidden");
                        }
                        break;
                    case "1"://enabled
                        if (skipEnable === true) {
                            continue;
                        }
                        if (rootElement !== undefined) {
                            $("#" + rootElement).find("[data-coreid='" + entry[0] + "']").each(function () {
                                if (this.style !== undefined) {
                                    this.style.setProperty('visibility', 'visible');
                                    this.style.setProperty('display', '', 'important');
                                }
                                else {
                                    this.css("visibility", "visible");
                                    this.css("display", "");
                                }
                            });
                        }
                        else {
                            $("[data-coreid='" + entry[0] + "']").each(function () {
                                if (this.style !== undefined) {
                                    this.style.setProperty('visibility', 'visible');
                                    this.style.setProperty('display', '', 'important');
                                }
                                else {
                                    this.css("visibility", "visible");
                                    this.css("display", "");
                                }
                            });
                        }
                        break;
                    case "2"://disabled
                        let elements;
                        if (rootElement !== undefined) {
                            elements = $("#" + rootElement).find("[data-coreid='" + entry[0] + "']");
                        }
                        else {
                            elements = $("[data-coreid='" + entry[0] + "']");
                        }

                        elements.each(function () {
                            let element = $(this);
                            element.addClass("disabledClass");
                            element.off();//?
                            element.keypress(function (e) { e.preventDefault(); });
                            element.click(function (e) { e.preventDefault(); });
                            element.attr("tabindex", -1);
                            element.attr("readonly", "readonly");
                        });

                        let elementInput = elements.find("input");
                        if (typeof (elementInput) !== 'undefined') {
                            elementInput.attr("tabindex", -1);
                            elementInput.attr("readonly", "readonly");
                            elementInput.off();
                        }

                        let elementSpan = elements.find("span");
                        if (typeof (elementSpan) !== 'undefined') {
                            elementSpan.attr("tabindex", -1);
                            elementSpan.attr("readonly", "readonly");
                            elementSpan.off();
                        }

                        elementSpan = elements.children("span");
                        if (typeof (elementSpan) !== 'undefined') {
                            elementSpan.addClass("disabledClass");
                        }
                        break;
                    case "3"://not visible
                        if (rootElement !== undefined) {
                            $("#" + rootElement).find("[data-coreid='" + entry[0] + "']").each(function () {
                                if (this.style !== undefined) {
                                    this.style.setProperty('display', 'none', 'important');
                                }
                                else {
                                    this.css("display", "none");
                                }
                            });
                        }
                        else {
                            $("[data-coreid='" + entry[0] + "']").each(function () {
                                if (this.style !== undefined) {
                                    this.style.setProperty('display', 'none', 'important');
                                }
                                else {
                                    this.css("display", "none");
                                }
                            });
                        }
                        break;
                }
            }
        }
    }
}

;
var columnAliases = [];
var autoSizeGridOnBind = false;
var currentGridModelName = null;


var selectedKeyInLazyGrid = null;
var prevNextRowDoesNotExist = false;
var gridInLoadingBeforeKeyPress = false;
var lastKey = null;

function grid_dataSource_requestEnd(e) {
    if (e.response) {
        verifyReturnMessage(e.response);
        /*
        console.log("grid_dataSource_requestEnd: total " + this.total() + " current page " + this.page() + " available pages " + this.totalPages());
        console.log("grid_dataSource_requestEnd: response.Total " + e.response.Total + " rowFrom " + e.response.rowFrom + " rowTo " + e.response.rowTo);
        */
        // does the response contain data for the requested page? 
        if(e.response.Total){
            if(e.response.Total > 0 ){
                if( this.page() > ( e.response.Total / this.pageSize() + 1)){
                    //no data available for the current page, request data for page 1
                    this.page(1);
                }
            }
        }
    }

}

function scrollToSelectedRow(grid, row, key, reScroll) {
    if (!row || !row.length)
        return;
    var rowHeight = row.height();
    if (grid.element.find(".k-scrollbar-vertical").length > 0) {
        var divScrollTop = grid.element.find(".k-scrollbar-vertical").scrollTop();
        var divHeight = grid.element.find(".k-grid-content").height();
        if (row[0].offsetParent) {
            var divTop = $(row[0].offsetParent).position().top;
            var rowTop = row[0].offsetTop;

            if (rowTop + divTop < 0) {
                grid.element.find(".k-scrollbar-vertical").scrollTop(divScrollTop + (rowTop + divTop));
            }
            else {
                if (divHeight - divTop - rowTop - rowHeight < 0) {
                    grid.element.find(".k-scrollbar-vertical").scrollTop(divScrollTop - (divHeight - divTop - rowTop - 2 * rowHeight) - 2);
                }
            }
        }
    }
    else {
        var rowTop = row[0].offsetTop;
        var divScrollTop = grid.element.find(".k-grid-content").scrollTop();
        var divHeight = grid.element.find(".k-grid-content").height();

        if (rowTop < divScrollTop) {
            grid.element.find(".k-grid-content").animate({ scrollTop: rowTop }, 100);
        }
        else {
            var currentScroll = (rowTop + 2 * rowHeight) - (divScrollTop + divHeight);
            if (currentScroll > 0) {
                grid.element.find(".k-grid-content").animate({ scrollTop: rowTop + 2 * rowHeight - divHeight }, 50);
            }
        }
    }

    //if (reScroll) {
    //    //rescroll in middle of grid
    //    setTimeout(function () {
    //        scrollToSelectedRow(grid, row, null);
    //    }, 10);
    //}
}

function triggerChangeSelection() {
    var target = $('.k-grid-content');
    //give it a tabindex so it can get focus and accept key input.
    target.attr("tabindex", 0);
    target.unbind("keydown");
    target.keydown(function (e) {
        changeGridSelection(e);
    });
}

function changeGridSelection(e) {
    e.preventDefault();
    if (gridInLoadingBeforeKeyPress)
        return;

    var kGrid, curRow, newRow;

    kGrid = $('.k-grid-content').closest('.k-grid').data("kendoGrid");

    //get currently selected row
    curRow = kGrid.select();
    var selected = $.map(curRow, function (item) {
        return $(item).find("td.rowid");
    });

    var id = $.map($(selected), function (item) {
        return $(item[0]).text();
    }).join("");

    //abort if no row selected
    if (!curRow.length)
        return;

    //get newRow up or down.
    if (e.which == 38) {
        do {
            newRow = curRow.prev();
            curRow = newRow;
        } while ($(newRow).hasClass("k-grouping-row") && newRow.length);
    } else if (e.which == 40) {
        do {
            newRow = curRow.next();
            curRow = newRow;
        } while ($(newRow).hasClass("k-grouping-row") && newRow.length);
    } else {
        return;
    }

    lastKey = e.which;
    if (curRow.length > 0) {
        kGrid.select(curRow);
        scrollToSelectedRow(kGrid, curRow, lastKey);
    }
    else {
        prevNextRowDoesNotExist = true;
        selectedKeyInLazyGrid = kGrid.select().find("td.rowid").html();
        var divScrollTop = kGrid.element.find(".k-scrollbar-vertical").scrollTop();
        var rowHeight = kGrid.select().height();
        if (lastKey == 38) {
            kGrid.element.find(".k-scrollbar-vertical").scrollTop(divScrollTop - rowHeight);

        } else if (lastKey == 40) {
            kGrid.element.find(".k-scrollbar-vertical").scrollTop(divScrollTop + rowHeight);
        }
    }

    e.preventDefault();
}

/**
 * Wird von DataGrid.cs: createGrid als Eventhandler gebunden
 * @param {} arg - 
 * @return {none}
 */
// after data is loaded in the grid, perform different tasks
function gridDataBound(arg) {
    var gridId = this.element.attr("id");
    if (prevNextRowDoesNotExist) {
        prevNextRowDoesNotExist = true;
        gridInLoadingBeforeKeyPress = true;
    }
    var hasData = this.items().length > 0;


    try {
        var grid = $('.k-grid-content').closest('.k-grid').data("kendoGrid");
        var curRow = kGrid.select();
        triggerChangeSelection();
    }
    catch (err) {
    }


    setTimeout(function () {
        if (selectedKeyInLazyGrid) {
            var grid = $('.k-grid-content').closest('.k-grid').data("kendoGrid");
            var row = findRowById(grid, selectedKeyInLazyGrid);
            if (!row) {
                if (lastKey = 38) {
                    row = grid.table.find("tr:not(.k-grouping-row)").last();
                }

                if (lastKey = 38) {
                    row = grid.table.find("tr:not(.k-grouping-row)").first();
                }
            }

            grid.select(row);
            scrollToSelectedRow(grid, row, lastKey);
            grid.element.find(".k-grid-content").focus();
            selectedKeyInLazyGrid = null;
        }

        gridInLoadingBeforeKeyPress = false;
        if ($(".k-grid-content[data-role='virtualscrollable']").length > 0) {
            var scrollHeight = $(".k-grid-content").find(".k-scrollbar-vertical").find("div").first().height();
            var tableParentHeight = $(".k-grid-content").find("table").first().height();
            if (scrollHeight < tableParentHeight) {
                $(".k-grid-content").find(".k-scrollbar-vertical").find("div").first().height(tableParentHeight + 20);
            }
        }

        self["firstDataboundExecuted" + gridId] = true;
    }, 10);




    //on dblclick make view for row
    $(".k-grid-content").find("tr").dblclick(function () {
        //if ($(this).closest('.k-grid').find('.grid-edit').length > 0) {
        //    $(this).closest('.k-grid').find('.grid-edit')[0].click();
        //}
        //else {
        if ($(this).closest('.k-grid').find('.grid-view').length > 0)
            $(this).closest('.k-grid').find('.grid-view')[0].click();
        //}
    });

    if (hasData)
        this.wrapper
            .find("a.grid-data-dependent")
            .removeClass("k-state-disabled");
    else
        this.wrapper
            .find("a.grid-data-dependent")
            .addClass("k-state-disabled");

    this.wrapper
        .find("a.grid-row-dependent")
        .addClass("k-state-disabled")
        .attr("href", function (i, val) { return changeIdVal(val, "rowid", "x"); });

    //$("ul.k-menu-vertical").unbind('mouseleave');
    //$("ul.k-menu-vertical li").mouseleave(function () {
    //    $(this).removeClass("k-state-hover");
    //});

    //$("ul.k-menu-vertical").children().mouseenter(function () {
    //    var element = $(this);
    //    var t = setTimeout(function () { removeParentHoverClass(element) }, 300);
    //});

    //highlight columns that has filters
    highlightGridFilter(this);

    if (self["firstDataboundExecuted" + gridId] == false) {
        assignGridButtonLogAction(this);
    }

    addGridSortOrder(this);

    if (autoSizeGridOnBind && currentGridModelName) {
        gridAutoSizeColumns($('.k-grid-content').closest('.k-grid').attr('id'), currentGridModelName);
    }
}

function assignGridButtonLogAction(grid) {

    grid.thead.find(".k-header a.k-link").click(function () {
        var link = $(this);
        if (link.find('span.k-i-arrow-n').length > 0) {
            logElementActivity('Common.DataGrid.Sort.Buttons.Ascending');
        }
        if (link.find('span.k-i-arrow-s').length > 0) {
            logElementActivity('Common.DataGrid.Sort.Buttons.Descending');
        }
    });

    grid.thead.find(".k-header-column-menu").click(function () {
        logElementActivity('Common.DataGrid.Buttons.Filter');
    });

    grid.wrapper.find(".k-grid-pager a.k-pager-refresh").click(function () {
        logElementActivity('Common.DataGrid.Pager.Buttons.Refresh');
    });

    grid.wrapper.find(".k-grid-pager a.k-pager-nav").click(function () {
        var link = $(this);
        if (link.hasClass('k-state-disabled'))
            return;

        if (link.find('span.k-i-arrow-e').length > 0)
            logElementActivity('Common.DataGrid.Pager.Buttons.Next');
        if (link.find('span.k-i-arrow-w').length > 0)
            logElementActivity('Common.DataGrid.Pager.Buttons.Previous');
        if (link.find('span.k-i-seek-w').length > 0)
            logElementActivity('Common.DataGrid.Pager.Buttons.First');
        if (link.find('span.k-i-seek-e').length > 0)
            logElementActivity('Common.DataGrid.Pager.Buttons.Last');
    });
}

function removeParentHoverClass(element) {
    $(element).find("div.k-animation-container").mouseenter(function () {
        $(this).parent().removeClass("k-state-hover");
    });
}

function grid_columnHide(e) {

    var filteredMembers = {};
    var grid = this.wrapper.data("kendoGrid");
    var filter = grid.dataSource.filter();
    var filtered = false;
    var sorted = false;
    var sort = grid.dataSource.sort();

    if (sort != null)
        $.each(sort, function (index, x) {
            if (x.field == e.column.field) {
                sorted = true;
            }
        });

    if (filter) {
        setFilteredMembers(filter, filteredMembers);
        filtered = filteredMembers[e.column.field];
    }

    var yes = function () {
        if (sorted) {
            var sortFields = [];
            $.each(grid.dataSource._sort, function (index, x) {


                if (x.field != e.column.field) {
                    sort.push(x);
                }
            });
            grid.dataSource._sort = sortFields;
        }
        if (filtered) {
            var newFilter = removeFilter(grid.dataSource.filter().filters, e.column.field);
            grid.dataSource.filter(newFilter);
            sortAction(e.column.field);
        }
        grid.dataSource.read();
        setTimeout(function () { grid.hideColumn(e.column.field); }, 10);
    };

    var no = function () {
        grid.showColumn(e.column.field);
    };

    if (filtered || sorted) {
        grid.showColumn(e.column.field);
        confirmPrompt(clearFilterText, yes, no);
    }
}

function sortAction() {

}


//highlight columns that has filters
function highlightGridFilter(grid, withoutFilterButton) {
    var filter = grid.dataSource.filter();
    grid.thead.find(".k-header-column-menu.k-state-active").removeClass("k-state-active");
    if (!withoutFilterButton) {
        $(".clearYourOwnFiltering").removeClass("filterActive");
    }
    if (filter) {
        var filteredMembers = {};

        setFilteredMembers(filter, filteredMembers);

        grid.thead.find("th[data-field]").each(function () {
            var cell = $(this);
            var filtered = filteredMembers[cell.data("field")];

            if (filtered) {
                cell.find(".k-header-column-menu").addClass("k-state-active");
                if (!withoutFilterButton) {
                    $(".clearYourOwnFiltering").addClass("filterActive");
                }
            }
        });
    }
}

//set filtered members
function setFilteredMembers(filter, members) {
    if (filter.filters)
        for (var i = 0; i < filter.filters.length; i++)
            setFilteredMembers(filter.filters[i], members);
    else
        members[filter.field] = true;
}

//show the order of sorted columns
function addGridSortOrder(grid, withoutSortButton) {
    var header = $('#' + grid.element.attr("id")).find(".k-grid-header-wrap tr");
    var sort = grid.dataSource.sort();

    header.find(".grid-order-indicator").remove();
    if (!withoutSortButton) {
        $(".clearYourOwnSorting").removeClass("filterActive");
    }
    if (sort != null && sort.length > 0) {
        $.each(sort, function (index, x) {
            if (header.find("th[data-field='" + x.field + "']").find("a.k-link span.k-icon").length > 0)
                $('<span class="grid-order-indicator">' + (index + 1) + '</span>').insertAfter(header.find("th[data-field='" + x.field + "']").find("a.k-link span.k-icon"));
            else {
                var link = header.find("th[data-field='" + x.field + "']").find("a.k-link");
                link.html(link.html() + '<span class="grid-order-indicator">' + (index + 1) + '</span>');
            }
        });
        if (!withoutSortButton) {
            $(".clearYourOwnSorting").addClass("filterActive");
        }
    }
}

function fixGridSize(grid) {
    var header = grid.find(".k-grid-header-wrap > table");
    var body = grid.find(".k-grid-content > table");
    var colsHeader = header.children("colgroup");
    var n = colsHeader.children("col").length;
    var w = 0;

    for (var i = 0; i < n; i++) {
        w += colsHeader.children("col:nth(" + i + ")").css("width").replace(/px/, '') / 1;
    }

    header.css("width", w);
    body.css("width", w);
}



function clearOwnFilters(id) {
    let kendoGrid = $("#" + id).data("kendoGrid");
    if (kendoGrid != undefined) {
        kendoGrid.dataSource.filter({});
    }
}

function clearOwnSorting(id) {
    let kendoGrid = $("#" + id).data("kendoGrid");
    if (kendoGrid != undefined) {
        kendoGrid.dataSource.sort({});
    }
}


// Anpassung RapidComponents
function gridAutoSizeColumns(id, modelName, originalGridGroupLength) {
    if (typeof (originalGridGroupLength) == "undefined") {
        originalGridGroupLength = 0;
    }
    autoSizeGrid($("#" + id), originalGridGroupLength);
  //  storeGridState(id, modelName);
}

// Anpassung RapidComponents
function autoSizeGrid(grid, originalGridGroupLength) {
    var columns = grid.data("kendoGrid").columns;
    var header = grid.find(".k-grid-header-wrap > table");
    var body = grid.find(".k-grid-content > table");
    if (body.length == 0) {
        body = grid.find(".k-virtual-scrollable-wrap > table");
    }

    var colsHeader = header.children("colgroup");
    var bodyHeader = body.children("colgroup");

    var w = 0;
    var headCount = 0 + originalGridGroupLength;
    var bodyCount = 0 + originalGridGroupLength;

    for (var item in columns) {
        if (typeof (columns[item].columns) != "undefined") {
            var newColumns = columns[item].columns;
            var headCountGroup = 0 + originalGridGroupLength;
            for (var item1 in newColumns) {
                if (!newColumns[item1].hidden) {
                    width = getColumnWidth(headCountGroup, bodyCount, header, body, false);
                    w += width;
                    newColumns[item1].width = width - 20;
                    colsHeader.children("col:nth(" + bodyCount + ")").css("width", width);
                    bodyHeader.children("col:nth(" + bodyCount + ")").css("width", width);
                    bodyCount++;
                    headCountGroup++;
                }
            }
            headCount++;
        } else {
            if (!columns[item].hidden) {
                width = getColumnWidth(headCount, bodyCount, header, body, true);
                w += width;
                columns[item].width = width - 20;
                colsHeader.children("col:nth(" + bodyCount + ")").css("width", width);
                bodyHeader.children("col:nth(" + bodyCount + ")").css("width", width);
                headCount++;
                bodyCount++;
            }

        }
    }

    header.css("width", w);
    body.css("width", w);

    delete header;
    delete body;
    delete colsHeader;
    delete bodyHeader;
    delete w;
    delete columns;

    autoSizeGridOnBind = false;
    return false;
}

// Anpassung RapidComponents
function getColumnWidth(headCount, bodyCount, header, body, first) {
    var s = "";
    if (first) {
        s = "<table><tr><th>" + header.find('tr').first().find("th:visible:nth(" + headCount + ")").html() + "</th></tr>";
    } else {
        s = "<table><tr><th>" + header.find('tr').last().find("th:visible:nth(" + headCount + ")").html() + "</th></tr>";
    }

    body.find("tr").find("td:visible:nth(" + bodyCount + ")").each(function () { s = s + "<tr><td>" + $(this).html() + "</td></tr>"; });
    s += "</table>";
    var test = $(s).css({ "position": "absolute", "width": "auto", "white-space": "nowrap", "table-layout": "fixed" }).appendTo($(document.body));
    var width = test.width() + 35;
    test.remove();

    delete test;
    return width;
}

// Anpassung für RapidComponents
function gridDefaulSettings(id, originalCols, modelName, originalGridGroup) {

    /*console.log("neue Funktion");*/

    var needRefresh = false;
    var grid = $("#" + id).data("kendoGrid");

    var tmpShow = grid._events.columnShow;
    var tmpReorder = grid._events.columnReorder;

    grid._events.columnShow = [];
    grid._events.columnReorder = [];

    if (grid.dataSource.sort() && grid.dataSource.sort().length > 0) {
        grid.dataSource._sort = [];
        grid.dataSource._sortFields = [];
        needRefresh = true;
    }

    if (grid.dataSource.filter() && grid.dataSource.filter().filters) {
        grid.dataSource._filter = null;
        needRefresh = true;
    }

    if (typeof (originalGridGroup) == "undefined") {
        if (grid.dataSource.group() && grid.dataSource.group().length > 0) {
            grid.dataSource._group = [];
            needRefresh = true;
        }
    }

    $(".k-columns-item span.k-link input").each(function (i, e) {
        if (!$(this).is(":checked")) {
            $(this).prop("checked", true);
        }
    });

    var gridCols = grid.columns;

    if (null != originalCols) {
        for (var i = 0; i < Object.keys(originalCols).length; i++) {
            for (var j = 0; j < gridCols.length; j++) {
                if (typeof (gridCols[j]) != "undefined" && typeof (originalCols[i]) != "undefined") {
                    if (typeof (gridCols[j].headerAttributes["data-coreid"]) != "undefined" && typeof (originalCols[i].headerAttributes["data-coreid"]) != "undefined") {
                        if (gridCols[j].headerAttributes["data-coreid"] == originalCols[i].headerAttributes["data-coreid"]) {
                            if (typeof (gridCols[j].columns) != "undefined") {
                                for (var xi = 0; xi < originalCols[i].columns.length; xi++) {
                                    for (var xj = 0; xj < gridCols[j].columns.length; xj++) {
                                        if (gridCols[j].columns[xj].headerAttributes["data-coreid"] == originalCols[i].columns[xi].headerAttributes["data-coreid"]) {
                                            grid.reorderColumn(xi, gridCols[j].columns[xj]);
                                            if (!originalCols[i].columns[xi].hidden) {
                                                grid.showColumn(originalCols[i].columns[xi].field);
                                            }
                                            else {
                                                grid.hideColumn(originalCols[i].columns[xi].field);
                                            }
                                            break;
                                        }
                                    }
                                }
                                grid.reorderColumn(i, gridCols[j]);
                                if (!originalCols[i].hidden) {
                                    grid.showColumn(originalCols[i].headerAttributes.groupfield);
                                }
                                else {
                                    grid.hideColumn(originalCols[i].headerAttributes.groupfield);
                                }
                            }
                            else {
                                grid.reorderColumn(i, gridCols[j]);
                                if (!originalCols[i].hidden) {

                                    grid.showColumn(originalCols[i].field);

                                }
                                else {
                                    grid.hideColumn(originalCols[i].field);
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    var header = $("#" + id).find(".k-grid-header-wrap > table");
    var body = $("#" + id).find(".k-grid-content > table");
    if (body.length == 0) {
        body = $("#" + id).find(".k-virtual-scrollable-wrap > table");
    }

    var colsHeader = header.children("colgroup");
    var bodyHeader = body.children("colgroup");

    var w = 0;
    var width = 0;
    var colsCount = 0;

    if (null != originalCols) {
        for (var i = 0; i < Object.keys(originalCols).length; i++) {
            for (var j = 0; j < gridCols.length; j++) {

                // ToDo: Vorerst ein Behelf, damit die Spalte keine neue Breite erhält.   
                if (colsHeader.children("col:nth(" + colsCount + ")")[0] != undefined) {
                    if (colsHeader.children("col:nth(" + colsCount + ")")[0].className == "k-hierarchy-col") {
                        colsCount++;
                    }
                }

                if (typeof (gridCols[j]) != "undefined" && typeof (originalCols[i]) != "undefined") {
                    if (typeof (gridCols[j].headerAttributes["data-coreid"]) != "undefined" && typeof (originalCols[i].headerAttributes["data-coreid"]) != "undefined") {
                        if (gridCols[j].headerAttributes["data-coreid"] == originalCols[i].headerAttributes["data-coreid"]) {
                            if (typeof (gridCols[j].columns) != "undefined") {
                                for (var xi = 0; xi < originalCols[i].columns.length; xi++) {
                                    for (var xj = 0; xj < gridCols[j].columns.length; xj++) {
                                        if (gridCols[j].columns[xj].headerAttributes["data-coreid"] == originalCols[i].columns[xi].headerAttributes["data-coreid"]) {
                                            if (!originalCols[i].columns[xi].hidden) {
                                                width = parseInt(originalCols[i].columns[xi].width.replace('px', ''));
                                                w += width;
                                                grid.columns[j].columns[xj].width = width - 20;
                                                colsHeader.children("col:nth(" + colsCount + ")").css("width", originalCols[i].columns[xi].width);
                                                bodyHeader.children("col:nth(" + colsCount + ")").css("width", originalCols[i].columns[xi].width);
                                                colsCount++;
                                            }
                                            break;
                                        }
                                    }
                                }
                            } else {
                                if (!originalCols[i].hidden) {
                                    if (typeof (originalCols[i].width) == undefined) {
                                        if (typeof (originalCols[i].width) == "string") {
                                        width = parseInt(originalCols[i].width.replace('px', ''));
                                        }
                                        else {
                                            width = originalCols[i].width;
                                        }
                                        w += width;
                                        grid.columns[j].width = width - 20;
                                        colsHeader.children("col:nth(" + colsCount + ")").css("width", originalCols[i].width);
                                        bodyHeader.children("col:nth(" + colsCount + ")").css("width", originalCols[i].width);
                                    }
                                    colsCount++;
                                }
                                break;
                            }
                        }
                    }
                }
            }
        }
    }

    header.css("width", "100%");
    body.css("width", "100%");

    grid._events.columnShow = tmpShow;
    grid._events.columnReorder = tmpReorder;

    if (needRefresh) {
        if (typeof (noDataSourceAction) == "undefined" || noDataSourceAction === false ) {
            grid.dataSource.read();
        }
        currentGridModelName = modelName;
    }
}

function exportGrid(id, btnExportClass) {
    var yes = function () {

        $('.iframeForDownload').each(function () {
            $(this).remove();
            downloadCancelByUser = true;
        });
    };

    if (btnExportClass && $('.' + btnExportClass).hasClass("cancelExportGrid")) {
        confirmPrompt(cancelDownloadAnswer, yes, function () { });
    }
    else {
        var w = $("#" + id + "ExportFormatWindow").data("kendoWindow");

        w.center();
        w.open();
    }
}

function resizeGridster() {
    var maxwidth = parseInt(($(window.parent).width() - scrollMargin) / blockSize) * blockSize;
    $('.gridster ').css("width", maxwidth + "px");
    $('.gridster ul').css("width", maxwidth + "px");
    prepareGridsterSizes();
}

function prepareGridsterSizes() {
    if (gridsterConfig["grid"]) {
        //data-row="@(((GridPanel)hash["map"]).Row)" data-col="@(((GridPanel)hash["map"]).Col)" data-sizex="@(((GridPanel)hash["map"]).Size_X)" data-sizey="@(((GridPanel)hash["map"]).Size_Y)"
        var lis = $(".gridster .gridPanelli");
        for (var i = 0; i < lis.length; i++) {
            var conf = gridsterConfig[lis.eq(i).attr("id")];
            lis.eq(i).attr("data-row", conf.Row);
            lis.eq(i).attr("data-col", conf.Col);
            lis.eq(i).attr("data-sizex", conf.Size_X);
            lis.eq(i).attr("data-sizey", conf.Size_Y);
        }
    }
}

var detachDiv = null;
var blockSize = 46;
var scrollMargin = 16;
var gridster = null;
var margin = 3;
function makeGridster(id) {

    if ($(".scroller").length > 0) {
        resizeGridster();
        $(".gridster").css("margin", "0px auto");
        gridster = $(".gridster ul").gridster({

            //widget_base_dimensions: [(maxwidth) / 16, (maxHeight) / 16],
            widget_base_dimensions: [blockSize - margin * 2, blockSize - margin * 2],
            //widget_base_dimensions: [1, 1],
            widget_margins: [margin, margin],
            draggable: {
                handle: 'header',
                start: function (e, ui) {
                    detachDiv = ui.$player.find(".contentOfPanel").detach();
                },
                stop: function (e, ui) {
                    var positions = gridster.serialize();
                    var obj = null;
                    if (null != gridster)
                        obj = gridster.serialize();

                    if (free_arrangement_index)
                        ajaxCall(storeGridPanelStateUrl.replace(/\*0\*/g, id) + "?arrangement=" + free_arrangement_index, JSON.stringify(obj), storeGridPanelStateOnServerCallBack);

                    ui.$player.append(detachDiv);
                }
            },
            resize: {

                enabled: true,
                max_size: [48, 100],
                min_size: [1, 1],
                start: function (e, ui, $widget) {
                    //log("resize start");
                    detachDiv = $widget.find(".contentOfPanel").detach();
                },
                stop: function (e, ui, $widget) {
                    //log("resize stop");
                    var positions = gridster.serialize();
                    var obj = null;
                    if (null != gridster)
                        obj = gridster.serialize();

                    if (free_arrangement_index)
                        ajaxCall(storeGridPanelStateUrl.replace(/\*0\*/g, id) + "?arrangement=" + free_arrangement_index, JSON.stringify(obj), storeGridPanelStateOnServerCallBack);

                    $widget.append(detachDiv);
                    setTimeout(function () {
                        try {
                            eval($widget.find(".panelId").val() + "ResizeEnd()");
                        }
                        catch (exception) {

                        }

                    }, 0);
                }
            }
        }).data('gridster');

        $('.gridster ul').css("position", "");
        _messageBroker.AddSubscriber("resizeWindow", resizeGridster);
        if (!isIframeApp && parent.showDefaultGridPanelSettings)
            parent.showDefaultGridPanelSettings($.urlParam('DesktopWindowId'));
    }
    else {
        setTimeout(function () {
            makeGridster(id);
        }, 500);
    }
}


function storeGridPanelStateOnServerCallBack() {
}

/**
 * Wird von DataGrid.cs: createGrid als Eventhandler gebunden
 * @param {} arg -
 * @return {none}
 */
//change url of edit with current row selected
function gridSelectionChanged(arg) {
    var selected = $.map(this.select(), function (item) {
        return $(item).find("td.rowid");
    });

    if (selected.length == 0) {
        this.wrapper
            .find("a.grid-row-dependent")
            .addClass("k-state-disabled")
            .attr("href", function (i, val) { return changeIdVal(val, "rowid", "x"); });
    } else {
        var id = $.map($(selected), function (item) {
            return $(item[0]).text();
        }).join(";");

        if (id == "")
            this.wrapper
                .find("a.grid-row-dependent")
                .addClass("k-state-disabled")
                .attr("href", function (i, val) { return changeIdVal(val, "rowid", "x"); });
        else {
            this.wrapper
                .find("a.grid-row-dependent")
                .removeClass("k-state-disabled")
                .attr("href", function (i, val) { return changeIdVal(val, "rowid", id); });

            var selectedLevel = $(this.select()).find('div').first();

            if (selectedLevel.length > 0) {
                var levelId = selectedLevel[0].id;
                if (levelId && levelId != "") {
                    this.wrapper
                            .find("a.grid-keep-selection")
                            .attr("href", function (i, val) { return changeIdVal(val, "rowlevel", levelId); });
                }
            }
        }
    }
}

function changeIdVal(orig, id, idVal) {
    var p = orig.indexOf(id);

    if (p > -1) {
        p += id.length + 1;

        var p2 = orig.indexOf("&", p);

        if (p2 > -1)
            return orig.substring(0, p) + idVal + orig.substring(p2);
        else
            return orig.substring(0, p) + idVal;
    }
}

/**
 * Referenz: DataGrid.cs : buildFilter
 * NULL Filter sind in der aktuellen Kendo-Version Stanard
 * @param {e} e - 
 */
function filterMenuInit(e) {
}

/**
 * Referenz: DataGrid.cs : buildFilter
 * NULL Filter sind in der aktuellen Kendo-Version Stanard
 * @param {e} e -
 */
function filterMenuInitRemoveEmpty(e) {
}

/**
 * Referenz: filterMenuInit
 *              wird bei Bedarf überladen ( hier FleetManager.js )
 */
//need to be here empty
function removeOrFilter() {
}

/**
 * Gibt die Filtersettings zurück ( für Export/Drucken )
 * Referenz: JavaScript der Anwendungen
 * @param {any} filterObj - Filterobjekt, das um die Filtersettings erweitert werden soll
 * @param {any} id -
 * @param {any} isForExport -
 * @returns {object} - Filtersettings Objekt
 */
function getGridFilterObj(filterObj, id, isForExport) {
    var grid = $('#' + id).data("kendoGrid");
    var sort = grid.dataSource.sort();
    var sortString = "";
    if (sort) {
        for (var i = 0; i < sort.length; i++) {
            sortString += sort[i].field + "-" + sort[i].dir + "~";
        }
    }
    sortString = sortString.substring(0, sortString.length - 1);

    var filter = grid.dataSource.filter();
    var filterString = "";
    filterString = getGridFilters(filter, "");
    filterString = filterString.substring(0, filterString.length - 4);
    filterObj.filter = filterString;
    filterObj.sort = sortString;
    filterObj.page = 1;
    if (isForExport) {
        filterObj.pageSize = grid.dataSource.total();
    }
    else {
        filterObj.pageSize = grid.dataSource.pageSize();
    }

    var groups = grid.dataSource.group();
    var groupsString = "";
    for (var i = 0; i < groups.length; i++)
        groupsString += groups[i].field + "-" + groups[i].dir + "~";
    filterObj.group = groupsString.substring(0, groupsString.length - 1);

    return filterObj;
}

function getGridFilterSettings(filterObj, id, isForExport) {
    var grid = $('#' + id).data("kendoGrid");

    filterObj.filter = grid.dataSource.filter();
    filterObj.sort = grid.dataSource.sort();

    filterObj.page = 1;
    if (isForExport) {
        filterObj.pageSize = grid.dataSource.total();
    }
    else {
        filterObj.pageSize = grid.dataSource.pageSize();
    }

    filterObj.group = grid.dataSource.group();

    return filterObj;
}

/**
 * 
 * Referenz: lokal, Anwendung SMS / SMS2
 * @param {any} filter -
 * @param {any} filterString -
 * @returns{string} filterString
 */
function getGridFilters(filter, filterString) {
    if (filter) {
        if (filter.filters) {
            for (var i = 0; i < filter.filters.length; i++) {
                filterString += getGridFilters(filter.filters[i], "");
                filterString = filterString.replace("novaand", filter.logic);
            }
        }
        else {

            var strValue = filter.value;
            try {
                var test = filter.value.getDate();
                var date = new Date(filter.value);
                strValue = kendo.toString(filter.value, "dd.MM.yyyy HH:mm:ss");
            }
            catch (ex) {
            }

            filterString += filter.field + "~" + filter.operator + "~'" + strValue + "'~novaand~";
        }
    }
    return filterString;
}

/**
 * 
 * Referenz: lokal, Anwendung SMS / SMS2
 * @param {any} grid -
 * @param {any} id -
 * @returns {array} Array der Spalten mit der entsprechenden ID
 */
function findRowById(grid, id) {
    var rows = grid.table.find("tr:not(.k-grouping-row)");
    for (var i = 0; i < rows.length; i++) {
        if ($(rows[i]).find('td:contains("' + id + '")').html() == id) {
            return rows[i];
        }
    }
    return null;
}

function setGridPageSize(grid, container, rowHeight) {
    var pageSize = Math.round(container.height() / rowHeight) * 3;
    if (pageSize < 10)
        pageSize = 10;
    if (grid.dataSource.data().length > 0) {
        grid.dataSource.pageSize(pageSize);
    }
    else
        grid.dataSource._pageSize = pageSize;
}

function clearFilter(filter, searchFor) {
    if (filter && filter.filters) {
        removeEmptyFilter(filter.filters);
    }
    if (filter && filter.filters) {
        removeFilter(filter.filters, searchFor);
    }
    if (filter && filter.filters) {
        removeEmptyFilter(filter.filters);
    }
}

function removeEmptyFilter(filter) {
    if (filter == null)
        return [];

    for (var x = 0; x < filter.length; x++) {

        if (filter[x].filters != null && filter[x].filters.length >= 0) {
            if (filter[x].filters.length == 0) {
                filter.splice(x, 1);
                return removeEmptyFilter(filter);
            }
            filter[x].filters = removeEmptyFilter(filter[x].filters);
        }
    }
    return filter;
}

function removeFilter(filter, searchFor) {
    if (filter == null)
        return [];

    for (var x = 0; x < filter.length; x++) {

        if (filter[x].filters != null && filter[x].filters.length >= 0) {
            if (filter[x].filters.length == 0) {
                filter.splice(x, 1);
                return removeFilter(filter, searchFor);
            }
            filter[x].filters = removeFilter(filter[x].filters, searchFor);
        }
        else {
            if (filter[x].field == searchFor) {
                filter.splice(x, 1);
                return removeFilter(filter, searchFor);
            }
        }
    }

    return filter;
}

function showNumberOfRows(element, value) {

    var gridTitleText = element.html();

    if (gridTitleText.indexOf("<span>") > 0)
        gridTitleText = gridTitleText.substring(0, gridTitleText.indexOf("<span>"));
    element.html(gridTitleText + "<span> - " + value + "</span>");
}

/**
 * Wird von DataGrid.cs: createGrid als Eventhandler gebunden
 * @param {string} grid - Name des Grids
 * @param {string} id - 
 * @return {none}
 */
//store grid status in elements
function storeGridState(grid, id) {
    setTimeout("storeGridStateOnServer('" + grid + "', '" + id + "');", 0);
}

//store grid status in elements
function storeGridStateOnServer(grid, id) {
    var columns = $("#" + grid).data("kendoGrid").columns;

    var data = columns.map(function (item) {
        var width = 100;
        if (item.width) {
            width = (item.width + "").indexOf("px") > 0 ? (item.width + "").substring(0, (item.width + "").indexOf("px")) : item.width;
        }
        var a =
            {
                field: item.field,
                hidden: item.hidden | false,
                width: width
            };
        return a;
    });

    if (storeGridStateUrl)
        ajaxCall(storeGridStateUrl.replace(/\*0\*/g, id), JSON.stringify(data), storeGridStateOnServerCallBack);
}

function storeGridStateOnServerCallBack() {
}


/**
 * scroll to the grid row currently selected
 * @param {none} grid -
 */
function gridSetScrollPositionToSelected (grid) {
    var row = grid.table.find('tr.k-state-selected');
    if (row.length != 0) {
        grid.content.scrollTop(grid.content.scrollTop() + $(row).position().top); //scroll the content
    }
}

/**
 * mark the specified row number as selected and scroll to the grid row
 * @param {any} grid -
 * @param {any} row -
 */
function gridSelectRow( grid, row ) {
    var pageSize = grid.dataSource.pageSize();
    var currentStartRow = (grid.dataSource.page() - 1) * pageSize;

    if (pageSize == 0)
        return;

    if (row > 1)
        row = row - 1;

    grid.select("tr:eq(" + (row - currentStartRow) + ")");
    gridSetScrollPositionToSelected(grid);
}
/**
 * Calculates the height that is available for the grid content (header and data rows)
 * @param {any} id -
 * @param {any} outerHeight -
 * @param {any} offset -
 * @returns {number} the height
 */
function gridGetContentHeight(id, outerHeight, offset) {
    let grid = $('#' + id);
    let element;

    let height_grid_actions = 0;
    let height_grid_header_btn = 0;
    let height_grid_header = 0;
    let height_grid_pager = 0;

    element = grid.find('.gridPanelActions');
    if (undefined != element && element.length) {
        height_grid_actions = element.parent().outerHeight(true);
    }
    element = grid.find('.gridHeaderButton');
    if (undefined != element && element.length) {
        height_grid_header_btn = element.first().parent().outerHeight(true);
    }
    element = grid.find('.k-grid-header');
    if (undefined != element && element.length) {
        height_grid_header = element.outerHeight(true);
    }
    element = grid.find('.k-pager-wrap');
    if (undefined != element && element.length) {
        height_grid_pager = element.outerHeight(true);
    }

    let height_difference_complete = offset + height_grid_actions + height_grid_header + height_grid_header_btn + height_grid_pager;

    return outerHeight - height_difference_complete - 2;
}
/**
 * sets the column visibility according to the settings provided by the DB
 * @param {array} columnVisibility - array of key- value- pairs defining the visibility (key = struct-core-ID, value = visibility)
 * @param {array} originalCols - in case the defaults shall be restored this object contains the required data
 * @param {any} gridName - the ID of the grid
 */
function setColumnsVisibility(columnVisibility, originalCols, gridName) {

    let item;
    let setVisibilityGrid = $("#" + gridName).data("kendoGrid");

    for (let i = 0; i < columnVisibility.length; i++) {
        item = $("#" + gridName + " th[data-coreid='" + columnVisibility[i].Key + "']");

        if (item == undefined || item.length == 0) {
            continue;
        }
        let cellIndex = item[0].cellIndex;

        if (item.attr("data-field")) {
            if (null != originalCols) {
                for (let j = 0; j < Object.keys(originalCols).length; j++) {
                    if (originalCols[j].headerAttributes["data-coreid"] !== undefined &&
                        columnVisibility[i].Key == originalCols[j].headerAttributes["data-coreid"])
                    {
                        originalCols[j].hidden = columnVisibility[i].Value == "1" ? false : true;
                        if (columnVisibility[i].Value == "1") {
                            //the column is available for the user
                            //do not make it visible if hidden, it might be a user setting (column menu -> column visibility)
                            if (!setVisibilityGrid.columns[cellIndex].hidden) {
                                setVisibilityGrid.showColumn(cellIndex);
                            }
                        }
                        else {
                            setVisibilityGrid.hideColumn(cellIndex);
                        }
                        break;
                    }
                }
            }
            else {
                if (columnVisibility[i].Value == "1") {
                    setVisibilityGrid.showColumn(cellIndex);
                }
                else {
                    setVisibilityGrid.hideColumn(cellIndex);
                }
            }
        }
        else {
            continue;
        }
    }
}

/**
 * remove column entries that are disabled by the column visibiity
 * @param {object} menu - the menu element
 * @param {array} originalCols - contains the information whether columns shall be hidden
 */
function adjustColumnsMenu(menu, originalCols) {

    if (originalCols == undefined || menu == undefined) {
        return;
    }

    let item, idx;
    let length = Object.keys(originalCols).length;

    for (idx = 0; idx < length; idx++) {
        if (originalCols[idx].hidden) {
            item = originalCols[idx].headerAttributes["data-field"];
            if (item != undefined) {
                menu.find('input[data-field=' + item + ']').first().parent().hide();
            }
        }
    }
    menu.find('span.k-menu-link > input').addClass('k-checkbox');
}

/**
 * private function
 * @param {object} item -
 * @returns {object} object describing the column
 */
function getColumnListEntry(item) {
    var width = 100;
    if (item.width) {
        width = Math.round((item.width + "").indexOf("px") > 0 ? (item.width + "").replace("px", "") : item.width);
        }
    return {
        field: item.field,
        hidden: item.hidden || false,
        width: width
    };
}

/**
 * Provides an  array of all columns of a grid. Each column entry contains the column name, it's hiden state and the width.
 * Required by the report cross tab builder
 * @param {any} gridName - the ID of the grid
 * @return {array} Array of the columns
 */
function getColumnList(gridName) {

    let grid = $("#" + gridName);
    let data = [];

    if (grid.length == 0) {
        return data;
    }
    let columns = grid.data("kendoGrid").columns;

    for (let item in columns) {
        if (columns[item].columns) {
            // column group
            let newColumns = columns[item].columns;
            for (let item1 in newColumns) {
                data.push(getColumnListEntry(newColumns[item1]));
            }
        } else {
            data.push(getColumnListEntry(columns[item]));
        }
    }
    return data;
}

/**
 * to be called in the error callback of the grid.sync promise (dataSource.sync().then( doneCallback, failCallback)
 * @param {any} gridId - the id of the grid
 * @param {any} response - the argument provided to the failCallback
 * @param {any} onErrorCallback - optionally
 */
function gridOnDataSourceModelError(gridId, response, onErrorCallback) {
    //console.log("gridOnDataSourceModelError - " + gridId);

    let errors;

    if (response != undefined && response.responseJSON != undefined) {
        errors = response.responseJSON.Errors;
    }
    else if (response.errors != undefined) {
        errors = response.errors;
    }

    if (errors) {
        let grid = $("#" + gridId).data("kendoGrid");

        let processModelError = function (response) {
            let showErrorMsg = false;

            //event.preventDefault();   // cancel grid rebind if error occurs

            $("#" + gridId).find('tr').each(function (idx, item) {
                var dataItem = grid.dataItem($(item));
                if (dataItem != undefined && errors.Id != undefined) {
                    for (var id in errors.Id.errors) {
                        if (errors.Id.errors[id] == dataItem.Id) {
                            $(item).css("background-color", "rgba(255,72,72,1)");
                            showErrorMsg = true;
                        }
                    }
                }
            });
            if (showErrorMsg == true && errors.userMsg) {
                if (typeof onErrorCallback === 'function') {
                    onErrorCallback(errors.userMsg.errors[0]);
                }
            }
        };

        processModelError(response);

        grid.one("dataBinding", processModelError);
    }
}
;
 try {
      if (typeof(window.console) != "undefined") {
          window.console = {};
          window.console.log = function () {
          };
          window.console.info = function () {
          };
          window.console.warn = function () {
          };
          window.console.error = function () {
          };
      }

      if (typeof(alert) !== "undefined") {
          alert = function ()
          {

          }
      }

} catch (ex) {

}
;
