/*! منظر — © نویسندگانِ منظر */
(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;
}));