PageSourceSearch

https://koelnerkarneval.de/typo3temp/assets/compressed/merged-c9c8…7882ce202f96c248b8f67f9c0dc03.js?1790166440

js koelnerkarneval.de collected 2026-09-24 21:06:04 UTC 151,906 bytes, 2,450 lines download raw bytes

1
2/*! js-cookie v3.0.5 | MIT */
3!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self,function(){var n=e.Cookies,o=e.Cookies=t();o.noConflict=function(){return e.Cookies=n,o}}())}(this,(function(){"use strict";function e(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)e[o]=n[o]}return e}var t=function t(n,o){function r(t,r,i){if("undefined"!=typeof document){"number"==typeof(i=e({},o,i)).expires&&(i.expires=new Date(Date.now()+864e5*i.expires)),i.expires&&(i.expires=i.expires.toUTCString()),t=encodeURIComponent(t).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var c="";for(var u in i)i[u]&&(c+="; "+u,!0!==i[u]&&(c+="="+i[u].split(";")[0]));return document.cookie=t+"="+n.write(r,t)+c}}return Object.create({set:r,get:function(e){if("undefined"!=typeof document&&(!arguments.length||e)){for(var t=document.cookie?document.cookie.split("; "):[],o={},r=0;r<t.length;r++){var i=t[r].split("="),c=i.slice(1).join("=");try{var u=decodeURIComponent(i[0]);if(o[u]=n.read(c,u),e===u)break}catch(e){}}return e?o[e]:o}},remove:function(t,n){r(t,"",e({},n,{expires:-1}))},withAttributes:function(n){return t(this.converter,e({},this.attributes,n))},withConverter:function(n){return t(e({},this.converter,n),this.attributes)}},{attributes:{value:Object.freeze(o)},converter:{value:Object.freeze(n)}})}({read:function(e){return'"'===e[0]&&(e=e.slice(1,-1)),e.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(e){return encodeURIComponent(e).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}},{path:"/"});return t}));
4
5var cookieman=function(){"use strict";var e="CookieConsent",t=document.querySelector("[data-cookieman-form]"),o=document.querySelector("[data-cookieman-settings]"),n=o,r=JSON.parse(o.dataset.cookiemanSettings),i=t.querySelectorAll("[type=checkbox][name]"),c=document.querySelectorAll("[data-cookieman-save]"),a=document.querySelectorAll("[data-cookieman-accept-all]"),s=document.querySelectorAll("[data-cookieman-accept-none]"),d=[],u={};function l(){for(var t=[],o=r.cookie.cookieLifetimeDays||365,n={expires:parseInt(o,10),domain:r.cookie.domain||void 0,sameSite:r.cookie.sameSite||"lax"},c=0;c<i.length;c++)i[c].checked&&t.push(i[c].name);Cookies.set(e,t.join("|"),n)}function f(e,t){e.checked=t}function m(){for(var e=0;e<i.length;e++){var t=i[e];t.disabled||f(t,!1)}}function v(e){for(var t=h(),o=0;o<t.length;o++)if(t[o]===e)return!0;return!1}function k(){var t=Cookies.get(e);return t?t.split("|"):[]}function h(){return k().filter((function(e){var t=r.groups[e];return void 0!==t&&(!t.respectDnt||"1"!==window.navigator.doNotTrack)}))}function p(e){const t=e.target;t&&t.dataset.hasOwnProperty("cookiemanShow")&&cookieman.show()}function g(e){e.preventDefault(),l(),cookieman.hide(),function(){for(var e in r.groups)if(Object.prototype.hasOwnProperty.call(r.groups,e)&&!v(e))for(var t=r.groups[e],o=0;o<t.trackingObjects.length;o++){var n=t.trackingObjects[o];j(n,r.trackingObjects[n])}}(),w()}function O(e){e.preventDefault(),function(){for(var e=0;e<i.length;e++)f(i[e],!0)}()}function b(e){e.preventDefault(),m()}function y(e,t){if(void 0!==t){if(void 0!==t.inject){var o,r=document.createElement("div");r.innerHTML=t.inject;for(var i=0,c=0;c<r.children.length;c++){var a=r.children[c];if("SCRIPT"===a.tagName){(o=document.createElement("script")).textContent=a.textContent;for(var s=0;s<a.attributes.length;s++){var l=a.attributes[s];o.setAttribute(l.name,l.value)}o.addEventListener("load",function(e,t,o,r){return function(i){var c,a;void 0===u[o]&&(u[o]=[]),u[o].push(t),c="scriptLoaded",a={detail:{trackingObjectKey:o,trackingObjectSettings:r,scriptId:t,node:e}},n.dispatchEvent(new window.CustomEvent(c,a))}}(o,i++,e,t)),a=o}else c--;document.body.appendChild(a)}d.push(e)}}else console.error("Used trackingObject ‹"+e+"› is undefined.")}function j(e,t){if(void 0!==t)for(var o in t.show){if(Object.prototype.hasOwnProperty.call(t.show,o))C(o,t.show[o])}else console.error("Used trackingObject ‹"+e+"› is undefined.")}function C(e,t){if("cookie_http+html"===t.type){if(Object.prototype.hasOwnProperty.call(t,"htmlCookieRemovalPattern")&&""!==t.htmlCookieRemovalPattern){var o,n=Cookies.get();try{o=RegExp(t.htmlCookieRemovalPattern)}catch(t){return console.error('Malformed pattern for cookie deletion on trackingObjectItem "'+e+'": '+t.message),!1}for(var r in n)null!==r.match(o)&&S(r)}else S(e);return!0}return!1}function w(){for(var e=h(),t=0;t<e.length;t++)for(var o=r.groups[e[t]],n=0;n<o.trackingObjects.length;n++){var i=o.trackingObjects[n];-1===d.indexOf(i)&&y(i,r.trackingObjects[i])}}function S(e){var t=document.location.host,o=t.split(".").slice(-2).join(".");Cookies.remove(e),Cookies.remove(e,{path:"/"}),Cookies.remove(e,{path:"",domain:t}),Cookies.remove(e,{path:"/",domain:t}),Cookies.remove(e,{path:"",domain:"."+o}),Cookies.remove(e,{path:"/",domain:"."+o})}return function(){for(var o=0;o<a.length;o++)a[o].addEventListener("click",O);for(o=0;o<s.length;o++)s[o].addEventListener("click",b);for(o=0;o<c.length;o++)c[o].addEventListener("click",g);document.body.addEventListener("click",p),function(){if(void 0!==Cookies.get(e)){var o=k();m();for(var n=0;n<o.length;n++){var r=t.querySelector("[name="+o[n]+"]");r&&f(r,!0)}}}(),function(){if("1"===window.navigator.doNotTrack)for(var e=document.querySelectorAll("[data-cookieman-dnt]"),o=0;o<e.length;o++)e[o].innerHTML=t.dataset.cookiemanDntEnabled}(),w()}(),{show:function(){console.error("Your theme should implement function cookieman.show()")},hide:function(){console.error("Your theme should implement function cookieman.hide()")},showOnce:function(){void 0===Cookies.get(e)&&cookieman.show()},hasConsented:v,hasConsentedTrackingObject:function(e){var t=function(e){return Object.keys(r.groups).filter((function(t){return Object.prototype.hasOwnProperty.call(r.groups[t],"trackingObjects")&&r.groups[t].trackingObjects.indexOf(e)>-1}))}(e);return t.reduce((function(e,t){return e&&v(t)}),t.length>0)},consenteds:h,consent:function(e){f(t.querySelector('[type=checkbox][name="'+e+'"]'),!0),l(),w()},onScriptLoaded:function(e,t,o){void 0===u[e]&&(u[e]=[]),-1===u[e].indexOf(t)?n.addEventListener("scriptLoaded",(function(n){n.detail.trackingObjectKey===e&&n.detail.scriptId===t&&o(n.detail.trackingObjectKey,n.detail.scriptId)})):o(e,t)},eventsEl:n}}();
6
7!function(){"use strict";var o=document.querySelector('[aria-controls="cookieman-settings"]'),e=null;o&&o.addEventListener("click",(function(o){var e=document.querySelector("[data-cookieman-save]:not([data-cookieman-accept-all]):not([data-cookieman-accept-none])");e&&(e.hidden=!1)})),cookieman.show=function(){(e=new bootstrap.Modal(document.getElementById("cookieman-modal"),{backdrop:true})).show()},cookieman.hide=function(){e&&e.hide()}}();
8
9null!==document.querySelector('[data-cookieman-showonce="1"]')&&setTimeout(cookieman.showOnce,100);
10
11document.addEventListener('DOMContentLoaded', function () {
12
13  // --- 1. Toggle .news-list-label ---
14  document.querySelectorAll('.news-list-label').forEach(label => {
15    label.addEventListener('click', () => {
16      label.parentElement.classList.toggle('show-label');
17      const icon = label.querySelector('i');
18      if (icon) icon.classList.toggle('fa-rotate-180');
19    });
20  });
21
22  // --- 2. Dropdown Hover ---
23  document.querySelectorAll('.dropdown').forEach(dropdown => {
24    dropdown.addEventListener('mouseenter', () => {
25      const menu = dropdown.querySelector('.dropdown-menu');
26      if (menu) {
27        menu.classList.add('show');
28        if (getComputedStyle(menu).display !== 'none') {
29          dropdown.classList.add('show');
30        }
31      }
32    });
33    dropdown.addEventListener('mouseleave', () => {
34      const menu = dropdown.querySelector('.dropdown-menu');
35      if (menu) {
36        menu.classList.remove('show');
37        dropdown.classList.remove('show');
38      }
39    });
40  });
41
42  // --- 3. Modale mit localStorage ---
43  document.querySelectorAll('.mask-modal').forEach(modal => {
44    const id = modal.id;
45    if (localStorage.getItem('modal' + id)) {
46      bootstrap.Modal.getOrCreateInstance(modal).hide();
47    } else {
48      localStorage.setItem('modal' + id, true);
49      bootstrap.Modal.getOrCreateInstance(modal).show();
50    }
51  });
52
53  document.querySelectorAll('.modal-show-always').forEach(el => {
54    const id = el.dataset.id;
55    localStorage.removeItem('modal' + id);
56  });
57
58  // --- 4. Leaflet Map (wenn vorhanden) ---
59  if (document.getElementById('map')) {
60    showMap();
61  }
62
63  function showMap() {
64    const config = document.getElementById('mapConfig');
65    const lon = parseFloat(config.dataset.lon);
66    const lat = parseFloat(config.dataset.lat);
67    const popup = config.dataset.popup;
68
69    const map = L.map('map').setView([lat, lon], 16);
70    map.dragging.enable();
71    map.scrollWheelZoom.disable();
72
73    L.tileLayer('//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
74      attribution: 'Map data &copy; OpenStreetMap contributors'
75    }).addTo(map);
76
77    L.marker([lat, lon]).addTo(map).bindPopup(popup).openPopup();
78  }
79
80  // --- 5. Mailchimp-Formularprüfung ---
81  const mailchimpSubmit = document.getElementById('mailchimpSubmit');
82  if (mailchimpSubmit) {
83    mailchimpSubmit.addEventListener('click', function () {
84      const form = document.getElementById('mailchimp-form');
85      if (form.checkValidity()) {
86        bootstrap.Modal.getOrCreateInstance(document.getElementById('mailchimpResponse')).show();
87        form.submit();
88      } else {
89        const mail = document.getElementById('newsletter-email');
90        const check = document.getElementById('newsletter-check');
91        const errorList = [];
92
93        if (mail.validationMessage) {
94          errorList.push('<li>Bitte tragen Sie eine korrekte E-Mail-Adresse ein!</li>');
95        }
96        if (check.validationMessage) {
97          errorList.push('<li>Bitte bestätigen Sie, dass Sie die Datenschutzbestimmungen akzeptieren!</li>');
98        }
99
100        document.getElementById('mailchimp-ajax-response').innerHTML =
101          '<div class="alert alert-danger"><ul>' + errorList.join('') + '</ul></div>';
102
103        bootstrap.Modal.getOrCreateInstance(document.getElementById('mailchimpResponse')).show();
104      }
105      return false;
106    });
107  }
108
109  const mailchimpResponse = document.getElementById('mailchimpResponse');
110  if (mailchimpResponse) {
111    mailchimpResponse.addEventListener('hidden.bs.modal', function () {
112      document.getElementById('mailchimp-ajax-response').innerHTML = '';
113    });
114  }
115
116  // --- 6. Dropdown Link-Klickverhalten (nur wenn sichtbar) ---
117  document.querySelectorAll('.navbar ul.navbar-nav > .dropdown > a[href]').forEach(anchor => {
118    anchor.addEventListener('click', function (e) {
119      const dropdown = this.nextElementSibling;
120      if (!dropdown || getComputedStyle(dropdown).display !== 'none') {
121        if (this.href) {
122          location.href = this.href;
123        }
124      }
125    });
126  });
127
128  // --- 7. Scroll-Funktion für "200 Jahre"-Seite ---
129  window.addEventListener('scroll', scrollFunction);
130  function scrollFunction() {
131    const mean = document.querySelector('.meanmenu-reveal');
132    const scroll = document.documentElement.scrollTop;
133    const header = document.querySelector('.header200Jahre');
134
135    if (!header) return;
136
137    if (scroll <= 50) {
138      const offset = 50 - scroll;
139      const headerOffset = 'header200JahreTop-' + offset;
140
141      header.classList.remove('header200JahreTop0');
142      if (mean) mean.classList.remove('meanmenu-200j-0');
143
144      for (let i = 0; i <= 50; i++) {
145        header.classList.remove('header200JahreTop-' + i);
146      }
147      header.classList.add(headerOffset);
148    } else {
149      header.classList.add('header200JahreTop0');
150      if (mean) mean.classList.add('meanmenu-200j-0');
151
152      for (let i = 0; i <= 50; i++) {
153        header.classList.remove('header200JahreTop-' + i);
154      }
155    }
156  }
157
158  // --- 8. History-Back-Links mit Fallback ---
159  document.querySelectorAll('.js-history-back').forEach(link => {
160    link.addEventListener('click', event => {
161      if (window.history.length > 1) {
162        event.preventDefault();
163        window.history.back();
164      }
165    });
166  });
167
168  // --- 9. Optional: goBack() Funktion ---
169  window.goBack = function () {
170    window.history.back();
171  };
172
173    // --- 10. Nur ein nativer Audio-/Video-Player gleichzeitig ---
174    document.querySelectorAll('audio, video').forEach(function (mediaElement) {
175        mediaElement.addEventListener('play', function () {
176            document.querySelectorAll('audio, video').forEach(function (otherMediaElement) {
177                if (otherMediaElement !== mediaElement && !otherMediaElement.paused) {
178                    otherMediaElement.pause();
179                }
180            });
181        });
182    });
183
184    const myModalEl = document.getElementById('KoeKaNav');
185    if (myModalEl) {
186        const myModalInstance = bootstrap.Modal.getOrCreateInstance(myModalEl);
187        const updateJubiModalOffset = function () {
188            if (!myModalEl.classList.contains('jubi-modal')) {
189                return;
190            }
191
192            const header = document.querySelector('.header200Jahre');
193            if (!header) {
194                myModalEl.style.setProperty('--jubi-modal-offset', '0px');
195                return;
196            }
197
198            const offset = Math.max(0, Math.round(header.getBoundingClientRect().top));
199            myModalEl.style.setProperty('--jubi-modal-offset', `${offset}px`);
200        };
201
202        myModalEl.addEventListener('show.bs.modal', function () {
203            updateJubiModalOffset();
204            document.querySelectorAll('.custom-nav-toggler').forEach(el => el.classList.add('menu-open'));
205        });
206        myModalEl.addEventListener('hide.bs.modal', function () {
207            document.querySelectorAll('.custom-nav-toggler').forEach(el => el.classList.remove('menu-open'));
208        });
209
210        if (myModalEl.classList.contains('jubi-modal-close-on-link')) {
211            myModalEl.querySelectorAll('.modal-body a[href]').forEach(link => {
212                link.addEventListener('click', function () {
213                    myModalInstance.hide();
214                });
215            });
216        }
217
218        window.addEventListener('resize', updateJubiModalOffset);
219        window.addEventListener('scroll', function () {
220            if (myModalEl.classList.contains('show')) {
221                updateJubiModalOffset();
222            }
223        }, { passive: true });
224    }
225
226    const list = document.querySelectorAll('.koeka-toggler');
227
228    function accordion(e){
229        e.stopPropagation();
230        if(this.parentElement.parentElement.classList.contains('active')){
231            this.parentElement.parentElement.classList.remove('active');
232        }
233        else if(this.parentElement.parentElement.parentElement.parentElement.classList.contains('active')){
234            this.parentElement.parentElement.classList.add('active');
235        }
236        else{
237            for(i=0; i < list.length; i++){
238                list[i].parentElement.parentElement.classList.remove('active');
239            }
240            this.parentElement.parentElement.classList.add('active');
241        }
242    }
243    for(i = 0; i < list.length; i++ ){
244        list[i].addEventListener('click', accordion);
245    }
246
247
248    /* SLIDER */
249    // Prüft, ob das Element mit id="hero-slider" existiert
250    var heroSlider = document.getElementById('hero-slider');
251    if (heroSlider) {
252        var listGroup = heroSlider.querySelector('.list-group');
253
254        // Nur initialisieren, wenn auch die list-group vorhanden ist
255        if (listGroup) {
256            $(heroSlider).on('slide.bs.carousel', function(e) {
257                var nextIndex = $(e.relatedTarget).index();
258                listGroup.querySelectorAll('li').forEach(function(li, idx) {
259                    li.classList.toggle('active', idx === nextIndex);
260                });
261            });
262
263            listGroup.querySelectorAll('li').forEach(function(li, idx) {
264                li.addEventListener('click', function() {
265                    $('#hero-slider').carousel(idx);
266                    listGroup.querySelectorAll('li').forEach(function(el) {
267                        el.classList.remove('active');
268                    });
269                    li.classList.add('active');
270                });
271            });
272        }
273    }
274
275
276});
277
278/*! jQuery UI - v1.12.1 - 2021-03-08
279* http://jqueryui.com
280* Includes: keycode.js, widgets/datepicker.js
281* Copyright jQuery Foundation and other contributors; Licensed MIT */
282
283(function( factory ) {
284	if ( typeof define === "function" && define.amd ) {
285
286		// AMD. Register as an anonymous module.
287		define([ "jquery" ], factory );
288	} else {
289
290		// Browser globals
291		factory( jQuery );
292	}
293}(function( $ ) {
294
295	$.ui = $.ui || {};
296
297	var version = $.ui.version = "1.12.1";
298
299
300	/*!
vendor: 5,307 bytes, lines 301-426
301     * jQuery UI Keycode 1.12.1
302     * http://jqueryui.com
303     *
304     * Copyright jQuery Foundation and other contributors
305     * Released under the MIT license.
306     * http://jquery.org/license
307     */
308
309//>>label: Keycode
310//>>group: Core
311//>>description: Provide keycodes as keynames
312//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/
313
314
315	var keycode = $.ui.keyCode = {
316		BACKSPACE: 8,
317		COMMA: 188,
318		DELETE: 46,
319		DOWN: 40,
320		END: 35,
321		ENTER: 13,
322		ESCAPE: 27,
323		HOME: 36,
324		LEFT: 37,
325		PAGE_DOWN: 34,
326		PAGE_UP: 33,
327		PERIOD: 190,
328		RIGHT: 39,
329		SPACE: 32,
330		TAB: 9,
331		UP: 38
332	};
333
334
335// jscs:disable maximumLineLength
336	/* jscs:disable requireCamelCaseOrUpperCaseIdentifiers */
337	/*!
338     * jQuery UI Datepicker 1.12.1
339     * http://jqueryui.com
340     *
341     * Copyright jQuery Foundation and other contributors
342     * Released under the MIT license.
343     * http://jquery.org/license
344     */
345
346//>>label: Datepicker
347//>>group: Widgets
348//>>description: Displays a calendar from an input or inline for selecting dates.
349//>>docs: http://api.jqueryui.com/datepicker/
350//>>demos: http://jqueryui.com/datepicker/
351//>>css.structure: ../../themes/base/core.css
352//>>css.structure: ../../themes/base/datepicker.css
353//>>css.theme: ../../themes/base/theme.css
354
355
356
357	$.extend( $.ui, { datepicker: { version: "1.12.1" } } );
358
359	var datepicker_instActive;
360
361	function datepicker_getZindex( elem ) {
362		var position, value;
363		while ( elem.length && elem[ 0 ] !== document ) {
364
365			// Ignore z-index if position is set to a value where z-index is ignored by the browser
366			// This makes behavior of this function consistent across browsers
367			// WebKit always returns auto if the element is positioned
368			position = elem.css( "position" );
369			if ( position === "absolute" || position === "relative" || position === "fixed" ) {
370
371				// IE returns 0 when zIndex is not specified
372				// other browsers return a string
373				// we ignore the case of nested elements with an explicit value of 0
374				// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
375				value = parseInt( elem.css( "zIndex" ), 10 );
376				if ( !isNaN( value ) && value !== 0 ) {
377					return value;
378				}
379			}
380			elem = elem.parent();
381		}
382
383		return 0;
384	}
385	/* Date picker manager.
386       Use the singleton instance of this class, $.datepicker, to interact with the date picker.
387       Settings for (groups of) date pickers are maintained in an instance object,
388       allowing multiple different settings on the same page. */
389
390	function Datepicker() {
391		this._curInst = null; // The current instance in use
392		this._keyEvent = false; // If the last event was a key event
393		this._disabledInputs = []; // List of date picker inputs that have been disabled
394		this._datepickerShowing = false; // True if the popup picker is showing , false if not
395		this._inDialog = false; // True if showing within a "dialog", false if not
396		this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division
397		this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class
398		this._appendClass = "ui-datepicker-append"; // The name of the append marker class
399		this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class
400		this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class
401		this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class
402		this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class
403		this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class
404		this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class
405		this.regional = []; // Available regional settings, indexed by language code
406		this.regional[ "" ] = { // Default regional settings
407			closeText: "Done", // Display text for close link
408			prevText: "Prev", // Display text for previous month link
409			nextText: "Next", // Display text for next month link
410			currentText: "Today", // Display text for current month link
411			monthNames: [ "January","February","March","April","May","June",
412				"July","August","September","October","November","December" ], // Names of months for drop-down and formatting
413			monthNamesShort: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ], // For formatting
414			dayNames: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], // For formatting
415			dayNamesShort: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], // For formatting
416			dayNamesMin: [ "Su","Mo","Tu","We","Th","Fr","Sa" ], // Column headings for days starting at Sunday
417			weekHeader: "Wk", // Column header for week of the year
418			dateFormat: "mm/dd/yy", // See format options on parseDate
419			firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
420			isRTL: false, // True if right-to-left language, false if left-to-right
421			showMonthAfterYear: false, // True if the year select precedes month, false for month then year
422			yearSuffix: "" // Additional text to append to the year in the month headers
423		};
424		this._defaults = { // Global defaults for all the date picker instances
425			showOn: "focus", // "focus" for popup on focus,
426			// "button" for trigger button, or "both" for either
vendor: 5,966 bytes, lines 427-535
427			showAnim: "fadeIn", // Name of jQuery animation for popup
428			showOptions: {}, // Options for enhanced animations
429			defaultDate: null, // Used when field is blank: actual date,
430			// +/-number for offset from today, null for today
431			appendText: "", // Display text following the input box, e.g. showing the format
432			buttonText: "...", // Text for trigger button
433			buttonImage: "", // URL for trigger button image
434			buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
435			hideIfNoPrevNext: false, // True to hide next/previous month links
436			// if not applicable, false to just disable them
437			navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
438			gotoCurrent: false, // True if today link goes back to current selection instead
439			changeMonth: false, // True if month can be selected directly, false if only prev/next
440			changeYear: false, // True if year can be selected directly, false if only prev/next
441			yearRange: "c-10:c+10", // Range of years to display in drop-down,
442			// either relative to today's year (-nn:+nn), relative to currently displayed year
443			// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
444			showOtherMonths: false, // True to show dates in other months, false to leave blank
445			selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
446			showWeek: false, // True to show week of the year, false to not show it
447			calculateWeek: this.iso8601Week, // How to calculate the week of the year,
448			// takes a Date and returns the number of the week for it
449			shortYearCutoff: "+10", // Short year values < this are in the current century,
450			// > this are in the previous century,
451			// string value starting with "+" for current year + value
452			minDate: null, // The earliest selectable date, or null for no limit
453			maxDate: null, // The latest selectable date, or null for no limit
454			duration: "fast", // Duration of display/closure
455			beforeShowDay: null, // Function that takes a date and returns an array with
456			// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "",
457			// [2] = cell title (optional), e.g. $.datepicker.noWeekends
458			beforeShow: null, // Function that takes an input field and
459			// returns a set of custom settings for the date picker
460			onSelect: null, // Define a callback function when a date is selected
461			onChangeMonthYear: null, // Define a callback function when the month or year is changed
462			onClose: null, // Define a callback function when the datepicker is closed
463			numberOfMonths: 1, // Number of months to show at a time
464			showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
465			stepMonths: 1, // Number of months to step back/forward
466			stepBigMonths: 12, // Number of months to step back/forward for the big links
467			altField: "", // Selector for an alternate field to store selected dates into
468			altFormat: "", // The date format to use for the alternate field
469			constrainInput: true, // The input is constrained by the current date format
470			showButtonPanel: false, // True to show button panel, false to not show it
471			autoSize: false, // True to size the input for the date format, false to leave as is
472			disabled: false // The initial disabled state
473		};
474		$.extend( this._defaults, this.regional[ "" ] );
475		this.regional.en = $.extend( true, {}, this.regional[ "" ] );
476		this.regional[ "en-US" ] = $.extend( true, {}, this.regional.en );
477		this.dpDiv = datepicker_bindHover( $( "<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) );
478	}
479
480	$.extend( Datepicker.prototype, {
481		/* Class name added to elements to indicate already configured with a date picker. */
482		markerClassName: "hasDatepicker",
483
484		//Keep track of the maximum number of rows displayed (see #7043)
485		maxRows: 4,
486
487		// TODO rename to "widget" when switching to widget factory
488		_widgetDatepicker: function() {
489			return this.dpDiv;
490		},
491
492		/* Override the default settings for all instances of the date picker.
493         * @param  settings  object - the new settings to use as defaults (anonymous object)
494         * @return the manager object
495         */
496		setDefaults: function( settings ) {
497			datepicker_extendRemove( this._defaults, settings || {} );
498			return this;
499		},
500
501		/* Attach the date picker to a jQuery selection.
502         * @param  target	element - the target input field or division or span
503         * @param  settings  object - the new settings to use for this date picker instance (anonymous)
504         */
505		_attachDatepicker: function( target, settings ) {
506			var nodeName, inline, inst;
507			nodeName = target.nodeName.toLowerCase();
508			inline = ( nodeName === "div" || nodeName === "span" );
509			if ( !target.id ) {
510				this.uuid += 1;
511				target.id = "dp" + this.uuid;
512			}
513			inst = this._newInst( $( target ), inline );
514			inst.settings = $.extend( {}, settings || {} );
515			if ( nodeName === "input" ) {
516				this._connectDatepicker( target, inst );
517			} else if ( inline ) {
518				this._inlineDatepicker( target, inst );
519			}
520		},
521
522		/* Create a new instance object. */
523		_newInst: function( target, inline ) {
524			var id = target[ 0 ].id.replace( /([^A-Za-z0-9_\-])/g, "\\\\$1" ); // escape jQuery meta chars
525			return { id: id, input: target, // associated target
526				selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
527				drawMonth: 0, drawYear: 0, // month being drawn
528				inline: inline, // is datepicker inline or not
529				dpDiv: ( !inline ? this.dpDiv : // presentation div
530					datepicker_bindHover( $( "<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) ) ) };
531		},
532
533		/* Attach the date picker to an input field. */
534		_connectDatepicker: function( target, inst ) {
535			var input = $( target );
vendor: 4,287 bytes, lines 536-652
536			inst.append = $( [] );
537			inst.trigger = $( [] );
538			if ( input.hasClass( this.markerClassName ) ) {
539				return;
540			}
541			this._attachments( input, inst );
542			input.addClass( this.markerClassName ).on( "keydown", this._doKeyDown ).
543			on( "keypress", this._doKeyPress ).on( "keyup", this._doKeyUp );
544			this._autoSize( inst );
545			$.data( target, "datepicker", inst );
546
547			//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
548			if ( inst.settings.disabled ) {
549				this._disableDatepicker( target );
550			}
551		},
552
553		/* Make attachments based on settings. */
554		_attachments: function( input, inst ) {
555			var showOn, buttonText, buttonImage,
556				appendText = this._get( inst, "appendText" ),
557				isRTL = this._get( inst, "isRTL" );
558
559			if ( inst.append ) {
560				inst.append.remove();
561			}
562			if ( appendText ) {
563				inst.append = $( "<span class='" + this._appendClass + "'>" + appendText + "</span>" );
564				input[ isRTL ? "before" : "after" ]( inst.append );
565			}
566
567			input.off( "focus", this._showDatepicker );
568
569			if ( inst.trigger ) {
570				inst.trigger.remove();
571			}
572
573			showOn = this._get( inst, "showOn" );
574			if ( showOn === "focus" || showOn === "both" ) { // pop-up date picker when in the marked field
575				input.on( "focus", this._showDatepicker );
576			}
577			if ( showOn === "button" || showOn === "both" ) { // pop-up date picker when button clicked
578				buttonText = this._get( inst, "buttonText" );
579				buttonImage = this._get( inst, "buttonImage" );
580				inst.trigger = $( this._get( inst, "buttonImageOnly" ) ?
581					$( "<img/>" ).addClass( this._triggerClass ).
582					attr( { src: buttonImage, alt: buttonText, title: buttonText } ) :
583					$( "<button type='button'></button>" ).addClass( this._triggerClass ).
584					html( !buttonImage ? buttonText : $( "<img/>" ).attr(
585						{ src:buttonImage, alt:buttonText, title:buttonText } ) ) );
586				input[ isRTL ? "before" : "after" ]( inst.trigger );
587				inst.trigger.on( "click", function() {
588					if ( $.datepicker._datepickerShowing && $.datepicker._lastInput === input[ 0 ] ) {
589						$.datepicker._hideDatepicker();
590					} else if ( $.datepicker._datepickerShowing && $.datepicker._lastInput !== input[ 0 ] ) {
591						$.datepicker._hideDatepicker();
592						$.datepicker._showDatepicker( input[ 0 ] );
593					} else {
594						$.datepicker._showDatepicker( input[ 0 ] );
595					}
596					return false;
597				} );
598			}
599		},
600
601		/* Apply the maximum length for the date format. */
602		_autoSize: function( inst ) {
603			if ( this._get( inst, "autoSize" ) && !inst.inline ) {
604				var findMax, max, maxI, i,
605					date = new Date( 2009, 12 - 1, 20 ), // Ensure double digits
606					dateFormat = this._get( inst, "dateFormat" );
607
608				if ( dateFormat.match( /[DM]/ ) ) {
609					findMax = function( names ) {
610						max = 0;
611						maxI = 0;
612						for ( i = 0; i < names.length; i++ ) {
613							if ( names[ i ].length > max ) {
614								max = names[ i ].length;
615								maxI = i;
616							}
617						}
618						return maxI;
619					};
620					date.setMonth( findMax( this._get( inst, ( dateFormat.match( /MM/ ) ?
621						"monthNames" : "monthNamesShort" ) ) ) );
622					date.setDate( findMax( this._get( inst, ( dateFormat.match( /DD/ ) ?
623						"dayNames" : "dayNamesShort" ) ) ) + 20 - date.getDay() );
624				}
625				inst.input.attr( "size", this._formatDate( inst, date ).length );
626			}
627		},
628
629		/* Attach an inline date picker to a div. */
630		_inlineDatepicker: function( target, inst ) {
631			var divSpan = $( target );
632			if ( divSpan.hasClass( this.markerClassName ) ) {
633				return;
634			}
635			divSpan.addClass( this.markerClassName ).append( inst.dpDiv );
636			$.data( target, "datepicker", inst );
637			this._setDate( inst, this._getDefaultDate( inst ), true );
638			this._updateDatepicker( inst );
639			this._updateAlternate( inst );
640
641			//If disabled option is true, disable the datepicker before showing it (see ticket #5665)
642			if ( inst.settings.disabled ) {
643				this._disableDatepicker( target );
644			}
645
646			// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
647			// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
648			inst.dpDiv.css( "display", "block" );
649		},
650
651		/* Pop-up the date picker in a "dialog" box.
652         * @param  input element - ignored
653         * @param  date	string or Date - the initial date to display
654         * @param  onSelect  function - the function to call when a date is selected
655         * @param  settings  object - update the dialog date picker instance's settings (anonymous object)
656         * @param  pos int[2] - coordinates for the dialog's position within the screen or
657         *					event - with x/y coordinates or
658         *					leave empty for default (screen centre)
659         * @return the manager object
660         */
661		_dialogDatepicker: function( input, date, onSelect, settings, pos ) {
662			var id, browserWidth, browserHeight, scrollX, scrollY,
663				inst = this._dialogInst; // internal instance
664
665			if ( !inst ) {
666				this.uuid += 1;
667				id = "dp" + this.uuid;
668				this._dialogInput = $( "<input type='text' id='" + id +
669					"' style='position: absolute; top: -100px; width: 0px;'/>" );
670				this._dialogInput.on( "keydown", this._doKeyDown );
671				$( "body" ).append( this._dialogInput );
672				inst = this._dialogInst = this._newInst( this._dialogInput, false );
673				inst.settings = {};
674				$.data( this._dialogInput[ 0 ], "datepicker", inst );
675			}
676			datepicker_extendRemove( inst.settings, settings || {} );
677			date = ( date && date.constructor === Date ? this._formatDate( inst, date ) : date );
678			this._dialogInput.val( date );
679
680			this._pos = ( pos ? ( pos.length ? pos : [ pos.pageX, pos.pageY ] ) : null );
681			if ( !this._pos ) {
682				browserWidth = document.documentElement.clientWidth;
683				browserHeight = document.documentElement.clientHeight;
684				scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
685				scrollY = document.documentElement.scrollTop || document.body.scrollTop;
686				this._pos = // should use actual width/height below
687					[ ( browserWidth / 2 ) - 100 + scrollX, ( browserHeight / 2 ) - 150 + scrollY ];
688			}
689
690			// Move input on screen for focus, but hidden behind dialog
691			this._dialogInput.css( "left", ( this._pos[ 0 ] + 20 ) + "px" ).css( "top", this._pos[ 1 ] + "px" );
692			inst.settings.onSelect = onSelect;
693			this._inDialog = true;
694			this.dpDiv.addClass( this._dialogClass );
695			this._showDatepicker( this._dialogInput[ 0 ] );
696			if ( $.blockUI ) {
697				$.blockUI( this.dpDiv );
698			}
699			$.data( this._dialogInput[ 0 ], "datepicker", inst );
700			return this;
701		},
702
703		/* Detach a datepicker from its control.
704         * @param  target	element - the target input field or division or span
705         */
706		_destroyDatepicker: function( target ) {
707			var nodeName,
708				$target = $( target ),
709				inst = $.data( target, "datepicker" );
710
711			if ( !$target.hasClass( this.markerClassName ) ) {
712				return;
713			}
714
715			nodeName = target.nodeName.toLowerCase();
716			$.removeData( target, "datepicker" );
717			if ( nodeName === "input" ) {
vendor: 7,485 bytes, lines 718-930
718				inst.append.remove();
719				inst.trigger.remove();
720				$target.removeClass( this.markerClassName ).
721				off( "focus", this._showDatepicker ).
722				off( "keydown", this._doKeyDown ).
723				off( "keypress", this._doKeyPress ).
724				off( "keyup", this._doKeyUp );
725			} else if ( nodeName === "div" || nodeName === "span" ) {
726				$target.removeClass( this.markerClassName ).empty();
727			}
728
729			if ( datepicker_instActive === inst ) {
730				datepicker_instActive = null;
731			}
732		},
733
734		/* Enable the date picker to a jQuery selection.
735         * @param  target	element - the target input field or division or span
736         */
737		_enableDatepicker: function( target ) {
738			var nodeName, inline,
739				$target = $( target ),
740				inst = $.data( target, "datepicker" );
741
742			if ( !$target.hasClass( this.markerClassName ) ) {
743				return;
744			}
745
746			nodeName = target.nodeName.toLowerCase();
747			if ( nodeName === "input" ) {
748				target.disabled = false;
749				inst.trigger.filter( "button" ).
750				each( function() { this.disabled = false; } ).end().
751				filter( "img" ).css( { opacity: "1.0", cursor: "" } );
752			} else if ( nodeName === "div" || nodeName === "span" ) {
753				inline = $target.children( "." + this._inlineClass );
754				inline.children().removeClass( "ui-state-disabled" );
755				inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).
756				prop( "disabled", false );
757			}
758			this._disabledInputs = $.map( this._disabledInputs,
759				function( value ) { return ( value === target ? null : value ); } ); // delete entry
760		},
761
762		/* Disable the date picker to a jQuery selection.
763         * @param  target	element - the target input field or division or span
764         */
765		_disableDatepicker: function( target ) {
766			var nodeName, inline,
767				$target = $( target ),
768				inst = $.data( target, "datepicker" );
769
770			if ( !$target.hasClass( this.markerClassName ) ) {
771				return;
772			}
773
774			nodeName = target.nodeName.toLowerCase();
775			if ( nodeName === "input" ) {
776				target.disabled = true;
777				inst.trigger.filter( "button" ).
778				each( function() { this.disabled = true; } ).end().
779				filter( "img" ).css( { opacity: "0.5", cursor: "default" } );
780			} else if ( nodeName === "div" || nodeName === "span" ) {
781				inline = $target.children( "." + this._inlineClass );
782				inline.children().addClass( "ui-state-disabled" );
783				inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).
784				prop( "disabled", true );
785			}
786			this._disabledInputs = $.map( this._disabledInputs,
787				function( value ) { return ( value === target ? null : value ); } ); // delete entry
788			this._disabledInputs[ this._disabledInputs.length ] = target;
789		},
790
791		/* Is the first field in a jQuery collection disabled as a datepicker?
792         * @param  target	element - the target input field or division or span
793         * @return boolean - true if disabled, false if enabled
794         */
795		_isDisabledDatepicker: function( target ) {
796			if ( !target ) {
797				return false;
798			}
799			for ( var i = 0; i < this._disabledInputs.length; i++ ) {
800				if ( this._disabledInputs[ i ] === target ) {
801					return true;
802				}
803			}
804			return false;
805		},
806
807		/* Retrieve the instance data for the target control.
808         * @param  target  element - the target input field or division or span
809         * @return  object - the associated instance data
810         * @throws  error if a jQuery problem getting data
811         */
812		_getInst: function( target ) {
813			try {
814				return $.data( target, "datepicker" );
815			}
816			catch ( err ) {
817				throw "Missing instance data for this datepicker";
818			}
819		},
820
821		/* Update or retrieve the settings for a date picker attached to an input field or division.
822         * @param  target  element - the target input field or division or span
823         * @param  name	object - the new settings to update or
824         *				string - the name of the setting to change or retrieve,
825         *				when retrieving also "all" for all instance settings or
826         *				"defaults" for all global defaults
827         * @param  value   any - the new value for the setting
828         *				(omit if above is an object or to retrieve a value)
829         */
830		_optionDatepicker: function( target, name, value ) {
831			var settings, date, minDate, maxDate,
832				inst = this._getInst( target );
833
834			if ( arguments.length === 2 && typeof name === "string" ) {
835				return ( name === "defaults" ? $.extend( {}, $.datepicker._defaults ) :
836					( inst ? ( name === "all" ? $.extend( {}, inst.settings ) :
837						this._get( inst, name ) ) : null ) );
838			}
839
840			settings = name || {};
841			if ( typeof name === "string" ) {
842				settings = {};
843				settings[ name ] = value;
844			}
845
846			if ( inst ) {
847				if ( this._curInst === inst ) {
848					this._hideDatepicker();
849				}
850
851				date = this._getDateDatepicker( target, true );
852				minDate = this._getMinMaxDate( inst, "min" );
853				maxDate = this._getMinMaxDate( inst, "max" );
854				datepicker_extendRemove( inst.settings, settings );
855
856				// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
857				if ( minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined ) {
858					inst.settings.minDate = this._formatDate( inst, minDate );
859				}
860				if ( maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined ) {
861					inst.settings.maxDate = this._formatDate( inst, maxDate );
862				}
863				if ( "disabled" in settings ) {
864					if ( settings.disabled ) {
865						this._disableDatepicker( target );
866					} else {
867						this._enableDatepicker( target );
868					}
869				}
870				this._attachments( $( target ), inst );
871				this._autoSize( inst );
872				this._setDate( inst, date );
873				this._updateAlternate( inst );
874				this._updateDatepicker( inst );
875			}
876		},
877
878		// Change method deprecated
879		_changeDatepicker: function( target, name, value ) {
880			this._optionDatepicker( target, name, value );
881		},
882
883		/* Redraw the date picker attached to an input field or division.
884         * @param  target  element - the target input field or division or span
885         */
886		_refreshDatepicker: function( target ) {
887			var inst = this._getInst( target );
888			if ( inst ) {
889				this._updateDatepicker( inst );
890			}
891		},
892
893		/* Set the dates for a jQuery selection.
894         * @param  target element - the target input field or division or span
895         * @param  date	Date - the new date
896         */
897		_setDateDatepicker: function( target, date ) {
898			var inst = this._getInst( target );
899			if ( inst ) {
900				this._setDate( inst, date );
901				this._updateDatepicker( inst );
902				this._updateAlternate( inst );
903			}
904		},
905
906		/* Get the date(s) for the first entry in a jQuery selection.
907         * @param  target element - the target input field or division or span
908         * @param  noDefault boolean - true if no default date is to be used
909         * @return Date - the current date
910         */
911		_getDateDatepicker: function( target, noDefault ) {
912			var inst = this._getInst( target );
913			if ( inst && !inst.inline ) {
914				this._setDateFromField( inst, noDefault );
915			}
916			return ( inst ? this._getDate( inst ) : null );
917		},
918
919		/* Handle keystrokes. */
920		_doKeyDown: function( event ) {
921			var onSelect, dateStr, sel,
922				inst = $.datepicker._getInst( event.target ),
923				handled = true,
924				isRTL = inst.dpDiv.is( ".ui-datepicker-rtl" );
925
926			inst._keyEvent = true;
927			if ( $.datepicker._datepickerShowing ) {
928				switch ( event.keyCode ) {
929					case 9: $.datepicker._hideDatepicker();
930						handled = false;
vendor: 4,683 bytes, lines 931-1058
931						break; // hide on tab out
932					case 13: sel = $( "td." + $.datepicker._dayOverClass + ":not(." +
933						$.datepicker._currentClass + ")", inst.dpDiv );
934						if ( sel[ 0 ] ) {
935							$.datepicker._selectDay( event.target, inst.selectedMonth, inst.selectedYear, sel[ 0 ] );
936						}
937
938						onSelect = $.datepicker._get( inst, "onSelect" );
939						if ( onSelect ) {
940							dateStr = $.datepicker._formatDate( inst );
941
942							// Trigger custom callback
943							onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );
944						} else {
945							$.datepicker._hideDatepicker();
946						}
947
948						return false; // don't submit the form
949					case 27: $.datepicker._hideDatepicker();
950						break; // hide on escape
951					case 33: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
952						-$.datepicker._get( inst, "stepBigMonths" ) :
953						-$.datepicker._get( inst, "stepMonths" ) ), "M" );
954						break; // previous month/year on page up/+ ctrl
955					case 34: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
956						+$.datepicker._get( inst, "stepBigMonths" ) :
957						+$.datepicker._get( inst, "stepMonths" ) ), "M" );
958						break; // next month/year on page down/+ ctrl
959					case 35: if ( event.ctrlKey || event.metaKey ) {
960						$.datepicker._clearDate( event.target );
961					}
962						handled = event.ctrlKey || event.metaKey;
963						break; // clear on ctrl or command +end
964					case 36: if ( event.ctrlKey || event.metaKey ) {
965						$.datepicker._gotoToday( event.target );
966					}
967						handled = event.ctrlKey || event.metaKey;
968						break; // current on ctrl or command +home
969					case 37: if ( event.ctrlKey || event.metaKey ) {
970						$.datepicker._adjustDate( event.target, ( isRTL ? +1 : -1 ), "D" );
971					}
972						handled = event.ctrlKey || event.metaKey;
973
974						// -1 day on ctrl or command +left
975						if ( event.originalEvent.altKey ) {
976							$.datepicker._adjustDate( event.target, ( event.ctrlKey ?
977								-$.datepicker._get( inst, "stepBigMonths" ) :
978								-$.datepicker._get( inst, "stepMonths" ) ), "M" );
979						}
980
981						// next month/year on alt +left on Mac
982						break;
983					case 38: if ( event.ctrlKey || event.metaKey ) {
984						$.datepicker._adjustDate( event.target, -7, "D" );
985					}
986						handled = event.ctrlKey || event.metaKey;
987						break; // -1 week on ctrl or command +up
988					case 39: if ( event.ctrlKey || event.metaKey ) {
989						$.datepicker._adjustDate( event.target, ( isRTL ? -1 : +1 ), "D" );
990					}
991						handled = event.ctrlKey || event.metaKey;
992
993						// +1 day on ctrl or command +right
994						if ( event.originalEvent.altKey ) {
995							$.datepicker._adjustDate( event.target, ( event.ctrlKey ?
996								+$.datepicker._get( inst, "stepBigMonths" ) :
997								+$.datepicker._get( inst, "stepMonths" ) ), "M" );
998						}
999
1000						// next month/year on alt +right
1001						break;
1002					case 40: if ( event.ctrlKey || event.metaKey ) {
1003						$.datepicker._adjustDate( event.target, +7, "D" );
1004					}
1005						handled = event.ctrlKey || event.metaKey;
1006						break; // +1 week on ctrl or command +down
1007					default: handled = false;
1008				}
1009			} else if ( event.keyCode === 36 && event.ctrlKey ) { // display the date picker on ctrl+home
1010				$.datepicker._showDatepicker( this );
1011			} else {
1012				handled = false;
1013			}
1014
1015			if ( handled ) {
1016				event.preventDefault();
1017				event.stopPropagation();
1018			}
1019		},
1020
1021		/* Filter entered characters - based on date format. */
1022		_doKeyPress: function( event ) {
1023			var chars, chr,
1024				inst = $.datepicker._getInst( event.target );
1025
1026			if ( $.datepicker._get( inst, "constrainInput" ) ) {
1027				chars = $.datepicker._possibleChars( $.datepicker._get( inst, "dateFormat" ) );
1028				chr = String.fromCharCode( event.charCode == null ? event.keyCode : event.charCode );
1029				return event.ctrlKey || event.metaKey || ( chr < " " || !chars || chars.indexOf( chr ) > -1 );
1030			}
1031		},
1032
1033		/* Synchronise manual entry and field/alternate field. */
1034		_doKeyUp: function( event ) {
1035			var date,
1036				inst = $.datepicker._getInst( event.target );
1037
1038			if ( inst.input.val() !== inst.lastVal ) {
1039				try {
1040					date = $.datepicker.parseDate( $.datepicker._get( inst, "dateFormat" ),
1041						( inst.input ? inst.input.val() : null ),
1042						$.datepicker._getFormatConfig( inst ) );
1043
1044					if ( date ) { // only if valid
1045						$.datepicker._setDateFromField( inst );
1046						$.datepicker._updateAlternate( inst );
1047						$.datepicker._updateDatepicker( inst );
1048					}
1049				}
1050				catch ( err ) {
1051				}
1052			}
1053			return true;
1054		},
1055
1056		/* Pop-up the date picker for a given input field.
1057         * If false returned from beforeShow event handler do not show.
1058         * @param  input  element - the input field attached to the date picker or
vendor: 4,370 bytes, lines 1059-1180
1059         *					event - if triggered by focus
1060         */
1061		_showDatepicker: function( input ) {
1062			input = input.target || input;
1063			if ( input.nodeName.toLowerCase() !== "input" ) { // find from button/image trigger
1064				input = $( "input", input.parentNode )[ 0 ];
1065			}
1066
1067			if ( $.datepicker._isDisabledDatepicker( input ) || $.datepicker._lastInput === input ) { // already here
1068				return;
1069			}
1070
1071			var inst, beforeShow, beforeShowSettings, isFixed,
1072				offset, showAnim, duration;
1073
1074			inst = $.datepicker._getInst( input );
1075			if ( $.datepicker._curInst && $.datepicker._curInst !== inst ) {
1076				$.datepicker._curInst.dpDiv.stop( true, true );
1077				if ( inst && $.datepicker._datepickerShowing ) {
1078					$.datepicker._hideDatepicker( $.datepicker._curInst.input[ 0 ] );
1079				}
1080			}
1081
1082			beforeShow = $.datepicker._get( inst, "beforeShow" );
1083			beforeShowSettings = beforeShow ? beforeShow.apply( input, [ input, inst ] ) : {};
1084			if ( beforeShowSettings === false ) {
1085				return;
1086			}
1087			datepicker_extendRemove( inst.settings, beforeShowSettings );
1088
1089			inst.lastVal = null;
1090			$.datepicker._lastInput = input;
1091			$.datepicker._setDateFromField( inst );
1092
1093			if ( $.datepicker._inDialog ) { // hide cursor
1094				input.value = "";
1095			}
1096			if ( !$.datepicker._pos ) { // position below input
1097				$.datepicker._pos = $.datepicker._findPos( input );
1098				$.datepicker._pos[ 1 ] += input.offsetHeight; // add the height
1099			}
1100
1101			isFixed = false;
1102			$( input ).parents().each( function() {
1103				isFixed |= $( this ).css( "position" ) === "fixed";
1104				return !isFixed;
1105			} );
1106
1107			offset = { left: $.datepicker._pos[ 0 ], top: $.datepicker._pos[ 1 ] };
1108			$.datepicker._pos = null;
1109
1110			//to avoid flashes on Firefox
1111			inst.dpDiv.empty();
1112
1113			// determine sizing offscreen
1114			inst.dpDiv.css( { position: "absolute", display: "block", top: "-1000px" } );
1115			$.datepicker._updateDatepicker( inst );
1116
1117			// fix width for dynamic number of date pickers
1118			// and adjust position before showing
1119			offset = $.datepicker._checkOffset( inst, offset, isFixed );
1120			inst.dpDiv.css( { position: ( $.datepicker._inDialog && $.blockUI ?
1121					"static" : ( isFixed ? "fixed" : "absolute" ) ), display: "none",
1122				left: offset.left + "px", top: offset.top + "px" } );
1123
1124			if ( !inst.inline ) {
1125				showAnim = $.datepicker._get( inst, "showAnim" );
1126				duration = $.datepicker._get( inst, "duration" );
1127				inst.dpDiv.css( "z-index", datepicker_getZindex( $( input ) ) + 1 );
1128				$.datepicker._datepickerShowing = true;
1129
1130				if ( $.effects && $.effects.effect[ showAnim ] ) {
1131					inst.dpDiv.show( showAnim, $.datepicker._get( inst, "showOptions" ), duration );
1132				} else {
1133					inst.dpDiv[ showAnim || "show" ]( showAnim ? duration : null );
1134				}
1135
1136				if ( $.datepicker._shouldFocusInput( inst ) ) {
1137					inst.input.trigger( "focus" );
1138				}
1139
1140				$.datepicker._curInst = inst;
1141			}
1142		},
1143
1144		/* Generate the date picker content. */
1145		_updateDatepicker: function( inst ) {
1146			this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
1147			datepicker_instActive = inst; // for delegate hover events
1148			inst.dpDiv.empty().append( this._generateHTML( inst ) );
1149			this._attachHandlers( inst );
1150
1151			var origyearshtml,
1152				numMonths = this._getNumberOfMonths( inst ),
1153				cols = numMonths[ 1 ],
1154				width = 17,
1155				activeCell = inst.dpDiv.find( "." + this._dayOverClass + " a" );
1156
1157			if ( activeCell.length > 0 ) {
1158				datepicker_handleMouseover.apply( activeCell.get( 0 ) );
1159			}
1160
1161			inst.dpDiv.removeClass( "ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4" ).width( "" );
1162			if ( cols > 1 ) {
1163				inst.dpDiv.addClass( "ui-datepicker-multi-" + cols ).css( "width", ( width * cols ) + "em" );
1164			}
1165			inst.dpDiv[ ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ? "add" : "remove" ) +
1166			"Class" ]( "ui-datepicker-multi" );
1167			inst.dpDiv[ ( this._get( inst, "isRTL" ) ? "add" : "remove" ) +
1168			"Class" ]( "ui-datepicker-rtl" );
1169
1170			if ( inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {
1171				inst.input.trigger( "focus" );
1172			}
1173
1174			// Deffered render of the years select (to avoid flashes on Firefox)
1175			if ( inst.yearshtml ) {
1176				origyearshtml = inst.yearshtml;
1177				setTimeout( function() {
1178
1179					//assure that inst.yearshtml didn't change.
1180					if ( origyearshtml === inst.yearshtml && inst.yearshtml ) {
vendor: 4,574 bytes, lines 1181-1303
1181						inst.dpDiv.find( "select.ui-datepicker-year:first" ).replaceWith( inst.yearshtml );
1182					}
1183					origyearshtml = inst.yearshtml = null;
1184				}, 0 );
1185			}
1186		},
1187
1188		// #6694 - don't focus the input if it's already focused
1189		// this breaks the change event in IE
1190		// Support: IE and jQuery <1.9
1191		_shouldFocusInput: function( inst ) {
1192			return inst.input && inst.input.is( ":visible" ) && !inst.input.is( ":disabled" ) && !inst.input.is( ":focus" );
1193		},
1194
1195		/* Check positioning to remain on screen. */
1196		_checkOffset: function( inst, offset, isFixed ) {
1197			var dpWidth = inst.dpDiv.outerWidth(),
1198				dpHeight = inst.dpDiv.outerHeight(),
1199				inputWidth = inst.input ? inst.input.outerWidth() : 0,
1200				inputHeight = inst.input ? inst.input.outerHeight() : 0,
1201				viewWidth = document.documentElement.clientWidth + ( isFixed ? 0 : $( document ).scrollLeft() ),
1202				viewHeight = document.documentElement.clientHeight + ( isFixed ? 0 : $( document ).scrollTop() );
1203
1204			offset.left -= ( this._get( inst, "isRTL" ) ? ( dpWidth - inputWidth ) : 0 );
1205			offset.left -= ( isFixed && offset.left === inst.input.offset().left ) ? $( document ).scrollLeft() : 0;
1206			offset.top -= ( isFixed && offset.top === ( inst.input.offset().top + inputHeight ) ) ? $( document ).scrollTop() : 0;
1207
1208			// Now check if datepicker is showing outside window viewport - move to a better place if so.
1209			offset.left -= Math.min( offset.left, ( offset.left + dpWidth > viewWidth && viewWidth > dpWidth ) ?
1210				Math.abs( offset.left + dpWidth - viewWidth ) : 0 );
1211			offset.top -= Math.min( offset.top, ( offset.top + dpHeight > viewHeight && viewHeight > dpHeight ) ?
1212				Math.abs( dpHeight + inputHeight ) : 0 );
1213
1214			return offset;
1215		},
1216
1217		/* Find an object's position on the screen. */
1218		_findPos: function( obj ) {
1219			var position,
1220				inst = this._getInst( obj ),
1221				isRTL = this._get( inst, "isRTL" );
1222
1223			while ( obj && ( obj.type === "hidden" || obj.nodeType !== 1 || $.expr.filters.hidden( obj ) ) ) {
1224				obj = obj[ isRTL ? "previousSibling" : "nextSibling" ];
1225			}
1226
1227			position = $( obj ).offset();
1228			return [ position.left, position.top ];
1229		},
1230
1231		/* Hide the date picker from view.
1232         * @param  input  element - the input field attached to the date picker
1233         */
1234		_hideDatepicker: function( input ) {
1235			var showAnim, duration, postProcess, onClose,
1236				inst = this._curInst;
1237
1238			if ( !inst || ( input && inst !== $.data( input, "datepicker" ) ) ) {
1239				return;
1240			}
1241
1242			if ( this._datepickerShowing ) {
1243				showAnim = this._get( inst, "showAnim" );
1244				duration = this._get( inst, "duration" );
1245				postProcess = function() {
1246					$.datepicker._tidyDialog( inst );
1247				};
1248
1249				// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
1250				if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {
1251					inst.dpDiv.hide( showAnim, $.datepicker._get( inst, "showOptions" ), duration, postProcess );
1252				} else {
1253					inst.dpDiv[ ( showAnim === "slideDown" ? "slideUp" :
1254						( showAnim === "fadeIn" ? "fadeOut" : "hide" ) ) ]( ( showAnim ? duration : null ), postProcess );
1255				}
1256
1257				if ( !showAnim ) {
1258					postProcess();
1259				}
1260				this._datepickerShowing = false;
1261
1262				onClose = this._get( inst, "onClose" );
1263				if ( onClose ) {
1264					onClose.apply( ( inst.input ? inst.input[ 0 ] : null ), [ ( inst.input ? inst.input.val() : "" ), inst ] );
1265				}
1266
1267				this._lastInput = null;
1268				if ( this._inDialog ) {
1269					this._dialogInput.css( { position: "absolute", left: "0", top: "-100px" } );
1270					if ( $.blockUI ) {
1271						$.unblockUI();
1272						$( "body" ).append( this.dpDiv );
1273					}
1274				}
1275				this._inDialog = false;
1276			}
1277		},
1278
1279		/* Tidy up after a dialog display. */
1280		_tidyDialog: function( inst ) {
1281			inst.dpDiv.removeClass( this._dialogClass ).off( ".ui-datepicker-calendar" );
1282		},
1283
1284		/* Close date picker if clicked elsewhere. */
1285		_checkExternalClick: function( event ) {
1286			if ( !$.datepicker._curInst ) {
1287				return;
1288			}
1289
1290			var $target = $( event.target ),
1291				inst = $.datepicker._getInst( $target[ 0 ] );
1292
1293			if ( ( ( $target[ 0 ].id !== $.datepicker._mainDivId &&
1294				$target.parents( "#" + $.datepicker._mainDivId ).length === 0 &&
1295				!$target.hasClass( $.datepicker.markerClassName ) &&
1296				!$target.closest( "." + $.datepicker._triggerClass ).length &&
1297				$.datepicker._datepickerShowing && !( $.datepicker._inDialog && $.blockUI ) ) ) ||
1298				( $target.hasClass( $.datepicker.markerClassName ) && $.datepicker._curInst !== inst ) ) {
1299				$.datepicker._hideDatepicker();
1300			}
1301		},
1302
1303		/* Adjust one of the date sub-fields. */
vendor: 4,647 bytes, lines 1304-1445
1304		_adjustDate: function( id, offset, period ) {
1305			var target = $( id ),
1306				inst = this._getInst( target[ 0 ] );
1307
1308			if ( this._isDisabledDatepicker( target[ 0 ] ) ) {
1309				return;
1310			}
1311			this._adjustInstDate( inst, offset +
1312				( period === "M" ? this._get( inst, "showCurrentAtPos" ) : 0 ), // undo positioning
1313				period );
1314			this._updateDatepicker( inst );
1315		},
1316
1317		/* Action for current link. */
1318		_gotoToday: function( id ) {
1319			var date,
1320				target = $( id ),
1321				inst = this._getInst( target[ 0 ] );
1322
1323			if ( this._get( inst, "gotoCurrent" ) && inst.currentDay ) {
1324				inst.selectedDay = inst.currentDay;
1325				inst.drawMonth = inst.selectedMonth = inst.currentMonth;
1326				inst.drawYear = inst.selectedYear = inst.currentYear;
1327			} else {
1328				date = new Date();
1329				inst.selectedDay = date.getDate();
1330				inst.drawMonth = inst.selectedMonth = date.getMonth();
1331				inst.drawYear = inst.selectedYear = date.getFullYear();
1332			}
1333			this._notifyChange( inst );
1334			this._adjustDate( target );
1335		},
1336
1337		/* Action for selecting a new month/year. */
1338		_selectMonthYear: function( id, select, period ) {
1339			var target = $( id ),
1340				inst = this._getInst( target[ 0 ] );
1341
1342			inst[ "selected" + ( period === "M" ? "Month" : "Year" ) ] =
1343				inst[ "draw" + ( period === "M" ? "Month" : "Year" ) ] =
1344					parseInt( select.options[ select.selectedIndex ].value, 10 );
1345
1346			this._notifyChange( inst );
1347			this._adjustDate( target );
1348		},
1349
1350		/* Action for selecting a day. */
1351		_selectDay: function( id, month, year, td ) {
1352			var inst,
1353				target = $( id );
1354
1355			if ( $( td ).hasClass( this._unselectableClass ) || this._isDisabledDatepicker( target[ 0 ] ) ) {
1356				return;
1357			}
1358
1359			inst = this._getInst( target[ 0 ] );
1360			inst.selectedDay = inst.currentDay = $( "a", td ).html();
1361			inst.selectedMonth = inst.currentMonth = month;
1362			inst.selectedYear = inst.currentYear = year;
1363			this._selectDate( id, this._formatDate( inst,
1364				inst.currentDay, inst.currentMonth, inst.currentYear ) );
1365		},
1366
1367		/* Erase the input field and hide the date picker. */
1368		_clearDate: function( id ) {
1369			var target = $( id );
1370			this._selectDate( target, "" );
1371		},
1372
1373		/* Update the input field with the selected date. */
1374		_selectDate: function( id, dateStr ) {
1375			var onSelect,
1376				target = $( id ),
1377				inst = this._getInst( target[ 0 ] );
1378
1379			dateStr = ( dateStr != null ? dateStr : this._formatDate( inst ) );
1380			if ( inst.input ) {
1381				inst.input.val( dateStr );
1382			}
1383			this._updateAlternate( inst );
1384
1385			onSelect = this._get( inst, "onSelect" );
1386			if ( onSelect ) {
1387				onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );  // trigger custom callback
1388			} else if ( inst.input ) {
1389				inst.input.trigger( "change" ); // fire the change event
1390			}
1391
1392			if ( inst.inline ) {
1393				this._updateDatepicker( inst );
1394			} else {
1395				this._hideDatepicker();
1396				this._lastInput = inst.input[ 0 ];
1397				if ( typeof( inst.input[ 0 ] ) !== "object" ) {
1398					inst.input.trigger( "focus" ); // restore focus
1399				}
1400				this._lastInput = null;
1401			}
1402		},
1403
1404		/* Update any alternate field to synchronise with the main field. */
1405		_updateAlternate: function( inst ) {
1406			var altFormat, date, dateStr,
1407				altField = this._get( inst, "altField" );
1408
1409			if ( altField ) { // update alternate field too
1410				altFormat = this._get( inst, "altFormat" ) || this._get( inst, "dateFormat" );
1411				date = this._getDate( inst );
1412				dateStr = this.formatDate( altFormat, date, this._getFormatConfig( inst ) );
1413				$( altField ).val( dateStr );
1414			}
1415		},
1416
1417		/* Set as beforeShowDay function to prevent selection of weekends.
1418         * @param  date  Date - the date to customise
1419         * @return [boolean, string] - is this date selectable?, what is its CSS class?
1420         */
1421		noWeekends: function( date ) {
1422			var day = date.getDay();
1423			return [ ( day > 0 && day < 6 ), "" ];
1424		},
1425
1426		/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
1427         * @param  date  Date - the date to get the week for
1428         * @return  number - the number of the week within the year that contains this date
1429         */
1430		iso8601Week: function( date ) {
1431			var time,
1432				checkDate = new Date( date.getTime() );
1433
1434			// Find Thursday of this week starting on Monday
1435			checkDate.setDate( checkDate.getDate() + 4 - ( checkDate.getDay() || 7 ) );
1436
1437			time = checkDate.getTime();
1438			checkDate.setMonth( 0 ); // Compare with Jan 1
1439			checkDate.setDate( 1 );
1440			return Math.floor( Math.round( ( time - checkDate ) / 86400000 ) / 7 ) + 1;
1441		},
1442
1443		/* Parse a string value into a date object.
1444         * See formatDate below for the possible formats.
1445         *
vendor: 18,891 bytes, lines 1446-1999
1446         * @param  format string - the expected format of the date
1447         * @param  value string - the date in the above format
1448         * @param  settings Object - attributes include:
1449         *					shortYearCutoff  number - the cutoff year for determining the century (optional)
1450         *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
1451         *					dayNames		string[7] - names of the days from Sunday (optional)
1452         *					monthNamesShort string[12] - abbreviated names of the months (optional)
1453         *					monthNames		string[12] - names of the months (optional)
1454         * @return  Date - the extracted date value or null if value is blank
1455         */
1456		parseDate: function( format, value, settings ) {
1457			if ( format == null || value == null ) {
1458				throw "Invalid arguments";
1459			}
1460
1461			value = ( typeof value === "object" ? value.toString() : value + "" );
1462			if ( value === "" ) {
1463				return null;
1464			}
1465
1466			var iFormat, dim, extra,
1467				iValue = 0,
1468				shortYearCutoffTemp = ( settings ? settings.shortYearCutoff : null ) || this._defaults.shortYearCutoff,
1469				shortYearCutoff = ( typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp :
1470					new Date().getFullYear() % 100 + parseInt( shortYearCutoffTemp, 10 ) ),
1471				dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,
1472				dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,
1473				monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,
1474				monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,
1475				year = -1,
1476				month = -1,
1477				day = -1,
1478				doy = -1,
1479				literal = false,
1480				date,
1481
1482				// Check whether a format character is doubled
1483				lookAhead = function( match ) {
1484					var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
1485					if ( matches ) {
1486						iFormat++;
1487					}
1488					return matches;
1489				},
1490
1491				// Extract a number from the string value
1492				getNumber = function( match ) {
1493					var isDoubled = lookAhead( match ),
1494						size = ( match === "@" ? 14 : ( match === "!" ? 20 :
1495							( match === "y" && isDoubled ? 4 : ( match === "o" ? 3 : 2 ) ) ) ),
1496						minSize = ( match === "y" ? size : 1 ),
1497						digits = new RegExp( "^\\d{" + minSize + "," + size + "}" ),
1498						num = value.substring( iValue ).match( digits );
1499					if ( !num ) {
1500						throw "Missing number at position " + iValue;
1501					}
1502					iValue += num[ 0 ].length;
1503					return parseInt( num[ 0 ], 10 );
1504				},
1505
1506				// Extract a name from the string value and convert to an index
1507				getName = function( match, shortNames, longNames ) {
1508					var index = -1,
1509						names = $.map( lookAhead( match ) ? longNames : shortNames, function( v, k ) {
1510							return [ [ k, v ] ];
1511						} ).sort( function( a, b ) {
1512							return -( a[ 1 ].length - b[ 1 ].length );
1513						} );
1514
1515					$.each( names, function( i, pair ) {
1516						var name = pair[ 1 ];
1517						if ( value.substr( iValue, name.length ).toLowerCase() === name.toLowerCase() ) {
1518							index = pair[ 0 ];
1519							iValue += name.length;
1520							return false;
1521						}
1522					} );
1523					if ( index !== -1 ) {
1524						return index + 1;
1525					} else {
1526						throw "Unknown name at position " + iValue;
1527					}
1528				},
1529
1530				// Confirm that a literal character matches the string value
1531				checkLiteral = function() {
1532					if ( value.charAt( iValue ) !== format.charAt( iFormat ) ) {
1533						throw "Unexpected literal at position " + iValue;
1534					}
1535					iValue++;
1536				};
1537
1538			for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
1539				if ( literal ) {
1540					if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
1541						literal = false;
1542					} else {
1543						checkLiteral();
1544					}
1545				} else {
1546					switch ( format.charAt( iFormat ) ) {
1547						case "d":
1548							day = getNumber( "d" );
1549							break;
1550						case "D":
1551							getName( "D", dayNamesShort, dayNames );
1552							break;
1553						case "o":
1554							doy = getNumber( "o" );
1555							break;
1556						case "m":
1557							month = getNumber( "m" );
1558							break;
1559						case "M":
1560							month = getName( "M", monthNamesShort, monthNames );
1561							break;
1562						case "y":
1563							year = getNumber( "y" );
1564							break;
1565						case "@":
1566							date = new Date( getNumber( "@" ) );
1567							year = date.getFullYear();
1568							month = date.getMonth() + 1;
1569							day = date.getDate();
1570							break;
1571						case "!":
1572							date = new Date( ( getNumber( "!" ) - this._ticksTo1970 ) / 10000 );
1573							year = date.getFullYear();
1574							month = date.getMonth() + 1;
1575							day = date.getDate();
1576							break;
1577						case "'":
1578							if ( lookAhead( "'" ) ) {
1579								checkLiteral();
1580							} else {
1581								literal = true;
1582							}
1583							break;
1584						default:
1585							checkLiteral();
1586					}
1587				}
1588			}
1589
1590			if ( iValue < value.length ) {
1591				extra = value.substr( iValue );
1592				if ( !/^\s+/.test( extra ) ) {
1593					throw "Extra/unparsed characters found in date: " + extra;
1594				}
1595			}
1596
1597			if ( year === -1 ) {
1598				year = new Date().getFullYear();
1599			} else if ( year < 100 ) {
1600				year += new Date().getFullYear() - new Date().getFullYear() % 100 +
1601					( year <= shortYearCutoff ? 0 : -100 );
1602			}
1603
1604			if ( doy > -1 ) {
1605				month = 1;
1606				day = doy;
1607				do {
1608					dim = this._getDaysInMonth( year, month - 1 );
1609					if ( day <= dim ) {
1610						break;
1611					}
1612					month++;
1613					day -= dim;
1614				} while ( true );
1615			}
1616
1617			date = this._daylightSavingAdjust( new Date( year, month - 1, day ) );
1618			if ( date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day ) {
1619				throw "Invalid date"; // E.g. 31/02/00
1620			}
1621			return date;
1622		},
1623
1624		/* Standard date formats. */
1625		ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601)
1626		COOKIE: "D, dd M yy",
1627		ISO_8601: "yy-mm-dd",
1628		RFC_822: "D, d M y",
1629		RFC_850: "DD, dd-M-y",
1630		RFC_1036: "D, d M y",
1631		RFC_1123: "D, d M yy",
1632		RFC_2822: "D, d M yy",
1633		RSS: "D, d M y", // RFC 822
1634		TICKS: "!",
1635		TIMESTAMP: "@",
1636		W3C: "yy-mm-dd", // ISO 8601
1637
1638		_ticksTo1970: ( ( ( 1970 - 1 ) * 365 + Math.floor( 1970 / 4 ) - Math.floor( 1970 / 100 ) +
1639			Math.floor( 1970 / 400 ) ) * 24 * 60 * 60 * 10000000 ),
1640
1641		/* Format a date object into a string value.
1642         * The format can be combinations of the following:
1643         * d  - day of month (no leading zero)
1644         * dd - day of month (two digit)
1645         * o  - day of year (no leading zeros)
1646         * oo - day of year (three digit)
1647         * D  - day name short
1648         * DD - day name long
1649         * m  - month of year (no leading zero)
1650         * mm - month of year (two digit)
1651         * M  - month name short
1652         * MM - month name long
1653         * y  - year (two digit)
1654         * yy - year (four digit)
1655         * @ - Unix timestamp (ms since 01/01/1970)
1656         * ! - Windows ticks (100ns since 01/01/0001)
1657         * "..." - literal text
1658         * '' - single quote
1659         *
1660         * @param  format string - the desired format of the date
1661         * @param  date Date - the date value to format
1662         * @param  settings Object - attributes include:
1663         *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
1664         *					dayNames		string[7] - names of the days from Sunday (optional)
1665         *					monthNamesShort string[12] - abbreviated names of the months (optional)
1666         *					monthNames		string[12] - names of the months (optional)
1667         * @return  string - the date in the above format
1668         */
1669		formatDate: function( format, date, settings ) {
1670			if ( !date ) {
1671				return "";
1672			}
1673
1674			var iFormat,
1675				dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,
1676				dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,
1677				monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,
1678				monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,
1679
1680				// Check whether a format character is doubled
1681				lookAhead = function( match ) {
1682					var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
1683					if ( matches ) {
1684						iFormat++;
1685					}
1686					return matches;
1687				},
1688
1689				// Format a number, with leading zero if necessary
1690				formatNumber = function( match, value, len ) {
1691					var num = "" + value;
1692					if ( lookAhead( match ) ) {
1693						while ( num.length < len ) {
1694							num = "0" + num;
1695						}
1696					}
1697					return num;
1698				},
1699
1700				// Format a name, short or long as requested
1701				formatName = function( match, value, shortNames, longNames ) {
1702					return ( lookAhead( match ) ? longNames[ value ] : shortNames[ value ] );
1703				},
1704				output = "",
1705				literal = false;
1706
1707			if ( date ) {
1708				for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
1709					if ( literal ) {
1710						if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
1711							literal = false;
1712						} else {
1713							output += format.charAt( iFormat );
1714						}
1715					} else {
1716						switch ( format.charAt( iFormat ) ) {
1717							case "d":
1718								output += formatNumber( "d", date.getDate(), 2 );
1719								break;
1720							case "D":
1721								output += formatName( "D", date.getDay(), dayNamesShort, dayNames );
1722								break;
1723							case "o":
1724								output += formatNumber( "o",
1725									Math.round( ( new Date( date.getFullYear(), date.getMonth(), date.getDate() ).getTime() - new Date( date.getFullYear(), 0, 0 ).getTime() ) / 86400000 ), 3 );
1726								break;
1727							case "m":
1728								output += formatNumber( "m", date.getMonth() + 1, 2 );
1729								break;
1730							case "M":
1731								output += formatName( "M", date.getMonth(), monthNamesShort, monthNames );
1732								break;
1733							case "y":
1734								output += ( lookAhead( "y" ) ? date.getFullYear() :
1735									( date.getFullYear() % 100 < 10 ? "0" : "" ) + date.getFullYear() % 100 );
1736								break;
1737							case "@":
1738								output += date.getTime();
1739								break;
1740							case "!":
1741								output += date.getTime() * 10000 + this._ticksTo1970;
1742								break;
1743							case "'":
1744								if ( lookAhead( "'" ) ) {
1745									output += "'";
1746								} else {
1747									literal = true;
1748								}
1749								break;
1750							default:
1751								output += format.charAt( iFormat );
1752						}
1753					}
1754				}
1755			}
1756			return output;
1757		},
1758
1759		/* Extract all possible characters from the date format. */
1760		_possibleChars: function( format ) {
1761			var iFormat,
1762				chars = "",
1763				literal = false,
1764
1765				// Check whether a format character is doubled
1766				lookAhead = function( match ) {
1767					var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
1768					if ( matches ) {
1769						iFormat++;
1770					}
1771					return matches;
1772				};
1773
1774			for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
1775				if ( literal ) {
1776					if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
1777						literal = false;
1778					} else {
1779						chars += format.charAt( iFormat );
1780					}
1781				} else {
1782					switch ( format.charAt( iFormat ) ) {
1783						case "d": case "m": case "y": case "@":
1784							chars += "0123456789";
1785							break;
1786						case "D": case "M":
1787							return null; // Accept anything
1788						case "'":
1789							if ( lookAhead( "'" ) ) {
1790								chars += "'";
1791							} else {
1792								literal = true;
1793							}
1794							break;
1795						default:
1796							chars += format.charAt( iFormat );
1797					}
1798				}
1799			}
1800			return chars;
1801		},
1802
1803		/* Get a setting value, defaulting if necessary. */
1804		_get: function( inst, name ) {
1805			return inst.settings[ name ] !== undefined ?
1806				inst.settings[ name ] : this._defaults[ name ];
1807		},
1808
1809		/* Parse existing date and initialise date picker. */
1810		_setDateFromField: function( inst, noDefault ) {
1811			if ( inst.input.val() === inst.lastVal ) {
1812				return;
1813			}
1814
1815			var dateFormat = this._get( inst, "dateFormat" ),
1816				dates = inst.lastVal = inst.input ? inst.input.val() : null,
1817				defaultDate = this._getDefaultDate( inst ),
1818				date = defaultDate,
1819				settings = this._getFormatConfig( inst );
1820
1821			try {
1822				date = this.parseDate( dateFormat, dates, settings ) || defaultDate;
1823			} catch ( event ) {
1824				dates = ( noDefault ? "" : dates );
1825			}
1826			inst.selectedDay = date.getDate();
1827			inst.drawMonth = inst.selectedMonth = date.getMonth();
1828			inst.drawYear = inst.selectedYear = date.getFullYear();
1829			inst.currentDay = ( dates ? date.getDate() : 0 );
1830			inst.currentMonth = ( dates ? date.getMonth() : 0 );
1831			inst.currentYear = ( dates ? date.getFullYear() : 0 );
1832			this._adjustInstDate( inst );
1833		},
1834
1835		/* Retrieve the default date shown on opening. */
1836		_getDefaultDate: function( inst ) {
1837			return this._restrictMinMax( inst,
1838				this._determineDate( inst, this._get( inst, "defaultDate" ), new Date() ) );
1839		},
1840
1841		/* A date may be specified as an exact value or a relative one. */
1842		_determineDate: function( inst, date, defaultDate ) {
1843			var offsetNumeric = function( offset ) {
1844					var date = new Date();
1845					date.setDate( date.getDate() + offset );
1846					return date;
1847				},
1848				offsetString = function( offset ) {
1849					try {
1850						return $.datepicker.parseDate( $.datepicker._get( inst, "dateFormat" ),
1851							offset, $.datepicker._getFormatConfig( inst ) );
1852					}
1853					catch ( e ) {
1854
1855						// Ignore
1856					}
1857
1858					var date = ( offset.toLowerCase().match( /^c/ ) ?
1859						$.datepicker._getDate( inst ) : null ) || new Date(),
1860						year = date.getFullYear(),
1861						month = date.getMonth(),
1862						day = date.getDate(),
1863						pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,
1864						matches = pattern.exec( offset );
1865
1866					while ( matches ) {
1867						switch ( matches[ 2 ] || "d" ) {
1868							case "d" : case "D" :
1869								day += parseInt( matches[ 1 ], 10 ); break;
1870							case "w" : case "W" :
1871								day += parseInt( matches[ 1 ], 10 ) * 7; break;
1872							case "m" : case "M" :
1873								month += parseInt( matches[ 1 ], 10 );
1874								day = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );
1875								break;
1876							case "y": case "Y" :
1877								year += parseInt( matches[ 1 ], 10 );
1878								day = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );
1879								break;
1880						}
1881						matches = pattern.exec( offset );
1882					}
1883					return new Date( year, month, day );
1884				},
1885				newDate = ( date == null || date === "" ? defaultDate : ( typeof date === "string" ? offsetString( date ) :
1886					( typeof date === "number" ? ( isNaN( date ) ? defaultDate : offsetNumeric( date ) ) : new Date( date.getTime() ) ) ) );
1887
1888			newDate = ( newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate );
1889			if ( newDate ) {
1890				newDate.setHours( 0 );
1891				newDate.setMinutes( 0 );
1892				newDate.setSeconds( 0 );
1893				newDate.setMilliseconds( 0 );
1894			}
1895			return this._daylightSavingAdjust( newDate );
1896		},
1897
1898		/* Handle switch to/from daylight saving.
1899         * Hours may be non-zero on daylight saving cut-over:
1900         * > 12 when midnight changeover, but then cannot generate
1901         * midnight datetime, so jump to 1AM, otherwise reset.
1902         * @param  date  (Date) the date to check
1903         * @return  (Date) the corrected date
1904         */
1905		_daylightSavingAdjust: function( date ) {
1906			if ( !date ) {
1907				return null;
1908			}
1909			date.setHours( date.getHours() > 12 ? date.getHours() + 2 : 0 );
1910			return date;
1911		},
1912
1913		/* Set the date(s) directly. */
1914		_setDate: function( inst, date, noChange ) {
1915			var clear = !date,
1916				origMonth = inst.selectedMonth,
1917				origYear = inst.selectedYear,
1918				newDate = this._restrictMinMax( inst, this._determineDate( inst, date, new Date() ) );
1919
1920			inst.selectedDay = inst.currentDay = newDate.getDate();
1921			inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
1922			inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
1923			if ( ( origMonth !== inst.selectedMonth || origYear !== inst.selectedYear ) && !noChange ) {
1924				this._notifyChange( inst );
1925			}
1926			this._adjustInstDate( inst );
1927			if ( inst.input ) {
1928				inst.input.val( clear ? "" : this._formatDate( inst ) );
1929			}
1930		},
1931
1932		/* Retrieve the date(s) directly. */
1933		_getDate: function( inst ) {
1934			var startDate = ( !inst.currentYear || ( inst.input && inst.input.val() === "" ) ? null :
1935				this._daylightSavingAdjust( new Date(
1936					inst.currentYear, inst.currentMonth, inst.currentDay ) ) );
1937			return startDate;
1938		},
1939
1940		/* Attach the onxxx handlers.  These are declared statically so
1941         * they work with static code transformers like Caja.
1942         */
1943		_attachHandlers: function( inst ) {
1944			var stepMonths = this._get( inst, "stepMonths" ),
1945				id = "#" + inst.id.replace( /\\\\/g, "\\" );
1946			inst.dpDiv.find( "[data-handler]" ).map( function() {
1947				var handler = {
1948					prev: function() {
1949						$.datepicker._adjustDate( id, -stepMonths, "M" );
1950					},
1951					next: function() {
1952						$.datepicker._adjustDate( id, +stepMonths, "M" );
1953					},
1954					hide: function() {
1955						$.datepicker._hideDatepicker();
1956					},
1957					today: function() {
1958						$.datepicker._gotoToday( id );
1959					},
1960					selectDay: function() {
1961						$.datepicker._selectDay( id, +this.getAttribute( "data-month" ), +this.getAttribute( "data-year" ), this );
1962						return false;
1963					},
1964					selectMonth: function() {
1965						$.datepicker._selectMonthYear( id, this, "M" );
1966						return false;
1967					},
1968					selectYear: function() {
1969						$.datepicker._selectMonthYear( id, this, "Y" );
1970						return false;
1971					}
1972				};
1973				$( this ).on( this.getAttribute( "data-event" ), handler[ this.getAttribute( "data-handler" ) ] );
1974			} );
1975		},
1976
1977		/* Generate the HTML for the current state of the date picker. */
1978		_generateHTML: function( inst ) {
1979			var maxDraw, prevText, prev, nextText, next, currentText, gotoDate,
1980				controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,
1981				monthNames, monthNamesShort, beforeShowDay, showOtherMonths,
1982				selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,
1983				cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,
1984				printDate, dRow, tbody, daySettings, otherMonth, unselectable,
1985				tempDate = new Date(),
1986				today = this._daylightSavingAdjust(
1987					new Date( tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate() ) ), // clear time
1988				isRTL = this._get( inst, "isRTL" ),
1989				showButtonPanel = this._get( inst, "showButtonPanel" ),
1990				hideIfNoPrevNext = this._get( inst, "hideIfNoPrevNext" ),
1991				navigationAsDateFormat = this._get( inst, "navigationAsDateFormat" ),
1992				numMonths = this._getNumberOfMonths( inst ),
1993				showCurrentAtPos = this._get( inst, "showCurrentAtPos" ),
1994				stepMonths = this._get( inst, "stepMonths" ),
1995				isMultiMonth = ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ),
1996				currentDate = this._daylightSavingAdjust( ( !inst.currentDay ? new Date( 9999, 9, 9 ) :
1997					new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) ),
1998				minDate = this._getMinMaxDate( inst, "min" ),
1999				maxDate = this._getMinMaxDate( inst, "max" ),
vendor: 4,228 bytes, lines 2000-2079
2000				drawMonth = inst.drawMonth - showCurrentAtPos,
2001				drawYear = inst.drawYear;
2002
2003			if ( drawMonth < 0 ) {
2004				drawMonth += 12;
2005				drawYear--;
2006			}
2007			if ( maxDate ) {
2008				maxDraw = this._daylightSavingAdjust( new Date( maxDate.getFullYear(),
2009					maxDate.getMonth() - ( numMonths[ 0 ] * numMonths[ 1 ] ) + 1, maxDate.getDate() ) );
2010				maxDraw = ( minDate && maxDraw < minDate ? minDate : maxDraw );
2011				while ( this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 ) ) > maxDraw ) {
2012					drawMonth--;
2013					if ( drawMonth < 0 ) {
2014						drawMonth = 11;
2015						drawYear--;
2016					}
2017				}
2018			}
2019			inst.drawMonth = drawMonth;
2020			inst.drawYear = drawYear;
2021
2022			prevText = this._get( inst, "prevText" );
2023			prevText = ( !navigationAsDateFormat ? prevText : this.formatDate( prevText,
2024				this._daylightSavingAdjust( new Date( drawYear, drawMonth - stepMonths, 1 ) ),
2025				this._getFormatConfig( inst ) ) );
2026
2027			prev = ( this._canAdjustMonth( inst, -1, drawYear, drawMonth ) ?
2028				"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'" +
2029				" title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w" ) + "'>" + prevText + "</span></a>" :
2030				( hideIfNoPrevNext ? "" : "<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w" ) + "'>" + prevText + "</span></a>" ) );
2031
2032			nextText = this._get( inst, "nextText" );
2033			nextText = ( !navigationAsDateFormat ? nextText : this.formatDate( nextText,
2034				this._daylightSavingAdjust( new Date( drawYear, drawMonth + stepMonths, 1 ) ),
2035				this._getFormatConfig( inst ) ) );
2036
2037			next = ( this._canAdjustMonth( inst, +1, drawYear, drawMonth ) ?
2038				"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'" +
2039				" title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e" ) + "'>" + nextText + "</span></a>" :
2040				( hideIfNoPrevNext ? "" : "<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e" ) + "'>" + nextText + "</span></a>" ) );
2041
2042			currentText = this._get( inst, "currentText" );
2043			gotoDate = ( this._get( inst, "gotoCurrent" ) && inst.currentDay ? currentDate : today );
2044			currentText = ( !navigationAsDateFormat ? currentText :
2045				this.formatDate( currentText, gotoDate, this._getFormatConfig( inst ) ) );
2046
2047			controls = ( !inst.inline ? "<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>" +
2048				this._get( inst, "closeText" ) + "</button>" : "" );
2049
2050			buttonPanel = ( showButtonPanel ) ? "<div class='ui-datepicker-buttonpane ui-widget-content'>" + ( isRTL ? controls : "" ) +
2051				( this._isInRange( inst, gotoDate ) ? "<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'" +
2052					">" + currentText + "</button>" : "" ) + ( isRTL ? "" : controls ) + "</div>" : "";
2053
2054			firstDay = parseInt( this._get( inst, "firstDay" ), 10 );
2055			firstDay = ( isNaN( firstDay ) ? 0 : firstDay );
2056
2057			showWeek = this._get( inst, "showWeek" );
2058			dayNames = this._get( inst, "dayNames" );
2059			dayNamesMin = this._get( inst, "dayNamesMin" );
2060			monthNames = this._get( inst, "monthNames" );
2061			monthNamesShort = this._get( inst, "monthNamesShort" );
2062			beforeShowDay = this._get( inst, "beforeShowDay" );
2063			showOtherMonths = this._get( inst, "showOtherMonths" );
2064			selectOtherMonths = this._get( inst, "selectOtherMonths" );
2065			defaultDate = this._getDefaultDate( inst );
2066			html = "";
2067
2068			for ( row = 0; row < numMonths[ 0 ]; row++ ) {
2069				group = "";
2070				this.maxRows = 4;
2071				for ( col = 0; col < numMonths[ 1 ]; col++ ) {
2072					selectedDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, inst.selectedDay ) );
2073					cornerClass = " ui-corner-all";
2074					calender = "";
2075					if ( isMultiMonth ) {
2076						calender += "<div class='ui-datepicker-group";
2077						if ( numMonths[ 1 ] > 1 ) {
2078							switch ( col ) {
2079								case 0: calender += " ui-datepicker-group-first";
vendor: 5,312 bytes, lines 2080-2158
2080									cornerClass = " ui-corner-" + ( isRTL ? "right" : "left" ); break;
2081								case numMonths[ 1 ] - 1: calender += " ui-datepicker-group-last";
2082									cornerClass = " ui-corner-" + ( isRTL ? "left" : "right" ); break;
2083								default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break;
2084							}
2085						}
2086						calender += "'>";
2087					}
2088					calender += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" +
2089						( /all|left/.test( cornerClass ) && row === 0 ? ( isRTL ? next : prev ) : "" ) +
2090						( /all|right/.test( cornerClass ) && row === 0 ? ( isRTL ? prev : next ) : "" ) +
2091						this._generateMonthYearHeader( inst, drawMonth, drawYear, minDate, maxDate,
2092							row > 0 || col > 0, monthNames, monthNamesShort ) + // draw month headers
2093						"</div><table class='ui-datepicker-calendar'><thead>" +
2094						"<tr>";
2095					thead = ( showWeek ? "<th class='ui-datepicker-week-col'>" + this._get( inst, "weekHeader" ) + "</th>" : "" );
2096					for ( dow = 0; dow < 7; dow++ ) { // days of the week
2097						day = ( dow + firstDay ) % 7;
2098						thead += "<th scope='col'" + ( ( dow + firstDay + 6 ) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "" ) + ">" +
2099							"<span title='" + dayNames[ day ] + "'>" + dayNamesMin[ day ] + "</span></th>";
2100					}
2101					calender += thead + "</tr></thead><tbody>";
2102					daysInMonth = this._getDaysInMonth( drawYear, drawMonth );
2103					if ( drawYear === inst.selectedYear && drawMonth === inst.selectedMonth ) {
2104						inst.selectedDay = Math.min( inst.selectedDay, daysInMonth );
2105					}
2106					leadDays = ( this._getFirstDayOfMonth( drawYear, drawMonth ) - firstDay + 7 ) % 7;
2107					curRows = Math.ceil( ( leadDays + daysInMonth ) / 7 ); // calculate the number of rows to generate
2108					numRows = ( isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows ); //If multiple months, use the higher number of rows (see #7043)
2109					this.maxRows = numRows;
2110					printDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 - leadDays ) );
2111					for ( dRow = 0; dRow < numRows; dRow++ ) { // create date picker rows
2112						calender += "<tr>";
2113						tbody = ( !showWeek ? "" : "<td class='ui-datepicker-week-col'>" +
2114							this._get( inst, "calculateWeek" )( printDate ) + "</td>" );
2115						for ( dow = 0; dow < 7; dow++ ) { // create date picker days
2116							daySettings = ( beforeShowDay ?
2117								beforeShowDay.apply( ( inst.input ? inst.input[ 0 ] : null ), [ printDate ] ) : [ true, "" ] );
2118							otherMonth = ( printDate.getMonth() !== drawMonth );
2119							unselectable = ( otherMonth && !selectOtherMonths ) || !daySettings[ 0 ] ||
2120								( minDate && printDate < minDate ) || ( maxDate && printDate > maxDate );
2121							tbody += "<td class='" +
2122								( ( dow + firstDay + 6 ) % 7 >= 5 ? " ui-datepicker-week-end" : "" ) + // highlight weekends
2123								( otherMonth ? " ui-datepicker-other-month" : "" ) + // highlight days from other months
2124								( ( printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent ) || // user pressed key
2125								( defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime() ) ?
2126
2127									// or defaultDate is current printedDate and defaultDate is selectedDate
2128									" " + this._dayOverClass : "" ) + // highlight selected day
2129								( unselectable ? " " + this._unselectableClass + " ui-state-disabled" : "" ) +  // highlight unselectable days
2130								( otherMonth && !showOtherMonths ? "" : " " + daySettings[ 1 ] + // highlight custom dates
2131									( printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "" ) + // highlight selected day
2132									( printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "" ) ) + "'" + // highlight today (if different)
2133								( ( !otherMonth || showOtherMonths ) && daySettings[ 2 ] ? " title='" + daySettings[ 2 ].replace( /'/g, "&#39;" ) + "'" : "" ) + // cell title
2134								( unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'" ) + ">" + // actions
2135								( otherMonth && !showOtherMonths ? "&#xa0;" : // display for other months
2136									( unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" +
2137										( printDate.getTime() === today.getTime() ? " ui-state-highlight" : "" ) +
2138										( printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "" ) + // highlight selected day
2139										( otherMonth ? " ui-priority-secondary" : "" ) + // distinguish dates from other months
2140										"' href='#'>" + printDate.getDate() + "</a>" ) ) + "</td>"; // display selectable date
2141							printDate.setDate( printDate.getDate() + 1 );
2142							printDate = this._daylightSavingAdjust( printDate );
2143						}
2144						calender += tbody + "</tr>";
2145					}
2146					drawMonth++;
2147					if ( drawMonth > 11 ) {
2148						drawMonth = 0;
2149						drawYear++;
2150					}
2151					calender += "</tbody></table>" + ( isMultiMonth ? "</div>" +
2152						( ( numMonths[ 0 ] > 0 && col === numMonths[ 1 ] - 1 ) ? "<div class='ui-datepicker-row-break'></div>" : "" ) : "" );
2153					group += calender;
2154				}
2155				html += group;
2156			}
2157			html += buttonPanel;
2158			inst._keyEvent = false;
vendor: 4,435 bytes, lines 2159-2269
2159			return html;
2160		},
2161
2162		/* Generate the month and year header. */
2163		_generateMonthYearHeader: function( inst, drawMonth, drawYear, minDate, maxDate,
2164											secondary, monthNames, monthNamesShort ) {
2165
2166			var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,
2167				changeMonth = this._get( inst, "changeMonth" ),
2168				changeYear = this._get( inst, "changeYear" ),
2169				showMonthAfterYear = this._get( inst, "showMonthAfterYear" ),
2170				html = "<div class='ui-datepicker-title'>",
2171				monthHtml = "";
2172
2173			// Month selection
2174			if ( secondary || !changeMonth ) {
2175				monthHtml += "<span class='ui-datepicker-month'>" + monthNames[ drawMonth ] + "</span>";
2176			} else {
2177				inMinYear = ( minDate && minDate.getFullYear() === drawYear );
2178				inMaxYear = ( maxDate && maxDate.getFullYear() === drawYear );
2179				monthHtml += "<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>";
2180				for ( month = 0; month < 12; month++ ) {
2181					if ( ( !inMinYear || month >= minDate.getMonth() ) && ( !inMaxYear || month <= maxDate.getMonth() ) ) {
2182						monthHtml += "<option value='" + month + "'" +
2183							( month === drawMonth ? " selected='selected'" : "" ) +
2184							">" + monthNamesShort[ month ] + "</option>";
2185					}
2186				}
2187				monthHtml += "</select>";
2188			}
2189
2190			if ( !showMonthAfterYear ) {
2191				html += monthHtml + ( secondary || !( changeMonth && changeYear ) ? "&#xa0;" : "" );
2192			}
2193
2194			// Year selection
2195			if ( !inst.yearshtml ) {
2196				inst.yearshtml = "";
2197				if ( secondary || !changeYear ) {
2198					html += "<span class='ui-datepicker-year'>" + drawYear + "</span>";
2199				} else {
2200
2201					// determine range of years to display
2202					years = this._get( inst, "yearRange" ).split( ":" );
2203					thisYear = new Date().getFullYear();
2204					determineYear = function( value ) {
2205						var year = ( value.match( /c[+\-].*/ ) ? drawYear + parseInt( value.substring( 1 ), 10 ) :
2206							( value.match( /[+\-].*/ ) ? thisYear + parseInt( value, 10 ) :
2207								parseInt( value, 10 ) ) );
2208						return ( isNaN( year ) ? thisYear : year );
2209					};
2210					year = determineYear( years[ 0 ] );
2211					endYear = Math.max( year, determineYear( years[ 1 ] || "" ) );
2212					year = ( minDate ? Math.max( year, minDate.getFullYear() ) : year );
2213					endYear = ( maxDate ? Math.min( endYear, maxDate.getFullYear() ) : endYear );
2214					inst.yearshtml += "<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";
2215					for ( ; year <= endYear; year++ ) {
2216						inst.yearshtml += "<option value='" + year + "'" +
2217							( year === drawYear ? " selected='selected'" : "" ) +
2218							">" + year + "</option>";
2219					}
2220					inst.yearshtml += "</select>";
2221
2222					html += inst.yearshtml;
2223					inst.yearshtml = null;
2224				}
2225			}
2226
2227			html += this._get( inst, "yearSuffix" );
2228			if ( showMonthAfterYear ) {
2229				html += ( secondary || !( changeMonth && changeYear ) ? "&#xa0;" : "" ) + monthHtml;
2230			}
2231			html += "</div>"; // Close datepicker_header
2232			return html;
2233		},
2234
2235		/* Adjust one of the date sub-fields. */
2236		_adjustInstDate: function( inst, offset, period ) {
2237			var year = inst.selectedYear + ( period === "Y" ? offset : 0 ),
2238				month = inst.selectedMonth + ( period === "M" ? offset : 0 ),
2239				day = Math.min( inst.selectedDay, this._getDaysInMonth( year, month ) ) + ( period === "D" ? offset : 0 ),
2240				date = this._restrictMinMax( inst, this._daylightSavingAdjust( new Date( year, month, day ) ) );
2241
2242			inst.selectedDay = date.getDate();
2243			inst.drawMonth = inst.selectedMonth = date.getMonth();
2244			inst.drawYear = inst.selectedYear = date.getFullYear();
2245			if ( period === "M" || period === "Y" ) {
2246				this._notifyChange( inst );
2247			}
2248		},
2249
2250		/* Ensure a date is within any min/max bounds. */
2251		_restrictMinMax: function( inst, date ) {
2252			var minDate = this._getMinMaxDate( inst, "min" ),
2253				maxDate = this._getMinMaxDate( inst, "max" ),
2254				newDate = ( minDate && date < minDate ? minDate : date );
2255			return ( maxDate && newDate > maxDate ? maxDate : newDate );
2256		},
2257
2258		/* Notify change of month/year. */
2259		_notifyChange: function( inst ) {
2260			var onChange = this._get( inst, "onChangeMonthYear" );
2261			if ( onChange ) {
2262				onChange.apply( ( inst.input ? inst.input[ 0 ] : null ),
2263					[ inst.selectedYear, inst.selectedMonth + 1, inst ] );
2264			}
2265		},
2266
2267		/* Determine the number of months to show. */
2268		_getNumberOfMonths: function( inst ) {
2269			var numMonths = this._get( inst, "numberOfMonths" );
vendor: 6,518 bytes, lines 2270-2434
2270			return ( numMonths == null ? [ 1, 1 ] : ( typeof numMonths === "number" ? [ 1, numMonths ] : numMonths ) );
2271		},
2272
2273		/* Determine the current maximum date - ensure no time components are set. */
2274		_getMinMaxDate: function( inst, minMax ) {
2275			return this._determineDate( inst, this._get( inst, minMax + "Date" ), null );
2276		},
2277
2278		/* Find the number of days in a given month. */
2279		_getDaysInMonth: function( year, month ) {
2280			return 32 - this._daylightSavingAdjust( new Date( year, month, 32 ) ).getDate();
2281		},
2282
2283		/* Find the day of the week of the first of a month. */
2284		_getFirstDayOfMonth: function( year, month ) {
2285			return new Date( year, month, 1 ).getDay();
2286		},
2287
2288		/* Determines if we should allow a "next/prev" month display change. */
2289		_canAdjustMonth: function( inst, offset, curYear, curMonth ) {
2290			var numMonths = this._getNumberOfMonths( inst ),
2291				date = this._daylightSavingAdjust( new Date( curYear,
2292					curMonth + ( offset < 0 ? offset : numMonths[ 0 ] * numMonths[ 1 ] ), 1 ) );
2293
2294			if ( offset < 0 ) {
2295				date.setDate( this._getDaysInMonth( date.getFullYear(), date.getMonth() ) );
2296			}
2297			return this._isInRange( inst, date );
2298		},
2299
2300		/* Is the given date in the accepted range? */
2301		_isInRange: function( inst, date ) {
2302			var yearSplit, currentYear,
2303				minDate = this._getMinMaxDate( inst, "min" ),
2304				maxDate = this._getMinMaxDate( inst, "max" ),
2305				minYear = null,
2306				maxYear = null,
2307				years = this._get( inst, "yearRange" );
2308			if ( years ) {
2309				yearSplit = years.split( ":" );
2310				currentYear = new Date().getFullYear();
2311				minYear = parseInt( yearSplit[ 0 ], 10 );
2312				maxYear = parseInt( yearSplit[ 1 ], 10 );
2313				if ( yearSplit[ 0 ].match( /[+\-].*/ ) ) {
2314					minYear += currentYear;
2315				}
2316				if ( yearSplit[ 1 ].match( /[+\-].*/ ) ) {
2317					maxYear += currentYear;
2318				}
2319			}
2320
2321			return ( ( !minDate || date.getTime() >= minDate.getTime() ) &&
2322				( !maxDate || date.getTime() <= maxDate.getTime() ) &&
2323				( !minYear || date.getFullYear() >= minYear ) &&
2324				( !maxYear || date.getFullYear() <= maxYear ) );
2325		},
2326
2327		/* Provide the configuration settings for formatting/parsing. */
2328		_getFormatConfig: function( inst ) {
2329			var shortYearCutoff = this._get( inst, "shortYearCutoff" );
2330			shortYearCutoff = ( typeof shortYearCutoff !== "string" ? shortYearCutoff :
2331				new Date().getFullYear() % 100 + parseInt( shortYearCutoff, 10 ) );
2332			return { shortYearCutoff: shortYearCutoff,
2333				dayNamesShort: this._get( inst, "dayNamesShort" ), dayNames: this._get( inst, "dayNames" ),
2334				monthNamesShort: this._get( inst, "monthNamesShort" ), monthNames: this._get( inst, "monthNames" ) };
2335		},
2336
2337		/* Format the given date for display. */
2338		_formatDate: function( inst, day, month, year ) {
2339			if ( !day ) {
2340				inst.currentDay = inst.selectedDay;
2341				inst.currentMonth = inst.selectedMonth;
2342				inst.currentYear = inst.selectedYear;
2343			}
2344			var date = ( day ? ( typeof day === "object" ? day :
2345				this._daylightSavingAdjust( new Date( year, month, day ) ) ) :
2346				this._daylightSavingAdjust( new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) );
2347			return this.formatDate( this._get( inst, "dateFormat" ), date, this._getFormatConfig( inst ) );
2348		}
2349	} );
2350
2351	/*
2352     * Bind hover events for datepicker elements.
2353     * Done via delegate so the binding only occurs once in the lifetime of the parent div.
2354     * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
2355     */
2356	function datepicker_bindHover( dpDiv ) {
2357		var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";
2358		return dpDiv.on( "mouseout", selector, function() {
2359			$( this ).removeClass( "ui-state-hover" );
2360			if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) {
2361				$( this ).removeClass( "ui-datepicker-prev-hover" );
2362			}
2363			if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) {
2364				$( this ).removeClass( "ui-datepicker-next-hover" );
2365			}
2366		} )
2367			.on( "mouseover", selector, datepicker_handleMouseover );
2368	}
2369
2370	function datepicker_handleMouseover() {
2371		if ( !$.datepicker._isDisabledDatepicker( datepicker_instActive.inline ? datepicker_instActive.dpDiv.parent()[ 0 ] : datepicker_instActive.input[ 0 ] ) ) {
2372			$( this ).parents( ".ui-datepicker-calendar" ).find( "a" ).removeClass( "ui-state-hover" );
2373			$( this ).addClass( "ui-state-hover" );
2374			if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) {
2375				$( this ).addClass( "ui-datepicker-prev-hover" );
2376			}
2377			if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) {
2378				$( this ).addClass( "ui-datepicker-next-hover" );
2379			}
2380		}
2381	}
2382
2383	/* jQuery extend now ignores nulls! */
2384	function datepicker_extendRemove( target, props ) {
2385		$.extend( target, props );
2386		for ( var name in props ) {
2387			if ( props[ name ] == null ) {
2388				target[ name ] = props[ name ];
2389			}
2390		}
2391		return target;
2392	}
2393
2394	/* Invoke the datepicker functionality.
2395       @param  options  string - a command, optionally followed by additional parameters or
2396                        Object - settings for attaching new datepicker functionality
2397       @return  jQuery object */
2398	$.fn.datepicker = function( options ) {
2399
2400		/* Verify an empty collection wasn't passed - Fixes #6976 */
2401		if ( !this.length ) {
2402			return this;
2403		}
2404
2405		/* Initialise the date picker. */
2406		if ( !$.datepicker.initialized ) {
2407			$( document ).on( "mousedown", $.datepicker._checkExternalClick );
2408			$.datepicker.initialized = true;
2409		}
2410
2411		/* Append datepicker main container to body if not exist. */
2412		if ( $( "#" + $.datepicker._mainDivId ).length === 0 ) {
2413			$( "body" ).append( $.datepicker.dpDiv );
2414		}
2415
2416		var otherArgs = Array.prototype.slice.call( arguments, 1 );
2417		if ( typeof options === "string" && ( options === "isDisabled" || options === "getDate" || options === "widget" ) ) {
2418			return $.datepicker[ "_" + options + "Datepicker" ].
2419			apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
2420		}
2421		if ( options === "option" && arguments.length === 2 && typeof arguments[ 1 ] === "string" ) {
2422			return $.datepicker[ "_" + options + "Datepicker" ].
2423			apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
2424		}
2425		return this.each( function() {
2426			typeof options === "string" ?
2427				$.datepicker[ "_" + options + "Datepicker" ].
2428				apply( $.datepicker, [ this ].concat( otherArgs ) ) :
2429				$.datepicker._attachDatepicker( this, options );
2430		} );
2431	};
2432
2433	$.datepicker = new Datepicker(); // singleton instance
2434	$.datepicker.initialized = false;
vendor: 10,790 bytes, lines 2435-2450
2435	$.datepicker.uuid = new Date().getTime();
2436	$.datepicker.version = "1.12.1";
2437
2438	var widgetsDatepicker = $.datepicker;
2439
2440
2441
2442
2443}));
2444/*!
2445 * shariff-plus - v2.3.2 - Fri, 18 Apr 2025 12:13:28 GMT
2446 * https://www.richard-fath.de/en/software/shariff-plus.html
2447 * Copyright (c) 2025 Richard Fath (shariff-plus), Ines Pauer (shariff), Philipp Busse (shariff), Sebastian Hilbig (shariff), Erich Kramer (shariff), Deniz Sesli (shariff)
2448 * Licensed under the MIT license
2449 */
2450!function(e){function t(r){if(a[r])return a[r].exports;var i=a[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var a={};t.m=e,t.c=a,t.d=function(e,a,r){t.o(e,a)||Object.defineProperty(e,a,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var a=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(a,"a",a),a},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=2)}([function(e,t,a){"use strict";function r(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}function i(e,t,a){if(e&&p.isObject(e)&&e instanceof r)return e;var i=new r;return i.parse(e,t,a),i}function n(e){return p.isString(e)&&(e=i(e)),e instanceof r?e.format():r.prototype.format.call(e)}function o(e,t){return i(e,!1,!0).resolve(t)}function s(e,t){return e?i(e,!1,!0).resolveObject(t):t}var l=a(10),p=a(12);t.parse=i,t.resolve=o,t.resolveObject=s,t.format=n,t.Url=r;var u=/^([a-z0-9.+-]+:)/i,d=/:[0-9]*$/,h=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,c=["<",">",'"',"`"," ","\r","\n","\t"],f=["{","}","|","\\","^","`"].concat(c),m=["'"].concat(f),b=["%","/","?",";","#"].concat(m),g=["/","?","#"],k=/^[+a-z0-9A-Z_-]{0,63}$/,v=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,j={javascript:!0,"javascript:":!0},z={javascript:!0,"javascript:":!0},y={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},P=a(13);r.prototype.parse=function(e,t,a){if(!p.isString(e))throw new TypeError("Parameter 'url' must be a string, not "+typeof e);var r=e.indexOf("?"),i=-1!==r&&r<e.indexOf("#")?"?":"#",n=e.split(i),o=/\\/g;n[0]=n[0].replace(o,"/"),e=n.join(i);var s=e;if(s=s.trim(),!a&&1===e.split("#").length){var d=h.exec(s);if(d)return this.path=s,this.href=s,this.pathname=d[1],d[2]?(this.search=d[2],this.query=t?P.parse(this.search.substr(1)):this.search.substr(1)):t&&(this.search="",this.query={}),this}var c=u.exec(s);if(c){c=c[0];var f=c.toLowerCase();this.protocol=f,s=s.substr(c.length)}if(a||c||s.match(/^\/\/[^@\/]+@[^@\/]+/)){var w="//"===s.substr(0,2);!w||c&&z[c]||(s=s.substr(2),this.slashes=!0)}if(!z[c]&&(w||c&&!y[c])){for(var x=-1,C=0;C<g.length;C++){var U=s.indexOf(g[C]);-1!==U&&(-1===x||U<x)&&(x=U)}var T,S;S=-1===x?s.lastIndexOf("@"):s.lastIndexOf("@",x),-1!==S&&(T=s.slice(0,S),s=s.slice(S+1),this.auth=decodeURIComponent(T)),x=-1;for(var C=0;C<b.length;C++){var U=s.indexOf(b[C]);-1!==U&&(-1===x||U<x)&&(x=U)}-1===x&&(x=s.length),this.host=s.slice(0,x),s=s.slice(x),this.parseHost(),this.hostname=this.hostname||"";var I="["===this.hostname[0]&&"]"===this.hostname[this.hostname.length-1];if(!I)for(var R=this.hostname.split(/\./),C=0,D=R.length;C<D;C++){var F=R[C];if(F&&!F.match(k)){for(var L="",N=0,O=F.length;N<O;N++)F.charCodeAt(N)>127?L+="x":L+=F[N];if(!L.match(k)){var X=R.slice(0,C),M=R.slice(C+1),q=F.match(v);q&&(X.push(q[1]),M.unshift(q[2])),M.length&&(s="/"+M.join(".")+s),this.hostname=X.join(".");break}}}this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),I||(this.hostname=l.toASCII(this.hostname));var J=this.port?":"+this.port:"",V=this.hostname||"";this.host=V+J,this.href+=this.host,I&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==s[0]&&(s="/"+s))}if(!j[f])for(var C=0,D=m.length;C<D;C++){var G=m[C];if(-1!==s.indexOf(G)){var W=encodeURIComponent(G);W===G&&(W=escape(G)),s=s.split(G).join(W)}}var B=s.indexOf("#");-1!==B&&(this.hash=s.substr(B),s=s.slice(0,B));var Z=s.indexOf("?");if(-1!==Z?(this.search=s.substr(Z),this.query=s.substr(Z+1),t&&(this.query=P.parse(this.query)),s=s.slice(0,Z)):t&&(this.search="",this.query={}),s&&(this.pathname=s),y[f]&&this.hostname&&!this.pathname&&(this.pathname="/"),this.pathname||this.search){var J=this.pathname||"",A=this.search||"";this.path=J+A}return this.href=this.format(),this},r.prototype.format=function(){var e=this.auth||"";e&&(e=encodeURIComponent(e),e=e.replace(/%3A/i,":"),e+="@");var t=this.protocol||"",a=this.pathname||"",r=this.hash||"",i=!1,n="";this.host?i=e+this.host:this.hostname&&(i=e+(-1===this.hostname.indexOf(":")?this.hostname:"["+this.hostname+"]"),this.port&&(i+=":"+this.port)),this.query&&p.isObject(this.query)&&Object.keys(this.query).length&&(n=P.stringify(this.query));var o=this.search||n&&"?"+n||"";return t&&":"!==t.substr(-1)&&(t+=":"),this.slashes||(!t||y[t])&&!1!==i?(i="//"+(i||""),a&&"/"!==a.charAt(0)&&(a="/"+a)):i||(i=""),r&&"#"!==r.charAt(0)&&(r="#"+r),o&&"?"!==o.charAt(0)&&(o="?"+o),a=a.replace(/[?#]/g,function(e){return encodeURIComponent(e)}),o=o.replace("#","%23"),t+i+a+o+r},r.prototype.resolve=function(e){return this.resolveObject(i(e,!1,!0)).format()},r.prototype.resolveObject=function(e){if(p.isString(e)){var t=new r;t.parse(e,!1,!0),e=t}for(var a=new r,i=Object.keys(this),n=0;n<i.length;n++){var o=i[n];a[o]=this[o]}if(a.hash=e.hash,""===e.href)return a.href=a.format(),a;if(e.slashes&&!e.protocol){for(var s=Object.keys(e),l=0;l<s.length;l++){var u=s[l];"protocol"!==u&&(a[u]=e[u])}return y[a.protocol]&&a.hostname&&!a.pathname&&(a.path=a.pathname="/"),a.href=a.format(),a}if(e.protocol&&e.protocol!==a.protocol){if(!y[e.protocol]){for(var d=Object.keys(e),h=0;h<d.length;h++){var c=d[h];a[c]=e[c]}return a.href=a.format(),a}if(a.protocol=e.protocol,e.host||z[e.protocol])a.pathname=e.pathname;else{for(var f=(e.pathname||"").split("/");f.length&&!(e.host=f.shift()););e.host||(e.host=""),e.hostname||(e.hostname=""),""!==f[0]&&f.unshift(""),f.length<2&&f.unshift(""),a.pathname=f.join("/")}if(a.search=e.search,a.query=e.query,a.host=e.host||"",a.auth=e.auth,a.hostname=e.hostname||e.host,a.port=e.port,a.pathname||a.search){var m=a.pathname||"",b=a.search||"";a.path=m+b}return a.slashes=a.slashes||e.slashes,a.href=a.format(),a}var g=a.pathname&&"/"===a.pathname.charAt(0),k=e.host||e.pathname&&"/"===e.pathname.charAt(0),v=k||g||a.host&&e.pathname,j=v,P=a.pathname&&a.pathname.split("/")||[],f=e.pathname&&e.pathname.split("/")||[],w=a.protocol&&!y[a.protocol];if(w&&(a.hostname="",a.port=null,a.host&&(""===P[0]?P[0]=a.host:P.unshift(a.host)),a.host="",e.protocol&&(e.hostname=null,e.port=null,e.host&&(""===f[0]?f[0]=e.host:f.unshift(e.host)),e.host=null),v=v&&(""===f[0]||""===P[0])),k)a.host=e.host||""===e.host?e.host:a.host,a.hostname=e.hostname||""===e.hostname?e.hostname:a.hostname,a.search=e.search,a.query=e.query,P=f;else if(f.length)P||(P=[]),P.pop(),P=P.concat(f),a.search=e.search,a.query=e.query;else if(!p.isNullOrUndefined(e.search)){if(w){a.hostname=a.host=P.shift();var x=!!(a.host&&a.host.indexOf("@")>0)&&a.host.split("@");x&&(a.auth=x.shift(),a.host=a.hostname=x.shift())}return a.search=e.search,a.query=e.query,p.isNull(a.pathname)&&p.isNull(a.search)||(a.path=(a.pathname?a.pathname:"")+(a.search?a.search:"")),a.href=a.format(),a}if(!P.length)return a.pathname=null,a.search?a.path="/"+a.search:a.path=null,a.href=a.format(),a;for(var C=P.slice(-1)[0],U=(a.host||e.host||P.length>1)&&("."===C||".."===C)||""===C,T=0,S=P.length;S>=0;S--)C=P[S],"."===C?P.splice(S,1):".."===C?(P.splice(S,1),T++):T&&(P.splice(S,1),T--);if(!v&&!j)for(;T--;T)P.unshift("..");!v||""===P[0]||P[0]&&"/"===P[0].charAt(0)||P.unshift(""),U&&"/"!==P.join("/").substr(-1)&&P.push("");var I=""===P[0]||P[0]&&"/"===P[0].charAt(0);if(w){a.hostname=a.host=I?"":P.length?P.shift():"";var x=!!(a.host&&a.host.indexOf("@")>0)&&a.host.split("@");x&&(a.auth=x.shift(),a.host=a.hostname=x.shift())}return v=v||a.host&&P.length,v&&!I&&P.unshift(""),P.length?a.pathname=P.join("/"):(a.pathname=null,a.path=null),p.isNull(a.pathname)&&p.isNull(a.search)||(a.path=(a.pathname?a.pathname:"")+(a.search?a.search:"")),a.auth=e.auth||a.auth,a.slashes=a.slashes||e.slashes,a.href=a.format(),a},r.prototype.parseHost=function(){var e=this.host,t=d.exec(e);t&&(t=t[0],":"!==t&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)}},function(e,t){var a;a=function(){return this}();try{a=a||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(a=window)}e.exports=a},function(e,t,a){"use strict";a(3),e.exports=a(4)},function(e,t){},function(e,t,a){"use strict";(function(t){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n=function(){function e(e,t){for(var a=0;a<t.length;a++){var r=t[a];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,a,r){return a&&e(t.prototype,a),r&&e(t,r),t}}(),o=a(5),s=a(6),l=a(0),p=document.currentScript||document.querySelector('script[src$="shariff.js"]')||document.querySelector('script[src$="shariff.min.js"]'),u=p?p.src.split("/").slice(0,-1).join("/"):"",d={theme:"color",backendUrl:null,infoUrl:"https://www.richard-fath.de/de/software/shariff-plus.html",infoDisplay:"blank",lang:"de",langFallback:"en",mailUrl:function(){var e=l.parse(this.getURL(),!0);return e.query.view="mail",delete e.search,l.format(e)},mailBody:function(){return this.getURL()},mediaUrl:null,orientation:"horizontal",buttonStyle:"standard",referrerTrack:null,services:["twitter","facebooklike","facebook","info"],dialogsMediaUrl:u,facebookCountBtn:"like",facebooklikeCss:"facebooklike_dlg.css",facebooklikeOptions:{width:450,layout:"standard",action:"like",size:"large",show_faces:!0,share:!0,appId:null},title:t.document.title,twitterVia:null,url:function(){var e=t.document.location.href,a=o("link[rel=canonical]").attr("href")||this.getMeta("og:url")||"";return a.length>0&&(a.indexOf("http")<0&&(a=0!==a.indexOf("//")?t.document.location.protocol+"//"+t.document.location.host+a:t.document.location.protocol+a),e=a),e}},h=function(){function e(t,a){var i=this;r(this,e),this.element=t,o(t).empty(),this.options=o.extend({},d,a,o(t).data()),this.services=Object.keys(s).filter(function(e){return i.isEnabledService(e)}).sort(function(e,t){var a=i.options.services;return a.indexOf(e)-a.indexOf(t)}).map(function(e){return s[e](i)}),this._addButtonList(),null!==this.options.backendUrl&&"icon"!==this.options.buttonStyle&&this.get
2450Shares(this._updateCounts.bind(this))}return n(e,[{key:"isEnabledService",value:function(e){return this.options.services.indexOf(e)>-1}},{key:"$socialshareElement",value:function(){return o(this.element)}},{key:"getLocalized",value:function(e,t){return"object"===i(e[t])?void 0===e[t][this.options.lang]?e[t][this.options.langFallback]:e[t][this.options.lang]:"string"==typeof e[t]?e[t]:void 0}},{key:"getMeta",value:function(e){return o('meta[name="'+e+'"],[property="'+e+'"]').attr("content")||""}},{key:"getInfoUrl",value:function(){return this.options.infoUrl}},{key:"getInfoDisplayPopup",value:function(){return"popup"===this.options.infoDisplay}},{key:"getInfoDisplayBlank",value:function(){return"popup"!==this.options.infoDisplay&&"self"!==this.options.infoDisplay}},{key:"getURL",value:function(){return this.getOption("url")}},{key:"getOption",value:function(e){var t=this.options[e];return"function"==typeof t?t.call(this):t}},{key:"getTitle",value:function(){var e=this.getOption("title");if(o(this.element).data().title)return e;e=e||this.getMeta("DC.title");var t=this.getMeta("DC.creator");return e&&t?e+" - "+t:e}},{key:"getReferrerTrack",value:function(){return this.options.referrerTrack||""}},{key:"getShares",value:function(e){var t=l.parse(this.options.backendUrl,!0);return t.query.url=this.getURL(),delete t.search,o.getJSON(l.format(t),e)}},{key:"getDialogsMediaUrl",value:function(){return this.options.dialogsMediaUrl||""}},{key:"getFacebooklikeCss",value:function(){return this.options.facebooklikeCss}},{key:"getFacebooklikeOptions",value:function(){return this.options.facebooklikeOptions}},{key:"_updateCounts",value:function(e,t,a){var r=this;if(e){var i=null;o.each(e,function(e,t){t>=1e3&&(t=Math.round(t/1e3)+"k");var a=!0;"facebook"===e&&(i=t,"like"===r.options.facebookCountBtn&&(a=!1)),r.isEnabledService(e)&&a&&o(r.element).find("."+e+" a").append(o("<span/>").addClass("share_count").text(t))}),this.isEnabledService("facebooklike")&&null!==i&&"share"!==this.options.facebookCountBtn&&o(this.element).find(".facebooklike a").append(o("<span/>").addClass("share_count").text(i))}}},{key:"_addButtonList",value:function(){var e=this,a=o("<ul/>").addClass(["theme-"+this.options.theme,"orientation-"+this.options.orientation,"button-style-"+this.options.buttonStyle,"shariff-col-"+this.options.services.length].join(" ")),r=[];this.services.forEach(function(t){var i=o("<li/>").addClass("shariff-button "+t.name),n=o("<a/>").attr("href",t.shareUrl);if("standard"===e.options.buttonStyle){var s=o("<span/>").addClass("share_text").text(e.getLocalized(t,"shareText"));n.append(s)}void 0!==t.faPrefix&&void 0!==t.faName&&n.prepend(o("<span/>").addClass(t.faPrefix+" "+t.faName)),t.shareUrl.match(/javascript:/)&&void 0!==t.dialogHtml&&(n.attr("data-dlg-idx",r.length),r[r.length]=t),t.popup?(n.attr("data-rel","popup"),"info"!==t.name&&n.attr("rel","nofollow")):t.blank?(n.attr("target","_blank"),"info"===t.name?n.attr("rel","noopener noreferrer"):n.attr("rel","nofollow noopener noreferrer")):"info"!==t.name&&n.attr("rel","nofollow"),n.attr("title",e.getLocalized(t,"title")),n.attr("role","button"),n.attr("aria-label",e.getLocalized(t,"title")),i.append(n),i.on("click","li",function(e){i.trigger("shariff-share",t)}),a.append(i)}),a.on("click",'[data-rel="popup"]',function(e){e.preventDefault();var a=o(this).attr("href");if(a.match(/twitter\.com\/intent\/(\w+)/)){var i=t.window;if(i.__twttr&&i.__twttr.widgets&&i.__twttr.widgets.loaded)return}var n=o(this).attr("data-dlg-idx");if(n&&!isNaN(n)&&void 0!==r[n].dialogHtml){var s=o(this).attr("title"),l='<meta name="viewport" content="width=device-width, initial-scale=1.0"><title>'+s+"</title>";void 0!==r[n].dialogCssUrl&&r[n].dialogCssUrl&&(l+='<link rel="stylesheet" href="'+r[n].dialogCssUrl+'">');var p=t.window.open("","_blank","width=600,height=460");return p.document.head.innerHTML=l,void(p.document.body.innerHTML=r[n].dialogHtml)}t.window.open(a,"_blank","width=600,height=460")}),this.$socialshareElement().append(a)}}]),e}();e.exports=h,t.Shariff=h,o(function(){o(".shariff").each(function(){this.hasOwnProperty("shariff")||(this.shariff=new h(this))})})}).call(t,a(1))},function(e,t){e.exports=jQuery},function(e,t,a){"use strict";e.exports={buffer:a(7),clipboard:a(8),diaspora:a(9),facebook:a(16),facebooklike:a(17),fediverse:a(18),flipboard:a(19),info:a(20),linkedin:a(21),mail:a(22),pinterest:a(23),pocket:a(24),print:a(25),qzone:a(26),reddit:a(27),stumbleupon:a(28),telegram:a(29),tencent:a(30),threema:a(31),tumblr:a(32),twitter:a(33),vk:a(34),weibo:a(35),whatsapp:a(36),xing:a(37)}},function(e,t,a){"use strict";e.exports=function(e){var t=encodeURIComponent(e.getURL());return{popup:!0,shareText:{bg:"cподеляне",cs:"sdílet",da:"del",de:"teilen",en:"share",es:"compartir",fi:"Jaa",fr:"partager",hr:"podijelite",hu:"megosztás",it:"condividi",ja:"共有",ko:"공유하기",nl:"delen",no:"del",pl:"udostępnij",pt:"compartilhar",ro:"partajează",ru:"поделиться",sk:"zdieľať",sl:"deli",sr:"podeli",sv:"dela",tr:"paylaş",zh:"分享"},name:"buffer",faPrefix:"fab",faName:"fa-buffer",title:{bg:"Сподели в buffer",cs:"Sdílet na buffer",da:"Del på buffer",de:"Bei buffer teilen",en:"Share on buffer",es:"Compartir en buffer",fi:"Jaa bufferissä",fr:"Partager sur buffer",hr:"Podijelite na buffer",hu:"Megosztás bufferen",it:"Condividi su buffer",ja:"buffer上で共有",ko:"buffer에서 공유하기",nl:"Delen op buffer",no:"Del på buffer",pl:"Udostępnij przez buffer",pt:"Compartilhar no buffer",ro:"Partajează pe buffer",ru:"Поделиться на buffer",sk:"Zdieľať na buffer",sl:"Deli na buffer",sr:"Podeli na buffer",sv:"Dela på buffer",tr:"buffer'ta payla
2450ş",zh:"在buffer上分享"},shareUrl:"https://buffer.com/add?text="+encodeURIComponent(e.getTitle())+"&url="+t+e.getReferrerTrack()}}},function(e,t,a){"use strict";e.exports=function(e){return{popup:!1,shareText:{bg:"",cs:"",da:"",de:"kopieren",en:"clipboard",es:"",fi:"",fr:"",hr:"",hu:"",it:"",ja:"",ko:"",nl:"",no:"",pl:"",pt:"",ro:"",ru:"",sk:"",sl:"",sr:"",sv:"",tr:"",zh:""},name:"clipboard",faPrefix:"far",faName:"fa-copy",title:{bg:"",cs:"",da:"",de:"In die Zwischenablage kopieren",en:"Copy to clipboard",es:"",fi:"",fr:"",hr:"",hu:"",it:"",ja:"",ko:"",nl:"",no:"",pl:"",pt:"",ro:"",ru:"",sk:"",sl:"",sr:"",sv:"",tr:"",zh:""},shareUrl:'javascript:var d = document.createElement("input");document.body.appendChild(d);d.value = "'+e.getURL()+'";d.select();d.setSelectionRange(0, 99999);document.execCommand("copy");document.body.removeChild(d);'}}},function(e,t,a){"use strict";var r=a(0);e.exports=function(e){var t=r.parse("https://share.diasporafoundation.org/",!0);return t.query.url=e.getURL(),t.query.title=e.getTitle(),t.protocol="https",delete t.search,{popup:!0,shareText:{bg:"cподеляне",cs:"sdílet",da:"del",de:"teilen",en:"share",es:"compartir",fi:"Jaa",fr:"partager",hr:"podijelite",hu:"megosztás",it:"condividi",ja:"共有",ko:"공유하기",nl:"delen",no:"del",pl:"udostępnij",pt:"compartilhar",ro:"partajează",ru:"поделиться",sk:"zdieľať",sl:"deli",sr:"podeli",sv:"dela",tr:"paylaş",zh:"分享"},name:"diaspora",faPrefix:"fas",faName:"fa-asterisk",title:{bg:"Сподели в diaspora*",cs:"Sdílet na diaspora*",da:"Del på diaspora*",de:"Bei diaspora* teilen",en:"Share on diaspora*",es:"Compartir en diaspora*",fi:"Jaa Diasporaissä",fr:"Partager sur diaspora*",hr:"Podijelite na diaspora*",hu:"Megosztás diaspora*",it:"Condividi su diaspora*",ja:"diaspora*上で共有",ko:"diaspora*에서 공유하기",nl:"Delen op diaspora*",no:"Del på diaspora*",pl:"Udostępnij przez diaspora*",pt:"Compartilhar no diaspora*",ro:"Partajează pe diaspora*",ru:"Поделиться на diaspora*",sk:"Zdieľať na diaspora*",sl:"Deli na diaspora*",sr:"Podeli na diaspora*-u",sv:"Dela på diaspora*",tr:"diaspora*'ta paylaş",zh:"分享至diaspora*"},shareUrl:r.format(t)+e.getReferrerTrack()}}},function(e,t,a){(function(e,r){var i;!function(r){function n(e){throw new RangeError(I[e])}function o(e,t){for(var a=e.length,r=[];a--;)r[a]=t(e[a]);return r}function s(e,t){var a=e.split("@"),r="";return a.length>1&&(r=a[0]+"@",e=a[1]),e=e.replace(S,"."),r+o(e.split("."),t).join(".")}function l(e){for(var t,a,r=[],i=0,n=e.length;i<n;)t=e.charCodeAt(i++),t>=55296&&t<=56319&&i<n?(a=e.charCodeAt(i++),56320==(64512&a)?r.push(((1023&t)<<10)+(1023&a)+65536):(r.push(t),i--)):r.push(t);return r}function p(e){return o(e,function(e){var t="";return e>65535&&(e-=65536,t+=F(e>>>10&1023|55296),e=56320|1023&e),t+=F(e)}).join("")}function u(e){return e-48<10?e-22:e-65<26?e-65:e-97<26?e-97:v}function d(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function h(e,t,a){var r=0;for(e=a?D(e/P):e>>1,e+=D(e/t);e>R*z>>1;r+=v)e=D(e/R);return D(r+(R+1)*e/(e+y))}function c(e){var t,a,r,i,o,s,l,d,c,f,m=[],b=e.length,g=0,y=x,P=w;for(a=e.lastIndexOf(C),a<0&&(a=0),r=0;r<a;++r)e.charCodeAt(r)>=128&&n("not-basic"),m.push(e.charCodeAt(r));for(i=a>0?a+1:0;i<b;){for(o=g,s=1,l=v;i>=b&&n("invalid-input"),d=u(e.charCodeAt(i++)),(d>=v||d>D((k-g)/s))&&n("overflow"),g+=d*s,c=l<=P?j:l>=P+z?z:l-P,!(d<c);l+=v)f=v-c,s>D(k/f)&&n("overflow"),s*=f;t=m.length+1,P=h(g-o,t,0==o),D(g/t)>k-y&&n("overflow"),y+=D(g/t),g%=t,m.splice(g++,0,y)}return p(m)}function f(e){var t,a,r,i,o,s,p,u,c,f,m,b,g,y,P,U=[];for(e=l(e),b=e.length,t=x,a=0,o=w,s=0;s<b;++s)(m=e[s])<128&&U.push(F(m));for(r=i=U.length,i&&U.push(C);r<b;){for(p=k,s=0;s<b;++s)(m=e[s])>=t&&m<p&&(p=m);for(g=r+1,p-t>D((k-a)/g)&&n("overflow"),a+=(p-t)*g,t=p,s=0;s<b;++s)if(m=e[s],m<t&&++a>k&&n("overflow"),m==t){for(u=a,c=v;f=c<=o?j:c>=o+z?z:c-o,!(u<f);c+=v)P=u-f,y=v-f,U.push(F(d(f+P%y,0))),u=D(P/y);U.push(F(d(u,0))),o=h(a,g,r==i),a=0,++r}++a,++t}return U.join("")}function m(e){return s(e,function(e){return U.test(e)?c(e.slice(4).toLowerCase()):e})}function b(e){return s(e,function(e){return T.test(e)?"xn--"+f(e):e})}var g,k=("object"==typeof t&&t&&t.nodeType,"object"==typeof e&&e&&e.nodeType,2147483647),v=36,j=1,z=26,y=38,P=700,w=72,x=128,C="-",U=/^xn--/,T=/[^\x20-\x7E]/,S=/[\x2E\u3002\uFF0E\uFF61]/g,I={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >
2450= 0x80 (not a basic code point)","invalid-input":"Invalid input"},R=v-j,D=Math.floor,F=String.fromCharCode;g={version:"1.4.1",ucs2:{decode:l,encode:p},decode:c,encode:f,toASCII:b,toUnicode:m},void 0!==(i=function(){return g}.call(t,a,t,e))&&(e.exports=i)}()}).call(t,a(11)(e),a(1))},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t,a){"use strict";e.exports={isString:function(e){return"string"==typeof e},isObject:function(e){return"object"==typeof e&&null!==e},isNull:function(e){return null===e},isNullOrUndefined:function(e){return null==e}}},function(e,t,a){"use strict";t.decode=t.parse=a(14),t.encode=t.stringify=a(15)},function(e,t,a){"use strict";function r(e,t){return Object.prototype.hasOwnProperty.call(e,t)}e.exports=function(e,t,a,n){t=t||"&",a=a||"=";var o={};if("string"!=typeof e||0===e.length)return o;var s=/\+/g;e=e.split(t);var l=1e3;n&&"number"==typeof n.maxKeys&&(l=n.maxKeys);var p=e.length;l>0&&p>l&&(p=l);for(var u=0;u<p;++u){var d,h,c,f,m=e[u].replace(s,"%20"),b=m.indexOf(a);b>=0?(d=m.substr(0,b),h=m.substr(b+1)):(d=m,h=""),c=decodeURIComponent(d),f=decodeURIComponent(h),r(o,c)?i(o[c])?o[c].push(f):o[c]=[o[c],f]:o[c]=f}return o};var i=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)}},function(e,t,a){"use strict";function r(e,t){if(e.map)return e.map(t);for(var a=[],r=0;r<e.length;r++)a.push(t(e[r],r));return a}var i=function(e){switch(typeof e){case"string":return e;case"boolean":return e?"true":"false";case"number":return isFinite(e)?e:"";default:return""}};e.exports=function(e,t,a,s){return t=t||"&",a=a||"=",null===e&&(e=void 0),"object"==typeof e?r(o(e),function(o){var s=encodeURIComponent(i(o))+a;return n(e[o])?r(e[o],function(e){return s+encodeURIComponent(i(e))}).join(t):s+encodeURIComponent(i(e[o]))}).join(t):s?encodeURIComponent(i(s))+a+encodeURIComponent(i(e)):""};var n=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)},o=Object.keys||function(e){var t=[];for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.push(a);return t}},function(e,t,a){"use strict";e.exports=function(e){return{popup:!0,shareText:{bg:"cподеляне",cs:"sdílet",da:"del",de:"teilen",en:"share",es:"compartir",fi:"Jaa",fr:"partager",hr:"podijelite",hu:"megosztás",it:"condividi",ja:"共有",ko:"공유하기",nl:"delen",no:"del",pl:"udostępnij",pt:"compartilhar",ro:"partajează",ru:"поделиться",sk:"zdieľať",sl:"deli",sr:"podeli",sv:"dela",tr:"paylaş",zh:"分享"},name:"facebook",faPrefix:"fab",faName:"fa-facebook-f",title:{bg:"Сподели във Facebook",cs:"Sdílet na Facebooku",da:"Del på Facebook",de:"Bei Facebook teilen",en:"Share on Facebook",es:"Compartir en Facebook",fi:"Jaa Facebookissa",fr:"Partager sur Facebook",hr:"Podijelite na Facebooku",hu:"Megosztás Facebookon",it:"Condividi su Facebook",ja:"フェイスブック上で共有",ko:"페이스북에서 공유하기",nl:"Delen op Facebook",no:"Del på Facebook",pl:"Udostępnij na Facebooku",pt:"Compartilhar no Facebook",ro:"Partajează pe Facebook",ru:"Поделиться на Facebook",sk:"Zdieľať na Facebooku",sl:"Deli na Facebooku",sr:"Podeli na Facebook-u",sv:"Dela på Facebook",tr:"Facebook'ta paylaş",zh:"在Facebook上分享"},shareUrl:"https://www.facebook.com/sharer/sharer.php?u="+encodeURIComponent(e.getURL())+e.getReferrerTrack()}}},function(e,t,a){"use strict";e.exports=function(e){var t=e.getURL(),a=e.getTitle(),r=e.getOption("lang"),i="Close",n="https://www.facebook.com/plugins/like.php?href="+encodeURIComponent(t)+e.getReferrerTrack(),o=65,s=47,l=103,p='<div><h1 class="dialogtitle">',u=e.getFacebooklikeOptions();switch(r){case"bg":i="Близо";break;case"cs":i="Zavřít";break;case"da":i="Luk";break;case"de":i="Schließen";break;case"es":i="Cerrar";break;case"fi":i="Sulje";break;case"fr":i="Fermer";break;case"hr":i="Zatvoriti";break;case"hu":i="Bezár";break;case"it":i="Chiudi";break;case"ja":i="閉じる";break;case"ko":i="닫기";break;case"nl":i="Sluiten";break;case"no":i="Lukk";break;case"pl":i="Zamknij";break;case"pt":i="Fechar";break;case"ro":i="Închide";break;case"ru":i="Закрыть";break;case"sk":i="Zatvoriť";break;case"sl":i="Zapri";break;case"sr":i="Zatvori";break;case"sv":i="Stäng";break;case"tr":i="Kapatın";break;case"zh":i="关闭"}switch(u.layout){case"standard":o=u.show_faces?80:35,s=225,l=450;break;case"box_count":o=65,s=55,l=103;break;case"button_count":o=46,s=90,l=154}void 0===u.width||null===u.width?u.width=l:u.width<s&&(u.width=s),u.appId=u.appId||e.getMeta("fb:app_id")||null;for(var d in u)u.hasOwnProperty(d)&&void 0!==u[d]&&null!==u[d]&&(n+="&"+d+"="+u[d]);return n+="&height="+o,p+=a+'</h1><a class="dialoglink" href="'+t+'">'+t+'</a></div><div class="facebooklike"><iframe src="'+n+'" width="'+u.width+'" height="'+o+'" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowfullscreen="true" allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share"></iframe></div><div><button class="dialogbutton" onclick="self.close()">'+i+"</button></div>",{popup:!0,shareText:{bg:"харесвам",cs:"to se mi líbí",da:"synes godt om",de:"gefällt mir",en:"like",es:"me gusta",fi:"tykkää",fr:"j’aime",hr:"sviđa mi se",hu:"tetszik",it:"mi piace",ja:"いいね!",ko:"좋아요",nl:"vind ik leuk",no:"liker",pl:"lubię to!",pt:"gosto",ro:"îmi place",ru:"нравится",sk:"páči sa mi to",sl:"všeč mi je",sr:"свиђа ми се",sv:"gilla",tr:"beğen",zh:"赞"},name:"facebooklike",faPrefix:"fas",faName:"fa-thumbs-up",title:{bg:"Харесвам/Вече не харесвам във Facebook",cs:"To se mi líbí/už se mi to nelíbí na Facebooku",da:"Synes godt om/Fjern Synes godt om på Facebook",de:"Gefällt mir/Gefällt mir nicht mehr bei Facebook",en:"Like/Unlike on Facebook",es:"Me gusta/Ya no me gusta en Facebook",fi:"Tykkää/En tykkääkään Facebookissa",fr:"J’aime/Je n’aime plus sur Facebook",hr:"Sviđa mi se/Ne sviđa mi se na Facebooku",hu:"Tetszik/Mégsem tetszik a Facebookon",it:"Mi piace/Non mi piace più su Facebook",ja:"フェイスブック上 いいね!/「いいね!」を取り消す",ko:"페이스북에서 좋아요/싫어함",nl:"Vind ik leuk/Vind ik niet meer leuk op Facebook",no:"Liker/Slutt å like på Facebook",pl:"Lubię to!/Nie lubię na Facebooku",pt:"Gosto/Não gosto no Facebook",ro:"Îmi place/Nu-mi mai place pe Facebook",ru:"Нравится/Не нравится на Facebook",sk:"Páči sa mi to/Zrušiť Páči sa mi to na Facebooku",sl:"Všeč mi je/Ni mi všeč na Facebooku",sr:"Свиђа ми се/Не свиђа ми се на Фацебоок
2450у",sv:"Gilla/Sluta gilla på Facebook",tr:"Facebook'ta Beğen/Beğenmekten Vazgeç",zh:"Facebook上的赞/取消赞"},shareUrl:"javascript:void(0);",dialogHtml:p,dialogCssUrl:e.getDialogsMediaUrl()+"/"+e.getFacebooklikeCss()}}},function(e,t,a){"use strict";e.exports=function(e){return{popup:!1,shareText:{bg:"cподеляне",cs:"sdílet",da:"del",de:"teilen",en:"share",es:"compartir",fi:"Jaa",fr:"partager",hr:"podijelite",hu:"megosztás",it:"condividi",ja:"共有",ko:"공유하기",nl:"delen",no:"del",pl:"udostępnij",pt:"compartilhar",ro:"partajează",ru:"поделиться",sk:"zdieľať",sl:"deli",sr:"podeli",sv:"dela",tr:"paylaş",zh:"分享"},name:"fediverse",faPrefix:"fab",faName:"fa-mastodon",title:{bg:"Сподели в Fediverse",cs:"Sdílet na Fediverse",da:"Del på Fediverse",de:"Im Fediverse teilen",en:"Share in Fediverse",es:"Compartir en Fediverse",fi:"Jaa Fediverseissä",fr:"Partager sur Fediverse",hr:"Podijelite na Fediverse",hu:"Megosztás Fediverseen",it:"Condividi su Fediverse",ja:"Fediverse上で共有",ko:"Fediverse에서 공유하기",nl:"Delen op Fediverse",no:"Del på Fediverse",pl:"Udostępnij przez Fediverse",pt:"Compartilhar no Fediverse",ro:"Partajează pe Fediverse",ru:"Поделиться на Fediverse",sk:"Zdieľať na Fediverse",sl:"Deli na Fediverse",sr:"Podeli na Fediverse-u",sv:"Dela på Fediverse",tr:"Fediverse'ta payla
2450ş",zh:"在Fediverse上分享"},shareUrl:"web+mastodon://share?text="+encodeURIComponent(e.getURL())+e.getReferrerTrack()}}},function(e,t,a){"use strict";e.exports=function(e){var t=encodeURIComponent(e.getURL());return{popup:!0,shareText:"flip it",name:"flipboard",faPrefix:"fab",faName:"fa-flipboard",title:{bg:"Сподели в Flipboard",cs:"Sdílet na Flipboardu",da:"Del på Flipboard",de:"Bei Flipboard teilen",en:"Share on Flipboard",es:"Compartir en Flipboard",fi:"Jaa Flipboardissä",fr:"Partager sur Flipboard",hr:"Podijelite na Flipboardu",hu:"Megosztás Flipboardon",it:"Condividi su Flipboard",ja:"Flipboard上で共有",ko:"Flipboard에서 공유하기",nl:"Delen op Flipboard",no:"Del på Flipboard",pl:"Udostępnij na Flipboardu",pt:"Compartilhar no Flipboard",ro:"Partajează pe Flipboard",ru:"Поделиться на Flipboard",sk:"Zdieľať na Flipboardu",sl:"Deli na Flipboardu",sr:"Podeli na Flipboard-u",sv:"Dela på Flipboard",tr:"Flipboard'ta paylaş",zh:"在Flipboard上分享"},shareUrl:"https://share.flipboard.com/bookmarklet/popout?v=2&title="+encodeURIComponent(e.getTitle())+"&url="+t+e.getReferrerTrack()}}},function(e,t,a){"use strict";e.exports=function(e){return{blank:e.getInfoDisplayBlank(),popup:e.getInfoDisplayPopup(),shareText:"Info",name:"info",faPrefix:"fas",faName:"fa-info",title:{bg:"Повече информация",cs:"Více informací",da:"Flere oplysninger",de:"Weitere Informationen",en:"More information",es:"Más informaciones",fi:"Lisätietoja",fr:"Plus d'informations",hr:"Više informacija",hu:"Több információ",it:"Maggiori informazioni",ja:"詳しい情報",ko:"추가 정보",nl:"Verdere informatie",no:"Mer informasjon",pl:"Więcej informacji",pt:"Mais informações",ro:"Mai multe informatii",ru:"Больше информации",sk:"Viac informácií",sl:"Več informacij",sr:"Više informacija",sv:"Mer information",tr:"Daha fazla bilgi",zh:"更多信息"},shareUrl:e.getInfoUrl()}}},function(e,t,a){"use strict";e.exports=function(e){return{popup:!0,shareText:{bg:"cподеляне",cs:"sdílet",da:"del",de:"mitteilen",en:"share",es:"compartir",fi:"Jaa",fr:"partager",hr:"podijelite",hu:"megosztás",it:"condividi",ja:"シェア",ko:"공유하기",nl:"delen",no:"del",pl:"udostępnij",pt:"compartilhar",ro:"distribuiți",ru:"поделиться",sk:"zdieľať",sl:"deli",sr:"podeli",sv:"dela",tr:"paylaş",zh:"分享"},name:"linkedin",faPrefix:"fab",faName:"fa-linkedin-in",title:{bg:"Сподели в LinkedIn",cs:"Sdílet na LinkedIn",da:"Del på LinkedIn",de:"Bei LinkedIn teilen",en:"Share on LinkedIn",es:"Compartir en LinkedIn",fi:"Jaa LinkedInissä",fr:"Partager sur LinkedIn",hr:"Podijelite na LinkedIn",hu:"Megosztás LinkedInen",it:"Condividi su LinkedIn",ja:"LinkedIn上で共有",ko:"LinkedIn에서 공유하기",nl:"Delen op LinkedIn",no:"Del på LinkedIn",pl:"Udostępnij przez LinkedIn",pt:"Compartilhar no LinkedIn",ro:"Partajează pe LinkedIn",ru:"Поделиться на LinkedIn",sk:"Zdieľať na LinkedIn",sl:"Deli na LinkedIn",sr:"Podeli na LinkedIn-u",sv:"Dela på LinkedIn",tr:"LinkedIn'ta paylaş",zh:"在LinkedIn上分享"},shareUrl:"https://www.linkedin.com/sharing/share-offsite/?url="+encodeURIComponent(e.getURL())}}},function(e,t,a){"use strict";e.exports=function(e){var t=e.getOption("mailUrl");return 0===t.indexOf("mailto:")&&(t+="?subject="+encodeURIComponent(e.getOption("mailSubject")||e.getTitle()),t+="&body="+encodeURIComponent(e.getOption("mailBody").replace(/\{url\}/i,e.getURL()))),{blank:0===t.indexOf("http"),popup:!1,shareText:{en:"mail",zh:"分享"},name:"mail",faPrefix:"fas",faName:"fa-envelope",title:{bg:"Изпрати по имейл",cs:"Poslat mailem",da:"Sende via e-mail",de:"Per E-Mail versenden",en:"Send by email",es:"Enviar por email",fi:"Lähetä sähköpostitse",fr:"Envoyer par courriel",hr:"Pošaljite emailom",hu:"Elküldés e-mailben",it:"Inviare via email",ja:"電子メールで送信",ko:"이메일로 보내기",nl:"Sturen via e-mail",no:"Send via epost",pl:"Wyślij e-mailem",pt:"Enviar por e-mail",ro:"Trimite prin e-mail",ru:"Отправить по эл. почте",sk:"Poslať e-mailom",sl:"Pošlji po elektronski pošti",sr:"Pošalji putem email-a",sv:"Skicka via e-post",tr:"E-posta ile gönder",zh:"通过电子邮件传送"},shareUrl:t}}},function(e,t,a){"use strict";var r=a(0);e.exports=function(e){var t=e.getTitle(),a=e.getMeta("DC.creator");a.length>0&&(t+=" - "+a);var i=e.getOption("mediaUrl");(!i||i.length<=0)&&(i=e.getMeta("og:image"));var n=r.parse("https://www.pinterest.com/pin/create/link/",!0);return n.query.url=e.getURL(),n.query.media=i,n.query.description=t,delete n.search,{popup:!0,shareText:"pin it",name:"pinterest",faPrefix:"fab",faName:"fa-pinterest-p",title:{bg:"Сподели в Pinterest",cs:"Přidat na Pinterest",da:"Del på Pinterest",de:"Bei Pinterest pinnen",en:"Pin it on Pinterest",es:"Compartir en Pinterest",fi:"Jaa Pinterestissä",fr:"Partager sur Pinterest",hr:"Podijelite na Pinterest",hu:"Megosztás Pinteresten",it:"Condividi su Pinterest",ja:"Pinterest上で共有",ko:"Pinterest에서 공유하기",nl:"Delen op Pinterest",no:"Del på Pinterest",pl:"Udostępnij przez Pinterest",pt:"Compartilhar no Pinterest",ro:"Partajează pe Pinterest",ru:"Поделиться на Pinterest",sk:"Zdieľať na Pinterest",sl:"Deli na Pinterest",sr:"Podeli na Pinterest-u",sv:"Dela på Pinterest",tr:"Pinterest'ta payla
2450ş",zh:"分享至Pinterest"},shareUrl:r.format(n)+e.getReferrerTrack()}}},function(e,t,a){"use strict";e.exports=function(e){var t=encodeURIComponent(e.getURL());return{popup:!0,shareText:"Pocket",name:"pocket",faPrefix:"fab",faName:"fa-get-pocket",title:{bg:"Запазване в Pocket",cs:"Uložit do Pocket",da:"Gem i Pocket",de:"In Pocket speichern",en:"Save to Pocket",es:"Guardar en Pocket",fi:"Tallenna kohtaan Pocket",fr:"Enregistrer dans Pocket",hr:"Spremi u Pocket",hu:'Mentés "Pocket"-be',it:"Salva in Pocket",ja:"「ポケット」に保存",ko:"Pocket에 저장",nl:"Opslaan in Pocket",no:"Lagre i Pocket",pl:"Zapisz w Pocket",pt:"Salvar em Pocket",ro:"Salvați în Pocket",ru:"Сохранить в Pocket",sk:"Uložiť do priečinka Pocket",sl:"Shrani v Pocket",sr:"Sačuvaj u Pocket",sv:"Spara till Pocket",tr:"Pocket e kaydet",zh:"保存到Pocket"},shareUrl:"https://getpocket.com/save?title="+encodeURIComponent(e.getTitle())+"&url="+t+e.getReferrerTrack()}}},function(e,t,a){"use strict";e.exports=function(e){return{name:"print",faPrefix:"fas",faName:"fa-print",popup:!1,shareText:{bg:"",cs:"tlačit",da:"",de:"drucken",en:"print",es:"impresión",fi:"",fr:"imprimer",hr:"",hu:"",it:"stampa",ja:"",ko:"",nl:"afdrukken",no:"",pl:"drukuj",pt:"",ro:"",ru:"Распечатать",sk:"",sl:"",sr:"",sv:"",tr:"",zh:""},title:{bg:"",cs:"tlačit",da:"",de:"drucken",en:"print",es:"impresión",fi:"",fr:"imprimer",hr:"",hu:"",it:"stampa",ja:"",ko:"",nl:"afdrukken",no:"",pl:"drukuj",pt:"",ro:"",ru:"Распечатать",sk:"",sl:"",sr:"",sv:"",tr:"",zh:""},shareUrl:"javascript:window.print();"}}},function(e,t,a){"use strict";e.exports=function(e){return{popup:!0,shareText:{bg:"cподеляне",cs:"sdílet",da:"del",de:"teilen",en:"share",es:"compartir",fi:"Jaa",fr:"partager",hr:"podijelite",hu:"megosztás",it:"condividi",ja:"共有",ko:"공유하기",nl:"delen",no:"del",pl:"udostępnij",pt:"compartilhar",ro:"partajează",ru:"поделиться",sk:"zdieľať",sl:"deli",sr:"podeli",sv:"dela",tr:"paylaş",zh:"分享"},name:"qzone",faPrefix:"fab",faName:"fa-qq",title:{bg:"Сподели в Qzone",cs:"Sdílet na Qzone",da:"Del på Qzone",de:"Bei Qzone teilen",en:"Share on Qzone",es:"Compartir en Qzone",fi:"Jaa Qzoneissä",fr:"Partager sur Qzone",hr:"Podijelite na Qzone",hu:"Megosztás Qzone",it:"Condividi su Qzone",ja:"Qzone上で共有",ko:"Qzone에서 공유하기",nl:"Delen op Qzone",no:"Del på Qzone",pl:"Udostępnij przez Qzone",pt:"Compartilhar no Qzone",ro:"Partajează pe Qzone",ru:"Поделиться на Qzone",sk:"Zdieľať na Qzone",sl:"Deli na Qzone",sr:"Podeli na Qzone-u",sv:"Dela på Qzone",tr:"Qzone'ta paylaş",zh:"分享至QQ空间"},shareUrl:"https://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url="+encodeURIComponent(e.getURL())+"&title="+e.getTitle()+e.getReferrerTrack()}}},function(e,t,a){"use strict";e.exports=function(e){var t=encodeURIComponent(e.getURL()),a=encodeURIComponent(e.getTitle());return""!==a&&(a="&title="+a),{popup:!0,shareText:{bg:"cподеляне",cs:"sdílet",da:"del",de:"teilen",en:"share",es:"compartir",fi:"Jaa",fr:"partager",hr:"podijelite",hu:"megosztás",it:"condividi",ja:"共有",ko:"공유하기",nl:"delen",no:"del",pl:"udostępnij",pt:"compartilhar",ro:"partajează",ru:"поделиться",sk:"zdieľať",sl:"deli",sr:"podeli",sv:"dela",tr:"paylaş",zh:"分享"},name:"reddit",faPrefix:"fab",faName:"fa-reddit-alien",title:{bg:"Сподели в Reddit",cs:"Sdílet na Redditu",da:"Del på Reddit",de:"Bei Reddit teilen",en:"Share on Reddit",es:"Compartir en Reddit",fi:"Jaa Redditissä",fr:"Partager sur Reddit",hr:"Podijelite na Reddit",hu:"Megosztás Redditen",it:"Condividi su Reddit",ja:"Reddit上で共有",ko:"Reddit에서 공유하기",nl:"Delen op Reddit",no:"Del på Reddit",pl:"Udostępnij przez Reddit",pt:"Compartilhar no Reddit",ro:"Partajează pe Reddit",ru:"Поделиться на Reddit",sk:"Zdieľať na Reddit",sl:"Deli na Reddit",sr:"Podeli na Reddit-u",sv:"Dela på Reddit",tr:"Reddit'ta paylaş",zh:"分享至Reddit"},shareUrl:"https://reddit.com/submit?url="+t+a+e.getReferrerTrack()}}},function(e,t,a){"use strict";e.exports=function(e){var t=encodeURIComponent(e.getURL()),a=encodeURIComponent(e.getTitle());return""!==a&&(a="&title="+a),{popup:!0,shareText:{bg:"cподеляне",cs:"sdílet",da:"del",de:"teilen",en:"share",es:"compartir",fi:"Jaa",fr:"partager",hr:"podijelite",hu:"megosztás",it:"condividi",ja:"共有",ko:"공유하기",nl:"delen",no:"del",pl:"udostępnij",pt:"compartilhar",ro:"partajează",ru:"поделиться",sk:"zdieľať",sl:"deli",sr:"podeli",sv:"dela",tr:"paylaş",zh:"分享"},name:"stumbleupon",faPrefix:"fab",faName:"fa-stumbleupon",title:{bg:"Сподели в Stumbleupon",cs:"Sdílet na Stumbleuponu",da:"Del på Stumbleupon",de
2450:"Bei Stumbleupon teilen",en:"Share on Stumbleupon",es:"Compartir en Stumbleupon",fi:"Jaa Stumbleuponissä",fr:"Partager sur Stumbleupon",hr:"Podijelite na Stumbleupon",hu:"Megosztás Stumbleupon",it:"Condividi su Stumbleupon",ja:"Stumbleupon上で共有",ko:"Stumbleupon에서 공유하기",nl:"Delen op Stumbleupon",no:"Del på Stumbleupon",pl:"Udostępnij przez Stumbleupon",pt:"Compartilhar no Stumbleupon",ro:"Partajează pe Stumbleupon",ru:"Поделиться на Stumbleupon",sk:"Zdieľať na Stumbleupon",sl:"Deli na Stumbleupon",sr:"Podeli na Stumbleupon-u",sv:"Dela på Stumbleupon",tr:"Stumbleupon'ta paylaş",zh:"分享至Stumbleupon"},shareUrl:"https://www.stumbleupon.com/submit?url="+t+a+e.getReferrerTrack()}}},function(e,t,a){"use strict";e.exports=function(e){return{popup:!0,shareText:{bg:"cподеляне",cs:"sdílet",da:"del",de:"teilen",en:"share",es:"compartir",fi:"Jaa",fr:"partager",hr:"podijelite",hu:"megosztás",it:"condividi",ja:"共有",ko:"공유하기",nl:"delen",no:"del",pl:"udostępnij",pt:"compartilhar",ro:"partajează",ru:"поделиться",sk:"zdieľať",sl:"deli",sr:"podeli",sv:"dela",tr:"paylaş",zh:"分享"},name:"telegram",faPrefix:"fab",faName:"fa-telegram",title:{bg:"Сподели в Telegram",cs:"Sdílet na Telegramu",da:"Del på Telegram",de:"Bei Telegram teilen",en:"Share on Telegram",es:"Compartir en Telegram",fi:"Jaa Telegramissä",fr:"Partager sur Telegram",hr:"Podijelite na Telegram",hu:"Megosztás Telegramen",it:"Condividi su Telegram",ja:"Telegram上で共有",ko:"Telegram에서 공유하기",nl:"Delen op Telegram",no:"Del på Telegram",pl:"Udostępnij przez Telegram",pt:"Compartilhar no Telegram",ro:"Partajează pe Telegram",ru:"Поделиться на Telegram",sk:"Zdieľať na Telegram",sl:"Deli na Telegram",sr:"Podeli na Telegram-u",sv:"Dela på Telegram",tr:"Telegram'ta paylaş",zh:"在Telegram上分享"},shareUrl:"https://t.me/share/url?url="+encodeURIComponent(e.getURL())+e.getReferrerTrack()}}},function(e,t,a){"use strict";e.exports=function(e){return{popup:!0,shareText:{bg:"cподеляне",cs:"sdílet",da:"del",de:"teilen",en:"share",es:"compartir",fi:"Jaa",fr:"partager",hr:"podijelite",hu:"megosztás",it:"condividi",ja:"共有",ko:"공유하기",nl:"delen",no:"del",pl:"udostępnij",pt:"compartilhar",ro:"partajează",ru:"поделиться",sk:"zdieľať",sl:"deli",sr:"podeli",sv:"dela",tr:"paylaş",zh:"分享"},name:"tencent-weibo",faPrefix:"fab",faName:"fa-tencent-weibo",title:{bg:"Сподели в tencent weibo",cs:"Sdílet na tencent weibo",da:"Del på tencent weibo",de:"Bei tencent weibo teilen",en:"Share on tencent weibo",es:"Compartir en tencent weibo",fi:"Jaa tencent weiboissä",fr:"Partager sur tencent weibo",hr:"Podijelite na tencent weibo",hu:"Megosztás tencent weiboen",it:"Condividi su tencent weibo",ja:"Tencent weibo上で共有",ko:"Tencent weibo에서 공유하기",nl:"Delen op tencent weibo",no:"Del på tencent weibo",pl:"Udostępnij przez tencent weibo",pt:"Compartilhar no tencent weibo",ro:"Partajează pe tencent weibo",ru:"Поделиться на tencent weibo",sk:"Zdieľať na tencent weibo",sl:"Deli na tencent weibo",sr:"Podeli na tencent weibo-u",sv:"Dela på tencent weibo",tr:"Tencent weibo'ta paylaş",zh:"分享至腾讯微博"},shareUrl:"https://v.t.qq.com/share/share.php?url="+encodeURIComponent(e.getURL())+"&title="+e.getTitle()+e.getReferrerTrack()}}},function(e,t,a){"use strict";e.exports=function(e){var t=encodeURIComponent(e.getURL()),a=e.getTitle();return{popup:!1,shareText:{bg:"cподеляне",cs:"sdílet",da:"del",de:"teilen",en:"share",es:"compartir",fi:"Jaa",fr:"partager",hr:"podijelite",hu:"megosztás",it:"condividi",ja:"共有",ko:"공유하기",nl:"delen",no:"del",pl:"udostępnij",pt:"compartilhar",ro:"partajează",ru:"поделиться",sk:"zdieľať",sl:"deli",sr:"podeli",sv:"dela",tr:"paylaş",zh:"分享"},name:"threema",faPrefix:"fas",faName:"fa-lock",title:{bg:"Сподели в Threema",cs:"Sdílet na Threema",da:"Del på Threema",de:"Bei Threema teilen",en:"Share on Threema",es:"Compartir en Threema",fi:"Jaa Threemaissä",fr:"Partager sur Threema",hr:"Podijelite na Threema",hu:"Megosztás Threemaen",it:"Condividi su Threema",ja:"Threema上で共有",ko:"Threema에서 공유하기",nl:"Delen op Threema",no:"Del på Threema",pl:"Udostępnij przez Threema",pt:"Compartilhar no Threema",ro:"Partajează pe Threema",ru:"Поделиться на Threema",sk:"Zdieľať na Threema",sl:"Deli na Threema",sr:"Podeli na Threema-u",sv:"Dela på Threema",tr:"Threema'ta payla
2450ş",zh:"在Threema上分享"},shareUrl:"threema://compose?text="+encodeURIComponent(a)+"%20"+t+e.getReferrerTrack()}}},function(e,t,a){"use strict";e.exports=function(e){return{popup:!0,shareText:{bg:"cподеляне",cs:"sdílet",da:"del",de:"teilen",en:"share",es:"compartir",fi:"Jaa",fr:"partager",hr:"podijelite",hu:"megosztás",it:"condividi",ja:"共有",ko:"공유하기",nl:"delen",no:"del",pl:"udostępnij",pt:"compartilhar",ro:"partajează",ru:"поделиться",sk:"zdieľať",sl:"deli",sr:"podeli",sv:"dela",tr:"paylaş",zh:"分享"},name:"tumblr",faPrefix:"fab",faName:"fa-tumblr",title:{bg:"Сподели в tumblr",cs:"Sdílet na tumblru",da:"Del på tumblr",de:"Bei tumblr teilen",en:"Share on tumblr",es:"Compartir en tumblr",fi:"Jaa tumblrissä",fr:"Partager sur tumblr",hr:"Podijelite na tumblr",hu:"Megosztás tumblren",it:"Condividi su tumblr",ja:"tumblr上で共有",ko:"tumblr에서 공유하기",nl:"Delen op tumblr",no:"Del på tumblr",pl:"Udostępnij przez tumblr",pt:"Compartilhar no tumblr",ro:"Partajează pe tumblr",ru:"Поделиться на tumblr",sk:"Zdieľať na tumblr",sl:"Deli na tumblr",sr:"Podeli na tumblr-u",sv:"Dela på tumblr",tr:"tumblr'ta paylaş",zh:"在tumblr上分享"},shareUrl:"https://tumblr.com/widgets/share/tool?canonicalUrl="+encodeURIComponent(e.getURL())+e.getReferrerTrack()}}},function(e,t,a){"use strict";var r=a(0),i=function(e,t){var a=document.createElement("div"),r=document.createTextNode(e);a.appendChild(r);var i=a.textContent;if(i.length<=t)return e;var n=i.substring(0,t-1).lastIndexOf(" ");return i=i.substring(0,n)+"…"};e.exports=function(e){var t=r.parse("https://twitter.com/intent/tweet",!0),a=e.getTitle();t.query.url=e.getURL(),null!==e.options.twitterVia&&(t.query.via=e.options.twitterVia);var n=280-(t.query.via||"").length-(t.query.url||"").length;return t.query.text=i(a,n),delete t.search,{popup:!0,shareText:{de:"posten",en:"post",ja:"投稿",ko:"게시물",ru:"Посты",sr:"pošta",zh:"职位"},name:"twitter",faPrefix:"fab fa-brands",faName:"fa-x-twitter",title:{bg:"Сподели в X",cs:"Sdílet na X",da:"Del på X",de:"Bei X teilen",en:"Share on X",es:"Compartir en X",fi:"Jaa X",fr:"Partager sur X",hr:"Podijelite na X",hu:"Megosztás X",it:"Condividi su X",ja:"Xで共有する",ko:"X에서 공유",nl:"Delen op X",no:"Del på X",pl:"Udostępnij na X",pt:"Compartilhar no X",ro:"Partajează pe X",ru:"Поделиться на X",sk:"Zdieľať na X",sl:"Deli na X",sr:"Podeli na X-u",sv:"Dela på X",tr:"X'da paylaş",zh:"在X上分享"},shareUrl:r.format(t)+e.getReferrerTrack()}}},function(e,t,a){"use strict";e.exports=function(e){return{popup:!0,shareText:{bg:"cподеляне",cs:"sdílet",da:"del",de:"teilen",en:"share",es:"compartir",fi:"Jaa",fr:"partager",hr:"podijelite",hu:"megosztás",it:"condividi",ja:"共有",ko:"공유하기",nl:"delen",no:"del",pl:"udostępnij",pt:"compartilhar",ro:"partajează",ru:"поделиться",sk:"zdieľať",sl:"deli",sr:"podeli",sv:"dela",tr:"paylaş",zh:"分享"},name:"vk",faPrefix:"fab",faName:"fa-vk",title:{bg:"Сподели във VK",cs:"Sdílet na VKu",da:"Del på VK",de
2450:"Bei VK teilen",en:"Share on VK",es:"Compartir en VK",fi:"Jaa VKissa",fr:"Partager sur VK",hr:"Podijelite na VKu",hu:"Megosztás VKon",it:"Condividi su VK",ja:"フェイスブック上で共有",ko:"페이스북에서 공유하기",nl:"Delen op VK",no:"Del på VK",pl:"Udostępnij na VKu",pt:"Compartilhar no VK",ro:"Partajează pe VK",ru:"Поделиться на ВКонтакте",sk:"Zdieľať na VKu",sl:"Deli na VKu",sr:"Podeli na VK-u",sv:"Dela på VK",tr:"VK'ta paylaş",zh:"在VK上分享"},shareUrl:"https://vk.com/share.php?url="+encodeURIComponent(e.getURL())+e.getReferrerTrack()}}},function(e,t,a){"use strict";e.exports=function(e){return{popup:!0,shareText:{bg:"cподеляне",cs:"sdílet",da:"del",de:"teilen",en:"share",es:"compartir",fi:"Jaa",fr:"partager",hr:"podijelite",hu:"megosztás",it:"condividi",ja:"共有",ko:"공유하기",nl:"delen",no:"del",pl:"udostępnij",pt:"compartilhar",ro:"partajează",ru:"поделиться",sk:"zdieľať",sl:"deli",sr:"podeli",sv:"dela",tr:"paylaş",zh:"分享"},name:"weibo",faPrefix:"fab",faName:"fa-weibo",title:{bg:"Сподели в weibo",cs:"Sdílet na weibo",da:"Del på weibo",de:"Bei weibo teilen",en:"Share on weibo",es:"Compartir en weibo",fi:"Jaa weiboissä",fr:"Partager sur weibo",hr:"Podijelite na weibo",hu:"Megosztás weiboen",it:"Condividi su weibo",ja:"Weibo上で共有",ko:"Weibo에서 공유하기",nl:"Delen op weibo",no:"Del på weibo",pl:"Udostępnij przez weibo",pt:"Compartilhar no weibo",ro:"Partajează pe weibo",ru:"Поделиться на weibo",sk:"Zdieľať na weibo",sl:"Deli na weibo",sr:"Podeli na weibo-u",sv:"Dela på weibo",tr:"Weibo'ta paylaş",zh:"分享至新浪微博"},shareUrl:"https://service.weibo.com/share/share.php?url="+encodeURIComponent(e.getURL())+"&title="+e.getTitle()+e.getReferrerTrack()}}},function(e,t,a){"use strict";e.exports=function(e){var t=encodeURIComponent(e.getURL()),a=e.getTitle();return{popup:!0,shareText:{bg:"cподеляне",cs:"sdílet",da:"del",de:"teilen",en:"share",es:"compartir",fi:"Jaa",fr:"partager",hr:"podijelite",hu:"megosztás",it:"condividi",ja:"共有",ko:"공유하기",nl:"delen",no:"del",pl:"udostępnij",pt:"compartilhar",ro:"partajează",ru:"поделиться",sk:"zdieľať",sl:"deli",sr:"podeli",sv:"dela",tr:"paylaş",zh:"分享"},name:"whatsapp",faPrefix:"fab",faName:"fa-whatsapp",title:{bg:"Сподели в Whatsapp",cs:"Sdílet na Whatsappu",da:"Del på Whatsapp",de:"Bei Whatsapp teilen",en:"Share on Whatsapp",es:"Compartir en Whatsapp",fi:"Jaa WhatsAppissä",fr:"Partager sur Whatsapp",hr:"Podijelite na Whatsapp",hu:"Megosztás WhatsAppen",it:"Condividi su Whatsapp",ja:"Whatsapp上で共有",ko:"Whatsapp에서 공유하기",nl:"Delen op Whatsapp",no:"Del på Whatsapp",pl:"Udostępnij przez WhatsApp",pt:"Compartilhar no Whatsapp",ro:"Partajează pe Whatsapp",ru:"Поделиться на Whatsapp",sk:"Zdieľať na Whatsapp",sl:"Deli na Whatsapp",sr:"Podeli na WhatsApp-u",sv:"Dela på Whatsapp",tr:"Whatsapp'ta paylaş",zh:"在Whatsapp上分享"},shareUrl:"https://api.whatsapp.com/send?text="+encodeURIComponent(a)+"%20"+t+e.getReferrerTrack()}}},function(e,t,a){"use strict";e.exports=function(e){return{popup:!0,shareText:{bg:"cподеляне",cs:"sdílet",da:"del",de:"teilen",en:"share",es:"compartir",fi:"Jaa",fr:"partager",hr:"podijelite",hu:"megosztás",it:"condividi",ja:"共有",ko:"공유하기",nl:"delen",no:"del",pl:"udostępnij",pt:"compartilhar",ro:"partajează",ru:"поделиться",sk:"zdieľať",sl:"deli",sr:"podeli",sv:"dela",tr:"paylaş",zh:"分享"},name:"xing",faPrefix:"fab",faName:"fa-xing",title:{bg:"Сподели в XING",cs:"Sdílet na XINGu",da:"Del på XING",de:"Bei XING teilen",en:"Share on XING",es:"Compartir en XING",fi:"Jaa XINGissä",fr:"Partager sur XING",hr:"Podijelite na XING",hu:"Megosztás XINGen",it:"Condividi su XING",ja:"XING上で共有",ko:"XING에서 공유하기",nl:"Delen op XING",no:"Del på XING",pl:"Udostępnij przez XING",pt:"Compartilhar no XING",ro:"Partajează pe XING",ru:"Поделиться на XING",sk:"Zdieľať na XING",sl:"Deli na XING",sr:"Podeli na XING-u",sv:"Dela på XING",tr:"XING'ta payla
2450ş",zh:"分享至XING"},shareUrl:"https://www.xing.com/spi/shares/new?url="+encodeURIComponent(e.getURL())+e.getReferrerTrack()}}}]);

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.