מיקומים נוספים וקואורדינטות משוערות: GeoNames, CC BY 4.0; בחירה עורך. GeoNames.
(function(){
"use strict";
var root=document.querySelector('[data-tool=weather]');if(!root)return;
var L={"find":"חפש ערים נוספות","hint":"לא מוצא את המקום שלך? חפש במדינה שנבחרה או טען מדינות נוספות. ללא GPS או חיפוש לפי IP.","lookup":"שם המקום","search":"חפש מקומות","countries":"מדינות נוספות","empty":"אין תוצאות.","loading":"מחפש מקומות…","choose":"בחר במקום זה","intro":"חקור את מזג האוויר בפירוט","lead":"בדוק תחזיות לפי שעות, רשימת לבוש שימושית והתראות רשמיות מארה\"ב. אנו טוענים רק את מה שביקשת.","forecast":"שעות ו-7 הימים הבאים","forecastDesc":"טמפרטורה, לחות, גשם, קרינת UV עם שמיים בהירים ורוח.","alerts":"התראות רשמיות מארה\"ב","alertsDesc":"התראות בתוקף של National Weather Service לערים בארה\"ב.","go":"בדוק","hour":"השעות הקרובות (UTC)","days":"הימים הקרובים (תאריכים UTC)","unavailable":"המקור אינו זמין כרגע.","nothing":"אין ערכים תואמים.","notUS":"התראות NWS זמינות רק בארצות הברית.","noAlerts":"אין התראות רשמיות פעילות.","countryReady":"רשימת מדינות נטענה.","source":"מקורות: MET Norway, PlaceDB (CC0) ו-NWS. הרשימה משתמשת בתחזית שמורה במטמון, לא בניסויי לבוש.","pack":"רשימת יציאה לפי מזג האוויר","packDesc":"הכן רשימה באמצעות התחזית השמורה, ללא קניות או שיחות נוספות.","packItems":["הטייטס שלך","בגד חם או מעיל","שכבת חוץ נגד גשם","ג'קט נגד רוח","גרביים חמים ונעליים סגורות","נעליים נוחות עם אחיזה"],"packCopy":"העתק רשימה","packSaved":"הרשימה הועתקה"},country=root.querySelector('#wa-country'),city=root.querySelector('#wa-city');
var input=root.querySelector('#wa-place-query'),matches=root.querySelector('.wa-place-matches'),status=root.querySelector('.wa-place-status-text');
function item(tag,value){var e=document.createElement(tag);e.textContent=String(value);return e;}
function query(){
var opt=city.selectedOptions[0],p=new URLSearchParams();
if(opt&&opt.dataset.placeId){p.set('country',country.value);p.set('place',opt.dataset.placeId);p.set('q',opt.dataset.query);}
else if(city.value)p.set('city',city.value);
return p;
}
var placeEpoch=0,panelEpoch={forecast:0,pack:0,alerts:0};
function clear(){placeEpoch++;for(var mode in panelEpoch)panelEpoch[mode]++;matches.replaceChildren();status.textContent='';for(var e of root.querySelectorAll('.wa-deep-output'))e.replaceChildren();}
country.addEventListener('change',clear);city.addEventListener('change',clear);
var find=root.querySelector('.wa-place-find');
find.addEventListener('click',async function(){
var value=input.value.trim();if(value.length<2){input.focus();return;}
var findIntent=++placeEpoch,chosenCountry=country.value;
status.textContent=L.loading;matches.replaceChildren();find.disabled=true;
try{
var r=await fetch('/api/weather-places?country='+encodeURIComponent(country.value)+'&q='+encodeURIComponent(value));
if(!r.ok)throw Error('places');var d=await r.json();if(findIntent!==placeEpoch||country.value!==chosenCountry)return;if(!d.places||!d.places.length)status.textContent=L.empty;
else status.textContent=d.places.length+' · '+L.choose;
for(const p of d.places||[]){
var li=item('li',''),b=item('button',p.name);
b.type='button';b.addEventListener('click',function(){
if(findIntent!==placeEpoch||country.value!==chosenCountry)return;
var opt=document.createElement('option');opt.value='p-'+p.country+'-'+p.id;opt.textContent=p.name;
opt.dataset.placeId=String(p.id);opt.dataset.query=value;city.append(opt);city.disabled=false;city.value=opt.value;
city.dispatchEvent(new Event('change',{bubbles:true}));status.textContent=p.name+' ✓';matches.replaceChildren();
});li.append(b);matches.append(li);
}
}catch{if(findIntent===placeEpoch)status.textContent=L.unavailable;}finally{find.disabled=false;}
});
input.addEventListener('keydown',function(e){if(e.key==='Enter'){e.preventDefault();find.click();}});
root.querySelector('.wa-all-countries').addEventListener('click',async function(){
var button=this;button.disabled=true;status.textContent=L.loading;
try{
var r=await fetch('/api/weather-countries');if(!r.ok)throw Error('countries');
var d=await r.json(),already=new Set(Array.from(country.options,x=>x.value)),extra=[];
var fmt=new Intl.DisplayNames([document.documentElement.lang||'en'],{type:'region'});
for(var c of d.countries||[]){if(!/^[A-Z]{2}$/.test(c.code)||already.has(c.code))continue;
var o=document.createElement('option');o.value=c.code;o.textContent=fmt.of(c.code)||c.name;
country.append(o);extra.push(c.code);}
window.__leggicMoreCountries=[...new Set([...(window.__leggicMoreCountries||[]),...extra])];
status.textContent=L.countryReady;button.hidden=true;
}catch{status.textContent=L.unavailable;button.disabled=false;}
});
function line(box,name,value){var row=item('div','');row.className='wa-deep-line';row.append(item('span',name),item('strong',value));box.append(row);}
for(const btn of root.querySelectorAll('.wa-deep-fetch')){
btn.addEventListener('click',async function(){
var mode=btn.dataset.mode,box=root.querySelector('.wa-deep-output[data-mode="'+mode+'"]');
var intent=++panelEpoch[mode],selectedCountry=country.value,selectedCity=city.value;
if(!city.value){box.textContent=L.empty;return;}
box.textContent=L.loading;btn.disabled=true;
var p=query(),url=mode==='alerts'?'/api/weather-alerts':'/api/weather-advice';
if(mode==='forecast'||mode==='pack')p.set('view','extended');
try{
var r=await fetch(url+'?'+p.toString());if(!r.ok)throw Error('source');
var d=await r.json();if(intent!==panelEpoch[mode]||city.value!==selectedCity||country.value!==selectedCountry)return;box.replaceChildren();
if(mode==='forecast'){
var a=item('div','');a.className='wa-deep-lines';
if(Number.isFinite(d.humidity))line(a,'💧',d.humidity+'%');
if(Number.isFinite(d.uvClearSky))line(a,'UV (clear sky)',d.uvClearSky);
if(Number.isFinite(d.windGustMs))line(a,'Wind gust',d.windGustMs+' m/s');
for(var h of (d.hourly||[]).slice(0,18))line(a,h.time.slice(5,16).replace('T',' ')+' UTC',h.temperatureC+' °C'+(Number.isFinite(h.precipChance)?' · '+h.precipChance+'%':''));
box.append(a);
var b=item('div','');b.className='wa-deep-lines';
for(var day of d.daily||[])line(b,day.dayUTC,day.lowC+' / '+day.highC+' °C');
box.append(item('h4',L.days),b);
}else if(mode==='pack'){
if(!Number.isFinite(d.temperatureC))throw Error('missing temperature');
var items=[L.packItems[0]];
if(d.temperatureC<10)items.push(L.packItems[1]);
if((Number.isFinite(d.precipMm)&&d.precipMm>=0.2)||/rain|snow|sleet/i.test(d.symbol||''))items.push(L.packItems[2]);
if(d.windMs>=8)items.push(L.packItems[3]);
items.push(d.temperatureC<5?L.packItems[4]:L.packItems[5]);
var list=item('ul','');list.className='wa-packing-list';
for(const label of [...new Set(items)]){var li=item('li',label);list.append(li);}
box.append(list);
var copy=item('button',L.packCopy);copy.type='button';copy.className='wa-pack-copy';
copy.addEventListener('click',async function(){try{
await navigator.clipboard.writeText(items.join('\n'));copy.textContent=L.packSaved;
}catch{copy.textContent=L.unavailable;}});
box.append(copy);
}else{
if(!d.supported){box.textContent=L.notUS;return;}
if(!d.alerts?.length){box.textContent=L.noAlerts;return;}
for(var a of d.alerts)line(box,a.severity,a.event+': '+a.headline);
var link=item('a','National Weather Service');link.href='https://www.weather.gov/';link.rel='noopener noreferrer';box.append(link);
}
}catch{if(intent===panelEpoch[mode])box.textContent=L.unavailable;}finally{btn.disabled=false;}
});
}
})();document.addEventListener('DOMContentLoaded',()=>{setTimeout(()=>{
// The deferred app.js initializes its tool on DOMContentLoaded; run just after it.
const button=document.getElementById('buildLook');if(!button)return;
const labels={it:'Abbinamento',de:'Outfit',es:'Conjunto',fr:'Tenue',en:'Look'};
const enhance=()=>{
const result=document.querySelector('#lookResult .result');
if(!result||result.querySelector('.style-look-grid'))return;
const items=[...result.querySelectorAll('ol li')].slice(0,3);
if(!items.length)return;
const selectedText=id=>{
const element=document.getElementById(id);
return element?.selectedOptions?.[0]?.textContent?.trim()||element?.value||'';
};
const metaText=[selectedText('color'),selectedText('season'),selectedText('shoes')].filter(Boolean).join(' · ');
const grid=document.createElement('div');grid.className='style-look-grid';
items.forEach((item,index)=>{
const card=document.createElement('article');card.className='style-look';
const meta=document.createElement('span');meta.className='style-look-meta';meta.textContent=metaText;
const content=document.createElement('div'),title=document.createElement('b'),copy=document.createElement('p');
title.textContent=(labels[document.documentElement.lang]||labels.en)+' '+(index+1);
copy.innerHTML=item.innerHTML;
content.append(title,copy);card.append(meta,content);grid.append(card);
});
result.querySelector('ol')?.replaceWith(grid);
};
const next=()=>setTimeout(enhance,0);
button.addEventListener('click',next);
for(const id of ['color','season','occasion','shoes','finish'])document.getElementById(id)?.addEventListener('change',next);
next();
},0);});(()=>{const root=document.querySelector('header.site-header [data-lp]');if(!root)return;const t=root.querySelector('.lp-trigger'),d=root.querySelector('.lp-dialog');if(!d||typeof d.showModal!=='function')return;const f=d.querySelector('.lp-filter'),items=[...d.querySelectorAll('.lp-item')],groups=[...d.querySelectorAll('.lp-group')],empty=d.querySelector('.lp-empty');const norm=s=>s.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g,'');const apply=()=>{const q=norm(f.value.trim());let shown=0;items.forEach(a=>{const ok=!q||norm(a.dataset.names+' '+a.textContent).includes(q);a.parentElement.hidden=!ok;if(ok)shown++;});groups.forEach(g=>{g.hidden=![...g.querySelectorAll('li')].some(li=>!li.hidden)});empty.hidden=shown>0;};t.addEventListener('click',e=>{if(e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;e.preventDefault();d.showModal();f.value='';apply();if(window.matchMedia('(pointer:fine)').matches)f.focus();else d.querySelector('.lp-item.is-current')?.scrollIntoView({block:'center'});});d.querySelector('.lp-close').addEventListener('click',()=>d.close());d.addEventListener('click',e=>{if(e.target===d)d.close()});f.addEventListener('input',apply);f.addEventListener('keydown',e=>{if(e.key==='Enter'){const first=items.find(a=>!a.parentElement.hidden);if(first){e.preventDefault();first.click();}}});d.addEventListener('close',()=>t.focus());})();