1/* Afghan Portal v2 â Main JS */ 2 3// ââ PANEL MANAGER ââââââââââââââââââââââââââââââ 4const Panel = { 5 open(id) { 6 document.getElementById('p-'+id)?.classList.add('open'); 7 document.body.style.overflow = 'hidden'; 8 if (id === 'news') News.load(); 9 if (id === 'prayer') Prayer.load(); 10 if (id === 'weather') loadWeather(); 11 if (id === 'jobs') Jobs.load(); 12 if (id === 'flights') setTimeout(()=>FL.tab(document.getElementById('tab-dep'),'dep'),100); 13 if (id === 'airquality') loadAQI(); 14 if (id === 'quran') Quran.loadAyah(); 15 if (id === 'dict') setTimeout(()=>document.getElementById('dict-input')?.focus(),200); 16 if (id === 'calendar') setTimeout(()=>showCalTab(document.querySelector('#cal-tabs .ctab'),'national'),100); 17 if (id === 'distance') setTimeout(()=>Dist.init(),100); 18 if (id === 'compass') setTimeout(Compass.drawBg, 50); 19 if (id === 'map') setTimeout(() => MapAF.init(), 100); 20 if (id === 'unitconv') UnitConv.init(); 21 }, 22 close(id) { 23 document.getElementById('p-'+id)?.classList.remove('open'); 24 document.body.style.overflow = ''; 25 if (id === 'compass') Compass.stop(); 26 } 27}; 28// close on backdrop click 29document.addEventListener('click', e => { 30 if (e.target.classList.contains('ov')) { 31 e.target.classList.remove('open'); 32 document.body.style.overflow = ''; 33 } 34}); 35// expose globally for onclick attributes 36window.openP = id => Panel.open(id); 37window.closeP = id => Panel.close(id); 38 39// ââ CLOCK (ساعت کاب٠UTC+4:30) ââââââââââââââââââ 40const p2 = n => String(n).padStart(2,'0'); 41function tickKabul() { 42 const now = new Date(); 43 // UTC milliseconds + 4:30 hours 44 const kabulMs = now.getTime() + (4 * 60 + 30) * 60 * 1000; 45 const k = new Date(kabulMs); 46 const el = document.getElementById('clk'); 47 if (el) el.textContent = p2(k.getUTCHours())+':'+p2(k.getUTCMinutes())+':'+p2(k.getUTCSeconds()); 48} 49tickKabul(); 50setInterval(tickKabul, 1000); 51 52// ââ AJAX âââââââââââââââââââââââââââââââââââââââ 53async function api(act, data = {}) { 54 const fd = new FormData(); 55 fd.append('act', act); 56 Object.entries(data).forEach(([k,v]) => fd.append(k, v)); 57 const r = await fetch('api.php', { method:'POST', body:fd }); 58 return r.json(); 59} 60 61// ââ FX CONVERTER ââââââââââââââââââââââââââââââ 62window.calcFx = () => { 63 const a = parseFloat(document.getElementById('fxa').value)||0; 64 const r = parseFloat(document.getElementById('fxf').value)||1; 65 document.getElementById('fxr').textContent = (a*r).toLocaleString('fa',{maximumFractionDigits:0})+' Ø§ÙØºØ§ÙÛ'; 66}; 67window.setFx = v => { document.getElementById('fxa').value = v; calcFx(); }; 68window.calcPFx = () => { 69 const a = parseFloat(document.getElementById('pfxa').value)||0; 70 const r = parseFloat(document.getElementById('pfxf').value)||1; 71 document.getElementById('pfxr').textContent = (a*r).toLocaleString('fa',{maximumFractionDigits:0})+' Ø§ÙØºØ§ÙÛ'; 72}; 73window.setPFx = v => { document.getElementById('pfxa').value = v; calcPFx(); }; 74 75// ââ NEWS âââââââââââââââââââââââââââââââââââââââ 76const News = { 77 loaded: false, 78 async load() { 79 if (this.loaded) return; 80 const wrap = document.getElementById('news-wrap'); 81 if (!wrap) return; 82 wrap.innerHTML = '<div style="padding:30px;text-align:center;color:var(--g);font-weight:700;font-size:14px">Ⳡدر ØØ§Ù Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û Ø§Ø®Ø¨Ø§Ø±...</div>'; 83 try { 84 const d = await api('news'); 85 if (!d.ok || !d.items?.length) throw 0; 86 this.render(d.items, wrap); 87 this.loaded = true; 88 } catch { 89 wrap.innerHTML = `<div style="padding:24px;text-align:center"> 90 <div style="font-size:13px;color:var(--t2);margin-bottom:12px">خطا در Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û Ø§Ø®Ø¨Ø§Ø±</div> 91 <a href="https://shahed.news" target="_blank" style="background:var(--g);color:#fff;padding:9px 20px;border-radius:8px;font-size:13px;font-weight:800;text-decoration:none">Ù Ø´Ø§ÙØ¯Ù در shahed.news â</a> 92 </div>`; 93 } 94 }, 95 render(items, wrap) { 96 const td = ts => { 97 const d = Math.floor(Date.now()/1000 - ts); 98 if (d < 60) return d+'Ø« ÙØ¨Ù'; 99 if (d < 3600) return Math.floor(d/60)+'د ÙØ¨Ù'; 100 if (d <86400) return Math.floor(d/3600)+'س ÙØ¨Ù'; 101 return Math.floor(d/86400)+'ر ÙØ¨Ù'; 102 }; 103 const catColor = c => { 104 const m = {'Ø³ÛØ§Ø³Û':'#dc2626','Ø§ÙØªØµØ§Ø¯Û':'#16a34a','اجت٠اعÛ':'#2563eb','ÙØ±Ø²Ø´Û':'#d97706','ØªÚ©ÙØ§ÙÙÚÛ':'#7c3aed','بÛÙâØ§ÙÙ ÙÙ':'#0891b2'}; 105 for (const k in m) if (c?.includes(k)) return m[k]; 106 return '#1D9E75'; 107 }; 108 109 const main = items[0]; 110 const rest = items.slice(1); 111 112 wrap.innerHTML = ` 113 <div style="padding:14px;display:flex;flex-direction:column;gap:10px"> 114 115 <!-- خبر اصÙÛ --> 116 <div onclick="window.open('${main.link}','_blank')" style="background:linear-gradient(160deg,#0a3d2b,#1D9E75);border-radius:14px;padding:18px;
116cursor:pointer;position:relative;overflow:hidden;min-height:130px;display:flex;flex-direction:column;justify-content:flex-end"> 117 <div style="position:absolute;top:0;right:0;font-size:80px;opacity:.08;line-height:1;padding:5px">ð°</div> 118 ${main.cat ? `<div style="font-size:10px;font-weight:800;background:rgba(255,255,255,.2);color:#fff;padding:3px 10px;border-radius:20px;display:inline-block;margin-bottom:8px;width:fit-content">${main.cat}</div>` : ''} 119 <div style="font-size:16px;font-weight:900;color:#fff;line-height:1.5;margin-bottom:6px">${main.title}</div> 120 <div style="font-size:11px;color:rgba(255,255,255,.65);display:flex;align-items:center;gap:5px"> 121 <span>ð° Ø®Ø¨Ø±Ú¯Ø²Ø§Ø±Û Ø´Ø§ÙØ¯</span><span>·</span><span>${td(main.ts)}</span> 122 </div> 123 </div> 124 125 <!-- Ø®Ø¨Ø±ÙØ§Û دÙ٠٠سÙÙ --> 126 <div style="display:grid;grid-template-columns:1fr 1fr;gap:10px"> 127 ${rest.slice(0,2).map(n=>` 128 <div onclick="window.open('${n.link}','_blank')" style="background:#fff;border:1.5px solid var(--bdr);border-radius:12px;padding:13px;cursor:pointer;transition:.15s;display:flex;flex-direction:column;justify-content:space-between;min-height:100px" onmouseover="this.style.borderColor='var(--g)';this.style.background='var(--gl)'" onmouseout="this.style.borderColor='var(--bdr)';this.style.background='#fff'"> 129 <div style="font-size:13px;font-weight:800;color:var(--t1);line-height:1.5;margin-bottom:8px">${n.title}</div> 130 <div style="font-size:10px;color:var(--t3);font-weight:600">${td(n.ts)} · Ø´Ø§ÙØ¯</div> 131 </div>`).join('')} 132 </div> 133 134 <!-- ÙÛØ³Øª Ø®Ø¨Ø±ÙØ§ --> 135 <div style="display:flex;flex-direction:column;gap:8px"> 136 ${rest.slice(2).map((n,i)=>` 137 <div onclick="window.open('${n.link}','_blank')" style="background:#fff;border:1px solid var(--bdr);border-radius:10px;padding:13px 14px;cursor:pointer;display:flex;align-items:flex-start;gap:12px;transition:.15s" onmouseover="this.style.borderColor='var(--g)';this.style.background='#f0faf5'" onmouseout="this.style.borderColor='var(--bdr)';this.style.background='#fff'"> 138 <div style="width:26px;height:26px;background:var(--gl);border-radius:7px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:900;color:var(--gd);flex-shrink:0">${i+1}</div> 139 <div style="flex:1;min-width:0"> 140 <div style="font-size:13px;font-weight:800;color:var(--t1);line-height:1.5;margin-bottom:4px">${n.title}</div> 141 <div style="font-size:11px;color:var(--t3);font-weight:600">${td(n.ts)} · Ø®Ø¨Ø±Ú¯Ø²Ø§Ø±Û Ø´Ø§ÙØ¯</div> 142 </div> 143 <div style="color:var(--t3);font-size:16px;flex-shrink:0">â</div> 144 </div>`).join('')} 145 </div> 146 147 <!-- ÙÛÙÚ© Ø¨Ù Ø³Ø§ÛØª Ø´Ø§ÙØ¯ --> 148 <a href="https://shahed.news" target="_blank" style="display:block;text-align:center;background:var(--gl);color:var(--gd);padding:11px;border-radius:10px;font-size:13px;font-weight:800;border:1.5px solid var(--gm);text-decoration:none"> 149 Ù Ø´Ø§ÙØ¯Ù Ù٠٠اخبار در shahed.news â 150 </a> 151 152 </div>`; 153 } 154}; 155 156// ââ AI âââââââââââââââââââââââââââââââââââââââââ 157const AI = { 158 async ask(q, sys='') { 159 const ld = document.getElementById('aild'); 160 const ans = document.getElementById('aans'); 161 ld.style.display='flex'; ans.style.display='none'; 162 try { 163 const d = await api('ai', { q, sys }); 164 ans.textContent = d.t || 'خطا'; 165 } catch { 166 ans.textContent = 'خطا در اتصاÙ'; 167 } 168 ld.style.display='none'; ans.style.display='block'; 169 } 170}; 171window.doAI = () => { const q=document.getElementById('aiInp').value.trim(); if(q) AI.ask(q); }; 172window.aiChip = q => { document.getElementById('aiInp').value=q; AI.ask(q); }; 173window.aiAsk = q => { Panel.open('ai'); document.getElementById('aiInp').value=q; AI.ask(q); }; 174document.addEventListener('keydown', e => { 175 if (e.target.id==='aiInp' && e.key==='Enter' && !e.shiftKey) { e.preventDefault(); doAI(); } 176}); 177 178// ââ TRANSLATE ââââââââââââââââââââââââââââââââââ 179let tlF='dari', tlT='english'; 180const TL_NAMES = {dari:'درÛ',pashto:'پشتÙ',english:'English',arabic:'Ø§ÙØ¹Ø±Ø¨ÙØ©'}; 181window.setFL = (btn,l) => { btn.closest('.ctabs').querySelectorAll('.ctab').forEach(b=>b.classList.remove('on')); btn.classList.add('on'); tlF=l; }; 182window.setTL = (btn,l) => { btn.closest('.ctabs').querySelectorAll('.ctab').forEach(b=>b.classList.remove('on')); btn.classList.add('on'); tlT=l; }; 183window.doTrans = async () => { 184 const text = document.getElementById('trIn').value.trim(); 185 if (!text) return; 186 const ld=document.getElementById('trld'), out=document.getElementById('trout'); 187 ld.style.display='flex'; out.style.display='none'; 188 try { 189 const d = await api('tr', {text, from:tlF, to:tlT}); 190 out.textContent = d.t; 191 } catch { out.textContent='خطا'; } 192 ld.style.display='none'; out.style.display='block'; 193}; 194 195// ââ CALCULATOR âââââââââââââââââââââââââââââââââ 196const Calc = (() => { 197 const fa = n => n.toString().replace(/\d/g, d=>'Û°Û±Û²Û³Û´ÛµÛ¶Û·Û¸Û¹'[d]); 198 let expr='', cur='0', op='', prev='', isNew=true; 199 const upd = () => { 200 document.getElementById('cval').textContent = fa(cur); 201 document.getElementById('cexpr').textContent = expr ? fa(expr) : ''; 202 }; 203 const calc = (a,b,o) => ({'+':a+b,'-':a-b,'*':a*b,'/':b?a/b:0}[o]??b); 204 const sym = o => ({'+':' + ','-':' â ','*':' à ','/':' ÷ '}[o]||o+' '); 205 return { 206 num(n) { cur = isNew ? n : (cur==='0'?n:cur+n); isNew=false; upd(); }, 207 dot() { if(isNew){cur='0.';isNew=false;}else if(!cur.includes('.'))cur+='.'; upd(); }, 208 op(o) { if(prev&&!isNew){const r=calc(+prev,+cur,op);cur=String(Math.round(r*1e10)/1e10);expr=fa(cur)+sym(o);}else expr=fa(cur)+sym(o);prev=cur;op=o;isNew=true;upd(); }, 209 eq() { if(!prev||!op)return;const r=calc(+prev,+cur,op);expr=fa(prev)+sym(op)+fa(cur)+' =';cur=String(Math.round(r*1e10)/1e10);prev='';op='';isNew=true;upd(); }, 210 ac() { cur='0';prev='';op='';expr='';isNew=true;upd(); }, 211 sign() { cur=String(-parseFloat(cur)||0);upd(); }, 212 pct() { cur=String(parseFloat(cur)/100);upd(); }, 213 }; 214})(); 215window.cNum=n=>Calc.num(n);
215 window.cDot=()=>Calc.dot(); window.cOp=o=>Calc.op(o); 216window.cEq=()=>Calc.eq(); window.cAC=()=>Calc.ac(); window.cSign=()=>Calc.sign(); window.cPct=()=>Calc.pct(); 217 218// ââ UNIT CONVERTER âââââââââââââââââââââââââââââ 219const UnitConv = (() => { 220 const CATS = { 221 length: {l:'Ø·ÙÙ',u:[['٠تر','m',1],['Ú©ÛÙÙ٠تر','km',1000],['Ø³Ø§ÙØªÛâ٠تر','cm',.01],['Ù ÛÙÛâ٠تر','mm',.001],['٠اÛÙ','mi',1609.34],['ÙÙØª','ft',.3048],['اÛÙÚ','in',.0254],['Ù Ù (Ø§ÙØºØ§ÙÛ)','man',4.5],['Ø¬Ø±ÛØ¨','jerib',~0]]}, 222 weight: {l:'ÙØ²Ù',u:[['Ú©ÛÙÙگرا٠','kg',1],['گرا٠','g',.001],['تÙ','t',1000],['Ù¾ÙÙØ¯','lb',.453592],['اÙÙØ³','oz',.028349],['Ù Ù (Ø§ÙØºØ§ÙÛ)','man',4.5],['Ø³ÛØ±','sir',.281]]}, 223 area: {l:'Ù Ø³Ø§ØØª',u:[['٠تر ٠ربع','m²',1],['Ú©ÛÙÙ٠تر ٠ربع','km²',1e6],['Ùکتار','ha',1e4],['Ø¬Ø±ÛØ¨ (Ø§ÙØºØ§ÙÛ)','jerib',2000],['ÙÙØª ٠ربع','ft²',.092903],['٠اÛ٠٠ربع','mi²',2.59e6]]}, 224 volume: {l:'ØØ¬Ù ',u:[['ÙÛØªØ±','L',1],['Ù ÛÙÛâÙÛØªØ±','mL',.001],['٠تر ٠کعب','m³',1000],['گاÙÙ','gal',3.78541],['پاÛÙØª','pt',.473176]]}, 225 speed: {l:'سرعت',u:[['Ú©ÛÙÙ٠تر/ساعت','km/h',1],['٠تر/ثاÙÛÙ','m/s',3.6],['٠اÛÙ/ساعت','mph',1.60934],['ÙØ§Øª','kn',1.852],['٠اخ','Mach',1234.8]]}, 226 temp: {l:'د٠ا',u:[['Ø³ÙØ³ÛÙØ³','°C',0],['ÙØ§Ø±ÙÙØ§Ûت','°F',0],['Ú©ÙÙÛÙ','K',0]]}, 227 }; 228 let cur = 'length'; 229 const convTemp = (v,f,t) => {
230 let c = f==='°F'?(v-32)*5/9:f==='K'?v-273.15:v; 231 return t==='°F'?c*9/5+32:t==='K'?c+273.15:c; 232 }; 233 const fmt = n => Math.abs(n)>=.001&&Math.abs(n)<1e9?+n.toPrecision(6):n.toExponential(3); 234 235 return { 236 init() { this.setCat(document.querySelector('#uc-cats .ctab'), 'length'); }, 237 setCat(btn, cat) { 238 btn?.closest('.ctabs')?.querySelectorAll('.ctab').forEach(b=>b.classList.remove('on')); 239 btn?.classList.add('on'); cur = cat; 240 const u = CATS[cat].u; 241 ['uc-from','uc-to'].forEach((id,i) => { 242 document.getElementById(id).innerHTML = u.map((x,j)=>`<option value="${j}">${x[0]} (${x[1]})</option>`).join(''); 243 if(i===1) document.getElementById(id).selectedIndex=1; 244 }); 245 this.calc(); 246 }, 247 calc() { 248 const cat = CATS[cur]; 249 const v = parseFloat(document.getElementById('uc-val').value)||0; 250 const fu = cat.u[+document.getElementById('uc-from').value||0]; 251 const tu = cat.u[+document.getElementById('uc-to').value||0]; 252 const res = cur==='temp' ? convTemp(v,fu[1],tu[1]) : v*fu[2]/tu[2]; 253 document.getElementById('uc-res').textContent = fmt(res)+' '+tu[1]; 254 const rows = cat.u.slice(0,6).map(u => { 255 const r = cur==='temp'?convTemp(v,fu[1],u[1]):v*fu[2]/u[2]; 256 return `<div class="mi"><div class="min">${u[0]}</div><div class="miv" style="font-size:13px">${fmt(r)} ${u[1]}</div></div>`; 257 }).join(''); 258 document.getElementById('uc-table').innerHTML = `<div class="fl" style="margin-bottom:6px">جدÙÙ Ø³Ø±ÛØ¹:</div><div class="mkt" style="padding:0">${rows}</div>`; 259 } 260 }; 261})(); 262window.selUCat = (btn,cat) => UnitConv.setCat(btn,cat); 263window.calcUC = () => UnitConv.calc(); 264 265// ââ DATE CONVERTER âââââââââââââââââââââââââââââ 266const DateConv = (() => { 267 const SH = ['ØÙ Ù','Ø«ÙØ±','Ø¬ÙØ²Ø§','سرطاÙ','اسد','Ø³ÙØ¨ÙÙ','Ù ÛØ²Ø§Ù','Ø¹ÙØ±Ø¨','ÙÙØ³','جدÛ','دÙÙ','ØÙت']; 268 const MI = ['January','February','March','April','May','June','July','August','September','October','November','December']; 269 const HJ = ['Ù ØØ±Ù ','ØµÙØ±','Ø±Ø¨ÛØ¹ Ø§ÙØ§ÙÙ','Ø±Ø¨ÛØ¹ Ø§ÙØ«Ø§ÙÛ','Ø¬Ù Ø§Ø¯Û Ø§ÙØ§ÙÙ','Ø¬Ù Ø§Ø¯Û Ø§ÙØ«Ø§ÙÛ','رجب','شعباÙ','ر٠ضاÙ','Ø´ÙØ§Ù','Ø°Û Ø§ÙÙØ¹Ø¯Ù','Ø°Û Ø§ÙØØ¬Ù']; 270 const WD = ['ÛÚ©Ø´ÙØ¨Ù','Ø¯ÙØ´ÙبÙ','سÙâØ´ÙØ¨Ù','ÚÙØ§Ø±Ø´ÙبÙ','Ù¾ÙØ¬âØ´ÙØ¨Ù','ج٠عÙ','Ø´ÙØ¨Ù']; 271 272 const sh2jd = (y,m,d) => { 273 const ep=1948320.5, cy=Math.floor((y-474)/2820)*2820+474; 274 return d+(m<=6?31*(m-1):30*(m-1)+6)+Math.floor((682*cy-110)/2816)+(cy-1)*365+Math.floor(cy/4)-Math.floor(cy/128)+Math.floor(cy/2816)+ep; 275 }; 276 const jd2mi = jd => { 277 const l=Math.floor(jd+.5)+68569,n=Math.floor(4*l/146097),l2=l-Math.floor((146097*n+3)/4); 278 const y=Math.floor(4000*(l2+1)/1461001),l3=l2-Math.floor(1461*y/4)+31; 279 const m=Math.floor(80*l3/2447),d=l3-Math.floor(2447*m/80); 280 return {y:100*(n-49)+y+Math.floor(m/14), m:m+2-12*Math.floor(m/14), d}; 281 }; 282 const mi2jd = (y,m,d) => 367*y-Math.floor(7*(y+Math.floor((m+9)/12))/4)+Math.floor(275*m/9)+d+1721013.5; 283 const jd2sh = jd => { 284 const ep=1948320.5,dep=Math.floor(jd+.5)-ep,cyc=Math.floor(dep/1029983),cy=dep%1029983; 285 const yr=cy===1029982?2820:Math.floor((2816*cy+1031337)/1028522),y=yr+2820*cyc+474; 286 let rem=dep-sh2jd(yr+474,1,1)+1,m=1,d=rem; 287 const days=[31,31,31,31,31,31,30,30,30,30,30,29]; 288 for(let i=0;i<12;i++){if(d<=days[i])break;d-=days[i];m++;} 289 return{y,m,d}; 290 }; 291 const mi2hj_approx = (gy,gm,gd) => { 292 const jd=mi2jd(gy,gm,gd); 293 const l=Math.floor(jd+.5)-1948440+10632, n=Math.floor((l-1)/10631), l2=l-10631*n+354; 294 const j=Math.floor((10985-l2)/5316)*Math.floor(50*l2/17719)-Math.floor(l2/5670)*Math.floor(43*l2/15238); 295 const l3=l2-Math.floor((30-j)/15)*Math.floor(17719*j/50)+Math.floor(j/16)*Math.floor(15238*j/43); 296 const hd=Math.floor(l3*30/1015), hm=Math.min(12,hd<15?1:Math.ceil((hd-14.5)/29.5)); 297 return {y:30*n+j-1, m:hm, d:Math.max(1,hd-29*(hm-1))}; 298 }; 299 const show = (boxId,val,sub='') => { 300 const box=document.getElementById(boxId); 301 box.querySelector('.res-val').textContent=val; 302 box.querySelector('.res-sub').textContent=sub; 303 box.style.display='block'; 304 }; 305 const v = id => parseInt(document.getElementById(id).value)||0; 306 307 return { 308 switchTab(btn,tab) { 309 btn.closest('.ctabs').querySelectorAll('.ctab').forEach(b=>b.classList.remove('on')); btn.classList.add('on'); 310 ['sh2mi','mi2sh','sh2hj','hj2sh'].forEach(t=>document.getElementById('dc-'+t).style.display='none'); 311 document.getElementById('dc-'+tab).style.display='block'; 312 }, 313 sh2mi() { const mi=jd2mi(sh2jd(v('sh-y'),v('sh-m'),v('sh-d'))); show('dc-res1',`${mi.d} ${MI[mi.m-1]} ${mi.y}`,WD[new Date(mi.y,mi.m-1,mi.d).getDay()]); }, 314 mi2sh() { const sh=jd2sh(mi2jd(v('mi-y'),v('mi-m'),v('mi-d'))); show('dc-res2',`${sh.d} ${SH[sh.m-1]} ${sh.y}`); }, 315 sh2hj() { const mi=jd2mi(sh2jd(v('sh2-y'),v('sh2-m'),v('sh2-d'))); const hj=mi2hj_approx(mi.y,mi.m,mi.d); show('dc-res3',`${hj.d} ${HJ[hj.m-1]} ${hj.y}`); }, 316 hj2sh() { const jd=Math.floor((11*v('hj-y')+3)/30)+354*v('hj-y')+30*v('hj-m')-Math.floor((v('hj-m')-1)/2)+v('hj-d')+1948440-385; const sh=jd2sh(jd+.5); show('dc-res4',`${sh.d} ${SH[sh.m-1]} ${sh.y}`); }, 317 }; 318})(); 319window.selDcTab = (btn,tab) => DateConv.switchTab(btn,tab); 320window.convSh2Mi = () => DateConv.sh2mi(); 321window.convMi2Sh = () => DateConv.mi2sh(); 322window.convSh2Hj = () => DateConv.sh2hj(); 323window.convHj2Sh = () => DateConv.hj2sh(); 324 325// ââ PRAYER (AlAdhan.com API) ââââââââââââââââââ 326const Prayer = { 327 curLat: 34.5553, curLng: 69.2075, 328 curCity: 'کابÙ', 329 curMaz: 'hanafi', 330 NAMES: ['اذا٠صبØ', 'Ø·ÙÙØ¹ Ø¢ÙØªØ§Ø¨', 'Ø¸ÙØ±', 'عصر', '٠غرب', 'عشا'], 331 KEYS: ['Fajr', 'Sunrise', 'Dhuhr', 'Asr', 'Maghrib', 'Isha'], 332 333 async load() { 334 document.getElementById('prgrid').innerHTML = 335 '<div style="grid-column:span 3;text-align:center;padding:20px;color:var(--g);font-weight:700">Ⳡدر ØØ§Ù Ø¯Ø±ÛØ§Ùت اÙÙØ§Øª دÙÛÙ...</div>'; 336 337 // AlAdhan API 338 // method=1: University of Islamic Sciences Karachi (Ù ÙØ§Ø³Ø¨ Ø§ÙØºØ§ÙستاÙ) 339 // method=7: Institute of Geophysics, University of Tehran (Ø´ÛØ¹Ù) 340 // school=1: Hanafi (Ø¨Ø±Ø§Û Ø¹ØµØ±), school=0: Standard 341 const method = this.curMaz === 'hanafi' ? 1 : 7; 342 const school = this.curMaz === 'hanafi' ? 1 : 0; 343 344 const today = new Date(); 345 const dd = String(today.getDate()).padStart(2,'0'); 346 const mm = String(today.getMonth()+1).padStart(2,'0'); 347 const yyyy = today.getFullYear(); 348 const dateStr = `${dd}-${mm}-${yyyy}`; 349 350 const url = `https://api.aladhan.com/v1/timings/${dateStr}?latitude=${this.curLat}&longitude=${this.curLng}&method=${method}&school=${school}&timezonestring=Asia/Kabul`; 351 352 try { 353 const r = await fetch(url); 354 const d = await r.json(); 355 if (d.code !== 200) throw new Error('API error'); 356 357 const timings = d.data.timings; 358 const hijriDate = d.data.date.hijri; 359 const gregDate = d.data.date.gregorian; 360 361 // Ø¢Ù¾Ø¯ÛØª ØªØ§Ø±ÛØ® 362 const dateEl = document.getElementById('pr-date'); 363 if (dateEl) dateEl.textContent = `${hijriDate.day}
363 ${hijriDate.month.ar} ${hijriDate.year} · ${gregDate.date}`; 364 365 // Ù¾ÛØ¯Ø§ کرد٠Ù٠از Ø¨Ø¹Ø¯Û 366 const nowMs = Date.now(); 367 const kabulOffset = 4.5 * 60; // UTC+4:30 368 const nowMin = ((nowMs / 60000) % (24*60) + kabulOffset) % (24*60); 369 370 const times = this.KEYS.map(k => { 371 const t = timings[k]?.replace(' (AFT)', '') || '--'; 372 if (t === '--') return -1; 373 const [h,m] = t.split(':').map(Number); 374 return h*60 + m; 375 }); 376 377 let nextIdx = times.findIndex(t => t > nowMin); 378 if (nextIdx === -1) nextIdx = 0; 379 380 // Ø±ÙØ¯Ø± کارتâÙØ§ 381 document.getElementById('prgrid').innerHTML = this.NAMES.map((name, i) => { 382 const t = this.KEYS[i] ? timings[this.KEYS[i]]?.replace(' (AFT)','') || '--' : '--'; 383 const isNext = i === nextIdx && t !== '--'; 384 const isSunrise = i === 1; 385 return `<div class="pri${isNext ? ' now' : ''}" style="${isSunrise ? 'opacity:.7' : ''}"> 386 <div class="prn">${name}</div> 387 <div class="prt" style="font-size:${t.length > 5 ? '15px' : '19px'}">${t}</div> 388 ${isNext ? '<div class="prx">ⰠبعدÛ</div>' : ''} 389 </div>`; 390 }).join(''); 391 392 // Ù٠از Ø¨Ø¹Ø¯Û 393 const nextEl = document.getElementById('pr-next'); 394 const nextLbl = document.getElementById('pr-next-label'); 395 if (nextEl && nextLbl && nextIdx >= 0) { 396 const nextTime = this.KEYS[nextIdx] ? timings[this.KEYS[nextIdx]]?.replace(' (AFT)','') : ''; 397 nextEl.style.display = 'block'; 398 nextLbl.textContent = `â° ${this.NAMES[nextIdx]}: ${nextTime}`; 399 } 400 401 } catch(e) { 402 document.getElementById('prgrid').innerHTML = 403 '<div style="grid-column:span 3;text-align:center;padding:20px;color:var(--r);font-size:13px;font-weight:700">خطا در Ø¯Ø±ÛØ§Ùت اÙÙØ§Øª â Ø¯ÙØ¨Ø§Ø±Ù ØªÙØ§Ø´ Ú©ÙÛØ¯</div>'; 404 console.warn('Prayer API error:', e); 405 } 406 } 407}; 408 409window.setPrayerCity = (btn, cityName, lat, lng) => { 410 btn.closest('.ctabs').querySelectorAll('.ctab').forEach(b => b.classList.remove('on')); 411 btn.classList.add('on'); 412 Prayer.curLat = lat; Prayer.curLng = lng; Prayer.curCity = cityName; 413 document.getElementById('pr-city-name').textContent = cityName; 414 Prayer.load(); 415}; 416 417window.setPrayerMaz = (maz) => { 418 Prayer.curMaz = maz; 419 const hBtn = document.getElementById('maz-hanafi'); 420 const sBtn = document.getElementById('maz-shia'); 421 const label = document.getElementById('pr-maz-label'); 422 if (maz === 'hanafi') { 423 hBtn.style.cssText = 'flex:1;padding:9px;background:var(--g);color:#fff;border:none;border-radius:9px;font-size:13px;font-weight:800;cursor:pointer'; 424 sBtn.style.cssText = 'flex:1;padding:9px;background:#f5f7fb;color:var(--t2);border:1.5px solid var(--bdr);border-radius:9px;font-size:13px;font-weight:800;cursor:pointer'; 425 if (label) label.textContent = 'ØÙÙÛ'; 426 } else { 427 sBtn.style.cssText = 'flex:1;padding:9px;background:var(--g);color:#fff;border:none;border-radius:9px;font-size:13px;font-weight:800;cursor:pointer'; 428 hBtn.style.cssText = 'flex:1;padding:9px;background:#f5f7fb;color:var(--t2);border:1.5px solid var(--bdr);border-radius:9px;font-size:13px;font-weight:800;cursor:pointer'; 429 if (label) label.textContent = 'Ø¬Ø¹ÙØ±Û'; 430 } 431 Prayer.load(); 432}; 433 434 435// ââ WEATHER (Open-Meteo API - راÛگا٠بدÙÙ key) âââââ 436const WX_CODES = { 437 0:'âï¸ Ø¢ÙØªØ§Ø¨Û',1:'ð¤ Ú©Ù Û Ø§Ø¨Ø±Û',2:'â ÙÛÙ ÙâØ§Ø¨Ø±Û',3:'âï¸ Ø§Ø¨Ø±Û', 438 45:'ð« Ù ÙâØ¢ÙÙØ¯',48:'ð« Ù Ù ÛØ®âزدÙ',51:'ð¦ ÙÙ âÙ٠باراÙ',53:'ð§ Ø¨Ø§Ø±Ø§Ù',55:'ð§ Ø¨Ø§Ø±Ø§Ù Ø´Ø¯ÛØ¯', 439 61:'ð§ Ø¨Ø§Ø±Ø§Ù سبک',63:'ð§ Ø¨Ø§Ø±Ø§Ù Ù ØªÙØ³Ø·',65:'ð§ Ø¨Ø§Ø±Ø§Ù سÙÚ¯ÛÙ', 440 71:'ð¨ Ø¨Ø±Ù سبک',73:'âï¸ Ø¨Ø±Ù',75:'âï¸ Ø¨Ø±Ù Ø³ÙÚ¯ÛÙ', 441 80:'ð¦ Ø±Ú¯Ø¨Ø§Ø±',81:'â Ø±Ú¯Ø¨Ø§Ø± Ø´Ø¯ÛØ¯',82:'â Ø±Ú¯Ø¨Ø§Ø± Ø·ÙÙØ§ÙÛ', 442 95:'â Ø·ÙÙØ§Ù',96:'â Ø·ÙÙØ§Ù با تگرگ',99:'â Ø·ÙÙØ§Ù Ø´Ø¯ÛØ¯', 443}; 444const DAYS_FA = ['ÛÚ©Ø´ÙØ¨Ù','Ø¯ÙØ´ÙبÙ','سÙâØ´ÙØ¨Ù','ÚÙØ§Ø±Ø´ÙبÙ','Ù¾ÙØ¬âØ´ÙØ¨Ù','ج٠عÙ','Ø´ÙØ¨Ù']; 445 446async function loadWeather() { 447 const sel = document.getElementById('wx-city-select'); 448 if (!sel) return; 449 const [lat, lng, cityName] = sel.value.split(','); 450 451 // Ø¢Ù¾Ø¯ÛØª ÙØ§Ù Ø´ÙØ± 452 const nameEl = document.getElementById('wx-city-name'); 453 if (nameEl) nameEl.textContent = cityName + 'Ø Ø§ÙØºØ§ÙستاÙ'; 454 455 // Ø¢ÛÚ©ÙÙ loading 456 const iconEl = document.getElementById('wx-icon-main'); 457 if (iconEl) iconEl.textContent = 'â³'; 458 459 try { 460 const url = `https://api.open-meteo.com/v1/forecast?latitude=${lat}&longitude=${lng}¤t=temperature_2m,relative_humidity_2m,apparent_temperature,weather_code,wind_speed_10m&daily=weather_
460code,temperature_2m_max,temperature_2m_min&timezone=Asia%2FKabul&forecast_days=7`; 461 const r = await fetch(url); 462 const d = await r.json(); 463 464 const cur = d.current; 465 const daily = d.daily; 466 467 // Ø¢Ù¾Ø¯ÛØª کارت اصÙÛ 468 const temp = Math.round(cur.temperature_2m); 469 const feels = Math.round(cur.apparent_temperature); 470 const humid = cur.relative_humidity_2m; 471 const wind = Math.round(cur.wind_speed_10m); 472 const code = cur.weather_code; 473 const wxInfo = WX_CODES[code] || 'ð¡ ÙØ§Ù شخص'; 474 const [icon, desc] = wxInfo.split(' '); 475 476 document.getElementById('wx-temp-main').textContent = temp + '°'; 477 document.getElementById('wx-desc-main').textContent = wxInfo; 478 document.getElementById('wx-humidity').textContent = 'ð§ ' + humid + 'Ùª'; 479 document.getElementById('wx-wind').textContent = 'ð¨ ' + wind + ' Ú©/س'; 480 document.getElementById('wx-feels').textContent = 'ð¡ Ø§ØØ³Ø§Ø³: ' + feels + '°'; 481 if (iconEl) iconEl.textContent = icon || 'ð¡'; 482 483 // رÙÚ¯ کارت بر اساس د٠ا 484 const card = document.getElementById('wx-main-card'); 485 if (card) { 486 if (temp >= 30) card.style.background = 'linear-gradient(135deg,#b45309,#f59e0b)'; 487 else if (temp >= 20) card.style.background = 'linear-gradient(135deg,#1d4ed8,#60a5fa)'; 488 else if (temp >= 10) card.style.background = 'linear-gradient(135deg,#0d7c5e,#34d399)'; 489 else card.style.background = 'linear-gradient(135deg,#1e3a5f,#6b8ccc)'; 490 } 491 492 // Ù¾ÛØ´âبÛÙÛ Û· Ø±ÙØ² 493 const forecastEl = document.getElementById('wx-forecast'); 494 if (forecastEl && daily) { 495 forecastEl.innerHTML = daily.time.map((date, i) => { 496 const d2 = new Date(date); 497 const dayName = i === 0 ? 'Ø§Ù Ø±ÙØ²' : i === 1 ? 'ÙØ±Ø¯Ø§' : DAYS_FA[d2.getDay()]; 498 const wx2 = WX_CODES[daily.weather_code[i]] || 'ð¡'; 499 const [ic2] = wx2.split(' '); 500 const max = Math.round(daily.temperature_2m_max[i]); 501 const min = Math.round(daily.temperature_2m_min[i]); 502 return `<div style="display:flex;align-items:center;justify-content:space-between;padding:9px 12px;background:#f9fafb;border-radius:9px;border:1px solid var(--bdr)"> 503 <div style="font-size:13px;font-weight:800;color:var(--t1);width:80px">${dayName}</div> 504 <div style="font-size:22px">${ic2}</div> 505 <div style="font-size:12px;color:var(--t3);flex:1;text-align:center">${wx2.replace(ic2,'').trim()}</div> 506 <div style="text-align:left"> 507 <span style="font-size:14px;font-weight:900;color:#b91c1c">${max}°</span> 508 <span style="font-size:12px;color:var(--t3);margin-right:6px"> / ${min}°</span> 509 </div> 510 </div>`; 511 }).join(''); 512 } 513 514 } catch(e) { 515 document.getElementById('wx-icon-main').textContent = 'â ï¸'; 516 document.getElementById('wx-desc-main').textContent = 'خطا در Ø¯Ø±ÛØ§Ùت Ø§Ø·ÙØ§Ø¹Ø§Øª'; 517 console.warn('Weather error:', e); 518 } 519} 520 521// ââ FLIGHTS ââââââââââââââââââââââââââââââââââââââ 522const FL = { 523 cur: 'KBL', 524 curTab: 'dep', 525 timer: null, 526 countdown: null, 527 528 AIRPORTS: { 529 KBL: {name:'ÙØ±Ùدگا٠بÛÙâØ§ÙÙ ÙÙÛ Ú©Ø§Ø¨Ù', iata:'KBL', icao:'OAKB', lat:34.5659, lng:69.2123}, 530 HEA: {name:'ÙØ±Ùدگا٠بÛÙâØ§ÙÙ ÙÙÛ ÙØ±Ø§Øª', iata:'HEA', icao:'OAHR', lat:34.2100, lng:61.5281}, 531 MZR: {name:'ÙØ±Ùدگا٠بÛÙâØ§ÙÙ ÙÙÛ Ù Ø²Ø§Ø±Ø´Ø±ÛÙ',iata:'MZR', icao:'OAMS', lat:36.7051, lng:67.2097}, 532 KDH: {name:'ÙØ±Ùدگا٠بÛÙâØ§ÙÙ ÙÙÛ ÙÙØ¯Ùار', iata:'KDH', icao:'OAKN', lat:31.5058, lng:65.8478}, 533 }, 534 535 // Ø¨Ø±ÙØ§Ù Ù Ù¾Ø±ÙØ§Ø²ÙØ§Û Ù Ø¹Ù ÙÙ 536 SCHEDULE: { 537 KBL: { 538 dep: [ 539 {time:'06:30',flight:'FZ581', dest:'Ø¯Ø¨Û (DXB)', airline:'FlyDubai', days:'Ø±ÙØ²Ø§ÙÙ', status:'ب٠٠ÙÙØ¹'}, 540 {time:'07:15',flight:'AF610', dest:'Ø¯Ø¨Û (DXB)', airline:'Ariana Afghan', days:'Ø±ÙØ²Ø§ÙÙ', status:'ب٠٠ÙÙØ¹'}, 541 {time:'08:00',flight:'TK711', dest:'Ø§Ø³ØªØ§ÙØ¨ÙÙ (IST)', airline:'Turkish Airlines',days:'ÛÚ©âØ´ÙØ¨Ù,سÙâØ´ÙØ¨Ù,Ù¾ÙØ¬âØ´ÙØ¨Ù',status:'ب٠٠ÙÙØ¹'}, 542 {time:'09:30',flight:'PK201', dest:'Ø§Ø³ÙØ§Ù âØ¢Ø¨Ø§Ø¯ (ISB)',airline:'PIA', days:'Ø±ÙØ²Ø§ÙÙ', status:'ب٠٠ÙÙØ¹'}, 543 {time:'10:00',flight:'W5001', dest:'ØªÙØ±Ø§Ù (IKA)', airline:'Mahan Air', days:'Ø´ÙØ¨Ù,Ø¯ÙØ´ÙبÙ,ÚÙØ§Ø±Ø´ÙبÙ',status:'ب٠٠ÙÙØ¹'}, 544 {time:'11:30',flight:'AI245', dest:'دÙÙÛ (DEL)', airline:'Air India', days:'Ø¯ÙØ´ÙبÙ,ÚÙØ§Ø±Ø´ÙبÙ,ج٠عÙ',status:'ب٠٠ÙÙØ¹'}, 545 {time:'13:00',flight:'FZ583', dest:'Ø¯Ø¨Û (DXB)', airline:'FlyDubai', days:'Ø±ÙØ²Ø§ÙÙ', status:'ب٠٠ÙÙØ¹'}, 546 {time:'14:30',flight:'EP401', dest:'Ù Ø´ÙØ¯ (MHD)', airline:'Iran Air', days:'سÙâØ´ÙØ¨Ù,ج٠عÙ',status:'ب٠٠ÙÙØ¹'}, 547 {time:'15:00',flight:'GF130', dest:'Ø¨ØØ±ÛÙ (BAH)', airline:'Gulf Air', days:'سÙâØ´ÙØ¨Ù,Ø´ÙØ¨Ù',status:'ب٠٠ÙÙØ¹'}, 548 {time:'16:45',flight:'QR596', dest:'Ø¯ÙØÙ (DOH)', airline:'Qatar Airways', days:'Ø±ÙØ²Ø§ÙÙ', status:'ب٠٠ÙÙØ¹'}, 549 {time:'18:00',flight:'EK610', dest:'Ø¯Ø¨Û (DXB)', airline:'Emirates', days:'Ø±ÙØ²Ø§ÙÙ', status:'ب٠٠ÙÙØ¹'}, 550 {time:'20:30',flight:'EY295', dest:'Ø§Ø¨ÙØ¸Ø¨Û (AUH)', airline:'Etihad', days:'ÚÙØ§Ø±Ø´ÙبÙ,ج٠عÙ,ÛÚ©Ø´ÙØ¨Ù',status:'ب٠٠ÙÙØ¹'}, 551 ], 552 arr: [ 553 {time:'05:45',flight:'FZ580', from:'Ø¯Ø¨Û (DXB)', airline:'FlyDubai', days:'Ø±ÙØ²Ø§ÙÙ', status:'ب٠٠ÙÙØ¹'}, 554 {time:'06:30',flight:'TK710', from:'Ø§Ø³ØªØ§ÙØ¨ÙÙ (IST)', airline:'Turkish Airlines',days:'Ø¯ÙØ´ÙبÙ,ÚÙØ§Ø±Ø´ÙبÙ,ج٠عÙ',status:'ب٠٠ÙÙØ¹'}, 555 {time:'08:15',flight:'PK200', from:'Ø§Ø³ÙØ§Ù âØ¢Ø¨Ø§Ø¯ (ISB)',airline:'PIA', days:'Ø±ÙØ²Ø§ÙÙ', status:'ب٠٠ÙÙØ¹'}, 556 {time:'09:00',flight:'W5002', from:'ØªÙØ±Ø§Ù (IKA)', airline:'Mahan Air', days:'Ø´ÙØ¨Ù,Ø¯ÙØ´ÙبÙ,ÚÙØ§Ø±Ø´ÙبÙ',status:'ب٠٠ÙÙØ¹'}, 557 {time:'10:30',flight:'AI244', from:'دÙÙÛ (DEL)', airline:'Air India', days:'Ø¯ÙØ´ÙبÙ,ÚÙØ§Ø±Ø´ÙبÙ,ج٠عÙ',status:'ب٠٠ÙÙØ¹'}, 558 {time:'12:00',flight:'FZ582', from:'Ø¯Ø¨Û (DXB)', airline:'FlyDubai', days:'Ø±ÙØ²Ø§ÙÙ', status:'ب٠٠ÙÙØ¹'}, 559 {time:'13:30',flight:'EP400', from:'Ù Ø´ÙØ¯ (MHD)', airline:'Iran Air', days:'سÙâØ´ÙØ¨Ù,ج٠عÙ',status:'ب٠٠ÙÙØ¹'}, 560 {time:'15:45',flight:'QR597', from:'Ø¯ÙØÙ (DOH)', airline:'Qatar Airways', days:'Ø±ÙØ²Ø§ÙÙ', status:'ب٠٠ÙÙØ¹'}, 561 {time:'17:00',flight:'EK611', from:'Ø¯Ø¨Û (DXB)', airline:'Emirates', days:'Ø±ÙØ²Ø§ÙÙ', status:'ب٠٠ÙÙØ¹'}, 562 {time:'19:30',flight:'EY296', from:'Ø§Ø¨ÙØ¸Ø¨Û (AUH)', airline:'Etihad', days:'ÚÙØ§Ø±Ø´ÙبÙ,ج٠عÙ,ÛÚ©Ø´ÙØ¨Ù',status:'ب٠٠ÙÙØ¹'}, 563 ] 564 }, 565 HEA: { 566 dep: [ 567 {time:'07:00',flight:'FZ591', dest:'Ø¯Ø¨Û (DXB)', airline:'FlyDubai', days:'Ø±ÙØ²Ø§ÙÙ', status:'ب٠٠ÙÙØ¹'}, 568 {time:'09:30',flight:'AF510', dest:'کاب٠(KBL)', airline:'Ariana Afghan',days:'Ø±ÙØ²Ø§ÙÙ', status:'ب٠٠ÙÙØ¹'}, 569 {time:'11:00',flight:'KM101', dest:'کاب٠(KBL)', airline:'Kam Air', days:'Ø±ÙØ²Ø§ÙÙ', status:'ب٠٠ÙÙØ¹'}, 570 {time:'14:00',flight:'EP501', dest:'Ù Ø´ÙØ¯ (MHD)', airline:'Iran Air', days:'Ø¯ÙØ´ÙبÙ,ÚÙØ§Ø±Ø´ÙبÙ,ج٠عÙ',status:'ب٠٠ÙÙØ¹'}, 571 {time:'16:30',flight:'FZ593', dest:'Ø¯Ø¨Û (DXB)', airline:'FlyDubai', days:'سÙâØ´ÙØ¨Ù,Ù¾ÙØ¬âØ´ÙØ¨Ù',status:'ب٠٠ÙÙØ¹'}, 572 ], 573 arr: [ 574 {time:'06:00',flight:'FZ590', from:'Ø¯Ø¨Û (DXB)', airline:'FlyDubai', days:'Ø±ÙØ²Ø§ÙÙ', status:'ب٠٠ÙÙØ¹'}, 575 {time:'08:30',flight:'AF511', from:'کاب٠(KBL)', airline:'Ariana Afghan',days:'Ø±ÙØ²Ø§ÙÙ', status:'ب٠٠ÙÙØ¹'}, 576 {time:'13:00',flight:'EP500', from:'Ù Ø´ÙØ¯ (MHD)', airline:'Iran Air', days:'Ø¯ÙØ´ÙبÙ,ÚÙØ§Ø±Ø´ÙبÙ,ج٠عÙ',status:'ب٠٠ÙÙØ¹'}, 577 {time:'15:30',flight:'FZ592', from:'Ø¯Ø¨Û (DXB)', airline:'FlyDubai', days:'سÙâØ´ÙØ¨Ù,Ù¾ÙØ¬âØ´ÙØ¨Ù',status:'ب٠٠ÙÙØ¹'}, 578 ] 579 }, 580 MZR: { 581 dep: [ 582 {time:'08:00',flight:'AF310', dest:'کاب٠(KBL)', airline:'Ariana Afghan',days:'Ø±ÙØ²Ø§ÙÙ', status:'ب٠٠ÙÙØ¹'}, 583 {time:'10:30',flight:'FZ595', dest:'Ø¯Ø¨Û (DXB)', airline:'FlyDubai', days:'سÙâØ´ÙØ¨Ù,Ù¾ÙØ¬âØ´ÙØ¨Ù,Ø´ÙØ¨Ù',status:'ب٠٠ÙÙØ¹'}, 584 {time:'13:00',flight:'KM201', dest:'کاب٠(KBL)', airline:'Kam Air', days:'Ø±ÙØ²Ø§ÙÙ', status:'ب٠٠ÙÙØ¹'}, 585 ], 586 arr: [ 587 {time:'07:00',flight:'AF311', from:'کاب٠(KBL)', airline:'Ariana Afghan',days:'Ø±ÙØ²Ø§ÙÙ', status:'ب٠٠ÙÙØ¹'}, 588 {time:'09:30',flight:'FZ594', from:'Ø¯Ø¨Û (DXB)', airline:'FlyDubai', days:'سÙâØ´ÙØ¨Ù,Ù¾ÙØ¬âØ´ÙØ¨Ù,Ø´ÙØ¨Ù',status:'ب٠٠ÙÙØ¹'}, 589 {time:'12:00',flight:'KM202', from:'کاب٠(KBL)', airline:'Kam Air', days:'Ø±ÙØ²Ø§ÙÙ', status:'ب٠٠ÙÙØ¹'}, 590 ] 591 }, 592 KDH: { 593 dep: [ 594 {time:'09:00',flight:'AF410', dest:'کاب٠(KBL)', airline:'Ariana Afghan',days:'Ø±ÙØ²Ø§ÙÙ', status:'ب٠٠ÙÙØ¹'}, 595 {time:'12:00',flight:'FZ597', dest:'Ø¯Ø¨Û (DXB)', airline:'FlyDubai', days:'Ø¯ÙØ´ÙبÙ,ÚÙØ§Ø±Ø´ÙبÙ,ج٠عÙ',status:'ب٠٠ÙÙØ¹'}, 596 ], 597 arr: [ 598 {time:'08:00',flight:'AF411', from:'کاب٠(KBL)', airline:'Ariana Afghan',days:'Ø±ÙØ²Ø§ÙÙ', status:'ب٠٠ÙÙØ¹'}, 599 {time:'11:00',flight:'FZ596', from:'Ø¯Ø¨Û (DXB)', airline:'FlyDubai', days:'Ø¯ÙØ´ÙبÙ,ÚÙØ§Ø±Ø´ÙبÙ,ج٠عÙ',status:'ب٠٠ÙÙØ¹'}, 600 ] 601 }, 602 }, 603 604 select(btn, iata) { 605 this.cur = iata; 606 document.querySelectorAll('.fl-ap-btn').forEach(b => b.classList.remove('fl-active')); 607 btn.classList.add('fl-active'); 608 const ap = this.AIRPORTS[iata]; 609 document.getElementById('fl-ap-name').textContent = ap.name; 610 document.getElementById('fl-iata').textContent = ap.iata; 611 document.getElementById('fl-icao').textContent = ap.icao; 612 this.showTab(this.curTab); 613 }, 614 615 tab(btn, t) { 616 this.curTab = t; 617 ['dep','arr','live'].forEach(id => { 618 const b = document.getElementById('tab-' + id); 619 if (!b) return; 620 const active = id === t; 621 b.style.background = active ? 'var(--g)' : '#f5f7fb'; 622 b.style.color = active ? '#fff' : 'var(--t2)'; 623 b.style.border = active ? 'none' : '1.5px solid var(--bdr)'; 624 }); 625 this.showTab(t); 626 }, 627 628 showTab(t) { 629 if (t === 'live') { this.loadLive(); return; } 630 const data = this.SCHEDULE[this.cur]; 631 if (!data) return; 632 const flights = t === 'dep' ? data.dep : data.arr; 633 const isDep = t === 'dep'; 634 635 // ساعت کاب٠636 const now = new Date(Date.now() + 4.5*3600000); 637 const nowMin = now.getUTCHours()*60 + now.getUTCMinutes(); 638 639 document.getElementById('fl-content').innerHTML = ` 640 <div style="background:#f0f4ff;border-radius:9px;padding:9px 12px;margin-bottom:10px;font-size:11px;color:#1d4ed8;font-weight:700;border:1px solid #bfdbfe"> 641 â ï¸ Ø¨Ø±ÙØ§Ù ٠٠ع٠ÙÙ â ٠٠ک٠است در Ø§ÛØ§Ù خاص تغÛÛØ± Ú©ÙØ¯ 642 </div> 643 ${flights.map(f => { 644 const [h,m] = f.time.split(':').map(Number); 645 const flMin = h*60+m; 646 const diff = flMin - nowMin; 647 const soon = diff > 0 && diff < 90; 648 const past = diff < 0 && diff > -60; 649 let badge = ''; 650 if (soon) badge = `<span style="background:#fef9c3;color:#854d0e;font-size:10px;font-weight:800;padding:2px 7px;border-radius:4px;margin-right:6px">${diff}د دÛگر</span>`;
651 else if (past) badge = `<span style="background:#fee2e2;color:#b91c1c;font-size:10px;font-weight:800;padding:2px 7px;border-radius:4px;margin-right:6px">Ù¾Ø±ÙØ§Ø² کرد</span>`; 652 return ` 653 <div style="background:#fff;border-radius:10px;padding:12px 14px;border:1.5px solid ${soon?'var(--a)':past?'#fecaca':'var(--bdr)'};margin-bottom:8px;${soon?'box-shadow:0 0 0 3px rgba(217,119,6,.1)':''}"> 654 <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:6px"> 655 <div style="display:flex;align-items:center;gap:8px"> 656 <div style="font-size:22px;font-weight:900;color:var(--gd);direction:ltr">${f.time}</div> 657 <div> 658 <div style="font-size:12px;font-weight:900;color:var(--t1)">${f.flight}</div> 659 <div style="font-size:10px;color:var(--t3)">${f.airline}</div> 660 </div> 661 </div> 662 <div style="text-align:left"> 663 ${badge} 664 <span style="font-size:11px;font-weight:700;color:#15803d;background:#dcfce7;padding:2px 8px;border-radius:4px">${f.status}</span> 665 </div> 666 </div> 667 <div style="display:flex;align-items:center;gap:6px;font-size:12px;color:var(--t2)"> 668 <span>${isDep?'ð«':'ð¬'}</span> 669 <span style="font-weight:700;color:var(--t1)">${isDep?f.dest:f.from}</span> 670 <span style="margin-right:auto;font-size:10px;color:var(--t3)">ð ${f.days}</span> 671 </div> 672 </div>`; 673 }).join('')} 674 <div style="text-align:center;font-size:11px;color:var(--t3);margin-top:5px">بر اساس ساعت کاب٠· ${now.getUTCHours()}:${String(now.getUTCMinutes()).padStart(2,'0')}</div>`; 675 676 document.getElementById('fl-live-badge').style.display = 'none'; 677 document.getElementById('fl-update-time').textContent = 'ð Ø¨Ø±ÙØ§Ù ٠٠ع٠ÙÙ Ù¾Ø±ÙØ§Ø²Û'; 678 }, 679 680 async loadLive() { 681 document.getElementById('fl-content').innerHTML = 682 '<div style="text-align:center;padding:20px;color:var(--g);font-weight:700">ⳠجستجÙÛ Ù¾Ø±ÙØ§Ø²ÙØ§Û Ø²ÙØ¯Ù...</div>'; 683 document.getElementById('fl-live-badge').style.display = 'block'; 684 685 const ap = this.AIRPORTS[this.cur]; 686 const r = ap.lat*0.8, lo = ap.lng; 687 const url = `https://opensky-network.org/api/states/all?lamin=${ap.lat-0.8}&lamax=${ap.lat+0.8}&lomin=${ap.lng-0.8}&lomax=${ap.lng+0.8}`; 688 689 try { 690 const res = await fetch(url, {signal: AbortSignal.timeout(8000)}); 691 if (!res.ok) throw new Error('no data'); 692 const d = await res.json(); 693 const states = (d.states||[]).filter(f=>!f[8]); 694 695 if (!states.length) { 696 document.getElementById('fl-content').innerHTML = ` 697 <div style="text-align:center;padding:30px;background:#f9fafb;border-radius:12px;border:1px solid var(--bdr)"> 698 <div style="font-size:48px;margin-bottom:10px">ð</div> 699 <div style="font-size:15px;font-weight:800;color:var(--t1);margin-bottom:6px">ÙÛÚ ÙÙØ§Ù¾Û٠اÛÛ Ø¯Ø± آس٠ا٠ÙÛØ³Øª</div> 700 <div style="font-size:12px;color:var(--t2)">در ØØ§Ù ØØ§Ø¶Ø± ÙÙØ§Ù¾Û٠اÛÛ Ø¯Ø± Ù ØØ¯Ùد٠${ap.name} Ø´ÙØ§Ø³Ø§ÛÛ ÙØ´Ø¯</div> 701 </div>`; 702 document.getElementById('fl-update-time').textContent = 'ð´ Ø²Ùد٠· بدÙÙ Ù¾Ø±ÙØ§Ø² ÙØ¹Ø§Ù'; 703 return; 704 } 705 706 const DIRS = ['ش٠اÙ','ش٠اÙâØ´Ø±Ù','شرÙ','جÙÙØ¨âشرÙ','جÙÙØ¨','جÙÙØ¨âغرب','غرب','ش٠اÙâØºØ±Ø¨']; 707 const dir = deg => DIRS[Math.round((deg||0)/45)%8]; 708 709 document.getElementById('fl-content').innerHTML = ` 710 <div style="background:#f0fdf4;border-radius:9px;padding:9px 12px;margin-bottom:10px;border:1px solid var(--gm);display:flex;align-items:center;gap:8px"> 711 <span style="font-size:16px">âï¸</span> 712 <div style="font-size:13px;font-weight:800;color:var(--gd)">${states.length} ÙÙØ§Ù¾Û٠ا در آس٠ا٠${ap.name}</div> 713 <div style="margin-right:auto;font-size:10px;font-weight:700;background:#ef4444;color:#fff;padding:2px 8px;border-radius:20px">â LIVE</div> 714 </div> 715 ${states.slice(0,10).map(f => { 716 const cs = (f[1]||'---').trim() || '---'; 717 const country = f[2] || 'ÙØ§Ù شخص'; 718 const alt = f[7] ? Math.round(f[7]) + 'Ù ' : '--'; 719 const spd = f[9] ? Math.round(f[9]*3.6) + ' Ú©/س' : '--'; 720 const hdg = f[10] ? dir(f[10]) : '--'; 721 const vrt = f[11] ? (f[11]>0?'â':'â')+Math.abs(Math.round(f[11]))+'Ù /Ø«' : '--'; 722 return ` 723 <div style="background:#fff;border-radius:10px;padding:12px 14px;border:1.5px solid var(--bdr);margin-bottom:8px"> 724 <div style="display:flex;align-items:center;gap:10px;margin-bottom:7px"> 725 <div style="font-size:28px;display:inline-block;transform:rotate(${f[10]||0}deg)">âï¸</div> 726 <div style="flex:1"> 727 <div style="font-size:15px;font-weight:900;color:var(--t1);direction:ltr">${cs}</div> 728 <div style="font-size:11px;color:var(--t3)">${country}</div> 729 </div> 730 <div style="font-size:10px;font-weight:800;background:#fee2e2;color:#b91c1c;padding:3px 8px;border-radius:20px">Ø²ÙØ¯Ù</div> 731 </div> 732 <div style="display:grid;grid-template-columns:repeat(4,1fr);gap:6px"> 733 <div style="background:#f5f7fb;border-radius:7px;padding:6px;text-align:center"> 734 <div style="font-size:9px;color:var(--t3);margin-bottom:2px">Ø§Ø±ØªÙØ§Ø¹</div> 735 <div style="font-size:12px;font-weight:800;color:var(--t1)">${alt}</div> 736 </div> 737 <div style="background:#f5f7fb;border-radius:7px;padding:6px;text-align:center"> 738 <div style="font-size:9px;color:var(--t3);margin-bottom:2px">سرعت</div> 739 <div style="font-size:11px;font-weight:800;color:var(--t1)">${spd}</div> 740 </div> 741 <div style="background:#f5f7fb;border-radius:7px;padding:6px;text-align:center"> 742 <div style="font-size:9px;color:var(--t3);margin-bottom:2px">Ø¬ÙØª</div> 743 <div style="font-size:11px;font-weight:800;color:var(--t1)">${hdg}</div> 744 </div> 745 <div style="background:#f5f7fb;border-radius:7px;padding:6px;text-align:center"> 746 <div style="font-size:9px;color:var(--t3);margin-bottom:2px">ØµØ¹ÙØ¯</div> 747 <div style="font-size:11px;font-weight:800;color:var(--t1)">${vrt}</div> 748 </div> 749 </div> 750 </div>`; 751 }).join('')}`; 752 753 // Ø¢Ù¾Ø¯ÛØª ÙØ± Û³Û° ثاÙÛÙ 754 if (this.timer) clearTimeout(this.timer); 755 this.timer = setTimeout(() => { if(this.curTab==='live') this.loadLive(); }, 30000); 756 757 // Ø´Ù Ø§Ø±ÙØ¯Ù 758 let secs = 30; 759 if (this.countdown) clearInterval(this.countdown); 760 this.countdown = setInterval(() => { 761 const el = document.getElementById('fl-update-time'); 762 if (!el || this.curTab!=='live') { clearInterval(this.countdown); return; } 763 el.textContent = `ð´ Ø²Ùد٠· Ø¢Ù¾Ø¯ÛØª در ${secs} ثاÙÛÙ`; 764 if (--secs < 0) clearInterval(this.countdown); 765 }, 1000); 766 767 } catch(e) { 768 document.getElementById('fl-content').innerHTML = ` 769 <div style="text-align:center;padding:20px;background:#fff9e6;border-radius:10px;border:1px solid #fde68a"> 770 <div style="font-size:13px;font-weight:800;color:#92400e;margin-bottom:8px">OpenSky در دسترس ÙÛØ³Øª</div> 771 <div style="font-size:12px;color:#92400e">Ø¨Ø±ÙØ§Ù ٠٠ع٠Ù٠را Ù Ø´Ø§ÙØ¯Ù Ú©ÙÛØ¯</div> 772 <button onclick="FL.tab(document.getElementById('tab-dep'),'dep')" style="margin-top:10px;background:var(--g);color:#fff;border:none;border-radius:8px;padding:8px 16px;font-size:12px;font-weight:800;cursor:pointer;font-family:inherit">Ù Ø´Ø§ÙØ¯Ù Ø¨Ø±ÙØ§Ù Ù â</button> 773 </div>`; 774 document.getElementById('fl-live-badge').style.display = 'none'; 775 } 776 }, 777 778 reload() { this.showTab(this.curTab); } 779}; 780 781 782// ââ AIR QUALITY (Open-Meteo - راÛگا٠بدÙÙ key) ââ 783const AQI_LEVELS = [ 784 {max:50, label:'Ø®ÙØ¨', emoji:'ð', color:'#00e400', bg:'linear-gradient(135deg,#00c853,#69f0ae)', advice:'Ú©ÛÙÛØª ÙÙØ§ Ø±Ø¶Ø§ÛØªâبخش است. ÙØ¹Ø§ÙÛØª در ÙØ¶Ø§Û باز Ø¨Ø±Ø§Û Ù
784Ù Ù Ù ÙØ§Ø³Ø¨ است.'}, 785 {max:100, label:'Ù ØªÙØ³Ø·', emoji:'ð', color:'#ffff00', bg:'linear-gradient(135deg,#f9a825,#ffee58)', advice:'Ø§ÙØ±Ø§Ø¯ ØØ³Ø§Ø³ (Ø¢Ø³Ù Ø Ø¨ÛÙ Ø§Ø±Û ÙÙØ¨Û) ٠٠ک٠است Ø§ØØ³Ø§Ø³ ÙØ§Ø±Ø§ØØªÛ Ú©ÙÙØ¯.'}, 786 {max:150, label:'ÙØ§Ø³Ø§ÙÙ ', emoji:'ð·', color:'#ff7e00', bg:'linear-gradient(135deg,#e65100,#ff9800)', advice:'ÙØ¹Ø§ÙÛØª Ø·ÙÙØ§ÙÛ Ø¯Ø± ÙØ¶Ø§Û باز را Ù ØØ¯Ùد Ú©ÙÛØ¯. Ú©ÙØ¯Ú©Ø§Ù ٠ساÙÙ ÙØ¯Ø§Ù ØªÙØ¬Ù ÙÛÚÙ Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´ÙØ¯.'}, 787 {max:200, label:'Ø¨Ø³ÛØ§Ø± ÙØ§Ø³Ø§ÙÙ ', emoji:'ð¤¢', color:'#ff0000', bg:'linear-gradient(135deg,#b71c1c,#f44336)', advice:'از ÙØ¹Ø§ÙÛØª در ÙØ¶Ø§Û باز Ø®ÙØ¯Ø¯Ø§Ø±Û Ú©ÙÛØ¯. از ٠اسک Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯.'}, 788 {max:300, label:'Ø®Ø·Ø±ÙØ§Ú©', emoji:'â ï¸', color:'#8f3f97', bg:'linear-gradient(135deg,#4a148c,#9c27b0)', advice:'ÙØ´Ø¯Ø§Ø± Ø¨ÙØ¯Ø§Ø´ØªÛ جدÛ. ÙÙ Ù Ø¨Ø§ÛØ¯ از ت٠اس با ÙÙØ§Û آزاد پرÙÛØ² Ú©ÙÙØ¯.'}, 789 {max:9999, label:'Ø¨ØØ±Ø§ÙÛ', emoji:'ð¨', color:'#7e0023', bg:'linear-gradient(135deg,#3e0000,#7e0023)', advice:'ÙØ¶Ø¹Ûت اضطرارÛ. در خاÙ٠ب٠اÙÛØ¯Ø Ø¯Ø±ÙØ§ Ù Ù¾ÙØ¬Ø±ÙâÙØ§ را Ø¨Ø¨ÙØ¯Ûد.'}, 790]; 791 792async function loadAQI() { 793 const sel = document.getElementById('aqi-city-select'); 794 if (!sel) return; 795 const [lat, lng, city] = sel.value.split(','); 796 797 document.getElementById('aqi-city-label').textContent = city + 'Ø Ø§ÙØºØ§ÙستاÙ'; 798 document.getElementById('aqi-value').textContent = '...'; 799 document.getElementById('aqi-label').textContent = 'در ØØ§Ù Ø¯Ø±ÛØ§Ùت...'; 800 document.getElementById('aqi-emoji').textContent = 'â³'; 801 802 try { 803 // Open-Meteo Air Quality API 804 const url = `https://air-quality-api.open-meteo.com/v1/air-quality?latitude=${lat}&longitude=${lng}¤t=pm2_5,pm10,nitrogen_dioxide,ozone,sulphur_dioxide,carbon_monoxide,european_aqi&timezone=Asia%2FKabul`; 805 const r = await fetch(url); 806 const d = await r.json(); 807 const cur = d.current; 808 809 // Ù ØØ§Ø³Ø¨Ù AQI از PM2.5 (دÙÛÙâØªØ±Û٠شاخص) 810 const pm25 = cur.pm2_5 || 0; 811 const pm10 = cur.pm10 || 0; 812 const eu_aqi = cur.european_aqi || 0; 813 814 // تبدÛÙ PM2.5 ب٠AQI Ø§Ø³ØªØ§ÙØ¯Ø§Ø±Ø¯ US 815 const aqi = calcAQI_PM25(pm25); 816 817 // Ù¾ÛØ¯Ø§ Ú©Ø±Ø¯Ù Ø³Ø·Ø 818 const level = AQI_LEVELS.find(l => aqi <= l.max) || AQI_LEVELS[AQI_LEVELS.length-1]; 819 820 // Ø¢Ù¾Ø¯ÛØª کارت اصÙÛ 821 const card = document.getElementById('aqi-main-card'); 822 card.style.background = level.bg; 823 824 document.getElementById('aqi-value').textContent = Math.round(aqi); 825 document.getElementById('aqi-label').textContent = level.label; 826 document.getElementById('aqi-emoji').textContent = level.emoji; 827 document.getElementById('aqi-advice').textContent = level.advice; 828 829 // Ø¢ÙØ§ÛÙØ¯ÙâÙØ§ 830 const pollutants = [ 831 {name:'PM2.5', val: pm25.toFixed(1), unit:'µg/m³', icon:'ð´', desc:'ذرات Ø±ÛØ²'}, 832 {name:'PM10', val: pm10.toFixed(1), unit:'µg/m³', icon:'ð ', desc:'ذرات درشت'}, 833 {name:'NOâ', val: (cur.nitrogen_dioxide||0).toFixed(1), unit:'µg/m³', icon:'ð¡', desc:'دÛâØ§Ú©Ø³ÛØ¯ ÙÛØªØ±ÙÚÙ'}, 834 {name:'Oâ', val: (cur.ozone||0).toFixed(1), unit:'µg/m³', icon:'ð¢', desc:'ازÙÙ'}, 835 {name:'SOâ', val: (cur.sulphur_dioxide||0).toFixed(1), unit:'µg/m³', icon:'ð£', desc:'دÛâØ§Ú©Ø³ÛØ¯ Ú¯Ùگرد'}, 836 {name:'CO', val: ((cur.carbon_monoxide||0)/1000).toFixed(2), unit:'mg/m³', icon:'â«', desc:'Ù ÙÙÙÚ©Ø³ÛØ¯ کربÙ'}, 837 ]; 838 839 document.getElementById('aqi-pollutants').innerHTML = pollutants.map(p => ` 840 <div style="background:#fff;border-radius:10px;padding:11px 12px;border:1px solid var(--bdr)"> 841 <div style="display:flex;align-items:center;gap:6px;margin-bottom:5px"> 842 <span style="font-size:14px">${p.icon}</span> 843 <div> 844 <div style="font-size:12px;font-weight:900;color:var(--t1)">${p.name}</div> 845 <div style="font-size:10px;color:var(--t3)">${p.desc}</div> 846 </div> 847 </div> 848 <div style="font-size:18px;font-weight:900;color:${level.color}">${p.val}</div> 849 <div style="font-size:10px;color:var(--t3)">${p.unit}</div> 850 </div>`).join(''); 851 852 } catch(e) { 853 document.getElementById('aqi-value').textContent = 'Ø'; 854 document.getElementById('aqi-label').textContent = 'خطا در Ø¯Ø±ÛØ§Ùت'; 855 document.getElementById('aqi-emoji').textContent = 'â ï¸'; 856 console.warn('AQI error:', e); 857 } 858} 859 860function calcAQI_PM25(pm25) { 861 // جدÙ٠تبدÛÙ PM2.5 ب٠AQI Ø§Ø³ØªØ§ÙØ¯Ø§Ø±Ø¯ US EPA 862 const table = [ 863 [0,12,0,50],[12.1,35.4,51,100],[35.5,55.4,101,150], 864 [55.5,150.4,151,200],[150.5,250.4,201,300],[250.5,350.4,301,400],[350.5,500.4,401,500] 865 ]; 866 for (const [cl,ch,al,ah] of table) { 867 if (pm25 >= cl && pm25 <= ch) { 868 return ((ah-al)/(ch-cl))*(pm25-cl)+al; 869 } 870 } 871 return pm25 > 500 ? 500 : 0; 872} 873 874// ââ QURAN âââââââââââââââââââââââââââââââââââââ 875const SURAH_NAMES = { 876 '001':'اÙÙØ§ØªØÙ','002':'Ø§ÙØ¨ÙرÙ','003':'آ٠ع٠راÙ','036':'ÛØ³', 877 '055':'Ø§ÙØ±ØÙ Ù','056':'اÙÙØ§ÙعÙ','067':'اÙÙ ÙÚ©','073':'اÙ٠ز٠Ù', 878 '078':'اÙÙØ¨Ø£','087':'Ø§ÙØ£Ø¹ÙÙ','093':'Ø§ÙØ¶ØÙ','094':'Ø§ÙØ´Ø±Ø', 879 '099':'Ø§ÙØ²ÙزÙÙ','112':'Ø§ÙØ§Ø®Ùاص','113':'اÙÙÙÙ','114':'اÙÙØ§Ø³', 880}; 881
882const Quran = { 883 async loadAyah() { 884 try { 885 const r = await fetch( 886 'https://api.alquran.cloud/v1/ayah/2:255/editions/quran-simple,fa.hedayatifar', 887 {signal: AbortSignal.timeout(8000)} 888 ); 889 const d = await r.json(); 890 if (d.code !== 200) throw new Error(); 891 document.getElementById('quran-arabic').textContent = d.data[0].text; 892 document.getElementById('quran-dari').textContent = d.data[1].text; 893 document.getElementById('quran-ref').textContent = 894 `Ø³ÙØ±Ù ${d.data[0].surah.name} · Ø¢ÛÙ ${d.data[0].numberInSurah}`; 895 } catch(e) { 896 // fallback - Ø¢ÛÙâØ§ÙÚ©Ø±Ø³Û Ù ØªÙ Ø«Ø§Ø¨Øª 897 document.getElementById('quran-arabic').textContent = 898 'اÙÙÙÙÙÙ ÙÙØ§ Ø¥ÙÙÙÙ°Ù٠إÙÙÙÙØ§ ÙÙÙ٠اÙÙØÙÙÙ٠اÙÙÙÙÙÙÙÙÙ Ù'; 899 document.getElementById('quran-dari').textContent = 900 'خداÙÙØ¯ است ک٠جز Ø§Ù Ù Ø¹Ø¨ÙØ¯Û ÙÛØ³ØªØ Ø²ÙØ¯Ù ٠پاÛÙØ¯Ù است.'; 901 document.getElementById('quran-ref').textContent = 'Ø³ÙØ±Ù Ø§ÙØ¨Ùر٠· Ø¢ÛÙ Û²ÛµÛµ (Ø¢ÛØ©âاÙکرسÛ)'; 902 } 903 } 904}; 905 906window.loadQuranAudio = () => { 907 const sel = document.getElementById('quran-surah-sel'); 908 if (!sel) return; 909 const n = sel.value; // 3-digit like "036" 910 const surahNum = parseInt(n, 10); 911 const name = SURAH_NAMES[n] || 'Ø³ÙØ±Ù'; 912 const audio = document.getElementById('quran-audio'); 913 const status = document.getElementById('quran-status'); 914 915 if (status) status.textContent = `â³ Ø³ÙØ±Ù ${name} â Ø¯Ø± ØØ§Ù بارگذارÛ...`; 916 audio.pause(); 917 918 // Ù ÙØ§Ø¨Ø¹ ٠ختÙÙ Ø¨Ù ØªØ±ØªÛØ¨ اÙÙÙÛØª 919 const sources = [ 920 // cdn.islamic.network - ٠عتبرترÛÙ CDN ÙØ±Ø¢Ù 921 `https://cdn.islamic.network/quran/audio-surah/128/ar.abdulbasitmurattal/${surahNum}.mp3`, 922 // everyayah - ٠عرÙÙ Ù Ù¾Ø§ÛØ¯Ø§Ø± 923 `https://everyayah.com/data/Abdul_Basit_Murattal_192kbps/${n}001.mp3`, 924 // backup 925 `https://download.quranicaudio.com/quranic-audio/abdulbasit/complete/${n}.mp3`, 926 ]; 927 928 let idx = 0; 929 const tryNext = () => { 930 if (idx >= sources.length) { 931 if (status) status.innerHTML = 932 `â ï¸ Ù Ø´Ú©Ù Ø¯Ø± Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û Â· <a href="https://quran.com/1" target="_blank" style="color:var(--g);font-weight:800">Ú¯ÙØ´ داد٠در Quran.com â</a>`; 933 return; 934 } 935 audio.src = sources[idx++]; 936 audio.load(); 937 }; 938 939 audio.oncanplaythrough = () => { 940 if (status) status.textContent = `â Ø³Ùر٠${name} â Ø¢Ù اد٠پخش`; 941 }; 942 943 audio.onplaying = () => { 944 if (status) status.textContent = `ð Ø¯Ø± ØØ§Ù پخش: Ø³ÙØ±Ù ${name}`; 945 }; 946 947 audio.onended = () => { 948 if (status) status.textContent = `â پخش Ø³ÙØ±Ù ${name} Ø¨Ù Ù¾Ø§ÛØ§Ù Ø±Ø³ÛØ¯`; 949 }; 950 951 audio.onerror = () => { 952 if (status) status.textContent = `â³ ØªÙØ§Ø´ با Ù ÙØ¨Ø¹ ${idx + 1}...`; 953 tryNext(); 954 }; 955 956 tryNext(); 957}; 958 959 960// ââ JOBS ââââââââââââââââââââââââââââââââââââââ 961const Jobs = { 962 async load() { 963 const wrap = document.getElementById('jobs-wrap'); 964 const total = document.getElementById('jobs-total'); 965 if (!wrap) return; 966 wrap.innerHTML = '<div style="text-align:center;padding:20px;color:var(--g);font-weight:700">Ⳡدر ØØ§Ù بارگذارÛ...</div>'; 967 try { 968 const d = await api('jobs'); 969 if (!d.jobs || !d.jobs.length) throw new Error(); 970 if (total) total.textContent = d.jobs.length + ' Ù ÙØ¨Ø¹ Ú©Ø§Ø±ÛØ§Ø¨Û'; 971 wrap.innerHTML = d.jobs.map(j => ` 972 <a href="${j.u}" target="_blank" style="display:flex;align-items:center;gap:11px;background:#fff;border-radius:11px;padding:13px 14px;border:1.5px solid var(--bdr);margin-bottom:8px;text-decoration:none"> 973 <div style="width:44px;height:44px;border-radius:12px;background:linear-gradient(135deg,#1e3a5f,#2563eb);display:flex;align-items:center;justify-content:center;font-size:22px;flex-shrink:0">ð¼</div> 974 <div style="flex:1;min-width:0"> 975 <div style="font-size:14px;font-weight:800;color:var(--gd);margin-bottom:3px">${j.t}</div> 976 <div style="font-size:11px;color:var(--t2)">${j.o} · ${j.l}</div> 977 </div> 978 <div style="display:flex;flex-direction:column;align-items:flex-end;
978gap:5px;flex-shrink:0"> 979 ${j.badge ? `<span style="font-size:10px;font-weight:800;background:var(--gl);color:var(--gd);padding:2px 8px;border-radius:5px">${j.badge}</span>` : ''} 980 <span style="font-size:11px;color:var(--g);font-weight:700">Ù Ø´Ø§ÙØ¯Ù â</span> 981 </div> 982 </a>`).join(''); 983 } catch(e) { 984 wrap.innerHTML = ` 985 <div style="text-align:center;padding:16px;background:#f9fafb;border-radius:10px;border:1px solid var(--bdr)"> 986 <div style="font-size:13px;color:var(--t2);margin-bottom:10px">Ø¨Ø±Ø§Û Ù Ø´Ø§ÙØ¯Ù ÙØ¸Ø§ÛÙ Ø¨Ù Ø³Ø§ÛØªâÙØ§Û Ø²ÛØ± ٠راجع٠کÙÛØ¯:</div> 987 <a href="https://jobs.af" target="_blank" style="display:block;background:var(--gl);color:var(--gd);padding:10px;border-radius:8px;font-size:13px;font-weight:800;text-decoration:none;margin-bottom:7px">ð¥ jobs.af â</a> 988 <a href="https://acbar.org/jobs" target="_blank" style="display:block;background:#eff6ff;color:#1d4ed8;padding:10px;border-radius:8px;font-size:13px;font-weight:800;text-decoration:none">ð acbar.org â</a> 989 </div>`; 990 } 991 } 992}; 993 994// ââ DICTIONARY (Ø¯Ø±Û Ø§ÙØºØ§ÙستاÙ) ââââââââââââââââââ 995const DICT = { 996 lang: 'dari', 997 998 // Ø¯Ø±Û Ø§ÙØºØ§ÙØ³ØªØ§Ù â Ø§ÙÚ¯ÙÛØ³Û 999 // شا٠Ù: Ø²ÙØ¯Ú¯Û Ø±ÙØ²Ù Ø±ÙØ Ø¨Ø§Ø²Ø§Ø±Ø ØµØØªØ Ø¢Ù ÙØ²Ø´Ø اØÙاÙâÙ¾Ø±Ø³Û 1000 dari_en: { 1001 // اØÙاÙâÙ¾Ø±Ø³Û Ù Ø§Ø¯Ø¨ 1002 'Ø³ÙØ§Ù ': {m:['Hello','Hi'], n:'تØÛ٠٠ع٠Ù٠درÛ', ex:'Ø³ÙØ§Ù Ø ÚØ·Ùر Ø§Ø³ØªÛØ¯Ø'}, 1003 'Ø§ÙØ³Ùا٠عÙÛÚ©Ù ':{m:['Peace be upon you'], n:'تØÛÙ Ø§Ø³ÙØ§Ù Û', ex:'Ø§ÙØ³Ùا٠عÙÛÚ©Ù â ÙØ¹ÙÛÚ©Ù Ø§ÙØ³Ùا٠'}, 1004 'ÚØ·Ùر Ø§Ø³ØªÛØ¯': {m:['How are you?'], n:'اØÙاÙâÙ¾Ø±Ø³Û Ø±Ø³Ù Û', ex:'Ø³ÙØ§Ù Ø ÚØ·Ùر Ø§Ø³ØªÛØ¯Ø â Ø®Ùب Ø§Ø³ØªÙ Ø Ù Ù ÙÙÙ'}, 1005 'Ø®ÙØ¨ است٠': {m:['I am fine','I am well'], n:'Ø¬ÙØ§Ø¨ اØÙاÙâپرسÛ', ex:'Ø®ÙØ¨ Ø§Ø³ØªÙ Ø Ø´Ú©Ø±'}, 1006 'Ø®Ø¯Ø§ØØ§Ùظ': {m:['Goodbye','Farewell'], n:'Ø®Ø¯Ø§ØØ§ÙظÛ', ex:'Ø®Ø¯Ø§ØØ§ÙØ¸Ø Ù Ø±Ø§ÙØ¨ Ø®ÙØ¯ Ø¨Ø§Ø´ÛØ¯'}, 1007 'Ø¨Ø®ÛØ±': {m:['Well','Fine','Goodbye'], n:'Ø®Ø¯Ø§ØØ§ÙØ¸Û Ø¯ÙØ³ØªØ§ÙÙ', ex:'Ø¨Ø®ÛØ±Ø تا Ø¯ÛØ¯Ø§Ø±'}, 1008 'Ù Ù ÙÙÙ': {m:['Thank you','Thanks'], n:'Ø³Ù¾Ø§Ø³Ú¯Ø²Ø§Ø±Û Ø¹Ø§Ù ÛØ§ÙÙ', ex:'Ù Ù ÙÙ٠از ٠رØÙ ت ش٠ا'}, 1009 'تشکر': {m:['Thank you','Thanks'], n:'Ø³Ù¾Ø§Ø³Ú¯Ø²Ø§Ø±Û Ø±Ø³Ù ÛâØªØ±', ex:'تشکر از Ú©Ù Ú© تاÙ'}, 1010 'Ø®ÙØ´ Ø¢Ù Ø¯ÛØ¯': {m:['Welcome'], n:'Ø®ÙØ´Ø§Ù دگÙÛÛ', ex:'Ø¨Ù Ø§ÙØºØ§ÙØ³ØªØ§Ù Ø®ÙØ´ Ø¢Ù Ø¯ÛØ¯'}, 1011 'Ø¨ÙØ±Ù اÛÛØ¯': {m:['Please (come in/sit/eat)'], n:'Ø¯Ø¹ÙØª ٠ؤدباÙÙ', ex:'Ø¨ÙØ±Ù اÛÛØ¯Ø Ø¨ÙØ´ÛÙÛØ¯'}, 1012 'ÙÙØ´ جاÙ': {m:['Enjoy your meal','Bon appétit'], n:'Ú¯ÙØªÙ Ù ÛâØ´ÙØ¯ ÙÙØª Ø®ÙØ±Ø¯Ù', ex:'ÙÙØ´ جا٠باشد'}, 1013 '٠رØÙ ت': {m:['Kindness','Generosity','Please'], n:'ادب Ù Ø§ØØªØ±Ø§Ù ', ex:'٠رØÙ ت Ú©ÙÛØ¯'}, 1014 'Ø§ÙØ´Ø§Ø¡Ø§ÙÙÙ': {m:['God willing','If God wills'], n:'Ø§Ø¸ÙØ§Ø± Ø§Ù ÛØ¯', ex:'ÙØ±Ø¯Ø§ Ù ÛâØ¢ÛÙ Ø Ø§ÙØ´Ø§Ø¡Ø§ÙÙÙ'}, 1015 '٠اشاءاÙÙÙ': {m:['What God has willed (expression of admiration)'], n:'تعرÛÙ Ù ØªØØ³ÛÙ', ex:'٠اشاءاÙÙÙØ Ø¨Ø³ÛØ§Ø± Ø®ÙØ¨ Ú©Ø±Ø¯ÛØ¯'}, 1016 1017 // خاÙÙØ§Ø¯Ù 1018 'پدر': {m:['Father'], ex:'پدر٠٠عÙ٠است'}, 1019 '٠ادر': {m:['Mother'], ex:'٠ادر٠پختâÙپز Ø®ÙØ¨Û دارد'}, 1020 'برادر': {m:['Brother'], ex:'برادر٠در کاب٠کار Ù ÛâÚ©ÙØ¯'}, 1021 'Ø®ÙØ§Ùر': {m:['Sister'], ex:'Ø®ÙØ§ÙØ±Ù Ù ØØµÙ است'}, 1022 'پسر': {m:['Son','Boy'], ex:'پسر٠د٠ساÙ٠است'}, 1023 'دختر': {m:['Daughter','Girl'], ex:'دختر٠٠کتب Ù ÛâØ±ÙØ¯'}, 1024 'کاکا': {m:["Uncle (father's brother)"], n:'برادر پدر', ex:'کاکاÛ٠در ÙØ±Ø§Øª Ø²ÙØ¯Ú¯Û Ù ÛâÚ©ÙØ¯'}, 1025 '٠ا٠ا': {m:["Uncle (mother's brother)"], n:'برادر ٠ادر', ex:'٠ا٠اÛ٠دÙÚ©Ø§ÙØ¯Ø§Ø± است'}, 1026 'Ù ÙØ§': {m:['Mullah (religious leader)','Mister (informal title)'], n:'عÙÙØ§Ù دÛÙÛ ÛØ§ Ø§ØØªØ±Ø§Ù Û', ex:'Ù ÙØ§ ØµØ§ØØ¨ درس Ù ÛâØ¯ÙØ¯'}, 1027 'خاÙÙ ': {m:['Lady','Wife','Mrs.'], n:'عÙÙØ§Ù Ø§ØØªØ±Ø§Ù Û Ø¨Ø±Ø§Û Ø²Ù', ex:'خاÙÙ ØµØ§ØØ¨Ø ÚØ·Ùر Ø§Ø³ØªÛØ¯Ø'}, 1028 'ØµØ§ØØ¨': {m:['Sir','Mr.','Owner'], n:'عÙÙØ§Ù Ø§ØØªØ±Ø§Ù Û', ex:'استاد ØµØ§ØØ¨'}, 1029 1030 // Ø²ÙØ¯Ú¯Û Ø±ÙØ²Ù ر٠1031 'ÙØ§Ù': {m:['Bread','Food (generic)'], n:'در Ø¯Ø±Û Ø§ÙØºØ§Ùستا٠"ÙØ§Ù" Ø¨Ù Ù Ø¹ÙØ§Û غذا ÙÙ ÙØ³Øª', ex:'ÙØ§Ù Ø®ÙØ±Ø¯ÛØ¯Ø (Ø¢ÛØ§ غذا Ø®ÙØ±Ø¯ÛدØ)'}, 1032 'ÚÙÙ': {m:['Plain boiled rice'], n:'Ø¨Ø±ÙØ¬ سادÙ', ex:'ÚÙ٠کباب ØºØ°Ø§Û Ù ØØ¨Ùب است'}, 1033 'ÙØ§Ø¨ÙÛ': {m:['Qabuli (Afghan national dish - rice with meat)'], n:'ØºØ°Ø§Û Ù ÙÛ Ø§ÙØºØ§ÙستاÙ', ex:'ÙØ§Ø¨ÙÛ Ù¾Ù٠با Ú©Ø´Ù Ø´ Ù ÙÙÛØ¬'}, 1034 'Ù ÙØªÙ': {m:['Mantu (Afghan dumplings)'], n:'دا٠پÙÛÙÚ¯ Ø§ÙØºØ§ÙÛ Ø¨Ø§ Ú¯ÙØ´Øª', ex:'Ù ÙØªÙÛ Ú©Ø§Ø¨ÙÛ Ø¨Ø³ÛØ§Ø± Ø®ÙØ´Ù ز٠است'}, 1035 'بÙÙØ§ÙÛ': {m:['Bolani (stuffed flatbread)'], n:'ÙØ§Ù پر شد٠با سبزÛ', ex:'بÙÙØ§ÙÛ Ú©ÚØ§ÙÙ Ù ÛâØ®ÙØ±ÛدØ'}, 1036 'کاÚÛ': {m:['Porridge (celebratory dish)'], n:'ØÙÛÙ Ø¨Ø±Ø§Û ØªÙØ±Ûبات', ex:'کاÚÛ ÙØ°Ø±Û'}, 1037 'ÚØ§Û': {m:['Tea'], n:'ÙÙØ´ÛدÙÛ Ø§ØµÙÛ Ø§ÙØºØ§ÙستاÙ', ex:'ÛÚ© Ù¾ÛØ§ÙÙ ÚØ§Û سبز'},
1038 'ÙÙØ±Û': {m:['Teapot'], ex:'ÙÙØ±Û ÚØ§Û را Ø¨ÛØ§Ø±'}, 1039 'Ù¾ÛØ§ÙÙ': {m:['Cup','Bowl'], ex:'ÛÚ© Ù¾ÛØ§ÙÙ ÚØ§Û'}, 1040 'دÛÚ¯': {m:['Large cooking pot'], ex:'دÛÚ¯ Ù¾ÙÙ'}, 1041 'آب': {m:['Water'], ex:'ÛÚ© Ú¯ÛÙØ§Ø³ آب'}, 1042 'دÙکاÙ': {m:['Shop','Store'], n:'٠غازÙ', ex:'ب٠دÙÚ©Ø§Ù Ø±ÙØªÙ '}, 1043 'بازار': {m:['Market','Bazaar'], ex:'بازار Ù ÙØ¯ÙÛ Ø¯Ø± کابÙ'}, 1044 'Ø®Ø±ÛØ¯Ø§Ø±Û':{m:['Shopping','Purchase'], ex:'ب٠بازار Ø®Ø±ÛØ¯Ø§Ø±Û Ø±ÙØªÙ '}, 1045 'ÙÛ٠ت': {m:['Price','Cost'], ex:'ÙÛ٠ت اÛÙ ÚÙØ¯ استØ'}, 1046 'ارزاÙ': {m:['Cheap','Inexpensive'], ex:'اÛ٠بازار ارزا٠است'}, 1047 'گراÙ': {m:['Expensive'], ex:'Ø¨Ø³ÛØ§Ø± گرا٠است'}, 1048 'Ù¾ÙÙ': {m:['Money'], ex:'Ù¾ÙÙ ÙØ¯Ø§Ø±Ù '}, 1049 'Ø§ÙØºØ§ÙÛ': {m:['Afghani (currency)'], n:'ÙØ§ØØ¯ Ù¾ÙÙ Ø§ÙØºØ§ÙستاÙ', ex:'ÛÚ© صد Ø§ÙØºØ§ÙÛ'}, 1050 'خرد': {m:['Change (small money)','Small'], ex:'خرد ÙØ¯Ø§Ø±ÛدØ'}, 1051 'Ù ÙØªØ±Ø³Ø§ÛÚ©Ù':{m:['Motorcycle'], n:'ÙØ§ÚÙ Ø±Ø§ÛØ¬ در Ø§ÙØºØ§ÙستاÙ', ex:'با Ù ÙØªØ±Ø³Ø§Ûک٠آ٠د٠'}, 1052 'Ù ÙØªØ±': {m:['Car','Vehicle'], n:'Ø¨Ù Ø¬Ø§Û "٠اشÛÙ"', ex:'Ù ÙØªØ± ÙÙ Ø®Ø±ÛØ¯Ù '}, 1053 'سرک': {m:['Road','Street'], n:'Ø¨Ù Ø¬Ø§Û "جادÙ"', ex:'سرک Ù Ø³Ø¯ÙØ¯ است'}, 1054 'Ú©ÙÚÙ': {m:['Alley','Lane'], ex:'در ÙÙ ÛÙ Ú©ÙÚÙ Ø²ÙØ¯Ú¯Û Ù ÛâÚ©ÙÛÙ '}, 1055 'Ù ÙØ²Ù': {m:['House','Floor (of building)'], ex:'Ù ÙØ²Ù اÙÙ'}, 1056 'ØÙÛÙÛ': {m:['Courtyard house','Compound'], n:'خاÙ٠با ØÛاط', ex:'ØÙÛÙÛ Ø¨Ø²Ø±Ú¯'}, 1057 1058 // Ø¢Ù ÙØ²Ø´ 1059 '٠کتب': {m:['School'], n:'Ø¨Ù Ø¬Ø§Û "٠درسÙ"', ex:'ب٠٠کتب Ø±ÙØªÙ '}, 1060 'ÙÛØ³Ù': {m:['High school'], n:'Ù ÙØ·Ø¹ Ø¯Ø¨ÛØ±Ø³ØªØ§Ù', ex:'ÙÛØ³Ù عاÙÛ Ú©Ø§Ø¨Ù'}, 1061 'Ù¾ÙÙÙØªÙÙ': {m:['University'], n:'Ø¨Ù Ø¬Ø§Û "Ø¯Ø§ÙØ´Ú¯Ø§Ù"', ex:'Ù¾ÙÙÙØªÙ٠کابÙ'}, 1062 'Ù¾ÙÙÙØÛ': {m:['Faculty','College (within university)'], n:'Ø¯Ø§ÙØ´Ú©Ø¯Ù', ex:'Ù¾ÙÙÙØÛ Ø·Ø¨'}, 1063 'استاد': {m:['Teacher','Professor','Master'], n:'عÙÙØ§Ù Ø§ØØªØ±Ø§Ù Û Ù Ø¹ÙÙ ', ex:'استاد ØµØ§ØØ¨ درس Ù ÛâØ¯ÙØ¯'}, 1064 'Ù ØØµÙ': {m:['University student'], n:'Ø¯Ø§ÙØ´Ø¬Ù', ex:'Ù ØØµÙ سا٠سÙÙ ÙØ³ØªÙ '}, 1065 'شاگرد': {m:['Student (school)','Pupil'], n:'Ø¯Ø§ÙØ´âØ¢Ù ÙØ²', ex:'شاگرد Ø®ÙØ¨'}, 1066 'کاÙÚ©ÙØ±': {m:['University entrance exam'], n:'Ú©ÙÚ©ÙØ± Ø§ÙØºØ§ÙستاÙ', ex:'Ø§Ù ØªØØ§Ù کاÙÚ©ÙØ± داد٠'}, 1067 'Ù٠رÙ': {m:['Grade','Score','Mark'], n:'Ø¨Ù Ø¬Ø§Û "Ù٠رÙ"', ex:'ÙÙ Ø±Ù Ø®ÙØ¨ Ú¯Ø±ÙØªÙ '}, 1068 'Ø³ÙØ¯': {m:['Certificate','Document'], ex:'Ø³ÙØ¯ ÙØ±Ø§ØºØª'}, 1069 1070 // ØµØØª 1071 'داکتر': {m:['Doctor','Physician'], n:'Ø¨Ù Ø¬Ø§Û "دکتر"', ex:'داکتر ØµØ§ØØ¨'}, 1072 'Ø´ÙØ§Ø®Ø§ÙÙ': {m:['Hospital'], n:'Ø¨Ù Ø¬Ø§Û "بÛ٠ارستاÙ"', ex:'Ø´ÙØ§Ø®Ø§Ù٠دÙÙØªÛ'}, 1073 'در٠اÙگاÙ': {m:['Clinic'], ex:'در٠اÙگا٠ÙÙØ³ÙاÙÛ'}, 1074 'Ø¯ÙØ§': {m:['Medicine','Drug'], n:'Ø¨Ù Ø¬Ø§Û "دارÙ"', ex:'Ø¯ÙØ§ Ø®ÙØ±Ø¯Ù '}, 1075 'Ø¯Ø§Ø±ÙØ®Ø§ÙÙ': {m:['Pharmacy'], ex:'از Ø¯Ø§Ø±ÙØ®Ø§ÙÙ Ø¯ÙØ§ Ø¨Ú¯ÛØ±Ûد'}, 1076 'Ø¯Ø±Ø¯Ù ÙØ¯': {m:['Patient','Sick person'], ex:'Ø¯Ø±Ø¯Ù ÙØ¯ Ø¨Ø³ØªØ±Û Ø§Ø³Øª'}, 1077 'Ù Ø±ÛØ¶': {m:['Sick','Ill','Patient'], ex:'Ù Ø±ÛØ¶ ÙØ³ØªÙ '}, 1078 'ØµØØª': {m:['Health'], ex:'ØµØØª Ù ÙØ¯ Ø¨Ø§Ø´ÛØ¯'}, 1079 'ÙØ±Ø³': {m:['Nurse'], ex:'ÙØ±Ø³ ØµØ§ØØ¨'}, 1080 1081 // کار ٠٠شاغ٠1082 'ÙØ¸ÛÙÙ': {m:['Job','Duty','Position'], n:'Ø¨Ù Ø¬Ø§Û "شغÙ"', ex:'ÙØ¸ÛÙÙâØ§Ù Ø¯Ø± دÙÙØª است'}, 1083 'Ù Ø§Ù ÙØ±': {m:['Government employee','Official'], ex:'Ù Ø§Ù ÙØ± دÙÙØªÛ'}, 1084 'دÙÙØ§Ù': {m:['Farmer'], ex:'دÙÙØ§Ùا٠ز٠ÛÙ Ù ÛâÚ©Ø§Ø±ÙØ¯'}, 1085 'تاجر': {m:['Merchant','Trader'], ex:'تاجر بازار'}, 1086 'Ú©Ø§Ø±Ù ÙØ¯': {m:['Employee','Staff'], ex:'Ú©Ø§Ø±Ù ÙØ¯ شرکت'}, 1087 '٠زد': {m:['Wage','Salary'], n:'Ø¨Ù Ø¬Ø§Û "ØÙÙÙ"', ex:'٠زد Ù Ø§ÙØ§ÙÙ'}, 1088 'زØÙ ت': {m:['Hardship','Trouble','Effort'], ex:'زØÙ ت Ù ÛâÚ©Ø´ÛØ¯'}, 1089 1090 // جغراÙÛØ§ 1091 'ÙÙØ§Ûت': {m:['Province'], n:'Ø¨Ù Ø¬Ø§Û "استاÙ"', ex:'ÙÙØ§Ûت ÙØ±Ø§Øª'}, 1092 'ÙÙØ³ÙاÙÛ': {m:['District'], n:'Ø¨Ù Ø¬Ø§Û "Ø´ÙØ±Ø³ØªØ§Ù"', ex:'ÙÙØ³ÙاÙÛ Ù¾ØºÙ Ø§Ù'}, 1093 'ÙØ±ÛÙ': {m:['Village'], n:'Ø¨Ù Ø¬Ø§Û "Ø±ÙØ³ØªØ§"', ex:'ÙØ±Û٠٠ا'}, 1094 'Ø´ÙØ±': {m:['City'], ex:'Ø´ÙØ± کابÙ'}, 1095 1096 // Ø§Ù Ø«Ø§Ù Ù Ø§ØµØ·ÙØ§ØØ§Øª درÛ
1097 'ÚØ´Ù ': {m:['Yes (I will do it)','Eye'], n:'پاسخ Ù ÙØ§ÙÙØª', ex:'ÚØ´Ù Ø ÙÙ ÛÙ ØØ§Ùا Ù ÛâØ±ÙÙ '}, 1098 'باشÙ': {m:['OK','Alright'], n:'Ù ÙØ§ÙÙØª ØºÛØ±Ø±Ø³Ù Û', ex:'Ø¨Ø§Ø´ÙØ ÙØ±Ø¯Ø§ Ù ÛâØ¢ÛÙ '}, 1099 'Ø®Ù': {m:['Well (filler word)','Sleep'], n:'Ú©Ù٠٠پرکاربرد در Ú¯ÙØªØ§Ø±', ex:'Ø®ÙØ Ú٠کار Ú©ÙÛÙ Ø'}, 1100 'ØØ§Ùا': {m:['Now','Right now'], ex:'ØØ§Ùا Ù ÛâØ±ÙÙ '}, 1101 'ÙØ²Ø¯ÛÚ©': {m:['Near','Close'], ex:'ÙØ²Ø¯ÛÚ© است'}, 1102 'Ø¯ÙØ±': {m:['Far'], ex:'Ø¨Ø³ÛØ§Ø± Ø¯ÙØ± است'}, 1103 'Ø²ÛØ§Ø¯': {m:['Much','Many','Too much'], ex:'Ø²ÛØ§Ø¯ کار دار٠'}, 1104 'Ú©Ù ': {m:['Little','Few','Less'], ex:'Ú©Ù Û Ø¢Ø¨'}, 1105 'Ø¨Ø³ÛØ§Ø±': {m:['Very','Much','A lot'], n:'Ø¨Ù Ø¬Ø§Û "Ø®ÛÙÛ"', ex:'Ø¨Ø³ÛØ§Ø± Ø®ÙØ¨'}, 1106 'ÙØ·ÙاÙ': {m:['Please'], ex:'ÙØ·Ùا٠صبر Ú©ÙÛØ¯'}, 1107 'Ù Ø´Ú©Ù': {m:['Problem','Difficult'], ex:'Ù Ø´Ú©Ù ÙØ¯Ø§Ø±Ø¯'}, 1108 'خطر': {m:['Danger','Risk'], ex:'Ø®Ø·Ø±ÙØ§Ú© است'}, 1109 'Ø¢ÙØ³ØªÙ': {m:['Slowly','Quietly'], ex:'Ø¢ÙØ³ØªÙ ØµØØ¨Øª Ú©ÙÛØ¯'}, 1110 'Ø²ÙØ¯': {m:['Quickly','Soon'], ex:'Ø²ÙØ¯ Ø¨ÛØ§ÛÛØ¯'}, 1111 }, 1112 1113 // اÙÚ¯ÙÛØ³Û â Ø¯Ø±Û Ø§ÙØºØ§Ùستا٠1114 en_dari: { 1115 'hello': {m:['Ø³ÙØ§Ù ','Ø¯Ø±ÙØ¯'], ex:'Hello! â Ø³Ùا٠!'}, 1116 'hi': {m:['Ø³ÙØ§Ù ','ÙÛ'], ex:'Hi there â Ø³Ùا٠'}, 1117 'how are you': {m:['ÚØ·Ùر Ø§Ø³ØªÛØ¯Ø','ØØ§Ù ØªØ§Ù ÚØ·Ùر استØ']}, 1118 'i am fine': {m:['Ø®ÙØ¨ است٠','ØµØØªÙ ÙØ¯ است٠']}, 1119 'thank you': {m:['Ù Ù ÙÙÙ','تشکر'], ex:'Thank you very much â Ø¨Ø³Ûار Ù Ù ÙÙÙ'}, 1120 'thanks': {m:['Ù Ù ÙÙÙ','٠رسÛ']}, 1121 'please': {m:['ÙØ·ÙاÙ','٠رØÙ ت Ú©ÙÛØ¯']}, 1122 'welcome': {m:['Ø®ÙØ´ Ø¢Ù Ø¯ÛØ¯','Ø®ÙØ´ آ٠دÛ']}, 1123 'goodbye': {m:['Ø®Ø¯Ø§ØØ§Ùظ','Ø¨Ø®ÛØ±'], ex:'Goodbye â Ø®Ø¯Ø§ØØ§Ùظ'}, 1124 'yes': {m:['بÙÙ','آرÛ','ÚØ´Ù '], ex:'Yes â Ø¨ÙÙ / ÚØ´Ù '}, 1125 'no': {m:['ÙÙ','Ø®ÛØ±']}, 1126 'ok': {m:['باشÙ','Ø®ÙØ¨ است','ÙØ¨ÙÙ']}, 1127 'sorry': {m:['٠عذرت Ù ÛâØ®ÙØ§ÙÙ ','Ø¨Ø¨Ø®Ø´ÛØ¯']}, 1128 'excuse me': {m:['Ø¨Ø¨Ø®Ø´ÛØ¯','اجاز٠بدÙÛØ¯']}, 1129 'water': {m:['آب']}, 1130 'food': {m:['ÙØ§Ù','غذا'], n:'در Ø¯Ø±Û Ø§ÙØºØ§Ùستا٠"ÙØ§Ù" Ù٠٠عÙÛ ØºØ°Ø§ Ù ÛâØ¯ÙØ¯'}, 1131 'bread': {m:['ÙØ§Ù'], n:'ÙØ§Ù تÙÙØ±ÛØ ÙØ§Ù ÙÙØ§Ø´'}, 1132 'tea': {m:['ÚØ§Û'], ex:'Green tea â ÚØ§Û سبز'}, 1133 'rice': {m:['Ø¨Ø±ÙØ¬','Ù¾ÙÙ'], ex:'Qabuli rice â ÙØ§Ø¨ÙÛ Ù¾ÙÙ'}, 1134 'house': {m:['خاÙÙ','Ù ÙØ²Ù','ØÙÛÙÛ']}, 1135 'school': {m:['٠کتب'], n:'در Ø§ÙØºØ§Ùستا٠"٠کتب" Ú¯ÙØªÙ Ù ÛâØ´ÙØ¯ Ù٠٠درسÙ'}, 1136 'university': {m:['Ù¾ÙÙÙØªÙÙ'], n:'Ø¨Ù Ø¬Ø§Û Ø¯Ø§ÙØ´Ú¯Ø§Ù'}, 1137 'teacher': {m:['استاد','٠عÙÙ '], n:'"استاد ØµØ§ØØ¨" عÙÙØ§Ù Ø§ØØªØ±Ø§Ù Û'}, 1138 'student': {m:['Ù ØØµÙ (Ù¾ÙÙÙØªÙÙ)','شاگرد (٠کتب)']}, 1139 'doctor': {m:['داکتر'], n:'در Ø§ÙØºØ§Ùستا٠"داکتر" Ú¯ÙØªÙ Ù ÛâØ´ÙØ¯'}, 1140 'hospital': {m:['Ø´ÙØ§Ø®Ø§ÙÙ'], n:'Ø¨Ù Ø¬Ø§Û Ø¨Û٠ارستاÙ'}, 1141 'medicine': {m:['Ø¯ÙØ§'], n:'Ø¨Ù Ø¬Ø§Û Ø¯Ø§Ø±Ù'}, 1142 'market': {m:['بازار'], ex:'Grand Bazaar â Ø¨Ø§Ø²Ø§Ø± بزرگ'}, 1143 'shop': {m:['دÙکاÙ'], n:'٠غازÙ'}, 1144 'money': {m:['Ù¾ÙÙ']}, 1145 'price': {m:['ÙÛ٠ت','ÙØ±Ø®']}, 1146 'cheap': {m:['ارزاÙ']}, 1147 'expensive': {m:['گراÙ']}, 1148 'car': {m:['Ù ÙØªØ±'], n:'در Ø§ÙØºØ§Ùستا٠"Ù ÙØªØ±" Ú¯ÙØªÙ Ù ÛâØ´ÙØ¯'}, 1149 'road': {m:['سرک'], n:'Ø¨Ù Ø¬Ø§Û Ø¬Ø§Ø¯Ù'}, 1150 'village': {m:['ÙØ±ÛÙ'], n:'Ø¨Ù Ø¬Ø§Û Ø±ÙØ³ØªØ§'}, 1151 'province': {m:['ÙÙØ§Ûت'], n:'استا٠را در Ø§ÙØºØ§Ùستا٠ÙÙØ§Ûت Ù ÛâÚ¯ÙÛÙØ¯'}, 1152 'district': {m:['ÙÙØ³ÙاÙÛ']}, 1153 'job': {m:['ÙØ¸ÛÙÙ','کار'], n:'ÙØ¸ÛÙÙ = پست رس٠Û'}, 1154 'employee': {m:['Ú©Ø§Ø±Ù ÙØ¯','Ù Ø§Ù ÙØ±']}, 1155 'farmer': {m:['دÙÙØ§Ù']}, 1156 'very': {m:['Ø¨Ø³ÛØ§Ø±'], n:'در Ø§ÙØºØ§Ùستا٠"Ø¨Ø³ÛØ§Ø±" Ø±Ø§ÛØ¬âتر از "Ø®ÛÙÛ" است'}, 1157 'much': {m:['Ø¨Ø³ÛØ§Ø±','Ø²ÛØ§Ø¯']}, 1158 'little': {m:['Ú©Ù ','Ø§ÙØ¯Ú©']}, 1159 'now': {m:['ØØ§Ùا','اکÙÙÙ']}, 1160 'quickly': {m:['Ø²ÙØ¯','ØªÛØ²']}, 1161 'slowly': {m:['Ø¢ÙØ³ØªÙ']}, 1162 'near': {m:['ÙØ²Ø¯ÛÚ©']}, 1163 'far': {m:['Ø¯ÙØ±']}, 1164 'big': {m:['بزرگ','Ú©ÙØ§Ù'], n:'"Ú©ÙØ§Ù" ÙÙ Ø±Ø§ÛØ¬ است'}, 1165 'small': {m:['Ú©ÙÚÚ©','Ø®ÙØ±Ø¯'], n:'"Ø®ÙØ±Ø¯" ÙÙ Ø§Ø³ØªÙØ§Ø¯Ù Ù ÛâØ´ÙØ¯'}, 1166 'good': {m:['Ø®ÙØ¨']}, 1167 'bad': {m:['بد']}, 1168 'hot': {m:['گر٠']}, 1169 'cold': {m:['سرد']}, 1170 'red': {m:['سرخ'], n:'در Ø§ÙØºØ§Ùستا٠"سرخ" Ø±Ø§ÛØ¬âتر است'}, 1171 'green': {m:['سبز']}, 1172 'blue': {m:['آبÛ']}, 1173 'white': {m:['سÙÛØ¯']}, 1174 'black': {m:['Ø³ÛØ§Ù']}, 1175 'one': {m:['ÛÚ©']}, 1176 'two': {m:['دÙ']}, 1177 'three': {m:['سÙ']}, 1178 'four': {m:['ÚÙØ§Ø±']}, 1179 'five': {m:['Ù¾ÙØ¬']}, 1180 'six': {m:['شش']}, 1181 'seven': {m:['ÙÙØª']}, 1182 'eight': {m:['ÙØ´Øª']}, 1183 'nine': {m:['ÙÙ']}, 1184 'ten': {m:['دÙ']}, 1185 'hundred': {m:['صد']}, 1186 'thousand': {m:['ÙØ²Ø§Ø±']}, 1187 'monday': {m:['Ø¯ÙØ´ÙبÙ']}, 1188 'tuesday': {m:['سÙâØ´ÙØ¨Ù']}, 1189 'wednesday': {m:['ÚÙØ§Ø±Ø´ÙبÙ']}, 1190 'thursday': {m:['Ù¾ÙØ¬âØ´ÙØ¨Ù']},
1191 'friday': {m:['ج٠عÙ'], ex:'Holy Friday â Ø¬Ù ع٠٠بارک'}, 1192 'saturday': {m:['Ø´ÙØ¨Ù']}, 1193 'sunday': {m:['ÛÚ©Ø´ÙØ¨Ù']}, 1194 'spring': {m:['Ø¨ÙØ§Ø±']}, 1195 'summer': {m:['تابستاÙ']}, 1196 'autumn': {m:['خزاÙ'], n:'در Ø§ÙØºØ§Ùستا٠"خزاÙ" Ú¯ÙØªÙ Ù ÛâØ´ÙØ¯ Ù٠پاÛÛØ²'}, 1197 'winter': {m:['ز٠ستاÙ']}, 1198 'afghanistan': {m:['Ø§ÙØºØ§ÙستاÙ']}, 1199 'kabul': {m:['کابÙ']}, 1200 'herat': {m:['ÙØ±Ø§Øª']}, 1201 'kandahar': {m:['ÙÙØ¯Ùار']}, 1202 }, 1203 1204 // Ù¾Ø´ØªÙ â Ø¯Ø±Û 1205 pashto_dari: { 1206 'Ø³ÙØ§Ù ': {m:['Ø³ÙØ§Ù '], n:'٠شترک'}, 1207 'Ù ÙÙÙ': {m:['Ù Ù ÙÙÙ','تشکر'], ex:'Ù ÙÙÙ â Ù Ù ÙÙÙ'}, 1208 'ÙÙ': {m:['بÙÙ','آرÛ']}, 1209 'ÙÙ': {m:['ÙÙ','Ø®ÛØ±']}, 1210 'Ø§ÙØ¨Ù': {m:['آب']}, 1211 'ÚÙÚÛ': {m:['ÙØ§Ù','غذا']}, 1212 'Ú©ÙØ±': {m:['خاÙÙ','Ù ÙØ²Ù']}, 1213 'ÚÙÙÙÚÛ': {m:['٠کتب']}, 1214 'Ù¾ÙÙÙØªÙÙ': {m:['Ù¾ÙÙÙØªÙÙ'], n:'٠شترک'}, 1215 'Ø±ÙØºØªÙÙ': {m:['Ø´ÙØ§Ø®Ø§ÙÙ']}, 1216 'بازار': {m:['بازار'], n:'٠شترک'}, 1217 'Ù¾ÛØ³Û': {m:['Ù¾ÙÙ']}, 1218 'کار': {m:['کار','ÙØ¸ÛÙÙ']}, 1219 'کتاب': {m:['کتاب'], n:'٠شترک'}, 1220 'Ù ÙګرÛ': {m:['Ø¯ÙØ³Øª']}, 1221 'Ú©ÙØ±ÙÛ': {m:['خاÙÙØ§Ø¯Ù']}, 1222 'Ù¾ÙØ§Ø±': {m:['پدر']}, 1223 'Ù ÙØ±': {m:['٠ادر']}, 1224 'ÙØ±ÙرÙ': {m:['برادر']}, 1225 'Ø®ÙØ±': {m:['Ø®ÙØ§Ùر']}, 1226 'ÚÙ': {m:['Ø®ÙØ¨']}, 1227 'بد': {m:['بد'], n:'٠شترک'}, 1228 'ÙÙÛ': {m:['بزرگ','Ú©ÙØ§Ù']}, 1229 'ÙÚÙÚ©Û': {m:['Ú©ÙÚÚ©','Ø®ÙØ±Ø¯']}, 1230 'ګر٠': {m:['گر٠']}, 1231 'سÙÚ': {m:['سرد']}, 1232 'سرک': {m:['سرک','جادÙ'], n:'٠شترک'}, 1233 'ÙÙØ§Ûت': {m:['ÙÙØ§Ûت'], n:'٠شترک'}, 1234 'ÙÙØ³ÙاÙÙ':{m:['ÙÙØ³ÙاÙÛ'], n:'٠شترک'}, 1235 'ÙØ±ÛÙ': {m:['ÙØ±ÛÙ'], n:'٠شترک'}, 1236 'داکتر': {m:['داکتر'], n:'٠شترک'}, 1237 'ÙØ±Ø³': {m:['ÙØ±Ø³'], n:'٠شترک'}, 1238 'Ù ÙØªØ±': {m:['Ù ÙØªØ±'], n:'٠شترک'}, 1239 'ÚØ§Û': {m:['ÚØ§Û'], n:'٠شترک'}, 1240 'استاد': {m:['استاد'], n:'٠شترک'}, 1241 'شاگرد': {m:['شاگرد'], n:'٠شترک'}, 1242 'Ø²ÛØ§Øª': {m:['Ø²ÛØ§Ø¯','Ø¨Ø³ÛØ§Ø±']}, 1243 'ÙÚ': {m:['Ú©Ù ','Ø§ÙØ¯Ú©']}, 1244 'ÚØ±': {m:['Ø²ÙØ¯','ØªÛØ²']}, 1245 'ÙØ±Ù': {m:['Ø¢ÙØ³ØªÙ']}, 1246 'Ø§ÙØ³': {m:['ØØ§Ùا','اکÙÙÙ']}, 1247 'ÙÚØ¯Û': {m:['ÙØ²Ø¯ÛÚ©']}, 1248 'ÙØ±Û': {m:['Ø¯ÙØ±']}, 1249 'سپÛÙ': {m:['سÙÛØ¯']}, 1250 'ØªÙØ±': {m:['Ø³ÛØ§Ù']}, 1251 'Ø³ÙØ±': {m:['سرخ']}, 1252 'Ø´ÛÙ': {m:['سبز','آبÛ']}, 1253 'ÛÙ': {m:['ÛÚ©']}, 1254 'دÙÙ': {m:['دÙ']}, 1255 'درÛ': {m:['سÙ']}, 1256 'Ú ÙÙØ±': {m:['ÚÙØ§Ø±']}, 1257 'Ù¾ÙÚÙ': {m:['Ù¾ÙØ¬']}, 1258 'شپÚ': {m:['شش']}, 1259 'اÙÙÙ': {m:['ÙÙØª']}, 1260 'اتÙ': {m:['ÙØ´Øª']}, 1261 'ÙÙÙ': {m:['ÙÙ']}, 1262 'ÙØ³': {m:['دÙ']}, 1263 'سÙ': {m:['صد']}, 1264 'زر': {m:['ÙØ²Ø§Ø±']}, 1265 } 1266}; 1267 1268window.setDictLang = (btn, lang) => { 1269 DICT.lang = lang; 1270 btn.closest('.ctabs').querySelectorAll('.ctab').forEach(b=>b.classList.remove('on')); 1271 btn.classList.add('on'); 1272 document.getElementById('dict-input').value = ''; 1273 document.getElementById('dict-results').innerHTML = 1274 '<div style="text-align:center;padding:20px;color:var(--t3)">Ú©ÙÙ ÙâØ§Û Ø¨ÙÙÛØ³Ûد...</div>'; 1275}; 1276 1277window.searchDict = () => { 1278 const q = document.getElementById('dict-input').value.trim().toLowerCase(); 1279 const res = document.getElementById('dict-results'); 1280 if (!q || q.length < 1) { 1281 res.innerHTML = '<div style="text-align:center;padding:20px;color:var(--t3)">Ú©ÙÙ ÙâØ§Û Ø¨ÙÙÛØ³Ûد...</div>'; 1282 return; 1283 } 1284 const db = DICT.lang==='dari' ? DICT.dari_en : DICT.lang==='english' ? DICT.en_dari : DICT.pashto_dari; 1285 const matches = Object.entries(db).filter(([k,v]) => 1286 k.toLowerCase().includes(q) || q.includes(k.toLowerCase()) 1287 ); 1288 1289 if (!matches.length) { 1290 res.innerHTML = ` 1291 <div style="background:#f9fafb;border-radius:10px;padding:16px;border:1px solid var(--bdr);text-align:center"> 1292 <div style="font-size:24px;margin-bottom:8px">ð</div> 1293 <div style="font-size:13px;color:var(--t2);margin-bottom:12px">«${q}» در دÛÚ©Ø´ÙØ±Û ÛØ§Ùت ÙØ´Ø¯</div> 1294 <button onclick="dictAI('${q}')" style="background:var(--g);color:#fff;border:none;border-radius:9px;padding:9px 20px;font-size:13px;font-weight:800;cursor:pointer;font-family:inherit"> 1295 ð¤ ØªØ±Ø¬Ù ٠با ÙÙØ´ ٠صÙÙØ¹Û 1296 </button> 1297 </div>`; 1298 return; 1299 } 1300 1301 res.innerHTML = matches.slice(0,8).map(([word, data]) => { 1302 const meanings = data.m || []; 1303 const note = data.n || ''; 1304 const example = data.ex || ''; 1305 return ` 1306 <div style="background:#fff;border-radius:12px;padding:14px 15px;border:1.5px solid var(--bdr);margin-bottom:9px;box-shadow:0 1px 3px rgba(0,0,0,.04)"> 1307 <div style="font-size:20px;font-weight:900;color:var(--gd);margin-bottom:8px">${word}</div> 1308 <div style="display:flex;flex-wrap:wrap;gap:6px;margin-bottom:${note||example?'8px':'0'}"> 1309 ${meanings.map(m=>`<span style="background:var(--gl);color:var(--gd);padding:4px 12px;border-radius:6px;font-size:13px;font-weight:700">${m}</span>`).join('')} 1310 </div> 1311 ${note ? `<div style="font-size:11px;color:#0369a1;background:#eff6ff;padding:5px 10px;border-radius:6px;margin-bottom:5px">ð¡ ${note}</div>` : ''} 1312 ${example ? `<div style="font-size:12px;color:var(--t2);font-style:italic;margin-top:4px">٠ثاÙ: ${example}</div>` : ''} 1313 </div>`; 1314 }).join(''); 1315}; 1316 1317window.dictAI = async (word) => { 1318 const res = document.getElementById('dict-results'); 1319 res.innerHTML = '<div style="text-align:center;padding:16px;color:var(--g);font-weight:700">Ⳡدر ØØ§Ù ترج٠Ù...</div>'; 1320 try { 1321 const langMap = {dari:'از Ø¯Ø±Û Ø§ÙØºØ§Ùستا٠ب٠اÙÚ¯ÙÛØ³Û', english:'از اÙÚ¯ÙÛØ³Û Ø¨Ù Ø¯Ø±Û Ø§ÙØºØ§ÙستاÙ', pashto:'از Ù¾Ø´ØªÙ Ø¨Ù Ø¯Ø±Û Ø§ÙØºØ§ÙستاÙ'}; 1322 const sys = `ت٠٠تخصص Ø²Ø¨Ø§Ù Ø¯Ø±Û Ø§ÙØºØ§ÙØ³ØªØ§Ù ÙØ³ØªÛ. ترج٠٠دÙÛ٠با Ø§Ø¯Ø¨ÛØ§Øª Ø¯Ø±Û Ø§ÙØºØ§Ùستا٠بدÙ. 1323ÙØ§ÚÚ¯Ø§Ù Ø±Ø§ÛØ¬ Ø§ÙØºØ§Ùستا٠را Ø§Ø³ØªÙØ§Ø¯Ù Ú©Ù: ٠کتب (Ù٠٠درسÙ)Ø Ù¾ÙÙÙØªÙÙ (ÙÙ Ø¯Ø§ÙØ´Ú¯Ø§Ù)Ø Ø´ÙØ§Ø®Ø§ÙÙ (Ù٠بÛ٠ارستاÙ)Ø Ø¯Ø§Ú©ØªØ± (Ù٠دکتر)Ø Ù ÙØªØ± (Ù٠٠اشÛÙ)Ø Ø³Ø±Ú© (Ù٠جادÙ)Ø Ø¨Ø³ÛØ§Ø± (ÙÙ Ø®ÛÙÛ)Ø Ø³Ø±Ø® (ÙÙ ÙØ±Ù ز). 1324پاسخ Ú©ÙØªØ§Ù ٠ع٠ÙÛ Ø¨Ø§Ø´Ø¯.`; 1325 const d = await api('ai', { 1326 q:`${langMap[DICT.lang]}: "${word}" 1327ترج٠٠+ ÛÚ© ٠ثا٠ج٠ÙÙ Ú©ÙØªØ§Ù`, 1328 sys 1329 }); 1330 res.innerHTML = ` 1331 <div style="background:var(--gl);border-radius:12px;padding:15px;border:1.5px solid var(--gm)"> 1332 <div style="font-size:12px;font-weight:800;color:var(--t3);margin-bottom:8px">ð¤ ØªØ±Ø¬Ù Ù ÙÙØ´ ٠صÙÙØ¹Û</div> 1333 <div style="font-size:14px;line-height:1.9;color:var(--t1)">${d.t.replace(/\n/g,'<br>')}</div> 1334 </div>`; 1335 } catch(e) { 1336 res.innerHTML = '<div style="text-align:center;padding:14px;color:var(--r);font-size:13px">خطا در ØªØ±Ø¬Ù Ù â Ø¯ÙØ¨Ø§Ø±Ù ØªÙØ§Ø´ Ú©ÙÛØ¯</div>'; 1337 } 1338}; 1339 1340 1341// ââ PHONE DETECTOR ââââââââââââââââââââââââââââ 1342// Ù ÙØ¨Ø¹: Wikipedia - Telephone numbers in Afghanistan (2025) 1343window.detectPhone = () => { 1344 const raw = document.getElementById('phone-input').value.replace(/[\s\-\(\)]/g,''); 1345 const res = document.getElementById('phone-result'); 1346 if (raw.length < 7) { res.innerHTML=''; return; } 1347 1348 // ÙØ±Ù اÙâØ³Ø§Ø²Û Ø´Ù Ø§Ø±Ù 1349 let clean = raw; 1350 if (clean.startsWith('+93')) clean = '0' + clean.slice(3); 1351 else if (clean.startsWith('0093')) clean = '0' + clean.slice(4); 1352 else if (clean.startsWith('93') && clean.length === 11) clean = '0' + clean.slice(2); 1353 if (!clean.startsWith('0')) clean = '0' + clean; 1354 1355 const p3 = clean.slice(0,3); // 3 رÙ٠اÙÙ 1356 1357 // Ú©Ø¯ÙØ§Û دÙÛ٠بر اساس Wikipedia - Telephone numbers in Afghanistan 1358 const operators = [ 1359 { 1360 name:'Afghan Wireless (AWCC)', 1361 en:'Afghan Wireless Communication Company', 1362 color:'#2563eb', bg:'#dbeafe', 1363 emoji:'ð¶', 1364 prefixes:['070','071'], 1365 note:'اÙÙÛÙ Ø§Ù¾Ø±Ø§ØªÙØ± Ø§ÙØºØ§ÙØ³ØªØ§ÙØ ØªØ£Ø³ÛØ³ Û²Û°Û°Û²' 1366 }, 1367 { 1368 name:'Roshan (TDCA)', 1369 en:'Telecom Development Company Afghanistan', 1370 color:'#d97706', bg:'#fef3c7', 1371 emoji:'ð', 1372 prefixes:['072','079'], 1373 note:'بزرگترÛ٠سر٠اÛÙâگذار Ø®ØµÙØµÛ Ø§ÙØºØ§ÙستاÙ' 1374 }, 1375 { 1376 name:'Etisalat Afghanistan', 1377 en:'Emirates Telecom Group - Afghanistan', 1378 color:'#16a34a', bg:'#dcfce7', 1379 emoji:'ð¢', 1380 prefixes:['073','078'], 1381 note:'Ø´Ø¨Ú©Ù Ù¾ÛØ´Ø±Ùت٠۴G' 1382 }, 1383 { 1384 name:'Afghan Telecom / Salaam', 1385 en:'Afghan Telecom (State-owned)', 1386 color:'#7c3aed', bg:'#ede9fe', 1387 emoji:'ðµ', 1388 prefixes:['074','075'], 1389 note:'Ø§Ù¾Ø±Ø§ØªÙØ± دÙÙØªÛ Ø§ÙØºØ§ÙستاÙ' 1390 }, 1391 { 1392 name:'ATOMA (Ø³Ø§Ø¨ÙØ§Ù MTN)', 1393 en:'ATOMA - formerly MTN Afghanistan', 1394 color:'#dc2626', bg:'#fee2e2', 1395 emoji:'ð´', 1396 prefixes:['076','077'], 1397 note:'از اپرÛÙ Û²Û°Û²Ûµ ب٠ATOMA تغÛÛØ± ÙØ§Ù داد' 1398 }, 1399 ]; 1400 1401 const found = operators.find(op => op.prefixes.includes(p3)); 1402 1403 if (!found) { 1404 // Ø¨Ø±Ø±Ø³Û ÙÙØ¯ÙاÛÙ 1405 const areaCode = clean.slice(1,3); 1406 const areas = {'20':'کابÙ','40':'ÙØ±Ø§Øª','50':'٠زارشرÛÙ','30':'ÙÙØ¯Ùار','60':'Ø¬ÙØ§ÙâØ¢Ø¨Ø§Ø¯'}; 1407 if (areas[areaCode] && clean.length >= 9) { 1408 res.innerHTML = ` 1409 <div style="border-radius:12px;padding:14px;border:2px solid #64748b;background:#f8fafc"> 1410 <div style="font-size:12px;color:var(--t3);margin-bottom:5px">خط ثابت</div> 1411 <div style="font-size:20px;font-weight:900;direction:ltr;letter-spacing:2px;margin-bottom:8px">${clean}</div> 1412 <div style="font-size:13px;font-weight:800;color:#334155">ð Ø®Ø· ثابت ${areas[areaCode]}</div> 1413 </div>`; 1414 return; 1415 } 1416 res.innerHTML = `<div style="background:#f8fafc;border-radius:10px;padding:14px;border:1px solid var(--bdr);text-align:center;font-size:13px;color:var(--t2)">â ï¸ Ø´Ù Ø§Ø±Ù Ø´ÙØ§Ø³Ø§ÛÛ ÙØ´Ø¯ â ÙØ·Ùا٠با 07 Ø´Ø±ÙØ¹ Ú©ÙÛØ¯</div>`; 1417 return; 1418 } 1419 1420 const fmt = clean.replace(/^(\d{4})(\d{3})(\d{3})$/, '$1 $2 $3') || clean; 1421 res.innerHTML = ` 1422 <div style="border-radius:13px;padding:16px;border:2px solid ${found.color};background:${found.bg}"> 1423 <div style="font-size:11px;font-weight:700;color:${found.color};margin-bottom:6px;opacity:.8">Ø´Ù Ø§Ø±Ù Ø´ÙØ§Ø³Ø§ÛÛâØ´Ø¯Ù</div> 1424 <div style="font-size:26px;font-weight:900;color:#0f172a;direction:ltr;letter-spacing:3px;margin-bottom:12px">${fmt}</div> 1425 <div style="display:flex;align-items:center;gap:12px"> 1426 <div style="width:48px;height:48px;border-radius:14px;background:${found.color};display:flex;align-items:center;justify-content:center;font-size:24px;flex-shrink:0">${found.emoji}</div> 1427 <div> 1428 <div style="font-size:16px;font-weight:900;color:${found.color}">${found.name}</div> 1429 <div style="font-size:11px;color:#64748b;margin-top:2px">${found.en}</div> 1430 <div style="font-size:10px;color:#94a3b8;margin-top:3px">â¹ï¸ ${found.note}</div> 1431 </div> 1432 </div> 1433 <div style="margin-top:10px;background:rgba(0,0,0,.06);border-radius:8px;padding:7px 11px;font-size:11px;color:#475569"> 1434 پرÛÙÛکسâÙØ§Û اÛÙ Ø§Ù¾Ø±Ø§ØªÙØ±: <strong>${found.prefixes.join('xxØ ')}xx</strong> 1435 </div> 1436 </div>`; 1437}; 1438 1439// ââ CALENDAR 1405 âââââââââââââââââââââââââââââ 1440const EVENTS = { 1441 national: [ 1442 {month:'ØÙ Ù', day:1, name:'Ø¹ÛØ¯ ÙÙØ±Ùز', type:'تعطÛ٠رس٠Û', emoji:'ð¸'}, 1443 {month:'Ø«ÙØ±', day:8, name:'Ø±ÙØ² Ø«ÙØ± (Û±Û³ÛµÛ·)', type:'ØªØ§Ø±ÛØ®Û', emoji:'ð '}, 1444 {month:'Ø¬ÙØ²Ø§', day:3, name:'استرداد استÙÙØ§Ù', type:'تعطÛ٠رس٠Û', emoji:'ð¦ð«'}, 1445 {month:'اسد', day:18, name:'استÙÙØ§Ù Ø§ÙØºØ§Ùستا٠۱۲۹۸', type:'تعطÛ٠رس٠Û', emoji:'ðï¸'}, 1446 {month:'Ù ÛØ²Ø§Ù', day:7, name:'Ø´ÙØ§Ø¯Øª استاد رباÙÛ', type:'ØªØ§Ø±ÛØ®Û', emoji:'ðï¸'}, 1447 {month:'Ø¹ÙØ±Ø¨', day:13, name:'Ù Ø¬Ø§ÙØ¯ÛÙ Ù Ø¬ÙØ§Ø¯', type:'ØªØ§Ø±ÛØ®Û', emoji:'ð '}, 1448 ], 1449 religious: [ 1450 {month:'ØÙ Ù', day:28, name:'Ø¹ÛØ¯ ÙØ·Ø± Û±Û´Û´Û·', type:'تعطÛ٠رس٠Û', emoji:'ð'}, 1451 {month:'Ø¬ÙØ²Ø§', day:5, name:'Ø¹ÛØ¯ ÙØ±Ø¨Ø§Ù Û±Û´Û´Û·', type:'تعطÛ٠رس٠Û', emoji:'ð'}, 1452 {month:'Ø¬ÙØ²Ø§', day:10, name:'Ø¹Ø§Ø´ÙØ±Ø§ Û±Û´Û´Û¸', type:'Ù Ø°ÙØ¨Û', emoji:'ð'}, 1453 {month:'Ø³ÙØ¨ÙÙ', day:3, name:'Ù ÛÙØ§Ø¯ اÙÙØ¨Û ï·º', type:'تعطÛ٠رس٠Û', emoji:'âªï¸'}, 1454 {month:'ØÙ Ù', day:1, name:'ÙÙØ±Ùز', type:'تعطÛ٠رس٠Û', emoji:'ð·'}, 1455 ] 1456}; 1457 1458const MONTHS_FA = ['ØÙ Ù','Ø«ÙØ±','Ø¬ÙØ²Ø§','سرطاÙ','اسد','Ø³ÙØ¨ÙÙ','Ù ÛØ²Ø§Ù','Ø¹ÙØ±Ø¨','ÙÙØ³','جدÛ','دÙÙ','ØÙت']; 1459 1460window.showCalTab = (btn, tab) => { 1461 btn.closest('.ctabs').querySelectorAll('.ctab').forEach(b=>b.classList.remove('on')); 1462 btn.classList.add('on'); 1463 const el = document.getElementById('cal-content'); 1464 1465 if (tab === 'upcoming') { 1466 // Ù ØØ§Ø³Ø¨Ù Ø³Ø§Ø¯Ù Ù Ø§Ù Ø´Ù Ø³Û ÙØ¹ÙÛ 1467 el.innerHTML = ` 1468 <div style="background:var(--gl);border-radius:10px;padding:12px;border:1px solid var(--gm);margin-bottom:10px;text-align:center"> 1469 <div style="font-size:13px;font-weight:800;color:var(--gd)">Ù ÙØ§Ø³Ø¨ØªâÙØ§Û Ø²ÙØ¯ÙÙگا٠سا٠۱۴۰۵</div> 1470 </div> 1471 ${[...EVENTS.national,...EVENTS.religious].map(e=>` 1472 <div style="background:#fff;border-radius:10px;padding:11px 13px;border:1px solid var(--bdr);margin-bottom:7px;display:flex;align-items:center;gap:10px"> 1473 <div style="font-size:28px">${e.emoji}</div> 1474 <div style="flex:1"> 1475 <div style="font-size:14px;font-weight:800;color:var(--t1)">${e.name}</div> 1476 <div style="font-size:11px;color:var(--t3);margin-top:2px">${e.day}
1476 ${e.month} Û±Û´Û°Ûµ</div> 1477 </div> 1478 <div style="font-size:10px;font-weight:800;padding:3px 8px;border-radius:5px;background:${e.type==='تعطÛ٠رس٠Û'?'#dcfce7':'#f0f4ff'};color:${e.type==='تعطÛ٠رس٠Û'?'#15803d':'#1d4ed8'}">${e.type}</div> 1479 </div>`).join('')}`; 1480 return; 1481 } 1482 1483 const events = EVENTS[tab] || []; 1484 el.innerHTML = events.map(e=>` 1485 <div style="background:#fff;border-radius:10px;padding:12px 14px;border:1.5px solid var(--bdr);margin-bottom:8px;display:flex;align-items:center;gap:12px"> 1486 <div style="font-size:32px">${e.emoji}</div> 1487 <div style="flex:1"> 1488 <div style="font-size:14px;font-weight:900;color:var(--t1)">${e.name}</div> 1489 <div style="font-size:12px;color:var(--t3);margin-top:3px">ð ${e.day} ${e.month} Û±Û´Û°Ûµ</div> 1490 </div> 1491 <div style="font-size:11px;font-weight:800;padding:4px 9px;border-radius:6px;background:${e.type==='تعطÛ٠رس٠Û'?'#dcfce7':'#dbeafe'};color:${e.type==='تعطÛ٠رس٠Û'?'#15803d':'#1d4ed8'};white-space:nowrap">${e.type}</div> 1492 </div>`).join(''); 1493}; 1494 1495// ââ DISTANCE ââââââââââââââââââââââââââââââââââ 1496const CITIES = ['کابÙ','ÙØ±Ø§Øª','٠زارشرÛÙ','ÙÙØ¯Ùار','Ø¬ÙØ§ÙâØ¢Ø¨Ø§Ø¯','Ú©ÙØ¯Ø²','Ø¨Ø§Ù ÛØ§Ù','غزÙÛ','ÙØ´Ú©Ø±Ú¯Ø§Ù']; 1497const DIST_TABLE = { 1498 'کابÙ': {'کابÙ':0, 'ÙØ±Ø§Øª':1177,'٠زارشرÛÙ':425,'ÙÙØ¯Ùار':492,'Ø¬ÙØ§ÙâØ¢Ø¨Ø§Ø¯':148,'Ú©ÙØ¯Ø²':330,'Ø¨Ø§Ù ÛØ§Ù':186,'غزÙÛ':145,'ÙØ´Ú©Ø±Ú¯Ø§Ù':636}, 1499 'ÙØ±Ø§Øª': {'کابÙ':1177,'ÙØ±Ø§Øª':0, '٠زارشرÛÙ':565,'ÙÙØ¯Ùار':697,'Ø¬ÙØ§ÙâØ¢Ø¨Ø§Ø¯':1325,'Ú©ÙØ¯Ø²':895,'Ø¨Ø§Ù ÛØ§Ù':857,'غزÙÛ':892,'ÙØ´Ú©Ø±Ú¯Ø§Ù':617}, 1500 '٠زارشرÛÙ': {'کابÙ':425, 'ÙØ±Ø§Øª':565,'٠زارشرÛÙ':0, 'ÙÙØ¯Ùار':917,'Ø¬ÙØ§ÙâØ¢Ø¨Ø§Ø¯':573,'Ú©ÙØ¯Ø²':152,'Ø¨Ø§Ù ÛØ§Ù':251,'غزÙÛ':570,'ÙØ´Ú©Ø±Ú¯Ø§Ù':1061}, 1501 'ÙÙØ¯Ùار': {'کابÙ':492, 'ÙØ±Ø§Øª':697,'٠زارشرÛÙ':917,'ÙÙØ¯Ùار':0, 'Ø¬ÙØ§ÙâØ¢Ø¨Ø§Ø¯':640,'Ú©ÙØ¯Ø²':822,'Ø¨Ø§Ù ÛØ§Ù':678,'غزÙÛ':347,'ÙØ´Ú©Ø±Ú¯Ø§Ù':145}, 1502 'Ø¬ÙØ§ÙâØ¢Ø¨Ø§Ø¯': {'کابÙ':148, 'ÙØ±Ø§Øª':1325,'٠زارشرÛÙ':573,'ÙÙØ¯Ùار':640,'Ø¬ÙØ§ÙâØ¢Ø¨Ø§Ø¯':0, 'Ú©ÙØ¯Ø²':478,'Ø¨Ø§Ù ÛØ§Ù':334,'غزÙÛ':293,'ÙØ´Ú©Ø±Ú¯Ø§Ù':784}, 1503 'Ú©ÙØ¯Ø²': {'کابÙ':330, 'ÙØ±Ø§Øª':895,'٠زارشرÛÙ':152,'ÙÙØ¯Ùار':822,'Ø¬ÙØ§ÙâØ¢Ø¨Ø§Ø¯':478,'Ú©ÙØ¯Ø²':0, 'Ø¨Ø§Ù ÛØ§Ù':403,'غزÙÛ':475,'ÙØ´Ú©Ø±Ú¯Ø§Ù':966}, 1504 'Ø¨Ø§Ù ÛØ§Ù': {'کابÙ':186, 'ÙØ±Ø§Øª':857,'٠زارشرÛÙ':251,'ÙÙØ¯Ùار':678,'Ø¬ÙØ§ÙâØ¢Ø¨Ø§Ø¯':334,'Ú©ÙØ¯Ø²':403,'Ø¨Ø§Ù ÛØ§Ù':0, 'غزÙÛ':226,'ÙØ´Ú©Ø±Ú¯Ø§Ù':822}, 1505 'غزÙÛ': {'کابÙ':145, 'ÙØ±Ø§Øª':892,'٠زارشرÛÙ':570,'ÙÙØ¯Ùار':347,'Ø¬ÙØ§ÙâØ¢Ø¨Ø§Ø¯':293,'Ú©ÙØ¯Ø²':475,'Ø¨Ø§Ù ÛØ§Ù':226,'غزÙÛ':0, 'ÙØ´Ú©Ø±Ú¯Ø§Ù':492}, 1506 'ÙØ´Ú©Ø±Ú¯Ø§Ù': {'کابÙ':636, 'ÙØ±Ø§Øª':617,'٠زارشرÛÙ':1061,'ÙÙØ¯Ùار':145,'Ø¬ÙØ§ÙâØ¢Ø¨Ø§Ø¯':784,'Ú©ÙØ¯Ø²':966,'Ø¨Ø§Ù ÛØ§Ù':822,'غزÙÛ':492,'ÙØ´Ú©Ø±Ú¯Ø§Ù':0}, 1507}; 1508 1509const Dist = { 1510 init() { 1511 const fromSel = document.getElementById('dist-from'); 1512 const toSel = document.getElementById('dist-to'); 1513 if (!fromSel || !toSel) return; 1514 CITIES.forEach((c,i) => { 1515 fromSel.innerHTML += `<option value="${c}">${c}</option>`; 1516 toSel.innerHTML += `<option value="${c}" ${i===1?'selected':''}>${c}</option>`; 1517 }); 1518 this.calc(); 1519 }, 1520 calc() { 1521 const from = document.getElementById('dist-from').value; 1522 const to = document.getElementById('dist-to').value; 1523 const res = document.getElementById('dist-result'); 1524 if (from === to) { 1525 res.innerHTML = '<div style="text-align:center;padding:14px;color:var(--t3)">٠بدا Ù Ù ÙØµØ¯ ÛÚ©Û Ø§Ø³Øª</div>'; 1526 return; 1527 } 1528 const km = DIST_TABLE[from]?.[to] || DIST_TABLE[to]?.[from] || 0; 1529 const hours = Math.floor(km/65); 1530 const mins = Math.round((km/65-hours)*60); 1531 res.innerHTML = ` 1532 <div style="background:linear-gradient(135deg,var(--gd),var(--g));border-radius:14px;padding:18px;color:#fff;text-align:center;margin-bottom:14px"> 1533 <div style="font-size:13px;opacity:.8;margin-bottom:6px">${from} â â ${to}</div> 1534 <div style="font-size:48px;font-weight:900;line-height:1">
1534${km.toLocaleString('fa')}</div> 1535 <div style="font-size:14px;opacity:.9;margin-top:4px">Ú©ÛÙÙ٠تر</div> 1536 <div style="display:flex;justify-content:center;gap:20px;margin-top:12px;font-size:12px;opacity:.85"> 1537 <div>ð ØªÙØ±Ûبا٠${hours>0?hours+'س ':''} ${mins}د</div> 1538 <div>âï¸ ØØ¯Ùد ${Math.round(km/700*60)}د Ù¾Ø±ÙØ§Ø²</div> 1539 </div> 1540 </div>`; 1541 } 1542}; 1543window.calcDistance = () => Dist.calc();// ââ LIVE RATES âââââââââââââââââââââââââââââââââââ 1544// ÙØ±Ø®âÙØ§Û live â global تا converter ÙÙ ÛØ´Ù از اÛÙÙØ§ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙØ¯ 1545window.LIVE_RATES = {usd:71.5, eur:78, gbp:91, sar:19, aed:19.5, pkr:0.25, irr:0.0017}; 1546 1547const LiveRates = { 1548 1549 async fetchCrypto() { 1550 try { 1551 const r = await fetch( 1552 'https://api.coingecko.com/api/v3/simple/price?ids=pax-gold,bitcoin,ethereum&vs_currencies=usd&include_24hr_change=true', 1553 {headers:{'Accept':'application/json'}, signal: AbortSignal.timeout(10000)} 1554 ); 1555 if (!r.ok) throw new Error(r.status); 1556 const d = await r.json(); 1557 1558 const set = (id, priceId, priceKey, changeKey) => { 1559 if (!d[priceId]) return; 1560 const price = d[priceId][priceKey]; 1561 const change = d[priceId][changeKey] || 0; 1562 const up = change >= 0; 1563 const fmt = p => p >= 1000 ? '$' + p.toLocaleString('en',{maximumFractionDigits:0}) 1564 : '$' + p.toLocaleString('en',{maximumFractionDigits:2}); 1565 const priceEl = document.getElementById(id+'-price'); 1566 const changeEl = document.getElementById(id+'-change'); 1567 const row = document.getElementById(id+'-row'); 1568 if (priceEl) { priceEl.textContent = fmt(price); priceEl.className = 'fx-price '+(up?'fx-up':'fx-dn'); } 1569 if (changeEl) { changeEl.textContent = (up?'+':'')+change.toFixed(2)+'Ùª'; changeEl.className = 'fx-change '+(up?'fx-up':'fx-dn'); } 1570 if (row) { row.classList.add('flash'); setTimeout(()=>row.classList.remove('flash'),600); } 1571 }; 1572 1573 set('gold','pax-gold','usd','usd_24h_change'); 1574 set('btc','bitcoin','usd','usd_24h_change'); 1575 set('eth','ethereum','usd','usd_24h_change'); 1576 1577 const el = document.getElementById('crypto-update'); 1578 const n = new Date(); 1579 if (el) el.textContent = `Ø¢Ù¾Ø¯ÛØª ${String(n.getHours()).padStart(2,'0')}:${String(n.getMinutes()).padStart(2,'0')}`; 1580 1581 } catch(e) { 1582 const el = document.getElementById('crypto-update'); 1583 if (el) el.textContent = 'خطا در اتصاÙ'; 1584 } 1585 }, 1586 1587 async fetchExchange() { 1588 try { 1589 const r = await fetch('https://open.er-api.com/v6/latest/USD', {signal: AbortSignal.timeout(8000)}); 1590 const d = await r.json(); 1591 if (!d.rates) return; 1592 const afn = d.rates.AFN || 71.5; 1593 1594 // Ø°Ø®ÛØ±Ù ÙØ±Ø®âÙØ§Û live در Ù ØªØºÛØ± global 1595 window.LIVE_RATES = { 1596 usd: afn, 1597 eur: afn / d.rates.EUR, 1598 gbp: afn / d.rates.GBP, 1599 sar: afn / d.rates.SAR, 1600 aed: afn / d.rates.AED, 1601 pkr: afn / d.rates.PKR, 1602 irr: afn / d.rates.IRR, 1603 }; 1604 1605 // Ø¢Ù¾Ø¯ÛØª ردÛÙâÙØ§Û ÙØ±Ø® اسعار 1606 document.querySelectorAll('.fx-row[data-cur]').forEach(row => { 1607 const cur = row.dataset.cur; 1608 const rate = window.LIVE_RATES[cur]; 1609 if (!rate) return; 1610 const priceEl = row.querySelector('.fx-price'); 1611 if (priceEl) { 1612 priceEl.textContent = rate.toFixed(1) + ' Ø§ÙØºØ§ÙÛ'; 1613 priceEl.className = 'fx-price fx-up'; 1614 row.classList.add('flash'); 1615 setTimeout(()=>row.classList.remove('flash'),600); 1616 } 1617 }); 1618 1619 // Ø¢Ù¾Ø¯ÛØª ÙÙ Ù option ÙØ§Û ÙØ± د٠converter با ÙØ±Ø® live 1620 ['fxf','pfxf'].forEach(selId => { 1621 const sel = document.getElementById(selId); 1622 if (!sel) return; 1623 Array.from(sel.options).forEach(opt => { 1624 const cur = opt.dataset?.cur; 1625 if (cur && window.LIVE_RATES[cur]) { 1626 opt.value = window.LIVE_RATES[cur]; 1627 } 1628 }); 1629 }); 1630 // Ù ØØ§Ø³Ø¨Ù ٠جدد ÙØ± د٠converter با ÙØ±Ø® Ø¬Ø¯ÛØ¯ 1631 calcFx(); 1632 calcPFx(); 1633 1634 const upEl = document.getElementById('fx-update'); 1635 const n = new Date(); 1636 if (upEl) upEl.textContent = `Ø¢Ù¾Ø¯ÛØª ${String(n.getHours()).padStart(2,'0')}
1636:${String(n.getMinutes()).padStart(2,'0')}`; 1637 1638 } catch(e) { 1639 const upEl = document.getElementById('fx-update'); 1640 if (upEl) upEl.textContent = 'Ø¢ÙÙØ§ÛÙ'; 1641 } 1642 }, 1643 1644 init() { 1645 this.fetchExchange(); 1646 setTimeout(()=>this.fetchCrypto(), 800); 1647 setInterval(()=>this.fetchExchange(), 5*60*1000); 1648 setInterval(()=>this.fetchCrypto(), 90*1000); 1649 } 1650}; 1651 1652document.addEventListener('DOMContentLoaded', () => LiveRates.init()); 1653// ââ MAP (Leaflet.js) ââââââââââââââââââââââââââ 1654const MapAF = { 1655 map: null, 1656 loaded: false, 1657 1658 PROVINCES: { 1659 'kabul': {n:'کابÙ', cap:'کابÙ', pop:'Û´.Û¶ Ù ÛÙÛÙÙ', area:'Û´,ÛµÛ²Ûµ km²', lat:34.5553, lng:69.2075}, 1660 'herat': {n:'ÙØ±Ø§Øª', cap:'ÙØ±Ø§Øª', pop:'Û².Û± Ù ÛÙÛÙÙ', area:'ÛµÛ´,Û·Û·Û¸ km²', lat:34.3529, lng:62.2040}, 1661 'balkh': {n:'Ø¨ÙØ®', cap:'٠زارشرÛÙ', pop:'Û±.Û´ Ù ÛÙÛÙÙ', area:'Û±Û·,Û²Û´Û¹ km²', lat:36.7069, lng:67.1128}, 1662 'kandahar': {n:'ÙÙØ¯Ùار', cap:'ÙÙØ¯Ùار', pop:'Û±.Û³ Ù ÛÙÛÙÙ', area:'ÛµÛ´,Û°Û²Û² km²', lat:31.6289, lng:65.7372}, 1663 'nangarhar':{n:'ÙÙÚ¯Ø±ÙØ§Ø±', cap:'Ø¬ÙØ§ÙâØ¢Ø¨Ø§Ø¯', pop:'Û±.Û· Ù ÛÙÛÙÙ', area:'Û·,Û·Û²Û· km²', lat:34.4415, lng:70.4360}, 1664 'helmand': {n:'ÙÙÙ ÙØ¯', cap:'ÙØ´Ú©Ø±Ú¯Ø§Ù', pop:'Û±.Û± Ù ÛÙÛÙÙ', area:'ÛµÛ¸,ÛµÛ¸Û´ km²', lat:31.5232, lng:64.1240}, 1665 'ghazni': {n:'غزÙÛ', cap:'غزÙÛ', pop:'Û±.Û³ Ù ÛÙÛÙÙ', area:'Û²Û²,Û¹Û±Ûµ km²', lat:33.5534, lng:68.4139}, 1666 'badakhshan':{n:'بدخشاÙ', cap:'ÙÛØ¶âآباد', pop:'Û±.Û° Ù ÛÙÛÙÙ', area:'Û´Û´,Û°ÛµÛ¹ km²', lat:37.4406, lng:70.7944}, 1667 'kunduz': {n:'Ú©ÙØ¯Ø²', cap:'Ú©ÙØ¯Ø²', pop:'Û±.Û± Ù ÛÙÛÙÙ', area:'Û¸,Û°Û´Û° km²', lat:36.7276, lng:68.8681}, 1668 'faryab': {n:'ÙØ§Ø±Ûاب', cap:'Ù ÛÙ ÙÙ', pop:'Û±.Û± Ù ÛÙÛÙÙ', area:'Û²Û°,Û²Û¹Û³ km²', lat:35.9166, lng:64.0833}, 1669 'bamyan': {n:'Ø¨Ø§Ù ÛØ§Ù', cap:'Ø¨Ø§Ù ÛØ§Ù', pop:'Û´Û¶Û° ÙØ²Ø§Ø±', area:'Û±Û·,Û´Û±Û´ km²', lat:34.8269, lng:67.8197}, 1670 'baghlan': {n:'Ø¨ØºÙØ§Ù', cap:'Ù¾ÙâØ®Ù Ø±Û', pop:'Û±.Û° Ù ÛÙÛÙÙ', area:'Û²Û±,Û±Û±Û¸ km²', lat:36.1322, lng:68.7208}, 1671 'takhar': {n:'تخار', cap:'تاÙÙØ§Ù', pop:'Û±.Û° Ù ÛÙÛÙÙ', area:'Û±Û²,Û³Û³Û³ km²', lat:36.7358, lng:69.5141}, 1672 'ghor': {n:'ØºÙØ±', cap:'ÚØºÚراÙ', pop:'Û·ÛµÛ° ÙØ²Ø§Ø±', area:'Û³Û¶,Û´Û·Û¹ km²', lat:34.0167, lng:64.9000}, 1673 'farah': {n:'ÙØ±Ø§Ù', cap:'ÙØ±Ø§Ù', pop:'ÛµÛµÛ° ÙØ²Ø§Ø±', area:'Û´Û¸,Û´Û·Û± km²', lat:32.3742, lng:62.1168}, 1674 'uruzgan': {n:'ارزگاÙ', cap:'ترÛÙâÚ©ÙØª', pop:'Û´Û¸Û° ÙØ²Ø§Ø±', area:'Û±Û²,Û¶Û´Û° km²', lat:32.9269, lng:65.8786}, 1675 'zabul': {n:'زابÙ', cap:'ÙÙØ§Øª', pop:'Û³Û¸Û° ÙØ²Ø§Ø±', area:'Û±Û·,Û³Û´Û³ km²', lat:32.1107, lng:67.1892}, 1676 'paktia': {n:'Ù¾Ú©ØªÛØ§', cap:'Ú¯Ø±Ø¯ÛØ²', pop:'ÛµÛ¸Û° ÙØ²Ø§Ø±', area:'Û¶,Û´Û³Û² km²', lat:33.6102, lng:69.4391}, 1677 'khost': {n:'Ø®ÙØ³Øª', cap:'Ø®ÙØ³Øª', pop:'Û¶ÛµÛ° ÙØ²Ø§Ø±', area:'Û´,Û±ÛµÛ² km²', lat:33.3338, lng:69.9196}, 1678 'paktika': {n:'پکتÛکا', cap:'شرÙ', pop:'ÛµÛµÛ° ÙØ²Ø§Ø±', area:'Û±Û¹,Û´Û¸Û² km²', lat:32.5000, lng:68.5000}, 1679 'kunar': {n:'Ú©ÙØ±', cap:'اسعدآباد', pop:'ÛµÛ³Û° ÙØ²Ø§Ø±', area:'Û´,Û¹Û´Û² km²', lat:34.8468, lng:71.0975}, 1680 'laghman': {n:'ÙØºÙ اÙ', cap:'Ù ÙØªØ±Ùا٠', pop:'Û´ÛµÛ° ÙØ²Ø§Ø±', area:'Û³,Û¸Û´Û³ km²', lat:34.6830, lng:70.1543}, 1681 'nuristan': {n:'ÙÙØ±Ø³ØªØ§Ù', cap:'پارÙÙ', pop:'Û±Û¶Û° ÙØ²Ø§Ø±', area:'Û¹,Û²Û²Ûµ km²', lat:35.3253, lng:70.9072}, 1682 'kapisa': {n:'Ú©Ø§Ù¾ÛØ³Ø§', cap:'Ù ØÙ ÙØ¯Ø±Ø§ÙÛ', pop:'Û´ÛµÛ° ÙØ²Ø§Ø±', area:'Û±,Û¸Û·Û± km²', lat:35.0219, lng:69.6178}, 1683 'parwan': {n:'Ù¾Ø±ÙØ§Ù', cap:'ÚØ§Ø±Ûکار', pop:'Û·Û°Û° ÙØ²Ø§Ø±', area:'Ûµ,Û¹Û·Û´ km²', lat:35.0122, lng:69.1369}, 1684 'wardak': {n:'ÙØ±Ø¯Ú©', cap:'Ù ÛØ¯Ø§ÙâØ´ÙØ±', pop:'Û¶ÛµÛ° ÙØ²Ø§Ø±', area:'Û¹,Û°Û²Û¸ km²', lat:34.0047, lng:68.6479}, 1685 'logar': {n:'ÙÙگر', cap:'Ù¾ÙâØ¹ÙÙ ', pop:'Û´ÛµÛ° ÙØ²Ø§Ø±', area:'Û´,Û´Û°Û° km²', lat:33.9830, lng:69.1931}, 1686 'panjshir': {n:'Ù¾ÙØ¬Ø´Ûر', cap:'بازارک', pop:'Û±Û¶Û° ÙØ²Ø§Ø±', area:'Û³,Û¶Û±Û° km²', lat:35.1547, lng:69.7117}, 1687 'jawzjan': {n:'Ø¬ÙØ²Ø¬Ø§Ù', cap:'شبرغاÙ', pop:'Û¶Û°Û° ÙØ²Ø§Ø±', area:'Û±Û±,Û·Û¹Û¸ km²', lat:36.6551, lng:65.7958}, 1688 'saripul': {n:'سرپÙ', cap:'سرپÙ', pop:'ÛµÛ¸Û° ÙØ²Ø§Ø±', area:'Û±Ûµ,Û¹Û¹Û¹ km²', lat:36.2347, lng:65.9193}, 1689 'samangan': {n:'س٠ÙگاÙ', cap:'Ø§ÛØ¨Ú©', pop:'Û´ÛµÛ° ÙØ²Ø§Ø±', area:'Û±Û±,Û²Û¶Û² km²', lat:36.1554, lng:68.0267}, 1690 'badghis': {n:'Ø¨Ø§Ø¯ØºÛØ³', cap:'ÙÙØ¹ÙâÙÙ', pop:'ÛµÛ³Û° ÙØ²Ø§Ø±', area:'Û²Û°,ÛµÛ¹Û± km²', lat:35.1671, lng:63.7692}, 1691 'daykundi': {n:'داÛÚ©ÙØ¯Û', cap:'ÙÛÙÛ', pop:'Û´ÛµÛ° ÙØ²Ø§Ø±', area:'Û±Û¸,Û°Û¸Û¸ km²', lat:33.6844, lng:66.0203}, 1692 'nimruz': {n:'ÙÛÙ Ø±ÙØ²', cap:'Ø²Ø±ÙØ¬', pop:'Û²Û°Û° ÙØ²Ø§Ø±', area:'Û´Û±,Û°Û°Ûµ km²', lat:30.9226, lng:62.0282}, 1693 }, 1694 1695 init() { 1696 if (this.loaded) return; 1697 this.loaded = true; 1698 1699 // Load Leaflet CSS + JS 1700 if (!document.getElementById('leaflet-css')) { 1701 const css = document.createElement('link'); 1702 css.id = 'leaflet-css'; 1703 css.rel = 'stylesheet'; 1704 css.href = 'https://unpkg.com/[email protected]/dist/leaflet.css'; 1705 document.head.appendChild(css); 1706 } 1707 1708 if (window.L) { 1709 this.initMap(); 1710 } else { 1711 const script = document.createElement('script'); 1712 script.src = 'https://unpkg.com/[email protected]/dist/leaflet.js'; 1713 script.onload = () => this.initMap(); 1714 document.head.appendChild(script); 1715 } 1716 }, 1717 1718 initMap() { 1719 const L = window.L; 1720 if (this.map) { this.map.remove(); } 1721 1722 this.map = L.map('leaflet-map', { 1723 center: [33.9, 66.0], 1724 zoom: 5, 1725 zoomControl: true, 1726 }); 1727 1728 // OpenStreetMap tiles 1729 L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { 1730 attribution: '© OpenStreetMap', 1731 maxZoom: 18, 1732 }).addTo(this.map); 1733 1734 // Province markers
1735 Object.entries(this.PROVINCES).forEach(([key, p]) => { 1736 const marker = L.circleMarker([p.lat, p.lng], { 1737 radius: 8, 1738 fillColor: '#1D9E75', 1739 color: '#fff', 1740 weight: 2, 1741 opacity: 1, 1742 fillOpacity: 0.85, 1743 }).addTo(this.map); 1744 1745 marker.bindTooltip(p.n, { 1746 permanent: false, 1747 direction: 'top', 1748 className: 'map-tooltip', 1749 }); 1750 1751 marker.on('click', () => { 1752 this.showProvince(key, p); 1753 marker.setStyle({fillColor: '#0a3d2b', radius: 11}); 1754 setTimeout(() => marker.setStyle({fillColor: '#1D9E75', radius: 8}), 2000); 1755 }); 1756 }); 1757 1758 // Afghanistan border - simple rectangle approximation 1759 const afBounds = [[29.5, 60.5], [38.5, 74.9]]; 1760 L.rectangle(afBounds, { 1761 color: '#1D9E75', 1762 weight: 2, 1763 fillOpacity: 0, 1764 dashArray: '6,4', 1765 }).addTo(this.map); 1766 }, 1767 1768 showProvince(key, p) { 1769 document.getElementById('map-city-info').textContent = `ÙÙØ§Ûت ${p.n}`; 1770 document.getElementById('map-province-card').style.display = 'block'; 1771 document.getElementById('prov-name').textContent = `ÙÙØ§Ûت ${p.n}`; 1772 document.getElementById('prov-cap').textContent = `٠رکز: ${p.cap}`; 1773 document.getElementById('prov-pop').textContent = p.pop; 1774 document.getElementById('prov-area').textContent = p.area; 1775 document.getElementById('prov-city').textContent = p.cap; 1776 this.map?.flyTo([p.lat, p.lng], 8, {duration: 1.2}); 1777 } 1778}; 1779 1780window.mapView = (target) => { 1781 if (!MapAF.map) return; 1782 if (target === 'kabul') { 1783 MapAF.map.flyTo([34.5553, 69.2075], 10, {duration: 1.2}); 1784 MapAF.showProvince('kabul', MapAF.PROVINCES.kabul); 1785 } else { 1786 MapAF.map.flyTo([33.9, 66.0], 5, {duration: 1.2}); 1787 document.getElementById('map-city-info').textContent = 'رÙÛ ÙÙØ§Ûت Ú©ÙÛÚ© Ú©ÙÛØ¯'; 1788 document.getElementById('map-province-card').style.display = 'none'; 1789 } 1790};
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.