1// https://purecss.io/js/menus.js 2(function (window, document) { 3 'use strict'; 4 5 // Enable drop-down menus in Pure 6 // Inspired by YUI3 gallery-simple-menu by Julien LeComte 7 // [https://github.com/yui/yui3-gallery/blob/master/src/gallery-simple-menu/js/simple-menu.js] 8 9 function PureDropdown(dropdownParent) { 10 11 var PREFIX = 'pure-', 12 ACTIVE_CLASS_NAME = PREFIX + 'menu-active', 13 ARIA_ROLE = 'role', 14 ARIA_HIDDEN = 'aria-hidden', 15 MENU_OPEN = 0, 16 MENU_CLOSED = 1, 17 MENU_PARENT_CLASS_NAME = 'pure-menu-has-children', 18 MENU_ACTIVE_SELECTOR = '.pure-menu-active', 19 MENU_LINK_SELECTOR = '.pure-menu-link', 20 MENU_SELECTOR = '.pure-menu-children', 21 DISMISS_EVENT = (window.hasOwnProperty && 22 window.hasOwnProperty('ontouchstart')) ? 23 'touchstart' : 'mousedown', 24 25 ARROW_KEYS_ENABLED = true, 26 27 ddm = this; // drop down menu 28 29 this._state = MENU_CLOSED; 30 31 this.show = function () { 32 if (this._state !== MENU_OPEN) { 33 this._dropdownParent.classList.add(ACTIVE_CLASS_NAME); 34 this._menu.setAttribute(ARIA_HIDDEN, false); 35 this._state = MENU_OPEN; 36 } 37 }; 38 39 this.hide = function () { 40 if (this._state !== MENU_CLOSED) { 41 this._dropdownParent.classList.remove(ACTIVE_CLASS_NAME); 42 this._menu.setAttribute(ARIA_HIDDEN, true); 43 this._link.focus(); 44 this._state = MENU_CLOSED; 45 } 46 }; 47 48 this.toggle = function () { 49 this[this._state === MENU_CLOSED ? 'show' : 'hide'](); 50 }; 51 52 this.halt = function (e) { 53 e.stopPropagation(); 54 e.preventDefault(); 55 }; 56 57 this._dropdownParent = dropdownParent; 58 this._link = this._dropdownParent.querySelector(MENU_LINK_SELECTOR); 59 this._menu = this._dropdownParent.querySelector(MENU_SELECTOR); 60 this._firstMenuLink = this._menu.querySelector(MENU_LINK_SELECTOR); 61 62 // Set ARIA attributes 63 this._link.setAttribute('aria-haspopup', 'true'); 64 this._menu.setAttribute(ARIA_ROLE, 'menu'); 65 this._menu.setAttribute('aria-labelledby', this._link.getAttribute('id')); 66 this._menu.setAttribute('aria-hidden', 'true'); 67 [].forEach.call( 68 this._menu.querySelectorAll('li'), 69 function(el){ 70 el.setAttribute(ARIA_ROLE, 'presentation'); 71 } 72 ); 73 [].forEach.call( 74 this._menu.querySelectorAll('a'), 75 function(el){ 76 el.setAttribute(ARIA_ROLE, 'menuitem'); 77 } 78 ); 79 80 // Toggle on click 81 this._link.addEventListener('click', function (e) { 82 e.stopPropagation(); 83 e.preventDefault(); 84 ddm.toggle(); 85 }); 86 87 // Keyboard navigation 88 document.addEventListener('keydown', function (e) { 89 var currentLink, 90 previousSibling, 91 nextSibling, 92 previousLink, 93 nextLink; 94 95 // if the menu isn't active, ignore 96 if (ddm._state !== MENU_OPEN) { 97 return; 98 } 99 100 // if the menu is the parent of an open, active submenu, ignore 101 if (ddm._menu.querySelector(MENU_ACTIVE_SELECTOR)) { 102 return; 103 } 104 105 currentLink = ddm._menu.querySelector(':focus'); 106 107 // Dismiss an open menu on ESC 108 if (e.keyCode === 27) { 109 /* Esc */ 110 ddm.halt(e); 111 ddm.hide(); 112 } 113 // Go to the next link on down arrow 114 else if (ARROW_KEYS_ENABLED && e.keyCode === 40) { 115 /* Down arrow */ 116 ddm.halt(e); 117 // get the nextSibling (an LI) of the current link's LI 118 nextSibling = (currentLink) ? currentLink.parentNode.nextSibling : null; 119 // if the nextSibling is a text node (not an element), go to the next one 120 while (nextSibling && nextSibling.nodeType !== 1) { 121 nextSibling = nextSibling.nextSibling; 122 } 123 nextLink = (nextSibling) ? nextSibling.querySelector('.pure-menu-link') : null; 124 // if there is no currently focused link, focus the first one 125 if (!currentLink) { 126 ddm._menu.querySelector('.pure-menu-link').focus(); 127 } 128 else if (nextLink) { 129 nextLink.focus(); 130 } 131 } 132 // Go to the previous link on up arrow 133 else if (ARROW_KEYS_ENABLED && e.keyCode === 38) { 134 /* Up arrow */ 135 ddm.halt(e); 136 // get the currently focused link 137 previousSibling = (currentLink) ? currentLink.parentNode.previousSibling : null; 138 while (previousSibling && previousSibling.nodeType !== 1) { 139 previousSibling = previousSibling.previousSibling; 140 } 141 previousLink = (previousSibling) ? previousSibling.querySelector('.pure-menu-link') : null; 142 // if there is no currently focused link, focus the last link 143 if (!currentLink) { 144 ddm._menu.querySelector('.pure-menu-item:last-child .pure-menu-link').focus(); 145 } 146 // else if there is a previous item, go to the previous item 147 else if (previousLink) { 148 previousLink.focus(); 149 } 150 } 151 }); 152 153 // Dismiss an open menu on outside event
154 document.addEventListener(DISMISS_EVENT, function (e) { 155 var target = e.target; 156 if (target !== ddm._link && !ddm._menu.contains(target)) { 157 ddm.hide(); 158 ddm._link.blur(); 159 } 160 }); 161 162 } 163 164 function initDropdowns() { 165 var dropdownParents = document.querySelectorAll('.pure-menu-has-children'); 166 for (var i = 0; i < dropdownParents.length; i++) { 167 var ddm = new PureDropdown(dropdownParents[i]); 168 } 169 } 170 171 initDropdowns(); 172 173}(this, this.document)); 174/** 175 * jQuery Bar Rating Plugin v1.2.2 176 * 177 * http://github.com/antennaio/jquery-bar-rating 178 * 179 * Copyright (c) 2012-2016 Kazik Pietruszewski 180 * 181 * This plugin is available under the MIT license. 182 * http://www.opensource.org/licenses/mit-license.php 183 */
vendor: 19,520 bytes, lines 184-759
184 185(function (factory) { 186 if (typeof define === 'function' && define.amd) { 187 // AMD 188 define(['jquery'], factory); 189 } else if (typeof module === 'object' && module.exports) { 190 // Node/CommonJS 191 module.exports = factory(require('jquery')); 192 } else { 193 // browser globals 194 factory(jQuery); 195 } 196}(function ($) { 197 198 var BarRating = (function() { 199 200 function BarRating() { 201 var self = this; 202 203 // wrap element in a wrapper div 204 var wrapElement = function() { 205 var classes = ['br-wrapper']; 206 207 if (self.options.theme !== '') { 208 classes.push('br-theme-' + self.options.theme); 209 } 210 211 self.$elem.wrap($('<div />', { 212 'class': classes.join(' ') 213 })); 214 }; 215 216 // unwrap element 217 var unwrapElement = function() { 218 self.$elem.unwrap(); 219 }; 220 221 // find option by value 222 var findOption = function(value) { 223 if ($.isNumeric(value)) { 224 value = Math.floor(value); 225 } 226 227 return $('option[value="' + value + '"]', self.$elem); 228 }; 229 230 // get initial option 231 var getInitialOption = function() { 232 var initialRating = self.options.initialRating; 233 234 if (!initialRating) { 235 return $('option:selected', self.$elem); 236 } 237 238 return findOption(initialRating); 239 }; 240 241 // get empty option 242 var getEmptyOption = function() { 243 var $emptyOpt = self.$elem.find('option[value="' + self.options.emptyValue + '"]'); 244 245 if (!$emptyOpt.length && self.options.allowEmpty) { 246 $emptyOpt = $('<option />', { 'value': self.options.emptyValue }); 247 248 return $emptyOpt.prependTo(self.$elem); 249 } 250 251 return $emptyOpt; 252 }; 253 254 // get data 255 var getData = function(key) { 256 var data = self.$elem.data('barrating'); 257 258 if (typeof key !== 'undefined') { 259 return data[key]; 260 } 261 262 return data; 263 }; 264 265 // set data 266 var setData = function(key, value) { 267 if (value !== null && typeof value === 'object') { 268 self.$elem.data('barrating', value); 269 } else { 270 self.$elem.data('barrating')[key] = value; 271 } 272 }; 273 274 // save data on element 275 var saveDataOnElement = function() { 276 var $opt = getInitialOption(); 277 var $emptyOpt = getEmptyOption(); 278 279 var value = $opt.val(); 280 var text = $opt.data('html') ? $opt.data('html') : $opt.text(); 281 282 // if the allowEmpty option is not set let's check if empty option exists in the select field 283 var allowEmpty = (self.options.allowEmpty !== null) ? 284 self.options.allowEmpty : 285 !!$emptyOpt.length; 286 287 var emptyValue = ($emptyOpt.length) ? $emptyOpt.val() : null; 288 var emptyText = ($emptyOpt.length) ? $emptyOpt.text() : null; 289 290 setData(null, { 291 userOptions: self.options, 292 293 // initial rating based on the OPTION value 294 ratingValue: value, 295 ratingText: text, 296 297 // rating will be restored by calling clear method 298 originalRatingValue: value, 299 originalRatingText: text, 300 301 // allow empty ratings? 302 allowEmpty: allowEmpty, 303 304 // rating value and text of the empty OPTION 305 emptyRatingValue: emptyValue, 306 emptyRatingText: emptyText, 307 308 // read-only state 309 readOnly: self.options.readonly, 310 311 // did the user already select a rating? 312 ratingMade: false 313 }); 314 }; 315 316 // remove data on element 317 var removeDataOnElement = function() { 318 self.$elem.removeData('barrating'); 319 }; 320 321 // return current rating text 322 var ratingText = function() { 323 return getData('ratingText'); 324 }; 325 326 // return current rating value 327 var ratingValue = function() { 328 return getData('ratingValue'); 329 }; 330 331 // build widget and return jQuery element 332 var buildWidget = function() { 333 var $w = $('<div />', { 'class': 'br-widget' }); 334 335 // create A elements that will replace OPTIONs 336 self.$elem.find('option').each(function() { 337 var val, text, html, $a; 338 339 val = $(this).val(); 340 341 // create ratings - but only if val is not defined as empty 342 if (val !== getData('emptyRatingValue')) { 343 text = $(this).text(); 344 html = $(this).data('html'); 345 if (html) { text = html; } 346 347 $a = $('<a />', { 348 'href': '#', 349 'data-rating-value': val, 350 'data-rating-text': text, 351 'html': (self.options.showValues) ? text : '' 352 }); 353 354 $w.append($a); 355 } 356 357 }); 358 359 // append .br-current-rating div to the widget 360 if (self.options.showSelectedRating) { 361 $w.append($('<div />', { 'text': '', 'class': 'br-current-rating' })); 362 } 363 364 // additional classes for the widget 365 if (self.options.reverse) { 366 $w.addClass('br-reverse'); 367 } 368 369 if (self.options.readonly) { 370 $w.addClass('br-readonly'); 371 } 372 373 return $w; 374 }; 375 376 // return a jQuery function name depending on the 'reverse' setting 377 var nextAllorPreviousAll = function() { 378 if (getData('userOptions').reverse) { 379 return 'nextAll'; 380 } else { 381 return 'prevAll'; 382 } 383 }; 384 385 // set the value of the select field 386 var setSelectFieldValue = function(value) { 387 // change selected option 388 findOption(value).prop('selected', true); 389 390 self.$elem.change(); 391 }; 392 393 // reset select field 394 var resetSelectField = function() { 395 $('option', self.$elem).prop('selected', function() { 396 return this.defaultSelected; 397 }); 398 399 self.$elem.change(); 400 }; 401 402 // display the currently selected rating 403 var showSelectedRating = function(text) { 404 // text undefined? 405 text = text ? text : ratingText(); 406 407 // special case when the selected rating is defined as empty 408 if (text == getData('emptyRatingText')) { 409 text = ''; 410 } 411 412 // update .br-current-rating div 413 if (self.options.showSelectedRating) { 414 self.$elem.parent().find('.br-current-rating').text(text); 415 } 416 }; 417 418 // return rounded fraction of a value (14.4 -> 40, 0.99 -> 90) 419 var fraction = function(value) { 420 return Math.round(((Math.floor(value * 10) / 10) % 1) * 100); 421 }; 422 423 // remove all classes from elements 424 var resetStyle = function() { 425 // remove all classes starting with br-* 426 self.$widget.find('a').removeClass(function(index, classes) { 427 return (classes.match(/(^|\s)br-\S+/g) || []).join(' '); 428 }); 429 }; 430 431 // apply style by setting classes on elements 432 var applyStyle = function() { 433 var $a = self.$widget.find('a[data-rating-value="' + ratingValue() + '"]'); 434 var initialRating = getData('userOptions').initialRating; 435 var baseValue = $.isNumeric(ratingValue()) ? ratingValue() : 0; 436 var f = fraction(initialRating); 437 var $all, $fractional; 438 439 resetStyle(); 440 441 // add classes 442 $a.addClass('br-selected br-current')[nextAllorPreviousAll()]() 443 .addClass('br-selected'); 444 445 if (!getData('ratingMade') && $.isNumeric(initialRating)) { 446 if ((initialRating <= baseValue) || !f) { 447 return; 448 } 449 450 $all = self.$widget.find('a'); 451 452 $fractional = ($a.length) ? 453 $a[(getData('userOptions').reverse) ? 'prev' : 'next']() : 454 $all[(getData('userOptions').reverse) ? 'last' : 'first'](); 455 456 $fractional.addClass('br-fractional'); 457 $fractional.addClass('br-fractional-' + f); 458 } 459 }; 460 461 // check if the element is deselectable? 462 var isDeselectable = function($element) { 463 if (!getData('allowEmpty') || !getData('userOptions').deselectable) { 464 return false; 465 } 466 467 return (ratingValue() == $element.attr('data-rating-value')); 468 }; 469 470 // handle click events 471 var attachClickHandler = function($elements) { 472 $elements.on('click.barrating', function(event) { 473 var $a = $(this), 474 options = getData('userOptions'), 475 value, 476 text; 477 478 event.preventDefault(); 479 480 value = $a.attr('data-rating-value'); 481 text = $a.attr('data-rating-text'); 482 483 // is current and deselectable? 484 if (isDeselectable($a)) { 485 value = getData('emptyRatingValue'); 486 text = getData('emptyRatingText'); 487 } 488 489 // remember selected rating 490 setData('ratingValue', value); 491 setData('ratingText', text); 492 setData('ratingMade', true); 493 494 setSelectFieldValue(value); 495 showSelectedRating(text); 496 497 applyStyle(); 498 499 // onSelect callback 500 options.onSelect.call( 501 self, 502 ratingValue(), 503 ratingText(), 504 event 505 ); 506 507 return false; 508 }); 509 }; 510 511 // handle mouseenter events 512 var attachMouseEnterHandler = function($elements) { 513 $elements.on('mouseenter.barrating', function() { 514 var $a = $(this); 515 516 resetStyle(); 517 518 $a.addClass('br-active')[nextAllorPreviousAll()]() 519 .addClass('br-active'); 520 521 showSelectedRating($a.attr('data-rating-text')); 522 }); 523 }; 524 525 // handle mouseleave events 526 var attachMouseLeaveHandler = function($elements) { 527 self.$widget.on('mouseleave.barrating blur.barrating', function() { 528 showSelectedRating(); 529 applyStyle(); 530 }); 531 }; 532 533 // somewhat primitive way to remove 300ms click delay on touch devices 534 // for a more advanced solution consider setting `fastClicks` option to false 535 // and using a library such as fastclick (https://github.com/ftlabs/fastclick) 536 var fastClicks = function($elements) { 537 $elements.on('touchstart.barrating', function(event) { 538 event.preventDefault(); 539 event.stopPropagation(); 540 541 $(this).click(); 542 }); 543 }; 544 545 // disable clicks 546 var disableClicks = function($elements) { 547 $elements.on('click.barrating', function(event) { 548 event.preventDefault(); 549 }); 550 }; 551 552 var attachHandlers = function($elements) { 553 // attach click event handler 554 attachClickHandler($elements); 555 556 if (self.options.hoverState) { 557 // attach mouseenter event handler 558 attachMouseEnterHandler($elements); 559 560 // attach mouseleave event handler 561 attachMouseLeaveHandler($elements); 562 } 563 }; 564 565 var detachHandlers = function($elements) { 566 // remove event handlers in the ".barrating" namespace 567 $elements.off('.barrating'); 568 }; 569 570 var setupHandlers = function(readonly) { 571 var $elements = self.$widget.find('a'); 572 573 if (fastClicks) { 574 fastClicks($elements); 575 } 576 577 if (readonly) { 578 detachHandlers($elements); 579 disableClicks($elements); 580 } else { 581 attachHandlers($elements); 582 } 583 }; 584 585 this.show = function() { 586 // run only once 587 if (getData()) return; 588 589 // wrap element 590 wrapElement(); 591 592 // save data 593 saveDataOnElement(); 594 595 // build & append widget to the DOM 596 self.$widget = buildWidget(); 597 self.$widget.insertAfter(self.$elem); 598 599 applyStyle(); 600 601 showSelectedRating(); 602 603 setupHandlers(self.options.readonly); 604 605 // hide the select field 606 self.$elem.hide(); 607 }; 608 609 this.readonly = function(state) { 610 if (typeof state !== 'boolean' || getData('readOnly') == state) return; 611 612 setupHandlers(state); 613 setData('readOnly', state); 614 self.$widget.toggleClass('br-readonly'); 615 }; 616 617 this.set = function(value) { 618 var options = getData('userOptions'); 619 620 if (self.$elem.find('option[value="' + value + '"]').length === 0) return; 621 622 // set data 623 setData('ratingValue', value); 624 setData('ratingText', self.$elem.find('option[value="' + value + '"]').text()); 625 setData('ratingMade', true); 626 627 setSelectFieldValue(ratingValue()); 628 showSelectedRating(ratingText()); 629 630 applyStyle(); 631 632 // onSelect callback 633 if (!options.silent) { 634 options.onSelect.call( 635 this, 636 ratingValue(), 637 ratingText() 638 ); 639 } 640 }; 641 642 this.clear = function() { 643 var options = getData('userOptions'); 644 645 // restore original data 646 setData('ratingValue', getData('originalRatingValue')); 647 setData('ratingText', getData('originalRatingText')); 648 setData('ratingMade', false); 649 650 resetSelectField(); 651 showSelectedRating(ratingText()); 652 653 applyStyle(); 654 655 // onClear callback 656 options.onClear.call( 657 this, 658 ratingValue(), 659 ratingText() 660 ); 661 }; 662 663 this.destroy = function() { 664 var value = ratingValue(); 665 var text = ratingText(); 666 var options = getData('userOptions'); 667 668 // detach handlers 669 detachHandlers(self.$widget.find('a')); 670 671 // remove widget 672 self.$widget.remove(); 673 674 // remove data 675 removeDataOnElement(); 676 677 // unwrap the element 678 unwrapElement(); 679 680 // show the element 681 self.$elem.show(); 682 683 // onDestroy callback 684 options.onDestroy.call( 685 this, 686 value, 687 text 688 ); 689 }; 690 } 691 692 BarRating.prototype.init = function (options, elem) { 693 this.$elem = $(elem); 694 this.options = $.extend({}, $.fn.barrating.defaults, options); 695 696 return this.options; 697 }; 698 699 return BarRating; 700 })(); 701 702 $.fn.barrating = function (method, options) { 703 return this.each(function () { 704 var plugin = new BarRating(); 705 706 // plugin works with select fields 707 if (!$(this).is('select')) { 708 $.error('Sorry, this plugin only works with select fields.'); 709 } 710 711 // method supplied 712 if (plugin.hasOwnProperty(method)) { 713 plugin.init(options, this); 714 if (method === 'show') { 715 return plugin.show(options); 716 } else { 717 // plugin exists? 718 if (plugin.$elem.data('barrating')) { 719 plugin.$widget = $(this).next('.br-widget'); 720 return plugin[method](options); 721 } 722 } 723 724 // no method supplied or only options supplied 725 } else if (typeof method === 'object' || !method) { 726 options = method; 727 plugin.init(options, this); 728 return plugin.show(); 729 730 } else { 731 $.error('Method ' + method + ' does not exist on jQuery.barrating'); 732 } 733 }); 734 }; 735 736 $.fn.barrating.defaults = { 737 theme:'', 738 initialRating:null, // initial rating 739 allowEmpty:null, // allow empty ratings? 740 emptyValue:'', // this is the expected value of the empty rating 741 showValues:false, // display rating values on the bars? 742 showSelectedRating:true, // append a div with a rating to the widget? 743 deselectable:true, // allow to deselect ratings? 744 reverse:false, // reverse the rating? 745 readonly:false, // make the rating ready-only? 746 fastClicks:true, // remove 300ms click delay on touch devices? 747 hoverState:true, // change state on hover? 748 silent:false, // supress callbacks when controlling ratings programatically 749 onSelect:function (value, text, event) { 750 }, // callback fired when a rating is selected 751 onClear:function (value, text) { 752 }, // callback fired when a rating is cleared 753 onDestroy:function (value, text) { 754 } // callback fired when a widget is destroyed 755 }; 756 757 $.fn.barrating.BarRating = BarRating; 758 759}));
760/*! 761 * GMAP3 Plugin for jQuery 762 * Version : 7.2 763 * Date : 2016/12/03 764 * Author : DEMONTE Jean-Baptiste 765 * Contact : [email protected] 766 * Web site : http://gmap3.net 767 * Licence : GPL-3.0+ 768 */
vendor: 9,611 bytes, lines 769-770
769 770!function(n,t,e){"use strict";function o(n){return S(!0,{},n||{})}function r(){var n=Array.prototype.slice,t=n.call(arguments,1);return n.apply(arguments[0],t)}function i(n){return"undefined"==typeof n}function u(t){return O.apply(n,t)}function a(n){return O().then(function(){return n})}function c(n,t){var e=Math,o=e.PI,r=o*n.lat()/180,i=o*n.lng()/180,u=o*t.lat()/180,a=o*t.lng()/180,c=e.cos,s=e.sin;return 6371e3*e.acos(e.min(c(r)*c(u)*c(i)*c(a)+c(r)*s(i)*c(u)*s(a)+s(r)*s(u),1))}function s(n){"loading"!=e.readyState?n():e.addEventListener("DOMContentLoaded",n)}function f(n){return v(n).map(function(t){return encodeURIComponent(t)+"="+encodeURIComponent(n[t])}).join("&")}function p(n){return D[n]||(D[n]=l(n)),D[n]}function l(n){function t(n){return e.apply(this,n)}var e=E[n];return t.prototype=e.prototype,new t(r(arguments,1))}function g(n){var t=$();return"string"==typeof n&&(n={address:n}),p("Geocoder").geocode(n,function(n,e){e===E.GeocoderStatus.OK?t.resolve(n[0].geometry.location):t.reject(e)}),t}function d(n,t){h(n.split(" "),t)}function h(n,t){(R(n)?n:[n]).forEach(t)}function v(n){return Object.keys(n)}function y(n){return v(n).map(function(t){return n[t]})}function m(n,t){return n=o(n),n.bounds&&(n.bounds=P(n.bounds)),a(t(n))}function L(n,t,e){var r=$();return n=o(n),O().then(function(){var e=n.address;return e?(delete n.address,g(e).then(function(e){n[t]=e})):void(n[t]=x(n[t]))}).then(function(){r.resolve(e(n))}).fail(function(n){r.reject(n)}),r}function w(n,t,e){return n=o(n),n[t]=(n[t]||[]).map(x),a(e(n))}function x(n,t){return R(n)?new E.LatLng(n[0],n[1]):!t||!n||n instanceof E.LatLng?n:new E.LatLng(n.lat,n.lng)}function P(n,t){return R(n)?new E.LatLngBounds({lat:n[2],lng:n[3]},{lat:n[0],lng:n[1]}):t&&!n.getCenter?new E.LatLngBounds({lat:n.south,lng:n.west},{lat:n.north,lng:n.east}):n}function b(t,o){function r(){function n(n){return e.getProjection().fromLatLngToDivPixel(n)}var e=this,r=[];i.call(e),e.setMap(t),e.onAdd=function(){var n=e.getPanes();n.overlayMouseTarget.appendChild(u[0])},o.position?(e.getPosition=function(){return o.position},e.setPosition=function(n){o.position=n,e.draw()},e.draw=function(){var t=n(o.position);u.css({left:t.x+o.x+"px",top:t.y+o.y+"px"})}):(e.getBounds=function(){return o.bounds},e.setBounds=function(n){o.bounds=n,e.draw()},e.draw=function(){var t=n(o.bounds.getSouthWest()),e=n(o.bounds.getNorthEast());u.css({left:t.x+o.x+"px",top:e.y+o.y+"px",width:e.x-t.x+o.x+"px",height:t.y-e.y+o.y+"px"})}),e.onRemove=function(){r.map(function(n){E.event.removeListener(n)}),u.remove(),e.$=u=null},e.$=u}var i=E.OverlayView,u=n(e.createElement("div")).css({border:"none",borderWidth:0,position:"absolute"}).append(o.content);return o=S({x:0,y:0},o),o.position?o.position=x(o.position,!0):o.bounds&&(o.bounds=P(o.bounds,!0)),r.prototype=new i,new r}function M(n){function t(){var n=this;return n.onAdd=n.onRemove=n.draw=function(){},E.OverlayView.call(n)}t.prototype=new E.OverlayView;var e=new t;return e.setMap(n),e.getProjection()}function B(n,t,e,o){var r=this;r.cluster=n,r.markers=t,r.$=e.$,r.overlay=e,e.getBounds=function(){return l("LatLngBounds",o.getSouthWest(),o.getNorthEast())}}function C(n,t){function e(){var t=l("Circle",{center:n.getCenter(),radius:1.15*c(n.getCenter(),n.getBounds().getNorthEast())});return t.getBounds()}function i(n){var t=d.fromLatLngToDivPixel(n);return l("LatLngBounds",d.fromDivPixelToLatLng(l("Point",t.x-P,t.y+P)),d.fromDivPixelToLatLng(l("Point",t.x+P,t.y-P)))}function u(){var u,a,c,s,f,p,d=n.getZoom(),y={},x=[],P={};p=""+d,d>3&&(a=e(),h(w,function(n,t){a.contains(n.getPosition())||(p+="-"+t,P[t]=!0,n.getMap()&&n.setMap(null))})),m&&h(w,function(n,t){P[t]||m(n)||(p+="-"+t,P[t]=!0,n.getMap()&&n.setMap(null))}),p!==g&&(g=p,h(w,function(e,p){P[p]||(u=[p],a=i(e.getPosition()),C&&h(r(w,p+1),function(n,t){t+=p+1,!P[t]&&a.contains(n.getPosition())&&(u.push(t),P[t]=!0)}),s=u.join("-"),y[s]=!0,T[s]||(f=u.map(function(n){return w[n]}),c=t.cb(r(f)),c?(a=l("LatLngBounds"),h(f,function(n){a.extend(n.getPosition()),n.getMap()&&n.setMap(null)}),c=o(c),c.position=a.getCenter(),T[s]=new B(L,r(f),b(n,c),a),x.push(T[s])):h(f,function(t){t.getMap()||t.setMap(n)})))}),h(v(T),function(n){y[n]||(T[n].overlay.setMap(null),delete T[n])}),x.length&&h(k,function(n){n(x)}))}function a(){clearTimeout(f),f=setTimeout(u,100)}function s(){E.event.addListener(n,"zoom_changed",a),E.event.addListener(n,"bounds_changed",a),u()}var f,p,g,d,m,L=this,w=[],P=(t.size||200)>>1,C=!0,T={},k=[];t=t||{},t.markers=t.markers||[],L._b=function(n){n(y(T)),k.push(n)},L.markers=function(){return r(w)},L.groups=function(){return y(T)},L.enable=function(){C||(C=!0,g="",a())},L.disable=function(){C&&(C=!1,g="",a())},L.add=function(n){w.push(n),g="",a()},L.remove=function(n){w=w.filter(function(t){return t!==n}),g="",a()},L.filter=function(n){m!==n&&(m=n,g="",a())},t.markers.map(function(n){n.position=x(n.position),w.push(l("Marker",n))}),p=setInterval(function(){d=M(n),d&&(clearInterval(p),s())},10)}function T(n,t){var e=this;v(t[0]).forEach(function(n){e[n]=function(){var o=[],i=r(arguments);return t.forEach(function(t){o.push(t[n].apply(t,i))}),"get"===n?o.length>1?o:o[0]:e}}),e.$=n}function k(t,e){function c(){return{$:t,get:M.get}}function s(t,e,o,i){var u=arguments.length>3;u||(i=o),n.each(t,function(n,t){h(e,function(e){var a=e instanceof B,s=a||e instanceof E.OverlayView,f=s?e.$.get(0):e;E.event["add"+(s?"Dom":"")+"Listener"+(i?"Once":"")](f,n,function(n){h(t,function(t){if(A(t))if(a)t.call(c(),void 0,e,e.cluster,n);else if(u){var i=r(o);i.unshift(e),i.push(n),t.apply(c(),i)}else t.call(c(),e,n)})})})})}function f(n){return function(t){if(R(t)){var e=[],o=t.map(function(t){return n.call(M,t).then(function(n){e.push(n)})});return u(o).then(function(){return y.push(e),e})}return n.apply(M,arguments).then(function(n){return y.push(n),n})}}function g(n){return function(){var t=r(arguments);return P=P.then(function(e){return A(t[0])?O(t[0].call(c(),e)).then(function(e){return t[0]=e,n.apply(M,t)}):O(n.apply(M,t))})}}var v,y=[],P=O(),M=this;M.map=g(function(n){return v||L(n,"center",function(n){return v=l("Map",t.get(0),n),y.push(v),v})}),d("Marker:position Circle:center InfoWindow:position:0 Polyline:path Polygon:paths",function(n){n=n.split(":");var t=n[1]||"";M[n[0].toLowerCase()]=g(f(function(e){return(t.match(/^path/)?w:L)(e,t,function(t){return"0"!==n[2]&&(t.map=v),l(n[0],t)})}))}),d("TrafficLayer TransitLayer BicyclingLayer",function(n){M[n.toLowerCase()]=g(function(){var t=l(n);return y.push(t),t.setMap(v),t})}),M.kmllayer=g(f(function(n){return n=o(n),n.map=v,O(l("KmlLayer",n))})),M.rectangle=g(f(function(n){return m(n,function(n){return n.map=v,l("Rectangle",n)})})),M.overlay=g(f(function(n){function t(n){return b(v,n)}return n=o(n),n.bounds?m(n,t):L(n,"position",t)})),M.groundoverlay=g(function(n,t,e){return m({bounds:t},function(t){e=o(e),e.map=v;var r=l("GroundOverlay",n,t.bounds,e);return y.push(r),r})}),M.styledmaptype=g(function(n,t,e){var o=l("StyledMapType",t,e);return y.push(o),v.mapTypes.set(n,o),o}),M.streetviewpanorama=g(function(t,e){return L(e,"position",function(e){var o=l("StreetViewPanorama",n(t).get(0),e);return v.setStreetView(o),y.push(o),o})}),M.route=g(function(n){var t=$();return n=o(n),n.origin=x(n.origin),n.destination=x(n.destination),p("DirectionsService").route(n,function(n,e){y.push(n),t.resolve(e===E.DirectionsStatus.OK?n:!1)}),t}),M.cluster=g(function(n){var t=new C(v,o(n));return y.push(t),a(t)}),M.directionsrenderer=g(function(t){var e;return t&&(t=o(t),t.map=v,t.panel&&(t.panel=n(t.panel).get(0)),e=l("DirectionsRenderer",t)),y.push(e),e}),M.latlng=g(f(function(n){return L(n,"latlng",function(n){return y.push(n.latlng),n.latlng})})),M.fit=g(function(){var n=l("LatLngBounds");return h(y,function(t){t!==v&&h(t,function(t){t&&(t.getPosition&&t.getPosition()?n.extend(t.getPosition()):t.getBounds&&t.getBounds()?(n.extend(t.getBounds().getNorthEast()),n.extend(t.getBounds().getSouthWest())):t.getPaths&&t.getPaths()?h(t.getPaths().getArray(),function(t){h(t.getArray(),function(t){n.extend(t)})}):t.getPath&&t.getPath()?h(t.getPath().getArray(),function(t){n.extend(t)}):t.getCenter&&t.getCenter()&&n.extend(t.getCenter()))})}),n.isEmpty()||v.fitBounds(n),!0}),M.wait=function(n){P=P.then(function(t){var e=$();return setTimeout(function(){e.resolve(t)},n),e})},M.then=function(n){A(n)&&(P=P.then(function(t){return O(n.call(c(),t)).then(function(n){return i(n)?t:n})}))},M["catch"]=function(n){A(n)&&(P=P.then(null,function(t){return O(n.call(c(),t))}))},d("on once",function(n,t){M[n]=function(){var n=arguments[0];n&&("string"==typeof n&&(n={},n[arguments[0]]=r(arguments,1)),P.then(function(e){if(e){if(e instanceof C)return e._b(function(e){e&&e.length&&s(n,e,t)}),s(n,e.markers(),[void 0,e],t);s(n,e,t)}}))}}),M.get=function(n){return i(n)?y.map(function(n){return R(n)?n.slice():n}):(0>n&&(n=y.length+n),R(y[n])?y[n].slice():y[n])},e&&M.map(e)}var E,j,D={},O=n.when,S=n.extend,R=n.isArray,A=n.isFunction,$=n.Deferred;O(function(){var o,r=$(),i="__gmap3";return n.holdReady(!0),s(function(){t.google&&t.google.maps||j===!1?r.resolve():(t[i]=function(){delete t[i],r.resolve()},o=e.createElement("script"),o.type="text/javascript",o.src="https://maps.googleapis.com/maps/api/js?callback="+i+(j?"&"+("string"==typeof j?j:f(j)):""),n("head").append(o))}),r}()).then(function(){n.holdReady(!1)}),n.gmap3=function(n){j=n},n.fn.gmap3=function(e){var o=[];return E=t.google.maps,this.each(function(){var t=n(this),r=t.data("gmap3");r||(r=new k(t,e),t.data("gmap3",r)),o.push(r)}),new T(this,o)}}(jQuery,window,document);
770 771 772 773 774
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.