1var locked = false; 2var currentpercent = 0; 3var startprogress = 30; 4var lastprogval = 0; 5var samecount = 0; 6var errmsg = false; 7var retest = false; 8var normTestId = ""; 9var focussed = false; 10var focussedkw = false; 11var currenttab = ""; 12 13var tables = []; 14 15/** 16 * A selection of IE handling functions. They're not used 17 */ 18// He who wrote this function should be shot. It's difficult to know if it's still used though 19var ie = (function () { 20 var undef, v = 3, div = document.createElement('div'); 21 22 while ( 23 div.innerHTML = '<!--[if gt IE '+(++v)+']><i></i><![endif]-->', 24 div.getElementsByTagName('i')[0] 25 ); 26 27 return v > 4 ? v : undef; 28}()); 29 30function isIE() 31{ 32 return getIeVersion()!==false; 33} 34 35function getIeVersion() 36{ 37 // Test UserAgent for testing that this works against IE8 38 //var userAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)"; 39 var expression = new RegExp(/MSIE (.*?);/); 40 var matches = window.navigator.userAgent.match(expression); 41 42 if (matches) { 43 return Math.floor(matches[1]); 44 } else { 45 return false; 46 } 47} 48 49/** 50 * Loader 51 * 52 * This fires all our initial on page stuff 53 */ 54function loader() { 55 if ( isIE() && getIeVersion() < 9) { 56 $('body').html( 57 '<div style="width: 300px; border: 2px solid #333; padding: 10px; margin: 20px auto 0;">' + 58 '<h1>Out of date browser</h1>' + 59 '<p>It looks like you\'re using an out of date browser (IE 8 or lower). In order to work correctly, Insites requires a modern web browser.</p>' + 60 '<p><a href="https://browser-update.org/update.html">Learn how to update your browser</a></p>' + 61 '</div>' 62 ); 63 return; 64 } 65 66 setupImageLoaders(); 67 setupPriorityTabs(); 68 $('#report').each(reportSetup); 69 setTimeout(checkDynamicImages, 3000); 70 71 // Used by the mobile view 72 //--not sure if this is the best place to put this, it's a plugin that collapses menu items into a "more" tab 73 if (!window.sfIframeView && $(window).width() < 768) { 74 //--do this for mobile only 75 try { 76 $('.block-tabs.summary__tabs').tabdrop(); 77 } catch (e) { 78 } 79 } 80} 81 82/** 83 * Nova report tabs: keep the strip to one row (ENG-10723). 84 * 85 * summary-header.phtml renders every tab in the strip and mirrors each one in 86 * the "..." menu. This measures the strip and hides the trailing tabs that 87 * don't fit the bar's current width, showing their menu entries instead, and 88 * does it again whenever the bar's width changes: a window resize, the side 89 * nav collapsing, the web font arriving. A fixed count can't do that, and a 90 * strip that wraps spills out of the bar and pushes the alert below it sideways. 91 * 92 * Classic-UI strips have no .summary__tabs--priority class and keep their 93 * server-side fixed count. Below 768px the tabs are the fixed mobile bar 94 * (tabdrop), so everything is left visible. 95 */ 96function setupPriorityTabs() 97{ 98 var strip = document.querySelector('ul.summary__tabs--priority'); 99 if (!strip || typeof window.matchMedia !== 'function') { 100 return; 101 } 102 103 var desktop = window.matchMedia('(min-width: 768px)'); 104 var scheduled = false; 105 106 function layout() { 107 scheduled = false; 108 109 var more = strip.querySelector('li.tabs-overflow-menu-button'); 110 var moreButton = more ? more.querySelector('.tabs-overflow-button') : null; 111 if (!more) { 112 return; 113 } 114 115 var tabs = Array.prototype.slice.call(strip.children).filter(function (li) { 116 return li.hasAttribute('data-tab-id'); 117 }); 118 var items = {}; 119 Array.prototype.forEach.call(more.querySelectorAll('.overflow-tab-item[data-tab-id]'), function (item) { 120 items[item.getAttribute('data-tab-id')] = item; 121 }); 122 123 // Start from everything shown, so the measurements are of the full strip.
124 tabs.forEach(function (li) { 125 li.classList.remove('tab-overflowed'); 126 }); 127 Object.keys(items).forEach(function (id) { 128 items[id].classList.remove('overflow-tab-item--shown'); 129 }); 130 more.classList.remove('is-empty'); 131 more.classList.remove('active'); 132 if (moreButton) { 133 moreButton.classList.remove('active'); 134 } 135 136 if (!desktop.matches) { 137 more.classList.add('is-empty'); 138 return; 139 } 140 141 // Only the tabs the desktop strip shows; mobile-only ones are display:none. 142 var visible = tabs.filter(function (li) { 143 return li.offsetParent !== null; 144 }); 145 var widths = visible.map(function (li) { 146 return li.getBoundingClientRect().width; 147 }); 148 var total = widths.reduce(function (sum, w) { return sum + w; }, 0); 149 var available = strip.clientWidth; 150 151 // Half a pixel of slack for sub-pixel rounding. 152 if (total <= available + 0.5) { 153 more.classList.add('is-empty'); 154 return; 155 } 156 157 var fit = available - more.getBoundingClientRect().width; 158 var used = 0; 159 var overflowActive = false; 160 visible.forEach(function (li, i) { 161 used += widths[i]; 162 if (used <= fit + 0.5) { 163 return; 164 } 165 // Once one tab is out, everything after it is too, keeping the order. 166 li.classList.add('tab-overflowed'); 167 var id = li.getAttribute('data-tab-id'); 168 if (items[id]) { 169 items[id].classList.add('overflow-tab-item--shown'); 170 } 171 if (li.classList.contains('active')) { 172 overflowActive = true; 173 } 174 }); 175 176 if (overflowActive) { 177 more.classList.add('active'); 178 if (moreButton) { 179 moreButton.classList.add('active'); 180 } 181 } 182 } 183 184 function schedule() { 185 if (scheduled) { 186 return; 187 } 188 scheduled = true; 189 window.requestAnimationFrame(layout); 190 } 191 192 layout(); 193 194 if (typeof window.ResizeObserver === 'function') { 195 new ResizeObserver(schedule).observe(strip); 196 } else { 197 window.addEventListener('resize', schedule); 198 } 199 if (typeof desktop.addEventListener === 'function') { 200 desktop.addEventListener('change', schedule); 201 } else if (typeof desktop.addListener === 'function') { 202 desktop.addListener(schedule); 203 } 204 if (document.fonts && document.fonts.ready) { 205 document.fonts.ready.then(schedule); 206 } 207} 208 209function imageExists(image_url, callback) 210{ 211 var img = new Image(); 212 img.onload = function() { callback(image_url, true); }; 213 img.onerror = function() { callback(image_url, false); }; 214 img.src = image_url; 215} 216 217function setupImageLoaders() 218{ 219 $('*[data-imagewhenready]').each(function() { 220 var imageurl = $(this).attr('data-imagewhenready'); 221 imageExists(imageurl, function(imageurl, exists) { 222 if(exists) 223 { 224 $('*[data-imagewhenready="'+imageurl+'"]').after('<img src="'+imageurl+'">'); 225 $('*[data-imagewhenready="'+imageurl+'"]').remove(); 226 } 227 }); 228 }); 229 if($('*[data-imagewhenready]').length > 0) 230 { 231 setTimeout(setupImageLoaders, 10000); 232 } 233} 234 235function doSetCaretPosition (oField, iCaretPos) { 236 237 // IE Support 238 if (isIE() && document.selection) { 239 // Set focus on the element 240 oField.focus (); 241 242 // Create empty selection range 243 var oSel = document.selection.createRange (); 244 245 // Move selection start and end to 0 position 246 oSel.moveStart ('character', -oField.value.length); 247 248 // Move selection start and end to desired position 249 oSel.moveStart ('character', iCaretPos); 250 oSel.moveEnd ('character', 0); 251 oSel.select (); 252 } 253 254 // Firefox support 255 else if (oField.selectionStart || oField.selectionStart == '0') { 256 oField.selectionStart = iCaretPos; 257 oField.selectionEnd = iCaretPos; 258 oField.focus (); 259 } 260 else {} 261} 262 263function closeHelp() 264{ 265 $(this).parents('.report-help-popup').slideToggle(400, function(){ $.waypoints('refresh'); }); 266 return false;
267} 268 269function switchHelp() 270{ 271 $(this).parent().siblings('.report-help-popup').slideToggle(400, function(){ $.waypoints('refresh'); }); 272 return false; 273} 274 275function checkDynamicImages() 276{ 277 $('.image-dynamic-load').each(function() { 278 var idfield = $(this).attr("id").replace("p_", ""); 279 $(this).after( 280 '<img id="'+idfield+'" style="display: none;" '+ 281 'src="'+$(this).data('src')+'" '+ 282 'alt="'+$(this).data('alt')+'" '+ 283 'width="'+$(this).data('width')+'" '+ 284 'height="'+$(this).data('height')+'" '+ 285 'class="'+$(this).attr('class')+'" />'); 286 287 $(this).siblings('#'+idfield).load(function(){ 288 $(this).show(); 289 $(this).removeClass('image-dynamic-load'); 290 $('#p_'+$(this).attr("id")).remove(); 291 }); 292 $(this).siblings('#'+idfield).error(function(){ 293 $(this).remove(); 294 }); 295 }); 296 297 //If there are any left, then run this again 298 if($('.image-dynamic-load').length > 0){ 299 setTimeout(checkDynamicImages, 6000); 300 } 301} 302 303var reportSetup = function() { 304 305 function sidebarCTA() { 306 $('#inboundSidebarCta').detach().appendTo('.sidebar'); 307 } 308 309 function oldDetailScrolling() { 310 // if #hash in url, trigger a click on its related link. 311 var hash = window.location.hash; 312 if (hash) { 313 $('a[href=' + hash + ']').trigger('click'); 314 } 315 316 var tabs = $('.report-tab'), 317 selectedLinks = $('.nav-sidebar li a, .nav-sidebar li'); 318 319 var $sidebarReport = $(".sidebar--report"), 320 $report = $("#report"), 321 sidebarReportHeight = $sidebarReport.height(); 322 323 $(window).on('scroll', _.throttle(function () { 324 var reportHeight = $report.height(); 325 var reportOffset = $report.offset(); 326 var reportEnd = reportHeight + reportOffset.top; 327 var overscrollSidebarTop = reportHeight - sidebarReportHeight; 328 329 if (sidebarReportHeight + window.scrollY > reportEnd) { 330 $sidebarReport.removeClass("sidebar--fixed"); 331 $sidebarReport.css("top", overscrollSidebarTop + "px"); 332 } else if (sidebarReportHeight < window.innerHeight && $report.offset().top - 5 < window.scrollY) { 333 $sidebarReport.addClass("sidebar--fixed"); 334 $sidebarReport.css("top", ""); 335 } else { 336 $sidebarReport.removeClass("sidebar--fixed"); 337 $sidebarReport.css("top", ""); 338 } 339 340 tabs.each(function (idx, tab) { 341 tab = $(tab); 342 if (tab.offset().top > window.scrollY) { 343 var id = tab.attr('id'); 344 var link = $('a[href="#' + id + '"]'); 345 selectedLinks.removeClass('selected'); 346 link.addClass('selected'); 347 link.parent().addClass('selected'); 348 return false; // break loop 349 } 350 }); 351 }, 50)); 352 } 353 354 function changeReportTab() { 355 var currenttab, 356 nohash; 357 358 $('.nav-sidebar--tests li a').each(function () { 359 if (!window._report.presentationmode) { 360 $($(this).attr("href")).addClass('hidden-sm hidden-md hidden-lg'); 361 } 362 $(this).parent().removeClass("selected"); 363 }); 364 currenttab = $(this).attr('href'); 365 nohash = currenttab.replace("#", ""); 366 367 if (typeof window._isIE === 'undefined') { 368 history.pushState(null, null, currenttab); 369 } 370 371 if (window._report.presentationmode) { 372 scrollToAnchor(nohash); 373 } 374 375 $("#Nav_" + nohash).addClass("selected").parent().addClass("selected"); 376 377 if (!window._report.presentationmode) { 378 $(currenttab).removeClass('hidden-sm hidden-md hidden-lg'); 379 } 380 381 $(this).blur(); 382 return false; 383 } 384 385 function oldDetailSideMenu() { 386 $('.nav-sidebar--tests li a').click(changeReportTab); 387 $('.reportablink').click(changeReportTab); 388 389 if (window.location.hash) { 390 $(window.location.hash).removeClass('hidden-sm hidden-md hidden-lg');
391 $("#Nav_" + window.location.hash.replace("#", "")).addClass("selected"); 392 window.scrollTo(0, 0); // execute it straight away 393 setTimeout(function () { 394 window.scrollTo(0, 0); // run it a bit later also for browser compatibility 395 }, 1); 396 } else { 397 var id = $('.report-tab').first().removeClass('hidden-sm hidden-md hidden-lg').attr('id'); 398 $("#Nav_" + id).addClass("selected").parent().addClass("selected"); 399 } 400 401 402 if (window._report.presentationmode) { 403 $('#report .report-tab').each(function () { 404 $(this).waypoint(function (direction) { 405 var sel; 406 if (direction == "down") { 407 sel = $(this).attr('id'); 408 } else { 409 sel = $(this).prev().attr('id') 410 } 411 $('#report-navigation li').removeClass('selectedoption'); 412 if ($('#report-navigation #Nav_' + sel).length != 1) { 413 sel = "summary"; 414 } 415 $('#report-navigation #Nav_' + sel).addClass('selectedoption'); 416 }, {offset: '10%'}); 417 }); 418 } 419 420 makeTables(); 421 $('.report-tab ul ul').each(function () { 422 $(this).before(' <span class="report-showsolution link-expand">' + strings['Show recommendations'] + '</a>'); 423 $(this).parent().find('.report-showsolution').click(expandPoint); 424 $(this).hide(); 425 }); 426 setupHelp(); 427 428 429 function makeTables() { 430 $(".multiUrl").each(function () { 431 var conts = $(this).html(), 432 urls = conts.split(","), 433 newcontent = ""; 434 435 for (var x = 0; x < urls.length; x++) { 436 if (x != 0) { 437 newcontent = newcontent + "<br />"; 438 } 439 newcontent = newcontent + "<a class=\"url\" href=\"" + urls[x] + "\">" + shortenURL(urls[x]) + "</a>"; 440 } 441 $(this).html(newcontent); 442 }); 443 444 $(".data").each(function () { 445 var id = $(this).attr("id"); 446 var autohide = $("#l" + id).hasClass('autohide'); 447 tables[tables.length] = [id, id, makeTable(id, autohide)]; 448 }); 449 }; 450 451 function makeTable(tableId, autohide) { 452 var x, i; 453 //Get the headers from the table 454 var hdrs = $("#" + tableId + " thead tr td").get(); 455 var rows = $("#" + tableId + " tbody tr").get(); 456 var byCol = []; 457 458 for (x = 0; x < rows.length; x++) { 459 for (i = 0; i < rows[x].children.length; i++) { 460 if (byCol[i] === undefined) { 461 byCol[i] = []; 462 } 463 byCol[i].push(rows[x].children[i].innerHTML); 464 } 465 } 466 467 var myColumnDefs = []; 468 469 var myDataSource = new YAHOO.util.DataSource(YAHOO.util.Dom.get(tableId)); 470 myDataSource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE; 471 myDataSource.responseSchema = {}; 472 myDataSource.responseSchema.fields = []; 473 var sortBy = ""; 474 var len = hdrs.length; 475 476 for (i = 0; i < len; i++) { 477 var hdr = hdrs[i]; 478 var cntnt = $(hdr).html(); 479 480 myColumnDefs[i] = { 481 key: cntnt, 482 label: cntnt, 483 sortable: (tableId != "testsTable") 484 }; 485 486 myDataSource.responseSchema.fields[i] = { 487 key: cntnt 488 }; 489 490 var isNum = true; 491 if (byCol[i] != undefined) { 492 for (x = 0; x < byCol[i].length; x++) { 493 if (isNaN(parseFloat(byCol[i][x])) || !isFinite(byCol[i][x])) { 494 isNum = false; 495 break; 496 } 497 } 498 } 499 500 if (isNum) { 501 myDataSource.responseSchema.fields[i]["parser"] = "number"; 502 } 503 504 if (i == hdrs.length - 1) { 505 sortBy = cntnt; 506 } 507 } 508 509 var oConfigs = {}; 510 511 if (tableId != "testsTable") { 512 var pag = new YAHOO.widget.Paginator( 513 { 514 rowsPerPage: 10, 515 alwaysVisible: false 516 } 517 ); 518 oConfigs = { 519 paginator: pag 520 }; 521 } 522 else { 523 524 } 525 526 var myDataTable = new YAHOO.widget.DataView("c" + tableId, myColumnDefs, myDataSource, oConfigs); 527 myDataTable.subscribe('renderEvent', function () { 528 529 530 }); 531 532 if ($("#t" + tableId).parents('.solution').length == 0 && autohide) { 533 titleText = $("#t" + tableId).hide().html(); 534 $("#l" + tableId).html("<a id=\"sh" + tableId + "\" class=\"link-expand\" href=\"#\" onclick=\"return switchTable('" + tableId + "', '" + titleText + "');\">" + titleText + "</a>"); 535 $("#c" + tableId).hide(); 536 } 537 538 return myDataTable; 539 } 540 541 function setupHelp() { 542 $('.report-help-link a').click(doHelp); 543 } 544 545 function doHelp() { 546 $.ajax({ 547 url: $(this).attr("href"), 548 context: this, 549 success: function (data) { 550 //Copy the contribution text from the test into the help div. 551 var element = $(this).parents('.report-tab').find('.score-contrib'); 552 var contributionText = ''; 553 if (element.length > 0) { 554 contributionText = '<p class="text-right"><strong>' + element.html() + '</strong></p>'; 555 } 556 $(this).parent().after('<div class="report-help-popup"><div class="report-help-popup-inner">
556' + data + contributionText + '<p class="closehelp"><a href="#"><span>' + strings['Close help'] + '</span></a></p></div></div>'); 557 $(this).parent().siblings('.report-help-popup').find('.closehelp a').click(closeHelp); 558 $(this).parent().siblings('.report-help-popup').slideDown(400, function () { 559 $.waypoints('refresh'); 560 }); 561 } 562 }); 563 $(this).unbind(); 564 $(this).click(switchHelp); 565 return false; 566 } 567 568 function expandPoint() { 569 if ($(this).hasClass('link-expand')) { 570 $(this).siblings('ul').slideDown(400, function () { 571 $.waypoints('refresh'); 572 }); 573 $(this).html(strings['Close recommendations']); 574 $(this).removeClass('link-expand'); 575 $(this).addClass('link-collapse'); 576 } else { 577 $(this).siblings('ul').slideUp(400, function () { 578 $.waypoints('refresh'); 579 }); 580 $(this).html(strings['Show recommendations']); 581 $(this).removeClass('link-collapse'); 582 $(this).addClass('link-expand'); 583 } 584 } 585 } 586 587 return function(){ 588 sidebarCTA(); 589 590 // If it's not in presentation mode, we want to hide things by default 591 if (window._report && !window._report.presentationmode) { 592 $('.report-tab').addClass('hidden-sm hidden-md hidden-lg'); 593 } 594 } 595}(); 596 597 598function downloadPDF() 599{ 600 _gaq.push(['_trackEvent', 'Report', $(this).attr('id'), $('#report-header h1 a').html()]); 601} 602 603function scrollToAnchor(aid){ 604 var aTag = $("#"+aid); 605 $('html,body').animate({scrollTop: aTag.offset().top -30},800, "swing"); 606} 607 608function expandRecommendations() 609{ 610 $(this).parent().children('li ul').parent().each(hideRecommendations); 611 $(this).unbind('click').click(hideRecommendations).children('ul').slideDown(400, function(){ $.waypoints('refresh'); }); 612 $(this).animate({backgroundColor: '#EEEEEE'}); 613 $(this).children('.report-showsolution').html(strings['Hide solution']); 614 return false; 615} 616function hideRecommendations() 617{ 618 $(this).unbind('click').click(expandRecommendations).children('ul').slideUp(400, function(){ $.waypoints('refresh'); }); 619 $(this).animate({backgroundColor: '#FFFFFF'}); 620 $(this).children('.report-showsolution').html(strings['Show solution']); 621} 622 623 624function switchTable(tableId) 625{ 626 if($("#sh"+tableId).hasClass("link-expand")) 627 { 628 $("#sh"+tableId).removeClass("link-expand").addClass("link-collapse").blur(); 629 } else { 630 $("#sh"+tableId).removeClass("link-collapse").addClass("link-expand").blur(); 631 } 632 633 $("#c"+tableId).slideToggle("slow"); 634 return false; 635} 636 637function shortenURL(url) 638{ 639 //return url; 640 var myregexp = new RegExp(/(https?):\/\/([-\w\.]+)+(:\d+)?(\/(([\w\/_\-\.]*)(\?\S+)?)?)?/gi), 641 matches = myregexp.exec(url), 642 prefix = ".../", 643 thisurl = $("#reporturl").attr("href"), 644 paramstring, 645 newstr, 646 pathstring, 647 newparamstring, 648 newpathstring; 649 650 if(matches != null) { 651 if(thisurl == matches[1] + "://" + matches[2]) { 652 prefix = "/"; 653 } else { 654 prefix = matches[2] + "/"; 655 } 656 657 if(matches[7] != null) { 658 paramstring = matches[7]; 659 } else { 660 paramstring = ""; 661 } 662 663 if(matches[6] != null) { 664 pathstring = matches[6]; 665 } else { 666 pathstring = ""; 667 } 668 newstr = prefix + pathstring + paramstring; 669 if(newstr.length == 0) { 670 return url; 671 } 672 673 if(newstr.length <= 30) { 674 return newstr;// + "1"; 675 } 676 677 if(pathstring.substr(pathstring.length-1, 1) == "/") { 678 pathstring = pathstring.substr(0, pathstring.length-1); 679 } 680 681 newparamstring = firstandlast(paramstring, "&"); 682 newpathstring = firstandlast(pathstring, "/"); 683 684 newstr = prefix + newpathstring + newparamstring; 685 if(newstr.length <= 40) { 686 return newstr;// + "2"; 687 } 688 689 newparamstring = justlast(paramstring, "&"); 690 newpathstring = justlast(pathstring, "/"); 691 692 newstr = prefix + newpathstring + newparamstring; 693 return newstr;// + "3"; 694 } 695} 696 697function firstandlast(string, seperator) 698{ 699 var parts = string.split(seperator); 700 701 if(parts.length >= 3) 702 { 703 return parts[0]+seperator+"..."+seperator+parts[parts.length-1]; 704 } else { 705 return string; 706 } 707} 708 709function justlast(string, seperator) 710{ 711 var parts = string.split(seperator); 712 713 if(parts.length >= 3) 714 { 715 return "..."+seperator+parts[parts.length-1]; 716 } else { 717 return string; 718 } 719} 720 721function formatCurrency(num) 722{
723 return parseFloat(num, 10).toLocaleString(window._hsSettings.locale.alt, { 724 style: "currency", 725 currency: window._hsSettings.currencyCode, 726 minimumFractionDigits: 2, 727 maximumFractionDigits: 2 728 }); 729} 730 731 732$.fn.setCursorPosition = function(position){ 733 if(this.length == 0) return this; 734 return $(this).setSelection(position, position); 735}; 736 737$.fn.setSelection = function(selectionStart, selectionEnd) { 738 if(this.length == 0) return this; 739 input = this[0]; 740 741 if (input.createTextRange) { 742 var range = input.createTextRange(); 743 range.collapse(true); 744 range.moveEnd('character', selectionEnd); 745 range.moveStart('character', selectionStart); 746 range.select(); 747 } else if (input.setSelectionRange) { 748 input.focus(); 749 input.setSelectionRange(selectionStart, selectionEnd); 750 } 751 752 return this; 753}; 754 755$.fn.focusEnd = function(){ 756 this.setCursorPosition(this.val().length); 757 return this; 758}; 759 760/** 761 * Event Abstraction that fires events to both Intercom and Google Analytics 762 * @param event 763 * @param metadata 764 */ 765function addEvent(event, metadata) 766{ 767 if(typeof ga !== 'undefined') { 768 ga('silktide.send', 'event', 'UserInteraction', event); 769 } 770 if (window.Intercom !== undefined) { 771 if (metadata && metadata instanceof Object) { 772 Intercom('trackEvent', event, metadata); 773 } else { 774 Intercom('trackEvent', event); 775 } 776 } 777} 778 779/** 780 * A stupid global function that GoogleMaps will call if permission was denied for that API key 781 * I don't know why they did it this way, but so be it. 782 */ 783function gm_authFailure() { 784 window.gmapsPermissionDenied = true; 785} 786 787 788$(document).ready(loader);
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.