PageSourceSearch

https://www.vpfree2.com/assets/application-df62bc96ac7c1efc9701d2c16eb96850a670b8dd93bd99e35587dc56658baead.js

js vpfree2.com collected 2026-10-04 02:40:13 UTC 36,458 bytes, 774 lines download raw bytes

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.