PageSourceSearch

https://klinik-db.de/js/main.js,qv=0.108.pagespeed.ce.WUgDssyBra.js

js klinik-db.de collected 2026-09-29 18:16:41 UTC 125,010 bytes, 3,396 lines download raw bytes

1function escapeHtml(s) {
2    return String(s || "")
3        .replaceAll("&", "&")
4        .replaceAll("<", "&lt;")
5        .replaceAll(">", "&gt;")
6        .replaceAll('"', "&quot;")
7        .replaceAll("'", "&#39;");
8}
9function formatDateDe(raw) {
10    const v = String(raw || '').trim();
11    if (v === '') {
12        return '';
13    }
14
15    const mDe = v.match(/^(\d{1,2})\.(\d{1,2})\.(\d{4})$/);
16    if (mDe) {
17        const dd = parseInt(mDe[1], 10);
18        const mm = parseInt(mDe[2], 10);
19        const yyyy = parseInt(mDe[3], 10);
20
21        if (yyyy < 1 || yyyy > 9999 || mm < 1 || mm > 12) {
22            return '';
23        }
24
25        const lastDay = new Date(yyyy, mm, 0).getDate();
26        if (dd < 1 || dd > lastDay) {
27            return '';
28        }
29
30        return String(dd).padStart(2, '0') + '.' + String(mm).padStart(2, '0') + '.' + String(yyyy);
31    }
32
33    const mIso = v.match(/^(\d{4})-(\d{2})-(\d{2})(?:$|[T\s])/);
34    if (mIso) {
35        const yyyy = parseInt(mIso[1], 10);
36        const mm = parseInt(mIso[2], 10);
37        const dd = parseInt(mIso[3], 10);
38
39        if (yyyy < 1 || yyyy > 9999 || mm < 1 || mm > 12) {
40            return '';
41        }
42
43        const lastDay = new Date(yyyy, mm, 0).getDate();
44        if (dd < 1 || dd > lastDay) {
45            return '';
46        }
47
48        return String(dd).padStart(2, '0') + '.' + String(mm).padStart(2, '0') + '.' + String(yyyy);
49    }
50
51    return '';
52}
53function formatTimeDe(raw) {
54    const v = String(raw || '').trim();
55    if (v === '') {
56        return '';
57    }
58
59    // Format HH:MM oder HH:MM:SS direkt
60    const mTime = v.match(/^(\d{1,2}):(\d{2})(?::(\d{2}))?$/);
61    if (mTime) {
62        const hh = parseInt(mTime[1], 10);
63        const mm = parseInt(mTime[2], 10);
64        const ss = mTime[3] !== undefined ? parseInt(mTime[3], 10) : 0;
65
66        if (hh < 0 || hh > 23 || mm < 0 || mm > 59 || ss < 0 || ss > 59) {
67            return '';
68        }
69
70        return String(hh).padStart(2, '0') + ':' + String(mm).padStart(2, '0');
71    }
72
73    // ISO oder DATETIME YYYY-MM-DD HH:MM:SS oder mit T
74    const mIso = v.match(/^\d{4}-\d{2}-\d{2}[T\s](\d{2}):(\d{2})(?::(\d{2}))?/);
75    if (mIso) {
76        const hh = parseInt(mIso[1], 10);
77        const mm = parseInt(mIso[2], 10);
78        const ss = mIso[3] !== undefined ? parseInt(mIso[3], 10) : 0;
79
80        if (hh < 0 || hh > 23 || mm < 0 || mm > 59 || ss < 0 || ss > 59) {
81            return '';
82        }
83
84        return String(hh).padStart(2, '0') + ':' + String(mm).padStart(2, '0');
85    }
86
87    return '';
88}
89function parseJsonSafe(v) {
90    if (v && typeof v === 'object') {
91        return v;
92    }
93
94    const s = String(v || '').trim();
95    if (s === '') {
96        return null;
97    }
98
99    try {
100        return JSON.parse(s);
101    } catch (e) {
102        return null;
103    }
104}
105function pad2(n) {
106    const v = String(n ?? "").trim();
107    return v.length === 1 ? ("0" + v) : v;
108}
109
110function formatDateTimeDe(iso) {
111    const v = String(iso ?? "").trim();
112    if (v === "") {
113        return "";
114    }
115
116    const m = v.match(
117        /^(\d{4})-(\d{2})-(\d{2})[T\s](\d{2}):(\d{2})/
118    );
119
120    if (!m) {
121        return v;
122    }
123
124    const yyyy = m[1];
125    const mm = m[2];
126    const dd = m[3];
127    const hh = m[4];
128    const mi = m[5];
129
130    return dd + "." + mm + "." + yyyy + " " + hh + ":" + mi;
131}
132
133
134(function( $ ){
135
136    function syllables(word) {
137        word = word.toLowerCase();
138        if (word.length <= 3) {
139            return  1;
140        }
141        if (word.length == 0) {
142            return 0;
143        }
144        word = word.replace(/(?:[^laeiouy]es|ed|en|[^laeiouy]e)$/, '');
145        word = word.replace(/^y/, '');
146
147        /*
148        if(word.match(/[aeiouy]{1,2}/g) == null)
149            return 0
150        else word = word.match(/[aeiouy]{1,2}/g).length;
151        */
152        if(word.match(/[aeiouyäöüáéâàèîêâûôœ]{1,2}/g) == null)
153            return 0
154        else word = word.match(/[aeiouyäöüáéâàèîêâûôœ]{1,2}/g).length;
155
156        return word;
157    }
158    /**
159     * @param {Function} f Function that handles the result.
160     * 
161     */
162    $.fn.readability = function(f){
163
164        let averageReadingTime = 250; // words per minute
165
166        let text = $(this).text().trim().replace(/(?:\r\n|\r|\n)/g, ' ').replace(/(  )/ig,""); //our text
167
168        if(text.length == 0) //If the text is in a textarea or input field we can use .val();
169            text = $(this).val().trim().replace(/(?:\r\n|\r|\n)/g, ' ').replace(/(  )/ig,"");
170
171        let words = text.split(" "); //Let's split the words in an array
172
173        let syllableCount = 0; //Initializing variables for syllables and sentances
174        let sentencesCount = 0;
175
176        for(let i = 0; i < words.length; i++){
177            syllableCount += syllables(words[i]); //Using our function to calculate syllables in our word and increment our counter.
178
179            //Longer words will have a longer read time
180            if(words[i].length >= 15 && words[i].length < 20) 
181                averageReadingTime--;
182            else if(words[i].length >= 20)
183                averageReadingTime -= 2;
184
185            //If a word has a dot at the end, we can increment sentances
186            if(words[i].charAt(words[i].length - 1) == "." || words[i].charAt(words[i].length - 1) == "!" || words[i].charAt(words[i].length - 1) == "?"){
187                sentencesCount++;
188            }
189
190        }
191
192        // The Flesch Reading Ease Readability Formula
193        //let readingEaseScore = 206.835 - 1.015*(words.length/sentencesCount) - 84.6*(syllableCount/words.length);//EN
194        let readingEaseScore = 180 - (words.length/sentencesCount) - 58.5*(syllableCount/words.length);//DE
195
196        //Our increment for the average reading time. Harder text = longer reading time
197        let readingEase = 0;
198
199        if(readingEaseScore <= 30){
200            readingEase -= 30;
201        } else if(readingEaseScore <= 60){
202            readingEase -= 10;
203        } else if(readingEaseScore <= 70){
204            readingEase += 5 ;
205        } else if(readingEaseScore <= 90){
206            readingEase += 15;
207        } else readingEase += 30;
208
209        averageReadingTime += readingEase;
210        let minutes = words.length/averageReadingTime; // minutes
211        
212        f({time:minutes, readingEase:readingEaseScore, words:words.length});
213        return($(this));
214    }
215
216})( jQuery );
217+function ($){
218
219    'use strict';
220
221    /**
222     * LimitText Class Definition
223     */
224    var LimitText = function (element, options){
225        this.options = options;
226        this.$element = $(element);
227        if(!isEmpty(this.$element.attr('maxlength'))){
228            // if an existing container is not defined, then a default will be created
229            this.$status = (this.options.statusMessage.length) ? 
230                $(this.options.statusMessage) : $(this.options.containerElement);
231
232            // Add classes to the status container, and insert base text
233            this.$status
234                .addClass(this.options.containerClass + ' ' + this.options.counterClass)
235                .append('<small class="uk-float-right uk-margin-small-top">' + 
236                    this.options.limit + '</small>');
237
238            // reference not available til we've appended the html snippet
239            this.$count = $('small', this.$status);
240
241            // insert the default message container if one isn't already defined
242            if (!this.options.statusMessage.length){
243                this.$status.insertAfter(this.$element);
244            }
245
246            // set our event handler and proxy it to properly set the context
247            this.$element.on('input.limitText.data-api propertychange.limitText.data-api', $.proxy(this.checkCount, this));
248
249            // and run initial check of current value
250            this.checkCount();
251        }
252    };
253
254    LimitText.VERSION = '0.0.1';
255    LimitText.NAME = 'limitText';
256
257    LimitText.DEFAULTS = {
258        limit: 200,
259        warningLimit: 10,
260        statusMessage: '',
261        // These two are Bootstrap text emphasis classes
262        // that you can override in the config, or roll
263        // your own of the same name
264        counterClass: 'text-primary',
265        warningClass: 'text-danger',
266        // The default container element is only used if an
267        // existing container (statusMessage) is not defined
268        containerElement: '<div>',
269        containerClass: 'limit-text-status'
270    };
271
272    LimitText.prototype.checkCount = function (){
273        var currVal = this.$element.val();
274
275        if (currVal.length > this.$element.attr('maxlength')){
276            // reset the currVal, so that it stays within the limit
277            currVal = currVal.substr(0, this.$element.attr('maxlength') - 1);
278            this.$element.val(currVal);
279        }
280
281        var remaining = this.$element.attr('maxlength') - currVal.length;
282        
283        this.$count.html(remaining);
284        
285        if (remaining <= this.options.warningLimit){
286            this.$status.removeClass(this.options.counterClass).addClass(this.options.warningClass);
287        } else {
288            this.$status.removeClass(this.options.warningClass).addClass(this.options.counterClass);
289        }
290    };
291
292    LimitText.prototype.destroy = function (){
293        $.removeData(this.$element[0], 'limitText');
294        
295        // remove the inserted status container
296        if (!this.options.statusMessage.length){
297            this.$status.remove();
298        } else {
299            this.$status
300                .removeClass(
301                    this.options.containerClass + ' ' +
302                    this.options.counterClass + ' ' +
303                    this.options.warningClass)
304                .empty();
305        }
306        
307        this.$element.off('input.limitText.data-api propertychange.limitText.data-api');
308        this.$element = null;
309    };
310
311    // limitText Plugin Definition
312
313    function Plugin (option){
314        return this.each(function (){
315            var $this = $(this),
316                data = $this.data('limitText'),
317                options = $.extend({}, LimitText.DEFAULTS, $this.data(), typeof option == 'object' && option);
318            
319            if (!data) $this.data('limitText', (data = new LimitText(this, options)));
320            if (typeof option == 'string') data[option]();
321        });
322    }
323
324    var old = $.fn.limitText;
325
326    $.fn.limitText              = Plugin;
327    $.fn.limitText.Constructor  = LimitText;
328
329    // limitText No Conflict
330
331    $.fn.limitText.noConflict = function (){
332        $.fn.limitText = old;
333        return this;
334    };
335
336}(jQuery);
337(function ($) {
338
339    'use strict';
340
341    window.FESULTLimitText = window.FESULTLimitText || {};
342
343    window.FESULTLimitText.init = function (context) {
344        var $context = context ? $(context) : $(document);
345
346        $context
347            .find('input[maxlength], textarea[maxlength]')
348            .add($context.filter('input[maxlength], textarea[maxlength]'))
349            .each(function () {
350                var $field = $(this);
351
352                if ($field.data('limitText')) {
353                    $field.limitText('checkCount');
354                    return;
355                }
356
357                $field.limitText();
358            });
359    };
360
361    window.FESULTLimitText.observe = function () {
362        if (window.FESULTLimitTextObserver) {
363            return;
364        }
365
366        window.FESULTLimitTextObserver = new MutationObserver(function (mutations) {
367            mutations.forEach(function (mutation) {
368                if (mutation.type === 'attributes') {
369                    window.FESULTLimitText.init(mutation.target);
370                    return;
371                }
372
373                $(mutation.addedNodes).each(function () {
374                    if (this.nodeType !== 1) {
375                        return;
376                    }
377
378                    window.FESULTLimitText.init(this);
379                });
380            });
381        });
382
383        window.FESULTLimitTextObserver.observe(document.body, {
384            childList: true,
385            subtree: true,
386            attributes: true,
387            attributeFilter: ['maxlength']
388        });
389    };
390
391    $(function () {
392        window.FESULTLimitText.init(document);
393        window.FESULTLimitText.observe();
394    });
395
396})(jQuery);
397jQuery(function($){
398    $.fn.hScroll = function (amount){
399        amount = amount || 120;
400        $(this).bind("DOMMouseScroll mousewheel", function(event){
401            var oEvent = event.originalEvent, 
402                direction = oEvent.detail ? oEvent.detail * -amount : oEvent.wheelDelta, 
403                position = $(this).scrollLeft();
404            if (direction === undefined) {
405                direction = event.deltaY;
406            }
407            position += direction > 0 ? -amount : amount;
408            $(this).scrollLeft(position);
409            event.preventDefault();
410        })
411    };
412});
413(function($, window, document, undefined){
414    $.fn.modal = function(userOptions){
415        var options = $.extend({}, $.fn.modal.defaults, userOptions);
416        $.fn.modal.defaults = {
417        };
418        return this.each(function(){
419            var btn = $(this),
420            modal = btn.next(),
421            closeBtn = $(".close");
422            btn.on("click", function(){
423                modal.show();
424            });
425            closeBtn.on("click", function(){
426                modal.hide();
427            });
428            modal.on("click", function(event){
429                var target = $(event.target);
430                if (target.is(modal)){
431                    modal.hide();
432                }
433            });
434        });
435    };
436})(jQuery, window, document);
437jQuery.fn.single_double_click = function(single_click_callback, double_click_callback, timeout){
438  return this.each(function(){
439    var clicks = 0, self = this;
440    jQuery(this).click(function(event){
441      clicks++;
442      if (clicks == 1) {
443        setTimeout(function(){
444          if(clicks == 1) {
445            single_click_callback.call(self, event);
446          } else {
447            double_click_callback.call(self, event);
448          }
449          clicks = 0;
450        }, timeout || 300);
451      }
452    });
453  });
454}
455function getNested(obj, ...args){
456    return args.reduce((obj, level) => obj && obj[level], obj)
457}
458var Select2Cascade = ( function(window, $){
459
460    function Select2Cascade(parent, child, placeholderEmpty, placeholder, term, select2Options, url){
461        
462        if(parent && child){
463            let afterActions = [];
464            let options = select2Options || {};
465
466            this.then = function(callback){
467                afterActions.push(callback);
468                return this;
469            };
470
471            parent.on("change", function (e){
472                
473                if(!parent.val()){
474
475                    if(options){
476                        options.placeholder = placeholderEmpty;
477                    }
478
479                    child.prop("disabled", true);
480
481                } else {
482                    
483                    if(options){
484                        options.placeholder = placeholder;
485                        
486                        if(child.data("url")){
487                            options.ajax.url = child.data("url").replace(':parentTerm:', term).replace(':parentId:', parent.val());
488                        } else if(url) {
489                            options.ajax.url = url.replace(':parentTerm:', term).replace(':parentId:', parent.val());
490                        } else {
491                            options.ajax.url = options.ajax.url.replace(':parentTerm:', term).replace(':parentId:', parent.val());
492                        }
493                    }
494
495                    child.prop("disabled", false);
496                }
497                
498                child.empty();
499                child.select2(options);
500
501            });
502        }
503    }
504
505    return Select2Cascade;
506
507})( window, $);
508function sumbitAjaxForm(formname, formurl, afterurl, closeID){
509
510    unloadCheck=false;
511    
512    var afterurl = afterurl;
513    var form = $('#'+formname);
514    var checkboxes = form.find('input[type="checkbox"]');
515    var files = form.find('input[type="file"]');
516    
517    form.blur();
518
519    var checkboxPromises = checkboxes.map(function(index, checkbox){
520        return new Promise(function(resolve) {
521          if (checkbox.checked === false) {
522            checkbox.value = 0;
523          } else {
524            checkbox.value = 1;
525          }
526
527          $('#' + formname + " input[name='" + checkbox.name + "']:input[type='hidden']").remove();
528          $('<input>').attr({
529            type: 'hidden',
530            id: checkbox.id,
531            name: checkbox.name,
532            value: checkbox.value
533          }).appendTo('#' + formname);
534
535          resolve();
536        });
537    }).get();
538    
539    var filePromises = files.map(function(index, fileInput){
540        return new Promise(function(resolve) {
541          var filesData = fileInput.files;
542
543          if (filesData.length > 0) {
544            var reader = new FileReader();
545
546            reader.onloadend = function() {
547              var fileDataUrl = reader.result;
548              var base64Index = fileDataUrl.indexOf(';base64,') + ';base64,'.length;
549              var fileData = fileDataUrl.substring(base64Index);
550
551              var fileName = fileInput.name;
552
553              $('#' + formname + " input[name='" + fileInput.name + "']:input[type='hidden']").remove();
554              $('<input>').attr({
555                type: 'hidden',
556                id: fileInput.id,
557                name: fileInput.name + '[data]',
558                value: fileData
559              }).appendTo('#' + formname);
560              $('<input>').attr({
561                type: 'hidden',
562                id: fileInput.id,
563                name: fileInput.name + '[name]',
564                value: filesData[0].name
565              }).appendTo('#' + formname);
566              $('<input>').attr({
567                type: 'hidden',
568                id: fileInput.id,
569                name: fileInput.name + '[type]',
570                value: filesData[0].type
571              }).appendTo('#' + formname);
572              $('<input>').attr({
573                type: 'hidden',
574                id: fileInput.id,
575                name: fileInput.name + '[size]',
576                value: filesData[0].size
577              }).appendTo('#' + formname);
578              $('<input>').attr({
579                type: 'hidden',
580                id: fileInput.id,
581                name: fileInput.name + '[lastModified]',
582                value: filesData[0].lastModified
583              }).appendTo('#' + formname);
584
585              resolve();
586            };
587
588            reader.readAsDataURL(filesData[0]);
589          } else {
590            resolve();
591          }
592        });
593    }).get();
594    
595    $("#"+formname).find('input[type="text"][data-emptyword]').each(function() {
596        const emptyword = $(this).attr('data-emptyword');
597        if ($(this).val() === emptyword) {
598            $(this).attr('type', 'number');
599            $(this).val(0);
600        }
601    });
602    
603    var FormValues = $("#"+formname+" input[type!='checkbox'], #"+formname+" input[type!='file'], #"+formname+" select, #"+formname+" textarea, #"+formname+" email").serialize({checkboxesAsBools: false});
604    
605    Promise.all(checkboxPromises.concat(filePromises)).then(function(){
606        
607        if(!isEmpty($("#"+formname+" input[type!='checkbox'], #"+formname+" input[type!='file'], #"+formname+" select, #"+formname+" textarea, #"+formname+" email").serialize({checkboxesAsBools: false}))){
608            FormValues = $("#"+formname+" input[type!='checkbox'], #"+formname+" input[type!='file'], #"+formname+" select, #"+formname+" textarea, #"+formname+" email").serialize({checkboxesAsBools: false});
609        }
610    
611    }).then(function(){
612        
613        $.ajax({
614            method: 'post',
615            type: 'post',
616            url: formurl,
617            dataType: 'html', //(xml, json, script, or html)
618            data: FormValues,
619            success: function(response){
620                var responseObj = jQuery.parseJSON(response);
621                if(afterurl=='download'){
622    //                var responseObj = jQuery.parseJSON(response);
623                    if(responseObj.valid==true){
624                        removeBorderChanged('#'+formname);
625                        FESULTkit.request.download({'formurl':responseObj.downloadurl});
626                    } else {
627                        if(isEmpty(responseObj.message)){
628                            removeBorderChanged('#'+formname);
629                            window.location.reload();
630                        } else {
631                            FESULTkit.notification({
632                                status: 'danger',
633                                icon: 'mdi-alert',
634                                color: 'rose',
635                                text: responseObj.message
636                            });
637                        }
638                    }
639                } else if(afterurl=='backwards'){
640                    if(responseObj.valid==true){
641                        removeBorderChanged('#'+formname);
642                        UIkit.modal('#remotemodal').hide();
643                        window.history.back();
644                    } else {
645                        if(responseObj.message){
646                            FESULTkit.notification({
647                                status: 'danger',
648                                icon: 'mdi-alert',
649                                color: 'rose',
650                                text: responseObj.message
651                            });
652                        }
653                    }
654                } else if(afterurl=='callback'){
655                    removeBorderChanged('#'+formname);
656                    callbackMainFunction(formname, 'save');                
657                } else if(afterurl=='response'){
658    //                var responseObj = jQuery.parseJSON(response);
659                    if(responseObj.valid==true){
660                        removeBorderChanged('#'+formname);
661
662                        if(responseObj.message && typeof responseObj.message !== "undefined" && responseObj.message.length>0){
663                            FESULTkit.notification({
664                                status: 'success',
665                                icon: 'mdi-check',
666                                color: 'emerald',
667                                text: responseObj.message
668                            });
669                            SaveCloseUIModal(formname, responseObj.ID);
670                        } else {
671                            FESULTkit.notification({
672                                status: 'success',
673                                icon: 'mdi-check',
674                                color: 'emerald',
675                                text: 'Daten wurden gespeichert'
676                            });
677                        }
678                        if(responseObj.reload==true){
679                            window.location.reload(true);
680                        }
681                    } else {
682                        FESULTkit.notification({
683                            status: 'danger',
684                            icon: 'mdi-alert',
685                            color: 'rose',
686                            text: responseObj.message
687                        });
688                    }
689                } else if(afterurl=='notificationbox'){
690    //                var responseObj = jQuery.parseJSON(response);
691    //                if(responseObj.valid==true){
692    //                    document.location=responseObj.redirect;
693    //                } else {
694    //                    FESULTkit.notification({message: "<i class='fas fa-exclamation-triangle'></i> "+responseObj.message, status: 'danger'});
695    //                }
696                } else if(afterurl=='redirect'){
697    //                var responseObj = jQuery.parseJSON(response);
698                    if(responseObj.valid==true){
699                        removeBorderChanged('#'+formname);
700                        UIkit.modal('#remotemodal').hide();
701                        document.location=responseObj.redirect;
702                    } else {
703                        FESULTkit.notification({
704                            status: 'danger',
705                            icon: 'mdi-alert',
706                            color: 'rose',
707                            text: responseObj.message
708                        });
709                        if(responseObj.redirect){
710                            document.location=responseObj.redirect;
711                        }
712                    }
713                }
713 else if(afterurl=='uiModalSave'){
714                    var ID='';
715                    if (IsJsonString(response)){
716    //                    var responseObj = jQuery.parseJSON(response);
717                        ID = responseObj.ID;
718                    }
719                    SaveCloseUIModal(formname, ID);
720                    $('#reloadTable').click();
721                } else if(afterurl=='reloadtable'){
722                     if(responseObj.valid==true){
723                        removeBorderChanged('#'+formname);
724                        UIkit.modal('#remotemodal').hide();
725                        $(".dataTable").each(function(index, element){
726                            var elementId = $(element).attr('id');
727                            if (typeof elementId !== 'undefined' && elementId){
728                                reloadDataTable(elementId);
729                            }
730                        });
731                    } else {
732                        FESULTkit.notification({
733                            status: 'danger',
734                            icon: 'mdi-alert',
735                            color: 'rose',
736                            text: responseObj.message, 
737                            timeout:7000
738                        });
739
740                    }
741                } else if(afterurl=='reload'){
742                    if(responseObj.valid==true){
743                        removeBorderChanged('#'+formname);
744                        UIkit.modal('#remotemodal').hide();
745                        //@TODO Immer aus oder per Parameter?
746                        //UIkit.notification({message: "<i class='fas fa-check'></i> Die Daten wurden gespeichert. Bitte warten, die Seite wird neu geladen.", status: 'success'});
747                        window.location.reload(true);
748                    } else {
749                        FESULTkit.notification({
750                            status: 'danger',
751                            icon: 'mdi-alert',
752                            color: 'rose',
753                            text: responseObj.message, 
754                            timeout:7000
755                        });
756                    }
757                } else if(afterurl=='savedialog'){
758                    FESULTkit.notification({
759                        status: 'success',
760                        icon: 'mdi-check',
761                        color: 'emerald',
762                        text: 'Die Daten wurden gespeichert.'
763                    });
764                    UIkit.modal('#remotemodal').hide();
765                } else {
766                    FESULTkit.notification({
767                        status: 'success',
768                        icon: 'mdi-check',
769                        color: 'emerald',
770                        text: 'Die Daten wurden gespeichert.'
771                    });
772                    if(closeID!=null && closeID!=''){
773                        parent.eval(closeID).close();
774                    }
775                    if(afterurl!=null && afterurl!=''){
776                        document.location=afterurl;
777                    }
778                }
779                $('.btn-save').show();
780            }
781        });
782        $('#wait').hide();
783    });
784}
785function getFormValues(frm, result){
786    if(result[0]==null){
787        if(result.valid==true){
788            $.each(result.form.elements, function(key, value){
789                var formElement = $("#"+frm+" #"+key);
790                    switch(formElement.attr("type"))
791                    {
792                        case "text" : case "hidden": case "textarea": case "password": case "number": case "email":
793                            formElement.val(value);
794                            if(key=='color'){
795                                formElement.val(value);
796                                formElement.css('background-color','#'+value);
797                            }
798                            break;
799                        case "date": case "time":
800                            formElement.val(value);
801                            break;
802                        case "select" :
803                            if(isObject(value)){
804                                formElement.val(value.id);
805                            } else {
806                                formElement.val(value);
807                            }
808                            break;
809                        case "select2" :
810                            setSelect2Value(formElement, value);
811                            break;
812                        case "color" :
813                            formElement.val(value);
814                            formElement.css('background-color','#'+value);
815                            break;
816                        case "checkbox":
817                            if(value=='1' || value==true || value=='on'){
818                                formElement.attr("checked",true);
819                            } else {
820                                formElement.attr("checked",false);
821                            }
822                            break;
823                        case "radio" :
824                            $("#"+frm+" input[name="+key+"]").attr('checked', false);
825                            $("#"+frm+" input[name="+key+"][value=" + value + "]").attr('checked', 'checked');
826                            break;
827                        case "frame" :
828                            if(value==null){
829                                value = '';
830                            }
831                            if(key=='mailBody'){
832                                value = value.replace('target="_top"','target="_blank"');
833                                value = value.replace('target="_parent"','target="_blank"');
834                                value = value.replace('target="_self"','target="_blank"');
835                            }
836                            formElement.contents().find('html').html(value);
837                        default:
838                            if(isObject(value)){
839                                value = value.value;
840                            }
841                            if(!isEmpty(formElement.data('formatdate'))){
842                                value = formatDate2str(value, formElement.data('formatdate'))
843                            }
844                            formElement.html(value);
845                    }
846                return true;
847            });
848            $("#"+frm).attr("data-init", "1");
849        } else {
850            return false;
851        }
852    } else {
853        $.each(result[0], function(key, value){
854            var formElement = $("#"+frm+" #"+key);
855                switch(formElement.attr("type"))
856                {
857                    case "text" : case "hidden": case "textarea": case "password": case "number": case "email":
858                        formElement.val(value);
859                        if(key=='color'){
860                            formElement.val(value);
861                            formElement.css('background-color','#'+value);
862                        }
863                        break;
864                    case "date": case "time":
865                        formElement.val(value);
866                        break;
867                    case "select" :
868                        formElement.val(value);
869                        break;
870                    case "color" :
871                        formElement.val(value);
872                        formElement.css('background-color','#'+value);
873                        break;
874                    case "radio" : case "checkbox":
875                        if(value=='1'){
876                            formElement.attr("checked",true);
877                        } else {
878                            formElement.attr("checked",false);
879                        }
880                        break;
881                    case "frame" :
882                        if(value==null){
883                            value = '';
884                        }
885                        if(key=='mailBody'){
886                            value = value.replace('target="_top"','target="_blank"');
887                            value = value.replace('target="_parent"','target="_blank"');
888                            value = value.replace('target="_self"','target="_blank"');
889                        }
890                        formElement.contents().find('html').html(value);
891                    default:
892                        formElement.html(value);
893                }
894            return true;
895        });
896        $("#"+frm).attr("data-init", "1");
897    }
898}
899$(document).ready(function(){
900    $("#remotemodal #remotemodal-btn-custom").on("click change", function() {
901        if(!isEmpty($('#remotemodal #remotemodal-btn-custom').attr("data-posturl"))){
902            FESULTkit.request.simplepost({'formurl':$('#remotemodal #remotemodal-btn-custom').attr("data-posturl")});
903        }
904    });
905    $('.fesult-hScroll').hScroll(120);
906});
907document.addEventListener('DOMContentLoaded', function(){
908    
909    const ele = document.getElementsByClassName('fesult-grapScroll');
910
911    for (let element of ele){
912        element.style.cursor = 'grab';
913        let pos = { top: 0, left: 0, x: 0, y: 0 };
914        
915        const mouseDownHandler = function(e){
916            element.style.cursor = 'grabbing';
917            element.style.userSelect = 'none';
918
919            pos = {
920                left: element.scrollLeft,
921                top: element.scrollTop,
922                // Get the current mouse position
923                x: e.clientX,
924                y: e.clientY,
925            };
926
927            document.addEventListener('mousemove', mouseMoveHandler);
928            document.addEventListener('mouseup', mouseUpHandler);
929        };
930
931        const mouseMoveHandler = function(e){
932            // How far the mouse has been moved
933            const dx = e.clientX - pos.x;
934            const dy = e.clientY - pos.y;
935
936            // Scroll the element
937            element.scrollTop = pos.top - dy;
938            element.scrollLeft = pos.left - dx;
939        };
940
941        const mouseUpHandler = function(){
942            element.style.cursor = 'grab';
943            element.style.removeProperty('user-select');
944
945            document.removeEventListener('mousemove', mouseMoveHandler);
946            document.removeEventListener('mouseup', mouseUpHandler);
947        };
948
949        // Attach the handler
950        element.addEventListener('mousedown', mouseDownHandler);
951    };
952});
953var FESULTcallbacks = {
954    "FormEvent": {
955        "load": function(param){
956            return;
957        },
958        "save": function(param){
959            return;
960        },
961        "close": function(param){
962            return;
963        },
964        "reset": function(param){
965            return;
966        },
967        "delete": function(param){
968            return;
969        }
970    },
971    "FormFormgenerator": {
972        "load": function(param){
973            return;
974        },
975        "save": function(param){
976            return;
977        },
978        "close": function(param){
979            return;
980        },
981        "reset": function(param){
982            return;
983        },
984        "delete": function(param){
985            window.location.reload();
986        }
987    },
988    "FormTemplateFormComponent": {
989        "load": function(param){
990            return;
991        },
992        "save": function(param){
993            return;
994        },
995        "close": function(param){
996            return;
997        },
998        "reset": function(param){
999            return;
1000        },
1001        "delete": function(param){
1002            window.location.reload();
1003        }
1004    },
1005    "FormDiseases": {
1006        "load": function(param){
1007            return;
1008        },
1009        "save": function(param){
1010            return;
1011        },
1012        "close": function(param){
1013            return;
1014        },
1015        "reset": function(param){
1016            return;
1017        },
1018        "delete": function(param){
1019            window.location.reload();
1020        }
1021    },
1022    "FormSession": {
1023        "load": function(param){
1024            return;
1025        },
1026        "save": function(param){
1027            return;
1028        },
1029        "close": function(param){
1030            return;
1031        },
1032        "reset": function(param){
1033            return;
1034        },
1035        "delete": function(param){
1036            window.location.reload();
1037        }
1038    },
1039    "FormServerassigncustomers": {
1040        "load": function(param){
1041            return;
1042        },
1043        "save": function(param){
1044            window.location.reload();
1045        },
1046        "close": function(param){
1047            return;
1048        },
1049        "reset": function(param){
1050            return;
1051        },
1052        "delete": function(param){
1053            window.location.reload();
1054        }
1055    },
1056    "FormPostpayment": {
1057        "load": function(param){
1058            $('#FormPostpayment #amount').focus();
1059            setTimeout(function() {
1060                $('#FormPostpayment #amount').focus();
1061                $('#FormPostpayment #amount').select();
1062            }, 400);
1063        },
1064        "save": function(param){
1065            window.location.reload();
1066        },
1067        "close": function(param){
1068            return;
1069        },
1070        "reset": function(param){
1071            return;
1072        },
1073        "delete": function(param){
1074            return;
1075        }
1076    },
1077    "FormApplication": {
1078        "load": function(param){
1079            $('#elm_form_application_empty').hide();
1080            $('#elm_form_application').show();
1081        },
1082        "save": function(param){
1083            $('#elm_form_application').hide();
1084            $('#elm_form_application_empty').show();
1085//            window.location.reload();
1086        },
1087        "close": function(param){
1088            $('#elm_form_application').hide();
1089            $('#elm_form_application_empty').show();
1090        },
1091        "reset": function(param){
1092            $('#elm_form_application_empty').hide();
1093            $('#elm_form_application').show();
1094        },
1095        "delete": function(param){
1096            $('#elm_form_application').hide();
1097            $('#elm_form_application_empty').show();
1098            window.location.reload();
1099        }
1100    },
1101    "FormPatientTreatingperson": {
1102        "load": function(param){
1103            return;
1104        },
1105        "save": function(param){
1106            return;
1107        },
1108        "close": function(param){
1109            return;
1110        },
1111        "reset": function(param){
1112            return;
1113        },
1114        "delete": function(param){
1115            window.location.reload();
1116        }
1117    },
1118    "FormToDo": {
1119        "load": function(param){
1120            $("#FormToDo #title").focus();
1121        },
1122        "save": function(param){
1123            window.location.reload();
1124        },
1125        "close": function(param){
1126            return;
1127        },
1128        "reset": function(param){
1129            return;
1130        },
1131        "delete": function(param){
1132            return;
1133        }
1134    },
1135    "FormWidget": {
1136        "load": function(param){
1137            $("#FormToDo #description").focus();
1138        },
1139        "save": function(param){
1140            window.location.reload();
1141        },
1142        "close": function(param){
1143            return;
1144        },
1145        "reset": function(param){
1146            return;
1147        },
1148        "delete": function(param){
1149            window.location.reload();
1150        },
1151        "clone": function(param){
1152            window.location.reload();
1153        }
1154    },
1155    "FormAddress": {
1156        "load": function(param){
1157            $("#FormAddress #street").focus();
1158            return;
1159        },
1160        "save": function(param){
1161            window.location.reload();
1162        },
1163        "close": function(param){
1164            return;
1165        },
1166        "reset": function(param){
1167            return;
1168        },
1169        "delete": function(param){
1170            return;
1171        }
1172    },
1173    "FormViewsite": {
1174        "load": function(param){
1175            return;
1176        },
1177        "save": function(param){
1178            window.location.reload();
1179        },
1180        "close": function(param){
1181            return;
1182        },
1183        "reset": function(param){
1184            return;
1185        },
1186        "delete": function(param){
1187            return;
1188        }
1189    },
1190    "FormProject": {
1191        "load": function(param){
1192            return;
1193        },
1194        "save": function(param){
1195            window.location.reload();
1196        },
1197        "close": function(param){
1198            return;
1199        },
1200        "reset": function(param){
1201            return;
1202        },
1203        "delete": function(param){
1204            return;
1205        }
1206    },
1207    "FormInvoice": {
1208        "load": function(param){
1209            return;
1210        },
1211        "save": function(param){
1212            return;
1213        },
1214        "close": function(param){
1215            return;
1216        },
1217        "reset": function(param){
1218            return;
1219        },
1220        "delete": function(param){
1221            return;
1222        }
1223    },
1224    "FormProjectParticipant": {
1225        "load": function(param){
1226            return;
1227        },
1228        "save": function(param){
1229            return;
1230        },
1231        "close": function(param){
1232            return;
1233        },
1234        "reset": function(param){
1235            return;
1236        },
1237        "delete": function(param){
1238            return;
1239        }
1240    },
1241    "FormUser": {
1242        "load": function(param){
1243            return;
1244        },
1245        "save": function(param){
1246            return;
1247        },
1248        "close": function(param){
1249            return;
1250        },
1251        "reset": function(param){
1252            return;
1253        },
1254        "delete": function(param){
1255            window.location.reload();
1256        }
1257    },
1258    "FormSiteSubLinks": {
1259        "load": function(param){
1260            return;
1261        },
1262        "save": function(param){
1263            return;
1264        },
1265        "close": function(param){
1266            return;
1267        },
1268        "reset": function(param){
1269            return;
1270        },
1271        "delete": function(param){
1272            window.location.reload();
1273        }
1274    },
1275    "FormSiteNavigation": {
1276        "load": function(param){
1277            return;
1278        },
1279        "save": function(param){
1280            return;
1281        },
1282        "close": function(param){
1283            return;
1284        },
1285        "reset": function(param){
1286            return;
1287        },
1288        "delete": function(param){
1289            window.location.reload();
1290        }
1291    },
1292    "FormSiteSubButtons": {
1293        "load": function(param){
1294            return;
1295        },
1296        "save": function(param){
1297            return;
1298        },
1299        "close": function(param){
1300            return;
1301        },
1302        "reset": function(param){
1303            return;
1304        },
1305        "delete": function(param){
1306            window.location.reload();
1307        }
1308    },
1309    "FormSiteButtonButtons": {
1310        "load": function(param){
1311            return;
1312        },
1313        "save": function(param){
1314            return;
1315        },
1316        "close": function(param){
1317            return;
1318        },
1319        "reset": function(param){
1320            return;
1321        },
1322        "delete": function(param){
1323            window.location.reload();
1324        }
1325    },
1326    "FormReminderCustomer": {
1327        "load": function(param){
1328            return;
1329        },
1330        "save": function(param){
1331            window.location.reload();
1332        },
1333        "close": function(param){
1334            return;
1335        },
1336        "reset": function(param){
1337            return;
1338        },
1339        "delete": function(param){
1340            window.location.reload();
1341        }
1342    },
1343    "FormChecklisteBudget": {
1344        "load": function(param){
1345            return;
1346        },
1347        "save": function(param){
1348            return;
1349        },
1350        "close": function(param){
1351            return;
1352        },
1353        "reset": function(param){
1354            return;
1355        },
1356        "delete": function(param){
1357            window.location.reload();
1358        }
1359    },
1360    "FormMedicalretailerdevices": {
1361        "load": function(param){
1362            return;
1363        },
1364        "save": function(param){
1365            return;
1366        },
1367        "close": function(param){
1368            return;
1369        },
1370        "reset": function(param){
1371            return;
1372        },
1373        "delete": function(param){
1374            window.location.reload();
1375        }
1376    },
1377    "FormPatientHistory": {
1378        "load": function(param){
1379            return;
1380        },
1381        "save": function(param){
1382            $('#Table').DataTable().ajax.reload();
1383        },
1384        "close": function(param){
1385            return;
1386        },
1387        "reset": function(param){
1388            return;
1389        },
1390        "delete": function(param){
1391            $('#Table').DataTable().ajax.reload();
1392        }
1393    },
1394    "FormPatientAllergies": {
1395        "load": function(param){
1396            return;
1397        },
1398        "save": function(param){
1399            $('#Table').DataTable().ajax.reload();
1400        },
1401        "close": function(param){
1402            return;
1403        },
1404        "reset": function(param){
1405            return;
1406        },
1407        "delete": function(param){
1408            $('#Table').DataTable().ajax.reload();
1409        }
1410    },
1411    "FormPatientAbsencedays": {
1412        "load": function(param){
1413            return;
1414        },
1415        "save": function(param){
1416            $('#Table').DataTable().ajax.reload();
1417        },
1418        "close": function(param){
1419            return;
1420        },
1421        "reset": function(param){
1422            return;
1423        },
1424        "delete": function(param){
1425            $('#Table').DataTable().ajax.reload();
1426        }
1427    },
1428    "FormPatientDiagnosis": {
1429        "load": function(param){
1430            return;
1431        },
1432        "save": function(param){
1433            return;
1434        },
1435        "close": function(param){
1436            return;
1437        },
1438        "reset": function(param){
1439            return;
1440        },
1441        "delete": function(param){
1442            window.location.reload();
1443        }
1444    },
1445    "FormMedicaltechnicandevices": {
1446        "load": function(param){
1447            return;
1448        },
1449        "save": function(param){
1450            return;
1451        },
1452        "close": function(param){
1453            return;
1454        },
1455        "reset": function(param){
1456            return;
1457        },
1458        "delete": function(param){
1459            window.location.reload();
1460        }
1461    },
1462    "FormContactdata": {
1463        "load": function(param){
1464            return;
1465        },
1466        "save": function(param){
1467            return;
1468        },
1469        "close": function(param){
1470            return;
1471        },
1472        "reset": function(param){
1473            return;
1474        },
1475        "delete": function(param){
1476            window.location.reload();
1477        }
1478    },
1479    "FormMedicalmanufacturerdevices": {
1480        "load": function(param){
1481            return;
1482        },
1483        "save": function(param){
1484            return;
1485        },
1486        "close": function(param){
1487            return;
1488        },
1489        "reset": function(param){
1490            return;
1491        },
1492        "delete": function(param){
1493            window.location.reload();
1494        }
1495    },
1496    "FormCompanySettingsProposals": {
1497        "load": function(param){
1498            return;
1499        },
1500        "save": function(param){
1501            return;
1502        },
1503        "close": function(param){
1504            return;
1505        },
1506        "reset": function(param){
1507            return;
1508        },
1509        "delete": function(param){
1510            window.location.reload();
1511        }
1512    },
1513    "FormInvoiceitem": {
1514        "load": function(param){
1515            $("#FormInvoiceitem #netamount").each(function() {
1516                $(this).on("change", function() {
1517                    let betrag = $(this).val();
1518                    betrag = betrag.replace(',', '.');
1519                    betrag = ((parseFloat(betrag)/100)*(parseFloat($("#FormInvoiceitem #taxrate").val())+100));
1520                    betrag = betrag.toFixed(2);
1521                    $("#FormInvoiceitem #grossamount").val(betrag.replace('.', ','));
1522                });
1523            });
1524            $("#FormInvoiceitem #taxrate").each(function() {
1525                $(this).on("change", function() {
1526                    let betrag = $("#FormInvoiceitem #netamount").val();
1527                    betrag = betrag.replace(',', '.');
1528                    betrag = ((parseFloat(betrag)/100)*(parseFloat($("#FormInvoiceitem #taxrate").val())+100));
1529                    betrag = betrag.toFixed(2);
1530                    $("#FormInvoiceitem #grossamount").val(betrag.replace('.', ','));
1531                });
1532            });
1533            $("#FormInvoiceitem #grossamount").each(function() {
1534                $(this).on("change", function() {
1535                    let betragBrutto = $(this).val();
1536                    betragBrutto = betragBrutto.replace(',', '.');
1537                    betragBrutto = ((parseFloat(betragBrutto)/(100+parseFloat($("#FormInvoiceitem #taxrate").val())))*(100));
1538                    betragBrutto = betragBrutto.toFixed(2);
1539                    $("#FormInvoiceitem #netamount").val(betragBrutto.replace('.', ','));
1540                });
1541            });
1542        },
1543        "save": function(param){
1544            return;
1545        },
1546        "close": function(param){
1547            return;
1548        },
1549        "reset": function(param){
1550            return;
1551        },
1552        "delete": function(param){
1553            return;
1554        }
1555    },
1556    "FormChecklisteBudget": {
1557        "load": function(param){
1558            return;
1559        },
1560        "save": function(param){
1561            return;
1562        },
1563        "close": function(param){
1564            return;
1565        },
1566        "reset": function(param){
1567            return;
1568        },
1569        "delete": function(param){
1570            return;
1571        }
1572    }
1573};
1574function generateFormItems(element){
1575    if(isEmpty(element)){
1576        return;
1577    }
1578
1579    var appendElement = '';
1580
1581    if(element.type == 'h1' || element.type == 'h2' || element.type == 'h3' || element.type == 'h4' || element.type == 'h5' || element.type == 'h6'){
1582        appendElement = $("<"+element.type+">"+generateFormItemsContent(element.content)+"</"+element.type+">");
1583    } else if(element.type == 'content' || element.type == 'span'){
1584        appendElement = $("<span>"+generateFormItemsContent(element.content)+"</span>");
1585    } else if(element.type == 'label'){
1586        appendElement = $("<label>"+generateFormItemsContent(element.content)+"</label>");
1587    } else if(element.type == 'p'){
1588        appendElement = $("<p>"+generateFormItemsContent(element.content)+"</p>");
1589    } else if(element.type == 'a'){
1590        appendElement = $("<a>"+generateFormItemsContent(element.content)+"</a>");
1591    } else if(element.type == 'button'){
1592        appendElement = $("<button>"+generateFormItemsContent(element.content)+"</button>");
1593    } else if(element.type == 'textarea'){
1594        appendElement = $("<textarea>"+generateFormItemsContent(element.content)+"</textarea>");
1595    } else if(element.type == 'form'){
1596        appendElement = $("<form>"+generateFormItemsContent(element.content)+"</form>");
1597    } else if(element.type == 'i'){
1598        appendElement = $("<i>"+generateFormItemsContent(element.content)+"</i>");
1599    } else if(element.type == 'div'){
1600        appendElement = $("<div>"+generateFormItemsContent(element.content)+"</div>");
1601    } else if(element.type == 'del'){
1602        appendElement = $("<del>"+generateFormItemsContent(element.content)+"</del>");
1603    } else if(element.type == 'ul'){
1604        appendElement = $("<ul>"+generateFormItemsContent(element.content)+"</ul>");
1605    } else if(element.type == 'li'){
1606        appendElement = $("<li>"+generateFormItemsContent(element.content)+"</li>");
1607    } else if(element.type == 'optgroup'){
1608        appendElement = $("<optgroup>"+generateFormItemsContent(element.content)+"</optgroup>");
1609    } else if(element.type == 'input'){
1610        // FIX: Input ist ein Void-Element – niemals mit Inhalt/Closing-Tag erzeugen
1611        appendElement = $("<input>");
1612    } else if(element.type == 'select'){
1613        appendElement = $("<select>"+generateFormItemsContent(element.content)+"</select>");
1614    } else if(element.type == 'option'){
1615        appendElement = $("<option>"+generateFormItemsContent(element.content)+"</option>");
1616    } else if(element.type == 'picture'){
1617        appendElement = $("<picture>"+generateFormItemsContent(element.content)+"</picture>");
1618    } else if(element.type == 'img'){
1619        appendElement = $("<img>");
1620    } else if(element.type == 'br'){
1621        appendElement = $("<br>");
1622    } else if(element.type == 'hr'){
1623        appendElement = $("<hr>");
1624    } else if(element.type == 'pre'){
1625        appendElement = $("<pre>"+generateFormItemsContent(element.content)+"</pre>");
1626    } else if(element.type == 'table'){
1627        appendElement = $("<table>"+generateFormItemsContent(element.content)+"</table>");
1628    } else if(element.type == 'thead'){
1629        appendElement = $("<thead>"+generateFormItemsContent(element.content)+"</thead>");
1630    } else if(element.type == 'tbody'){
1631        appendElement = $("<tbody>"+generateFormItemsContent(element.content)+"</tbody>");
1632    } else if(element.type == 'tr'){
1633        appendElement = $("<tr>"+generateFormItemsContent(element.content)+"</tr>");
1634    } else if(element.type == 'th'){
1635        appendElement = $("<th>"+generateFormItemsContent(element.content)+"</th>");
1636    } else if(element.type == 'td'){
1637        appendElement = $("<td>"+generateFormItemsContent(element.content)+"</td>");
1638    } else if(element.type == 'article'){
1639        appendElement = $("<article>"+generateFormItemsContent(element.content)+"</article>");
1640    } else if(element.type == 'datalist'){
1641        appendElement = $("<datalist>"+generateFormItemsContent(element.content)+"</datalist>");
1642    } else if(element.type == 'script'){
1643        appendElement = $("<script style=\"display:none\">"+generateFormItemsContent(element.content)+"</script>");
1644    } else {
1645        if (typeof element.type !== 'undefined'){
1646            console.warn('Element wurde nicht erzeugt: unbekannter Typ ' + element.type);
1647        } else {
1648            console.warn('Element wurde nicht erzeugt: unbekannter Typ');
1649            console.warn(element);
1650        }
1651    }
1652
1653    if(!isEmpty(appendElement) && element.attr){
1654        // FIX: class nur einmal setzen; nur definierte Werte als Attribute schreiben
1655        if (element.attr.class){
1656            appendElement.addClass(element.attr.class);
1657        }
1658        $.each(element.attr, function(key, value){
1659            if (key === 'class') return;
1660            if (value === undefined || value === null) return;
1661            appendElement.attr(key, value);
1662        });
1663    }
1664
1665    if(appendElement){
1666        return appendElement[0].outerHTML;
1667    }
1668}
1669function generateFormItemsContent(element){
1670    if(isEmpty(element)){
1671        return '';
1672    }
1673    if($.isArray(element)){
1674        var appendObjts = '';
1675        $(element).each(function(index, el){
1676            var genObject = generateFormItems(el);
1677            if(!isEmpty(genObject)){
1678                appendObjts += genObject;
1679            }
1680        });
1681        return appendObjts;
1682    } else {
1683        return element;
1684    }
1685}
1686function formatSelect2Project(state){
1687    if (!state.id) {
1688      return state.text;
1689    }
1690    
1691    var artIcon = '';
1692
1693    var subtext = [state.id, state.projectstatus, state.customer].filter(Boolean).join(" | ");
1694
1695    var $result = $('<span>'+state.text+'<br><span class="text-xs">'+artIcon+'<span class="itext-muted">'+subtext+'</span></span></span>');
1696    return $result;
1697};
1698function formatSelect2small(state){
1699    if (!state.id){
1700        return state.text;
1701    }
1702    
1703    let subtext = '';
1704    let dropdowntext = '';
1705    
1706    if(state.element){
1707        subtext = state.element.dataset.subtext ? `<br><span class="text-xs itext-muted">${state.element.dataset.subtext}</span>` : '';
1708        dropdowntext = state.element.dataset.dropdowntext ? `<div class="fesult-dropdown-triangle uk-dropdown" style="min-width:400px" uk-dropdown="pos: right-center; offset: 40; inset: false">${state.element.dataset.dropdowntext}</div>` : '';
1709    }
1710    
1711    let elementclass = 'text-sm padding-5 ';
1712    
1713    if (state.element && state.element.dataset.styleelement){
1714        elementclass += state.element.dataset.styleelement;
1715    }
1716    
1717    let $result = $(`<div class="${elementclass}">${state.text}${subtext}</div>${dropdowntext}`);
1718
1719    return $result;
1720};
1721function formatSelect2formated(state){
1722    if (!state.id){
1723      return state.text;
1724    }
1725
1726    let $result = $('<span class="'+state.cssclass+'">
1726'+state.text+'</span>');
1727    
1728    return $result;
1729};
1730function formatSelect2Tablecolumns(state){
1731    if (!state.id) {
1732      return state.text;
1733    }
1734
1735    var $result = $('<span class="text-sm">'+state.text+'</span>');
1736    return $result;
1737};
1738function setterSelect2Tablecolumns (data, container){
1739    return data.id;
1740}
1741function formatSelect2Gitissuse(state){
1742    if (!state.id) {
1743      return state.text;
1744    }
1745    
1746    let artIcon = '';
1747    if(state.provider=='Gitlab'){
1748        artIcon = '<i class="fab fa-gitlab itext-muted"></i> ';
1749    } else if(state.provider=='Github'){
1750        artIcon = '<i class="fab fa-github itext-muted"></i> ';
1751    } else if(state.provider=='Bitbucket'){
1752        artIcon = '<i class="fab fa-bitbucket itext-muted"></i> ';
1753    }
1754    
1755    var subtext = [state.externalID, state.state].filter(Boolean).join(" | ");
1756
1757    var $result = $('<span>'+state.text+'<br><span class="text-xs">'+artIcon+'<span class="itext-muted">'+subtext+'</span></span></span>');
1758    return $result;
1759};
1760function formatSelect2Bookkeepingaccount(state){
1761    if (!state.id) {
1762      return state.text;
1763    }
1764
1765    let artIcon = '';
1766    if(!state.artID || state.artID==0 || state.artID==1){
1767        artIcon = '<i class="fas fa-question-circle itext-muted"></i> ';
1768    } else if(state.artID==2){
1769        artIcon = '<i class="fas fa-arrow-alt-circle-up itext-success"></i> ';
1770    } else if(state.artID==3){
1771        artIcon = '<i class="fas fa-arrow-alt-circle-down itext-danger"></i> ';
1772    }
1773    
1774    var subtext = [state.bezeichnung].filter(Boolean).join(" | ");
1775
1776    var $result = $('<span>'+state.text+'<br><span class="text-xs">'+artIcon+'<span class="itext-muted">'+subtext+'</span></span></span>');
1777    return $result;
1778};
1779function formatSelect2Assignment(state){
1780    if (!state.id) {
1781      return state.text;
1782    }
1783
1784    let kunde = '';
1785    let person = '';
1786    
1787    if(!isEmpty(state.kunde)){
1788        kunde = state.kunde;
1789    }
1790    
1791    if(!isEmpty(state.person.vorname)){
1792        person = person+state.person.vorname;
1793    }
1794    if(!isEmpty(state.person.nachname)){
1795        person = person+' '+state.person.nachname;
1796    }
1797
1798    var subtext = [person, kunde].filter(Boolean).join(" | ");
1799
1800    var $result = $('<span>'+state.text+'<br><span class="text-xs itext-muted">'+subtext+'</span></span>');
1801    return $result;
1802};
1803function formatSelect2Article(state){
1804    if (!state.id) {
1805      return state.text;
1806    }
1807    let artIcon = '';
1808    
1809    if(!state.artID || state.artID==0 || state.artID==1){
1810        artIcon = '<i class="fas fa-question-circle itext-muted"></i> ';
1811    } else if(state.artID==2){
1812        artIcon = '<i class="fas fa-arrow-alt-circle-up itext-success"></i> ';
1813    } else if(state.artID==3){
1814        artIcon = '<i class="fas fa-arrow-alt-circle-down itext-danger"></i> ';
1815    }
1816
1817    let subtext = [state.atikelnummer, state.preisFormated].filter(Boolean).join(" | ");
1818
1819    var $result = $('<span>'+state.text+'<br><span class="text-xs itext-muted">'+subtext+'</span></span>');
1820    return $result;
1821};
1822function formatSelect2Gender(state){
1823    if (!state.id) {
1824      return state.text;
1825    }
1826    var $result = $('<span>'+state.icon+' '+state.text+'</span>');
1827    return $result;
1828};
1829function formatSelect2Paymentmethod(state){
1830    if (!state.id) {
1831      return state.text;
1832    }
1833    var $result = $('<span>'+state.text+'</span>');
1834    return $result;
1835};
1836function formatSelect2paneltype(state){
1837    if (!state.id) {
1838      return state.name;
1839    }
1840    
1841    let icon = '';
1842    
1843    if(!isEmpty(state.icon)){
1844        icon = '<img style="width:40px;" src="' + state.icon + '"/>';
1845    }
1846
1847    var $result = $('<div class="uk-grid uk-grid-small clearfix"><div class="uk-width-auto">'+icon+'</div><div class="uk-width-expand">'+state.name+'</div></div>');
1848    return $result;
1849};
1850function formatSelect2Person(state){
1851    if (!state.id) {
1852      return state.text;
1853    }
1854    
1855    let avatar = '';
1856    let icon = '';
1857    let subtext = [state.pia_professionalgroup,state.eMailadresse,state.email].filter(Boolean).join(" | ");
1858    let text = state.text;
1859    
1860    if(!isEmpty(state.avatar)){
1861        avatar = '<img class="uk-border-circle" style="width:40px;" src="' + state.avatar + '"/>';
1862    }
1863    if(!isEmpty(state.genderIcon)){
1864        icon = state.genderIcon;
1865    }
1866    if(state.id==='all'){
1867        text = '<b>'+text+'</b>';
1868    }
1869    
1870    var $result = $('<div class="uk-grid uk-grid-small clearfix"><div class="uk-width-auto">'+avatar+'</div><div class="uk-width-expand text-sm"><span>'+icon+text+'<br><span class="text-xs itext-muted">'+subtext+'</span></span></div></div>');
1871    return $result;
1872};
1873function formatSelect2Hospitalcase(state){
1874    if (!state.id) {
1875      return state.text;
1876    }
1877
1878    return $('<div class="uk-grid uk-grid-small clearfix"><div class="uk-width-expand"><span>'+state.text+'<br><span class="text-xs itext-muted">'+state.subtext+'</span></span></div></div>');
1879};
1880function formatSelect2Patient(state){
1881    if (!state.id) {
1882      return state.text;
1883    }
1884    
1885    let icon = '';
1886    let textsuffix = '';
1887    let textclass = '';
1888    let subtext = [state.birthdate, state.internalID, state.casenumber].filter(Boolean).join(" | ");
1889    
1890    if (!state.active && (state.active==1 || state.active=='1')){
1891        textclass = ' itext-danger';
1892        textsuffix = ' - bereits storniert';
1893    }
1894
1895    if(!isEmpty(state.genderIcon)){
1896        icon = state.genderIcon;
1897    }
1898
1899    var $result = $('<div class="uk-grid uk-grid-small clearfix"><div class="uk-width-expand'+textclass+'"><span>
1899'+icon+state.text+textsuffix+'<br><span class="text-xs itext-muted">'+subtext+'</span></span></div></div>');
1900    return $result;
1901};
1902function formatSelect2Language(state){
1903
1904    if (!state.id) {
1905      return state.text;
1906    }
1907    
1908    let image = '';
1909    
1910    if(!isEmpty(state.id)){
1911        image = '<img loading="lazy" src="images/country/'+state.id+'.png" width="18px"/>';
1912    } else {
1913        image = '<img loading="lazy" src="images/country/none.png" width="18px"/>';
1914    }
1915
1916    let $result = $('<div class="uk-grid uk-grid-small clearfix text-sm"><div class="uk-width-auto">'+image+'</div><div class="uk-width-expand"><span>'+state.text+'</span> <span class="itext-muted">('+state.id+')</span></div></div>');
1917    
1918    return $result;
1919};
1920function formatSelect2Icons(state){
1921
1922    let keywords = '';
1923    
1924    if(!isEmpty(state.keywords)){
1925        state.keywords.forEach(function(entry){
1926//            keywords.push('<span class="uk-label fesult-background-bluegrey">'+entry+'</span>');
1927            keywords = keywords+'<span class="uk-label fesult-background-bluegrey" style="margin-right:3px;">'+entry+'</span>';
1928        });
1929    }
1930    let $result = $('<div class="uk-grid uk-grid-small clearfix"><div class="uk-width-auto"><img loading="lazy" src="'+state.imagepath+'"/ width="40px"></div><div class="uk-width-expand">'+keywords+'</div></div>');
1931    
1932    return $result;
1933};
1934function formatSelect2IconsSmall(state){
1935
1936    /*let keywords = '';
1937    
1938    if(!isEmpty(state.keywords)){
1939        state.keywords.forEach(function(entry){
1940            keywords = keywords+'<span class="uk-label fesult-background-bluegrey" style="margin-right:3px;">'+entry+'</span>';
1941        });
1942    }*/
1943    let $result = $('<div class="uk-grid uk-grid-small clearfix"><div class="uk-width-expand text-center"><img src="'+state.imagepath+'"/ width="30px"></div><div class="uk-width-expand text-center"><img src="'+state.imagepath+'"/ width="24px"></div><div class="uk-width-expand text-center"><img src="'+state.imagepath+'"/ width="16px"></div></div>');
1944    
1945    return $result;
1946};
1947function formatSelect2IconsFa(state){
1948
1949    /*let keywords = '';
1950    
1951    if(!isEmpty(state.keywords)){
1952        state.keywords.forEach(function(entry){
1953            keywords = keywords+'<span class="uk-label fesult-background-bluegrey" style="margin-right:3px;">'+entry+'</span>';
1954        });
1955    }*/
1956    let $result = $('<div class="uk-grid uk-grid-small clearfix"><div class="uk-width-auto text-center"><i class="'+state.fapath+' fa-fw"></i></div><div class="uk-width-expand">'+state.fapath+'</div></div>');
1957    
1958    return $result;
1959};
1960function formatSelect2faText(state){
1961    if(state.icon){
1962        return $('<div class="uk-grid uk-grid-small clearfix"><div class="uk-width-auto text-center"><i class="'+state.icon+' fa-fw"></i></div><div class="uk-width-expand">'+state.text+'</div></div>');
1963    } else {
1964        return $('<div class="uk-grid uk-grid-small clearfix"><div class="uk-width-auto text-center"></div><div class="uk-width-expand">'+state.text+'</div></div>');
1965    }
1966};
1967function formatSelect2faTextSmall(state){
1968    if(state.icon){
1969        return $('<div class="uk-grid uk-grid-small clearfix text-sm"><div class="uk-width-auto text-center"><i class="'+state.icon+' fa-fw"></i></div><div class="uk-width-expand">'+state.text+'</div></div>');
1970    } else {
1971        return $('<div class="uk-grid uk-grid-small clearfix text-sm"><div class="uk-width-auto text-center"></div><div class="uk-width-expand">'+state.text+'</div></div>');
1972    }
1973};
1974function formatSelect2colorselect(state){
1975
1976    let $result = $('<div class="w-full fesult-eventcolor_'+state.id+'_bg" style="color:#FFF;"><span class="pl-2">'+state.text+'</span></div>');
1977    
1978    return $result;
1979};
1980function formatSelect2bgcolorselect(state){
1981
1982    let $result = $('<div class="uk-grid uk-grid-small clearfix"><div class="uk-width-expand '+state.showclass+'">'+state.text+'</div></div>');
1983    
1984    return $result;
1985};
1986function formatSelect2HapiAtccodes(state){
1987    if (!state.id) {
1988      return state.text;
1989    }
1990    
1991    let text = '';
1992    let info = '';
1993    let version = '';
1994    let subtext = '';
1995
1996    if(state.description){
1997        text = state.code+' ('+state.description+')';
1998    } else {
1999        text = state.code;
2000    }
2001    if(state.info){
2002        info = 'DDD-Info: '+state.info;
2003    }
2004    if(state.version){
2005        version = '(Version: '+state.version+')';
2006    }
2007    
2008    let subtextString = [info].filter(Boolean).join(" | ");
2009    
2010    subtext = '<div class="uk-grid uk-grid-small text-xs"><div class="uk-width-expand">'+subtextString+'</div><div class="uk-width-auto">'+version+'</div></div>';
2011    
2012    return $('<span class="text-sm">'+text+'<br>'+subtext+'</span>');
2013}
2014function formatSelect2drugs(state){
2015    if (!state.id) {
2016      return state.text;
2017    }
2018    
2019    let text = '';
2020    let pzn = '';
2021    let packagesize = '';
2022    let atccode = '';
2023    let manufacturer = '';
2024    let subtext = '';
2025    let activesubstance = state.activesubstance;
2026    let fallbackdata = '';
2027    
2028    if(state.isbtm==1){
2029        activesubstance = '<span class="itext-danger">'+activesubstance+'</span>';
2030    }
2031
2032    if(state.tradename){
2033        if(state.activesubstance){
2034            text = state.tradename+' ('+activesubstance+')';
2035        } else {
2036            text = state.tradename;
2037        }
2038    } else {
2039        text = activesubstance;
2040    }
2041    
2042    if(state.activestrength && state.ingredientstrength){
2043        text = text+' - '+state.activestrength+' '+state.ingredientstrength;
2044    }
2045    if(state.dosageformStr){
2046        text = text+' - '+state.dosageformStr;
2047    }
2048    if(state.deliverybottleneck){
2049        text = '<i class="fas fa-truck fa-fw itext-danger uk-margin-small-right" itooltip="Lieferengpassmeldung vorliegen"></i>'+text;
2050    }
2051    if(state.pzn){
2052        pzn = 'PZN: '+state.pzn;
2053    } else {
2054       if(state.pic){
2055            pzn = 'PIC: '+state.pic;
2056        }
2057    }
2058    if(state.packagesize){
2059        packagesize = 'Packung: '+state.packagesize;
2060    }
2061    if(state.atccode){
2062        atccode = 'ATC: '+state.atccode;
2063    }
2064    if(state.manufacturer){
2065        manufacturer = '('+state.manufacturer+')';
2066    }
2067    
2068    if(state.fallbackdata && state.fallbackdata==1){
2069        fallbackdata = '<span class="itext-warning">Datensatz aus Fallbacksystem</span>';
2070    }
2071    
2072    let subtextString = [pzn,atccode,packagesize].filter(Boolean).join(" | ");
2073    
2074    text = '<div class="uk-grid uk-grid-small"><div class="uk-width-expand">'+text+'</div><div class="uk-width-auto text-xs">'+fallbackdata+'</div></div>';
2075    subtext = '<div class="uk-grid uk-grid-small text-xs" style="margin-top:5px;"><div class="uk-width-expand">'+subtextString+'</div><div class="uk-width-auto">'+manufacturer+'</div></div>';
2076    
2077    return $('<span class="text-sm">'+text+subtext+'</span>');
2078};
2079function setterSelect2ifapdrugs (data, container){
2080    
2081    if(data.pic){
2082        $.post(
2083            {
2084                url: FESULTencryptURLs.sz6N8KD2EDVE6OTtifap,
2085                method: "GET",
2086                async: false,
2087                cache: false,
2088                data: {
2089                    'action':'detail',
2090                    'pic': data.pic
2091                },
2092                dataType: "json"
2093            }, function(response, status, xhr){
2094                setterSelect2drugs(response.result, container);
2095            }
2096        ).fail(function(xhr, textStatus, errorThrown){
2097            if(xhr.code === 403){
2098                FESULTkit.notification({
2099                    status: 'danger',
2100                    icon: 'mdi-alert',
2101                    color: 'rose',
2102                    text: 'Authentifizierung erforderlich, bitte loggen Sie sich erneut ein'
2103                });
2104            } else {
2105                FESULTkit.notification({
2106                    status: 'danger',
2107                    icon: 'mdi-alert',
2108                    color: 'rose',
2109                    text: 'ifap webSERVICE Daten konnten nicht abgerufen werden'
2110                });
2111            }
2112        });
2113    }
2114    
2115    return data.text;
2116}
2117function setterSelect2drugs (data, container){
2118    
2119    let parentform = $(container).closest("form");
2120    if(parentform.length!=0){
2121        if(!isEmpty(parentform.attr('id'))){
2122            
2123            if(!isEmpty(data.pzn) && data.pzn){
2124                $('#'+parentform.attr('id')+' #pzn').val(data.pzn);
2125                $('#'+parentform.attr('id')+' #pzn').prop('readonly', true);
2126            } else {
2127                $('#'+parentform.attr('id')+' #pzn').val('');
2128                $('#'+parentform.attr('id')+' #pzn').prop('readonly', false);
2129            }
2130            if(!isEmpty(data.pic) && data.pic){
2131                $('#'+parentform.attr('id')+' #pic').val(data.pic);
2132                $('#'+parentform.attr('id')+' #pic').prop('readonly', true);
2133            } else {
2134                $('#'+parentform.attr('id')+' #pic').val('');
2135                $('#'+parentform.attr('id')+' #pic').prop('readonly', false);
2136            }
2137            if(!isEmpty(data.activesubstance) && data.activesubstance){
2138                $('#'+parentform.attr('id')+' #activesubstance').val(data.activesubstance);
2139                $('#'+parentform.attr('id')+' #activesubstance').prop('readonly', true);
2140            } else {
2141                $('#'+parentform.attr('id')+' #activesubstance').val('');
2142                $('#'+parentform.attr('id')+' #activesubstance').prop('readonly', false);
2143            }
2144            if(!isEmpty(data.packagesize) && data.packagesize){
2145                $('#'+parentform.attr('id')+' #packagesize').val(data.packagesize);
2146                $('#'+parentform.attr('id')+' #packagesize').prop('readonly', true);
2147            } else {
2148                $('#'+parentform.attr('id')+' #packagesize').val('');
2149                $('#'+parentform.attr('id')+' #packagesize').prop('readonly', false);
2150            }
2151            if(!isEmpty(data.tradename) && data.tradename){
2152                $('#'+parentform.attr('id')+' #tradename').val(data.tradename);
2153                $('#'+parentform.attr('id')+' #tradename').prop('readonly', true);
2154            } else {
2155                $('#'+parentform.attr('id')+' #tradename').val('');
2156                $('#'+parentform.attr('id')+' #tradename').prop('readonly', false);
2157            }
2158            if(!isEmpty(data.atccode) && data.atccode){
2159                $('#'+parentform.attr('id')+' #atccode').val(data.atccode);
2160                $('#'+parentform.attr('id')+' #atccode').prop('readonly', true);
2161            } else {
2162                $('#'+parentform.attr('id')+' #atccode').val('');
2163                $('#'+parentform.attr('id')+' #atccode').prop('readonly', false);
2164            }
2165            if(!isEmpty(data.isbtm) && data.isbtm){
2166                if(data.isbtm==1){
2167                    $('#'+parentform.attr('id')+' #isbtm').prop('checked', true);
2168                } else {
2169                    $('#'+parentform.attr('id')+' #isbtm').prop('checked', false);
2170                }
2171            }
2172            if(!isEmpty(data.manufacturer) && data.manufacturer){
2173                $('#'+parentform.attr('id')+' #manufacturer').val(data.manufacturer);
2174            } else {
2175                $('#'+parentform.attr('id')+' #manufacturer').val('');
2176                $('#'+parentform.attr('id')+' #manufacturer').prop('readonly', false);
2177            }
2178            if(!isEmpty(data.activestrength) && data.activestrength){
2179                $('#'+parentform.attr('id')+' #activestrength').val(data.activestrength);
2180            } else {
2181                $('#'+parentform.attr('id')+' #activestrength').val('');
2182                $('#'+parentform.attr('id')+' #activestrength').prop('readonly', false);
2183            }
2184            if(!isEmpty(data.ingredientstrength) && data.ingredientstrength){
2185                $('#'+parentform.attr('id')+' #ingredientstrength').val(data.ingredientstrength);
2186            } else {
2187                $('#'+parentform.attr('id')+' #ingredientstrength').val('');
2188                $('#'+parentform.attr('id')+' #ingredientstrength').prop('readonly', false);
2189            }
2190            if(!isEmpty(data.dosageform) && data.dosageform){
2191                
2192                $('#'+parentform.attr('id')+' #dosageformCode').val(null).trigger('change');
2193                
2194                if ($('#'+parentform.attr('id')+' #dosageformCode').find("option[value='" + data.dosageform 
2194+ "']").length) {
2195                    $('#'+parentform.attr('id')+' #dosageformCode').val(data.dosageform).trigger('change');
2196                } else { 
2197                    var newOption = new Option(data.dosageformStr, data.dosageform, true, true);
2198                    $('#'+parentform.attr('id')+' #dosageformCode').append(newOption).trigger('change');
2199                }
2200            }
2201            if(!isEmpty(data.dosageform) && data.dosageform){
2202                
2203                $('#'+parentform.attr('id')+' #dosageform').val(null).trigger('change');
2204                
2205                if ($('#'+parentform.attr('id')+' #dosageform').find("option[value='" + data.dosageform + "']").length) {
2206                    $('#'+parentform.attr('id')+' #dosageform').val(data.dosageform).trigger('change');
2207                } else { 
2208                    var newOption = new Option(data.dosageformStr, data.dosageform, true, true);
2209                    $('#'+parentform.attr('id')+' #dosageform').append(newOption).trigger('change');
2210                }
2211            }
2212            if(!isEmpty(data.unit) && data.unit){
2213                
2214                $('#'+parentform.attr('id')+' #dosingunitCode').val(null).trigger('change');
2215                
2216                if ($('#'+parentform.attr('id')+' #dosingunitCode').find("option[value='" + data.unit + "']").length) {
2217                    $('#'+parentform.attr('id')+' #dosingunitCode').val(data.unit).trigger('change');
2218                } else { 
2219                    var newOption = new Option(data.unitStr, data.unit, true, true);
2220                    $('#'+parentform.attr('id')+' #dosingunitCode').append(newOption).trigger('change');
2221                }
2222            }
2223            if(data.notdivisible==1){
2224                $('#'+parentform.attr('id')+' #activestrength').prop('readonly', true);
2225                $('#'+parentform.attr('id')+' #ingredientstrength').prop('readonly', true);
2226            } else {
2227                $('#'+parentform.attr('id')+' #activestrength').prop('readonly', false);
2228                $('#'+parentform.attr('id')+' #ingredientstrength').prop('readonly', false);
2229            }
2230        }
2231    }
2232    return data.text;
2233}
2234function setterSelect2servicesToEvent (data, container){
2235    console.warn(data);
2236    /*let parentform = $(container).closest("form");
2237    if(parentform.length!=0){
2238        if(!isEmpty(parentform.attr('id'))){
2239            if(!isEmpty(data.minutesplanted) && data.minutesplanted){
2240                $('#'+parentform.attr('id')+' #duration').val(data.minutesplanted);
2241            }
2242        }
2243    }*/
2244    return data.text;
2245}
2246function setterTomSelectDefault (data, container){
2247    return data.text;
2248}
2249function setterSelect2services (data, container){
2250    
2251    let parentform = $(container).closest("form");
2252    if(parentform.length!=0){
2253        if(!isEmpty(parentform.attr('id'))){
2254            if(!isEmpty(data.minutesplanted) && data.minutesplanted){
2255                $('#'+parentform.attr('id')+' #duration').val(data.minutesplanted);
2256            }
2257        }
2258    }
2259    return data.text;
2260}
2261function setterSelect2adminconnectorfields (data, container){
2262    
2263    let parentform = $(container).closest("form");
2264    if(parentform.length!=0){
2265        if(!isEmpty(parentform.attr('id'))){
2266            if(!isEmpty(data.transdescription) && data.transdescription){
2267                if ($('#'+parentform.attr('id')+' #transdescription').find("option[value='" + data.transdescription + "']").length) {
2268                    $('#'+parentform.attr('id')+' #transdescription').val(data.transdescription).trigger('change');
2269                } else { 
2270                    // Create a DOM Option and pre-select by default
2271                    var newOption = new Option(data.transdescription, data.transdescription, true, true);
2272                    // Append it to the select
2273                    $('#'+parentform.attr('id')+' #transdescription').append(newOption).trigger('change');
2274                }
2275            }
2276            if(!isEmpty(data.alias) && data.alias){
2277                $('#'+parentform.attr('id')+' #alias').val(data.alias);
2278            }
2279            if(!isEmpty(data.label) && data.label){
2280                $('#'+parentform.attr('id')+' #label').val(data.label);
2281            }
2282        }
2283    }
2284    return data.text;
2285}
2286function formatSelect2services(state){
2287    if (!state.id) {
2288      return state.text;
2289    }
2290    
2291    let subtext = '';
2292    let minutesplanted = '';
2293    let servicecatalog = '';
2294
2295    //let subtext = [state.type,state.servicecatalog].filter(Boolean).join(" | ");
2296    if(state.minutesplanted && state.minutesplanted!=0){
2297        minutesplanted = '<span class="uk-label fesult-background-lightblue uk-margin-small-right fesult-text-default">'+state.minutesplanted+'min</span>';
2298    }
2299    if(state.servicecatalog){
2300        servicecatalog = '<span class="uk-label fesult-background-lightblue uk-margin-small-right fesult-text-default">'+state.servicecatalog+'</span>';
2301    }
2302    if(state.type && state.type!=state.servicecatalog){
2303        subtext = '<div class="uk-grid uk-grid-small text-xs"><div class="uk-width-expand">'+minutesplanted+servicecatalog+'</div><div class="uk-width-auto">('+state.type+')</div></div>';
2304    } else {
2305        subtext = '<span class="text-xs">'+minutesplanted+servicecatalog+'</span>';
2306    }
2307
2308    return $('<span class="text-sm">'+state.text+'<br>'+subtext+'</span>');
2309};
2310function formatSelect2qualificationgfs(state){
2311    if (!state.id) {
2312      return state.text;
2313    }
2314    
2315    let subtext = '';
2316    let minutesplanted = '';
2317    let servicecatalog = '';
2318
2319    //let subtext = [state.type,state.servicecatalog].filter(Boolean).join(" | ");
2320    if(state.minutesplanted && state.minutesplanted!=0){
2321        minutesplanted = '<span class="uk-label fesult-background-lightblue uk-margin-small-right fesult-text-default">'+state.minutesplanted+'min</span>';
2322    }
2323    if(state.servicecatalog){
2324        servicecatalog = '<span class="uk-label fesult-background-lightblue uk-margin-small-right fesult-text-default">'+state.servicecatalog+'</span>';
2325    }
2326    if(state.type && state.type!=state.servicecatalog){
2327        subtext = '<div class="uk-grid uk-grid-small text-xs"><div class="uk-width-expand">'+minutesplanted+servicecatalog+'</div><div class="uk-width-auto">('+state.type+')</div></div>';
2328    } else {
2329        subtext = '<span class="text-xs">'+minutesplanted+servicecatalog+'</span>';
2330    }
2331
2332    return $('<span class="text-sm">'+state.text+'<br>'+subtext+'</span>');
2333};
2334function formatSelect2qualificationzwb(state){
2335    if (!state.id) {
2336      return state.text;
2337    }
2338    
2339    let subtext = '';
2340    let minutesplanted = '';
2341    let servicecatalog = '';
2342
2343    //let subtext = [state.type,state.servicecatalog].filter(Boolean).join(" | ");
2344    if(state.minutesplanted && state.minutesplanted!=0){
2345        minutesplanted = '<span class="uk-label fesult-background-lightblue uk-margin-small-right fesult-text-default">'+state.minutesplanted+'min</span>';
2346    }
2347    if(state.servicecatalog){
2348        servicecatalog = '<span class="uk-label fesult-background-lightblue uk-margin-small-right fesult-text-default">'+state.servicecatalog+'</span>';
2349    }
2350    if(state.type && state.type!=state.servicecatalog){
2351        subtext = '<div class="uk-grid uk-grid-small text-xs"><div class="uk-width-expand">'+minutesplanted+servicecatalog+'</div><div class="uk-width-auto">('+state.type+')</div></div>';
2352    } else {
2353        subtext = '<span class="text-xs">'+minutesplanted+servicecatalog+'</span>';
2354    }
2355
2356    return $('<span class="text-sm">'+state.text+'<br>'+subtext+'</span>');
2357};
2358function formatSelect2Trans(state){
2359    if (!state.id) {
2360      return state.text;
2361    }
2362    let trans = '<span class="text-sm">'+state.text;
2363    
2364    if(state.subtext && state.subtext.length>0){
2365        trans = trans+'<br><span class="text-xs itext-muted">'+state.subtext+'</span>';
2366    }
2367    
2368    trans = trans+'</span>';
2369
2370    var $result = $(trans);
2371    return $result;
2372};
2373function formatSelect2adminconnectorfields(state){
2374    if (!state.id) {
2375      return state.text;
2376    }
2377    
2378    //let connectorname = '';
2379    let modellabel = '';
2380
2381    //if(state.aliasname){
2382    //    connectorname = state.aliasname;
2383    //} else {
2384    //    connectorname = state.classname;
2385    //}
2386    //let subtext = [connectorname].filter(Boolean).join(" | ");
2387    
2388    if(!isEmpty(state.model)){
2389        modellabel = '<span class="uk-label text-center uk-margin-small-right fesult-background-stripe-4 text-xs">
2389'+state.model+'</span>';
2390    }
2391
2392    var $result = $('<span class="text-sm">'+state.text+'<br>'+modellabel+'</span>');
2393    return $result;
2394};
2395function formatSelect2adminconnectortables(state){
2396    if (!state.id) {
2397      return state.text;
2398    }
2399    
2400    let connectorname = '';
2401    let connectorlabel = '';
2402
2403    if(state.aliasname){
2404        connectorname = state.aliasname;
2405    } else {
2406        connectorname = state.classname;
2407    }
2408    let subtext = [connectorname].filter(Boolean).join(" | ");
2409    
2410    if(state.admin == 1 || state.admin == '1'){
2411        connectorlabel = '<span class="uk-label uk-width-xsmall text-center uk-margin-small-right fesult-background-stripe-4">Admin</span>';
2412    } else {
2413        connectorlabel = '<span class="uk-label uk-width-xsmall text-center uk-margin-small-right fesult-background-bluegrey">User</span>';
2414    }
2415
2416    var $result = $('<span class="text-xs">'+state.fullpath+'<br>'+connectorlabel+'<span class="text-xs itext-muted">'+subtext+'</span></span>');
2417    return $result;
2418};
2419function formatSelect2qscheckconnectorfields(state){
2420    if (!state.id) {
2421      return state.text;
2422    }
2423    
2424    let modellabel = '<span class="uk-label uk-width-small text-center uk-margin-small-right fesult-background-bluegrey">'+state.model+'</span>';
2425
2426    var $result = $('<span class="text-sm">'+state.text+'<br>'+modellabel+'</span>');
2427    return $result;
2428};
2429function formatSelect2adminconnectormodel(state){
2430    if (!state.id) {
2431      return state.text;
2432    }
2433    
2434    let connectorname = '';
2435
2436    if(state.aliasname){
2437        connectorname = state.classname + ' (' + state.aliasname + ')';
2438    } else {
2439        connectorname = state.classname;
2440    }
2441    
2442    let connectorlabel = '<span class="uk-label uk-width-xsmall text-center uk-margin-small-right fesult-background-bluegrey">'+state.context+'</span>';
2443
2444    var $result = $(connectorlabel+'<span class="text-sm itext-muted">'+connectorname+'</span></span>');
2445    return $result;
2446};
2447function formatSelect2adminconnectorsave(state){
2448    if (!state.id) {
2449      return state.text;
2450    }
2451    
2452    let connectorname = '';
2453    let connectorlabel = '';
2454
2455    if(state.aliasname){
2456        connectorname = state.aliasname;
2457    } else {
2458        connectorname = state.classname;
2459    }
2460    let subtext = [connectorname].filter(Boolean).join(" | ");
2461    
2462    if(state.admin == 1 || state.admin == '1'){
2463        connectorlabel = '<span class="uk-label uk-width-xsmall text-center uk-margin-small-right fesult-background-stripe-4">Admin</span>';
2464    } else {
2465        connectorlabel = '<span class="uk-label uk-width-xsmall text-center uk-margin-small-right fesult-background-bluegrey">User</span>';
2466    }
2467
2468    var $result = $('<span class="text-xs">'+state.fullpath+'<br>'+connectorlabel+'<span class="text-xs itext-muted">'+subtext+'</span></span>');
2469    return $result;
2470};
2471function formatSelect2adminconnectoractions(state){
2472    if (!state.id) {
2473      return state.text;
2474    }
2475    
2476    let connectorname = '';
2477    let connectorlabel = '';
2478
2479    if(state.aliasname){
2480        connectorname = state.aliasname;
2481    } else {
2482        connectorname = state.classname;
2483    }
2484    let subtext = [connectorname].filter(Boolean).join(" | ");
2485    
2486    if(state.admin == 1 || state.admin == '1'){
2487        connectorlabel = '<span class="uk-label uk-width-xsmall text-center uk-margin-small-right fesult-background-stripe-4">Admin</span>';
2488    } else {
2489        connectorlabel = '<span class="uk-label uk-width-xsmall text-center uk-margin-small-right fesult-background-bluegrey">User</span>';
2490    }
2491
2492    var $result = $('<span class="text-xs">'+state.fullpath+'<br>'+connectorlabel+'<span class="text-xs itext-muted">'+subtext+'</span></span>');
2493    return $result;
2494};
2495function formatSelect2Gebueh(state){
2496    if (!state.id) {
2497      return state.text;
2498    }
2499
2500    let subtext = [state.ziffer, state.preisFormated].filter(Boolean).join(" | ");
2501
2502    var $result = $('<span class="text-sm">'+state.text+'<br><span class="text-xs itext-muted">'+subtext+'</span></span>');
2503    return $result;
2504};
2505function formatSelect2Rooms(state){
2506    if (!state.id) {
2507      return state.text;
2508    }
2509    
2510    let subtext = [state.station].filter(Boolean).join(" | ");
2511    let marks = state.marks ?? null;
2512
2513    var $result = $(
2514        '<div class="uk-grid uk-grid-small clearfix">' +
2515            '<div class="uk-width-1-1 text-sm">' + state.text + '</div>' +
2516            '<div class="uk-width-expand text-xs itext-muted">' + subtext + '</div>' +
2517            '<div class="uk-width-auto text-xs itext-muted">' + marks + '</div>' +
2518        '</div>'
2519    );
2520    return $result;
2521};
2522function formatSelect2Eventtypes(state){
2523    if (!state.id){
2524      return state.text;
2525    }
2526    
2527    let subtext = [state.station].filter(Boolean).join(" | ");
2528
2529    let icon = '<span class="fa-stack">'+
2530        '<i class="fas fa-square fa-stack-2x fesult-eventcolor_'+state.colorclass+'"></i>'+
2531        '<i class="'+state.icon+' fa-stack-1x fesult-text-white"></i>'+
2532    '</span>';
2533    
2534    let schedulegroup = '';
2535    if(state.schedulegroup=='1'){
2536        schedulegroup = ' <span class="itext-muted">(Termingruppe)</span>';
2537    }
2538    
2539    var $result = $('<span class="text-sm">'+icon+state.text+schedulegroup+'<br><span class="text-xs itext-muted">'+subtext+'</span></span>');
2540    return $result;
2541};
2542function formatSelect2HapiDepartment(state){
2543    if (!state.id) {
2544      return state.text;
2545    }
2546    
2547    let subtext = ['Code: '+state.code].filter(Boolean).join(" | ");
2548
2549    var $result = $('<span class="text-sm">'+state.text+'<br><span class="text-xs itext-muted">'+subtext+'</span></span>');
2550    return $result;
2551};
2552function formatSelect2HapiDepartmentsOutpatient(state){
2553    if (!state.id) {
2554      return state.text;
2555    }
2556    
2557    let subtext = ['Code: '+state.code].filter(Boolean).join(" | ");
2558
2559    var $result = $('<span class="text-sm">'+state.text+'<br><span class="text-xs itext-muted">'+subtext+'</span></span>');
2560    return $result;
2561};
2562function formatSelect2HapiHospital(state){
2563    if (!state.id) {
2564      return state.text;
2565    }
2566    
2567    let subtext = [state.iknumber, state.locationnumber].filter(
2567Boolean).join(" | ");
2568
2569    var $result = $('<span class="text-sm">'+state.text+'<br><span class="text-xs itext-muted">'+subtext+'</span></span>');
2570    return $result;
2571};
2572
2573function formatSelect2serviceeventtypes(state) {
2574    if (!state.id) {
2575        return state.text;
2576    }
2577
2578    const icon = state.schedulegroup === 1 
2579        ? '<i class="fas fa-users fa-fw"></i> ' 
2580        : '<i class="fas fa-user fa-fw"></i> ';
2581
2582    const duration = state.durationPlannedMin >= 1 
2583        ? ` <span class="itext-muted">(Termindauer ${state.durationPlannedMin} min)</span>` 
2584        : '';
2585
2586    return $(`<span class="text-sm"><span class="itext-muted">${icon}</span>${state.text}${duration}</span>`);
2587}
2588function setterSelect2Main (data, container){
2589    if(data && data.meta){
2590        if(data.meta.setter){
2591            if(data.meta.setter=='submit'){
2592                container.parents('form:first').submit();
2593            } else if(data.meta.setter=='follow'){
2594                if(!isEmpty(data.link)){
2595                    window.location.href = data.link;
2596                }
2597            }
2598        }
2599    }
2600}
2601function setterSelect2knowledgebasefollow (data, container){
2602    if(!isEmpty(data.link)){
2603        window.location.href = data.link;
2604    }
2605}
2606function setterSelect2serviceeventtypesGroup (data, container){
2607    if (!FESULTscheduler.session.currentevent.schedulegroup_settings) {
2608        FESULTscheduler.session.currentevent.schedulegroup_settings = {};
2609    }
2610
2611    if(data){
2612        FESULTscheduler.session.currentevent.schedulegroup_settings.name = data.text;
2613        FESULTscheduler.session.currentevent.schedulegroup_settings.maxParticipant = data.maxParticipant;
2614
2615        FESULTscheduler.session.currentevent.serviceGroupID = data.id;
2616        FESULTscheduler.session.currentevent.serviceID = 0;
2617        FESULTscheduler.session.currentevent.roomID = data.roomID;
2618    }
2619    
2620    $("#modal-scheduler-lightbox .elm-title").html(data.text);
2621    
2622    let parentform = $(container).closest("form");
2623    if(parentform.length!=0){
2624        if(!isEmpty(parentform.attr('id'))){
2625            if(!isEmpty(data.meta) && data.meta.serversidedata){
2626                if(data.durationPlannedMin>=1){
2627                    $('#'+parentform.attr('id')+' #duration').val(data.durationPlannedMin);
2628                    FESULTscheduler.helper.addminutetotime('#'+parentform.attr('id')+' #start_date_time', '#'+parentform.attr('id')+' #end_date_time', data.durationPlannedMin);
2629                }
2630                if(!isEmpty(data.room)){
2631                    FESULTscheduler.helper.addroom(data.room, data.roomID, '#'+parentform.attr('id')+' #roomID');
2632                } else {
2633                    $('#'+parentform.attr('id')+' #roomID').val(null).trigger('change');
2634                }
2635                if(data.bookingEvent==1){
2636                    $('#'+parentform.attr('id')+' #bookingEvent').prop('checked', true);
2637                    FESULTscheduler.lightbox.functions.setbookingEvent(1);
2638                } else {
2639                    $('#'+parentform.attr('id')+' #bookingEvent').prop('checked', false);
2640                    FESULTscheduler.lightbox.functions.setbookingEvent(0);
2641                }
2642            }
2643        }
2644    }
2645    return data.text;
2646}
2647function setterSelect2serviceeventtypes (data, container){
2648    
2649    if (!FESULTscheduler.session.currentevent.schedulegroup_settings) {
2650        FESULTscheduler.session.currentevent.schedulegroup_settings = {};
2651    }
2652
2653    if(data){
2654        FESULTscheduler.session.currentevent.serviceID = data.id;
2655        FESULTscheduler.session.currentevent.serviceGroupID = 0;
2656    }
2657    $("#modal-scheduler-lightbox .elm-title").html(data.text);
2658    
2659    let parentform = $(container).closest("form");
2660    if(parentform.length!=0){
2661        if(!isEmpty(parentform.attr('id'))){
2662            if(!isEmpty(data.meta) && data.meta.serversidedata){
2663                if(data.durationPlannedMin>=1){
2664                    $('#'+parentform.attr('id')+' #duration').val(data.durationPlannedMin).change();
2665                    FESULTscheduler.helper.addminutetotime('#'+parentform.attr('id')+' #start_date_time', '#'+parentform.attr('id')+' #end_date_time', data.durationPlannedMin);
2666                }
2667                if(!isEmpty(data.room)){
2668                    FESULTscheduler.helper.addroom(data.room, data.roomID, '#'+parentform.attr('id')+' #roomID');
2669                } else {
2670                    $('#'+parentform.attr('id')+' #roomID').val(null).trigger('change');
2671                }
2672                var participants = Object.values(FESULTscheduler.session.currentevent.participants);
2673
2674if (participants.length === 0 || !participants.some(participant => participant.role === 'patient')) {
2675    if (data.bookingEvent == 1) {
2676        $('#' + parentform.attr('id') + ' #bookingEvent').prop('checked', true);
2677        FESULTscheduler.lightbox.functions.setbookingEvent(1);
2678    } else {
2679        $('#' + parentform.attr('id') + ' #bookingEvent').prop('checked', false);
2680        FESULTscheduler.lightbox.functions.setbookingEvent(0);
2681    }
2682}
2683
2684            }
2685        }
2686    }
2687    return data.text;
2688}
2689function setterSelectPatientbt (data, container){
2690    
2691    if(data && data.id){
2692        FESULTbluetoothVital.session.hospitalcaseid = data.id;
2693        FESULTbluetoothVital.functions.log('Behandlungsfall ausgewählt.');
2694        
2695        $("#btpatientwrapper").empty();
2696        $("#btpatientwrapper").html('<span class="uk-text-primary">' + data.genderIcon + ' ' + data.firstname + ' ' + data.lastname + '</span>');
2697    }
2698    
2699    return data.text;
2700}
2701function setterSelectPatienttoevent (data, container){
2702    console.log(data.data);
2703    if(data && data.data && data.data.person && data.data.person.idPerson){
2704
2705        let plannedservices = {};
2706        if(FESULTscheduler.session.currentevent.plannedservices && !isEmpty(FESULTscheduler.session.currentevent.plannedservices)){
2707            plannedservices = FESULTscheduler.session.currentevent.plannedservices;
2708            /*$.each(FESULTscheduler.session.currentevent.plannedservices, function( key, value ){
2709                if(!isEmpty(value)){
2710                    plannedservices[value.idServices] = value;
2711                }
2712            });*/
2713        }
2714        console.log({
2715            id: data.data.person.idPerson,
2716            name: data.data.person.firstname + ' ' + data.data.person.lastname,
2717            email: data.data.person.email,
2718            role: 'patient',
2719            status:'',
2720            notified:'',
2721            duration: FESULTscheduler.session.currentevent.duration,
2722            plannedservices: plannedservices,
2723            person:{
2724                idPerson: data.data.person.idPerson,
2725                firstname: data.data.person.firstname,
2726                lastname: data.data.person.lastname,
2727                email: data.data.person.email,
2728                internalID: data.data.internalID
2729            }
2730        });
2731        FESULTscheduler.session.currentevent.participants[data.data.person.idPerson] = {
2732            id: data.data.person.idPerson,
2733            name: data.data.person.firstname + ' ' + data.data.person.lastname,
2734            email: data.data.person.email,
2735            role: 'patient',
2736            status:'',
2737            notified:'',
2738            duration: FESULTscheduler.session.currentevent.duration,
2739            plannedservices: plannedservices,
2740            person:{
2741                idPerson: data.data.person.idPerson,
2742                firstname: data.data.person.firstname,
2743                lastname: data.data.person.lastname,
2744                email: data.data.person.email,
2745                internalID: data.data.internalID
2746            }
2747        };
2748        //console.warn(FESULTscheduler.session.currentevent.participants[data.data.person.personID]);
2749
2750        FESULTscheduler.lightbox.functions.setbookingEvent(0);
2751
2752        FESULTscheduler.lightbox.build();
2753    }
2754    return data.data.person.firstname + ' ' + data.data.person.lastname;
2755}
2756function setterSelectPersontoevent(data, container){
2757
2758    if(data && !isEmpty(data.id)){
2759        FESULTscheduler.session.currentevent.participants[data.id] = {
2760            id: data.id,
2761            name: data.text,
2762            email: data.email,
2763            role: 'participant',
2764            status:'',
2765            notified:'',
2766            plannedservices: {},
2767            person:{
2768                idPerson: data.id,
2769                firstname: data.firstname,
2770                lastname: data.lastname,
2771                email: data.email
2772            }
2773        };
2774        FESULTscheduler.session.currentevent.participants[data.id].checkconflict = FESULTscheduler.lightbox.functions.checkconflict(
2775            data.id,
2776            FESULTscheduler.session.currentevent.id,
2777            FESULTscheduler.session.currentevent.start_date_date+' '+FESULTscheduler.session.currentevent.start_date_time,
2778            FESULTscheduler.session.currentevent.end_date_date+' '+FESULTscheduler.session.currentevent.end_date_time
2779        );
2780        FESULTscheduler.lightbox.build();
2781    }
2782
2783    return data.text;
2784}
2785/*function setterSelectEmployeestoevent (data, container){
2786    
2787    if(data && data.person && !isEmpty(data.person.idPerson)){
2788
2789        FESULTscheduler.session.currentevent.participants[data.person.idPerson] = {
2790            id: data.person.idPerson,
2791            name: data.text,
2792            email: data.person.email,
2793            role: 'treatingperson',
2794            status:'',
2795            notified:'',
2796            plannedservices: {},
2797            person:{
2798                idPerson: data.person.idPerson,
2799                firstname: data.person.firstname,
2800                lastname: data.person.lastname,
2801                email: data.person.email
2802            }
2803        };
2804        FESULTscheduler.lightbox.build();
2805    }
2806    return data.text;
2807}*/
2808function setterSelectEmployeestoevent(data, container)
2809{
2810    if (!data || typeof data !== 'object') {
2811        return '';
2812    }
2813
2814    var idPerson = String(data.personid || '').trim();
2815    if (!idPerson) {
2816        return '';
2817    }
2818
2819    var label = String(data.value || '').trim();
2820
2821    var firstname = '';
2822    var lastname = '';
2823    if (!isEmpty(data.firstname) || !isEmpty(data.lastname)) {
2824        firstname = String(data.firstname || '').trim();
2825        lastname = String(data.lastname || '').trim();
2826    } else if (label) {
2827        var parts = label.split(/\s+/).filter(Boolean);
2828        if (parts.length === 1) {
2829            firstname = parts[0];
2830        } else if (parts.length > 1) {
2831            lastname = parts.pop();
2832            firstname = parts.join(' ');
2833        }
2834    }
2835
2836    var email = String(data.email || '').trim();
2837
2838    FESULTscheduler.session.currentevent.participants[idPerson] = {
2839        id: idPerson,
2840        name: label,
2841        email: email,
2842        role: 'treatingperson',
2843        status: '',
2844        notified: '',
2845        plannedservices: {},
2846        person: {
2847            idPerson: idPerson,
2848            firstname: firstname,
2849            lastname: lastname,
2850            email: email
2851        }
2852    };
2853
2854    FESULTscheduler.lightbox.build();
2855
2856    return label;
2857}
2858function setterSelect2costcentres (data, container){
2859    
2860    return data.text;
2861}
2862function setterSelectSymptoms (data, container){
2863
2864    //select2-clearafter
2865    let parentform = $(container).closest("form");
2866    if(parentform.length!=0){
2867        if(!isEmpty(parentform.attr('id'))){
2868            
2869            /*if(data.text){
2870                $('#'+parentform.attr('id')+' #description').val(data.text);
2871            }
2872            if(data.text){
2873                $('#'+parentform.attr('id')+' #description').val(data.text);
2874            }*/
2875            if(data.snomedcode){
2876                $('#'+parentform.attr('id')+' #snomedcode').val(data.snomedcode);
2877            } else {
2878                $('#'+parentform.attr('id')+' #snomedcode').val('');
2879            }
2880            if(data.loinccode){
2881                $('#'+parentform.attr('id')+' #loinccode').val(data.loinccode);
2882            } else {
2883                $('#'+parentform.attr('id')+' #loinccode').val('');
2884            }
2885        }
2886    }
2887    return '';
2888}
2889function setterSelect2HospitalClearafter (data, container){
2890
2891    //select2-clearafter
2892    let parentform = $(container).closest("form");
2893    if(parentform.length!=0){
2894        if(!isEmpty(parentform.attr('id'))){
2895            
2896            if(data.text){
2897            $('#'+parentform.attr('id')+' #institution').val(data.text);
2898            }
2899            if(data.iknumber){
2900                $('#'+parentform.attr('id')+' #iknumber').val(data.iknumber);
2901            }
2902            if(data.locationnumber){
2903                $('#'+parentform.attr('id')+' #locationnumber').val(data.locationnumber);
2904            }
2905            if(data.adddatahtml){
2906                $('#'+parentform.attr('id')+' #elm_adddata').html(data.adddatahtml);
2907            } else {
2908                $('#'+parentform.attr('id')+' #elm_adddata').empty();
2909            }
2910        }
2911    }
2912    return '';
2913}
2914function formatSelect2Allergyintolerance(state){
2915    if (!state.id) {
2916      return state.text;
2917    }
2918
2919    var $result = $('<span class="text-sm">'+state.text+'</span>');
2920    return $result;
2921};
2922function setterSelect2Allergyintolerance (data, container){
2923
2924    let parentform = $(container).closest("form");
2925    if(parentform.length!=0 && !isEmpty(data.text)){
2926        if(!isEmpty(parentform.attr('id'))){
2927            if(!isEmpty(data.code)){
2928                $('#'+parentform.attr('id')+' #code').val(data.code);
2929            }
2930            if(!isEmpty(data.text)){
2931                $('#'+parentform.attr('id')+' #description').val(data.text);
2932            }
2933        }
2934    }
2935    return data.text;
2936}
2937function formatSelect2Icd10(state){
2938    if (!state.id) {
2939      return state.text;
2940    }
2941    
2942    let label = '';
2943    
2944    if(!state.version_current){
2945        label = '<span class="uk-label uk-margin-small-right">'+state.version+'</span>';
2946    }
2947
2948    var $result = $('<span class="text-sm">'+label+state.full+'</span>');
2949    return $result;
2950};
2951function setterSelect2Icd10 (data, container){
2952
2953    let parentform = $(container).closest("form");
2954    if(parentform.length!=0 && !isEmpty(data.text)){
2955        if(!isEmpty(parentform.attr('id'))){
2956            if(!isEmpty(data.code)){
2957                $('#'+parentform.attr('id')+' #code').val(data.code);
2958            }
2959            if(!isEmpty(data.text) && data.serverside==true){
2960                $('#'+parentform.attr('id')+' #designation').val(data.text);
2961            }
2962            /*if(!isEmpty(data.id) && data.text){
2963                $('#'+parentform.attr('id')+' #codeID').val(null).trigger('change');
2964
2965                if ($('#'+parentform.attr('id')+' #codeID').find("option[value='" + data.id + "']").length) {
2966                    $('#'+parentform.attr('id')+' #codeID').val(data.id).trigger('change');
2967                } else { 
2968                    var newOption = new Option(data.text, data.id, true, true);
2969                    $('#'+parentform.attr('id')+' #codeID').append(newOption).trigger('change');
2970                }
2971            }*/
2972            if(data.infectious){
2973                $('#'+parentform.attr('id')+' #elm_msgInfectious').show();
2974            } else {
2975                $('#'+parentform.attr('id')+' #elm_msgInfectious').hide();
2976            }
2977            if(data.ebmlabor){
2978                $('#'+parentform.attr('id')+' #elm_msgEBMLabor').show();
2979            } else {
2980                $('#'+parentform.attr('id')+' #elm_msgEBMLabor').hide();
2981            }
2982            
2983            $('#'+parentform.attr('id')+' #elm_reason').hide();
2984            if(data.checkSex==false){
2985                $('#'+parentform.attr('id')+' #elm_msgSex').show();
2986                $('#'+parentform.attr('id')+' #elm_reason').show();
2987            } else {
2988                $('#'+parentform.attr('id')+' #elm_msgSex').hide();
2989            }
2990            if(data.checkAge==false){
2991                $('#'+parentform.attr('id')+' #elm_msgAge').show();
2992                $('#'+parentform.attr('id')+' #elm_reason').show();
2993            } else {
2994                $('#'+parentform.attr('id')+' #elm_msgAge').hide();
2995            }
2996            if(!isEmpty(data.inkl)){
2997                $('#'+parentform.attr('id')+' #elm_dimdidata_inkl').show();
2998                $('#'+parentform.attr('id')+' #elm_dimdidata_inkl_content').html(data.inkl);
2999                $('#'+parentform.attr('id')+' #elm_dimdi').show();
3000            } else {
3001                $('#'+parentform.attr('id')+' #elm_dimdidata_inkl').hide();
3002                $('#'+parentform.attr('id')+' #elm_dimdidata_inkl_content').html('');
3003            }
3004            if(!isEmpty(data.exkl)){
3005                $('#'+parentform.attr('id')+' #elm_dimdidata_exkl').show();
3006                $('#'+parentform.attr('id')+' #elm_dimdidata_exkl_content').html(data.exkl);
3007                $('#'+parentform.attr('id')+' #elm_dimdi').show();
3008            } else {
3009                $('#'+parentform.attr('id')+' #elm_dimdidata_exkl').hide();
3010                $('#'+parentform.attr('id')+' #elm_dimdidata_exkl_content').html('');
3011            }
3012            if(!isEmpty(data.note)){
3013                $('#'+parentform.attr('id')+' #elm_dimdidata_note').show();
3014                $('#'+parentform.attr('id')+' #elm_dimdidata_note_content').html(data.note);
3015                $('#'+parentform.attr('id')+' #elm_dimdi').show();
3016            } else {
3017                $('#'+parentform.attr('id')+' #elm_dimdidata_note').hide();
3018                $('#'+parentform.attr('id')+' #elm_dimdidata_note_content').html('');
3019            }
3020            if(!isEmpty(data.intro)){
3021                $('#'+parentform.attr('id')+' #elm_dimdidata_intro').show();
3022                $('#'+parentform.attr('id')+' #elm_dimdidata_intro_content').html(data.intro);
3023                $('#'+parentform.attr('id')+' #elm_dimdi').show();
3024            } else {
3025                $('#'+parentform.attr('id')+' #elm_dimdidata_intro').hide();
3026                $('#'+parentform.attr('id')+' #elm_dimdidata_intro_content').html('');
3027            }
3028        }
3029    }
3030    return data.text;
3031}
3032function setterSelect2Icd10Code (data, container){
3033    return data.code;
3034}
3035function setterSelect2HapiDepartmentCode (data, container){
3036    return data.code;
3037}
3038function formatSelect2Ops(state){
3039    if (!state.id) {
3040      return state.text;
3041    }
3042    
3043    let label = '';
3044    
3045    if(!state.version_current){
3046        label = '<span class="uk-label uk-margin-small-right">'+state.version+'</span>';
3047    }
3048
3049    var $result = $('<span class="text-sm">'+label+state.full+'</span>');
3050    return $result;
3051};
3052function setterSelect2Ops (data, container){
3053
3054    let parentform = $(container).closest("form");
3055    if(parentform.length!=0 && !isEmpty(data.text)){
3056        if(!isEmpty(parentform.attr('id'))){
3057            if(!isEmpty(data.code)){
3058                $('#'+parentform.attr('id')+' #code').val(data.code);
3059            }
3060            if(!isEmpty(data.text) && data.serverside==true){
3061                $('#'+parentform.attr('id')+' #designation').val(data.text);
3062            }
3063            /*if(!isEmpty(data.id) && data.text){
3064                $('#'+parentform.attr('id')+' #codeID').val(null).trigger('change');
3065
3066                if ($('#'+parentform.attr('id')+' #codeID').find("option[value='" + data.id + "']").length) {
3067                    $('#'+parentform.attr('id')+' #codeID').val(data.id).trigger('change');
3068                } else { 
3069                    var newOption = new Option(data.text, data.id, true, true);
3070                    $('#'+parentform.attr('id')+' #codeID').append(newOption).trigger('change');
3071                }
3072            }*/
3073            /*if(data.infectious){
3074                $('#'+parentform.attr('id')+' #elm_msgInfectious').show();
3075            } else {
3076                $('#'+parentform.attr('id')+' #elm_msgInfectious').hide();
3077            }
3078            if(data.ebmlabor){
3079                $('#'+parentform.attr('id')+' #elm_msgEBMLabor').show();
3080            } else {
3081                $('#'+parentform.attr('id')+' #elm_msgEBMLabor').hide();
3082            }*/
3083            
3084            //$('#'+parentform.attr('id')+' #elm_reason').hide();
3085            /*if(data.checkSex==false){
3086                $('#'+parentform.attr('id')+' #elm_msgSex').show();
3087                $('#'+parentform.attr('id')+' #elm_reason').show();
3088            } else {
3089                $('#'+parentform.attr('id')+' #elm_msgSex').hide();
3090            }
3091            if(data.checkAge==false){
3092                $('#'+parentform.attr('id')+' #elm_msgAge').show();
3093                $('#'+parentform.attr('id')+' #elm_reason').show();
3094            } else {
3095                $('#'+parentform.attr('id')+' #elm_msgAge').hide();
3096            }*/
3097            /*if(!isEmpty(data.inkl)){
3098                $('#'+parentform.attr('id')+' #elm_dimdidata_inkl').show();
3099                $('#'+parentform.attr('id')+' #elm_dimdidata_inkl_content').html(data.inkl);
3100                $('#'+parentform.attr('id')+' #elm_dimdi').show();
3101            } else {
3102                $('#'+parentform.attr('id')+' #elm_dimdidata_inkl').hide();
3103                $('#'+parentform.attr('id')+' #elm_dimdidata_inkl_content').html('');
3104            }
3105            if(!isEmpty(data.exkl)){
3106                $('#'+parentform.attr('id')+' #elm_dimdidata_exkl').show();
3107                $('#'+parentform.attr('id')+' #elm_dimdidata_exkl_content').html(data.exkl);
3108                $('#'+parentform.attr('id')+' #elm_dimdi').show();
3109            } else {
3110                $('#'+parentform.attr('id')+' #elm_dimdidata_exkl').hide();
3111                $('#'+parentform.attr('id')+' #elm_dimdidata_exkl_content').html('');
3112            }
3113            if(!isEmpty(data.note)){
3114                $('#'+parentform.attr('id')+' #elm_dimdidata_note').show();
3115                $('#'+parentform.attr('id')+' #elm_dimdidata_note_content').html(data.note);
3116                $('#'+parentform.attr('id')+' #elm_dimdi').show();
3117            } else {
3118                $('#'+parentform.attr('id')+' #elm_dimdidata_note').hide();
3119                $('#'+parentform.attr('id')+' #elm_dimdidata_note_content').html('');
3120            }
3121            if(!isEmpty(data.intro)){
3122                $('#'+parentform.attr('id')+' #elm_dimdidata_intro').show();
3123                $('#'+parentform.attr('id')+' #elm_dimdidata_intro_content').html(data.intro);
3124                $('#'+parentform.attr('id')+' #elm_dimdi').show();
3125            } else {
3126                $('#'+parentform.attr('id')+' #elm_dimdidata_intro').hide();
3127                $('#'+parentform.attr('id')+' #elm_dimdidata_intro_content').html('');
3128            }*/
3129        }
3130    }
3131    return data.text;
3132}
3133function setterSelect2OpsCode (data, container){
3134    return data.code;
3135}
3136function formatSelect2Goae(state){
3137    if (!state.id) {
3138      return state.text;
3139    }
3140    
3141    let segments = [state.points, state.factor, state.preisFormated].filter(
3141Boolean);
3142    let segmentsLabel = segments.map(segment => `<span class="uk-label fesult-background-bluegrey">${segment}</span>`);
3143
3144    let subtext = segmentsLabel.join(" ");
3145
3146    var $result = $('<span class="text-sm"><b>'+state.code+'</b> - '+state.text+'<br><span class="text-xs itext-muted">'+subtext+'</span></span>');
3147    return $result;
3148};
3149function setterSelect2 (data, container){
3150    return data.text;
3151 }
3152function setterSelect2Article (data, container) {
3153    let parentform = $(container).closest("form");
3154    if(parentform.length!=0){
3155        if(!isEmpty(parentform.attr('id'))){
3156            getFormValues(
3157                parentform.attr('id'),
3158                {
3159                    valid: true,
3160                    form: {
3161                        elements: {
3162                            netamount: data.preis,
3163                            description: data.text,
3164                            taxrate: data.steuern,
3165                            bookkeepingaccount: data.konto
3166                        }
3167                    }
3168                }
3169            );
3170        }
3171    }
3172    return data.text;
3173 }
3174function setterSelect2Todolist (data, container) {
3175//    FESULTkit.request.simplepost({'formurl':'ghfghfg', 'query':'id='+data.id});
3176//    var parentform = $(container).closest("form");
3177//    if(parentform.length!=0){
3178//        if(!isEmpty(parentform.attr('id'))){
3179//            getFormValues(
3180//                parentform.attr('id'),
3181//                {
3182//                    valid: true,
3183//                    form: {
3184//                        elements: {
3185//                            netamount: data.preis,
3186//                            description: data.text,
3187//                            taxrate: data.steuern,
3188//                            bookkeepingaccount: data.konto
3189//                        }
3190//                    }
3191//                }
3192//            );
3193//        }
3194//    }
3195//    return data.text;
3196 }
3197$(function (){
3198    /**
3199     * Diese Funktion überwacht Änderungen im DOM, sucht nach <img>-Tags mit der 
3200     * Klasse svg, lädt das zugehörige SVG und ersetzt das <img>-Tag durch das 
3201     * echte SVG-Element, wobei die ursprünglichen Attribute beibehalten werden.
3202     */
3203  var observer = new MutationObserver(function(mutations) {
3204    mutations.forEach(function(mutation) {
3205      $("img.svg").each(function(){
3206        var $img = jQuery(this);
3207        var attributes = $img.prop("attributes");
3208        var imgURL = $img.attr("src");
3209        $.get(imgURL, function (data){
3210          var $svg = $(data).find('svg');
3211          $svg = $svg.removeAttr('xmlns:a');
3212          $.each(attributes, function(){
3213            $svg.attr(this.name, this.value);
3214          });
3215          $img.replaceWith($svg);
3216        });
3217      });
3218    });
3219  });
3220
3221  observer.observe(document.body, { childList: true, subtree: true });
3222//Alte Variante
3223//    $('body').bind('DOMSubtreeModified', function(){
3224//        $("img.svg").each(function (){
3225//        // Perf tip: Cache the image as jQuery object so that we don't use the selector muliple times.
3226//        var $img = jQuery(this);
3227//        // Get all the attributes.
3228//        var attributes = $img.prop("attributes");
3229//        // Get the image's URL.
3230//        var imgURL = $img.attr("src");
3231//        // Fire an AJAX GET request to the URL.
3232//        $.get(imgURL, function (data){
3233//          // The data you get includes the document type definition, which we don't need.
3234//          // We are only interested in the <svg> tag inside that.
3235//          var $svg = $(data).find('svg');
3236//          // Remove any invalid XML tags as per http://validator.w3.org
3237//          $svg = $svg.removeAttr('xmlns:a');
3238//          // Loop through original image's attributes and apply on SVG
3239//          $.each(attributes, function(){
3240//            $svg.attr(this.name, this.value);
3241//          });
3242//          // Replace image with new SVG
3243//          $img.replaceWith($svg);
3244//        });
3245//      });
3246//    });
3247});
3248function $_GET(searchparam){
3249    if (!searchparam || typeof searchparam !== 'string') {
3250      return null; // oder throw new Error("Ungültiger Parameter");
3251    }
3252
3253    const queryString = window.location.search.trim();
3254    if (queryString) {
3255      const urlParams = new URLSearchParams(queryString);
3256
3257      if (urlParams.has(searchparam)) {
3258        return urlParams.get(searchparam).trim();
3259      }
3260    }
3261    return null;
3262}
3263/*function searchWikipedia(lang, search){
3264        
3265    if(!lang){
3266        let lang = 'de';
3267    }
3268
3269    var url = "https://"+lang+".wikipedia.org/w/api.php"; 
3270
3271    var params = {
3272        action: "query",
3273        list: "search",
3274        srsearch: search,
3275        format: "json"
3276    };
3277
3278    url = url + "?origin=*";
3279    Object.keys(params).forEach(function(key){url += "&" + key + "=" + params[key];});
3280
3281    fetch(url)
3282        .then(function(response){return response.json();})
3283        .then(function(response) {
3284            if (response.query.search[0].title === search){
3285                return {
3286                    'pageid': response.query.search[0].pageid,
3287                    'url': "https://de.wikipedia.org/wiki/?curid="+response.query.search[0].pageid
3288                };
3289            }
3290        })
3291        .catch(function(error){console.log(error);});
3292}*/
3293function syntaxHighlightWithoutAnimation(json){
3294    json = json.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
3295    return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) {
3296        var cls = 'number';
3297        if (/^"/.test(match)) {
3298            if (/:$/.test(match)) {
3299                cls = 'key';
3300            } else {
3301                cls = 'string';
3302            }
3303        } else if (/true|false/.test(match)) {
3304            cls = 'boolean';
3305        } else if (/null/.test(match)) {
3306            cls = 'null';
3307        }
3308        return '<span class="' + cls + '">' + match + '</span>';
3309    });
3310}
3311function syntaxHighlight(json){
3312    let obj;
3313    try {
3314        obj = JSON.parse(json);
3315    } catch (e) {
3316        // Fallback, wenn die Eingabe kein gültiges JSON ist
3317        console.error("SyntaxHighlight: Ungültiges JSON", e);
3318        return document.createTextNode("Ungültiges JSON: " + json);
3319    }
3320
3321    // Überprüfe, ob das Ergebnis des Parsens ein Objekt ist, sonst behandele es als einfachen String
3322    if (typeof obj !== 'object' || obj === null) {
3323        const container = document.createElement('div');
3324        const span = document.createElement('span');
3325        span.textContent = json;
3326        span.classList.add('string'); // Verwende die 'string'-Klasse für einfache Strings
3327        container.appendChild(span);
3328        return container;
3329    }
3330
3331    return createCollapsibleHtml(obj, true);
3332}
3333
3334function createCollapsibleHtml(obj, isRoot){
3335    const container = document.createElement('div');
3336    container.style.position = 'relative';
3337
3338    // Füge die öffnenden Klammern am Anfang hinzu, unabhängig davon, ob es das Wurzelelement ist
3339    const openBrace = document.createElement('span');
3340    openBrace.textContent = Array.isArray(obj) ? '[' : '{';
3341    container.appendChild(openBrace);
3342    if (!isRoot) {
3343        container.style.marginLeft = '20px';
3344    }
3345
3346    const entries = Object.entries(obj);
3347    entries.forEach(([key, value], index) => {
3348        const line = document.createElement('div');
3349        const keySpan = document.createElement('span');
3350        keySpan.textContent = `"${key}": `;
3351        keySpan.classList.add('key');
3352        line.appendChild(keySpan);
3353        line.style.marginLeft = '20px';
3354
3355        if (typeof value === 'object' && value !== null){
3356            const isArray = Array.isArray(value);
3357            const button = document.createElement('a');
3358            button.innerHTML = isArray ? '[+]' : '{+}';
3359            const content = createCollapsibleHtml(value, false);
3360            content.style.display = 'none';
3361            button.onclick = () => {
3362                const isHidden = content.style.display === 'none';
3363                content.style.display = isHidden ? 'block' : 'none';
3364                button.innerHTML = isHidden ? (isArray ? '[-]' : '{-}') : (isArray ? '[+]' : '{+}');
3365            };
3366            button.classList.add('jsonparserbutton');
3367            line.appendChild(button);
3368            line.appendChild(content);
3369        } else {
3370            // Anpassung für die Anzeige von primitiven Typen
3371            const valueSpan = document.createElement('span');
3372            valueSpan.innerHTML = JSON.stringify(value);
3373            if (typeof value === 'string') {
3374                valueSpan.classList.add('string');
3375            } else if (typeof value === 'number') {
3376                valueSpan.classList.add('number');
3377            } else if (typeof value === 'boolean') {
3378                valueSpan.classList.add('boolean');
3379            } else if (value === null) {
3380                valueSpan.classList.add('null');
3381            }
3382            line.appendChild(valueSpan);
3383        }
3384        container.appendChild(line);
3385    });
3386
3387    // Füge die schließenden Klammern am Ende hinzu, unabhängig davon, ob es das Wurzelelement ist
3388    const closeBrace = document.createElement('span');
3389    closeBrace.textContent = Array.isArray(obj) ? ']' : '}';
3390    container.appendChild(closeBrace);
3391
3392    return container;
3393}
3394function removeBorderChanged(selector){
3395    $(selector).find('.border-changed').removeClass('border-changed');
3396}                

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.