if(!window.Packlink){window.Packlink={}}(()=>{function StateUUIDService(){let currentState='';this.setStateUUID=(state)=>{currentState=state};this.getStateUUID=()=>{return currentState}} Packlink.StateUUIDService=new StateUUIDService()})();if(!window.Packlink){window.Packlink={}}(function(){function ResponseService(){const utilityService=Packlink.utilityService,validationService=Packlink.validationService;this.errorHandler=(response)=>{utilityService.hideSpinner();if(response.error){utilityService.showFlashMessage(response.error,'danger',7000)}else if(response.messages){validationService.handleValidationErrors(response.messages)}else{utilityService.showFlashMessage('Unknown error occurred.','danger',7000)}}} Packlink.responseService=new ResponseService()})();if(!window.Packlink){window.Packlink={}}(function(){function AjaxService(){this.get=function(url,onSuccess,onError){this.call('GET',url,{},onSuccess,onError)};this.post=function(url,data,onSuccess,onError){this.call('POST',url,data,onSuccess,onError)};this.call=function(method,url,data,onSuccess,onError){const request=getRequest();const callUUID=Packlink.StateUUIDService.getStateUUID();if(!onError){onError=Packlink.responseService.errorHandler} url=url.replace('https:','');url=url.replace('http:','');request.open(method,url,!0);request.onreadystatechange=function(){if(this.readyState===4){if(callUUID!==Packlink.StateUUIDService.getStateUUID()){return} if(this.status>=200&&this.status<300){if(onSuccess){onSuccess(JSON.parse(this.responseText||'{}'))}}else if(onError){let response=this.responseText;try{response=JSON.parse(this.responseText||'{}')}catch(e){} onError(response)}}};request.setRequestHeader('Accept','application/json');if(method==='POST'){this.internalPerformPost(request,data)}else{request.send()}};this.internalPerformPost=function(request,data){request.setRequestHeader('Content-Type','application/json');request.send(JSON.stringify(data))};function getRequest(){let versions=['MSXML2.XmlHttp.6.0','MSXML2.XmlHttp.5.0','MSXML2.XmlHttp.4.0','MSXML2.XmlHttp.3.0','MSXML2.XmlHttp.2.0','Microsoft.XmlHttp'],xhr;if(typeof XMLHttpRequest!=='undefined'){return new XMLHttpRequest()} for(let version of versions){try{xhr=new ActiveXObject(version);break}catch(e){}} return xhr}} Packlink.ajaxService=new AjaxService()})();var LocationPickerTranslations={en:{days:{monday:'Monday',tuesday:'Tuesday',wednesday:'Wednesday',thursday:'Thursday',friday:'Friday',saturday:'Saturday',sunday:'Sunday'},selectLabel:'Select',workingHoursLabel:'Show working hours',hideWorkingHoursLabel:'Hide working hours',searchLabel:'Search by location name, id or address',showOnMapTitle:'Show on map'},es:{days:{monday:'Lunes',tuesday:'Martes',wednesday:'Miércoles',thursday:'Jueves',friday:'Viernes',saturday:'Sábado',sunday:'Domingo'},selectLabel:'Seleccionar',workingHoursLabel:'Mostrar horas de apertura',hideWorkingHoursLabel:'Ocultar horario de apertura',searchLabel:'Buscar por nombre de ubicación, ID o dirección',showOnMapTitle:'Mostrar en el mapa'},de:{days:{monday:'Montag',tuesday:'Dienstag',wednesday:'Mittwoch',thursday:'Donnerstag',friday:'Freitag',saturday:'Samstag',sunday:'Sonntag'},selectLabel:'Auswählen',workingHoursLabel:'Öffnungszeiten anzeigen',hideWorkingHoursLabel:'Öffnungszeiten ausblenden',searchLabel:'Suche nach Standortname, ID oder Adresse',showOnMapTitle:'Auf der Karte anzeigen'},fr:{days:{monday:'Lundi',tuesday:'Mardi',wednesday:'Mercredi',thursday:'Jeudi',friday:'Vendredi',saturday:'Samedi',sunday:'Dimanche'},selectLabel:'Sélectionner',workingHoursLabel:'Montrer les heures de travail',hideWorkingHoursLabel:"Cacher les heures d'ouverture",searchLabel:'Chercher par lieu, nom, id ou adresse',showOnMapTitle:'Montrer sur la carte'},it:{days:{monday:'Lunedì',tuesday:'Martedì',wednesday:'Mercoledì',thursday:'Giovedì',friday:'Venerdì',saturday:'Sabato',sunday:'Domenica'},selectLabel:'Seleziona',workingHoursLabel:'Mostra orari di apertura',hideWorkingHoursLabel:'Nascondi orari di apertura',searchLabel:'Cerca nome della località per nome, id o indirizzo',showOnMapTitle:'Mostra sulla mappa'}};var Packlink=window.Packlink||{};(function(){function LocationPickerConstructor(){const days=['monday','tuesday','wednesday','thursday','friday','saturday','sunday'];const searchKeys=['id','zip','name','address','city'];let lang=null;let selectCallback=null;let templateContainer=null;let selectedLocation=null;let dropOffs={};let renderedLocations=[];let locations={};this.display=display;function display(locations,selectLocationCallback,selectedId,language){templateContainer=document.getElementById('template-container');lang=typeof language==='undefined'?'en':language;selectCallback=selectLocationCallback;initializeSearchBox();renderLocations(locations,selectedId)} function renderLocations(payload,selectedId){renderedLocations=[];for(let loc of payload){locations[loc.id]=loc;renderedLocations.push(loc.id)} addLocations(selectedId)} function initializeSearchBox(){let searchBox=getElement(document,'search-box');if(searchBox){searchBox.addEventListener('keyup',debounce(200,searchBoxKeyupHandler));let searchLabel=getElement(document,'search-box-label');searchLabel.innerHTML=getTranslation(lang,['searchLabel'])}} function searchBoxKeyupHandler(event){let value=event.target.value;renderedLocations=Object.keys(locations);if(value!==''){renderedLocations=[];for(let term of searchKeys){let result=filterByKey(locations,term,value);renderedLocations.push(...result)} renderedLocations=renderedLocations.filter(function(value,index,array){return array.indexOf(value)===index})} addLocations()} function addLocations(selectedId){let locationsNode=getElement(document,'locations');while(locationsNode.firstChild){locationsNode.firstChild.remove()} for(let displayed in dropOffs){if(dropOffs.hasOwnProperty(displayed)){dropOffs[displayed].remove()}} dropOffs={};selectedLocation=null;for(let id of renderedLocations){let location=locations[id];let locationElement=createLocation(location);dropOffs[id]=locationElement;locationsNode.appendChild(locationElement);if(selectedId&&selectedId===id){locationElement.click()}}} function createLocation(location){let template=getTemplate('location-template');getElement(template,'location-name').innerHTML=location.name;getElement(template,'location-street').innerHTML=location.address;getElement(template,'location-city').innerHTML=location.city+', '+location.zip;getElement(template,'composite-address').innerHTML=''+location.name+''+', '+location.address+', '+location.city+', '+location.zip;let showOnMapBtn=getElement(template,'show-on-map');showOnMapBtn.href=`https://www.google.com/maps/search/?api=1&query=${location['lat']},${location['long']}`;showOnMapBtn.title=getTranslation(lang,['showOnMapTitle']);let showOnMapCompositeBtn=getElement(template,'composite-show-on-map');showOnMapCompositeBtn.href=`https://www.google.com/maps/search/?api=1&query=${location['lat']},${location['long']}`;showOnMapCompositeBtn.title=getTranslation(lang,['showOnMapTitle']);showOnMapCompositeBtn.innerHTML=getTranslation(lang,['showOnMapTitle']);let showWorkingHoursBtn=getElement(template,'show-working-hours-btn');showWorkingHoursBtn.innerHTML=getTranslation(lang,['workingHoursLabel']);showWorkingHoursBtn.setAttribute('data-id',location.id);showWorkingHoursBtn.addEventListener('click',workingHoursButtonClickHandler);let showCompositeHoursBtn=getElement(template,'show-composite-working-hours-btn');showCompositeHoursBtn.innerHTML=getTranslation(lang,['workingHoursLabel']);showCompositeHoursBtn.setAttribute('data-id',location.id);showCompositeHoursBtn.addEventListener('click',workingHoursButtonClickHandler);let workingHoursNode=getElement(template,'working-hours');let compositeHoursNode=getElement(template,'composite-working-hours');for(let day of days){if(location.workingHours[day]){let workingHoursTemplate=getWorkingHoursTemplate(day,location.workingHours[day]);workingHoursNode.appendChild(workingHoursTemplate);compositeHoursNode.appendChild(workingHoursTemplate.cloneNode(!0))}} let selectBtn=getElement(template,'select-btn');selectBtn.innerHTML=getTranslation(lang,['selectLabel']);selectBtn.addEventListener('click',function(){selectCallback(location.id)});let selectCompositeBtn=getElement(template,'composite-select-btn');selectCompositeBtn.innerHTML=getTranslation(lang,['selectLabel']);selectCompositeBtn.addEventListener('click',function(){selectCallback(location.id)});template.setAttribute('data-id',location.id);template.addEventListener('click',locationClickedHandler);return template} function locationClickedHandler(event){if(event.target.classList.contains('excluded')||event.target===selectedLocation){return} unselectSelectedLocation();let id=event.target.getAttribute('data-id');selectedLocation=dropOffs[id];selectedLocation.classList.add('selected')} function unselectSelectedLocation(){if(selectedLocation){selectedLocation.classList.remove('selected');selectedLocation=null}} function getWorkingHoursTemplate(day,hours){let element=getTemplate('working-hours-template');let dayElement=getElement(element,'day');dayElement.innerHTML=getTranslation(lang,['days',day]);let hourElement=getElement(element,'hours');hourElement.innerHTML=hours;return element} function workingHoursButtonClickHandler(event){let id=event.target.getAttribute('data-id');let workingHoursNode;if(event.target.hasAttribute('data-lp-composite')){workingHoursNode=getElement(dropOffs[id],'composite-working-hours')}else{workingHoursNode=getElement(dropOffs[id],'working-hours')} if(workingHoursNode.classList.contains('enabled')){event.target.innerHTML=getTranslation(lang,['workingHoursLabel']);workingHoursNode.classList.remove('enabled')}else{event.target.innerHTML=getTranslation(lang,['hideWorkingHoursLabel']);workingHoursNode.classList.add('enabled')} dropOffs[id].click()} function getTemplate(template){return templateContainer.querySelector(`[data-lp-id=${template}]`).cloneNode(!0)} function getElement(node,element){return node.querySelector(`[data-lp-id=${element}]`)} function getTranslation(lang,keys){let object=LocationPickerTranslations;object=object.hasOwnProperty(lang)?object[lang]:object.en;for(let key of keys){object=object[key];if(typeof object==='undefined'){return keys.join('.')}} return object} function filterByKey(collection,key,value){let result=[];value=value.toUpperCase();for(let id in collection){if(collection.hasOwnProperty(id)){let target=collection[id][key].toUpperCase();if(target.match(new RegExp('.*'+value+'.*'))!==null){result.push(id)}}} return result} function debounce(delay,target){let timerId;return function(...args){if(timerId){clearTimeout(timerId)} timerId=setTimeout(function(){target(...args);timerId=null},delay)}}} Packlink.locationPicker=new LocationPickerConstructor()})()