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, ' ', ' ', '', '', '', '', '', '', ''); 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.