/*! منظر — © ۱۴۰۵ / 2026 نویسندگانِ منظر — پروانهٔ غیرتجاریِ پلی‌فرم ۱٫۰٫۰ */ (function (jahan, sazande) { if (typeof module === 'object' && module.exports) module.exports = sazande(); else if (typeof define === 'function' && define.amd) define(sazande); else jahan.Manzar = sazande(); }(typeof self !== 'undefined' ? self : this, function () { 'use strict'; var ANDAZE_KASHI = 256; var KASHI_PISHFARZ = 'https://payehnaghsheh.damanehazmayesh.ir/{z}/{x}/{y}.png'; var ETEBAR_DADEH = '© رصد زمین'; var RADIAN = Math.PI / 180; var NESKHE = '2.4.2'; var PARCHAM_FELESTIN = '' + '' + '' + '' + '' + ''; function mahdud(meghdar, kaf, saghf) { return meghdar < kaf ? kaf : (meghdar > saghf ? saghf : meghdar); } var QAB_PAYEH = 1000 / 60; function zamanAknoon() { return (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now(); } function sakhtOnsor(barchasb, kelas, valed) { var o = document.createElement(barchasb); if (kelas) o.className = kelas; if (valed) valed.appendChild(o); return o; } function darham(payeh, roo) { var natije = {}, kelid; for (kelid in payeh) if (payeh.hasOwnProperty(kelid)) natije[kelid] = payeh[kelid]; if (roo) for (kelid in roo) if (roo.hasOwnProperty(kelid)) natije[kelid] = roo[kelid]; return natije; } function joftMokhtasat(v) { return v && typeof v[0] === 'number' && typeof v[1] === 'number'; } function narmesh(t) { return 1 - Math.pow(1 - t, 3); } var KASH_KASHI_SAGHF = (function () { var hafezeh = (typeof navigator !== 'undefined' && navigator.deviceMemory) || 8; return hafezeh <= 2 ? 120 : (hafezeh <= 4 ? 240 : 480); })(); var kashKashi = (typeof Map !== 'undefined') ? new Map() : null; var kashKashiSaadeh = {}; var _gerehNeshani = null; function kelidKash(neshani) { if (!_gerehNeshani) _gerehNeshani = document.createElement('a'); _gerehNeshani.href = neshani; return _gerehNeshani.href; } function kashKashiSet(neshani, img) { var kelidKamel = kelidKash(neshani); if (kashKashi) { if (kashKashi.has(kelidKamel)) kashKashi.delete(kelidKamel); kashKashi.set(kelidKamel, img); while (kashKashi.size > KASH_KASHI_SAGHF) { var kohanTarin = kashKashi.keys().next().value; kashKashi.delete(kohanTarin); } } else { kashKashiSaadeh[kelidKamel] = img; } } function kashKashiGet(neshani) { var kelidKamel = kelidKash(neshani); if (kashKashi) { var img = kashKashi.get(kelidKamel); if (img) { kashKashi.delete(kelidKamel); kashKashi.set(kelidKamel, img); } return img; } return kashKashiSaadeh[kelidKamel]; } function kashKashiHazf(neshani) { var kelidKamel = kelidKash(neshani); if (kashKashi) kashKashi.delete(kelidKamel); else delete kashKashiSaadeh[kelidKamel]; } function kashKashiNegah(neshani) { var kelidKamel = kelidKash(neshani); return kashKashi ? kashKashi.get(kelidKamel) : kashKashiSaadeh[kelidKamel]; } function kashKashiAndazeh() { if (kashKashi) return kashKashi.size; var n = 0; for (var k in kashKashiSaadeh) n++; return n; } function shabakehKond() { var c = (typeof navigator !== 'undefined') && (navigator.connection || navigator.mozConnection || navigator.webkitConnection); if (!c) return 0; if (c.saveData || c.effectiveType === '2g' || c.effectiveType === 'slow-2g') return 2; return c.effectiveType === '3g' ? 1 : 0; } function Nogte(x, y) { this.x = x; this.y = y; } Nogte.prototype.jam = function (n) { return new Nogte(this.x + n.x, this.y + n.y); }; Nogte.prototype.tafrigh = function (n) { return new Nogte(this.x - n.x, this.y - n.y); }; function Mokan(arz, tool) { this.arz = arz; this.tool = tool; } Mokan.az = function (v) { if (v instanceof Mokan) return v; if (joftMokhtasat(v)) return new Mokan(v[0], v[1]); if (v && v.arz != null) return new Mokan(v.arz, v.tool); return null; }; Mokan.prototype.baArayeh = function () { return [this.arz, this.tool]; }; Mokan.prototype.barabar = function (m) { m = Mokan.az(m); return m && Math.abs(this.arz - m.arz) < 1e-9 && Math.abs(this.tool - m.tool) < 1e-9; }; Mokan.prototype.faseleh = function (m) { m = Mokan.az(m); var R = 6371000; var d1 = this.arz * RADIAN, d2 = m.arz * RADIAN; var da = (m.arz - this.arz) * RADIAN, dt = (m.tool - this.tool) * RADIAN; var a = Math.sin(da / 2) * Math.sin(da / 2) + Math.cos(d1) * Math.cos(d2) * Math.sin(dt / 2) * Math.sin(dt / 2); return 2 * R * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); }; function Karan(jonoobGharb, shomalShargh) { this.jg = Mokan.az(jonoobGharb); this.ss = Mokan.az(shomalShargh); } Karan.az = function (fehrest) { var kamArz = Infinity, kamTool = Infinity, ziadArz = -Infinity, ziadTool = -Infinity; for (var i = 0; i < fehrest.length; i++) { var m = Mokan.az(fehrest[i]); if (!m) continue; if (m.arz < kamArz) kamArz = m.arz; if (m.arz > ziadArz) ziadArz = m.arz; if (m.tool < kamTool) kamTool = m.tool; if (m.tool > ziadTool) ziadTool = m.tool; } return new Karan([kamArz, kamTool], [ziadArz, ziadTool]); }; Karan.prototype.markaz = function () { return new Mokan((this.jg.arz + this.ss.arz) / 2, (this.jg.tool + this.ss.tool) / 2); }; Karan.prototype.gostaresh = function (nesbat) { var da = (this.ss.arz - this.jg.arz) * nesbat; var dt = (this.ss.tool - this.jg.tool) * nesbat; return new Karan([this.jg.arz - da, this.jg.tool - dt], [this.ss.arz + da, this.ss.tool + dt]); }; Karan.prototype.darbardarad = function (m) { m = Mokan.az(m); return m.arz >= this.jg.arz && m.arz <= this.ss.arz && m.tool >= this.jg.tool && m.tool <= this.ss.tool; }; function tasvir(arz, tool, bz) { var meghyas = ANDAZE_KASHI * Math.pow(2, bz); var s = mahdud(Math.sin(arz * RADIAN), -0.9999, 0.9999); return new Nogte( (tool + 180) / 360 * meghyas, (0.5 - Math.log((1 + s) / (1 - s)) / (4 * Math.PI)) * meghyas ); } function vaTasvir(x, y, bz) { var meghyas = ANDAZE_KASHI * Math.pow(2, bz); var n = Math.PI - 2 * Math.PI * (y / meghyas); return new Mokan( 180 / Math.PI * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n))), x / meghyas * 360 - 180 ); } var ARZ_MARKATOR_HAD = 85.05112878; function mokanNormal(mokan) { var tool = ((mokan.tool + 180) % 360 + 360) % 360 - 180; var arz = mahdud(mokan.arz, -ARZ_MARKATOR_HAD, ARZ_MARKATOR_HAD); return new Mokan(arz, tool); } function Nashani() { this._goosh = {}; } Nashani.prototype.on = function (naam, kar, hamin) { var haa = (naam || '').split(' '); for (var i = 0; i < haa.length; i++) { if (!haa[i]) continue; (this._goosh[haa[i]] = this._goosh[haa[i]] || []).push({ kar: kar, hamin: hamin || this }); } return this; }; Nashani.prototype.off = function (naam, kar) { if (!naam) { this._goosh = {}; return this; } var list = this._goosh[naam]; if (!list) return this; if (!kar) { delete this._goosh[naam]; return this; } for (var i = list.length - 1; i >= 0; i--) if (list[i].kar === kar) list.splice(i, 1); return this; }; Nashani.prototype.yekbar = function (naam, kar, hamin) { var khod = this; function poosh() { khod.off(naam, poosh); kar.apply(hamin || khod, arguments); } return this.on(naam, poosh, hamin); }; Nashani.prototype.partab = function (naam, dadeh) { var list = this._goosh[naam]; if (!list) return this; dadeh = dadeh || {}; dadeh.gooneh = naam; dadeh.hadaf = dadeh.hadaf || this; var kopi = list.slice(); for (var i = 0; i < kopi.length; i++) kopi[i].kar.call(kopi[i].hamin, dadeh); return this; }; Nashani.prototype.darad = function (naam) { return !!(this._goosh[naam] && this._goosh[naam].length); }; function baRoydad(sazande) { for (var k in Nashani.prototype) { if (Nashani.prototype.hasOwnProperty(k)) sazande.prototype[k] = Nashani.prototype[k]; } } function Laye() { Nashani.call(this); } baRoydad(Laye); Laye.prototype.afzoodanBe = function (naghshe) { this._naghshe = naghshe; naghshe._sabtLaye(this); if (this._benshan) this._benshan(); this.partab('afzoodan', { laye: this }); return this; }; Laye.prototype.hazf = function () { if (!this._naghshe) return this; if (this._bardar) this._bardar(); this._naghshe._hazfLaye(this); this.partab('hazf', { laye: this }); this._naghshe = null; return this; }; Laye.prototype.roiNaghshe = function () { return !!this._naghshe; }; function LayeKashi(nesahni, gozineh) { Laye.call(this); this._nesahni = nesahni || KASHI_PISHFARZ; this.g = darham({ kamZoom: 0, ziadZoom: 19, shefafiat: 1, etebar: '', zirdaman: null, kelasKashi: '', kamZoomBoomi: null, ziadZoomBoomi: null, tizNama: false, hamzamani: null, pishVakeshiBikar: true }, gozineh); this._kashiha = {}; this._trazha = {}; this._saf = []; this._rezerv = {}; this._bikarDarRah = {}; this._darRah = 0; this._hamzamani = this.g.hamzamani || (shabakehKond() ? KASHI_HAMZAMANI_KOND : KASHI_HAMZAMANI); this._amar = { darkhast: 0, residan: 0, khata: 0, talashDobareh: 0, laghv: 0, laghvSaf: 0, azKash: 0, niya: 0, poshtiban: 0, pishVakeshi: 0 }; } LayeKashi.prototype = Object.create(Laye.prototype); LayeKashi.prototype.constructor = LayeKashi; LayeKashi.prototype._benshan = function () { var n = this._naghshe; this._daman = sakhtOnsor('div', 'mz-daman mz-daman-kashi', n._damanKashi); this._daman.style.opacity = this.g.shefafiat; if (this.g.etebar && n._etebarAbzar) n._etebarAbzar.afzoodan(this.g.etebar); var khod = this; this._barKhat = function () { for (var k in khod._kashiha) { var rec = khod._kashiha[k]; if (rec.vaz === 4) { rec.vaz = 0; rec.talash = 0; rec.dor = (rec.dor || 0) + 1; rec.sakhtAz = zamanAknoon(); khod._saf.push(rec); } } khod.tazeh(); }; if (window.addEventListener) window.addEventListener('online', this._barKhat); this.tazeh(); }; LayeKashi.prototype._bardar = function () { this._pakHame(); if (this._tzZamansanj) { clearTimeout(this._tzZamansanj); this._tzZamansanj = null; } if (this._bikar) { clearTimeout(this._bikar); this._bikar = null; } if (this._barKhat && window.removeEventListener) window.removeEventListener('online', this._barKhat); if (this._daman && this._daman.parentNode) this._daman.parentNode.removeChild(this._daman); this._daman = null; this._mabdaGhabli = null; }; LayeKashi.prototype._zirdaman = function (x, y) { var s = this.g.zirdaman; if (!s) return ''; if (typeof s === 'string') s = s.split(''); return s[Math.abs(x + y) % s.length]; }; LayeKashi.prototype._neshaniKashi = function (z, x, y) { return this._nesahni .replace('{z}', z).replace('{x}', x).replace('{y}', y) .replace('{s}', this._zirdaman(x, y)); }; var KASHI_HAMZAMANI = 16; var KASHI_HAMZAMANI_KOND = 6; var KASHI_TALASH_DOBAREH = 3; var KASHI_TAKHIR_DOBAREH = [500, 1500, 4000]; var KASHI_MOHLAT_BAR = 20000; var KASHI_AZMOON_DOBAREH = 15000; var KASHI_MAHV_MS = 140; var KASHI_ZIAD_NIYA = 5; var KASHI_ZIAD_FARZAND = 2; var KASHI_ZHARFA_POSHTIBAN = 3; var KASHI_MOHLAT_NIYA = 350; var PISH_VAKESHI_MOHLAT = 900; var PISH_BAR_MOHLAT = 1600; var BIKAR_MOHLAT = 450; var TASVIR_TOHI = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='; function kelidKashi(z, x, y) { return z + '/' + x + '/' + y; } function pichesh(x, tedad) { return ((x % tedad) + tedad) % tedad; } function bazehKashi(mx, my, pahna, boland, z, hashieh) { var tedad = Math.pow(2, z); return { x0: Math.floor(mx / ANDAZE_KASHI) - hashieh, x1: Math.floor((mx + pahna) / ANDAZE_KASHI) + hashieh, y0: Math.max(0, Math.floor(my / ANDAZE_KASHI) - hashieh), y1: Math.min(tedad - 1, Math.floor((my + boland) / ANDAZE_KASHI) + hashieh), tedad: tedad }; } function gozineshPooshesh(khasteh, vaziat, azKash, kamTraz, ziadTraz) { var negah = {}, biPooshesh = []; var farzandan = function (z, x, y, d) { if (d === 0 || z + 1 > ziadTraz) return false; var kamel = true; for (var a = 0; a < 2; a++) { for (var b = 0; b < 2; b++) { var fx = x * 2 + a, fy = y * 2 + b; if (vaziat(z + 1, fx, fy) === 2) negah[kelidKashi(z + 1, fx, fy)] = true; else if (!farzandan(z + 1, fx, fy, d - 1)) kamel = false; } } return kamel; }; for (var i = 0; i < khasteh.length; i++) { var k = khasteh[i]; if (vaziat(k.z, k.x, k.y) === 2) continue; if (farzandan(k.z, k.x, k.y, KASHI_ZIAD_FARZAND)) continue; var poosh = false, darRah = false; for (var d = 1; d <= KASHI_ZIAD_NIYA && !poosh; d++) { var nz = k.z - d; if (nz < kamTraz) break; var t = Math.pow(2, d), ax = Math.floor(k.x / t), ay = Math.floor(k.y / t); var v = vaziat(nz, ax, ay); if (v === 0 && azKash && azKash(nz, ax, ay)) v = 2; if (v === 2) { negah[kelidKashi(nz, ax, ay)] = true; poosh = true; } else if (v === 3 && d <= 2 && !darRah) { negah[kelidKashi(nz, ax, ay)] = true; darRah = true; } } if (!poosh) biPooshesh.push(k); } return { negah: negah, biPooshesh: biPooshesh }; } LayeKashi.prototype._bazehBoomi = function () { var g = this.g; return { kam: g.kamZoomBoomi == null ? g.kamZoom : g.kamZoomBoomi, ziad: g.ziadZoomBoomi == null ? g.ziadZoom : g.ziadZoomBoomi }; }; LayeKashi.prototype._trazKashi = function (z) { var b = this._bazehBoomi(); var ezafe = (this.g.tizNama && (window.devicePixelRatio || 1) >= 1.5) ? 1 : 0; return mahdud(z + ezafe, b.kam, b.ziad); }; LayeKashi.prototype._trazChideman = function () { var n = this._naghshe; var z = n._charkhPaye != null ? n._charkhPaye : Math.round(n._bozorgnamai); var c = tasvir(n._markazMokan.arz, n._markazMokan.tool, z); return { z: z, mabda: new Nogte(c.x - n._pahna / 2, c.y - n._boland / 2) }; }; LayeKashi.prototype._traz = function (L, mx, my) { var tr = this._trazha[L]; if (!tr) { tr = this._trazha[L] = { z: L, shomar: 0, tar: '', ox: Math.floor(mx / ANDAZE_KASHI) * ANDAZE_KASHI, oy: Math.floor(my / ANDAZE_KASHI) * ANDAZE_KASHI, el: sakhtOnsor('div', 'mz-traz', this._daman) }; tr.el.style.zIndex = L; tr.el.setAttribute('data-tr', L); } return tr; }; LayeKashi.prototype._chidanTrazha = function (z, mabda) { var dpr = window.devicePixelRatio || 1; for (var L in this._trazha) { var tr = this._trazha[L], s = Math.pow(2, z - tr.z); var X = tr.ox * s - mabda.x, Y = tr.oy * s - mabda.y; if (Math.abs(X) > 4e6 || Math.abs(Y) > 4e6) { this._bazPayeh(tr, mabda.x / s, mabda.y / s); X = tr.ox * s - mabda.x; Y = tr.oy * s - mabda.y; } var tar = 'translate3d(' + (Math.round(X * dpr) / dpr) + 'px,' + (Math.round(Y * dpr) / dpr) + 'px,0)' + (s === 1 ? '' : ' scale(' + s + ')'); if (tr.tar !== tar) { tr.el.style.transform = tar; tr.tar = tar; } } }; LayeKashi.prototype._bazPayeh = function (tr, mx, my) { tr.ox = Math.floor(mx / ANDAZE_KASHI) * ANDAZE_KASHI; tr.oy = Math.floor(my / ANDAZE_KASHI) * ANDAZE_KASHI; for (var k in this._kashiha) { var rec = this._kashiha[k]; if (rec.z !== tr.z) continue; rec.el.style.left = (rec.x * ANDAZE_KASHI - tr.ox) + 'px'; rec.el.style.top = (rec.y * ANDAZE_KASHI - tr.oy) + 'px'; } }; LayeKashi.prototype._jabejaJahan = function (z, mabda) { var p = this._mabdaGhabli; this._mabdaGhabli = { x: mabda.x, z: z }; if (!p) return; var k = Math.round((mabda.x - p.x * Math.pow(2, z - p.z)) / (ANDAZE_KASHI * Math.pow(2, z))); if (!k) return; var no = {}, rez = {}; for (var kelid in this._kashiha) { var rec = this._kashiha[kelid]; rec.x += k * Math.pow(2, rec.z); rec.kelid = kelidKashi(rec.z, rec.x, rec.y); if (this._rezerv[kelid] != null) rez[rec.kelid] = this._rezerv[kelid]; no[rec.kelid] = rec; } this._kashiha = no; this._rezerv = rez; for (var L in this._trazha) { this._trazha[L].ox += k * ANDAZE_KASHI * Math.pow(2, +L); this._trazha[L].tar = ''; } }; LayeKashi.prototype._sakhtKashi = function (z, x, y, olaviat) { var kelid = kelidKashi(z, x, y), rec = this._kashiha[kelid]; if (rec) return rec; var tr = this._trazha[z], wx = pichesh(x, Math.pow(2, z)); var neshani = this._neshaniKashi(z, wx, y); rec = { z: z, x: x, y: y, wx: wx, kelid: kelid, neshani: neshani, vaz: 0, talash: 0, amadehAz: 0, sakhtAz: zamanAknoon(), ol: olaviat == null ? 0 : olaviat, didani: false }; var el = kashKashiGet(neshani); if (el && el.complete && el.naturalWidth > 0) { kashKashiHazf(neshani); el.className = 'mz-kashi mz-kashi-fori mz-kashi-amadeh ' + this.g.kelasKashi; rec.vaz = 2; this._amar.azKash++; } else { el = document.createElement('img'); el.className = 'mz-kashi ' + this.g.kelasKashi; el.alt = ''; el.decoding = 'async'; el.setAttribute('draggable', 'false'); this._saf.push(rec); } el.setAttribute('data-tr', z); el.style.left = (x * ANDAZE_KASHI - tr.ox) + 'px'; el.style.top = (y * ANDAZE_KASHI - tr.oy) + 'px'; rec.el = el; tr.el.appendChild(el); tr.shomar++; this._kashiha[kelid] = rec; return rec; }; LayeKashi.prototype._pishSaf = function () { var saf = this._saf; while (this._darRah < this._hamzamani && saf.length) { var rec = saf.shift(); if (rec.raft || rec.vaz !== 0) continue; this._aghazBar(rec); } }; LayeKashi.prototype._aghazBar = function (rec) { var khod = this, el = rec.el; rec.vaz = 1; this._darRah++; this._amar.darkhast++; if (!rec.goosh) { rec.goosh = true; el.addEventListener('load', function () { khod._residKashi(rec); }); el.addEventListener('error', function () { khod._khataKashi(rec); }); } rec.mohlat = setTimeout(function () { rec.mohlat = null; khod._khataKashi(rec); }, KASHI_MOHLAT_BAR); el.src = rec.talash ? rec.neshani + (rec.neshani.indexOf('?') === -1 ? '?' : '&') + '_r=' + rec.talash + (rec.dor ? '-' + rec.dor : '') : rec.neshani; }; LayeKashi.prototype._residKashi = function (rec) { if (rec.raft || rec.vaz !== 1) return; var khod = this, el = rec.el; if (!(el.naturalWidth > 0)) { this._khataKashi(rec); return; } if (rec.mohlat) { clearTimeout(rec.mohlat); rec.mohlat = null; } this._darRah--; rec.vaz = 5; var amadeh = function () { if (rec.raft || rec.vaz !== 5) return; rec.vaz = 2; rec.amadehAz = zamanAknoon(); khod._amar.residan++; el.classList.add('mz-kashi-amadeh'); khod._tazehBaTakhir(KASHI_MAHV_MS + 30); }; if (el.decode) el.decode().then(amadeh, amadeh); else amadeh(); this._pishSaf(); }; LayeKashi.prototype._khataKashi = function (rec) { if (rec.raft || rec.vaz !== 1) return; var khod = this; if (rec.mohlat) { clearTimeout(rec.mohlat); rec.mohlat = null; } this._darRah--; if (rec.talash < KASHI_TALASH_DOBAREH) { var takhir = KASHI_TAKHIR_DOBAREH[rec.talash] || 4000; rec.talash++; rec.vaz = 3; this._amar.talashDobareh++; rec.zamansanj = setTimeout(function () { rec.zamansanj = null; if (rec.raft) return; rec.vaz = 0; khod._saf.unshift(rec); khod._pishSaf(); }, takhir); } else { rec.vaz = 4; rec.khataAz = zamanAknoon(); this._amar.khata++; this._tazehBaTakhir(0); } this._pishSaf(); }; LayeKashi.prototype._bardashtanKashi = function (rec) { var el = rec.el, vaz = rec.vaz; rec.raft = true; if (rec.zamansanj) { clearTimeout(rec.zamansanj); rec.zamansanj = null; } if (rec.mohlat) { clearTimeout(rec.mohlat); rec.mohlat = null; } if (el.parentNode) el.parentNode.removeChild(el); if (vaz === 1) { this._darRah--; this._amar.laghv++; el.src = TASVIR_TOHI; } else if (vaz === 0 || vaz === 3) { this._amar.laghvSaf++; } else if (vaz === 2) { el.style.left = ''; el.style.top = ''; kashKashiSet(rec.neshani, el); } var tr = this._trazha[rec.z]; if (tr && --tr.shomar <= 0) { if (tr.el.parentNode) tr.el.parentNode.removeChild(tr.el); delete this._trazha[rec.z]; } delete this._kashiha[rec.kelid]; }; LayeKashi.prototype._pakHame = function () { for (var k in this._kashiha) this._bardashtanKashi(this._kashiha[k]); this._saf.length = 0; this._rezerv = {}; }; LayeKashi.prototype.tazeh = function () { var n = this._naghshe; if (!n || !this._daman) return; var ch = this._trazChideman(), z = ch.z, mabda = ch.mabda, g = this.g, khod = this; if (z < g.kamZoom || z > g.ziadZoom) { this._pakHame(); return; } this._jabejaJahan(z, mabda); var boomi = this._bazehBoomi(); var zk = this._trazKashi(z), f = Math.pow(2, zk - z); var zz = n._zoomZendeh, dx0 = 0, dy0 = 0, dx1 = n._pahna, dy1 = n._boland; if (zz && zz.s < 1 && zz.s > 0.2) { dx0 = zz.x - zz.x / zz.s; dy0 = zz.y - zz.y / zz.s; dx1 = zz.x + (n._pahna - zz.x) / zz.s; dy1 = zz.y + (n._boland - zz.y) / zz.s; } var mx = (mabda.x + dx0) * f, my = (mabda.y + dy0) * f, pahna = (dx1 - dx0) * f, boland = (dy1 - dy0) * f; this._traz(zk, mx, my); var b = bazehKashi(mx, my, pahna, boland, zk, 1); var bd = bazehKashi(mx, my, pahna, boland, zk, 0); var cx = (mx + pahna / 2) / ANDAZE_KASHI - 0.5, cy = (my + boland / 2) / ANDAZE_KASHI - 0.5; var khasteh = [], khastehK = {}, akoon = zamanAknoon(), rec, tx, ty, shekasteh = false, i; for (tx = b.x0; tx <= b.x1; tx++) { for (ty = b.y0; ty <= b.y1; ty++) { rec = this._sakhtKashi(zk, tx, ty); rec.didani = tx >= bd.x0 && tx <= bd.x1 && ty >= bd.y0 && ty <= bd.y1; rec.ol = (tx - cx) * (tx - cx) + (ty - cy) * (ty - cy) + (rec.didani ? 0 : 400); if (rec.vaz === 4 && akoon - rec.khataAz > KASHI_AZMOON_DOBAREH) { rec.vaz = 0; rec.talash = KASHI_TALASH_DOBAREH; rec.dor = (rec.dor || 0) + 1; rec.sakhtAz = akoon; this._saf.push(rec); } if (rec.vaz === 4) shekasteh = true; if (rec.didani) khasteh.push(rec); khastehK[rec.kelid] = true; } } var vaziat = function (vz, vx, vy) { var r = khod._kashiha[kelidKashi(vz, vx, vy)]; if (!r) return 0; if (r.vaz === 2) return (akoon - r.amadehAz >= KASHI_MAHV_MS) ? 2 : 3; return (r.vaz === 1 || r.vaz === 5) ? 3 : 1; }; var azKash = function (vz, vx, vy) { var el = kashKashiNegah(khod._neshaniKashi(vz, pichesh(vx, Math.pow(2, vz)), vy)); if (!(el && el.complete && el.naturalWidth > 0)) return false; var fv = Math.pow(2, vz - z); khod._traz(vz, mabda.x * fv, mabda.y * fv); khod._sakhtKashi(vz, vx, vy); return true; }; var p = gozineshPooshesh(khasteh, vaziat, azKash, boomi.kam, boomi.ziad); var montazer = false, hameAmadeh = khasteh.length > 0; for (i = 0; i < khasteh.length; i++) { if (vaziat(khasteh[i].z, khasteh[i].x, khasteh[i].y) !== 2) { hameAmadeh = false; break; } } if (p.biPooshesh.length * 2 >= khasteh.length && khasteh.length) { for (i = 0; i < p.biPooshesh.length; i++) { var kp = p.biPooshesh[i], pz = Math.max(boomi.kam, kp.z - KASHI_ZHARFA_POSHTIBAN); if (pz >= kp.z) continue; var tp = Math.pow(2, kp.z - pz), px = Math.floor(kp.x / tp), py = Math.floor(kp.y / tp); var pr = this._kashiha[kelidKashi(pz, px, py)]; if (!pr) { var fp = Math.pow(2, pz - z); this._traz(pz, mabda.x * fp, mabda.y * fp); pr = this._sakhtKashi(pz, px, py, -2000); this._amar.poshtiban++; } p.negah[pr.kelid] = true; } } var niazmand = p.biPooshesh.slice(); for (i = 0; i < khasteh.length; i++) if (khasteh[i].vaz === 4 && niazmand.indexOf(khasteh[i]) === -1) niazmand.push(khasteh[i]); for (i = 0; i < niazmand.length; i++) { var k = niazmand[i]; if (k.vaz !== 4 && akoon - k.sakhtAz < KASHI_MOHLAT_NIYA) { montazer = true; continue; } for (var d = 1; d <= KASHI_ZIAD_NIYA; d++) { var nz = k.z - d; if (nz < boomi.kam) break; var t = Math.pow(2, d), ax = Math.floor(k.x / t), ay = Math.floor(k.y / t); var nr = this._kashiha[kelidKashi(nz, ax, ay)]; if (!nr) { var fn = Math.pow(2, nz - z); this._traz(nz, mabda.x * fn, mabda.y * fn); nr = this._sakhtKashi(nz, ax, ay, -1000 + d); this._amar.niya++; } p.negah[nr.kelid] = true; if (nr.vaz !== 4) break; } } if (n._charkhRaf != null && n._charkhHadaf != null && n._charkhHadaf < z && n._charkhNoghte) { var sH = Math.pow(2, n._charkhHadaf - z), lang = n._charkhNoghte; var zp = Math.max(boomi.kam, this._trazKashi(n._charkhHadaf) - 2); if (zp < zk) { var fh = Math.pow(2, zp - z); var hx = (mabda.x + lang.x - lang.x / sH) * fh, hy = (mabda.y + lang.y - lang.y / sH) * fh; var bh = bazehKashi(hx, hy, n._pahna / sH * fh, n._boland / sH * fh, zp, 0); this._traz(zp, hx, hy); for (tx = bh.x0; tx <= bh.x1; tx++) { for (ty = bh.y0; ty <= bh.y1; ty++) { rec = this._kashiha[kelidKashi(zp, tx, ty)]; if (!rec) { rec = this._sakhtKashi(zp, tx, ty, -1500); this._amar.poshtiban++; } p.negah[rec.kelid] = true; } } } } var rez = this._rezerv; for (var kelid in this._kashiha) { if (khastehK[kelid] || p.negah[kelid]) continue; if (rez[kelid] != null) { if (rez[kelid] > akoon) continue; delete rez[kelid]; } this._bardashtanKashi(this._kashiha[kelid]); } if (this._saf.length > 1) this._saf.sort(function (a, c) { return a.ol - c.ol; }); this._pishSaf(); for (var L in this._trazha) { if (this._trazha[L].shomar <= 0) { if (this._trazha[L].el.parentNode) this._trazha[L].el.parentNode.removeChild(this._trazha[L].el); delete this._trazha[L]; } } this._chidanTrazha(z, mabda); if (montazer) this._tazehBaTakhir(KASHI_MOHLAT_NIYA + 20); else if (shekasteh) this._tazehBaTakhir(KASHI_AZMOON_DOBAREH + 50); if (this._bikar) { clearTimeout(this._bikar); this._bikar = null; } if (hameAmadeh && g.pishVakeshiBikar !== false) { this._bikar = setTimeout(function () { khod._bikar = null; khod._pishVakeshiBikar(); }, BIKAR_MOHLAT); } }; LayeKashi.prototype._tazehBaTakhir = function (ms) { var khod = this, zaman = zamanAknoon() + ms; if (this._tzZamansanj) { if (this._tzZaman <= zaman) return; clearTimeout(this._tzZamansanj); } this._tzZaman = zaman; this._tzZamansanj = setTimeout(function () { khod._tzZamansanj = null; khod.tazeh(); }, ms); }; LayeKashi.prototype._rezervMostatil = function (zk, b, mohlat, mx, my, olaviat) { var enghesa = zamanAknoon() + mohlat; this._traz(zk, mx, my); for (var tx = b.x0; tx <= b.x1; tx++) { for (var ty = b.y0; ty <= b.y1; ty++) { if (ty < 0 || ty >= b.tedad) continue; var rec = this._sakhtKashi(zk, tx, ty, olaviat); this._rezerv[rec.kelid] = enghesa; } } }; LayeKashi.prototype.pishBar = function (zHadaf, markazMokan) { var n = this._naghshe; if (!n || !this._daman) return; zHadaf = Math.round(zHadaf); if (zHadaf < this.g.kamZoom || zHadaf > this.g.ziadZoom) return; var zk = this._trazKashi(zHadaf), f = Math.pow(2, zk - zHadaf); var c = tasvir(markazMokan.arz, markazMokan.tool, zHadaf); var mx = (c.x - n._pahna / 2) * f, my = (c.y - n._boland / 2) * f; this._rezervMostatil(zk, bazehKashi(mx, my, n._pahna * f, n._boland * f, zk, 0), PISH_BAR_MOHLAT, mx, my, 500); var ch = this._trazChideman(); this._chidanTrazha(ch.z, ch.mabda); this._pishSaf(); }; LayeKashi.prototype._pishVakeshiHalgheh = function (z, mabda, pahna, boland, amghAfghi, amghAmoodi) { if (!this._naghshe || !this._daman) return; if (z < this.g.kamZoom || z > this.g.ziadZoom) return; var zk = this._trazKashi(z), f = Math.pow(2, zk - z); var mx = mabda.x * f, my = mabda.y * f; var b = bazehKashi(mx, my, pahna * f, boland * f, zk, 1); if (amghAfghi) { this._rezervMostatil(zk, { x0: amghAfghi > 0 ? b.x1 + 1 : b.x0 - Math.abs(amghAfghi), x1: amghAfghi > 0 ? b.x1 + amghAfghi : b.x0 - 1, y0: b.y0, y1: b.y1, tedad: b.tedad }, PISH_VAKESHI_MOHLAT, mx, my, 800); } if (amghAmoodi) { this._rezervMostatil(zk, { x0: b.x0, x1: b.x1, tedad: b.tedad, y0: amghAmoodi > 0 ? b.y1 + 1 : b.y0 - Math.abs(amghAmoodi), y1: amghAmoodi > 0 ? b.y1 + amghAmoodi : b.y0 - 1 }, PISH_VAKESHI_MOHLAT, mx, my, 800); } this._pishSaf(); }; LayeKashi.prototype._pishVakeshiBikar = function () { var n = this._naghshe; if (!n || !this._daman || shabakehKond() > 1) return; var ch = this._trazChideman(), boomi = this._bazehBoomi(), khod = this; var zk = this._trazKashi(ch.z), fehrest = [], f, b, tx, ty; if (zk - 1 >= boomi.kam) { f = Math.pow(2, zk - 1 - ch.z); b = bazehKashi(ch.mabda.x * f, ch.mabda.y * f, n._pahna * f, n._boland * f, zk - 1, 0); for (tx = b.x0; tx <= b.x1; tx++) for (ty = b.y0; ty <= b.y1; ty++) fehrest.push([zk - 1, tx, ty]); } for (var up = 2; up <= 8 && zk - up >= boomi.kam; up++) { f = Math.pow(2, zk - up - ch.z); b = bazehKashi(ch.mabda.x * f, ch.mabda.y * f, n._pahna * f, n._boland * f, zk - up, 0); for (tx = b.x0; tx <= b.x1; tx++) for (ty = b.y0; ty <= b.y1; ty++) fehrest.push([zk - up, tx, ty]); } if (zk + 1 <= boomi.ziad && !shabakehKond()) { f = Math.pow(2, zk + 1 - ch.z); var mx = (ch.mabda.x + n._pahna / 2) * f / ANDAZE_KASHI, my = (ch.mabda.y + n._boland / 2) * f / ANDAZE_KASHI; for (tx = Math.floor(mx - 1); tx <= Math.floor(mx); tx++) for (ty = Math.floor(my - 1); ty <= Math.floor(my); ty++) fehrest.push([zk + 1, tx, ty]); } var shomar = 0; for (var i = 0; i < fehrest.length && shomar < 40; i++) { var k = fehrest[i], tedad = Math.pow(2, k[0]); if (k[2] < 0 || k[2] >= tedad || this._kashiha[kelidKashi(k[0], k[1], k[2])]) continue; var neshani = this._neshaniKashi(k[0], pichesh(k[1], tedad), k[2]); if (kashKashiNegah(neshani) || this._bikarDarRah[neshani]) continue; shomar++; (function (neshani) { var im = new Image(); im.decoding = 'async'; khod._bikarDarRah[neshani] = im; im.onload = function () { delete khod._bikarDarRah[neshani]; if (im.naturalWidth > 0) { im.className = 'mz-kashi'; kashKashiSet(neshani, im); khod._amar.pishVakeshi++; } }; im.onerror = function () { delete khod._bikarDarRah[neshani]; }; im.src = neshani; })(neshani); } }; LayeKashi.prototype.amar = function () { var a = this._amar, dom = 0, amadeh = 0; for (var k in this._kashiha) { dom++; if (this._kashiha[k].vaz === 2) amadeh++; } return { darkhast: a.darkhast, residan: a.residan, khata: a.khata, talashDobareh: a.talashDobareh, laghv: a.laghv, laghvSaf: a.laghvSaf, azKash: a.azKash, niya: a.niya, poshtiban: a.poshtiban, pishVakeshi: a.pishVakeshi, darRah: this._darRah, saf: this._saf.length, dom: dom, amadeh: amadeh, kash: kashKashiAndazeh() }; }; LayeKashi.prototype.tanzimShefafiat = function (v) { this.g.shefafiat = v; if (this._daman) this._daman.style.opacity = v; return this; }; LayeKashi.prototype.tanzimNeshani = function (u) { this._nesahni = u; if (this._daman) { this._pakHame(); this._mabdaGhabli = null; this.tazeh(); } return this; }; var NIM_DOR3857 = 20037508.342789244; function LayeKashiWMS(nesahni, gozineh) { LayeKashi.call(this, nesahni, gozineh); this.g = darham({ layeha: '', shive: '', gooneh: 'image/png', shafaf: true, naskheh: '1.3.0', srs: 'EPSG:3857', kamZoom: 0, ziadZoom: 19, shefafiat: 1, etebar: '', kelasKashi: '' }, gozineh); } LayeKashiWMS.prototype = Object.create(LayeKashi.prototype); LayeKashiWMS.prototype.constructor = LayeKashiWMS; LayeKashiWMS.prototype._neshaniKashi = function (z, x, y) { var tedad = Math.pow(2, z); var andaz = 2 * NIM_DOR3857 / tedad; var minX = -NIM_DOR3857 + x * andaz; var maxX = minX + andaz; var maxY = NIM_DOR3857 - y * andaz; var minY = maxY - andaz; var g = this.g; var yekmimSeh = g.naskheh === '1.3.0'; var bbox = minX + ',' + minY + ',' + maxX + ',' + maxY; var josh = this._nesahni.indexOf('?') === -1 ? '?' : '&'; var p = 'SERVICE=WMS&REQUEST=GetMap&VERSION=' + g.naskheh + '&LAYERS=' + encodeURIComponent(g.layeha) + '&STYLES=' + encodeURIComponent(g.shive) + '&FORMAT=' + encodeURIComponent(g.gooneh) + '&TRANSPARENT=' + (g.shafaf ? 'TRUE' : 'FALSE') + (yekmimSeh ? '&CRS=' : '&SRS=') + encodeURIComponent(g.srs) + '&WIDTH=' + ANDAZE_KASHI + '&HEIGHT=' + ANDAZE_KASHI + '&BBOX=' + bbox; return this._nesahni + josh + p; }; function PushteshTasvir(neshani, karan, gozineh) { Laye.call(this); this._neshani = neshani; this._karan = karan instanceof Karan ? karan : new Karan(karan[0], karan[1]); this.g = darham({ shefafiat: 1, kelas: '', tabeshgar: false }, gozineh); } PushteshTasvir.prototype = Object.create(Laye.prototype); PushteshTasvir.prototype.constructor = PushteshTasvir; PushteshTasvir.prototype._benshan = function () { var n = this._naghshe; this._onsor = sakhtOnsor('img', 'mz-pushtesh-tasvir ' + this.g.kelas, n._damanKashi); this._onsor.src = this._neshani; this._onsor.alt = ''; this._onsor.style.opacity = this.g.shefafiat; if (this.g.tabeshgar) this._onsor.style.imageRendering = 'pixelated'; this.bekesh(); }; PushteshTasvir.prototype._bardar = function () { if (this._onsor && this._onsor.parentNode) this._onsor.parentNode.removeChild(this._onsor); }; PushteshTasvir.prototype.bekesh = function () { if (!this._naghshe || !this._onsor) return; var jg = this._naghshe.mokanBePiksel(new Mokan(this._karan.jg.arz, this._karan.jg.tool)); var ss = this._naghshe.mokanBePiksel(new Mokan(this._karan.ss.arz, this._karan.ss.tool)); this._onsor.style.left = Math.min(jg.x, ss.x) + 'px'; this._onsor.style.top = Math.min(jg.y, ss.y) + 'px'; this._onsor.style.width = Math.abs(ss.x - jg.x) + 'px'; this._onsor.style.height = Math.abs(jg.y - ss.y) + 'px'; }; PushteshTasvir.prototype.tanzimShefafiat = function (v) { this.g.shefafiat = v; if (this._onsor) this._onsor.style.opacity = v; return this; }; PushteshTasvir.prototype.gereftanKaran = function () { return this._karan; }; function NeshanTasvir(gozineh) { this.g = darham({ neshani: null, andazeh: [25, 41], langar: [12, 41], langarPanjere: [1, -34], kelas: '' }, gozineh); } NeshanTasvir.prototype.sakhtOnsor = function () { var o; if (this.g.neshani) { o = document.createElement('img'); o.src = this.g.neshani; o.className = 'mz-neshan-tasvir ' + this.g.kelas; o.style.width = this.g.andazeh[0] + 'px'; o.style.height = this.g.andazeh[1] + 'px'; o.style.marginLeft = (-this.g.langar[0]) + 'px'; o.style.marginTop = (-this.g.langar[1]) + 'px'; } else { o = document.createElement('div'); o.className = 'mz-sanjagh-jaa ' + this.g.kelas; o.innerHTML = ''; } return o; }; function Neshan(mokan, gozineh) { Laye.call(this); this.mokan = Mokan.az(mokan); this.g = darham({ neshan: null, rang: '#0e8f86', keshidani: false, titr: '', zIndex: 0 }, gozineh); } Neshan.prototype = Object.create(Laye.prototype); Neshan.prototype.constructor = Neshan; Neshan.prototype._benshan = function () { var n = this._naghshe, khod = this; var neshan = this.g.neshan || new NeshanTasvir({}); this._onsor = neshan.sakhtOnsor(); this._onsor.classList.add('mz-neshan'); this._onsor.style.setProperty('--mz-rang', this.g.rang); if (this.g.titr) this._onsor.title = this.g.titr; if (this.g.zIndex) this._onsor.style.zIndex = this.g.zIndex; n._damanNeshan.appendChild(this._onsor); this._onsor.addEventListener('click', function (e) { e.stopPropagation(); khod.partab('click', { mokan: khod.mokan }); if (khod._panjere) khod.bazPanjere(); }); this._onsor.addEventListener('mouseenter', function () { khod.partab('darun'); if (khod._namak) khod._namak.nemayesh(); }); this._onsor.addEventListener('mouseleave', function () { khod.partab('biroun'); if (khod._namak) khod._namak.penhan(); }); if (this._namak && !this._namak._onsor) { this._namak.bazBar(n, this.mokan); this._namak.penhan(); } if (this.g.keshidani) this._bastanKeshesh(); this.jaGozari(); }; Neshan.prototype._bardar = function () { if (this._onsor && this._onsor.parentNode) this._onsor.parentNode.removeChild(this._onsor); if (this._panjere) this._panjere.hazf(); if (this._namak) this._namak.hazf(); }; Neshan.prototype.jaGozari = function () { if (!this._naghshe || !this._onsor) return; var p = this._naghshe.mokanBePiksel(this.mokan); this._onsor.style.left = p.x + 'px'; this._onsor.style.top = p.y + 'px'; }; Neshan.prototype.tanzimMokan = function (mokan) { this.mokan = Mokan.az(mokan); this.jaGozari(); if (this._panjere) this._panjere.tanzimMokan(this.mokan); if (this._namak) this._namak.tanzimMokan(this.mokan); this.partab('jabejaii', { mokan: this.mokan }); return this; }; Neshan.prototype.gereftanMokan = function () { return this.mokan; }; Neshan.prototype.bastanPanjere = function (mohtava, gozineh) { this._panjere = mohtava instanceof Panjere ? mohtava : new Panjere(darham({ mohtava: mohtava }, gozineh)); this._panjere.mokan = this.mokan; return this; }; Neshan.prototype.bazPanjere = function () { if (this._panjere && this._naghshe) this._panjere.bazBar(this._naghshe, this.mokan); return this; }; Neshan.prototype.bastanNamak = function (mohtava, gozineh) { this._namak = mohtava instanceof Namak ? mohtava : new Namak(darham({ mohtava: mohtava }, gozineh)); this._namak.mokan = this.mokan; if (this._naghshe) { this._namak.bazBar(this._naghshe, this.mokan); this._namak.penhan(); } return this; }; Neshan.prototype._bastanKeshesh = function () { var khod = this, darKeshesh = false, pointerId = null; this._onsor.classList.add('mz-neshan-keshidani'); var payanKeshesh = function () { if (!darKeshesh) return; darKeshesh = false; khod._naghshe._ghofl = false; if (pointerId != null && khod._onsor.releasePointerCapture) { try { khod._onsor.releasePointerCapture(pointerId); } catch (err) {} } pointerId = null; khod.partab('keshesh-payan', { mokan: khod.mokan }); }; var paain = function (e) { darKeshesh = true; e.stopPropagation(); khod._naghshe._ghofl = true; if (e.pointerId != null && khod._onsor.setPointerCapture) { pointerId = e.pointerId; try { khod._onsor.setPointerCapture(pointerId); } catch (err) {} } khod.partab('keshesh-aghaz'); }; var harekat = function (e) { if (!darKeshesh) return; var noghte = khod._naghshe._noghteRoydad(e); var mabda = khod._naghshe._mabda(); khod.tanzimMokan(vaTasvir(mabda.x + noghte.x, mabda.y + noghte.y, Math.round(khod._naghshe._bozorgnamai))); }; if (window.PointerEvent) { this._onsor.addEventListener('pointerdown', paain); this._onsor.addEventListener('pointermove', harekat); this._onsor.addEventListener('pointerup', payanKeshesh); this._onsor.addEventListener('pointercancel', payanKeshesh); } else { this._onsor.addEventListener('mousedown', paain); window.addEventListener('mousemove', harekat); window.addEventListener('mouseup', payanKeshesh); } window.addEventListener('blur', payanKeshesh); }; function Panjere(gozineh) { Laye.call(this); this.g = darham({ mohtava: '', bastaniPazir: true, bishineTool: 240, afsat: [0, 26], kelas: '' }, gozineh); } Panjere.prototype = Object.create(Laye.prototype); Panjere.prototype.constructor = Panjere; Panjere.prototype.bazBar = function (naghshe, mokan) { this._naghshe = naghshe; this.mokan = Mokan.az(mokan) || this.mokan; if (naghshe._panjereBaz) naghshe._panjereBaz.hazf(); naghshe._panjereBaz = this; this._onsor = sakhtOnsor('div', 'mz-panjere ' + this.g.kelas, naghshe._damanRoo); this._onsor.style.maxWidth = this.g.bishineTool + 'px'; var badaneh = sakhtOnsor('div', 'mz-panjere-badaneh', this._onsor); if (typeof this.g.mohtava === 'string') badaneh.innerHTML = this.g.mohtava; else badaneh.appendChild(this.g.mohtava); sakhtOnsor('div', 'mz-panjere-nok', this._onsor); if (this.g.bastaniPazir) { var khod = this; var bastan = sakhtOnsor('button', 'mz-panjere-bastan', this._onsor); bastan.type = 'button'; bastan.innerHTML = '×'; bastan.addEventListener('click', function (e) { e.stopPropagation(); khod.hazf(); }); } this.jaGozari(); this.partab('baz'); return this; }; Panjere.prototype.jaGozari = function () { if (!this._naghshe || !this._onsor) return; var p = this._naghshe.mokanBePiksel(this.mokan); this._onsor.style.left = p.x + 'px'; this._onsor.style.top = (p.y - this.g.afsat[1]) + 'px'; }; Panjere.prototype.tanzimMokan = function (m) { this.mokan = Mokan.az(m); this.jaGozari(); return this; }; Panjere.prototype.tanzimMohtava = function (v) { this.g.mohtava = v; if (this._onsor) { var b = this._onsor.querySelector('.mz-panjere-badaneh'); if (typeof v === 'string') b.innerHTML = v; else { b.innerHTML = ''; b.appendChild(v); } } return this; }; Panjere.prototype.hazf = function () { if (this._onsor && this._onsor.parentNode) this._onsor.parentNode.removeChild(this._onsor); if (this._naghshe && this._naghshe._panjereBaz === this) this._naghshe._panjereBaz = null; this.partab('bastan'); return this; }; function Namak(gozineh) { Laye.call(this); this.g = darham({ mohtava: '', jibegah: 'bala', afsat: [0, 12], kelas: '' }, gozineh); } Namak.prototype = Object.create(Laye.prototype); Namak.prototype.constructor = Namak; Namak.prototype.bazBar = function (naghshe, mokan) { this._naghshe = naghshe; this.mokan = Mokan.az(mokan) || this.mokan; this._onsor = sakhtOnsor('div', 'mz-namak mz-namak-' + this.g.jibegah + ' ' + this.g.kelas, naghshe._damanRoo); if (typeof this.g.mohtava === 'string') this._onsor.innerHTML = this.g.mohtava; else this._onsor.appendChild(this.g.mohtava); this.jaGozari(); return this; }; Namak.prototype.jaGozari = function () { if (!this._naghshe || !this._onsor) return; var p = this._naghshe.mokanBePiksel(this.mokan); this._onsor.style.left = p.x + 'px'; this._onsor.style.top = (p.y - this.g.afsat[1]) + 'px'; }; Namak.prototype.tanzimMokan = function (m) { this.mokan = Mokan.az(m); this.jaGozari(); return this; }; Namak.prototype.nemayesh = function () { if (this._onsor) this._onsor.style.display = 'block'; return this; }; Namak.prototype.penhan = function () { if (this._onsor) this._onsor.style.display = 'none'; return this; }; Namak.prototype.hazf = function () { if (this._onsor && this._onsor.parentNode) this._onsor.parentNode.removeChild(this._onsor); return this; }; function LayeBardari(gozineh) { Laye.call(this); this.g = darham({ rang: '#0e8f86', pahna: 3, shefafiatKhat: 1, porkon: false, rangPorkon: '#0e8f86', shefafiatPorkon: 0.2, khatChin: null }, gozineh); } LayeBardari.prototype = Object.create(Laye.prototype); LayeBardari.prototype.constructor = LayeBardari; LayeBardari.prototype._benshan = function () { var n = this._naghshe, khod = this; this._shekl = document.createElementNS((function(){var d=document.createElement('div');d.innerHTML='';return d.firstChild.namespaceURI;})(), this._barchasbSvg()); this._pardazandehSabk(); n._boomSvg.appendChild(this._shekl); this._shekl.addEventListener('click', function (e) { e.stopPropagation(); khod.partab('click'); if (khod._panjere) khod._panjere.bazBar(n, khod._mokanMarkaz()); }); this.bekesh(); }; LayeBardari.prototype._bardar = function () { if (this._shekl && this._shekl.parentNode) this._shekl.parentNode.removeChild(this._shekl); }; LayeBardari.prototype._pardazandehSabk = function () { var s = this._shekl, g = this.g; s.setAttribute('stroke', g.rang); s.setAttribute('stroke-width', g.pahna); s.setAttribute('stroke-opacity', g.shefafiatKhat); s.setAttribute('stroke-linejoin', 'round'); s.setAttribute('stroke-linecap', 'round'); if (g.khatChin) s.setAttribute('stroke-dasharray', g.khatChin); if (g.porkon) { s.setAttribute('fill', g.rangPorkon); s.setAttribute('fill-opacity', g.shefafiatPorkon); } else s.setAttribute('fill', 'none'); s.setAttribute('class', 'mz-bardari'); }; LayeBardari.prototype.bastanPanjere = function (mohtava, gozineh) { this._panjere = new Panjere(darham({ mohtava: mohtava }, gozineh)); return this; }; LayeBardari.prototype.tanzimSabk = function (gozineh) { this.g = darham(this.g, gozineh); if (this._shekl) this._pardazandehSabk(); return this; }; function KhatShekaste(mokanha, gozineh) { LayeBardari.call(this, gozineh); this._noghat = this._parseh(mokanha); } KhatShekaste.prototype = Object.create(LayeBardari.prototype); KhatShekaste.prototype.constructor = KhatShekaste; KhatShekaste.prototype._parseh = function (arr) { var out = []; for (var i = 0; i < arr.length; i++) out.push(Mokan.az(arr[i])); return out; }; KhatShekaste.prototype._barchasbSvg = function () { return 'polyline'; }; KhatShekaste.prototype._mokanMarkaz = function () { return this._noghat[Math.floor(this._noghat.length / 2)]; }; KhatShekaste.prototype.bekesh = function () { if (!this._naghshe || !this._shekl) return; var n = this._naghshe, noghat = []; for (var i = 0; i < this._noghat.length; i++) { var p = n.mokanBePiksel(this._noghat[i]); noghat.push(p.x + ',' + p.y); } this._shekl.setAttribute('points', noghat.join(' ')); }; KhatShekaste.prototype.gereftanKaran = function () { return Karan.az(this._noghat); }; function ChandZeli(mokanha, gozineh) { KhatShekaste.call(this, mokanha, darham({ porkon: true }, gozineh)); } ChandZeli.prototype = Object.create(KhatShekaste.prototype); ChandZeli.prototype.constructor = ChandZeli; ChandZeli.prototype._barchasbSvg = function () { return 'polygon'; }; function Dayereh(markaz, gozineh) { LayeBardari.call(this, darham({ porkon: true }, gozineh)); this._markaz = Mokan.az(markaz); this._shoa = (gozineh && gozineh.shoa) || 200; } Dayereh.prototype = Object.create(LayeBardari.prototype); Dayereh.prototype.constructor = Dayereh; Dayereh.prototype._barchasbSvg = function () { return 'circle'; }; Dayereh.prototype._mokanMarkaz = function () { return this._markaz; }; Dayereh.prototype.bekesh = function () { if (!this._naghshe || !this._shekl) return; var n = this._naghshe; var p = n.mokanBePiksel(this._markaz); var deltaTool = this._shoa / (111320 * Math.cos(this._markaz.arz * RADIAN)); var pKomak = n.mokanBePiksel(new Mokan(this._markaz.arz, this._markaz.tool + deltaTool)); this._shekl.setAttribute('cx', p.x); this._shekl.setAttribute('cy', p.y); this._shekl.setAttribute('r', Math.abs(pKomak.x - p.x)); }; Dayereh.prototype.tanzimShoa = function (m) { this._shoa = m; this.bekesh(); return this; }; function NeshanDayereh(markaz, gozineh) { LayeBardari.call(this, darham({ porkon: true }, gozineh)); this._markaz = Mokan.az(markaz); this._shoaPiksel = (gozineh && gozineh.shoa) || 10; } NeshanDayereh.prototype = Object.create(LayeBardari.prototype); NeshanDayereh.prototype.constructor = NeshanDayereh; NeshanDayereh.prototype._barchasbSvg = function () { return 'circle'; }; NeshanDayereh.prototype._mokanMarkaz = function () { return this._markaz; }; NeshanDayereh.prototype.bekesh = function () { if (!this._naghshe || !this._shekl) return; var p = this._naghshe.mokanBePiksel(this._markaz); this._shekl.setAttribute('cx', p.x); this._shekl.setAttribute('cy', p.y); this._shekl.setAttribute('r', this._shoaPiksel); }; NeshanDayereh.prototype.tanzimMokan = function (m) { this._markaz = Mokan.az(m); this.bekesh(); return this; }; NeshanDayereh.prototype.tanzimShoa = function (p) { this._shoaPiksel = p; this.bekesh(); return this; }; NeshanDayereh.prototype.gereftanKaran = function () { return new Karan(this._markaz.baArayeh(), this._markaz.baArayeh()); }; function Mostatil(karan, gozineh) { var k = karan instanceof Karan ? karan : new Karan(karan[0], karan[1]); var goosheha = [ [k.jg.arz, k.jg.tool], [k.jg.arz, k.ss.tool], [k.ss.arz, k.ss.tool], [k.ss.arz, k.jg.tool] ]; ChandZeli.call(this, goosheha, gozineh); } Mostatil.prototype = Object.create(ChandZeli.prototype); Mostatil.prototype.constructor = Mostatil; function GoroohLaye(layeha) { Laye.call(this); this._azaa = []; if (layeha) for (var i = 0; i < layeha.length; i++) this.afzoodan(layeha[i]); } GoroohLaye.prototype = Object.create(Laye.prototype); GoroohLaye.prototype.constructor = GoroohLaye; GoroohLaye.prototype.afzoodan = function (laye) { this._azaa.push(laye); if (this._naghshe) laye.afzoodanBe(this._naghshe); return this; }; GoroohLaye.prototype.hazfOzv = function (laye) { var i = this._azaa.indexOf(laye); if (i > -1) { this._azaa.splice(i, 1); laye.hazf(); } return this; }; GoroohLaye.prototype._benshan = function () { for (var i = 0; i < this._azaa.length; i++) this._azaa[i].afzoodanBe(this._naghshe); }; GoroohLaye.prototype._bardar = function () { for (var i = 0; i < this._azaa.length; i++) this._azaa[i].hazf(); }; GoroohLaye.prototype.paksazi = function () { while (this._azaa.length) this.hazfOzv(this._azaa[0]); return this; }; GoroohLaye.prototype.pimayesh = function (kar) { for (var i = 0; i < this._azaa.length; i++) kar(this._azaa[i], i); return this; }; function GoroohArezeh(layeha) { GoroohLaye.call(this, layeha); } GoroohArezeh.prototype = Object.create(GoroohLaye.prototype); GoroohArezeh.prototype.constructor = GoroohArezeh; GoroohArezeh.prototype.gereftanKaran = function () { var noghat = []; for (var i = 0; i < this._azaa.length; i++) { var l = this._azaa[i]; if (l.mokan) noghat.push(l.mokan); else if (l.gereftanKaran) { var k = l.gereftanKaran(); noghat.push(k.jg, k.ss); } } return Karan.az(noghat); }; function LayeGeoJSON(dadeh, gozineh) { GoroohArezeh.call(this); this.g = gozineh || {}; if (dadeh) this.afzoodanDadeh(dadeh); } LayeGeoJSON.prototype = Object.create(GoroohArezeh.prototype); LayeGeoJSON.prototype.constructor = LayeGeoJSON; LayeGeoJSON.prototype._m = function (c) { return [c[1], c[0]]; }; LayeGeoJSON.prototype.afzoodanDadeh = function (dadeh) { if (dadeh.type === 'FeatureCollection') { for (var i = 0; i < dadeh.features.length; i++) this.afzoodanArezeh(dadeh.features[i]); } else if (dadeh.type === 'Feature') { this.afzoodanArezeh(dadeh); } else { this.afzoodanArezeh({ type: 'Feature', geometry: dadeh, properties: {} }); } return this; }; LayeGeoJSON.prototype.afzoodanArezeh = function (arezeh) { var hen = arezeh.geometry, khod = this, laye = null; if (!hen) return this; var c = hen.coordinates; var sabk = typeof this.g.sabkArezeh === 'function' ? darham(this.g.sabk || {}, this.g.sabkArezeh(arezeh)) : (this.g.sabk || {}); function nokhteLaye(mokan) { if (typeof khod.g.noghteBeLaye === 'function') return khod.g.noghteBeLaye(arezeh, Mokan.az(mokan)); return new Neshan(mokan, khod.g.gozineNeshan || {}); } switch (hen.type) { case 'Point': laye = nokhteLaye(this._m(c)); break; case 'MultiPoint': for (var mp = 0; mp < c.length; mp++) this._sabtOzv(nokhteLaye(this._m(c[mp])), arezeh); return this; case 'LineString': laye = new KhatShekaste(c.map(function (p) { return khod._m(p); }), sabk); break; case 'MultiLineString': for (var ml = 0; ml < c.length; ml++) this._sabtOzv(new KhatShekaste(c[ml].map(function (p) { return khod._m(p); }), sabk), arezeh); return this; case 'Polygon': laye = new ChandZeli(c[0].map(function (p) { return khod._m(p); }), sabk); break; case 'MultiPolygon': for (var i = 0; i < c.length; i++) this._sabtOzv(new ChandZeli(c[i][0].map(function (p) { return khod._m(p); }), sabk), arezeh); return this; } if (laye) this._sabtOzv(laye, arezeh); return this; }; LayeGeoJSON.prototype._sabtOzv = function (laye, arezeh) { if (this.g.harArezeh) this.g.harArezeh(arezeh, laye); laye._arezeh = arezeh; this.afzoodan(laye); return laye; }; function Abzar(gozineh) { this.g = gozineh || {}; this.jibegah = this.g.jibegah || 'balaChap'; } Abzar.prototype.afzoodanBe = function (naghshe) { this._naghshe = naghshe; this._onsor = this.saakht(naghshe); naghshe._gooshehAbzar(this.jibegah).appendChild(this._onsor); return this; }; Abzar.prototype.hazf = function () { if (this._onsor && this._onsor.parentNode) this._onsor.parentNode.removeChild(this._onsor); return this; }; function AbzarBozorgnamai(gozineh) { Abzar.call(this, darham({ jibegah: 'balaChap', neshanBish: '+', neshanKam: '−', rahnamaBish: 'بزرگ‌نمایی', rahnamaKam: 'کوچک‌نمایی' }, gozineh)); } AbzarBozorgnamai.prototype = Object.create(Abzar.prototype); AbzarBozorgnamai.prototype.saakht = function (naghshe) { var g = this.g; var jaa = sakhtOnsor('div', 'mz-abzar mz-abzar-zoom'); var dokme = function (barchasb, kar, rahnama) { var b = sakhtOnsor('button', 'mz-dokme', jaa); b.type = 'button'; b.innerHTML = barchasb; b.setAttribute('aria-label', rahnama); b.title = rahnama; b.addEventListener('click', function (e) { e.preventDefault(); kar(); }); return b; }; dokme(g.neshanBish, function () { naghshe.bozorgnamaiBish(); }, g.rahnamaBish); dokme(g.neshanKam, function () { naghshe.bozorgnamaiKam(); }, g.rahnamaKam); return jaa; }; function AbzarEtebar(gozineh) { Abzar.call(this, darham({ jibegah: 'paainRast' }, gozineh)); this._fehrest = []; } AbzarEtebar.prototype = Object.create(Abzar.prototype); AbzarEtebar.prototype.saakht = function (naghshe) { this._jaa = sakhtOnsor('div', 'mz-abzar mz-abzar-etebar'); if (this.g.matn) this._fehrest.push(this.g.matn); this._baznevisi(); return this._jaa; }; AbzarEtebar.prototype.afzoodan = function (matn) { if (matn && this._fehrest.indexOf(matn) === -1) { this._fehrest.push(matn); this._baznevisi(); } return this; }; AbzarEtebar.prototype._baznevisi = function () { if (!this._jaa) return; var barand = '' + PARCHAM_FELESTIN + '© ' + 'منظر / Manzar' + ''; var dadeh = this._fehrest.length ? '' + this._fehrest.join(' · ') + ' ' : ''; this._jaa.innerHTML = dadeh + barand; }; function AbzarMeghyas(gozineh) { Abzar.call(this, darham({ jibegah: 'paainChap', bishinePahna: 100 }, gozineh)); } AbzarMeghyas.prototype = Object.create(Abzar.prototype); AbzarMeghyas.prototype.saakht = function (naghshe) { this._jaa = sakhtOnsor('div', 'mz-abzar mz-abzar-meghyas'); this._mile = sakhtOnsor('div', 'mz-meghyas-mile', this._jaa); var khod = this; naghshe.on('harekat zoom', function () { khod.baznevisi(); }); naghshe.on('load', function () { khod.baznevisi(); }); setTimeout(function () { khod.baznevisi(); }, 0); return this._jaa; }; AbzarMeghyas.prototype.baznevisi = function () { var n = this._naghshe; if (!n || !n._pahna) return; var markaz = n.gereftanMarkaz(); var m1 = new Mokan(markaz[0], markaz[1] - 0.05), m2 = new Mokan(markaz[0], markaz[1] + 0.05); var p1 = n.mokanBePiksel(m1), p2 = n.mokanBePiksel(m2); var metrHarPiksel = m1.faseleh(m2) / Math.abs(p2.x - p1.x); var hadaf = this.g.bishinePahna * metrHarPiksel; var rond = this._rondZibaa(hadaf); var pahna = rond / metrHarPiksel; this._mile.style.width = pahna + 'px'; this._mile.textContent = rond >= 1000 ? (rond / 1000) + ' کیلومتر' : rond + ' متر'; }; AbzarMeghyas.prototype._rondZibaa = function (m) { var toan = Math.pow(10, Math.floor(Math.log(m) / Math.LN10)); var d = m / toan; d = d >= 5 ? 5 : (d >= 3 ? 3 : (d >= 2 ? 2 : 1)); return d * toan; }; function AbzarLayeGozin(payeHa, roiHa, gozineh) { Abzar.call(this, darham({ jibegah: 'balaRast' }, gozineh)); this._payeHa = payeHa || {}; this._roiHa = roiHa || {}; } AbzarLayeGozin.prototype = Object.create(Abzar.prototype); AbzarLayeGozin.prototype.saakht = function (naghshe) { var jaa = sakhtOnsor('div', 'mz-abzar mz-abzar-layeGozin'), khod = this; var naam, aval = true; for (naam in this._payeHa) { (function (naam, laye, aval) { var radif = sakhtOnsor('label', 'mz-layeGozin-radif', jaa); var vorodi = sakhtOnsor('input', '', radif); vorodi.type = 'radio'; vorodi.name = 'mz-payeh'; if (aval) { vorodi.checked = true; laye.afzoodanBe(naghshe); } vorodi.addEventListener('change', function () { for (var n in khod._payeHa) if (khod._payeHa[n].roiNaghshe()) khod._payeHa[n].hazf(); laye.afzoodanBe(naghshe); }); sakhtOnsor('span', '', radif).textContent = ' ' + naam; })(naam, this._payeHa[naam], aval); aval = false; } if (Object.keys(this._roiHa).length) sakhtOnsor('div', 'mz-layeGozin-marz', jaa); for (naam in this._roiHa) { (function (naam, laye) { var radif = sakhtOnsor('label', 'mz-layeGozin-radif', jaa); var vorodi = sakhtOnsor('input', '', radif); vorodi.type = 'checkbox'; vorodi.addEventListener('change', function () { if (vorodi.checked) laye.afzoodanBe(naghshe); else laye.hazf(); }); sakhtOnsor('span', '', radif).textContent = ' ' + naam; })(naam, this._roiHa[naam]); } return jaa; }; function AbzarLayeha(payeHa, roiHa, gozineh) { Abzar.call(this, darham({ jibegah: 'balaRast', jamShodeh: true, shefafiat: true, sarbarg: 'لایه‌ها' }, gozineh)); this._payeHa = payeHa || {}; this._roiHa = roiHa || {}; this._radifha = []; } AbzarLayeha.prototype = Object.create(Abzar.prototype); AbzarLayeha.prototype.saakht = function (naghshe) { var khod = this; var jaa = sakhtOnsor('div', 'mz-abzar mz-abzar-layeha' + (this.g.jamShodeh ? ' mz-layeha-jam' : '')); var neshanDokme = sakhtOnsor('button', 'mz-layeha-neshan', jaa); neshanDokme.type = 'button'; neshanDokme.setAttribute('aria-label', this.g.sarbarg); neshanDokme.innerHTML = ''; var tablo = sakhtOnsor('div', 'mz-layeha-tablo', jaa); var baz = function () { jaa.classList.add('mz-layeha-baz'); }; var basteh = function () { jaa.classList.remove('mz-layeha-baz'); }; if (this.g.jamShodeh) { jaa.addEventListener('mouseenter', baz); jaa.addEventListener('mouseleave', basteh); neshanDokme.addEventListener('click', function () { jaa.classList.toggle('mz-layeha-baz'); }); } else { baz(); } var goroohNaam = 'mz-payeh-' + Math.random().toString(36).slice(2, 8); var aval = true, naam; for (naam in this._payeHa) { this._radif(tablo, naam, this._payeHa[naam], 'radio', goroohNaam, aval, naghshe); aval = false; } if (Object.keys(this._roiHa).length) sakhtOnsor('div', 'mz-layeha-marz', tablo); for (naam in this._roiHa) { this._radif(tablo, naam, this._roiHa[naam], 'checkbox', null, false, naghshe); } return jaa; }; AbzarLayeha.prototype._radif = function (tablo, naam, laye, gooneh, gorooh, roshan, naghshe) { var khod = this; var radif = sakhtOnsor('div', 'mz-layeha-radif', tablo); var barchasb = sakhtOnsor('label', 'mz-layeha-barchasb', radif); var vorodi = sakhtOnsor('input', '', barchasb); vorodi.type = gooneh; if (gorooh) vorodi.name = gorooh; var eslahShefafiat = function () { if (laye.tanzimShefafiat && lang) laye.tanzimShefafiat(+lang.value); }; var faal = function () { if (gooneh === 'radio') { for (var n in khod._payeHa) if (khod._payeHa[n] !== laye && khod._payeHa[n].roiNaghshe()) khod._payeHa[n].hazf(); laye.afzoodanBe(naghshe); } else { if (vorodi.checked) laye.afzoodanBe(naghshe); else laye.hazf(); } khod.partab && khod.partab('degargooni', { laye: laye, naam: naam }); }; if (roshan) { vorodi.checked = true; laye.afzoodanBe(naghshe); } vorodi.addEventListener('change', faal); sakhtOnsor('span', 'mz-layeha-naam', barchasb).textContent = naam; var lang = null; if (this.g.shefafiat && laye.tanzimShefafiat) { lang = sakhtOnsor('input', 'mz-layeha-lang', radif); lang.type = 'range'; lang.min = 0; lang.max = 1; lang.step = 0.05; lang.value = (laye.g && laye.g.shefafiat != null) ? laye.g.shefafiat : 1; lang.setAttribute('aria-label', 'شفافیتِ ' + naam); lang.addEventListener('input', function () { if (laye.tanzimShefafiat) laye.tanzimShefafiat(+lang.value); }); } this._radifha.push({ naam: naam, laye: laye, vorodi: vorodi, lang: lang, gooneh: gooneh }); }; AbzarLayeha.prototype.afzoodanPaye = function (naam, laye) { this._payeHa[naam] = laye; return this; }; AbzarLayeha.prototype.afzoodanRoo = function (naam, laye) { this._roiHa[naam] = laye; return this; }; baRoydad(AbzarLayeha); function Naghshe(gereh, gozineh) { Nashani.call(this); gozineh = gozineh || {}; this._gereh = typeof gereh === 'string' ? document.getElementById(gereh) : gereh; if (!this._gereh) throw new Error('منظر: عنصرِ نگه‌دارندهٔ نقشه یافت نشد.'); var mk = Mokan.az(gozineh.markaz || [34.98, 50.95]) || new Mokan(34.98, 50.95); this._markazMokan = mokanNormal(mk); var bzAghaz = gozineh.bozorgnamai == null ? gozineh.zoom : gozineh.bozorgnamai; this._bozorgnamai = bzAghaz == null ? 5 : bzAghaz; this._kamZoom = gozineh.kamZoom == null ? 2 : gozineh.kamZoom; this._ziadZoom = gozineh.ziadZoom == null ? 19 : gozineh.ziadZoom; this._layeHa = []; this._ghofl = false; this._safheKelid = gozineh.safheKelid !== false; this._sakhtSaz(); this._chasbandanRoydad(); if (gozineh.abzarZoom !== false) new AbzarBozorgnamai().afzoodanBe(this); this._etebarAbzar = new AbzarEtebar({ matn: gozineh.etebar || '' }); if (gozineh.abzarEtebar !== false) this._etebarAbzar.afzoodanBe(this); if (gozineh.kashiPishfarz !== false) { this.payeRasad = new LayeKashi(gozineh.kashi || KASHI_PISHFARZ, { kamZoom: this._kamZoom, ziadZoom: this._ziadZoom, etebar: ETEBAR_DADEH, ziadZoomBoomi: gozineh.ziadZoomBoomi == null ? null : gozineh.ziadZoomBoomi, tizNama: !!gozineh.tizNama }); this.payeRasad.afzoodanBe(this); } this._jonoobBala = false; if (gozineh.jonoobBala) this.tanzimJonoobBala(true); if (gozineh.abzarMeghyas) new AbzarMeghyas().afzoodanBe(this); var khod = this; setTimeout(function () { khod.partab('load'); khod._tazehHame(); }, 0); } baRoydad(Naghshe); Naghshe.prototype._sakhtSaz = function () { var g = this._gereh; g.classList.add('mz-naghshe'); if (getComputedStyle(g).position === 'static') g.style.position = 'relative'; this._damanKashi = sakhtOnsor('div', 'mz-daman mz-daman-kashiha', g); this._boomSvg = document.createElementNS((function(){var d=document.createElement('div');d.innerHTML='';return d.firstChild.namespaceURI;})(), 'svg'); this._boomSvg.setAttribute('class', 'mz-daman mz-boom'); g.appendChild(this._boomSvg); this._damanNeshan = sakhtOnsor('div', 'mz-daman mz-daman-neshanha', g); this._damanRoo = sakhtOnsor('div', 'mz-daman mz-daman-roo', g); this._goosheHa = {}; var jaHa = ['balaChap', 'balaRast', 'paainChap', 'paainRast']; for (var i = 0; i < jaHa.length; i++) this._goosheHa[jaHa[i]] = sakhtOnsor('div', 'mz-goosheh mz-goosheh-' + jaHa[i], g); this._andazeGiri(); }; Naghshe.prototype._gooshehAbzar = function (jibegah) { return this._goosheHa[jibegah] || this._goosheHa.balaChap; }; Naghshe.prototype._andazeGiri = function () { var r = this._gereh.getBoundingClientRect(); this._pahna = r.width || this._gereh.clientWidth || 800; this._boland = r.height || this._gereh.clientHeight || 500; this._boomSvg.setAttribute('width', this._pahna); this._boomSvg.setAttribute('height', this._boland); }; Naghshe.prototype._chasbandanRoydad = function () { var khod = this, darKeshesh = false, akhar = null, jabejaShod = false, pointerId = null; var vx = 0, vy = 0, zamanAkharHarekat = 0; var darooneMatn = function (hadaf) { for (var g = hadaf; g && g !== khod._gereh; g = g.parentNode) { if (g.nodeType !== 1) continue; var naam = g.tagName; if (naam === 'INPUT' || naam === 'TEXTAREA' || naam === 'SELECT' || g.isContentEditable) return true; if (g.classList && g.classList.contains('mz-panjere')) return true; } return false; }; var pakGozinesh = function () { try { var gz = window.getSelection && window.getSelection(); if (gz && gz.rangeCount && !gz.isCollapsed) gz.removeAllRanges(); } catch (err) {} }; var bazdar = function (e) { if (!darooneMatn(e.target) && e.cancelable) e.preventDefault(); }; this._gereh.addEventListener('dragstart', bazdar); this._gereh.addEventListener('selectstart', bazdar); var payanKeshesh = function (rahaShodeBaSorat) { khod._ghabEshareh = null; if (!darKeshesh) return; darKeshesh = false; khod._gereh.classList.remove('mz-dast-basteh'); if (pointerId != null && khod._gereh.releasePointerCapture) { try { khod._gereh.releasePointerCapture(pointerId); } catch (err) {} } pointerId = null; if (rahaShodeBaSorat && jabejaShod) khod._aghazLokhtiPikseli(vx * QAB_PAYEH, vy * QAB_PAYEH); }; var paain = function (e) { if (khod._ghofl) return; if (e.pointerType === 'touch') return; if (e.button != null && e.button !== 0) return; if (darooneMatn(e.target)) return; pakGozinesh(); khod._ghabEshareh = khod._gereh.getBoundingClientRect(); khod._toghfeLokhtiPikseli(); khod._toghfeZoomZendeh(); darKeshesh = true; jabejaShod = false; akhar = khod._noghteRoydad(e); vx = vy = 0; zamanAkharHarekat = 0; khod._gereh.classList.add('mz-dast-basteh'); if (e.pointerId != null && khod._gereh.setPointerCapture) { pointerId = e.pointerId; try { khod._gereh.setPointerCapture(pointerId); } catch (err) {} } }; var harekat = function (e) { if (!darKeshesh) return; var noghte = khod._noghteRoydad(e); var dx = noghte.x - akhar.x, dy = noghte.y - akhar.y; if (Math.abs(dx) + Math.abs(dy) > 2) jabejaShod = true; akhar = noghte; var zamanNoH = (e.timeStamp != null) ? e.timeStamp : Date.now(); var dtH = zamanAkharHarekat ? mahdud(zamanNoH - zamanAkharHarekat, 2, 64) : QAB_PAYEH; vx = vx * 0.7 + (dx / dtH) * 0.3; vy = vy * 0.7 + (dy / dtH) * 0.3; zamanAkharHarekat = zamanNoH; khod._jaijaPikseli(-dx, -dy); if (e.cancelable) e.preventDefault(); }; var bala = function (e) { if (darKeshesh && !jabejaShod) { var noghte = khod._noghteRoydad(e), mabda = khod._mabda(); var mokan = vaTasvir(mabda.x + noghte.x, mabda.y + noghte.y, khod._zTars()); khod.partab('click', { mokan: mokan, noghte: noghte }); } var akoon = (e && e.timeStamp != null) ? e.timeStamp : Date.now(); if (akoon - zamanAkharHarekat > 120) { vx = vy = 0; } payanKeshesh(true); }; var payanBiLokhti = function () { payanKeshesh(false); }; if (window.PointerEvent) { this._gereh.addEventListener('pointerdown', paain); this._gereh.addEventListener('pointermove', harekat); this._gereh.addEventListener('pointerup', bala); this._gereh.addEventListener('pointercancel', payanBiLokhti); this._gereh.addEventListener('pointerleave', function (e) { if (pointerId == null) payanBiLokhti(); }); this._gereh.addEventListener('lostpointercapture', function (e) { if (darKeshesh && pointerId === e.pointerId) payanBiLokhti(); }); } else { this._gereh.addEventListener('mousedown', paain); window.addEventListener('mousemove', harekat); window.addEventListener('mouseup', bala); } window.addEventListener('blur', payanBiLokhti); document.addEventListener('visibilitychange', function () { if (document.hidden) payanBiLokhti(); }); this._gereh.addEventListener('wheel', function (e) { e.preventDefault(); khod._zoomNarmCharkh(khod._dzCharkh(e), khod._noghteRoydad(e)); }, { passive: false }); this._gereh.addEventListener('dblclick', function (e) { e.preventDefault(); khod._zoomNarmCharkh(1, khod._noghteRoydad(e)); }); window.addEventListener('resize', function () { khod._ghabEshareh = null; khod._andazeGiri(); khod._tazehHame(); }); if (this._safheKelid) { this._gereh.tabIndex = 0; this._gereh.setAttribute('role', 'application'); this._gereh.addEventListener('keydown', function (e) { var gam = e.shiftKey ? 150 : 80, korde = true; switch (e.key) { case 'ArrowUp': khod._parvazPikseli(0, -gam); break; case 'ArrowDown': khod._parvazPikseli(0, gam); break; case 'ArrowLeft': khod._parvazPikseli(-gam, 0); break; case 'ArrowRight': khod._parvazPikseli(gam, 0); break; case '+': case '=': khod._zoomNarmCharkh(1, new Nogte(khod._pahna / 2, khod._boland / 2)); break; case '-': case '_': khod._zoomNarmCharkh(-1, new Nogte(khod._pahna / 2, khod._boland / 2)); break; default: korde = false; } if (korde) e.preventDefault(); }); } this._chasbandanLams(); }; Naghshe.prototype._parvazPikseli = function (dx, dy) { this._jaijaPikseli(dx, dy); }; Naghshe.prototype._aghazLokhtiPikseli = function (vx, vy) { this._toghfeLokhtiPikseli(); var khod = this; if (Math.abs(vx) < 0.5 && Math.abs(vy) < 0.5) return; var SAGHF = 90; vx = mahdud(vx, -SAGHF, SAGHF); vy = mahdud(vy, -SAGHF, SAGHF); var zamanGhabli = null; function gam(zamanQab) { if (zamanQab == null) zamanQab = zamanAknoon(); var faseleZamani = (zamanGhabli == null) ? QAB_PAYEH : Math.min(zamanQab - zamanGhabli, 64); zamanGhabli = zamanQab; var zarib = faseleZamani / QAB_PAYEH; khod._jaijaPikseli(-vx * zarib, -vy * zarib); var mir = Math.pow(0.92, zarib); vx *= mir; vy *= mir; if (Math.abs(vx) > 0.4 || Math.abs(vy) > 0.4) khod._lokhtiRaf = requestAnimationFrame(gam); else khod._lokhtiRaf = null; } khod._lokhtiRaf = requestAnimationFrame(gam); }; Naghshe.prototype._toghfeLokhtiPikseli = function () { if (this._lokhtiRaf) { cancelAnimationFrame(this._lokhtiRaf); this._lokhtiRaf = null; } }; Naghshe.prototype._jabejaTrazCharkh = function (zNo) { var z0 = this._zTars(); if (zNo === z0) { this._bozorgnamai = z0; return; } var n = this._charkhNoghte || new Nogte(this._pahna / 2, this._boland / 2), mabda = this._mabda(); var joft = vaTasvir(mabda.x + n.x, mabda.y + n.y, z0); this._bozorgnamai = zNo; var np = tasvir(joft.arz, joft.tool, zNo); this._markazMokan = mokanNormal(vaTasvir(np.x - n.x + this._pahna / 2, np.y - n.y + this._boland / 2, zNo)); }; Naghshe.prototype._toghfeZoomZendeh = function () { var konoonZendeh = this._charkhKonoon; this._charkhAnbashteh = 0; this._charkhPayeAnb = null; this._charkhZaman = null; this._charkhKonoon = null; if (this._charkhRaf) { cancelAnimationFrame(this._charkhRaf); this._charkhRaf = null; this._jabejaTrazCharkh(mahdud(Math.round(konoonZendeh != null ? konoonZendeh : this._zTars()), this._kamZoom, this._ziadZoom)); this._pakTarnsformZoom(); this._tazehHame(); this.partab('zoom', { zoom: this._zTars() }); } if (this._charkhPaye != null) { this._bozorgnamai = this._zTars(); this._charkhPaye = null; this._pakTarnsformZoom(); } }; Naghshe.prototype._chasbandanLams = function () { var khod = this; var HALAT_HICH = 0, HALAT_KESH = 1, HALAT_FESHOR = 2; var halat = HALAT_HICH; var akharNoghte = null; var jabejaShod = false; var faselehGhabli = 0; var zPaayeh = 0; var faselehAghaz = 0; var zamanAkharLams = 0; var noghteAkharLams = null; var zamanAghazLams = 0; var doAngoshtBood = false; var vx = 0, vy = 0, zamanGham = 0; function noghteAz(t) { return khod._noghteAzSafhe(t.clientX, t.clientY); } function faseleh(a, b) { var dx = a.clientX - b.clientX, dy = a.clientY - b.clientY; return Math.sqrt(dx * dx + dy * dy); } function miyaneh(a, b) { return khod._noghteAzSafhe((a.clientX + b.clientX) / 2, (a.clientY + b.clientY) / 2); } function toghfeLokhti() { khod._toghfeLokhtiPikseli(); } function aghazLokhti() { khod._aghazLokhtiPikseli(vx * QAB_PAYEH, vy * QAB_PAYEH); } khod._gereh.addEventListener('touchstart', function (e) { if (khod._ghofl) return; khod._ghabEshareh = khod._gereh.getBoundingClientRect(); toghfeLokhti(); khod._toghfeZoomZendeh(); var lms = e.touches; zamanAghazLams = Date.now(); if (lms.length === 1) { halat = HALAT_KESH; akharNoghte = noghteAz(lms[0]); jabejaShod = false; vx = vy = 0; zamanGham = 0; khod._gereh.classList.add('mz-dast-basteh'); } else if (lms.length >= 2) { halat = HALAT_FESHOR; doAngoshtBood = true; faselehGhabli = faselehAghaz = faseleh(lms[0], lms[1]); zPaayeh = khod._bozorgnamai; jabejaShod = false; akharNoghte = miyaneh(lms[0], lms[1]); } }, { passive: true }); khod._gereh.addEventListener('touchmove', function (e) { if (khod._ghofl) return; var lms = e.touches; if (halat === HALAT_FESHOR && lms.length >= 2) { if (e.cancelable) e.preventDefault(); var f = faseleh(lms[0], lms[1]); var mid = miyaneh(lms[0], lms[1]); var zNo = zPaayeh + Math.log(f / faselehAghaz) / Math.LN2; khod._zoomBeMarkaz(zNo, mid); var dmx = mid.x - akharNoghte.x, dmy = mid.y - akharNoghte.y; if (Math.abs(dmx) + Math.abs(dmy) > 0.5) khod._jaijaPikseli(-dmx, -dmy); akharNoghte = mid; faselehGhabli = f; jabejaShod = true; } else if (halat === HALAT_KESH && lms.length === 1) { if (e.cancelable) e.preventDefault(); var noghte = noghteAz(lms[0]); var dx = noghte.x - akharNoghte.x, dy = noghte.y - akharNoghte.y; if (Math.abs(dx) + Math.abs(dy) > 2) jabejaShod = true; var zamanNoL = (e.timeStamp != null) ? e.timeStamp : Date.now(); var dtL = zamanGham ? mahdud(zamanNoL - zamanGham, 2, 64) : QAB_PAYEH; vx = vx * 0.7 + (dx / dtL) * 0.3; vy = vy * 0.7 + (dy / dtL) * 0.3; zamanGham = zamanNoL; akharNoghte = noghte; khod._jaijaPikseli(-dx, -dy); } }, { passive: false }); khod._gereh.addEventListener('touchend', function (e) { if (!e.touches.length) khod._ghabEshareh = null; if (khod._ghofl) return; var mande = e.touches; if (halat === HALAT_FESHOR) { if (mande.length === 1) { khod._zoomBeMarkaz(khod._zTars(), akharNoghte || new Nogte(khod._pahna / 2, khod._boland / 2)); halat = HALAT_KESH; akharNoghte = noghteAz(mande[0]); jabejaShod = false; vx = vy = 0; zamanGham = 0; } else if (mande.length === 0) { halat = HALAT_HICH; var noghteMarkaz = new Nogte(khod._pahna / 2, khod._boland / 2); khod._zoomBeMarkaz(khod._zTars(), noghteMarkaz); if (doAngoshtBood && !jabejaShod && (Date.now() - zamanAghazLams) < 300) { khod._zoomPiramoon(-1, noghteMarkaz); } doAngoshtBood = false; khod._gereh.classList.remove('mz-dast-basteh'); } } else if (halat === HALAT_KESH && mande.length === 0) { halat = HALAT_HICH; khod._gereh.classList.remove('mz-dast-basteh'); var noghtePayan = akharNoghte; if (!jabejaShod) { var aknoon = Date.now(); if (noghtePayan && noghteAkharLams && (aknoon - zamanAkharLams) < 300 && Math.abs(noghtePayan.x - noghteAkharLams.x) < 30 && Math.abs(noghtePayan.y - noghteAkharLams.y) < 30) { khod._zoomPiramoon(1, noghtePayan); zamanAkharLams = 0; noghteAkharLams = null; } else { zamanAkharLams = aknoon; noghteAkharLams = noghtePayan; var mabda = khod._mabda(); var mokan = vaTasvir(mabda.x + noghtePayan.x, mabda.y + noghtePayan.y, khod._zTars()); khod.partab('click', { mokan: mokan, noghte: noghtePayan }); } } else { var akoonL = (e.timeStamp != null) ? e.timeStamp : Date.now(); if (zamanGham && akoonL - zamanGham > 120) { vx = vy = 0; } aghazLokhti(); doAngoshtBood = false; } } }); khod._gereh.addEventListener('touchcancel', function () { halat = HALAT_HICH; jabejaShod = false; doAngoshtBood = false; toghfeLokhti(); khod._gereh.classList.remove('mz-dast-basteh'); }); }; Naghshe.prototype._noghteAzSafhe = function (cx, cy) { var r = this._ghabEshareh || this._gereh.getBoundingClientRect(); var x = cx - r.left, y = cy - r.top; if (this._jonoobBala) { x = this._pahna - x; y = this._boland - y; } return new Nogte(x, y); }; Naghshe.prototype._noghteRoydad = function (e) { var t = e.touches && e.touches[0] ? e.touches[0] : (e.changedTouches && e.changedTouches[0] ? e.changedTouches[0] : e); return this._noghteAzSafhe(t.clientX, t.clientY); }; Naghshe.prototype._zTars = function () { return Math.round(this._bozorgnamai); }; Naghshe.prototype._mabda = function () { var z = this._zTars(); var c = tasvir(this._markazMokan.arz, this._markazMokan.tool, z); return new Nogte(c.x - this._pahna / 2, c.y - this._boland / 2); }; Naghshe.prototype.mokanBePiksel = function (mokan) { mokan = Mokan.az(mokan); var mabda = this._mabda(); var p = tasvir(mokan.arz, mokan.tool, this._zTars()); return new Nogte(p.x - mabda.x, p.y - mabda.y); }; Naghshe.prototype.pikselBeMokan = function (noghte) { var mabda = this._mabda(); return vaTasvir(mabda.x + noghte.x, mabda.y + noghte.y, this._zTars()); }; Naghshe.prototype._jaijaPikseli = function (dx, dy) { var mabda = this._mabda(); this._markazMokan = mokanNormal(vaTasvir(mabda.x + this._pahna / 2 + dx, mabda.y + this._boland / 2 + dy, this._zTars())); this._jahatPX = (this._jahatPX || 0) + dx; this._jahatPY = (this._jahatPY || 0) + dy; this._tazehQab(); this.partab('harekat', { markaz: this.gereftanMarkaz() }); }; Naghshe.prototype._pishVakeshiJahati = function () { var jx = this._jahatPX || 0, jy = this._jahatPY || 0; this._jahatPX = 0; this._jahatPY = 0; var jamAbs = Math.abs(jx) + Math.abs(jy); if (jamAbs < 4) return; var z = this._zTars(); var mabda = this._mabda(); var amghAfghi = jx !== 0 ? (jx > 0 ? 3 : -3) : 0; var amghAmoodi = jy !== 0 ? (jy > 0 ? 3 : -3) : 0; for (var i = 0; i < this._layeHa.length; i++) { var l = this._layeHa[i]; if (l._pishVakeshiHalgheh) l._pishVakeshiHalgheh(z, mabda, this._pahna, this._boland, amghAfghi, amghAmoodi); } }; Naghshe.prototype._zoomPiramoon = function (dz, noghte) { if (this._parvazRaf) { cancelAnimationFrame(this._parvazRaf); this._parvazRaf = null; } this._toghfeLokhtiPikseli(); var zKonoon = this._zTars(); var jadid = mahdud(zKonoon + dz, this._kamZoom, this._ziadZoom); if (jadid === zKonoon && this._bozorgnamai === jadid) return; var mabda = this._mabda(); var joft = vaTasvir(mabda.x + noghte.x, mabda.y + noghte.y, zKonoon); this._bozorgnamai = jadid; var np = tasvir(joft.arz, joft.tool, jadid); this._markazMokan = mokanNormal(vaTasvir(np.x - noghte.x + this._pahna / 2, np.y - noghte.y + this._boland / 2, jadid)); this._tazehHame(); this.partab('zoom', { zoom: jadid }); }; Naghshe.prototype._zoomNarmCharkh = function (dz, noghte) { if (!dz) return; var z0 = this._zTars(); if (!this._charkhRaf) this._toghfeLokhtiPikseli(); var zamanNo = zamanAknoon(); var edameh = !!this._charkhRaf || (this._charkhZaman != null && (zamanNo - this._charkhZaman) < 400 && this._charkhPayeAnb != null); this._charkhZaman = zamanNo; if (!edameh) { this._charkhPayeAnb = z0; this._charkhAnbashteh = 0; } this._charkhAnbashteh += dz; var SAGHF_PISH = 2; var zZendeh = (this._charkhRaf && this._charkhKonoon != null) ? this._charkhKonoon : z0; var pish = zZendeh - this._charkhPayeAnb; this._charkhAnbashteh = mahdud(this._charkhAnbashteh, pish - SAGHF_PISH, pish + SAGHF_PISH); this._charkhAnbashteh = mahdud(this._charkhAnbashteh, this._kamZoom - this._charkhPayeAnb, this._ziadZoom - this._charkhPayeAnb); var hadafNo = mahdud(Math.round(this._charkhPayeAnb + this._charkhAnbashteh), this._kamZoom, this._ziadZoom); if (this._charkhRaf) { this._charkhHadaf = hadafNo; return; } if (hadafNo === z0) return; this._charkhHadaf = hadafNo; this._charkhNoghte = noghte || new Nogte(this._pahna / 2, this._boland / 2); var mabdaK = this._mabda(); var joftK = vaTasvir(mabdaK.x + this._charkhNoghte.x, mabdaK.y + this._charkhNoghte.y, z0); var npK = tasvir(joftK.arz, joftK.tool, this._charkhHadaf); var markazHadaf = vaTasvir( npK.x - this._charkhNoghte.x + this._pahna / 2, npK.y - this._charkhNoghte.y + this._boland / 2, this._charkhHadaf); this._pishBarHame(this._charkhHadaf, markazHadaf); var khod = this, az = z0, konoon = z0, zamanGhabli = null; this._charkhKonoon = konoon; var gam = function (zamanQab) { if (zamanQab == null) zamanQab = zamanAknoon(); var faseleZamani = (zamanGhabli == null) ? QAB_PAYEH : Math.min(zamanQab - zamanGhabli, 64); zamanGhabli = zamanQab; konoon += (khod._charkhHadaf - konoon) * (1 - Math.pow(1 - 0.2, faseleZamani / QAB_PAYEH)); var tamam = Math.abs(khod._charkhHadaf - konoon) < 0.008; if (tamam) konoon = khod._charkhHadaf; khod._charkhKonoon = konoon; var paridan = !tamam && Math.abs(konoon - az) > 0.5; if (paridan) { var zMiyani = mahdud(Math.round(konoon), khod._kamZoom, khod._ziadZoom); if (zMiyani !== az) { khod._jabejaTrazCharkh(zMiyani); az = zMiyani; } else paridan = false; } khod._tanzimTarnsformZoom(khod._charkhNoghte, Math.pow(2, konoon - az)); if (paridan) { khod._tazehHame(); khod.partab('zoom', { zoom: az }); } if (tamam) { khod._charkhRaf = null; khod._charkhKonoon = null; khod._pakTarnsformZoom(); var dzKol = khod._charkhHadaf - az; if (dzKol !== 0) khod._zoomPiramoon(dzKol, khod._charkhNoghte); else khod._tazehHame(); return; } khod._charkhRaf = requestAnimationFrame(gam); }; this._charkhRaf = requestAnimationFrame(gam); }; var ASTANE_DANDE = 40; var PIKSEL_HAR_TRAZ = 60; Naghshe.prototype._dzCharkh = function (e) { var px = e.deltaY; if (!px) return 0; var neshaneh = px < 0 ? 1 : -1; var andazeh = Math.abs(px); if (e.deltaMode) return neshaneh; if (andazeh < ASTANE_DANDE) return neshaneh * (andazeh / PIKSEL_HAR_TRAZ); return neshaneh; }; Naghshe.prototype.tanzimJonoobBala = function (v) { v = v !== false; if (this._jonoobBala === v) return this; this._jonoobBala = v; this._gereh.classList.toggle('mz-jonoob-bala', v); this.partab('jonoobBala', { jonoobBala: v }); return this; }; Naghshe.prototype.gereftanJonoobBala = function () { return !!this._jonoobBala; }; Naghshe.prototype._hameDaman = function () { return [this._damanKashi, this._damanNeshan, this._boomSvg, this._damanRoo]; }; Naghshe.prototype._tanzimTarnsformZoom = function (noghteMabda, meghyas) { var origin = noghteMabda.x + 'px ' + noghteMabda.y + 'px'; var scaleStr = 'scale(' + meghyas + ')'; if (this._jonoobBala) { var mx = this._pahna / 2, my = this._boland / 2; origin = '0 0'; scaleStr = 'translate(' + mx + 'px,' + my + 'px) rotate(180deg) translate(' + (-mx) + 'px,' + (-my) + 'px) ' + 'translate(' + noghteMabda.x + 'px,' + noghteMabda.y + 'px) scale(' + meghyas + ') ' + 'translate(' + (-noghteMabda.x) + 'px,' + (-noghteMabda.y) + 'px)'; } this._zoomZendeh = { x: noghteMabda.x, y: noghteMabda.y, s: meghyas }; var haa = this._hameDaman(); for (var i = 0; i < haa.length; i++) { var d = haa[i]; if (!d) continue; d.style.willChange = 'transform'; d.style.transformOrigin = origin; d.style.transform = scaleStr; } }; Naghshe.prototype._pakTarnsformZoom = function () { this._zoomZendeh = null; var haa = this._hameDaman(); for (var i = 0; i < haa.length; i++) { var d = haa[i]; if (!d) continue; d.style.transform = ''; d.style.transformOrigin = ''; d.style.willChange = ''; } }; Naghshe.prototype._pishBarHame = function (zHadaf, markazMokan) { for (var i = 0; i < this._layeHa.length; i++) { if (this._layeHa[i].pishBar) this._layeHa[i].pishBar(zHadaf, markazMokan); } }; Naghshe.prototype._zoomBeMarkaz = function (zHadaf, noghteThabet) { zHadaf = mahdud(zHadaf, this._kamZoom, this._ziadZoom); if (this._charkhPaye == null) this._charkhPaye = this._zTars(); var zPaye = this._charkhPaye; this._bozorgnamai = zHadaf; if (Math.abs(zHadaf - zPaye) >= 1) { this._neshandanFeshor(noghteThabet); this._charkhPaye = this._zTars(); this.partab('zoom', { zoom: this.gereftanZoom() }); return this; } var samt = zHadaf - zPaye; if (Math.abs(samt) > 0.4) { var zHam = zPaye + (samt > 0 ? 1 : -1); this._pishBarHame(zHam, this._markazDarNoghte(noghteThabet, zPaye, zHam)); } this._tanzimTarnsformZoom(noghteThabet, Math.pow(2, zHadaf - zPaye)); this.partab('zoom', { zoom: this.gereftanZoom() }); return this; }; Naghshe.prototype._neshandanFeshor = function (noghteThabet) { var z0 = this._charkhPaye != null ? this._charkhPaye : this._zTars(); this._pakTarnsformZoom(); this._charkhPaye = null; var zNo = this._zTars(); this._bozorgnamai = zNo; if (zNo !== z0) { var mabda = this._mabda_dar(z0); var joft = vaTasvir(mabda.x + noghteThabet.x, mabda.y + noghteThabet.y, z0); var np = tasvir(joft.arz, joft.tool, zNo); this._markazMokan = mokanNormal(vaTasvir(np.x - noghteThabet.x + this._pahna / 2, np.y - noghteThabet.y + this._boland / 2, zNo)); } this._tazehHame(); this.partab('zoom', { zoom: zNo }); return this; }; Naghshe.prototype._mabda_dar = function (z) { var c = tasvir(this._markazMokan.arz, this._markazMokan.tool, z); return new Nogte(c.x - this._pahna / 2, c.y - this._boland / 2); }; Naghshe.prototype._markazDarNoghte = function (noghte, z0, zNo) { var mabda = this._mabda(); var joft = vaTasvir(mabda.x + noghte.x, mabda.y + noghte.y, z0); var np = tasvir(joft.arz, joft.tool, zNo); return vaTasvir(np.x - noghte.x + this._pahna / 2, np.y - noghte.y + this._boland / 2, zNo); }; Naghshe.prototype._tazehHame = function () { if (!this._charkhRaf && this._charkhPaye == null) this._pakTarnsformZoom(); for (var i = 0; i < this._layeHa.length; i++) { var l = this._layeHa[i]; if (l.tazeh) l.tazeh(); if (l.jaGozari) l.jaGozari(); if (l.bekesh) l.bekesh(); if (l.pimayesh) l.pimayesh(function (o) { if (o.jaGozari) o.jaGozari(); if (o.bekesh) o.bekesh(); }); } if (this._panjereBaz) this._panjereBaz.jaGozari(); this.partab('bazTarsim'); }; Naghshe.prototype._tazehQab = function () { var khod = this; if (this._qab) return; this._qab = requestAnimationFrame(function () { khod._qab = null; khod._tazehHame(); khod._pishVakeshiJahati(); }); }; Naghshe.prototype._sabtLaye = function (l) { if (this._layeHa.indexOf(l) === -1) this._layeHa.push(l); }; Naghshe.prototype._hazfLaye = function (l) { var i = this._layeHa.indexOf(l); if (i > -1) this._layeHa.splice(i, 1); }; Naghshe.prototype.tanzimNama = function (markaz, zoom) { this._markazMokan = mokanNormal(Mokan.az(markaz)); if (zoom != null) this._bozorgnamai = mahdud(zoom, this._kamZoom, this._ziadZoom); this._tazehHame(); this.partab('harekat', { markaz: this.gereftanMarkaz() }); if (zoom != null) this.partab('zoom', { zoom: this.gereftanZoom() }); return this; }; Naghshe.prototype.gereftanMarkaz = function () { return this._markazMokan.baArayeh(); }; Naghshe.prototype.gereftanZoom = function () { return Math.round(this._bozorgnamai); }; Naghshe.prototype.gereftanKaran = function () { var mabda = this._mabda(), z = this._zTars(); var jg = vaTasvir(mabda.x, mabda.y + this._boland, z); var ss = vaTasvir(mabda.x + this._pahna, mabda.y, z); return new Karan([jg.arz, jg.tool], [ss.arz, ss.tool]); }; Naghshe.prototype.bozorgnamaiBish = function () { this._zoomPiramoonNarm(1); return this; }; Naghshe.prototype.bozorgnamaiKam = function () { this._zoomPiramoonNarm(-1); return this; }; Naghshe.prototype._zoomPiramoonNarm = function (dz) { this._zoomNarmCharkh(dz, new Nogte(this._pahna / 2, this._boland / 2)); }; Naghshe.prototype.harkatNarm = function (markaz) { return this._parvazBeMokan(Mokan.az(markaz), this._bozorgnamai, 350); }; Naghshe.prototype.parvaz = function (markaz, zoom, moddat) { return this._parvazBeMokan(Mokan.az(markaz), zoom == null ? this._bozorgnamai : zoom, moddat || 800); }; Naghshe.prototype._parvazBeMokan = function (hadafMokan, hadafZoom, moddat) { var khod = this; hadafZoom = Math.round(mahdud(hadafZoom, this._kamZoom, this._ziadZoom)); hadafMokan = mokanNormal(hadafMokan); var azMokan = this._markazMokan, azZoom = this._bozorgnamai, shoroo = null; var dTool = hadafMokan.tool - azMokan.tool; if (dTool > 180) dTool -= 360; else if (dTool < -180) dTool += 360; function gam(zaman) { if (shoroo == null) shoroo = zaman; var t = mahdud((zaman - shoroo) / moddat, 0, 1); var e = narmesh(t); khod._bozorgnamai = azZoom + (hadafZoom - azZoom) * e; khod._markazMokan = mokanNormal(new Mokan( azMokan.arz + (hadafMokan.arz - azMokan.arz) * e, azMokan.tool + dTool * e )); khod._tazehHame(); if (t < 1) khod._parvazRaf = requestAnimationFrame(gam); else { khod._parvazRaf = null; khod._bozorgnamai = hadafZoom; khod._markazMokan = hadafMokan; khod._tazehHame(); khod.partab('harekat', { markaz: khod.gereftanMarkaz() }); khod.partab('zoom', { zoom: khod.gereftanZoom() }); } } if (this._parvazRaf) cancelAnimationFrame(this._parvazRaf); this._toghfeLokhtiPikseli(); this._parvazRaf = requestAnimationFrame(gam); return this; }; Naghshe.prototype.jaDadanKaran = function (karan, gozineh) { gozineh = gozineh || {}; if (!(karan instanceof Karan)) karan = new Karan(karan[0], karan[1]); if (gozineh.hashieh) karan = karan.gostaresh(gozineh.hashieh); var markaz = karan.markaz(); var z = this._ziadZoom; for (; z >= this._kamZoom; z--) { var p1 = tasvir(karan.jg.arz, karan.jg.tool, z); var p2 = tasvir(karan.ss.arz, karan.ss.tool, z); if (Math.abs(p2.x - p1.x) <= this._pahna && Math.abs(p1.y - p2.y) <= this._boland) break; } z = mahdud(z, this._kamZoom, this._ziadZoom); if (gozineh.parvaz) return this.parvaz(markaz, z); return this.tanzimNama(markaz, z); }; Naghshe.prototype.afzoodan = function (laye) { laye.afzoodanBe(this); return this; }; Naghshe.prototype.hazf = function (laye) { laye.hazf(); return this; }; Naghshe.prototype.afzoodanAbzar = function (abzar) { abzar.afzoodanBe(this); return this; }; Naghshe.prototype.makanYabi = function (gozineh) { gozineh = gozineh || {}; var khod = this; if (!navigator.geolocation) { this.partab('makanKhata', { payam: 'موقعیت‌یاب در دسترس نیست' }); return this; } navigator.geolocation.getCurrentPosition(function (mo) { var mokan = new Mokan(mo.coords.latitude, mo.coords.longitude); if (gozineh.parvaz !== false) khod.parvaz(mokan, gozineh.zoom || 15); else if (gozineh.nama !== false) khod.tanzimNama(mokan, gozineh.zoom || khod.gereftanZoom()); khod.partab('makanYab', { mokan: mokan, deghat: mo.coords.accuracy }); }, function (kh) { khod.partab('makanKhata', { payam: kh.message, code: kh.code }); }, { enableHighAccuracy: gozineh.deghatBala !== false, timeout: gozineh.mohlat || 10000, maximumAge: gozineh.kohnegiMojaz || 0 }); return this; }; Naghshe.prototype.parvazBeKaran = function (karan, gozineh) { gozineh = darham({ parvaz: true }, gozineh); return this.jaDadanKaran(karan, gozineh); }; Naghshe.prototype.nabood = function () { if (this._charkhRaf) cancelAnimationFrame(this._charkhRaf); if (this._parvazRaf) cancelAnimationFrame(this._parvazRaf); if (this._qab) cancelAnimationFrame(this._qab); for (var i = this._layeHa.length - 1; i >= 0; i--) this._layeHa[i].hazf(); this._gereh.innerHTML = ''; this._gereh.classList.remove('mz-naghshe'); this.off(); return this; }; var Manzar = { noskhe: NESKHE, version: NESKHE, _daroon: { gozineshPooshesh: gozineshPooshesh, bazehKashi: bazehKashi, kelidKashi: kelidKashi, pichesh: pichesh, sabetha: { hamzamani: KASHI_HAMZAMANI, ziadNiya: KASHI_ZIAD_NIYA, ziadFarzand: KASHI_ZIAD_FARZAND, mahv: KASHI_MAHV_MS, saghfKash: KASH_KASHI_SAGHF } }, naghshe: function (gereh, g) { return new Naghshe(gereh, g); }, layeKashi: function (u, g) { return new LayeKashi(u, g); }, layeKashiWMS: function (u, g) { return new LayeKashiWMS(u, g); }, pushteshTasvir: function (u, k, g) { return new PushteshTasvir(u, k, g); }, neshan: function (m, g) { return new Neshan(m, g); }, neshanTasvir: function (g) { return new NeshanTasvir(g); }, neshanDayereh: function (m, g) { return new NeshanDayereh(m, g); }, panjere: function (g) { return new Panjere(g); }, namak: function (g) { return new Namak(g); }, khatShekaste: function (m, g) { return new KhatShekaste(m, g); }, chandZeli: function (m, g) { return new ChandZeli(m, g); }, dayereh: function (m, g) { return new Dayereh(m, g); }, mostatil: function (k, g) { return new Mostatil(k, g); }, goroohLaye: function (l) { return new GoroohLaye(l); }, goroohArezeh: function (l) { return new GoroohArezeh(l); }, geojson: function (d, g) { return new LayeGeoJSON(d, g); }, abzarBozorgnamai: function (g) { return new AbzarBozorgnamai(g); }, abzarEtebar: function (g) { return new AbzarEtebar(g); }, abzarMeghyas: function (g) { return new AbzarMeghyas(g); }, abzarLayeGozin: function (p, r, g) { return new AbzarLayeGozin(p, r, g); }, abzarLayeha: function (p, r, g) { return new AbzarLayeha(p, r, g); }, mokan: function (a, t) { return new Mokan(a, t); }, karan: function (jg, ss) { return new Karan(jg, ss); }, tasvir: tasvir, vaTasvir: vaTasvir, KASHI_RASAD: KASHI_PISHFARZ, afzoone: function (kar) { if (typeof kar === 'function') kar(Manzar); return Manzar; }, gostareshNaghshe: function (naam, kar) { Naghshe.prototype[naam] = kar; return Manzar; }, Naghshe: Naghshe, Laye: Laye, LayeKashi: LayeKashi, LayeKashiWMS: LayeKashiWMS, PushteshTasvir: PushteshTasvir, Neshan: Neshan, NeshanDayereh: NeshanDayereh, NeshanTasvir: NeshanTasvir, Panjere: Panjere, Namak: Namak, KhatShekaste: KhatShekaste, ChandZeli: ChandZeli, Dayereh: Dayereh, Mostatil: Mostatil, GoroohLaye: GoroohLaye, GoroohArezeh: GoroohArezeh, LayeGeoJSON: LayeGeoJSON, AbzarBozorgnamai: AbzarBozorgnamai, AbzarEtebar: AbzarEtebar, AbzarMeghyas: AbzarMeghyas, AbzarLayeGozin: AbzarLayeGozin, AbzarLayeha: AbzarLayeha, Abzar: Abzar, Nashani: Nashani, Mokan: Mokan, Karan: Karan, Nogte: Nogte }; return Manzar; }));