1/** 2 * jQuery Bar Rating Plugin v1.2.1
vendor: 15,100 bytes, lines 2-446
2 3 * 4 * http://github.com/antennaio/jquery-bar-rating 5 * 6 * Copyright (c) 2012-2016 Kazik Pietruszewski 7 * 8 * This plugin is available under the MIT license. 9 * http://www.opensource.org/licenses/mit-license.php 10 */ 11(function (factory) { 12 if (typeof define === 'function' && define.amd) { 13 // AMD 14 define(['jquery'], factory); 15 } else if (typeof module === 'object' && module.exports) { 16 // Node/CommonJS 17 module.exports = factory(require('jquery')); 18 } else { 19 // browser globals 20 factory(jQuery); 21 } 22}(function ($) { 23 24 var BarRating = (function() { 25 26 function BarRating() { 27 var self = this; 28 29 // wrap element in a wrapper div 30 var wrapElement = function() { 31 var classes = ['br-wrapper']; 32 33 if (self.options.theme !== '') { 34 classes.push('br-theme-' + self.options.theme); 35 } 36 37 self.$elem.wrap($('<div />', { 38 'class': classes.join(' ') 39 })); 40 }; 41 42 // unwrap element 43 var unwrapElement = function() { 44 self.$elem.unwrap(); 45 }; 46 47 // find option by value 48 var findOption = function(value) { 49 if ($.isNumeric(value)) { 50 value = Math.floor(value); 51 } 52 53 return $('option[value="' + value + '"]', self.$elem); 54 }; 55 56 // get initial option 57 var getInitialOption = function() { 58 var initialRating = self.options.initialRating; 59 60 if (!initialRating) { 61 return $('option:selected', self.$elem); 62 } 63 64 return findOption(initialRating); 65 }; 66 67 // get empty option 68 var getEmptyOption = function() { 69 var $emptyOpt = self.$elem.find('option[value="' + self.options.emptyValue + '"]'); 70 71 if (!$emptyOpt.length && self.options.allowEmpty) { 72 $emptyOpt = $('<option />', { 'value': self.options.emptyValue }); 73 74 return $emptyOpt.prependTo(self.$elem); 75 } 76 77 return $emptyOpt; 78 }; 79 80 // get data 81 var getData = function(key) { 82 var data = self.$elem.data('barrating'); 83 84 if (typeof key !== 'undefined') { 85 return data[key]; 86 } 87 88 return data; 89 }; 90 91 // set data 92 var setData = function(key, value) { 93 if (value !== null && typeof value === 'object') { 94 self.$elem.data('barrating', value); 95 } else { 96 self.$elem.data('barrating')[key] = value; 97 } 98 }; 99 100 // save data on element 101 var saveDataOnElement = function() { 102 var $opt = getInitialOption(); 103 var $emptyOpt = getEmptyOption(); 104 105 var value = $opt.val(); 106 var text = $opt.data('html') ? $opt.data('html') : $opt.text(); 107 108 // if the allowEmpty option is not set let's check if empty option exists in the select field 109 var allowEmpty = (self.options.allowEmpty !== null) ? 110 self.options.allowEmpty : 111 !!$emptyOpt.length; 112 113 var emptyValue = ($emptyOpt.length) ? $emptyOpt.val() : null; 114 var emptyText = ($emptyOpt.length) ? $emptyOpt.text() : null; 115 116 setData(null, { 117 userOptions: self.options, 118 119 // initial rating based on the OPTION value 120 ratingValue: value, 121 ratingText: text, 122 123 // rating will be restored by calling clear method 124 originalRatingValue: value, 125 originalRatingText: text, 126 127 // allow empty ratings? 128 allowEmpty: allowEmpty, 129 130 // rating value and text of the empty OPTION 131 emptyRatingValue: emptyValue, 132 emptyRatingText: emptyText, 133 134 // read-only state 135 readOnly: self.options.readonly, 136 137 // did the user already select a rating? 138 ratingMade: false 139 }); 140 }; 141 142 // remove data on element 143 var removeDataOnElement = function() { 144 self.$elem.removeData('barrating'); 145 }; 146 147 // return current rating text 148 var ratingText = function() { 149 return getData('ratingText'); 150 }; 151 152 // return current rating value 153 var ratingValue = function() { 154 return getData('ratingValue'); 155 }; 156 157 // build widget and return jQuery element 158 var buildWidget = function() { 159 var $w = $('<div />', { 'class': 'br-widget' }); 160 161 // create A elements that will replace OPTIONs 162 self.$elem.find('option').each(function() { 163 var val, text, html, $a; 164 165 val = $(this).val(); 166 167 // create ratings - but only if val is not defined as empty 168 if (val !== getData('emptyRatingValue')) { 169 text = $(this).text(); 170 html = $(this).data('html'); 171 if (html) { text = html; } 172 173 $a = $('<a />', { 174 'href': '#', 175 'data-rating-value': val, 176 'data-rating-text': text, 177 'html': (self.options.showValues) ? text : '' 178 }); 179 180 $w.append($a); 181 } 182 183 }); 184 185 // append .br-current-rating div to the widget 186 if (self.options.showSelectedRating) { 187 $w.append($('<div />', { 'text': '', 'class': 'br-current-rating' })); 188 } 189 190 // additional classes for the widget 191 if (self.options.reverse) { 192 $w.addClass('br-reverse'); 193 } 194 195 if (self.options.readonly) { 196 $w.addClass('br-readonly'); 197 } 198 199 return $w; 200 }; 201 202 // return a jQuery function name depending on the 'reverse' setting 203 var nextAllorPreviousAll = function() { 204 if (getData('userOptions').reverse) { 205 return 'nextAll'; 206 } else { 207 return 'prevAll'; 208 } 209 }; 210 211 // set the value of the select field 212 var setSelectFieldValue = function(value) { 213 // change selected option 214 findOption(value).prop('selected', true); 215 216 self.$elem.change(); 217 }; 218 219 // reset select field 220 var resetSelectField = function() { 221 $('option', self.$elem).prop('selected', function() { 222 return this.defaultSelected; 223 }); 224 225 self.$elem.change(); 226 }; 227 228 // display the currently selected rating 229 var showSelectedRating = function(text) { 230 // text undefined? 231 text = text ? text : ratingText(); 232 233 // special case when the selected rating is defined as empty 234 if (text == getData('emptyRatingText')) { 235 text = ''; 236 } 237 238 // update .br-current-rating div 239 if (self.options.showSelectedRating) { 240 self.$elem.parent().find('.br-current-rating').text(text); 241 } 242 }; 243 244 // return rounded fraction of a value (14.4 -> 40, 0.99 -> 90) 245 var fraction = function(value) { 246 return Math.round(((Math.floor(value * 10) / 10) % 1) * 100); 247 }; 248 249 // remove all classes from elements 250 var resetStyle = function() { 251 // remove all classes starting with br-* 252 self.$widget.find('a').removeClass(function(index, classes) { 253 return (classes.match(/(^|\s)br-\S+/g) || []).join(' '); 254 }); 255 }; 256 257 // apply style by setting classes on elements 258 var applyStyle = function() { 259 var $a = self.$widget.find('a[data-rating-value="' + ratingValue() + '"]'); 260 var initialRating = getData('userOptions').initialRating; 261 var baseValue = $.isNumeric(ratingValue()) ? ratingValue() : 0; 262 var f = fraction(initialRating); 263 var $all, $fractional; 264 265 resetStyle(); 266 267 // add classes 268 $a.addClass('br-selected br-current')[nextAllorPreviousAll()]() 269 .addClass('br-selected'); 270 271 if (!getData('ratingMade') && $.isNumeric(initialRating)) { 272 if ((initialRating <= baseValue) || !f) { 273 return; 274 } 275 276 $all = self.$widget.find('a'); 277 278 $fractional = ($a.length) ? 279 $a[(getData('userOptions').reverse) ? 'prev' : 'next']() : 280 $all[(getData('userOptions').reverse) ? 'last' : 'first'](); 281 282 $fractional.addClass('br-fractional'); 283 $fractional.addClass('br-fractional-' + f); 284 } 285 }; 286 287 // check if the element is deselectable? 288 var isDeselectable = function($element) { 289 if (!getData('allowEmpty') || !getData('userOptions').deselectable) { 290 return false; 291 } 292 293 return (ratingValue() == $element.attr('data-rating-value')); 294 }; 295 296 // handle click events 297 var attachClickHandler = function($elements) { 298 $elements.on('click.barrating', function(event) { 299 var $a = $(this), 300 options = getData('userOptions'), 301 value, 302 text; 303 304 event.preventDefault(); 305 306 value = $a.attr('data-rating-value'); 307 text = $a.attr('data-rating-text'); 308 309 // is current and deselectable? 310 if (isDeselectable($a)) { 311 value = getData('emptyRatingValue'); 312 text = getData('emptyRatingText'); 313 } 314 315 // remember selected rating 316 setData('ratingValue', value); 317 setData('ratingText', text); 318 setData('ratingMade', true); 319 320 setSelectFieldValue(value); 321 showSelectedRating(text); 322 323 applyStyle(); 324 325 // onSelect callback 326 options.onSelect.call( 327 self, 328 ratingValue(), 329 ratingText(), 330 event 331 ); 332 333 return false; 334 }); 335 }; 336 337 // handle mouseenter events 338 var attachMouseEnterHandler = function($elements) { 339 $elements.on('mouseenter.barrating', function() { 340 var $a = $(this); 341 342 resetStyle(); 343 344 $a.addClass('br-active')[nextAllorPreviousAll()]() 345 .addClass('br-active'); 346 347 showSelectedRating($a.attr('data-rating-text')); 348 }); 349 }; 350 351 // handle mouseleave events 352 var attachMouseLeaveHandler = function($elements) { 353 self.$widget.on('mouseleave.barrating blur.barrating', function() { 354 showSelectedRating(); 355 applyStyle(); 356 }); 357 }; 358 359 // somewhat primitive way to remove 300ms click delay on touch devices 360 // for a more advanced solution consider setting `fastClicks` option to false 361 // and using a library such as fastclick (https://github.com/ftlabs/fastclick) 362 var fastClicks = function($elements) { 363 $elements.on('touchstart.barrating', function(event) { 364 event.preventDefault(); 365 event.stopPropagation(); 366 367 $(this).click(); 368 }); 369 }; 370 371 // disable clicks 372 var disableClicks = function($elements) { 373 $elements.on('click.barrating', function(event) { 374 event.preventDefault(); 375 }); 376 }; 377 378 var attachHandlers = function($elements) { 379 // attach click event handler 380 attachClickHandler($elements); 381 382 if (self.options.hoverState) { 383 // attach mouseenter event handler 384 attachMouseEnterHandler($elements); 385 386 // attach mouseleave event handler 387 attachMouseLeaveHandler($elements); 388 } 389 }; 390 391 var detachHandlers = function($elements) { 392 // remove event handlers in the ".barrating" namespace 393 $elements.off('.barrating'); 394 }; 395 396 var setupHandlers = function(readonly) { 397 var $elements = self.$widget.find('a'); 398 399 if (fastClicks) { 400 fastClicks($elements); 401 } 402 403 if (readonly) { 404 detachHandlers($elements); 405 disableClicks($elements); 406 } else { 407 attachHandlers($elements); 408 } 409 }; 410 411 this.show = function() { 412 // run only once 413 if (getData()) return; 414 415 // wrap element 416 wrapElement(); 417 418 // save data 419 saveDataOnElement(); 420 421 // build & append widget to the DOM 422 self.$widget = buildWidget(); 423 self.$widget.insertAfter(self.$elem); 424 425 applyStyle(); 426 427 showSelectedRating(); 428 429 setupHandlers(self.options.readonly); 430 431 // hide the select field 432 self.$elem.hide(); 433 }; 434 435 this.readonly = function(state) { 436 if (typeof state !== 'boolean' || getData('readOnly') == state) return; 437 438 setupHandlers(state); 439 setData('readOnly', state); 440 self.$widget.toggleClass('br-readonly'); 441 }; 442 443 this.set = function(value) { 444 var options = getData('userOptions'); 445 446 if (
446!self.$elem.find('option[value="' + value + '"]').val()
vendor: 4,573 bytes, lines 446-585
446) return; 447 448 // set data 449 setData('ratingValue', value); 450 setData('ratingText', self.$elem.find('option[value="' + value + '"]').text()); 451 setData('ratingMade', true); 452 453 setSelectFieldValue(ratingValue()); 454 showSelectedRating(ratingText()); 455 456 applyStyle(); 457 458 // onSelect callback 459 if (!options.silent) { 460 options.onSelect.call( 461 this, 462 ratingValue(), 463 ratingText() 464 ); 465 } 466 }; 467 468 this.clear = function() { 469 var options = getData('userOptions'); 470 471 // restore original data 472 setData('ratingValue', getData('originalRatingValue')); 473 setData('ratingText', getData('originalRatingText')); 474 setData('ratingMade', false); 475 476 resetSelectField(); 477 showSelectedRating(ratingText()); 478 479 applyStyle(); 480 481 // onClear callback 482 options.onClear.call( 483 this, 484 ratingValue(), 485 ratingText() 486 ); 487 }; 488 489 this.destroy = function() { 490 var value = ratingValue(); 491 var text = ratingText(); 492 var options = getData('userOptions'); 493 494 // detach handlers 495 detachHandlers(self.$widget.find('a')); 496 497 // remove widget 498 self.$widget.remove(); 499 500 // remove data 501 removeDataOnElement(); 502 503 // unwrap the element 504 unwrapElement(); 505 506 // show the element 507 self.$elem.show(); 508 509 // onDestroy callback 510 options.onDestroy.call( 511 this, 512 value, 513 text 514 ); 515 }; 516 } 517 518 BarRating.prototype.init = function (options, elem) { 519 this.$elem = $(elem); 520 this.options = $.extend({}, $.fn.barrating.defaults, options); 521 522 return this.options; 523 }; 524 525 return BarRating; 526 })(); 527 528 $.fn.barrating = function (method, options) { 529 return this.each(function () { 530 var plugin = new BarRating(); 531 532 // plugin works with select fields 533 if (!$(this).is('select')) { 534 $.error('Sorry, this plugin only works with select fields.'); 535 } 536 537 // method supplied 538 if (plugin.hasOwnProperty(method)) { 539 plugin.init(options, this); 540 if (method === 'show') { 541 return plugin.show(options); 542 } else { 543 // plugin exists? 544 if (plugin.$elem.data('barrating')) { 545 plugin.$widget = $(this).next('.br-widget'); 546 return plugin[method](options); 547 } 548 } 549 550 // no method supplied or only options supplied 551 } else if (typeof method === 'object' || !method) { 552 options = method; 553 plugin.init(options, this); 554 return plugin.show(); 555 556 } else { 557 $.error('Method ' + method + ' does not exist on jQuery.barrating'); 558 } 559 }); 560 }; 561 562 $.fn.barrating.defaults = { 563 theme:'', 564 initialRating:null, // initial rating 565 allowEmpty:null, // allow empty ratings? 566 emptyValue:'', // this is the expected value of the empty rating 567 showValues:false, // display rating values on the bars? 568 showSelectedRating:true, // append a div with a rating to the widget? 569 deselectable:true, // allow to deselect ratings? 570 reverse:false, // reverse the rating? 571 readonly:false, // make the rating ready-only? 572 fastClicks:true, // remove 300ms click delay on touch devices? 573 hoverState:true, // change state on hover? 574 silent:false, // supress callbacks when controlling ratings programatically 575 onSelect:function (value, text, event) { 576 }, // callback fired when a rating is selected 577 onClear:function (value, text) { 578 }, // callback fired when a rating is cleared 579 onDestroy:function (value, text) { 580 } // callback fired when a widget is destroyed 581 }; 582 583 $.fn.barrating.BarRating = BarRating; 584 585}));
586; 587(function($) { 588 Drupal.behaviors.field_rating = { 589 attach: function(context) { 590 $('.field-type-field-rating select.field-rating-stars-widget').once('field-type-field-rating-stars-widget-init', function(event) { 591 var Select = $(this); 592 $(this).barrating('show', { 593 theme: 'css-stars', 594 onSelect: function(value, text, event) { 595 596 var current_count = parseInt(Select.parent().parent().parent().find('.voting-description .vcount').attr('data-value')); 597 var new_count = current_count+1; 598 setTimeout(function(){ 599 Select.parent().parent().parent().find('.voted-text').show(); 600 Select.parent().parent().parent().find('.voting-description .vcount').html(new_count); 601 }, 400); 602 603 604 if (typeof(event) !== 'undefined') { 605 // rating was selected by a user 606 console.log(value); 607 Select.val(value); 608 } else { 609 // rating was selected programmatically 610 // by calling `set` method 611 } 612 } 613 }); 614 }); 615 } 616 } 617})(jQuery);; 618(function ($) { 619 620/** 621 * A progressbar object. Initialized with the given id. Must be inserted into 622 * the DOM afterwards through progressBar.element. 623 * 624 * method is the function which will perform the HTTP request to get the 625 * progress bar state. Either "GET" or "POST". 626 * 627 * e.g. pb = new progressBar('myProgressBar'); 628 * some_element.appendChild(pb.element); 629 */ 630Drupal.progressBar = function (id, updateCallback, method, errorCallback) { 631 var pb = this; 632 this.id = id; 633 this.method = method || 'GET'; 634 this.updateCallback = updateCallback; 635 this.errorCallback = errorCallback; 636 637 // The WAI-ARIA setting aria-live="polite" will announce changes after users 638 // have completed their current activity and not interrupt the screen reader. 639 this.element = $('<div class="progress" aria-live="polite"></div>').attr('id', id); 640 this.element.html('<div class="bar"><div class="filled"></div></div>' + 641 '<div class="percentage"></div>' + 642 '<div class="message"> </div>'); 643}; 644 645/** 646 * Set the percentage and status message for the progressbar. 647 */ 648Drupal.progressBar.prototype.setProgress = function (percentage, message) { 649 if (percentage >= 0 && percentage <= 100) { 650 $('div.filled', this.element).css('width', percentage + '%'); 651 $('div.percentage', this.element).html(percentage + '%'); 652 } 653 $('div.message', this.element).html(message); 654 if (this.updateCallback) { 655 this.updateCallback(percentage, message, this); 656 } 657}; 658 659/** 660 * Start monitoring progress via Ajax. 661 */ 662Drupal.progressBar.prototype.startMonitoring = function (uri, delay) { 663 this.delay = delay; 664 this.uri = uri; 665 this.sendPing(); 666}; 667 668/** 669 * Stop monitoring progress via Ajax. 670 */ 671Drupal.progressBar.prototype.stopMonitoring = function () { 672 clearTimeout(this.timer); 673 // This allows monitoring to be stopped from within the callback. 674 this.uri = null; 675}; 676 677/** 678 * Request progress data from server. 679 */ 680Drupal.progressBar.prototype.sendPing = function () { 681 if (this.timer) { 682 clearTimeout(this.timer); 683 } 684 if (this.uri) { 685 var pb = this; 686 // When doing a post request, you need non-null data. Otherwise a 687 // HTTP 411 or HTTP 406 (with Apache mod_security) error may result. 688 $.ajax({ 689 type: this.method, 690 url: this.uri, 691 data: '', 692 dataType: 'json', 693 success: function (progress) { 694 // Display errors. 695 if (progress.status == 0) { 696 pb.displayError(progress.data); 697 return; 698 } 699 // Update display. 700 pb.setProgress(progress.percentage, progress.message); 701 // Schedule next timer. 702 pb.timer = setTimeout(function () { pb.sendPing(); }, pb.delay); 703 }, 704 error: function (xmlhttp) { 705 pb.displayError(Drupal.ajaxError(xmlhttp, pb.uri)); 706 } 707 }); 708 } 709}; 710 711/** 712 * Display errors on the page. 713 */ 714Drupal.progressBar.prototype.displayError = function (string) { 715 var error = $('<div class="messages error"></div>').html(string); 716 $(this.element).before(error).hide(); 717 718 if (this.errorCallback) { 719 this.errorCallback(this); 720 } 721}; 722 723})(jQuery); 724; 725jQuery(function($) { 726 if (typeof Drupal.ajax != 'undefined') { 727 for (var key in Drupal.ajax) { 728 if (typeof Drupal.ajax[key].callback != 'undefined' && Drupal.ajax[key].callback == 'ins_forms_updateFeed') { 729 var beforeSend = Drupal.ajax[key].options.beforeSend; 730 var $element = $(Drupal.ajax[key].element); 731 var toptions = jQuery.extend({}, Drupal.ajax[key].options); 732 Drupal.ajax[key].options.beforeSubmit = function(xmlhttprequest, options) { 733 var width = $(window).width(); 734 if (width >= 768) 735 toptions.beforeSubmit(xmlhttprequest, options); 736 } 737 Drupal.ajax[key].options.beforeSerialize = function(xmlhttprequest, options) { 738 var width = $(window).width(); 739 if (width >= 768) 740 toptions.beforeSerialize(xmlhttprequest, options); 741 } 742 Drupal.ajax[key].options.complete = function(xmlhttprequest, options) { 743 var width = $(window).width(); 744 if (width >= 768) 745 toptions.complete(xmlhttprequest, options); 746 } 747 Drupal.ajax[key].options.success = function(xmlhttprequest, options) { 748 var width = $(window).width(); 749 if (width >= 768) 750 toptions.success(xmlhttprequest, options); 751 } 752 Drupal.ajax[key].options.beforeSend = function(xmlhttprequest, options) { 753 var width = $(window).width(); 754 if (width >= 768) { 755 beforeSend(xmlhttprequest, options); 756 $('.feedContainer').addClass('updateFeed'); 757 } else { 758 if ($element.attr('type') == 'submit') 759 $element.parents('form').submit(); 760 } 761 } 762 } 763 } 764 Drupal.ajax.prototype.commands.updateStateBlock = function(ajax, response, status) { 765 var $form = $(ajax.form.context); 766 $form.removeClass('waiting'); 767 var $block = $form.parents('.statesBlock'); 768 $block.removeClass('starting'); 769 $block.find('.stateInput').val(response.data.state); 770 $block.find('.stateTitle').text(response.data.title); 771 $block.find('.stateStates').find('.req').find('.value').text(response.data.min); 772 $block.find('.stateStates').find('.descr').find('.value').text(response.data.state_type); 773 $block.find('.stateStates').find('.descr').find('.sub').text(response.data.state_type_note); 774 var avg = parseFloat(response.data.avg).toFixed(0) + ''; 775 avg = avg.replace(/(\d)(?=(\d{3})+\.?)/g, '$1,'); 776 $block.find('.stateStates').find('.average').find('.value').text('$' + avg); 777 $block.find('.stateStates').find('.average').find('.sub').text(response.data.state_type_descr); 778 if (response.data.page) 779 $form.attr('action', response.data.url); 780 else 781 $form.attr('action', '/auto-insurance-providers'); 782 } 783 784 Drupal.ajax.prototype.commands.updateFeed = function(ajax, response, status) { 785 processFeedResp(response.data); 786 } 787 788 if (typeof Drupal.ajax['edit-states'] != 'undefined') 789 Drupal.ajax['edit-states'].options.beforeSubmit = function(form_values, element_settings, options) { 790 var $form = $(element_settings.context); 791 $form.addClass('waiting'); 792 }; 793 794 $('.ins-forms-state-form #edit-submit').on('click', function(e) { 795 if ($(this).parents('form').hasClass('waiting')) 796 e.preventDefault(); 797 }); 798 799 $('.ins-forms-state-form #edit-states').trigger('change'); 800 } 801 802 $('.ins-forms-state-update-form').each(function() { 803 if (!$(this).find('.form-submit').length) 804 $(this).find('select').on('change', function() { 805 var $form = $(this).parents('form'); 806 $form.submit(); 807 }) 808 }); 809 810 $('.ins-forms-feed-form .form-radio,.ins-forms-feed-form .form-select').on('change', function() { 811 var width = $(window).width(); 812 if (width >= 768) 813 $(this).parents('form').find('.form-submit').trigger('mousedown'); 814 }); 815 816 $('.ins-forms-calc-form,.ins-forms-quotes-form').on('submit', function(e) { 817 var $form = $(this); 818 var hasErrors = false;
819 var insType = $form.find('[name="insurance_type"]').val(); 820 if(!!insType) 821 $form.attr('action', insType); 822 823 if ($form.find('select[name="insurance_type"]').length) { 824 // Ignore hidden state 825 if ($form.find('select[name="insurance_type"]')[0].offsetParent === null) { 826 return true; 827 } 828 $($form.find('select[name="insurance_type"]').parents('.form-item')).removeClass('errored'); 829 var type = $form.find('select[name="insurance_type"]').val(); 830 if (!type) { 831 $($form.find('select[name="insurance_type"]').parents('.form-item')).addClass('errored'); 832 hasErrors = true; 833 } 834 } else if ($form.find('input[name="insurance_type"]').length) { 835 var type = $form.find('input[name="insurance_type"]').val(); 836 } 837 if ($form.find('input[name="zip"]'.offsetParent !== null).length) { 838 839 // Ignore hidden state 840 if ($form.find('select[name="zip"]')[0].offsetParent === null) { 841 return true; 842 } 843 } 844 var $zipField = $form.find('input[name="zip"]'); 845 if($zipField.length){ 846 $zipField.parents('.form-item').removeClass('errored'); 847 var zip = $zipField.val(); 848 if (zip.match(/^\d{5}$/) === null) { 849 $zipField.parents('.form-item').addClass('errored'); 850 hasErrors = true; 851 } 852 } 853 if (hasErrors) 854 return false; 855 var width = $(window).width(); 856 }); 857 858 $('.inputTel').attr('type', 'tel'); 859 860 var feedList = {}; 861 862 if($('.feedMenu').length && typeof Drupal.settings.feedOptions != 'undefined' && typeof Drupal.settings.feedOptions.zip != 'undefined'){ 863 $('.feedMenu a').each(function(){ 864 var href = $(this).attr('href'); 865 if(href.indexOf('?') !== -1) { 866 href += "&zip="; 867 }else{ 868 href += "?zip="; 869 } 870 $(this).attr('href',href+Drupal.settings.feedOptions.zip); 871 }) 872 } 873 if ($('.feedContainer').length && typeof Drupal.settings.feedOptions != 'undefined') { 874 $('.feedContainer').removeClass('updateFeed'); 875 $.ajax({ 876 url: '/getmixedfeed', 877 type: 'post', 878 dataType: 'json', 879 data: Drupal.settings.feedOptions, 880 timeout: 0, 881 success: function(resp) { 882 processFeedResp(resp); 883 }, 884 error: function() { 885 $('.page-feed').addClass('showForm'); 886 } 887 }); 888 }else if ($('.feedContainer').length && typeof Drupal.settings.feedResult != 'undefined') { 889 setTimeout(function(){ 890 $('.feedContainer').removeClass('updateFeed'); 891 processFeedResp(Drupal.settings.feedResult); 892 },500); 893 } 894 if ($('.pageFeeds').hasClass('showForm')) 895 $('.page-feed').addClass('showForm'); 896 function ins_click($fblock){ 897 var lid = $fblock.attr('data-lid'); 898 var src = feedList[lid].clickurl; 899 var sid = feedList[lid].sid; 900 $('.feedContainer').trigger('feedClick', {feed:feedList[lid], feed_dom: $fblock, type: 'click' }); 901 $.ajax({ 902 url: '/ozsid', 903 type: 'GET', 904 data: { 905 sid: sid, 906 c: $fblock.parent().children().length, 907 i: $fblock.index(), 908 } 909 }); 910 window.open(src, '_blank'); 911 } 912 function ins_call($fblock){ 913 var lid = $fblock.attr('data-lid'); 914 var sid = feedList[lid].sid; 915 $('.feedContainer').trigger('feedClick', {feed:feedList[lid], feed_dom: $fblock, type: 'call' }); 916 $.ajax({ 917 url: '/ozsid', 918 type: 'GET', 919 data: { 920 sid: sid, 921 c: $fblock.parent().children().length, 922 i: $fblock.index(), 923 } 924 }); 925 if (typeof feedList[lid].ccPhoneNum == 'undefined') { 926 var data = feedList[lid].clicktocall; 927 data = data.match(/\{([^)]+)\}/); 928 if (typeof data[1] == 'undefined') return; 929 $.ajax({ 930 url: 'https://www.nextinsure.com/ListingDisplay/Display/PhoneAPI.aspx?papi=1', 931 dataType: 'jsonp', 932 type: 'GET', 933 data: JSON.parse('{' + data[1] + '}'), 934 timeout: 0, 935 success: function(resp) { 936 var phone = false; 937 for (pid in resp) { 938 phone = resp[pid]; 939 break; 940 } 941 if (typeof phone.ccPhoneNum != 'undefined') { 942 feedList[lid].phone = phone.ccPhoneNum; 943 window.location.href = 'tel:1' + phone.ccPhoneNum; 944 } 945 } 946 }); 947 } else { 948 window.location.href = 'tel:1' + feedList[lid].ccPhoneNum; 949 } 950 } 951 window.ins_click = ins_click; 952 window.ins_call = ins_call; 953 954 var redirectUrl = ''; 955 var redirectDone = false; 956 957 function startRedirect(url){ 958 redirectUrl = url; 959 try { 960 window.setTimeout(function () { 961 imagesLoaded = true; 962 doRedirect(); 963 }, 7000); 964 window.setTimeout(function () { 965 checkImagesLoaded(1000); 966 }, 1000); 967 } 968 catch (e) { 969 imagesLoaded = true; 970 doRedirect(); 971 } 972 } 973 974 function doRedirect(){ 975 if(redirectDone) return; 976 if(!!redirectUrl && !! imagesLoaded){ 977 redirectDone = true; 978 window.focus(); 979 window.location.replace(redirectUrl); 980 } 981 } 982 983 function checkImagesLoaded(counter){ 984 if (counter < 3000) { 985 try { 986 var imgs = document.getElementByTagName('img'); 987 for (var i = 0; i< imgs.length; i++){ 988 if (!imgs[i].complete) { 989 window.setTimeout(function(){ 990 checkImagesLoaded(counter + 500); 991 }, 500); 992 return; 993 } 994 } 995 } 996 catch(e){ } 997 } 998 imagesLoaded = true; 999 doRedirect(); 1000 } 1001
1002 function processFeedResp(resp) { 1003 $('.feedContainer').removeClass('updateFeed'); 1004 if (resp) { 1005 var branded = (typeof resp['branded'] != 'undefined'); 1006 var redirecting = (typeof resp['redirecting'] != 'undefined'); 1007 if (redirecting) { 1008 $('body').addClass('page-feed-redirecting'); 1009 $('body').addClass('page-feed-redirecting-'); 1010 $('#copyright-wrapper,.feedsHead,.insBlocks,#header,.topScreen,#bottomBlocks-wrapper,#footer,#footer-wrapper,.feedForm,#footerMenu-wrapper').remove(); 1011 var block = resp.listings[0]; 1012 var $interstitial = $('<div/>').addClass('interstitial').attr('data-lid', 'ls0'); 1013 var $intTitle = $('<p/>').addClass('intTitle').css('background',block['auto_redirect_primary_color']); 1014 $intTitle.html('Congratulations! It looks like <b>'+block['auto_redirect_company_name']+'</b> is your best match!'); 1015 $intTitle.appendTo($interstitial); 1016 var $intImg = $('<img/>').addClass('intImg').attr('src',block['auto_redirect_logo']); 1017 $intImg.appendTo($interstitial); 1018 var $intSubTitle = $('<p/>').addClass('intSubTitle').addClass('intSubTitle').html(block['auto_redirect_subtitle']); 1019 $intSubTitle.appendTo($interstitial); 1020 var $intLoader = $('<div/>').addClass('intLoader').addClass('intLoader').css('background',block['auto_redirect_primary_color']); 1021 $intLoader.appendTo($interstitial); 1022 $intDescription = $('<div/>').addClass('intDescription').html(block['description']).hide(); 1023 $intDescription.appendTo($interstitial); 1024 $('.feedContainer').removeClass('loading'); 1025 $('.feedContainer').append($interstitial); 1026 feedList['ls0'] = block; 1027 startRedirect(block.clickurl); 1028 $('.feedContainer').trigger($.Event('feedRedirect', { feedList: feedList, resp: resp })); 1029 }else { 1030 if (branded) { 1031 $('body').addClass('page-feed-branded'); 1032 $('body').addClass('page-feed-branded-' + resp['branded']); 1033 $('html').addClass('html-feed-branded'); 1034 $('html').addClass('html-feed-branded-' + resp['branded']); 1035 } 1036 var callText = 'Call Agent <span class="sub">Click to see phone</span>'; 1037 var quoteText = 'Free Quotes'; 1038 if (typeof Drupal.settings.feedText.quote != 'undefined') 1039 quoteText = Drupal.settings.feedText.quote; 1040 if (typeof Drupal.settings.feedText.call != 'undefined') 1041 callText = Drupal.settings.feedText.call; 1042 if (typeof resp.listings != 'undefined') { 1043 var $blocks = $('<div/>').addClass('insBlocks'); 1044 for (var bid in resp.listings) { 1045 var block = resp.listings[bid]; 1046 var btype = 'SH0';//block.type; 1047 var stype = btype.substring(0, 2); 1048 var $block = $('<div/>').attr('data-lid', 'ls' + bid).addClass('insBlock').addClass('insBlock-' + stype).addClass('insBlock-' + btype); 1049 if (resp.listings.length == 1) 1050 $block.addClass('insBlock-single'); 1051 feedList['ls' + bid] = block; 1052 var $logo = $('<div/>').addClass('feedLogo'); 1053 $logoWrap = $('<div/>').addClass('feedLogoWrap'); 1054 $logoWrap.append($('<img/>').attr('src', block.logo).addClass('logo')); 1055 var doubleLogo = ( (typeof block.altLogo != 'undefined') && (typeof block.altLogoMobile != 'undefined')) ; 1056 var doubleBrandLogo = ((typeof block.brandLogo != 'undefined') && (typeof block.brandLogoMobile != 'undefined')); 1057 if (branded && typeof block.brandLogo != 'undefined') { 1058 var $altLogo = $('<img/>').attr('src', block.brandLogo).addClass('altLogo'); 1059 if(doubleBrandLogo) 1060 $altLogo.addClass('hideMobile'); 1061 $logoWrap.append($altLogo); 1062 $logo.addClass('altFeedLogo'); 1063 } else if (typeof block.altLogo != 'undefined') { 1064 var $altLogo = $('<img/>').attr('src', block.altLogo).addClass('altLogo'); 1065 $logoWrap.append($altLogo); 1066 $logo.addClass('altFeedLogo'); 1067 } 1068 if (branded && typeof block.brandLogoMobile != 'undefined') { 1069 var $altLogo = $('<img/>').attr('src', block.brandLogoMobile).addClass('altLogo'); 1070 if(doubleBrandLogo) 1071 $altLogo.addClass('showMobile'); 1072 $logoWrap.append($altLogo); 1073 $logo.addClass('altFeedLogo'); 1074 $logo.addClass('altFeedLogoMobile'); 1075 } 1076 $logo.append($logoWrap); 1077 $logo.appendTo($block); 1078 var $descr = $('<div/>').addClass('descriptionWrapper'); 1079 $('<p/>').addClass('name').html(block.displayname).appendTo($descr); 1080 var blockTitle = block.title; 1081 if(typeof block.atitle != 'undefined') 1082 blockTitle = block.atitle; 1083 $('<p/>').addClass('title').html(blockTitle).appendTo($descr); 1084 $('<div/>').addClass('description').html(block.description).appendTo($descr); 1085 if(typeof block.adescription != 'undefined'){ 1086 $descr.find('.description').find('p,ul').remove(); 1087 $descr.find('.description').prepend(block.adescription); 1088 } 1089 if(typeof block.aquote != 'undefined'){ 1090 quoteText = block.aquote; 1091 } 1092 if(typeof block.acall != 'undefined'){ 1093 callText = block.acall; 1094 } 1095 var $siteHost = $('<p/>').addClass('sitehost').text(block.sitehost);
1096 var $buttonWrapper = $('<div/>').addClass('buttonWrapper'); 1097 var $button = $('<a/>'); 1098 if (typeof block.clickurl != 'undefined' && !!block.clickurl) { 1099 $button.addClass('btnGetQuote').html(quoteText); 1100 $logo.find('img').addClass('btnGetQuote'); 1101 if(!branded) 1102 $block.addClass('insBlock-click'); 1103 else{ 1104 $button.addClass('insBlock-click'); 1105 $siteHost.addClass('insBlock-click'); 1106 } 1107 } 1108 if (typeof block.clicktocall != 'undefined' && !!block.clicktocall) { 1109 $button.addClass('btnCallNow').html(callText); 1110 $logo.addClass('btnCallNow'); 1111 if(!branded) 1112 $block.addClass('insBlock-call'); 1113 else{ 1114 $button.addClass('insBlock-call'); 1115 $siteHost.addClass('insBlock-call'); 1116 } 1117 } 1118 $siteHost.appendTo($descr); 1119 $descr.appendTo($block); 1120 $button.appendTo($buttonWrapper); 1121 $buttonWrapper.appendTo($block); 1122 $blocks.append($block); 1123 if(branded){ 1124 $descr.append('<div class="descriptionWrapper" style="text-align:center;"></div>').children().unwrap(); 1125 var $buttonInputWrapper = $('<div/>').addClass('getQuoteTempInputWrapper').addClass('input'); 1126 var $buttonInput = $('<input type="tel" pattern="[0-9]*" maxlength="5" size="5" class="getQuoteTempInput" placeholder="Enter ZIP CODE" name="zip" maxlength="5" />'); 1127 $buttonInputWrapper.append($buttonInput); 1128 $buttonInputWrapper.append('<span class="bottom-input-border"></span>'); 1129 $buttonWrapper.prepend($buttonInputWrapper); 1130 $buttonWrapper.keydown(function (e) { 1131 // Allow: backspace, delete, tab, escape, enter and . 1132 if ($.inArray(e.keyCode, [46, 8, 9, 27, 13, 110, 190]) !== -1 || 1133 // Allow: Ctrl/cmd+A 1134 (e.keyCode == 65 && (e.ctrlKey === true || e.metaKey === true)) || 1135 // Allow: Ctrl/cmd+C 1136 (e.keyCode == 67 && (e.ctrlKey === true || e.metaKey === true)) || 1137 // Allow: Ctrl/cmd+X 1138 (e.keyCode == 88 && (e.ctrlKey === true || e.metaKey === true)) || 1139 // Allow: home, end, left, right 1140 (e.keyCode >= 35 && e.keyCode <= 39)) { 1141 // let it happen, don't do anything 1142 return; 1143 } 1144 // Ensure that it is a number and stop the keypress 1145 if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) { 1146 e.preventDefault(); 1147 } 1148 }); 1149 } 1150 } 1151 1152 var $oldBlocks = $('.feedContainer').find('.insBlocks'); 1153 if ($oldBlocks.length) 1154 $oldBlocks.replaceWith($blocks); 1155 else 1156 $('.feedContainer').append($blocks); 1157 $('.feedContainer .insBlock-click').on('click', function() { 1158 var $fblock = 1159 ($(this).hasClass('insBlock')?$(this):$(this).parents('.insBlock')); 1160 ins_click($fblock); 1161 }) 1162 $('.feedContainer .insBlock-call').on('click', function() { 1163 var $fblock = 1164 ($(this).hasClass('insBlock')?$(this):$(this).parents('.insBlock')); 1165 ins_call($fblock); 1166 }) 1167 $('.feedContainer').removeClass('loading'); 1168 $('.feedForm').show(); 1169 $('.feedContainer').trigger($.Event('feedReady', { feedList: feedList, resp: resp })); 1170 } else { 1171 $('.page-feed').addClass('showForm'); 1172 } 1173 } 1174 } else { 1175 $('.page-feed').addClass('showForm'); 1176 } 1177 } 1178}) 1179; 1180jQuery(function($) { 1181 $('.feedContainer').on('feedRedirect', function(e) { 1182 try { 1183 gtmEvent('conversion_autoredirect', e.feedList.ls0); // GTM EVENT 1184 } catch (e) { 1185 console.log('gtm event failed'); 1186 } 1187 }); 1188 $('.feedContainer').on('feedReady', function(e) { 1189 gtmEvent('show_mixer_page', false, e); // GTM EVENT 1190 /* 1191 $(this).find('.insBlock').each(function() { 1192 var key = $(this).attr('data-lid'); 1193 if (typeof e.feedList[key] != 'undefined') { 1194 var feed = e.feedList[key]; 1195 $(this).on('click', function() { 1196 if (typeof(feed.cid) != 'undefined' && typeof(feed.displayname) != 'undefined') { 1197 gtmEvent('conversion', feed); // GTM EVENT 1198 } 1199 }) 1200 } 1201 }); 1202 */ 1203 }); 1204 $('.feedContainer').on('feedClick', function(e,par) { 1205 gtmEvent('conversion', par.feed); // GTM EVENT 1206 }); 1207}); 1208 1209function getUrlParameter(name) { 1210 name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]'); 1211 var regex = new RegExp('[\\?&]' + name + '=([^&#]*)'); 1212 var results = regex.exec(location.search); 1213 return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' ')); 1214}; 1215 1216function gtmEvent(type, data, feedEvent) { 1217 var eventAction = false;
1218 var eventLabel = false; 1219 var eventCategory = false; 1220 var cid = false; 1221 // Get Feed type (for all types) 1222 // Auto 1223 if (window.location.pathname.match(/auto|car/ig) != null) { 1224 var eventCategory = 'Auto'; 1225 } 1226 // Home 1227 if (window.location.pathname.match(/home/ig) != null) { 1228 var eventCategory = 'Home'; 1229 } 1230 // Life 1231 if (window.location.pathname.match(/life/ig) != null) { 1232 var eventCategory = 'Life'; 1233 } 1234 // Health 1235 if (window.location.pathname.match(/disability|health/ig) != null) { 1236 var eventCategory = 'Health'; 1237 // What about age? 1238 try { 1239 if (feedEvent.resp.query.individuals[0].age >= 65) { 1240 var eventCategory = 'Medicare'; 1241 } 1242 } catch (e) { 1243 // console.log('Age not set.'); 1244 } 1245 } 1246 // Medicare 1247 if (window.location.pathname.match(/medicare|medicaid/ig) != null) { 1248 var eventCategory = 'Medicare'; 1249 } 1250 // + add niche slices 1251 // Brand 1252 var brandIdSlice = parseInt(getUrlParameter('brand')); 1253 try { 1254 if (typeof brandIdSlice != 'undefined' && brandIdSlice > 0) { 1255 var eventCategory = eventCategory + ': brand=' + brandIdSlice; 1256 } 1257 } catch (e) {} 1258 // Send Event 1259 switch (type) { 1260 case 'show_mixer_page': 1261 // Send Event 1262 dataLayer.push({ 1263 'event': 'show_feed', 1264 'attributes': { 1265 'action': 'Serving Mixer Results Page', 1266 'category': eventCategory, 1267 'label': '', 1268 } 1269 }); 1270 break; 1271 case 'conversion': 1272 // Event Label (Brand) 1273 if (typeof data.displayname != 'undefined') { 1274 var eventLabel = data.displayname; 1275 } 1276 // Cid 1277 if (typeof data.cid != 'undefined') { 1278 var cid = data.cid; 1279 } 1280 // Send Event 1281 dataLayer.push({ 1282 'event': 'conversion', 1283 'attributes': { 1284 'action': 'Conversion', 1285 'category': eventCategory, 1286 'label': eventLabel, 1287 'cid': cid, 1288 } 1289 }); 1290 break; 1291 case 'conversion_autoredirect': 1292 // Event Label (Brand) 1293 if (typeof data.displayname != 'undefined') { 1294 var eventLabel = data.displayname; 1295 } 1296 // Cid 1297 if (typeof data.cid != 'undefined') { 1298 var cid = data.cid; 1299 } 1300 // Send Event 1301 dataLayer.push({ 1302 'event': 'conversion', 1303 'attributes': { 1304 'action': 'Conversion (Auto-Redirect)', 1305 'category': eventCategory, 1306 'label': eventLabel, 1307 'cid': cid, 1308 } 1309 }); 1310 break; 1311 } 1312} 1313; 1314jQuery(function($) { 1315 $('.feedContainer').on('feedReady', function(e) { 1316 $(this).find('.insBlock').each(function() { 1317 // Clone Elements 1318 if ($(this).is(':nth-child(-n+3)')) { 1319 $(this).addClass('type-block'); 1320 } else { 1321 $(this).addClass('type-line'); 1322 } 1323 1324 $(this).addClass('type-line'); 1325 1326 // For First 3 items 1327 var $titleWrapper = $('<div/>').addClass('titleWrap'); 1328 $titleWrapper.appendTo($(this).find('.feedLogo')); 1329 var $title = $(this).find('.title'); 1330 var $titleClone = $title.clone(); 1331 $titleClone.appendTo($(this).find('.titleWrap')); 1332 1333 // For All other items 1334 var $nameWrapper = $('<div/>').addClass('nameWrap'); 1335 $nameWrapper.appendTo($(this).find('.feedLogo')); 1336 var $name = $(this).find('.name'); 1337 var $sitehostClone = $name.clone(); 1338 $sitehostClone.appendTo($(this).find('.nameWrap')); 1339 }); 1340 }) 1341}); 1342; 1343(function($) { 1344 1345/** 1346 * jQuery debugging helper. 1347 * 1348 * Invented for Dreditor. 1349 * 1350 * @usage 1351 * $.debug(var [, name]); 1352 * $variable.debug( [name] ); 1353 */ 1354jQuery.extend({ 1355 debug: function () { 1356 // Setup debug storage in global window. We want to look into it. 1357 window.debug = window.debug || []; 1358 1359 args = jQuery.makeArray(arguments); 1360 // Determine data source; this is an object for $variable.debug(). 1361 // Also determine the identifier to store data with. 1362 if (typeof this == 'object') { 1363 var name = (args.length ? args[0] : window.debug.length); 1364 var data = this; 1365 } 1366 else { 1367 var name = (args.length > 1 ? args.pop() : window.debug.length); 1368 var data = args[0]; 1369 } 1370 // Store data. 1371 window.debug[name] = data; 1372 // Dump data into Firebug console. 1373 if (typeof console != 'undefined') { 1374 console.log(name, data); 1375 } 1376 return this; 1377 } 1378}); 1379// @todo Is this the right way? 1380jQuery.fn.debug = jQuery.debug; 1381 1382})(jQuery); 1383; 1384(function ($) { 1385 1386 Drupal.form_placeholder = {}; 1387 1388 Drupal.form_placeholder.elementIsSupported = function ($element) { 1389 return $element.is('input[type=text], input[type=date], input[type=email], input[type=url], input[type=tel], input[type=password], textarea'); 1390 }; 1391 1392 Drupal.form_placeholder.placeholderIsSupported = function () { 1393 // Opera Mini v7 doesnât support placeholder although its DOM seems to 1394 // indicate so. 1395 var isOperaMini = Object.prototype.toString.call(window.operamini) == '[object OperaMini]'; 1396 return 'placeholder' in document.createElement('input') && !isOperaMini; 1397 }; 1398 1399 Drupal.behaviors.form_placeholder = { 1400 attach: function (context, settings) {
1401 // In some cases settings after ajax form submit could contain only 1402 // settings from response but not all Drupal.settings data. 1403 if (!settings.hasOwnProperty('form_placeholder')) { 1404 settings = Drupal.settings; 1405 } 1406 var include = settings.form_placeholder.include; 1407 if (include) { 1408 include += ', '; 1409 } 1410 include += '.form-placeholder-include-children *'; 1411 include += ', .form-placeholder-include'; 1412 var exclude = settings.form_placeholder.exclude; 1413 if (exclude) { 1414 exclude += ', '; 1415 } 1416 exclude += '.form-placeholder-exclude-children *'; 1417 exclude += ', .form-placeholder-exclude'; 1418 exclude += ', .form-placeholder-processed'; 1419 1420 var required_indicator = settings.form_placeholder.required_indicator; 1421 1422 $(include).not(exclude).each(function () { 1423 var $textfield = $(this); 1424 var elementSupported = Drupal.form_placeholder.elementIsSupported($textfield); 1425 var placeholderSupported = Drupal.form_placeholder.placeholderIsSupported(); 1426 1427 // Check if element support placeholder attribute. 1428 if (!elementSupported) { 1429 return; 1430 } 1431 // Placeholder is supported. 1432 else if (placeholderSupported || settings.form_placeholder.fallback_support) { 1433 var $form = $textfield.closest('form'); 1434 var $label = $form.find('label[for=' + this.id + ']'); 1435 1436 if (required_indicator === 'append') { 1437 $label.find('.form-required').insertAfter($textfield).prepend(' '); 1438 } 1439 else if (required_indicator === 'remove') { 1440 $label.find('.form-required').remove(); 1441 } 1442 else if (required_indicator === 'text') { 1443 $label.find('.form-required').text('(' + Drupal.t('required') + ')'); 1444 } 1445 1446 if (!$textfield.attr('placeholder')) { 1447 $textfield.attr('placeholder', $.trim($label.text())); 1448 $label.addClass('element-invisible'); 1449 } 1450 1451 // Fallback support for older browsers. 1452 if (!placeholderSupported && settings.form_placeholder.fallback_support) { 1453 $textfield.placeholder(); 1454 } 1455 $textfield.addClass('form-placeholder-processed'); 1456 } 1457 }); 1458 } 1459 }; 1460 1461})(jQuery); 1462;
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.