PageSourceSearch

https://www.versicherung-online.net/assets/addons/cc/script.js?v240228_1

js versicherung-online.net collected 2026-10-02 18:45:33 UTC 47,359 bytes, 982 lines download raw bytes

1
2
3var popoverUserInterface = {
4    config: {
5        minWidth: 992,
6        section: '.popover-inside',
7        parent: '.form-group',
8        selectedClass: 'selected',
9        template: '<div class="popover right in" data-popover-manuel role="tooltip" style="top: -20px; left: 321px; display: block;"><div class="arrow" style="top: 50%;"></div><div class="popover-content">[content]</div></div>'
10    },
11    init: function () {
12        $(this.config.section).on('click', '.form-control,input[type="checkbox"],input[type="radio"]', this, this.eventClick);
13        // $(this.config.section).on('click', '.input-group-addon [data-toggle="popover"]', this, this.eventClickToogle);
14        // this.resize();
15    },
16    eventClickToogle: function (event) {
17        // console.log('eventClickToogle()');
18        if (3 != event.isTrigger) {
19            var config = event.data.config;
20            $(config.section + ' ' + config.parent).removeClass(config.selectedClass);
21        }
22    },
23    eventClick: function (event, p) {
24
25        var self = event.data;
26
27        var parent = $(this).parents(self.config.parent);
28
29        // console.log('eventClick()', parent.hasClass(self.config.selectedClass));
30
31        if (!parent.hasClass(self.config.selectedClass)) {
32
33            event.data.close();
34
35            parent.addClass(self.config.selectedClass);
36
37            if (self.isWidth()) {
38                parent.find('.input-group-addon [data-toggle="popover"]').popover('show');
39            }
40        }
41    },
42    close: function () {
43        // console.log('close()');
44        $(this.config.section + ' ' + this.config.parent).removeClass(this.config.selectedClass);
45        $(this.config.section + ' .input-group-addon [data-toggle="popover"][aria-describedby]').popover('hide');
46    },
47    isWidth: function () {
48        return $(window).width() >= this.config.minWidth;
49    },
50    resize: function () {
51        var timeout;
52        // console.log('resize()');
53        $(window).resize(this, function (event) {
54            $(event.data.config.section + ' [data-toggle="popover"][aria-describedby]').popover('hide');
55            clearTimeout(timeout);
56            if (event.data.isWidth()) {
57                timeout = window.setTimeout(function (self) {
58                    $(self.config.section + ' .form-group.selected .input-group-addon [data-toggle="popover"]').popover('show');
59                }, 500, event.data);
60            }
61        });
62    }
63};
64
65var area_section = {
66    set: function (section) {
67        if ('string' != typeof section) {
68            return;
69        }
70        var hash = section;
71        document.location.hash = hash;
72    }
73};
74
75(function () {
76
77    $(document).ready(function () {
78
79        /**
80         * @see https://stackoverflow.com/questions/37485342/popover-auto-adjust-placement
81         */
82
83        // $(popoverUserInterface.config.section + ' [data-toggle="popover"]').popoverSelf({
84        $(popoverUserInterface.config.section + ' [data-toggle="popover"]').popover({
85            html: true,
86            trigger: 'focus',
87            animation: false,
88            delay: 0,
89            placement: function (context, source) {
90                if ($(window).width() - $(source).offset().left > 300) {
91                    return "right";
92                }
93                return "bottom";
94            },
95            content: function () {
96                return $(this).next('[data-content]').html();
97            }
98        });
99
100
101        popoverUserInterface.init();
102
103        // tarifvergleich
104        $('.popover-default [data-toggle="popover"]').hover(function (event) {
105            if ('mouseenter' == event.type) {
106                if (0 < $('.popover-default [data-toggle="popover"][aria-describedby]').length) {
107                    if ($('.popover-default [data-toggle="popover"][aria-describedby]').attr('aria-describedby') == $(this).attr('aria-describedby')) {
108                        return;
109                    }
110                    $('.popover-default [data-toggle="popover"][aria-describedby]').popover('hide');
111                }
112                $(this).trigger('focus');
113            }
114        });
115
116        var cc = {
117            popoverConfig: {
118                html: true,
119                // trigger: 'focus',
120                trigger: 'hover',
121                animation: false,
122                delay: {
123                    "show": 150,
124                    "hide": 50
125                },
126                content: function () {
127                    return $(this).next('[data-content]').html();
128                }
129            },
130            popover: function (selector) {
131                $(('string' == typeof selector ? selector + '' : '') + '.popover-default [data-toggle="popover"]').popover(this.popoverConfig);
132            }
133        }
134        cc.popover();
135
136        // collapseFilter
137        $('#collapseFilter')
138                .on('shown.bs.collapse', function () {
139                    $('[aria-controls="collapseFilter"]:not(.btn) i').removeClass('glyphicon-menu-down').addClass('glyphicon-menu-up');
140                })
141                .on('hidden.bs.collapse', function () {
142                    $('[aria-controls="collapseFilter"]:not(.btn) i').removeClass('glyphicon-menu-up').addClass('glyphicon-menu-down');
143                });
144
145        ({
146            config: {
147                sectionWrapper: '#tarifvergleich',
148                template: '<div class="col-xs-4 text-center" data-item=""><div class="item">{remove} <span class="nr">{nr}</span> <div class="tariff"><strong>{tariff}</strong></div> <div class="price clearfix" style="padding-left:10px;padding-right:10px;">{price}</div> </div>'
149                        + '<input type="hidden" name="comparison_ids[]" value="{id}">'
150                        + '<input type="hidden" name="image[]" value="{input_image}">'
151                        + '<input type="hidden" name="prices[]" value="{input_price}">'
152                        + '<input type="hidden" name="units[]" value="{input_unit}">'
153                        + '<input type="hidden" name="prices_2[]" value="{input_price_2}">'
154                        + '<input type="hidden" name="units_2[]" value="{input_unit_2}">'
155                        + '</div>',
156                templateButton: '<a href="javascript:;" role="button" class="delete-item" aria-label="Close"><i class="glyphicon glyphicon-remove"></i></a>',
157            },
158            init: function () {
159                $(this.config.sectionWrapper).on('click', '.cc-list input[type="checkbox"][name^="comparison"]', this, this.eventCheckbox);
160                $('.delete-items').on('click', this, this.eventRemoveAll);
161                $('.comparison_navigation').on('click', '.delete-item', this, this.eventRemoveItem);
162
163                // ask_vp
164                $('#angebot').on('click', 'input[type="radio"][name="ask_vp"]', this, function () {
165
166                    if (("Ja" == $(this).val() && 1 == $(this).data("is-ask-select")) || ("Nein" == $(this).val() && 2 == $(this).data("is-ask-select"))) {
167                        $("[data-ask-information]").show();
168                    } else {
169                        $("[data-ask-information]").hide();
170                    }
171                });
172                $('#angebot').on('click', 'input[type="radio"][name="ask_vp_2"]', this, function () {
173                    if (("Ja" == $(this).val() && 1 == $(this).data("is-ask-select-2")) || ("Nein" == $(this).val() && 2 == $(this).data("is-ask-select-2"))) {
174                        $("[data-ask-information-2]").show();
175                    } else {
176                        $("[data-ask-information-2]").hide();
177                    }
178                });
179                $('#angebot').on('click', 'input[type="radio"][name="ask_vp_3"]', this, function () {
180                    if (("Ja" == $(this).val() && 1 == $(this).data("is-ask-select-3")) || ("Nein" == $(this).val() && 2 == $(this).data("is-ask-select-3"))) {
181                        $("[data-ask-information-3]").show();
182                    } else {
183                        $("[data-ask-information-3]").hide();
184                    }
185                });
186                $("[data-ask-information]").hide();
187                $("[data-ask-information-2]").hide();
188                $("[data-ask-information-3]").hide();
189                // data-is-ask-select
190                // Wenn ja, soll nein, wenn nein soll immer ja vorausgewählt sein.
191                $('input[type="radio"][name="ask_vp"][value="Nein"][data-is-ask-select="1"]').prop("checked", true);
192                $('input[type="radio"][name="ask_vp"][value="Ja"][data-is-ask-select="2"]').prop("checked", true);
193
194                $('input[type="radio"][name="ask_vp_2"][value="Nein"][data-is-ask-select-2="1"]').prop("checked", true);
195                $('input[type="radio"][name="ask_vp_2"][value="Ja"][data-is-ask-select-2="2"]').prop("checked", true);
196                $('input[type="radio"][name="ask_vp_3"][value="Nein"][data-is-ask-select-3="1"]').prop("checked", true);
197                $('input[type="radio"][name="ask_vp_3"][value="Ja"][data-is-ask-select-3="2"]').prop("checked", true);
198
199            },
200            eventCheckbox: function (event) {
201                var comparison = event.data;
202                if ($(this).is(':checked')) {
203                    comparison.removeEmpty();
204                    var items = $('.comparison_navigation [data-item]');
205                    for (var i = 0; i < 3; ++i) {
206                        if (0 == items.eq(i).length) {
207                            var item = $(this).parents('.item');
208                            //comparison.addTemplate(i, item.find('.tariff').html(), item.find('.price').html(), comparison.config.templateButton);
209                            comparison.addTemplate(i,
210                                    item.find('.tariff').html(),
211                                    item.find('[data-source-price]').html(),
212                                    comparison.config.templateButton,
213                                    item.find('[data-source-price-unit]').html(),
214                                    item.find('[data-source-price-item]').html(),
215                                    1 == item.find('[data-source-price-unit]:eq(1)').length ? item.find('[data-source-price-unit]:eq(1)').html() : '',
216                                    1 == item.find('[data-source-price-item]:eq(1)').length ? item.find('[data-source-price-item]:eq(1)').html() : '',
217                                    1 == item.find('img').length ? item.find('img').attr('src') : '',
218                                    $(this).val()
219                                    );
220                            $('.comparison_navigation [data-item]').eq(i).attr('data-item', $(this).val());
221                            if (2 == i) {
222                                comparison.addDisabled();
223                            }
224                            break;
225                        }
226                    }
227                } else {
228                    $('.comparison_navigation [data-item="' + $(this).val() + '"]').remove();
229                }
230                comparison.refresh();
231            },
232            eventRemoveItem: function (event) {
233                var comparison = event.data;
234                var id = $(this).parents('[data-item]').data('item');
235                $('.cc-list input[type="checkbox"][name^="comparison"][value="' + id + '"]').prop("checked", false);
236                $(this).parents('[data-item]').remove();
237                comparison.refresh();
238            },
239            eventRemoveAll: function (event) {
240                var comparison = event.data;
241                $('.comparison_navigation [data-item]').remove();
242                $('.cc-list input[type="checkbox"][name^="comparison"]').prop("checked", false);
243                comparison.refresh();
244            },
245            addDisabled: function () {
246                $('.cc-list input[type="checkbox"][name^="comparison"]:not(:checked)').attr("disabled", 'disabled');
247            },
248            removeDisabled: function () {
249                $('.cc-list input[type="checkbox"][name^="comparison"][disabled]').removeAttr("disabled");
250            },
251            addTemplate: function (i, tariff, price, button, input_unit, input_price, input_unit_2, input_price_2, input_image, id) {
252                var tpl = this.config.template;
253                tpl = tpl.replace('{nr}', i + 1);
254                tpl = tpl.replace('{id}', id);
255                tpl = tpl.replace('{input_unit}', input_unit);
256                tpl = tpl.replace('{input_price}', input_price);
257                tpl = tpl.replace('{input_unit_2}', input_unit_2);
258                tpl = tpl.replace('{input_price_2}', input_price_2);
259                tpl = tpl.replace('{input_image}', input_image);
260                tpl = tpl.replace('{tariff}', tariff);
261                tpl = tpl.replace('{price}', price);
262                tpl = tpl.replace('{remove}', button);
263                $('.comparison_navigation [data-items]').append(tpl);
264            },
265            removeEmpty: function () {
266                $('.comparison_navigation [data-item=""]').remove();
267            },
268            show: function (is_show) {
269                $('.comparison_navigation')[(is_show ? 'remove' : 'add') + 'Class']('hide');
270            },
271            refresh: function () {
272                this.removeEmpty();
273                var count = 0;
274                var items = $('.comparison_navigation [data-item]');
275                for (var i = 0; i < 3; ++i) {
276                    if (1 == items.eq(i).length) {
277                        ++count;
278                    } else {
279                        this.addTemplate(i, '&nbsp;', '&nbsp;', '', '', '', '', '', '', '');
280                    }
281                }
282                if (3 != count) {
283                    this.removeDisabled();
284                }
285                this.show(0 < count);
286                $('.comparison_navigation [data-length]').html(count);
287            }
288        }).init();
289
290
291        // Tarif Liste
292        ({
293            config: {
294                section: '.cc-calculator',
295                sectionWrapper: '#tarifvergleich',
296                wrapper: '.cc-list',
297                attrRefresh: 'data-refresh-content',
298                dataload: 'load',
299                updateAll: 'form',
300                updateLight: '.cc-list',
301                classLoader: 'm-loader',
302                tariffsDetail: '.tariff-detail',
303            },
304            init: function () {
305                this.tariffs.events.on(this);
306                return this;
307            },
308            tariffs: {
309                events: {
310                    on: function (self) {
311                        // console.log(this);
312
313                        // Tariffs List
314                        // $(self.config.section + ' a[data-toggle="tab"]').on('click', self, self.tariffs.events.isTab);
315                        $(self.config.section).on('show.bs.tab', 'a[data-toggle="tab"][' + self.config.attrRefresh + ']', self, self.tariffs.events.isTab);
316                        $(self.config.sectionWrapper + ' .filter').on('click', 'input[type="checkbox"]', self, self.tariffs.events.actionFilter);
317                        $(self.config.sectionWrapper).on('change', '.filter select,.filter input[type="radio"],input[name="sort"]', self, self.tariffs.events.actionFilter);
318
319                        // Tariffs Details
320                        $(self.config.sectionWrapper).on('click', self.config.tariffsDetail + ' a[data-toggle="collapse"]', self, self.tariffs.events.details);
321                        $(self.config.sectionWrapper).on('hidden.bs.collapse', '.cc-detail
321s[data-load="1"]', self, self.tariffs.events.updateCollapseButtonStatus);
322                        $(self.config.sectionWrapper).on('shown.bs.collapse', '.cc-details[data-load="1"]', self, self.tariffs.events.updateCollapseButtonStatus);
323
324                        // Tarif vergleich
325                        $(self.config.sectionWrapper).on('click', '.comparison_navigation [name="submit"][value="comparison"]', self, self.tariffs.events.comparison);
326                        $(self.config.sectionWrapper).on('click', '.cc_comparison a[data-back]', self, self.tariffs.events.comparisonBack);
327                    },
328                    isTab: function (event) {
329                        var self = event.data;
330                        var config = self.config;
331                        if (1 != this.getAttribute('data-' + config.dataload)) {
332
333                            self.tariffs.refreshFromData(self, config.updateAll);
334                            // Nur beim 1. mal laden
335                            this.setAttribute('data-' + config.dataload, 1);
336                        }
337                    },
338                    actionFilter: function (event) {
339                        // console.log('actionFilter');
340
341                        event.data.tariffs.refreshFromData(event.data, event.data.config.updateLight);
342
343                        if (!$('.comparison_navigation').hasClass('hide')) {
344                            // Wenn Filter aktiviert wurde und der Tarifvergleich sichtbar ist. Dann schließen.
345                            $('.comparison_navigation .delete-item').trigger('click');
346                        }
347                    },
348                    updateCollapseButtonStatus: function (event) {
349                        // console.log('updateCollapseButtonStatus', event);
350                        var button = $('a[data-target="#' + this.id + '"');
351
352                        event.data.tariffs.updateCollapseButtonStatus(event.data, button);
353                    },
354                    comparisonBack: function (event) {
355                        var self = event.data;
356
357                        self.addLoader(self.config.sectionWrapper + " form");
358
359                        var wrapper = self.config.sectionWrapper + " [data-comparison-target]";
360
361                        $(wrapper).slideUp(500);
362
363                        $(self.config.sectionWrapper + ' form').slideDown(500, function () {
364                            self.removeLoader();
365
366                            area_section.set('tarifvergleich');
367                        });
368                    },
369                    comparison: function (event) {
370                        var self = event.data;
371                        event.preventDefault();
372
373                        var wrapper = self.config.sectionWrapper + " [data-comparison-target]";
374
375                        self.addLoader(self.config.sectionWrapper + " [data-target-loader-all]");
376
377                        var callback = function () {
378
379                            $(wrapper).slideDown(500, function () {
380                                self.removeLoader();
381
382                                $(window).scrollTop(0);
383
384                                area_section.set('vergleichen');
385                            });
386
387                            $(self.config.sectionWrapper + ' form').slideUp(500);
388                        };
389
390                        self.refreshFromData($(self.config.sectionWrapper + ' form').serialize() + "&" + $.param({render: 'comparison'}), wrapper, callback);
391                    },
392                    details: function (event) {
393
394                        // console.log('details A');
395
396                        // Nur beim 1. Aufruf die Daten laden.
397                        if (!this.hasAttribute('data-' + event.data.config.dataload) || 1 != this.getAttribute('data-' + event.data.config.dataload)) {
398
399                            var button = this;
400                            // Button als geladen markieren
401                            this.setAttribute('data-' + event.data.config.dataload, 1);
402
403                            // Collapse als geladen markieren. Aber erst wenn es mit Ajax laden fert
403ig ist.
404                            var collapseTarget = $(this).data('target');
405
406                            $(collapseTarget).html('<div class="text-center"><span class="m-loader m-loader-xs"></span></div>');
407
408                            var callback = function () {
409                                $(collapseTarget)
410                                        .attr('data-' + event.data.config.dataload, 1);
411                                //.trigger('shown.bs.collapse');
412                                event.data.tariffs.updateCollapseButtonStatus(null, $(button));
413                            };
414                            event.data.tariffs.refreshDetails(event.data, this, callback);
415                        }
416                    }
417                },
418                refreshFromData: function (self, updateWrapper) {
419
420                    self.addLoader(self.config.sectionWrapper + " " + updateWrapper);
421
422                    var wrapper = self.config.sectionWrapper + " " + self.config.wrapper;
423
424                    var callback = function () {
425                        self.removeLoader();
426                    };
427
428                    self.refreshFromData($(self.config.sectionWrapper + ' form').serialize() + "&" + $.param({render: 'tabpanel_tariffs_list'}), wrapper, callback);
429                },
430                updateCollapseButtonStatus: function (self, button) {
431                    button.find('.inner').html('<span class="glyphicon glyphicon-triangle-' + ('true' == button.attr('aria-expanded') ? 'top' : 'bottom') + '"></span>');
432                },
433                refreshDetails: function (self, button, callback) {
434
435                    var tariff_id = $(button).parents('[data-tariffs-id]').attr('data-tariffs-id');
436                    var images = $(button).parents('[data-images]').attr('data-images');
437                    var downloads = $(button).parents('[data-downloads]').attr('data-downloads');
438
439                    // inner
440                    // Beim Pfeil darf kein Ladebalken sein, den man einf
440ügt.
441                    // Falls man direkt auf den Pfeil clickt, wird der Event gestört.
442                    //$(button).find('.inner').html('<span class="m-loader m-loader-xs"></span>');
443                    //$(button).find('.inner span')
444                    //		.removeClass('glyphicon glyphicon-triangle-bottom')
445                    //		.addClass('m-loader m-loader-xs');
446
447                    var wrapper = self.config.sectionWrapper + " " + $(button).data('target');
448
449                    self.refreshFromData($.param({
450                        render: 'tariffs_detail',
451                        tariff_id: tariff_id,
452                        images: images,
453                        downloads: downloads,
454                        calc_id: $('input[type="hidden"][name="calc_id"]').val()}
455                    ), wrapper, callback);
456                }
457            },
458            addLoader: function (selector) {
459                $(selector).prepend('<div class="loader-overlayer"><div class="m-loader"></div></div>');
460            },
461            removeLoader: function () {
462                $('.loader-overlayer').remove();
463            },
464            refreshFromData: function (data, wrapper, callback) {
465
466                $.ajax({
467                    method: "POST",
468                    // url: "/",
469                    data: data
470                }).done(function (msg) {
471                    // $(self.config.sectionWrapper + " " + self.config.wrapper).html(msg);
472                    $(wrapper).html(msg);
473
474                    cc.popover(wrapper);
475
476                    if ('function' == typeof callback) {
477                        callback();
478                    }
479                });
480
481                // DEBUG
482                // window.setTimeout(function (self) {
483                // console.log('refreshFromData() ', data);
484                // }, 500, this);
485                // }, 0, this);
486            }
487        }).init();
488
489        //tariff_list.init();
490
491        // Form Benutzerangaben und Abschluß
492        ({
493            config: {
494                sectionData: '#benutzerangaben',
495                sectionOffer: '#angebot',
496                sectionTariff: '#tarifvergleich',
497            },
498            init: function () {
499                // console.log('init Benutzerangaben');
500                $(this.config.sectionData + ' button[name="tariff-list"]').on('click', this, this.toList);
501                $(this.config.sectionOffer + ' button[name="offer"]').on('click', this, this.sendOffer);
502                $(this.config.sectionTariff).on('click', '[data-written-offer]', this, this.toOffer);
503
504                $('.cc-calculator > ul.nav-tabs > li').on('show.bs.tab', 'a[data-toggle="tab"]', this, this.eventTab);
505            },
506            eventTab: function (event) {
507                var self = event.data;
508
509                // Wenn man bereits ein Abschluß hat.
510                // Aber zurück geht und ein neuen Abschluß machen möchte.
511                var site_offer = function () {
512                    if (!$('[data-page="thank-you"]').hasClass('hide')) {
513                        $('[data-page="offer"]').show();
514                        $('[data-page="thank-you"]').addClass('hide');
515
516                        $('input[type="checkbox"][name="agb"]').prop("checked", false);
517
518                        self.tab.hide(2, event);
519                        area_section.set('angaben');
520                    }
521                };
522
523                if (0 == $(this).data('index')) {
524                    self.tab.hide(1);
525                    if ($('[data-comparison-target]').is(':visible')) {
526                        $('[data-comparison-target]').hide();
527                        $('#tarifvergleich form').show();
528                        $('.comparison_navigation .delete-item').trigger('click');
529                    }
530                    site_offer();
531                } else if (1 == $(this).data('index')) {
532                    site_offer();
533                }
534            },
535            sendOffer: function (event) {
536                var self = event.data;
537
538                // @see toList()
539                popoverUserInterface.close();
540
541                var callback = function () {
542
543                    // self.tab.hide(0, event);
544                    // self.tab.hide(1, event);
545
546                    $('[data-page="offer"]').hide();
547                    $('[data-page="thank-you"]').removeClass('hide');
548                    $('*').scrollTop(0);
549
550                    // Wenn fertig, dann wieder aktivieren
551                    $(event.target).removeAttr('disabled');
552
553                    area_section.set('thank-you');
554                };
555
556                var callback_error = function () {
557                    // Bei der Fehlerausgabe wieder aktivieren
558                    $(event.target).removeAttr('disabled');
559                };
560
561                // vor dem Absenden "deaktivieren"
562                $(event.target).attr('disabled', 'disabled');
563
564                self.send(self.config.sectionOffer + ' form', callback, callback_error);
565            },
566            toOffer: function (event) {
567                //console.log('toOffer');
568
569                var self = event.data;
570
571                if (1 == $(this).parents('[data-tariffs-id]').length) {
572                    var parent = $(this).parents('[data-tariffs-id]');
573                } else if (0 < $(this).data('tariff-id')) {
574                    var parent = $('[data-tariffs-id="' + $(this).data('tariff-id') + '"]');
575                } else {
576                    var parent = 0;
577                }
578
579                if (parent) {
580                    // $(this).parents('[data-tariffs-id]').data('tariffs-id')
581                    // var parent = $(this).parents('[data-tariffs-id]');
582
583                    self.refreshPreviewPrice(parent, '[data-source-price]', '[data-target-price]');
584                    $('input[type="hidden"][name="base_price"]').val(parent.find('[data-source-price-item]:last').text().trim());
585                    $('input[type="hidden"][name="base_unit"]').val(parent.find('[data-source-price-unit]:last').text().trim());
586
587                    $('input[type="hidden"][name="filter"]').val($(self.config.sectionTariff + ' form').serialize());
588                    $('[data-target-company]').html(parent.find('p.brand').html());
589
590                    $('[data-target-tariff]').html(parent.find('[data-source-tariff]').html());
591                    $('input[type="hidden"][name="tariff_id"]').val(parent.data('tariffs-id'));
592                    $('input[type="hidden"][name="tariff"]').val(parent.find('[data-source-tariff]').text().trim());
593                    $('input[type="hidden"][name="company"]').val(parent.find('[data-source-company]').attr('data-source-company'));
594
595                    // Wenn ein System Feld `start_of_insurance` vorhanden ist
596                    if (1 == $('select[data-filter-name="start_of_insurance"]').length) {
597                        $('[data-target-begin],[data-target-begin-label]').show();
598                        $('[data-target-begin]').html($('select[data-filter-name="start_of_insurance"]').val());
599                        $('input[name="start_of_insurance"]')
600                                .val($('select[data-filter-name="start_of_insurance"]').val())
601                                .attr('readonly', 'readonly');
602                    } else {
603                        $('[data-target-begin],[data-target-begin-label]').hide();
604                    }
605
606                    // console.log('mmo 1 length:', $('input[data-filter-name="birth_date"]').length);
607                    // Wenn ein System Feld `start_of_insurance` vorhanden ist
608                    if (1 == $('input[data-filter-name="birth_date"]').length) {
609                        // console.log('mmo val:', $('input[data-filter-name="birth_date"]').val());
610                        $('input[name="birth_date_vp"]').val($('input[data-filter-name="birth_date"]').val());
611                        $('input[name="birth_date_vp"]').attr('readonly', 'readonly');
612                    }
613
614                    // Tarif Einstellung in das Form übernehmen
615                    // calc_is_ask
616                    if (1 == $('input[name="calc_is_ask"]').length) {
617                        $('input[type="hidden"][name="tariff_is_ask"]').val(parent.attr('data-is-ask'));
618                        $('input[type="hidden"][name="tariff_is_ask_2"]').val(parent.attr('data-is-ask-2'));
619                        $('input[type="hidden"][name="tariff_is_ask_3"]').val(parent.attr('data-is-ask-3'));
620                        if (1 == $('input[name="calc_is_ask"]').val() && 1 == parseInt(parent.attr('data-is-ask'))) {
621                            $('fieldset[data-is-ask]').show();
622                        } else {
623                            $('fieldset[data-is-ask]').hide();
624                        }
625                        if (1 == $('input[name="tariff_is_ask_2"]').val() && 1 == parseInt(parent.attr('data-is-ask-2'))) {
626                            $('div[data-is-ask-2]').show();
627                        } else {
628                            $('div[data-is-ask-2]').hide();
629                        }
630                        if (1 == $('input[name="tariff_is_ask_3"]').val() && 1 == parseInt(parent.attr('data-is-ask-3'))) {
631                            $('div[data-is-ask-3]').show();
632                        } else {
633                            $('div[data-is-ask-3]').hide();
634                        }
635                    }
636
637                    // to Top
638                    $('*').scrollTop(0);
639
640                    self.setValue();
641
642                    self.tab.show(2, event);
643
644                    area_section.set('angebot');
645                }
646            },
647            setValue: function () {
648                // console.log('setValue');
649                var self = this;
650
651                var params = '';
652                $(this.config.sectionData + ' .form-group,' + this.config.sectionTariff + ' .form-group').each(function () {
653                    params += self.listDetailsEach($(this), 1);
654                });
655                $('input[name="filter_value"]').val(params);
656                // console.log('setValue params', params);
657
658            },
659            listDetailsWrapper: function (label, content, is_offer) {
660
661                if (1 === is_offer) {
662                    return  'labels[]=' + encodeURIComponent(label) + '&values[]=' + encodeURIComponent(content) + '&';
663                }
664
665                return '<span>' + label + ': ' + content + '</span>';
666            },
667            listDetailsEach: function (group, is_offer) {
668
669                if (1 == group.find('input[type="checkbox"]').length) {
670                    if (1 == group.find('.control-label').length) {
671                        return this.listDetailsWrapper(group.find('.control-label').text(), group.find('input[type="checkbox"]').is(':checked') ? 'Ja' : 'Nein', is_offer);
672                    }
673                } else if (1 < group.find('input[type="radio"]').length) {
674                    return this.listDetailsWrapper(group.find('.control-label').text(), group.find('input[type="radio"]:checked').parent().text(), is_offer);
675
676                } else if (0 && 1 == group.find('input[data-filter-name="birth_date"]').length) {
677                    var encodedStr = group.find('input[data-filter-name="birth_date"]').val().replace(/[\u00A0-\u9999<>\&]/g, function (i) {
678                        return '&#' + i.charCodeAt(0) + ';';
679                    });
680                    var date = encodedStr.substring(8, 10);
681                    date += "." + encodedStr.substring(5, 7);
682                    date += "." + encodedStr.substring(0, 4);
683                    return this.listDetailsWrapper(group.find('.control-label').text(), date, is_offer);
684                } else if (1 == group.find('input').length) {
685                    // schlechte Eingaben vermeiden
686                    // <script>alert(1);</script>
687                    var encodedStr = group.find('input').val().replace(/[\u00A0-\u9999<>\&]/g, function (i) {
688                        return '&#' + i.charCodeAt(0) + ';';
689                    });
690                    return this.listDetailsWrapper(group.find('.control-label').text(), encodedStr, is_offer);
691                } else if (1 == group.find('select').length) {
692                    return this.listDetailsWrapper(group.find('.control-label').text(), group.find('select option:selected').html(), is_offer);
693                }
694                return '';
695            },
696            listDetails: function () {
697                // console.log('listDetails');
698                var self = this;
699                var html = '';
700                $(this.config.sectionData + ' .form-group').each(function () {
701                    html += self.listDetailsEach($(this));
702                });
703
704                var target = $(this.config.sectionTariff + ' .details');
705                target.find('span').remove();
706                target.prepend(html);
707            },
708            // Ob es sich um ein mobiles Endgerät handelt.
709            isMobileDevice: function () {
710                return 0 < $(window).width() && $(window).width() < 992;
711            },
712            toList: function (event) {
713                // console.log('toList');
714
715                var self = event.data;
716
717                // Daten aus Tab 1 in input hidden Feld
718                var serialize = $(self.config.sectionData + ' form').serialize();
719                // console.log(serialize);
720
721                // Wenn man vom Tab 1 zu Tab 2 wechseln. Dann die Größe vom Fenster verändert und zurück zu Tab 1 wecheln,
722                // Kann der Tooltop verschoben sein. Deswegen ausblenden, wenn man den Tab wechselt.
723                popoverUserInterface.close();
724
725                var callback = function () {
726                    self.listDetails();
727                    self.tab.show(1, event);
728
729                    area_section.set('tarifvergleich');
730
731                    if (self.isMobileDevice()) {
732                        $('#collapseFilter').collapse('hide');
733                        $('html, body').animate({
734                            scrollTop: $(".cc-calculator").offset().top
735                        }, 0);
736                    }
737                };
738
739                self.send(self.config.sectionData + ' form', callback);
740                $(self.config.sectionTariff + ' form input[name="data"]').val(serialize);
741
742            },
743            refreshPreviewPrice: function (item, source, target) {
744                var html = '';
745                item.find(source).each(function () {
746                    html += '<div>' + $(this).find('[data-source-price-unit]').html() + ' ' + $(this).find('[data-source-price-item]').html() + '</div>';
747                });
748                $(target).html(html);
749            },
750            cleanForm: function () {
751                $('.form-group.has-error .help-block').remove();
752                $('.form-group.has-error').removeClass('has-error');
753            },
754            setError: function (row) {
755                if ('string' == typeof row.name) {
756                    $('[name="' + row.name + '"]').parents('.form-group').addClass('has-error');
757                }
758                if ('string' == typeof row.msg && 0 < row.msg.length) {
759                    $('[name="' + row.name + '"]').parents('.col-md-6,.col-xs-12').append('<span class="help-block">' + row.msg + '</span>');
760                }
761            },
762            setFieldsError: function (arr) {
763                for (var i in arr) {
764                    this.setError(arr[i]);
765                }
766            },
767            send: function (select_serialize, callback, callback_error) {
768                var self = this;
769                self.cleanForm();
770                $.ajax({
771                    method: "POST",
772                    dataType: "json",
773                    data: $(select_serialize).serialize()
774                }).done(function (data) {
775                    // console.log(data);
776                    // return;
777                    if ('object' == typeof data.error && 0 < Object.keys(data.error).length) {
778                        self.setFieldsError(data.error);
779                        if (0 < $(select_serialize).find('[data-response-error]').length) {
780                            $(select_serialize).find('[data-response-error]').html('Pflichfelder bitte ausfüllen.<br>Anzahl der Fehler: ' + Object.keys(data.error).length + '');
781                        }
782                        if ('function' == typeof callback_error) {
783                            callback_error();
784                        }
785                    } else {
786                        if (0 < $(select_serialize).find('[data-response-error]').length) {
787                            $(select_serialize).find('[data-response-error]').html('');
788                        }
789                        // console.log('send() done ');
790                        if ('function' == typeof callback) {
791                            callback();
792                        }
793                    }
794                });
795            },
796            tab: {
797                show: function (i, event) {
798                    // console.log('tab.show() ', i);
799                    var li = $('.cc-calculator > ul.nav-tabs > li:eq(' + i + ')');
800                    if (1 != li.length) {
801                        return;
802                    }
803
804                    if (li.hasClass('disabled')) {
805                        li.removeClass('disabled');
806                    }
807
808                    var a = li.find('a');
809                    if (a.is('[data-tab-href]')) {
810                        a.attr('href', a.attr('data-tab-href'));
811                        a.attr('data-toggle', 'tab');
812                    }
813                    a.tab('show');
814                },
815                hide: function (i, event) {
816                    var li = $('.cc-calculator > ul.nav-tabs > li:eq(' + i + ')');
817                    if (1 != li.length) {
818                        return;
819                    }
820                    li.addClass('disabled');
821                    var a = li.find('a');
822                    a.removeAttr('href');
823                    a.attr('data-toggle', '');
824                    if (1 == i) {
825                        a.attr('data-load', '0');
826                    }
827                },
828            },
829        }).init();
830
831        // birth_date_text
832
833
834        // Credits: http://blog.vishalon.net/index.php/javascript-getting-and-setting-caret-position-in-textarea/
835        function setCaretPosition(ctrl, pos) {
836            // Modern browsers
837            if (ctrl.setSelectionRange) {
838                ctrl.focus();
839                ctrl.setSelectionRange(pos, pos);
840
841                // IE8 and below
842            } else if (ctrl.createTextRange) {
843                var range = ctrl.createTextRange();
844                range.collapse(true);
845                range.moveEnd('character', pos);
846                range.moveStart('character', pos);
847                range.select();
848            }
849        }
850
851
852        var az = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'ö', 'ä', 'ü', 'ß', '!', '"', '§', '$', '%', '&', '/', '(', ')', '=', '?', '`', '*', '#', ',', ';', ':', '-', '_', '<', '>', '+', '@', '€', '{', '}', '[', ']', ' '];
853        var az0_9 = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
854
855        var last_input = '';
856
857        if (1 == $('input[data-filter-name="birth_date"]').length) {
858            $('input[type="text"][data-filter-name="birth_date"]').attr('placeholder', 'TT.MM.YYYY');
859        }
860
861        // birth_date_vn
862        if (1 == $('input[name="birth_date_vn"]').length) {
863            $('input[name="birth_date_vn"]').attr('placeholder', 'TT.MM.YYYY');
864        }
865
866        // wenn das Feld verlassen wird.
867        $('input[data-filter-name="birth_date"],input[name="birth_date_vn"]')
868                .on('blur', function (e) {
869                    if (8 == $(this).val().length && "." == $(this).val().substring(2, 3) && "." == $(this).val().substring(5, 6)) {
870                        var currentYearStr = new Date().getFullYear().toString()
871                        var currentYear2Digit = currentYearStr.substring(currentYearStr.length - 2);
872                        var current_input_year = parseInt($(this).val().substring(6));
873                        var prefix = currentYear2Digit < current_input_year ? "19" : "20";
874                        // Falls aus 01 nur 1 wurde, dann wieder 01 erstellen.
875                        if (1 == current_input_year.toString().length) {
876                            current_input_year = "0" + current_input_year.toString();
877                        }
878                        $(this).val($(this).val().substring(0, 6) + prefix + current_input_year);
879                    }
880                })
881                .on('input', function (e) {
882                    var current_value = e.originalEvent.data;
883
884                    if (current_value) {
885                        current_value = current_value.toLowerCase();
886                    }
887                    //alert('keyCode:' + e.keyCode());
888
889                    var length = $(this).val().length;
890
891                    // console.log('input value: ', value, ' length: ', length, ' type: ', e.type);
892
893                    // Keine az Zeichen erlauben
894                    if (-1 != az.indexOf(current_value)) {
895                        e.preventDefault();
896                        $(this).val($(this).val().substring(0, $(this).val().length - 1));
897                        last_input = $(this).val();
898                        return;
899                    }
900
901                    var match = $(this).val().match(/\./g);
902                    // Es dürfen nur 2 Punkte eingegeben werden.
903                    if (null != match && "." == current_value) {
904
905
906                        if (2 < match.length) {
907                            $(this).val(last_input);
908                            e.preventDefault();
909                            return;
910                        }
911
912                        // 2. Punkte nacheinander
913                        if (2 < length && "." == $(this).val().substring(length - 2, length - 1)) {
914                            $(this).val(last_input);
915                            e.preventDefault();
916                            return;
917                        }
918                    }
919
920                    // last_input
921                    // Nur wenn 1. Punkt vorhanden ist. Der erste Punkte darf sich nicht nach hinten schieben
922                    if (-1 != $(this).val().indexOf('.') && 2 < $(this).val().indexOf('.') && 2 == last_input.indexOf('.')) {
923                        $(this).val(last_input);
924                        e.preventDefault();
925                        return;
926                    }
927
928
929                    // Nur wenn der 2. Punkt vorhanden ist. Der zweite Punkte darf sich nicht nach hinten schieben
930                    var string = $(this).val().substring(3);
931                    if (-1 != string.indexOf('.') && 2 < string.indexOf('.') && 2 == last_input.substring(3).indexOf('.')) {
932                        $(this).val(last_input);
933                        e.preventDefault();
934                        return;
935                    }
936
937                    // Nicht mehr als 10 Zeichen.
938                    // @TODO . nicht erlauben
939                    if (10 <= length && (-1 != az.indexOf(current_value) || -1 != az0_9.indexOf(current_value))) {
940                        $(this).val($(this).val().substring(0, 10));
941                        e.preventDefault();
942                        last_input = $(this).val();
943                        return;
944                    }
945
946                    if (1 == length && 3 < parseInt(current_value)) {
947                        $(this).val('0' + parseInt(current_value));
948                        length = $(this).val().length;
949                        e.preventDefault();
950                    } else if (4 == length && 1 < parseInt(current_value)) {
951                        var value = $(this).val();
952                        $(this).val(value.substring(0, 3) + '0' + value.substring(3, 4));
953                        length = $(this).val().length;
954                        e.preventDefault();
955                    }
956
957                    if ((2 == length || 5 == length) && e.originalEvent.data) {
958
959                        if (2 == length && 31 < parseInt($(this).val())) {
960                            $(this).val("0" + $(this).val().substring(0, 1) + ".0" + $(this).val().substring(1, 2) + ".");
961                        } else if ("." == $(this).val().substring(1, 2)) {
962                            // Es wurde 1. manuell eingegeben.
963                            $(this).val("0" + $(this).val().substring(0));
964                        } else if ("." == $(this).val().substring(4, 5) && 5 == $(this).val().length) {
965                            // Es wurde 01.1. manuell eingegben. Es wird daraus 01.01. gemacht.
966                            $(this).val($(this).val().substring(0, 3) + "0" + $(this).val().substring(3));
967                        } else {
968                            $(this).val($(this).val() + '.');
969                        }
970
971                        // var select = $(this);
972                        setTimeout(function (self) {
973                            setCaretPosition(self[0], self.val().length);
974                        }, 0, $(this));
975                        e.preventDefault();
976                    }
977                    last_input = $(this).val();
978
979                });
980
981    });
982})();

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.