source: aowow/templates/wowhead/js/Mapper.js

Last change on this file was 170, checked in by maron, 16 years ago
  • Property svn:executable set to *
File size: 9.3 KB
Line 
1function Mapper(C, D) {
2 cO(this, C);
3 if (this.parent) {
4 this.parent = $(this.parent)
5 } else {
6 return
7 }
8 var B;
9 this.mouseX = this.mouseY = 0;
10 this.editable = this.editable || false;
11 if (this.editable) {
12 this.zoomable = this.toggle = false;
13 this.show = this.mouse = true
14 } else {
15 this.zoomable = (this.zoomable == null ? true: this.zoomable);
16 this.toggle = (this.toggle == null ? true: this.toggle);
17 this.show = (this.show == null ? true: this.show);
18 this.mouse = (this.mouse == null ? false: this.mouse)
19 }
20 this.zoneLink = (this.zoneLink == null ? true: this.zoneLink);
21 if (location.href.indexOf("zone=") != -1) {
22 this.zoneLink = false
23 }
24 this.zoom = (this.zoom == null ? 0: this.zoom);
25 this.zone = (this.zone == null ? 0: this.zone);
26 this.locale = (this.locale == null ? "enus": this.locale);
27 this.pins = [];
28 this.nCoords = 0;
29 this.parent.className = "mapper";
30 this.parent.appendChild(this.span = ce("span"));
31 B = this.span.style;
32 B.display = "block";
33 B.position = "relative";
34 ns(this.span);
35 if (this.editable) {
36 this.span.onmouseup = this.addPin.bind(this);
37 B = g_createGlow(LANG.mapper_tippin);
38 B.style.fontSize = "11px";
39 B.style.position = "absolute";
40 B.style.bottom = B.style.right = "0";
41 ns(B);
42 this.parent.appendChild(B)
43 } else {
44 this.sToggle = B = g_createGlow(LANG.mapper_hidepins);
45 B.style.position = "absolute";
46 B.style.top = B.style.right = "0";
47 B.onclick = this.toggleShow.bind(this);
48 B.style.display = "none";
49 ns(B);
50 this.parent.appendChild(B)
51 }
52 if (this.zoomable) {
53 this.span.onclick = this.toggleZoom.bind(this);
54 this.sZoom = B = g_createGlow(LANG.mapper_tipzoom);
55 B.style.fontSize = "11px";
56 B.style.position = "absolute";
57 B.style.bottom = B.style.right = "0";
58 ns(B);
59 this.span.appendChild(B)
60 }
61 if (this.zoneLink) {
62 this.sZoneLink = B = g_createGlow("zone link");
63 var E = B.childNodes[4];
64 var A = ce("a");
65 A.href = "?zones";
66 ae(A, ct(E.firstChild.nodeValue));
67 de(E.firstChild);
68 ae(E, A);
69 B.style.display = "none";
70 B.style.position = "absolute";
71 B.style.top = B.style.left = "0";
72 this.parent.appendChild(B)
73 }
74 if (this.mouse) {
75 this.parent.onmouseout = (function() {
76 this.timeout = setTimeout((function() {
77 this.sMouse.style.display = "none"
78 }).bind(this), 1)
79 }).bind(this);
80 this.parent.onmouseover = (function() {
81 clearTimeout(this.timeout);
82 this.sMouse.style.display = ""
83 }).bind(this);
84 this.span.onmousemove = this.span.onmousedown = this.getMousePos.bind(this);
85 this.sMouse = B = g_createGlow("(0.0, 0.0)");
86 B.style.display = "none";
87 B.style.position = "absolute";
88 B.style.bottom = B.style.left = "0";
89 B.onmouseup = sp;
90 ns(B);
91 this.span.appendChild(B)
92 }
93 this.pinBag = B = ce("div");
94 ae(this.span, this.pinBag);
95 if (C.coords != null) {
96 this.setCoords(C.coords)
97 } else {
98 if (C.link != null) {
99 this.setLink(C.link)
100 }
101 }
102 this.updateMap(D)
103}
104Mapper.sizes = [[488, 325, "normal"], [772, 515, "zoom"]];
105Mapper.prototype = {
106 update: function(A, B) {
107 if (A.zoom != null) {
108 this.zoom = A.zoom
109 }
110 if (A.zone != null) {
111 this.zone = A.zone
112 }
113 if (A.locale != null) {
114 this.locale = A.locale
115 }
116 if (A.show != null) {
117 this.show = A.show
118 }
119 if (A.coords != null) {
120 this.setCoords(A.coords)
121 } else {
122 if (A.link != null) {
123 this.setLink(A.link)
124 }
125 }
126 this.updateMap(B)
127 },
128 getZone: function() {
129 return this.zone
130 },
131 setZone: function(A, B) {
132 this.zone = A;
133 this.updateMap(B);
134 return true
135 },
136 getLocale: function() {
137 return this.locale
138 },
139 setLocale: function(A, B) {
140 this.locale = A;
141 this.updateMap(B)
142 },
143 getZoom: function() {
144 return this.zoom
145 },
146 setZoom: function(A, B) {
147 this.zoom = A;
148 this.updateMap(B)
149 },
150 toggleZoom: function(A) {
151 this.zoom = 1 - this.zoom;
152 this.updateMap();
153 this.getMousePos(A);
154 if (this.sZoom) {
155 this.sZoom.style.display = "none";
156 this.sZoom = null
157 }
158 },
159 getShow: function() {
160 return this.show
161 },
162 setShow: function(A) {
163 this.show = A;
164 var B = this.show ? "": "none";
165 this.pinBag.style.display = B;
166 g_setTextNodes(this.sToggle, (this.show ? LANG.mapper_hidepins: LANG.mapper_showpins))
167 },
168 toggleShow: function() {
169 this.setShow(!this.show)
170 },
171 getCoords: function() {
172 var A = [];
173 for (var B in this.pins) {
174 if (!this.pins[B].free) {
175 A.push([this.pins[B].x, this.pins[B].y])
176 }
177 }
178 return A
179 },
180 setCoords: function(D) {
181 var A;
182 for (var C in this.pins) {
183 this.pins[C].style.display = "none";
184 this.pins[C].free = true
185 }
186 this.nCoords = D.length;
187 for (var C in D) {
188 var E = D[C];
189 var B = E[2];
190 A = this.getPin();
191 A.x = E[0];
192 A.y = E[1];
193 A.style.left = A.x + "%";
194 A.style.top = A.y + "%";
195 if (this.editable) {
196 A.a.onmouseup = this.delPin.bind(this, A)
197 } else {
198 if (B && B.url) {
199 A.a.href = B.url;
200 A.a.style.cursor = "pointer"
201 }
202 }
203 if (B && B.label) {
204 A.a.tt = B.label
205 } else {
206 A.a.tt = "$"
207 }
208 if (B && B.type) {
209 A.className += " pin-" + B.type
210 }
211 A.a.tt = str_replace(A.a.tt, "$", A.x.toFixed(1) + ", " + A.y.toFixed(1))
212 }
213 this.onPinUpdate && this.onPinUpdate(this)
214 },
215 getLink: function() {
216 var B = "";
217 for (var A in this.pins) {
218 if (!this.pins[A].free) {
219 B += (this.pins[A].x < 10 ? "0": "") + (this.pins[A].x * 10).toFixed(0) + (this.pins[A].y < 10 ? "0": "") + (this.pins[A].y * 10).toFixed(0)
220 }
221 }
222 return (this.zone ? this.zone: "") + (B ? ":" + B: "")
223 },
224 setLink: function(D) {
225 var B = [];
226 D = D.split(":");
227 if (!this.setZone(D[0])) {
228 return false
229 }
230 if (D.length == 2) {
231 for (var C = 0; C < D[1].length; C += 6) {
232 var A = D[1].substr(C, 3) / 10;
233 var E = D[1].substr(C + 3, 3) / 10;
234 if (isNaN(A) || isNaN(E)) {
235 break
236 }
237 B.push([A, E])
238 }
239 }
240 this.setCoords(B);
241 return true
242 },
243 updateMap: function(C) {
244 this.parent.style.width = this.span.style.width = Mapper.sizes[this.zoom][0] + "px";
245 this.parent.style.height = this.span.style.height = Mapper.sizes[this.zoom][1] + "px";
246 if (!this.editable) {
247 this.parent.style.cssFloat = this.parent.style.styleFloat = "left"
248 }
249 if (this.zone == "0") {
250 this.span.style.background = "black"
251 } else {
252 this.span.style.background = "url(images/maps/" + this.locale + "/" + Mapper.sizes[this.zoom][2] + "/" + this.zone + ".jpg)"
253 }
254 if (this.zoneLink) {
255 var A = parseInt(this.zone);
256 var B = g_zones[A] != null;
257 if (B) {
258 g_setTextNodes(this.sZoneLink, g_zones[A]);
259 this.sZoneLink.childNodes[4].firstChild.href = "?zone=" + A
260 }
261 this.sZoneLink.style.display = B ? "": "none"
262 }
263 if (this.sToggle) {
264 this.sToggle.style.display = (this.toggle && this.nCoords ? "": "none")
265 }
266 if (!C) {
267 g_scrollTo(this.parent, 3)
268 }
269 this.onMapUpdate && this.onMapUpdate(this)
270 },
271 cleanPin: function(B) {
272 var A = this.pins[B];
273 A.style.display = "";
274 A.free = false;
275 A.className = "pin";
276 A.a.onmousedown = rf;
277 A.a.onmouseup = rf;
278 A.a.href = "javascript:;";
279 A.a.style.cursor = "default";
280 return A
281 },
282 getPin: function() {
283 for (var C = 0; C < this.pins.length; ++C) {
284 if (this.pins[C].free) {
285 return this.cleanPin(C)
286 }
287 }
288 var B = ce("div"),
289 A = ce("a");
290 B.className = "pin";
291 B.appendChild(A);
292 B.a = A;
293 A.onmouseover = this.pinOver;
294 A.onmouseout = Tooltip.hide;
295 A.onclick = sp;
296 this.pins.push(B);
297 this.cleanPin(this.pins.length - 1);
298 ae(this.pinBag, B);
299 return B
300 },
301 addPin: function(B) {
302 B = $E(B);
303 if (B._button >= 2) {
304 return
305 }
306 this.getMousePos(B);
307 var A = this.getPin();
308 A.x = this.mouseX;
309 A.y = this.mouseY;
310 A.style.left = A.x.toFixed(1) + "%";
311 A.style.top = A.y.toFixed(1) + "%";
312 A.a.onmouseup = this.delPin.bind(this, A);
313 A.a.tt = A.x.toFixed(1) + ", " + A.y.toFixed(1);
314 this.onPinUpdate && this.onPinUpdate(this);
315 return false
316 },
317 delPin: function(A, B) {
318 B = $E(B);
319 A.style.display = "none";
320 A.free = true;
321 sp(B);
322 this.onPinUpdate && this.onPinUpdate(this);
323 return
324 },
325 pinOver: function() {
326 Tooltip.show(this, this.tt, 4, 0)
327 },
328 getMousePos: function(B) {
329 B = $E(B);
330 var C = ac(this.parent);
331 var A = g_getScroll();
332 this.mouseX = Math.floor((B.clientX + A.x - C[0] - 3) / Mapper.sizes[this.zoom][0] * 1000) / 10;
333 this.mouseY = Math.floor((B.clientY + A.y - C[1] - 3) / Mapper.sizes[this.zoom][1] * 1000) / 10;
334 if (this.mouseX < 0) {
335 this.mouseX = 0
336 } else {
337 if (this.mouseX > 100) {
338 this.mouseX = 100
339 }
340 }
341 if (this.mouseY < 0) {
342 this.mouseY = 0
343 } else {
344 if (this.mouseY > 100) {
345 this.mouseY = 100
346 }
347 }
348 if (this.mouse) {
349 g_setTextNodes(this.sMouse, "(" + this.mouseX.toFixed(1) + ", " + this.mouseY.toFixed(1) + ")")
350 }
351 }
352};
353function ma_initShowOnMap() {
354 var D = ge("lenrlkn4");
355 var A = ce("select");
356 var C = ce("option");
357 C.value = "";
358 C.style.color = "#bbbbbb";
359 ae(C, ct(LANG.showonmap));
360 ae(A, C);
361 if (showOnMap.qg_alliance || showOnMap.qg_horde) {
362 var B = ce("optgroup", {
363 label: LANG.som_questgivers
364 });
365 if (showOnMap.qg_alliance) {
366 ae(B, ce("option", {
367 value: "qg_alliance",
368 innerHTML: g_sides[1] + sprintf(LANG.qty, showOnMap.qg_alliance.count)
369 }))
370 }
371 if (showOnMap.qg_horde) {
372 ae(B, ce("option", {
373 value: "qg_horde",
374 innerHTML: g_sides[2] + sprintf(LANG.qty, showOnMap.qg_horde.count)
375 }))
376 }
377 ae(A, B)
378 }
379 A.onchange = A.onkeyup = function() {
380 var E = this.options[this.selectedIndex].value;
381 myMapper.update({
382 zone: g_pageInfo.id,
383 coords: E ? showOnMap[E].coords: []
384 })
385 };
386 ae(D, A)
387};
Note: See TracBrowser for help on using the repository browser.