// Needed for IE because it's dumb 'abbr article aside audio canvas details figcaption figure footer header hgroup mark menu meter nav output progress section summary time video'.replace(/\w+/g,function(n){document.createElement(n)}) /*********/ /* ROLES */ /*********/ var U_GROUP_TESTER = 0x1; var U_GROUP_ADMIN = 0x2; var U_GROUP_EDITOR = 0x4; var U_GROUP_MOD = 0x8; var U_GROUP_BUREAU = 0x10; var U_GROUP_DEV = 0x20; var U_GROUP_VIP = 0x40; var U_GROUP_BLOGGER = 0x80; var U_GROUP_PREMIUM = 0x100; var U_GROUP_LOCALIZER = 0x200; var U_GROUP_SALESAGENT = 0x400; var U_GROUP_SCREENSHOT = 0x800; var U_GROUP_VIDEO = 0x1000; var U_GROUP_APIONLY = 0x2000; var U_GROUP_PENDING = 0x4000; /******************/ /* ROLE SHORTCUTS */ /******************/ var U_GROUP_STAFF = U_GROUP_ADMIN | U_GROUP_EDITOR | U_GROUP_MOD | U_GROUP_BUREAU | U_GROUP_DEV | U_GROUP_BLOGGER | U_GROUP_LOCALIZER | U_GROUP_SALESAGENT; var U_GROUP_EMPLOYEE = U_GROUP_ADMIN | U_GROUP_BUREAU | U_GROUP_DEV; var U_GROUP_GREEN_TEXT = U_GROUP_MOD | U_GROUP_BUREAU | U_GROUP_DEV; var U_GROUP_MODERATOR = U_GROUP_ADMIN | U_GROUP_MOD | U_GROUP_BUREAU; var U_GROUP_COMMENTS_MODERATOR = U_GROUP_BUREAU | U_GROUP_MODERATOR | U_GROUP_LOCALIZER; var U_GROUP_PREMIUM_PERMISSIONS = U_GROUP_PREMIUM | U_GROUP_STAFF | U_GROUP_VIP; var g_users = {}; function g_isUsernameValid(username) { return (username.match(/[^a-z0-9]/i) == null && username.length >= 4 && username.length <= 16); } var User = new function() { var self = this; /**********/ /* PUBLIC */ /**********/ self.hasPermissions = function(roles) { if (!roles) { return true; } return !!(g_user.roles & roles); } /**********/ /* PRIVATE */ /**********/ }; function Ajax(url, opt) { if (!url) { return; } var _; try { _ = new XMLHttpRequest() } catch(e) { try { _ = new ActiveXObject("Msxml2.XMLHTTP") } catch(e) { try { _ = new ActiveXObject("Microsoft.XMLHTTP") } catch(e) { if (window.createRequest) { _ = window.createRequest(); } else { alert(LANG.message_ajaxnotsupported); return; } } } } this.request = _; $WH.cO(this, opt); this.method = this.method || (this.params && 'POST') || 'GET'; _.open(this.method, url, this.async == null ? true: this.async); _.onreadystatechange = Ajax.onReadyStateChange.bind(this); if (this.method.toUpperCase() == 'POST') { _.setRequestHeader('Content-Type', (this.contentType || 'application/x-www-form-urlencoded') + '; charset=' + (this.encoding || 'UTF-8')); } _.send(this.params); } Ajax.onReadyStateChange = function() { if (this.request.readyState == 4) { if (this.request.status == 0 || (this.request.status >= 200 && this.request.status < 300)) { this.onSuccess != null && this.onSuccess(this.request, this); } else { this.onFailure != null && this.onFailure(this.request, this); } if (this.onComplete != null) { this.onComplete(this.request, this); } } }; var DomContentLoaded = new function() { var _now = []; var _del = []; this.now = function() { $WH.array_apply(_now, function(f) { f(); }); }; this.delayed = function() { $WH.array_apply(_del, function(f) { f(); }); DomContentLoaded = null; }; this.addEvent = function(f) { _now.push(f); }; this.addDelayedEvent = function(f) { _del.push(f); } }; function g_addCss(b) { var c = $WH.ce("style"); c.type = "text/css"; if (c.styleSheet) { c.styleSheet.cssText = b } else { $WH.ae(c, $WH.ct(b)) } var a = $WH.gE(document, "head")[0]; $WH.ae(a, c) } function g_setTextNodes(c, b) { if (c.nodeType == 3) { c.nodeValue = b } else { for (var a = 0; a < c.childNodes.length; ++a) { g_setTextNodes(c.childNodes[a], b) } } } function g_setInnerHtml(d, c, a) { if (d.nodeName.toLowerCase() == a) { d.innerHTML = c } else { for (var b = 0; b < d.childNodes.length; ++b) { g_setInnerHtml(d.childNodes[b], c, a) } } } function g_getTextContent(c) { var a = ""; for (var b = 0; b < c.childNodes.length; ++b) { if (c.childNodes[b].nodeValue) { a += c.childNodes[b].nodeValue } else { if (c.childNodes[b].nodeName == "BR") { if ($WH.Browser.ie67) { a += "\r" } else { a += "\n" } } } a += g_getTextContent(c.childNodes[b]) } return a } function g_pickerWheel(evt) { evt = $WH.$E(evt); if (evt._wheelDelta < 0) this.scrollTop += 27; else this.scrollTop -= 27; } function g_setSelectedLink(c, b) { if (!g_setSelectedLink.groups) { g_setSelectedLink.groups = {} } var a = g_setSelectedLink.groups; if (a[b]) { a[b].className = a[b].className.replace("selected", "") } c.className += " selected"; a[b] = c } function g_setCheckedRow(c, b) { if (!g_setCheckedRow.groups) { g_setCheckedRow.groups = {} } var a = g_setCheckedRow.groups; if (a[b]) { a[b].className = a[b].className.replace("checked", "") } c.className += " checked"; a[b] = c } function g_toggleDisplay(a) { if (a.style.display == "none") { a.style.display = ""; return true } else { a.style.display = "none"; return false } } function g_enableScroll(a) { if (!a) { $WH.aE(document, "mousewheel", g_enableScroll.F); $WH.aE(window, "DOMMouseScroll", g_enableScroll.F) } else { $WH.dE(document, "mousewheel", g_enableScroll.F); $WH.dE(window, "DOMMouseScroll", g_enableScroll.F) } } g_enableScroll.F = function(a) { if (a.stopPropagation) { a.stopPropagation() } if (a.preventDefault) { a.preventDefault() } a.returnValue = false; a.cancelBubble = true; return false }; function g_createRange(c, a) { range = {}; for (var b = c; b <= a; ++b) { range[b] = b } return range } function g_sortIdArray(a, b, c) { a.sort(c ? function(e, d) { return $WH.strcmp(b[e][c], b[d][c]) }: function(e, d) { return $WH.strcmp(b[e], b[d]) }) } function g_sortJsonArray(e, d, f, a) { var c = []; for (var b in e) { if (d[b] && (a == null || a(d[b]))) { c.push(b) } } if (f != null) { c.sort(f) } else { g_sortIdArray(c, d) } return c } function g_urlize(str, allowLocales, profile) { var ta = $WH.ce('textarea'); ta.innerHTML = str.replace(//g,">"); str = ta.value; str = $WH.str_replace(str, ' / ', '-'); str = $WH.str_replace(str, "'", ''); if (profile) { str = $WH.str_replace(str, '(', ''); str = $WH.str_replace(str, ')', ''); var accents = { "ß": "ss", "á": "a", "ä": "a", "à": "a", "â": "a", "è": "e", "ê": "e", "é": "e", "ë": "e", "í": "i", "î": "i", "ì": "i", "ï": "i", "ñ": "n", "ò": "o", "ó": "o", "ö": "o", "ô": "o", "ú": "u", "ü": "u", "û": "u", "ù": "u", "œ": "oe", "Á": "A", "Ä": "A", "À": "A", "Â": "A", "È": "E", "Ê": "E", "É": "E", "Ë": "E", "Í": "I", "Î": "I", "Ì": "I", "Ï": "I", "Ñ": "N", "Ò": "O", "Ó": "O", "Ö": "O", "Ô": "O", "Ú": "U", "Ü": "U", "Û": "U", "Ù": "U", "œ": "Oe" }; for (var character in accents) { str = str.replace(new RegExp(character, "g"), accents[character]); } } str = $WH.trim(str); if (allowLocales) { str = $WH.str_replace(str, ' ', '-'); } else { str = str.replace(/[^a-z0-9]/ig, '-'); } str = $WH.str_replace(str, '--', '-'); str = $WH.str_replace(str, '--', '-'); str = $WH.rtrim(str, '-'); str = str.replace(/[A-Z]/g, function(x) { return x.toLowerCase(); }); return str; } function g_createHeader(c) { var k = $WH.ce("dl"), p = (c == 5); for (var j = 0, l = mn_path.length; j < l; ++j) { var f = $WH.ce("dt"); var q = $WH.ce("a"); var m = $WH.ce("ins"); var g = $WH.ce("big"); var e = $WH.ce("span"); var o = mn_path[j][0]; var h = (o == c); var d = (!h && mn_path[j][3]); if (p && o == 5) { d = true; mn_path[j][3] = mn_profiles } if (d) { Menu.add(q, mn_path[j][3]); } else { q.onmouseover = Menu._hide } if (mn_path[j][2]) { q.href = mn_path[j][2] } else { q.href = "javascript:;"; $WH.ns(q); q.style.cursor = "default" } if (h) { q.className = "selected" } $WH.ae(g, $WH.ct(mn_path[j][1].charAt(0))); $WH.ae(m, g); $WH.ae(m, $WH.ct(mn_path[j][1].substr(1))); $WH.ae(q, m); $WH.ae(q, e); $WH.ae(f, q); $WH.ae(k, f) } $WH.ae($WH.ge("toptabs-generic"), k); var b = $WH.ge("topbar-generic"); if (c != null && c >= 0 && c < mn_path.length) { c = parseInt(c); switch (c) { case 0: // Database Menu.addButtons(b, [ [0, LANG.menu_browse, null, mn_database], // Browse Menu.findItem(mn_tools, [8]), // Utilities Menu.findItem(mn_tools, [8, 4]) // Random Page ]); break; case 1: // Tools Menu.addButtons(b, [ [0, LANG.calculators, null, mn_tools.slice(0,4)], // Calculators Menu.findItem(mn_tools, [1]), // Maps Menu.findItem(mn_tools, [8]), // Utilities Menu.findItem(mn_tools, [6]), // Guides ]); break; case 2: Menu.addButtons(b, Menu.explode(mn_more)); break; case 5: pr_initTopBarSearch(); break } } else { $WH.ae(b, $WH.ct(String.fromCharCode(160))); } } function g_updateHeader(a) { $WH.ee($WH.ge("toptabs-generic")); $WH.ee($WH.ge("topbar-generic")); g_createHeader(a) } function g_initHeader(a) { g_createHeader(a); var d = $WH.ge("livesearch-generic"); var b = d.previousSibling; var c = d.parentNode; $WH.ns(b); b.onclick = function() { this.parentNode.onsubmit() }; if ($WH.Browser.ie) { setTimeout(function() { d.value = "" }, 1) } if (d.value == "") { d.className = "search-database" } d.onmouseover = function() { if ($WH.trim(this.value) != "") { this.className = "" } }; d.onfocus = function() { this.className = "" }; d.onblur = function() { if ($WH.trim(this.value) == "") { this.className = "search-database"; this.value = "" } }; c.onsubmit = function() { var e = this.elements[0].value; if ($WH.trim(e) == "") { return false } this.submit() } } function g_initHeaderMenus() { var c = $WH.ge("toptabs-menu-user"); if (c) { menu = [[0, LANG.userpage, "?user=" + g_user.name], [0, LANG.settings, "?account"], [0, LANG.signout, "?account=signout"]]; if (location.href.match(new RegExp("/?user=" + g_user.name + "$", "i"))) { menu[0].checked = 1 } else { if (location.href.indexOf("?account") != -1) { menu[1].checked = 1 } } Menu.add(c, menu); c.href = "?user=" + g_user.name } c = $WH.ge("toptabs-menu-profiles"); if (c) { c.menu = []; if (g_user.characters) { c.menu.push([, LANG.tab_characters]); for (var f = 0, b = g_user.characters.length; f < b; ++f) { var h = g_user.characters[f], e = [0, h.name + " (" + h.realmname + LANG.hyphen + h.region.toUpperCase() + ")", "?profile=" + h.region + "." + h.realm + "." + g_cleanCharacterName(h.name)]; e.smallIcon = h.icon ? h.icon: "chr_" + g_file_races[h.race] + "_" + g_file_genders[h.gender] + "_" + g_file_classes[h.classs] + "0" + (h.level > 59 ? (Math.floor((h.level - 60) / 10) + 2) : 1); c.menu.push(e) } } c.menu.push([, LANG.tab_profiles]); if (g_user.profiles) { for (var f = 0, b = g_user.profiles.length; f < b; ++f) { var h = g_user.profiles[f], e = [0, h.name, "?profile=" + h.id]; e.smallIcon = h.icon ? h.icon: "chr_" + g_file_races[h.race] + "_" + g_file_genders[h.gender] + "_" + g_file_classes[h.classs] + "0" + (h.level > 59 ? (Math.floor((h.level - 60) / 10) + 2) : 1); c.menu.push(e) } } var e = [0, "(" + LANG.button_new + ")", "?profile&new"]; e.smallIcon = "inv_misc_questionmark"; c.menu.push(e); c.menu.rightAligned = 1; Menu.add(c, c.menu); c.href = "?user=" + g_user.name + (g_user.profiles ? "#profiles": (g_user.characters ? "#characters": "")) } c = $WH.ge("toptabs-menu-language"); if (c) { var g = "www", d = location.href, j = location.hostname.indexOf("."); if (j != -1 && j <= 5) { g = location.hostname.substr(0, j) } j = d.indexOf("#"); if (j != -1) { d = d.substr(0, j) } //menu = [[0, "Deutsch", (g_locale.id != 3 ? d.replace(g, "de") : null)], [0, "English", (g_locale.id != 0 ? d.replace(g, "www") : null)], [0, "Espa" + String.fromCharCode(241) + "ol", (g_locale.id != 6 ? d.replace(g, "es") : null)], [0, "Fran" + String.fromCharCode(231) + "ais", (g_locale.id != 2 ? d.replace(g, "fr") : null)], [0, String.fromCharCode(1056, 1091, 1089, 1089, 1082, 1080, 1081), (g_locale.id != 8 ? d.replace(g, "ru") : null)]]; var rel = d.match(/()\?((item|quest|spell|achievement|npc|object)=([0-9]+))/); rel = (rel && rel[2]) ? rel[2] : ""; menu = [ [0, "Deutsch", (g_locale.id != 3 ? "?locale=3" : null), , {rel: rel + " domain=de"}], [0, "English", (g_locale.id != 0 ? "?locale=0" : null), , {rel: rel + " domain=en"}], [0, "Espa" + String.fromCharCode(241) + "ol", (g_locale.id != 6 ? "?locale=6" : null), , {rel: rel + " domain=es"}], [0, "Fran" + String.fromCharCode(231) + "ais", (g_locale.id != 2 ? "?locale=2" : null), , {rel: rel + " domain=fr"}], [0, String.fromCharCode(1056, 1091, 1089, 1089, 1082, 1080, 1081), (g_locale.id != 8 ? "?locale=8" : null), , {rel: rel + " domain=ru"}] ]; menu.rightAligned = 1; if (g_locale.id != 25) { menu[{ 0 : 1, 2 : 3, 3 : 0, 6 : 2, 8 : 4 } [g_locale.id]].checked = 1 } Menu.add(c, menu); } } function g_initPath(q, f) { var h = mn_path, c = null, k = null, p = 0, l = $WH.ge("main-precontents"), o = $WH.ce("div"); $WH.ee(l); if (g_initPath.lastIt) { g_initPath.lastIt.checked = null } o.className = "path"; if (f != null) { var m = $WH.ce("div"); m.className = "path-right"; var r = $WH.ce("a"); r.href = "javascript:;"; r.id = "fi_toggle"; $WH.ns(r); r.onclick = fi_toggle; if (f) { r.className = "disclosure-on"; $WH.ae(r, $WH.ct(LANG.fihide)) } else { r.className = "disclosure-off"; $WH.ae(r, $WH.ct(LANG.fishow)) } $WH.ae(m, r); $WH.ae(l, m) } for (var g = 0; g < q.length; ++g) { var r, b, t = 0; for (var e = 0; e < h.length; ++e) { if (h[e][0] == q[g]) { t = 1; h = h[e]; h.checked = 1; break } } if (!t) { p = 1; break } r = $WH.ce("a"); b = $WH.ce("span"); if (h[2]) { r.href = h[2] } else { r.href = "javascript:;"; $WH.ns(r); r.style.textDecoration = "none"; r.style.color = "white"; r.style.cursor = "default" } if (g < q.length - 1 && h[3]) { b.className = "menuarrow" } //$WH.ae(r, $WH.ct(h[4] == null ? h[1] : h[4])); $WH.ae(r, $WH.ct(h[1])); if (g == 0) { Menu.add(r, mn_path); } else { Menu.add(r, c[3]); } $WH.ae(b, r); $WH.ae(o, b); k = b; c = h; h = h[3]; if (!h) { p = 1; break } } if (p && k) { k.className = "" } else { if (c && c[3]) { k.className = "menuarrow"; r = $WH.ce("a"); b = $WH.ce("span"); r.href = "javascript:;"; $WH.ns(r); r.style.textDecoration = "none"; r.style.paddingRight = "16px"; r.style.color = "white"; r.style.cursor = "default"; $WH.ae(r, $WH.ct("...")); Menu.add(r, c[3]); $WH.ae(b, r); $WH.ae(o, b) } } // not really usefull // var m = $WH.ce("div"); // m.className = "clear"; // $WH.ae(o, m); $WH.ae(l, o); g_initPath.lastIt = c } function g_addTooltip(b, c, a) { if (!a && c.indexOf("") == -1) { a = "q" } b.onmouseover = function(d) { $WH.Tooltip.showAtCursor(d, c, 0, 0, a) }; b.onmousemove = $WH.Tooltip.cursorUpdate; b.onmouseout = $WH.Tooltip.hide } function g_addStaticTooltip(b, c, a) { if (!a && c.indexOf("
") == -1) { a = "q" } b.onmouseover = function(d) { $WH.Tooltip.show(b, c, 0, 0, a) }; b.onmouseout = $WH.Tooltip.hide } function g_formatTimeElapsed(delay) { function OMG(value, unit, abbrv) { if (abbrv && LANG.timeunitsab[unit] == '') { abbrv = 0; } if (abbrv) { return value + ' ' + LANG.timeunitsab[unit]; } else { return value + ' ' + (value == 1 ? LANG.timeunitssg[unit] : LANG.timeunitspl[unit]); } } var range = [31557600, 2629800, 604800, 86400, 3600, 60, 1], subunit = [1, 3, 3, -1, 5, -1, -1]; delay = Math.max(delay, 1); for (var i = 3, len = range.length; i < len; ++i) { if (delay >= range[i]) { var i1 = i; var v1 = Math.floor(delay / range[i1]); if (subunit[i1] != -1) { var i2 = subunit[i1]; delay %= range[i1]; var v2 = Math.floor(delay / range[i2]); if (v2 > 0) { return OMG(v1, i1, 1) + ' ' + OMG(v2, i2, 1); } } return OMG(v1, i1, 0); } } return '(n/a)'; } function g_GetStaffColorFromRoles(roles) { if (roles & U_GROUP_ADMIN) { return 'comment-blue'; } if (roles & U_GROUP_GREEN_TEXT) { // Mod, Bureau, Dev return 'comment-green'; } if (roles & U_GROUP_VIP) { // VIP return 'comment-gold'; } return ''; } function g_formatDate(sp, elapsed, theDate, time, alone) { var today = new Date(); var event_day = new Date(); event_day.setTime(today.getTime() - (1000 * elapsed)); var txt; var event_day_midnight = new Date(event_day.getYear(), event_day.getMonth(), event_day.getDate()); var today_midnight = new Date(today.getYear(), today.getMonth(), today.getDate()); var delta = (today_midnight.getTime() - event_day_midnight.getTime()); delta /= 1000; delta /= 86400; delta = Math.round(delta); if (elapsed >= 2592000) { /* More than a month ago */ txt = LANG.date_on + g_formatDateSimple(theDate, time); } else if (delta > 1) { txt = $WH.sprintf(LANG.ddaysago, delta); if (sp) { var _ = new Date(); _.setTime(theDate.getTime() + (g_localTime - g_serverTime)); sp.className += ' tip'; sp.title = _.toLocaleString(); } } else if (elapsed >= 43200) { if (today.getDay() == event_day.getDay()) { txt = LANG.today; } else { txt = LANG.yesterday; } txt = g_formatTimeSimple(event_day, txt); if (sp) { var _ = new Date(); _.setTime(theDate.getTime() + (g_localTime - g_serverTime)); sp.className += ' tip'; sp.title = _.toLocaleString(); } } else { /* Less than 12 hours ago */ var txt = $WH.sprintf(LANG.date_ago, g_formatTimeElapsed(elapsed)); if (sp) { var _ = new Date(); _.setTime(theDate.getTime() + (g_localTime - g_serverTime)); sp.className += ' tip'; sp.title = _.toLocaleString(); } } if (alone == 1) { txt = txt.substr(0, 1).toUpperCase() + txt.substr(1); } if (sp) { $WH.ae(sp, $WH.ct(txt)); } else { return txt; } } function g_formatDateSimple(d, time) { function __twoDigits(n) { return (n < 10 ? '0' + n : n); } var b = "", day = d.getDate(), month = d.getMonth() + 1, year = d.getFullYear(); if (year <= 1970) { b += LANG.unknowndate_stc; } else { b += $WH.sprintf(LANG.date_simple, __twoDigits(day), __twoDigits(month), year); } if (time != null) { b = g_formatTimeSimple(d, b); } return b; } function g_formatTimeSimple(d, txt, noPrefix) { function __twoDigits(n) { return (n < 10 ? '0' + n : n); } var hours = d.getHours(), minutes = d.getMinutes(); if (txt == null) { txt = ''; } txt += (noPrefix ? ' ' : LANG.date_at); if (hours == 12) { txt += LANG.noon; } else if (hours == 0) { txt += LANG.midnight; } else if (hours > 12) { txt += (hours - 12) + ':' + __twoDigits(minutes) + ' ' + LANG.pm; } else { txt += hours + ':' + __twoDigits(minutes) + ' ' + LANG.am; } return txt; } function g_cleanCharacterName(e) { var d = ""; for (var c = 0, a = e.length; c < a; ++c) { var b = e.charAt(c).toLowerCase(); if (b >= "a" && b <= "z") { d += b } else { d += e.charAt(c) } } return d } function g_createGlow(a, h) { var e = $WH.ce("span"); for (var c = -1; c <= 1; ++c) { for (var b = -1; b <= 1; ++b) { var g = $WH.ce("div"); g.style.position = "absolute"; g.style.whiteSpace = "nowrap"; g.style.left = c + "px"; g.style.top = b + "px"; if (c == 0 && b == 0) { g.style.zIndex = 4 } else { g.style.color = "black"; g.style.zIndex = 2 } g.innerHTML = a; $WH.ae(e, g) } } e.style.position = "relative"; e.className = "glow" + (h != null ? " " + h: ""); var f = $WH.ce("span"); f.style.visibility = "hidden"; $WH.ae(f, $WH.ct(a)); $WH.ae(e, f); return e } function g_createProgressBar(c) { if (c == null) { c = {} } if (!c.text) { c.text = " " } if (c.color == null) { c.color = "rep0" } if (c.width == null || c.width > 100) { c.width = 100 } var d, e; if (c.hoverText) { d = $WH.ce("a"); d.href = "javascript:;" } else { d = $WH.ce("span") } d.className = "progressbar"; if (c.text || c.hoverText) { e = $WH.ce("div"); e.className = "progressbar-text"; if (c.text) { var a = $WH.ce("del"); $WH.ae(a, $WH.ct(c.text)); $WH.ae(e, a) } if (c.hoverText) { var b = $WH.ce("ins"); $WH.ae(b, $WH.ct(c.hoverText)); $WH.ae(e, b) } $WH.ae(d, e) } e = $WH.ce("div"); e.className = "progressbar-" + c.color; e.style.width = c.width + "%"; $WH.ae(e, $WH.ct(String.fromCharCode(160))); $WH.ae(d, e); return d } function g_createReputationBar(g) { var f = g_createReputationBar.P; if (!g) { g = 0 } g += 42000; if (g < 0) { g = 0 } else { if (g > 84999) { g = 84999 } } var e = g, h, b = 0; for (var d = 0, a = f.length; d < a; ++d) { if (f[d] > e) { break } if (d < a - 1) { e -= f[d]; b = d + 1 } } h = f[b]; var c = { text: g_reputation_standings[b], hoverText: e + " / " + h, color: "rep" + b, width: parseInt(e / h * 100) }; return g_createProgressBar(c) } g_createReputationBar.P = [36000, 3000, 3000, 3000, 6000, 12000, 21000, 999]; function g_createAchievementBar(b, d, a) { if (!b) { b = 0 } var c = { text: b + (d > 0 ? " / " + d: ""), color: (a ? "rep7": "ach" + (d > 0 ? 0 : 1)), width: (d > 0 ? parseInt(b / d * 100) : 100) }; return g_createProgressBar(c) } function g_getMoneyHtml(money, side, costItems, costCurrency, achievementPoints) { var ns = 0, html = ''; if (side == 1 || side == 'alliance') { side = 1; } else if (side == 2 || side == 'horde') { side = 2; } else { side = 3; } if (money >= 10000) { ns = 1; var display = Math.floor(money / 10000); html += '' + $WH.number_format(display) + ''; money %= 10000; } if (money >= 100) { if (ns) { html += ' '; } else { ns = 1; } var display = Math.floor(money / 100); html += '' + display + ''; money %= 100; } if (money >= 1) { if (ns) { html += ' '; } else { ns = 1; } html += '' + money + ''; } if (costItems != null) { for (var i = 0; i < costItems.length; ++i) { if (ns) { html += ' '; } else { ns = 1; } var itemId = costItems[i][0]; var count = costItems[i][1]; var icon = (g_items[itemId] && g_items[itemId].icon ? g_items[itemId].icon : 'inv_misc_questionmark'); html += '' + count + ''; } } if (costCurrency != null) { for (var i = 0; i < costCurrency.length; ++i) { if (ns) { html += ' '; } else { ns = 1; } var currencyId = costCurrency[i][0]; var count = costCurrency[i][1]; var icon = (g_gatheredcurrencies[currencyId] && g_gatheredcurrencies[currencyId].icon ? g_gatheredcurrencies[currencyId].icon : ['inv_misc_questionmark', 'inv_misc_questionmark']); if (side == 3 && icon[0] == icon[1]) { side = 1; } // sarjuuk: custom start if (currencyId == 103) { // arena html += '' + $WH.number_format(count) + ''; } else if (currencyId == 104) { // honor html += '' + $WH.number_format(count) + ''; } else { // tokens html += '' + count + ''; } // sarjuuk: custom end // html += '' + (side == 3 ? '' : '') + count + (side == 3 ? '' : '') + ''; } } if (achievementPoints > 0) { if (ns) { html += ' '; } else { ns = 1; } html += '' + $WH.number_format(achievementPoints) + ''; } return html; } function g_numberFormat(f, b, l, h) { var c = f, a = b; var e = function(r, q) { var i = Math.pow(10, q); return (Math.round(r * i) / i).toString() }; c = !isFinite( + c) ? 0 : +c; a = !isFinite( + a) ? 0 : Math.abs(a); var p = (typeof h === "undefined") ? ",": h; var d = (typeof l === "undefined") ? ".": l; var o = (a > 0) ? e(c, a) : e(Math.round(c), a); var m = e(Math.abs(c), a); var k, g; if (m >= 1000) { k = m.split(/\D/); g = k[0].length % 3 || 3; k[0] = o.slice(0, g + (c < 0)) + k[0].slice(g).replace(/(\d{3})/g, p + "$1"); o = k.join(d) } else { o = o.replace(".", d) } var j = o.indexOf(d); if (a >= 1 && j !== -1 && (o.length - j - 1) < a) { o += new Array(a - (o.length - j - 1)).join(0) + "0" } else { if (a >= 1 && j === -1) { o += d + new Array(a).join(0) + "0" } } return o } function g_expandSite() { $WH.ge("wrapper").className = "nosidebar"; var a = $WH.ge("topbar-expand"); if (a) { $WH.de(a) } a = $WH.ge("sidebar"); if (a) { $WH.de(a) } } function g_insertTag(d, a, i, j) { var b = $(d); b.focus(); if (b.selectionStart != null) { var l = b.selectionStart, h = b.selectionEnd, k = b.scrollLeft, c = b.scrollTop; var g = b.value.substring(l, h); if (typeof j == "function") { g = j(g) } b.value = b.value.substr(0, l) + a + g + i + b.value.substr(h); b.selectionStart = b.selectionEnd = h + a.length; b.scrollLeft = k; b.scrollTop = c } else { if (document.selection && document.selection.createRange) { var f = document.selection.createRange(); if (f.parentElement() != b) { return } var g = f.text; if (typeof j == "function") { g = j(g) } f.text = a + g + i } } if (b.onkeyup) { b.onkeyup() } } function g_isDateValid(date) { var match = /^(20[0-2]\d)-([01]\d)-([0-3]\d) ([0-2]\d):([0-5]\d):([0-5]\d)$/.exec(date); return match; } function g_isIpAddress(str) { return /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/.test(str); } function g_isEmailValid(email) { return email.match(/^([a-z0-9._-]+)(\+[a-z0-9._-]+)?(@[a-z0-9.-]+\.[a-z]{2,4})$/i) != null; } function g_getCurrentDomain() { if (g_getCurrentDomain.CACHE) { return g_getCurrentDomain.CACHE; } var hostname = location.hostname; if (!g_isIpAddress(hostname)) { // Only keep the last 2 parts var parts = hostname.split('.'); if(parts.length > 2) { parts.splice(0, parts.length - 2); } hostname = parts.join('.'); } g_getCurrentDomain.CACHE = hostname; return hostname; } function g_onAfterTyping(a, d, c) { var e; var b = function() { if (e) { clearTimeout(e); e = null } e = setTimeout(d, c) }; a.onkeyup = b } function g_onClick(c, d) { var b = 0; function a(e) { if (b) { if (b != e) { return } } else { b = e } d(true) } c.oncontextmenu = function() { a(1); return false }; c.onmouseup = function(f) { f = $WH.$E(f); if (f._button == 3 || f.shiftKey || f.ctrlKey) { a(2) } else { if (f._button == 1) { d(false) } } return false } } function g_isLeftClick(a) { a = $WH.$E(a); return (a && a._button == 1) } function g_isExternalUrl(url) { if(!url) { return false; } if (url.indexOf('http') != 0 && url.indexOf('//') != 0) { return false; } else if (url.indexOf(g_getCurrentDomain()) != -1) { return false; } return true; } function g_createOrRegex(search, negativeGroup) { search = search.replace(/(\(|\)|\|\+|\*|\?|\$|\^)/g, '\\$1'); var parts = search.split(' '), strRegex= ''; for (var j = 0, len = parts.length; j < len; ++j) { if (j > 0) { strRegex += '|'; } strRegex += parts[j]; } // The additional group is necessary so we dont replace %s return new RegExp((negativeGroup != null ? '(' + negativeGroup + ')?' : '') + '(' + strRegex + ')', 'gi'); } function g_getHash() { return '#' + decodeURIComponent(location.href.split('#')[1] || ''); } // Lets you add/remove/edit the query parameters in the passed URL function g_modifyUrl(url, params, opt) { if (!opt) { opt = $.noop; } // Preserve existing hash var hash = ''; if (url.match(/(#.+)$/)) { hash = RegExp.$1; url = url.replace(hash, ''); } $.each(params, function(paramName, newValue) { var needle; var paramPrefix; var paramValue; var matches = url.match(new RegExp('(&|\\?)?' + paramName + '=?([^&]+)?')); if (matches != null) { needle = matches[0]; paramPrefix = matches[1]; paramValue = decodeURIComponent(matches[2]); } // Remove if (newValue == null) { if (!needle) { return; // If param wasn't there, no need to remove anything } paramValue = null; } // Append else if (newValue.substr(0, 2) == '+=') { if (paramValue && opt.onAppendCollision) { paramValue = opt.onAppendCollision(paramValue, newValue.substr(2), opt.menuUrl); } else if (!paramValue && opt.onAppendEmpty) { paramValue = opt.onAppendEmpty(newValue.substr(2), opt.menuUrl); } else { if (!paramValue) { paramValue = ''; } paramValue += $.trim(newValue.substr(2)); } } // Set else { paramValue = newValue; } // Replace existing param if (needle) { var replacement = ''; if (paramPrefix) { // Preserve existing prefix replacement += paramPrefix; } if (paramValue != null) { replacement += paramName; if (paramValue) { replacement += '=' + $WH.urlencode2(paramValue); } } url = url.replace(needle, replacement); } // Add new param else if (paramValue || newValue == null || newValue.substr(0,2) != '+=') { url += (url.indexOf('?') == -1 ? '?' : '&') + paramName; if (paramValue) { url += '=' + $WH.urlencode2(paramValue); } } }); // Polish url = url.replace('?&', '?'); url = url.replace(/&&/g, '&'); url = url.replace(/\/\?/g, '/'); url = url.replace(/(&|\?)+$/, ''); // Remove trailing & and ? characters return url + hash; } DomContentLoaded.addEvent(function () { $WH.array_apply($WH.gE(document, 'dfn'), function(x){ var text = x.title; x.title = ''; x.className += ' tip'; if (text.indexOf('LANG.') == 0) { // custom for less redundant texts text = eval(text); } g_addTooltip(x, text, 'q'); }); // if i understand this right, this code binds an onCopy eventHandler to every child node of class="text"-nodes with the attribute unselectable="on" // causing the text to disappear for 1ms, causing the empty node to be copied ... w/e, i'm not going to use this /* $('.text').bind('copy', function() { $('*[unselectable]', this).each(function(i, v) { var txt = $(v).text(); $(v).text(''); setTimeout(function() { $(v).text(txt) }, 1); }); }); */ }); function g_GetExpansionClassName(expansion) { switch (expansion) { case 0: return null; case 1: return "bc-icon-right"; case 2: return "wotlk-icon-right"; } return null; } function g_addPages(l, b) { function p(r, d) { var i; if (r == b.page) { i = $WH.ce("span"); i.className = "selected" } else { i = $WH.ce("a"); i.href = (r > 1 ? b.url + b.sep + r + b.pound: b.url + b.pound) } $WH.ae(i, $WH.ct(d != null ? d: r)); return i } if (!b.pound) { b.pound = "" } if (!b.sep) { b.sep = "." } if (b.allOrNothing && b.nPages <= 1) { return } var c = (b.align && b.align == "left"); var e = $WH.ce("div"), k, q = $WH.ce("var"); e.className = "pages"; if (c) { e.className += " pages-left" } if (b.nPages > 1) { k = $WH.ce("div"); k.className = "pages-numbers"; var o = Math.max(2, b.page - 3); var h = Math.min(b.nPages - 1, b.page + 3); var m = []; if (b.page != b.nPages) { m.push(p(b.page + 1, LANG.lvpage_next + String.fromCharCode(8250))) } m.push(p(b.nPages)); if (h < b.nPages - 1) { var a = $WH.ce("span"); $WH.ae(a, $WH.ct("...")); m.push(a) } for (var g = h; g >= o; --g) { m.push(p(g)) } if (o > 2) { var a = $WH.ce("span"); $WH.ae(a, $WH.ct("...")); m.push(a) } m.push(p(1)); if (b.page != 1) { m.push(p(b.page - 1, String.fromCharCode(8249) + LANG.lvpage_previous)) } if (c) { m.reverse() } for (var g = 0, j = m.length; g < j; ++g) { $WH.ae(k, m[g]) } k.firstChild.style.marginRight = "0"; k.lastChild.style.marginLeft = "0" } var q = $WH.ce("var"); $WH.ae(q, $WH.ct($WH.sprintf(LANG[b.wording[b.nItems == 1 ? 0 : 1]], b.nItems))); if (b.nPages > 1) { var a = $WH.ce("span"); $WH.ae(a, $WH.ct(String.fromCharCode(8211))); $WH.ae(q, a); var f = $WH.ce("a"); f.className = "gotopage"; f.href = "javascript:;"; $WH.ns(f); if ($WH.Browser.ie) { $WH.ae(f, $WH.ct(" ")) } f.onclick = function() { var d = prompt($WH.sprintf(LANG.prompt_gotopage, 1, b.nPages), b.page); if (d != null) { d |= 0; if (d != b.page && d >= 1 && d <= b.nPages) { document.location.href = (d > 1 ? b.url + b.sep + d + b.pound: b.url + b.pound) } } }; f.onmouseover = function(d) { $WH.Tooltip.showAtCursor(d, LANG.tooltip_gotopage, 0, 0, "q") }; f.onmousemove = $WH.Tooltip.cursorUpdate; f.onmouseout = $WH.Tooltip.hide; $WH.ae(q, f) } if (c) { $WH.ae(e, q); if (k) { $WH.ae(e, k) } } else { if (k) { $WH.ae(e, k) } $WH.ae(e, q) } $WH.ae(l, e) } function g_disclose(a, b) { b.className = "disclosure-" + (g_toggleDisplay(a) ? "on": "off"); return false } function co_addYourComment() { tabsContribute.focus(0); var ta = $WH.gE(document.forms['addcomment'], "textarea")[0]; ta.focus() } function co_cancelReply() { $WH.ge("replybox-generic").style.display = "none"; document.forms.addcomment.elements.replyto.value = "" } function co_validateForm(f) { var ta = $WH.gE(f, "textarea")[0]; if (g_user.permissions & 1) { return true; } if (Listview.funcBox.coValidate(ta)) { return true; } return false } function ss_submitAScreenshot() { tabsContribute.focus(1) } function ss_validateForm(f) { if (!f.elements.screenshotfile.value.length) { alert(LANG.message_noscreenshot); return false; } return true; } function ss_appendSticky() { var _ = $WH.ge("infobox-sticky-ss"); var type = g_pageInfo.type; var typeId = g_pageInfo.typeId; var pos = $WH.in_array(lv_screenshots, 1, function(a) { return a.sticky; }); if (pos != -1) { var screenshot = lv_screenshots[pos]; var a = $WH.ce("a"); a.href = "#screenshots:id=" + screenshot.id; a.onclick = function(a) { ScreenshotViewer.show({ screenshots: lv_screenshots, pos: pos }); return $WH.rf2(a); }; var size = (lv_videos && lv_videos.length ? [120, 90] : [150, 150]); var img = $WH.ce("img"), scale = Math.min(size[0] / screenshot.width, size[1] / screenshot.height); img.src = g_staticUrl + "/uploads/screenshots/thumb/" + screenshot.id + ".jpg"; img.width = Math.round(scale * screenshot.width); img.height = Math.round(scale * screenshot.height); img.className = "border"; $WH.ae(a, img); $WH.ae(_, a); var th = $WH.ge('infobox-screenshots'); var a = $WH.ce("a"); $WH.ae(a, $WH.ct(th.innerText + " (" + lv_screenshots.length + ")")); a.href = "#screenshots" a.title = $WH.sprintf(LANG.infobox_showall, lv_screenshots.length); a.onclick = function() { tabsRelated.focus((lv_videos && lv_videos.length) || (g_user && g_user.roles & (U_GROUP_ADMIN | U_GROUP_BUREAU | U_GROUP_VIDEO)) ? -2 : -1); return false; }; $WH.ee(th); $WH.ae(th, a); } else { var a; if (g_user.id > 0) { a = ''; } else { a = ''; } _.innerHTML = $WH.sprintf(LANG.infobox_noneyet, a + LANG.infobox_submitone + "") } } var vi_thumbnails = { 1 : "http://i3.ytimg.com/vi/$1/default.jpg" }; var vi_siteurls = { 1 : "http://www.youtube.com/watch?v=$1" }; var vi_sitevalidation = { 1 : /^http:\/\/www\.youtube\.com\/watch\?v=([^& ]{11})/ }; function vi_submitAVideo() { tabsContribute.focus(2) } function vi_validateForm(f) { if (!f.elements['videourl'].value.length) { alert(LANG.message_novideo); return false; } var urlmatch = false; for (var i in vi_sitevalidation) { if (f.elements['videourl'].value.match(vi_sitevalidation[i])) { urlmatch = true; break } } if (!urlmatch) { alert(LANG.message_novideo); return false; } return true; } function vi_appendSticky() { var _ = $WH.ge("infobox-sticky-vi"); var type = g_pageInfo.type; var typeId = g_pageInfo.typeId; var pos = $WH.in_array(lv_videos, 1, function(a) { return a.sticky }); if (pos != -1) { var video = lv_videos[pos]; var a = $WH.ce("a"); a.href = "#videos:id=" + video.id; a.onclick = function(e) { VideoViewer.show({ videos: lv_videos, pos: pos }); return $WH.rf2(e) }; var img = $WH.ce("img"); img.src = $WH.sprintf(vi_thumbnails[video.videoType], video.videoId); img.className = "border"; $WH.ae(a, img); $WH.ae(_, a); var th = $WH.ge('infobox-videos'); var a = $WH.ce("a"); $WH.ae(a, $WH.ct(th.innerText + " (" + lv_videos.length + ")")); a.href = "#videos" a.title = $WH.sprintf(LANG.infobox_showall, lv_videos.length); a.onclick = function() { tabsRelated.focus(-1); return false; }; $WH.ee(th); $WH.ae(th, a); } else { var a; if (g_user.id > 0) { a = '' } else { a = '' } _.innerHTML = $WH.sprintf(LANG.infobox_noneyet, a + LANG.infobox_suggestone + "") } } var g_videos = []; var VideoViewer = new function() { var videos, pos, imgWidth, imgHeight, scale, oldHash, mode = 0, collectionId, pageTitle, // IE flash embed fix container, screen, imgDiv, aPrev, aNext, aCover, aOriginal, divFrom, divCaption; function computeDimensions() { var video = videos[pos]; var captionExtraHeight = Math.max(divCaption.offsetHeight - 18, 0), availHeight = Math.max(50, Math.min(520, $WH.g_getWindowSize().h - 72 - captionExtraHeight)), scale = Math.min(1, availHeight / 520); imgWidth = Math.round(scale * 880); imgHeight = Math.round(scale * 520); aPrev.style.height = aNext.style.height = aCover.style.height = (imgHeight - 95) + 'px'; Lightbox.setSize(Math.max(480, imgWidth) + 20, imgHeight + 52 + captionExtraHeight); } function getPound(pos) { var video = videos[pos], buff = '#videos:'; if (mode == 0) { buff += 'id=' + video.id; } else { buff += collectionId + ':' + (pos + 1); } return buff; } function render(resizing) { if (resizing && (scale == 1) && $WH.g_getWindowSize().h > container.offsetHeight) { return; } container.style.visibility = 'hidden'; var video = videos[pos]; computeDimensions(); if (!resizing) { if (video.videoType == 1) { imgDiv.innerHTML = Markup.toHtml('[youtube=' + video.videoId + ' width=' + imgWidth + ' height=' + imgHeight + ' autoplay=true]', {mode:Markup.MODE_ARTICLE}); } aOriginal.href = $WH.sprintf(vi_siteurls[video.videoType], video.videoId); if (!video.user && typeof g_pageInfo == 'object') { video.user = g_pageInfo.username; } var hasFrom1 = (video.date && video.user), hasFrom2 = (videos.length > 1); if (hasFrom1) { var postedOn = new Date(video.date), elapsed = (g_serverTime - postedOn) / 1000; var a = divFrom.firstChild.childNodes[1]; a.href = '?user=' + video.user; a.innerHTML = video.user; var s = divFrom.firstChild.childNodes[3]; $WH.ee(s); Listview.funcBox.coFormatDate(s, elapsed, postedOn); divFrom.firstChild.style.display = ''; } else { divFrom.firstChild.style.display = 'none'; } var s = divFrom.childNodes[1]; $WH.ee(s); if (video.user) { if (hasFrom1) { $WH.ae(s, $WH.ct(' ' + LANG.dash + ' ')); } var a = $WH.ce('a'); a.href = 'javascript:;'; a.onclick = ContactTool.show.bind(ContactTool, { mode: 5, video: video }); a.className = 'icon-report'; g_addTooltip(a, LANG.report_tooltip, 'q2'); $WH.ae(a, $WH.ct(LANG.report)); $WH.ae(s, a); } s = divFrom.childNodes[2]; if (hasFrom2) { var buff = ''; if (video.user) { buff = LANG.dash; } buff += (pos + 1) + LANG.lvpage_of + videos.length; s.innerHTML = buff; s.style.display = ''; } else { s.style.display = 'none'; } divFrom.style.display = (hasFrom1 || hasFrom2 ? '': 'none'); var hasCaption = (video.caption != null && video.caption.length); var hasSubject = (video.subject != null && video.subject.length && video.type && video.typeId); if (hasCaption || hasSubject) { var html = ''; if (hasSubject) { html += LANG.types[video.type][0] + LANG.colon; html += ''; html += video.subject; html += ''; } if (hasCaption) { if (hasSubject) { html += LANG.dash; } html += (video.noMarkup ? video.caption: Markup.toHtml(video.caption, { mode: Markup.MODE_SIGNATURE })); } divCaption.innerHTML = html; divCaption.style.display = ''; } else { divCaption.style.display = 'none'; } if (videos.length > 1) { aPrev.href = getPound(peekPos(-1)); aNext.href = getPound(peekPos(1)); aPrev.style.display = aNext.style.display = ''; aCover.style.display = 'none'; } else { aPrev.style.display = aNext.style.display = 'none'; aCover.style.display = ''; } location.replace(getPound(pos)); } Lightbox.reveal(); container.style.visibility = 'visible'; setTimeout(fixTitle, 1); } function peekPos(change) { var foo = pos; foo += change; if (foo < 0) { foo = videos.length - 1; } else if (foo >= videos.length) { foo = 0; } return foo; } function prevVideo() { pos = peekPos(-1); render(); return false; } function nextVideo() { pos = peekPos(1); render(); return false; } function fixTitle() { if (pageTitle) { document.title = pageTitle; } } function onKeyUp(e) { e = $WH.$E(e); switch (e.keyCode) { case 37: // Left prevVideo(); break; case 39: // Right nextVideo(); break; } } function onResize() { render(1); } function onHide() { $WH.ee(imgDiv); if (videos.length > 1) { $WH.dE(document, 'keyup', onKeyUp) ; } if (oldHash && mode == 0) { if (oldHash.indexOf(':id=') != -1) { oldHash = '#videos'; } location.replace(oldHash); } else { location.replace('#.'); } fixTitle(); } function onShow(dest, first, opt) { if (typeof opt.videos == 'string') { videos = g_videos[opt.videos]; mode = 1; collectionId = opt.videos; } else { videos = opt.videos; mode = 0; collectionId = null; } container = dest; pos = 0; if (opt.pos && opt.pos >= 0 && opt.pos < videos.length) { pos = opt.pos; } if (first) { dest.className = 'screenshotviewer'; screen = $WH.ce('div'); screen.className = 'screenshotviewer-screen'; aPrev = $WH.ce('a'); aNext = $WH.ce('a'); aPrev.className = 'screenshotviewer-prev'; aNext.className = 'screenshotviewer-next'; aPrev.href = 'javascript:;'; aNext.href = 'javascript:;'; var foo = $WH.ce('span'); var b = $WH.ce('b'); // $WH.ae(b, $WH.ct(LANG.previous)); $WH.ae(foo, b); $WH.ae(aPrev, foo); var foo = $WH.ce('span'); var b = $WH.ce('b'); // $WH.ae(b, $WH.ct(LANG.next)); $WH.ae(foo, b); $WH.ae(aNext, foo); aPrev.onclick = prevVideo; aNext.onclick = nextVideo; aCover = $WH.ce('a'); aCover.className = 'screenshotviewer-cover'; aCover.href = 'javascript:;'; aCover.onclick = Lightbox.hide; var foo = $WH.ce('span'); var b = $WH.ce('b'); $WH.ae(b, $WH.ct(LANG.close)); $WH.ae(foo, b); $WH.ae(aCover, foo); $WH.ae(screen, aPrev); $WH.ae(screen, aNext); $WH.ae(screen, aCover); imgDiv = $WH.ce('div'); $WH.ae(screen, imgDiv); $WH.ae(dest, screen); var aClose = $WH.ce('a'); // aClose.className = 'dialog-x'; aClose.className = 'screenshotviewer-close'; aClose.href = 'javascript:;'; aClose.onclick = Lightbox.hide; // $WH.ae(aClose, $WH.ct(LANG.close)); $WH.ae(aClose, $WH.ce('span')); $WH.ae(dest, aClose); aOriginal = $WH.ce('a'); // aOriginal.className = 'dialog-arrow'; aOriginal.className = 'screenshotviewer-original'; aOriginal.href = 'javascript:;'; aOriginal.target = '_blank'; // $WH.ae(aOriginal, $WH.ct(LANG.original)); $WH.ae(aOriginal, $WH.ce('span')); $WH.ae(dest, aOriginal); divFrom = $WH.ce('div'); divFrom.className = 'screenshotviewer-from'; var sp = $WH.ce('span'); $WH.ae(sp, $WH.ct(LANG.lvscreenshot_from)); $WH.ae(sp, $WH.ce('a')); $WH.ae(sp, $WH.ct(' ')); $WH.ae(sp, $WH.ce('span')); $WH.ae(divFrom, sp); $WH.ae(divFrom, $WH.ce('span')); $WH.ae(divFrom, $WH.ce('span')); $WH.ae(dest, divFrom); divCaption = $WH.ce('div'); divCaption.className = 'screenshotviewer-caption'; $WH.ae(dest, divCaption); var d = $WH.ce('div'); d.className = 'clear'; $WH.ae(dest, d); } oldHash = location.hash; if (videos.length > 1) { $WH.aE(document, 'keyup', onKeyUp); } render(); } this.checkPound = function() { pageTitle = $WH.gE(document, 'title').innerHTML; if (location.hash && location.hash.indexOf('#videos') == 0) { if (!g_listviews['videos']) { // Standalone video viewer var parts = location.hash.split(':'); if (parts.length == 3) { var collection = g_videos[parts[1]], p = parseInt(parts[2]); if (collection && p >= 1 && p <= collection.length) { VideoViewer.show({ videos: parts[1], pos: p - 1 }); } } } } } this.show = function(opt) { Lightbox.show('videoviewer', { onShow: onShow, onHide: onHide, onResize: onResize },opt); return false; } DomContentLoaded.addEvent(this.checkPound) }; var Slider = new function() { var start, handleObj, timer; function onMouseDown(e) { e = $WH.$E(e); handleObj = this; start = $WH.g_getCursorPos(e); $WH.aE(document, 'mousemove', onMouseMove); $WH.aE(document, 'mouseup', onMouseUp); return false; } function onMouseMove(e) { e = $WH.$E(e); if (!start || !handleObj) { return; } var cursor = $WH.g_getCursorPos(e), delta = cursor[handleObj._dir] - start[handleObj._dir], outside = setPosition(handleObj, handleObj._pos + delta), current = getCurrentPosition(handleObj); if (current && handleObj.input) { handleObj.input.value = current.value; } if (!outside) { start = cursor; } if (handleObj.onMove) { handleObj.onMove(e, handleObj, current); } } function onMouseUp(e) { e = $WH.$E(e); if (handleObj.onMove) { handleObj.onMove(e, handleObj, getCurrentPosition(handleObj)); } handleObj = null; start = null; $WH.dE(document, 'mousemove', onMouseMove); $WH.dE(document, 'mouseup', onMouseUp); return false; } function onClick(obj, e) { e = $WH.$E(e); handleObj = obj; start = $WH.g_getCursorPos(e); var offset = $WH.ac(handleObj.parentNode), center = Math.floor(getHandleWidth(handleObj) / 2); setPosition(handleObj, start[handleObj._dir] - offset[handleObj._dir] - center); var current = getCurrentPosition(handleObj); if (current && handleObj.input) { handleObj.input.value = current.value; } if (handleObj.onMove) { handleObj.onMove(e, handleObj, current); } $WH.aE(document, 'mousemove', onMouseMove); $WH.aE(document, 'mouseup', onMouseUp); return false; } function onKeyPress(obj, e) { if (timer) { clearTimeout(timer); } if (e.type == 'change' || e.type == 'keypress' && e.which == 13) { onInput(obj, e); } else { timer = setTimeout(onInput.bind(0, obj, e), 1000); } } function onInput(obj, e) { var value = obj.input.value, current = getCurrentPosition(obj); if (isNaN(value)) { value = current.value; } if (value > obj._max) { value = obj._max; } if (value < obj._min) { value = obj._min; } Slider.setValue(obj, value); if (obj.onMove) { obj.onMove(e, obj, getCurrentPosition(obj)); } } function setPosition(obj, offset) { var outside = false; if (offset < 0) { offset = 0; outside = true; } else if (offset > getMaxPosition(obj)) { offset = getMaxPosition(obj); outside = true; } obj.style[(obj._dir == 'y' ? 'top' : 'left')] = offset + 'px'; obj._pos = offset; return outside; } function getMaxPosition(obj) { return getTrackerWidth(obj) - getHandleWidth(obj) + 2; } function getCurrentPosition(obj) { var percent = obj._pos / getMaxPosition(obj), value = Math.round((percent * (obj._max - obj._min)) + obj._min), result = [percent, value]; result.percent = percent; result.value = value; return result; } function getTrackerWidth(obj) { if (obj._tsz > 0) { return obj._tsz; } if (obj._dir == 'y') { return obj.parentNode.offsetHeight; } return obj.parentNode.offsetWidth; } function getHandleWidth(obj) { if (obj._hsz > 0) { return obj._hsz; } if (obj._dir == 'y') { return obj.offsetHeight; } return obj.offsetWidth; } this.setPercent = function(obj, percent) { setPosition(obj, parseInt(percent * getMaxPosition(obj))); }; this.setValue = function(obj, value) { if (value < obj._min) { value = obj._min; } else if (value > obj._max) { value = obj._max; } if (obj.input) { obj.input.value = value; } this.setPercent(obj, (value - obj._min) / (obj._max - obj._min)); }; this.setSize = function(obj, length) { var current = getCurrentPosition(obj), resized = getMaxPosition(obj); obj.parentNode.style[(obj._dir == 'y' ? 'height' : 'width')] = length + 'px'; if (resized != getMaxPosition(obj)) { this.setValue(obj, current.value); } }; this.init = function(container, opt) { var obj = $WH.ce('a'); obj.href = 'javascript:;'; obj.onmousedown = onMouseDown; obj.className = 'handle'; var track = $WH.ce('a'); track.href = 'javascript:;'; track.onmousedown = onClick.bind(0, obj); track.className = 'track'; $WH.ae(container, $WH.ce('span')); $WH.ae(container, track); $WH.ae(container, obj); obj._dir = 'x'; obj._min = 1; obj._max = 100; obj._pos = 0; obj._tsz = 0; obj._hsz = 0; if (opt != null) { // Orientation if (opt.direction == 'y') { obj._dir = 'y'; } // Values if (opt.minValue) { obj._min = opt.minValue; } if (opt.maxValue) { obj._max = opt.maxValue; } // Functions if (opt.onMove) { obj.onMove = opt.onMove; } if (opt.trackSize) { obj._tsz = opt.trackSize; } if (opt.handleSize) { obj._hsz = opt.handleSize; } // Labels if (opt.showLabels !== false) { var label = $WH.ce('div'); label.innerHTML = obj._min; label.className = 'label min'; $WH.ae(container, label); label = $WH.ce('div'); label.innerHTML = obj._max; label.className = 'label max'; $WH.ae(container, label); obj.input = $WH.ce('input'); $(obj.input).attr({ value: obj._max, type: 'text' } ).bind('click', function () { this.select(); } ).keypress(function (e) { var allowed = []; var usedKey = e.which; for (i = 48; i < 58; i++) { allowed.push(i); } if (!($WH.in_array(allowed, usedKey) >= 0) && usedKey != 13) { e.preventDefault(); } }).bind('keyup keydown change', onKeyPress.bind(0, obj)); obj.input.className = 'input'; $WH.ae(container, obj.input); } } container.className = 'slider-' + obj._dir + (opt == null || opt.showLabels !== false ? ' has-labels' : ''); return obj; } }; var suDialog; function su_addToSaved(c, d, a, e) { if (!c) { return } if (!Dialog.templates.docompare) { Dialog.templates.docompare = { title: LANG.dialog_compare, width: 400, height: 138, buttons: [['okay', LANG.ok], ['cancel', LANG.cancel]], fields: [{ id: "selecteditems", type: "caption", compute: function(h, g, f, i) { i.innerHTML = $WH.sprintf((g == 1 ? LANG.dialog_selecteditem: LANG.dialog_selecteditems), g) } }, { id: "action", type: "radio", label: "", value: 3, submitOnDblClick: 1, options: { 1 : LANG.dialog_nosaveandview, 2 : LANG.dialog_saveandview, 3 : LANG.dialog_saveforlater } }] } } if (!suDialog) { suDialog = new Dialog() } var b = function(h) { var g = $WH.gc("compare_groups"), f = "?compare"; if (h.action > 1) { if (g) { c = g + ";" + c } $WH.sc("compare_groups", 20, c, "/", location.hostname); // $WH.sc("compare_groups", 20, c, "/", ".wowhead.com"); if (e) { $WH.sc("compare_level", 20, e, "/", location.hostname) // $WH.sc("compare_level", 20, e, "/", ".wowhead.com") } } else { f += "=" + c + (e ? "&l=" + e: "") } if (h.action < 3) { if (a) { window.open(f) } else { location.href = f } } }; suDialog.show("docompare", { data: { selecteditems: d, action: 1 }, onSubmit: b }) } function Tabs(opt) { $WH.cO(this, opt); if (this.parent) { this.parent = $WH.ge(this.parent); } else { return; } this.selectedTab = -1; this.uls = []; this.tabs = []; this.nShows = 0; if (this.poundable == null) { this.poundable = 1; } this.poundedTab = null; if (this.onLoad == null) { this.onLoad = Tabs.onLoad.bind(this); } if (this.onShow == null) { this.onShow = Tabs.onShow.bind(this); } if (this.onHide) { this.onHide = this.onHide.bind(this); } } Tabs.prototype = { add: function(caption, opt) { var _, index = this.tabs.length; _ = { caption: caption, index: index, owner: this }; $WH.cO(_, opt); this.tabs.push(_); return index; }, hide: function(index, visible) { if (this.tabs[index]) { var selectedTab = this.selectedTab; if (index == 0 && selectedTab == -1) { this.poundedTab = this.selectedTab = selectedTab = 0; } if (index != this.poundedTab) { this.selectedTab = -1; } this.tabs[index].hidden = !visible; this.flush(); if (!visible && index == selectedTab) { this.selectedTab = selectedTab; for (var i = 0, len = this.tabs.length; i < len; ++i) { if (i != index && !this.tabs[i].hidden) { return this.show(i, 1); } } } } }, unlock: function(index, locked) { if (this.tabs[index]) { this.tabs[index].locked = locked; _ = $WH.gE(this.uls[0], 'a'); $('.icon-lock', _[index]).remove(); if (locked) { $('div, b', _[index]).prepend(''); } var _ = location.hash.substr(1).split(':')[0]; if (this.tabs[index].id == _) { this.show(index, 1); } } }, focus: function(index) { if (index < 0) { index = this.tabs.length + index; } this.forceScroll = 1; $WH.gE(this.uls[0], 'a')[index].onclick({}, true); this.forceScroll = null; }, show: function(index, forceClick) { var _; if (isNaN(index) || index < 0) { index = 0; } else if (index >= this.tabs.length) { index = this.tabs.length - 1; } if ((forceClick == null && index == this.selectedTab) || this.tabs[index].hidden) { return; } if(this.tabs[index].locked) { return this.onShow(this.tabs[index], this.tabs[this.selectedTab]); } if (this.selectedTab != -1) { _ = this.tabs[this.selectedTab]; if (this.onHide && !this.onHide(_)) { return; } if (_.onHide && !_.onHide()) { return; } } ++this.nShows; _ = $WH.gE(this.uls[0], 'a'); if (this.selectedTab != -1) { _[this.selectedTab].className = ''; } _[index].className = 'selected'; _ = this.tabs[index]; if (_.onLoad) { _.onLoad(); _.onLoad = null; } this.onShow(this.tabs[index], this.tabs[this.selectedTab]); if (_.onShow) { _.onShow(this.tabs[this.selectedTab]); } this.selectedTab = index; }, flush: function(defaultTab) { var _, l, a, b, d, d2; var container = $WH.ce('div'); container.className = 'tabs-container'; this.uls[0] = $WH.ce('ul'); this.uls[0].className = 'tabs'; d = $WH.ce('div'); d.className = 'tabs-levels'; $WH.ae(container, this.uls[0]); for (var i = 0; i < this.tabs.length; ++i) { var tab = this.tabs[i]; l = $WH.ce('li'); a = $WH.ce('a'); b = $WH.ce('b'); if (tab.hidden) { l.style.display = 'none'; } if (this.poundable) { a.href = '#' + tab.id; } else { a.href = 'javascript:;'; } $WH.ns(a); a.onclick = Tabs.onClick.bind(tab, a); d = $WH.ce('div'); if (tab.locked) { s = $WH.ce('span'); s.className = 'icon-lock'; $WH.ae(d, s); } else if (tab.icon) { s = $WH.ce('span'); s.className = 'icontiny'; s.style.backgroundImage = 'url(' + g_staticUrl + '/images/icons/tiny/' + tab.icon.toLowerCase() + '.gif)'; $WH.ae(d, s); } if(tab.tooltip) { a.onmouseover = (function(tooltip, e) { $WH.Tooltip.showAtCursor(e, tooltip, 0, 0, 'q'); }).bind(a, tab.tooltip); a.onmousemove = $WH.Tooltip.cursorUpdate; a.onmouseout = $WH.Tooltip.hide; } if (tab['class']) { d.className = tab['class']; } $WH.ae(d, $WH.ct(tab.caption)); $WH.ae(a, d); if (tab.locked) { s = $WH.ce('span'); s.className = 'icon-lock'; $WH.ae(b, s); } else if (tab.icon) { s = $WH.ce('span'); s.className = 'icontiny'; s.style.backgroundImage = 'url(' + g_staticUrl + '/images/icons/tiny/' + tab.icon.toLowerCase() + '.gif)'; $WH.ae(b, s); } $WH.ae(b, $WH.ct(tab.caption)); $WH.ae(a, b); $WH.ae(l, a); $WH.ae(this.uls[0], l); } $WH.ee(this.parent); $WH.ae(this.parent, container); if (this.onLoad) { _ = this.onLoad(); if (_ != null) { this.poundedTab = defaultTab = _; } } this.show(defaultTab); }, setTabName: function(index, name) { this.tabs[index].caption = name; var _ = $WH.gE(this.uls[0], 'a'); g_setTextNodes(_[index], name); }, setTabPound: function(index, pound) { if (!this.poundable) { return; } var _ = $WH.gE(this.uls[0], 'a'); _[index].href = '#' + this.tabs[index].id + (pound ? ':' + pound : ''); }, setTabTooltip: function(index, text) { this.tabs[index].tooltip = text; var _ = $WH.gE(this.uls[0], 'a'); if(text == null) { _[index].onmouseover = _[index].onmousemove = _[index].onmouseout = null; } else { _[index].onmouseover = function(e) { $WH.Tooltip.showAtCursor(e, text, 0, 0, 'q2'); }; _[index].onmousemove = $WH.Tooltip.cursorUpdate; _[index].onmouseout = $WH.Tooltip.hide; } }, getSelectedTab: function() { return this.selectedTab; } }; Tabs.onClick = function(a, e, forceClick) { if (forceClick == null && this.index == this.owner.selectedTab) { return; } var res = $WH.rf2(e); if (res == null) { return; } this.owner.show(this.index, forceClick); if (this.owner.poundable && !this.locked) { var _ = a.href.indexOf('#'); _ != -1 && location.replace(a.href.substr(_)); } return res; }; Tabs.onLoad = function() { if (!this.poundable || !location.hash.length) { return; } var _ = location.hash.substr(1).split(':')[0]; if (_) { return $WH.in_array(this.tabs, _, function(x) { if(!x.locked) { return x.id; } }); } }; Tabs.onShow = function(newTab, oldTab) { var _; if (newTab.hidden || newTab.locked) { return; } if (oldTab) { $WH.ge('tab-' + oldTab.id).style.display = 'none'; } _ = $WH.ge('tab-' + newTab.id); _.style.display = ''; if (((this.nShows == 1 && this.poundedTab != null && this.poundedTab >= 0) || this.forceScroll) && !this.noScroll) { var el, padd; if (this.__st) { el = this.__st; padd = 15; } else { el = _; padd = this.parent.offsetHeight + 15; } setTimeout($WH.g_scrollTo.bind(null, el, padd), 10); } }; var g_listviews = {}; function Listview(opt) { $WH.cO(this, opt); if (this.id) { var divId = (this.tabs ? 'tab-' : 'lv-') + this.id; if (this.parent) { var d = $WH.ce('div'); d.id = divId; $WH.ae($WH.ge(this.parent), d); this.container = d; } else { this.container = $WH.ge(divId); } } else { return; } var get = $WH.g_getGets(); if ((get.debug != null || g_user.debug) && g_user.roles & U_GROUP_MODERATOR) { this.debug = true; } if (this.template && Listview.templates[this.template]) { this.template = Listview.templates[this.template]; } else { return; } g_listviews[this.id] = this; if (this.data == null) { this.data = []; } if (this.poundable == null) { if (this.template.poundable != null) { this.poundable = this.template.poundable; } else { this.poundable = true; } } if (this.searchable == null) { if (this.template.searchable != null) { this.searchable = this.template.searchable; } else { this.searchable = false; } } if (this.filtrable == null) { if (this.template.filtrable != null) { this.filtrable = this.template.filtrable; } else { this.filtrable = false; } } if (this.sortable == null) { if (this.template.sortable != null) { this.sortable = this.template.sortable; } else { this.sortable = true; } } if (this.customPound == null) { if (this.template.customPound != null) { this.customPound = this.template.customPound; } else { this.customPound = false; } } if (this.data.length == 1) { this.filtrable = false; this.searchable = false; } if (this.searchable && this.searchDelay == null) { if (this.template.searchDelay != null) { this.searchDelay = this.template.searchDelay; } else { this.searchDelay = 333; } } if (this.clickable == null) { if (this.template.clickable != null) { this.clickable = this.template.clickable; } else { this.clickable = true; } } if (this.hideBands == null) { this.hideBands = this.template.hideBands; } if (this.hideNav == null) { this.hideNav = this.template.hideNav; } if (this.hideHeader == null) { this.hideHeader = this.template.hideHeader; } if (this.hideCount == null) { this.hideCount = this.template.hideCount; } if (this.computeDataFunc == null && this.template.computeDataFunc != null) { this.computeDataFunc = this.template.computeDataFunc; } if (this.createCbControls == null && this.template.createCbControls != null) { this.createCbControls = this.template.createCbControls; } if (this.template.onBeforeCreate != null) { if (this.onBeforeCreate == null) { this.onBeforeCreate = this.template.onBeforeCreate; } else { this.onBeforeCreate = [this.template.onBeforeCreate, this.onBeforeCreate]; } } if (this.onAfterCreate == null && this.template.onAfterCreate != null) { this.onAfterCreate = this.template.onAfterCreate; } if (this.onNoData == null && this.template.onNoData != null) { this.onNoData = this.template.onNoData; } if (this.createNote == null && this.template.createNote != null) { this.createNote = this.template.createNote; } if (this.customFilter == null && this.template.customFilter != null) { this.customFilter = this.template.customFilter; } if (this.onSearchSubmit == null && this.template.onSearchSubmit != null) { this.onSearchSubmit = this.template.onSearchSubmit; } if (this.getItemLink == null && this.template.getItemLink != null) { this.getItemLink = this.template.getItemLink; } if (this.clip == null && this.template.clip != null) { this.clip = this.template.clip; } if (this.clip || this.template.compute || this.id == 'topics' || this.id == 'recipes') { this.debug = false; // Don't add columns to picker windows } if (this.mode == null) { this.mode = this.template.mode; } if (this.template.noStyle != null) { this.noStyle = this.template.noStyle; } if (this.nItemsPerPage == null) { if (this.template.nItemsPerPage != null) { this.nItemsPerPage = this.template.nItemsPerPage; } else { this.nItemsPerPage = 50; } } this.nItemsPerPage |= 0; if (this.nItemsPerPage <= 0) { this.nItemsPerPage = 0; } this.nFilters = 0; this.resetRowVisibility(); if (this.mode == Listview.MODE_TILED) { if (this.nItemsPerRow == null) { var ipr = this.template.nItemsPerRow; this.nItemsPerRow = (ipr != null ? ipr : 4); } this.nItemsPerRow |= 0; if (this.nItemsPerRow <= 1) { this.nItemsPerRow = 1; } } else if (this.mode == Listview.MODE_CALENDAR) { this.dates = []; this.nItemsPerRow = 7; // Days per row this.nItemsPerPage = 1; // Months per page this.nDaysPerMonth = []; if (this.template.startOnMonth != null) { this.startOnMonth = this.template.startOnMonth; } else { this.startOnMonth = new Date(); } this.startOnMonth.setDate(1); this.startOnMonth.setHours(0, 0, 0, 0); if (this.nMonthsToDisplay == null) { if (this.template.nMonthsToDisplay != null) { this.nMonthsToDisplay = this.template.nMonthsToDisplay; } else { this.nMonthsToDisplay = 1; } } var y = this.startOnMonth.getFullYear(), m = this.startOnMonth.getMonth(); for (var j = 0; j < this.nMonthsToDisplay; ++j) { var date = new Date(y, m + j, 32); this.nDaysPerMonth[j] = 32 - date.getDate(); for (var i = 1; i <= this.nDaysPerMonth[j]; ++i) { this.dates.push({ date: new Date(y, m + j, i) }); } } if (this.template.rowOffset != null) { this.rowOffset = this.template.rowOffset; } } else { this.nItemsPerRow = 1; } this.columns = []; for (var i = 0, len = this.template.columns.length; i < len; ++i) { var ori = this.template.columns[i], cpy = {}; $WH.cO(cpy, ori); this.columns.push(cpy); } // ************************ // Extra Columns if (this.extraCols != null) { for (var i = 0, len = this.extraCols.length; i < len; ++i) { var pos = null; var col = this.extraCols[i]; if (col.after || col.before) { var index = $WH.in_array(this.columns, (col.after ? col.after: col.before), function(x) { return x.id; }); if (index != -1) { pos = (col.after ? index + 1 : index); } } if (pos == null) { pos = this.columns.length; } if (col.id == 'debug-id') { this.columns.splice(0, 0, col); } else { this.columns.splice(pos, 0, col); } } } // ************************ // Visibility this.visibility = []; var visibleCols = [], hiddenCols = []; if (this.visibleCols != null) { $WH.array_walk(this.visibleCols, function(x) { visibleCols[x] = 1; }); } if (this.hiddenCols != null) { $WH.array_walk(this.hiddenCols, function(x) { hiddenCols[x] = 1; }); } for (var i = 0, len = this.columns.length; i < len; ++i) { var col = this.columns[i]; if (visibleCols[col.id] != null || (!col.hidden && hiddenCols[col.id] == null)) { this.visibility.push(i); } } // ************************ // Sort if (this.sort == null && this.template.sort) { this.sort = this.template.sort.slice(0); } if (this.sort != null) { var sortParam = this.sort; this.sort = []; for (var i = 0, len = sortParam.length; i < len; ++i) { var col = parseInt(sortParam[i]); if (isNaN(col)) { var desc = 0; if (sortParam[i].charAt(0) == '-') { desc = 1; sortParam[i] = sortParam[i].substring(1); } var index = $WH.in_array(this.columns, sortParam[i], function(x) { return x.id; }); if (index != -1) { if (desc) { this.sort.push( - (index + 1)); } else { this.sort.push(index + 1); } } } else { this.sort.push(col); } } } else { this.sort = []; } if (this.debug || g_user.debug) { this.columns.splice(0, 0, { id: 'debug-id', compute: function(data, td) { if (data.id) { $WH.ae(td, $WH.ct(data.id)); } }, getVisibleText: function(data) { if (data.id) { return data.id; } else { return ''; } }, getValue: function(data) { if (data.id) { return data.id; } else { return 0; } }, sortFunc: function(a, b, col) { if (a.id == null) { return -1; } else if (b.id == null) { return 1; } return $WH.strcmp(a.id, b.id); }, name: 'ID', width: '5%', tooltip: 'ID' }); this.visibility.splice(0, 0, -1); for (var i = 0, len = this.visibility.length; i < len; ++i) { this.visibility[i] = this.visibility[i] + 1; } for (var i = 0, len = this.sort.length; i < len; ++i) { if (this.sort[i] < 0) { this.sort[i] = this.sort[i] - 1; } else { this.sort[i] = this.sort[i] + 1; } } } if (this.tabs) { this.tabIndex = this.tabs.add(this.getTabName(), { id: this.id, onLoad: this.initialize.bind(this) }); } else { this.initialize(); } } Listview.MODE_DEFAULT = 0; Listview.MODE_CHECKBOX = 1; Listview.MODE_DIV = 2; Listview.MODE_TILED = 3; Listview.MODE_CALENDAR = 4; Listview.prototype = { initialize: function() { if (this.data.length) { if (this.computeDataFunc != null) { for (var i = 0, len = this.data.length; i < len; ++i) { this.computeDataFunc(this.data[i]); } } } if (this.tabs) { this.pounded = (this.tabs.poundedTab == this.tabIndex); if (this.pounded) { this.readPound(); } } else { this.readPound(); } this.applySort(); var obcResult; if (this.onBeforeCreate != null) { if (typeof this.onBeforeCreate == 'function') { obcResult = this.onBeforeCreate(); } else { for (var i = 0; i < this.onBeforeCreate.length; ++i) { (this.onBeforeCreate[i].bind(this))(); } } } this.noData = $WH.ce('div'); this.noData.className = 'listview-nodata text'; if (this.mode == Listview.MODE_DIV) { this.mainContainer = this.mainDiv = $WH.ce('div'); if(!this.noStyle) { this.mainContainer.className = 'listview-mode-div'; } } else { this.mainContainer = this.table = $WH.ce('table'); this.thead = $WH.ce('thead'); this.tbody = $WH.ce('tbody'); if (this.clickable) { this.tbody.className = 'clickable'; } if (this.mode == Listview.MODE_TILED || this.mode == Listview.MODE_CALENDAR) { if(!this.noStyle) this.table.className = 'listview-mode-' + (this.mode == Listview.MODE_TILED ? 'tiled' : 'calendar'); var width = (100 / this.nItemsPerRow) + '%', colGroup = $WH.ce('colgroup'), col; for (var i = 0; i < this.nItemsPerRow; ++i) { col = $WH.ce('col'); col.style.width = width; $WH.ae(colGroup, col); } $WH.ae(this.mainContainer, colGroup); } else { if (!this.noStyle) { this.table.className = 'listview-mode-default'; } this.createHeader(); this.updateSortArrow(); } $WH.ae(this.table, this.thead); $WH.ae(this.table, this.tbody); } this.createBands(); if (this.customFilter != null) { this.updateFilters(); } this.updateNav(); this.refreshRows(); if (this.onAfterCreate != null) { this.onAfterCreate(obcResult); } }, createHeader: function() { var tr = $WH.ce('tr'); if (this.mode == Listview.MODE_CHECKBOX) { var th = $WH.ce('th'), div = $WH.ce('div'), a = $WH.ce('a'); th.style.width = '33px'; a.href = 'javascript:;'; a.className = 'listview-cb'; $WH.ns(a); $WH.ae(a, $WH.ct(String.fromCharCode(160))); $WH.ae(div, a); $WH.ae(th, div); $WH.ae(tr, th); } for (var i = 0, len = this.visibility.length; i < len; ++i) { var reali = this.visibility[i], col = this.columns[reali], th = $WH.ce('th'); div = $WH.ce('div'), a = $WH.ce('a'), outerSpan = $WH.ce('span'), innerSpan = $WH.ce('span'); col.__th = th; if (this.filtrable && (col.filtrable == null || col.filtrable)) { a.onmouseup = Listview.headerClick.bind(this, col, reali); a.onclick = a.oncontextmenu = $WH.rf; } else if (this.sortable) { a.href = 'javascript:;'; a.onclick = this.sortBy.bind(this, reali + 1); } if (a.onclick) { a.onmouseover = Listview.headerOver.bind(this, a, col); a.onmouseout = $WH.Tooltip.hide; $WH.ns(a); } else { a.className = 'static'; } if (col.width != null) { th.style.width = col.width; } if (col.align != null) { th.style.textAlign = col.align; } if (col.span != null) { th.colSpan = col.span; } $WH.ae(innerSpan, $WH.ct(col.name)); $WH.ae(outerSpan, innerSpan); $WH.ae(a, outerSpan); $WH.ae(div, a); $WH.ae(th, div); $WH.ae(tr, th); } if (this.hideHeader) { this.thead.style.display = 'none'; } $WH.ae(this.thead, tr); }, createBands: function() { var bandTop = $WH.ce('div'), bandBot = $WH.ce('div'), noteTop = $WH.ce('div'), noteBot = $WH.ce('div'); this.bandTop = bandTop; this.bandBot = bandBot; this.noteTop = noteTop; this.noteBot = noteBot; bandTop.className = 'listview-band-top'; bandBot.className = 'listview-band-bottom'; this.navTop = this.createNav(true); this.navBot = this.createNav(false); noteTop.className = noteBot.className = 'listview-note'; if (this.note) { noteTop.innerHTML = this.note; var e = $WH.g_getGets(); if (this.note.indexOf('fi_toggle()') > -1 && !e.filter) { fi_toggle(); } } else if (this.createNote) { this.createNote(noteTop, noteBot); } if (this.debug) { $WH.ae(noteTop, $WH.ct(" (")); var ids = $WH.ce('a'); ids.onclick = this.getList.bind(this); $WH.ae(ids, $WH.ct("CSV")); $WH.ae(noteTop, ids); $WH.ae(noteTop, $WH.ct(")")); } if (this._errors) { var sp = $WH.ce('small'), b = $WH.ce('b'); b.className = 'q10 report-icon'; if (noteTop.innerHTML) { b.style.marginLeft = '10px'; } g_addTooltip(sp, LANG.lvnote_witherrors, 'q'); $WH.st(b, LANG.error); $WH.ae(sp, b); $WH.ae(noteTop, sp); } if (!noteTop.firstChild && !(this.createCbControls || this.mode == Listview.MODE_CHECKBOX)) { $WH.ae(noteTop, $WH.ct(String.fromCharCode(160))); } if (!(this.createCbControls || this.mode == Listview.MODE_CHECKBOX)) { $WH.ae(noteBot, $WH.ct(String.fromCharCode(160))); } $WH.ae(bandTop, this.navTop); if (this.searchable) { var FI_FUNC = this.updateFilters.bind(this, true), FI_CLASS = (this._truncated ? 'search-within-results2' : 'search-within-results'), sp = $WH.ce('span'), em = $WH.ce('em'), a = $WH.ce('a'), input = $WH.ce('input'); sp.className = 'listview-quicksearch'; if (this.tabClick) { $(sp).click(this.tabClick); } $WH.ae(sp, em); a.href = 'javascript:;'; a.onclick = function() { var foo = this.nextSibling; foo.value = ''; foo.className = FI_CLASS; FI_FUNC(); }; a.style.display = 'none'; $WH.ae(a, $WH.ce('span')); $WH.ae(sp, a); $WH.ns(a); input.setAttribute('type', 'text'); input.className = FI_CLASS; input.style.width = (this._truncated ? '19em': '15em'); g_onAfterTyping(input, FI_FUNC, this.searchDelay); input.onmouseover = function() { if ($WH.trim(this.value) != '') { this.className = ''; } }; input.onfocus = function() { this.className = ''; }; input.onblur = function() { if ($WH.trim(this.value) == '') { this.className = FI_CLASS; this.value = ''; } }; input.onkeypress = this.submitSearch.bind(this); $WH.ae(sp, input); this.quickSearchBox = input; this.quickSearchGlass = em; this.quickSearchClear = a; $WH.ae(bandTop, sp); } $WH.ae(bandTop, noteTop); $WH.ae(bandBot, this.navBot); $WH.ae(bandBot, noteBot); if (this.createCbControls || this.mode == Listview.MODE_CHECKBOX) { if (this.note) { noteTop.style.paddingBottom = '5px'; } this.cbBarTop = this.createCbBar(true); this.cbBarBot = this.createCbBar(false); $WH.ae(bandTop, this.cbBarTop); $WH.ae(bandBot, this.cbBarBot); if (!this.noteTop.firstChild && !this.cbBarTop.firstChild) { this.noteTop.innerHTML = ' '; } if (!this.noteBot.firstChild && !this.cbBarBot.firstChild) { this.noteBot.innerHTML = ' '; } if (this.noteTop.firstChild && this.cbBarTop.firstChild) { this.noteTop.style.paddingBottom = '6px'; } if (this.noteBot.firstChild && this.cbBarBot.firstChild) { this.noteBot.style.paddingBottom = '6px'; } } if (this.hideBands & 1) { bandTop.style.display = 'none'; } if (this.hideBands & 2) { bandBot.style.display = 'none'; } $WH.ae(this.container, this.bandTop); if (this.clip) { var clipDiv = $WH.ce('div'); clipDiv.className = 'listview-clip'; clipDiv.style.width = this.clip.w + 'px'; clipDiv.style.height = this.clip.h + 'px'; this.clipDiv = clipDiv; $WH.ae(clipDiv, this.mainContainer); $WH.ae(clipDiv, this.noData); $WH.ae(this.container, clipDiv); } else { $WH.ae(this.container, this.mainContainer); $WH.ae(this.container, this.noData); } $WH.ae(this.container, this.bandBot); }, createNav: function(top) { var div = $WH.ce('div'), a1 = $WH.ce('a'), a2 = $WH.ce('a'), a3 = $WH.ce('a'), a4 = $WH.ce('a'), span = $WH.ce('span'), b1 = $WH.ce('b'), b2 = $WH.ce('b'), b3 = $WH.ce('b'); div.className = 'listview-nav'; a1.href = a2.href = a3.href = a4.href = 'javascript:;'; $WH.ae(a1, $WH.ct(String.fromCharCode(171) + LANG.lvpage_first)); $WH.ae(a2, $WH.ct(String.fromCharCode(8249) + LANG.lvpage_previous)); $WH.ae(a3, $WH.ct(LANG.lvpage_next + String.fromCharCode(8250))); $WH.ae(a4, $WH.ct(LANG.lvpage_last + String.fromCharCode(187))); $WH.ns(a1); $WH.ns(a2); $WH.ns(a3); $WH.ns(a4); a1.onclick = this.firstPage.bind(this); a2.onclick = this.previousPage.bind(this); a3.onclick = this.nextPage.bind(this); a4.onclick = this.lastPage.bind(this); if (this.mode == Listview.MODE_CALENDAR) { $WH.ae(b1, $WH.ct('a')); $WH.ae(span, b1); } else { $WH.ae(b1, $WH.ct('a')); $WH.ae(b2, $WH.ct('a')); $WH.ae(b3, $WH.ct('a')); $WH.ae(span, b1); $WH.ae(span, $WH.ct(LANG.hyphen)); $WH.ae(span, b2); $WH.ae(span, $WH.ct(LANG.lvpage_of)); $WH.ae(span, b3); } $WH.ae(div, a1); $WH.ae(div, a2); $WH.ae(div, span); $WH.ae(div, a3); $WH.ae(div, a4); if (top) { if (this.hideNav & 1) { div.style.display = 'none'; } } else { if (this.hideNav & 2) { div.style.display = 'none'; } } if (this.tabClick) { $('a', div).click(this.tabClick); } return div; }, createCbBar: function(topBar) { var div = $WH.ce('div'); if (this.createCbControls) { this.createCbControls(div, topBar); } if(div.firstChild) { // Not empty div.className = 'listview-withselected' + (topBar ? '' : '2'); } return div; }, refreshRows: function() { var target = (this.mode == Listview.MODE_DIV ? this.mainContainer: this.tbody); $WH.ee(target); if (this.nRowsVisible == 0) { if (!this.filtered) { this.bandTop.style.display = this.bandBot.style.display = 'none'; this.mainContainer.style.display = 'none'; } this.noData.style.display = ''; this.showNoData(); return; } var starti, endi, func; if (! (this.hideBands & 1)) { this.bandTop.style.display = ''; } if (! (this.hideBands & 2)) { this.bandBot.style.display = ''; } if (this.nDaysPerMonth && this.nDaysPerMonth.length) { starti = 0; for(var i = 0; i < this.rowOffset; ++i) { starti += this.nDaysPerMonth[i]; } endi = starti + this.nDaysPerMonth[i]; } else if (this.nItemsPerPage > 0) { starti = this.rowOffset; endi = Math.min(starti + this.nRowsVisible, starti + this.nItemsPerPage); if (this.filtered && this.rowOffset > 0) { // Adjusts start and end position when listview is filtered for (var i = 0, count = 0; i < this.data.length && count < this.rowOffset; ++i) { var row = this.data[i]; if (row.__hidden || row.__deleted) { ++starti; } else { ++count; } } endi += (starti - this.rowOffset); } } else { starti = 0; endi = this.nRowsVisible; } var nItemsToDisplay = endi - starti; if (this.mode == Listview.MODE_DIV) { for (var j = 0; j < nItemsToDisplay; ++j) { var i = starti + j, row = this.data[i]; if (!row) { break; } if (row.__hidden || row.__deleted) { ++nItemsToDisplay; continue; } $WH.ae(this.mainDiv, this.getDiv(i)); } } else if (this.mode == Listview.MODE_TILED) { var k = 0, tr = $WH.ce('tr'); for (var j = 0; j < nItemsToDisplay; ++j) { var i = starti + j, row = this.data[i]; if (!row) { break; } if (row.__hidden || row.__deleted) { ++nItemsToDisplay; continue; } $WH.ae(tr, this.getCell(i)); if (++k == this.nItemsPerRow) { $WH.ae(this.tbody, tr); if (j + 1 < nItemsToDisplay) { tr = $WH.ce('tr'); } k = 0; } } if (k != 0) { for (; k < 4; ++k) { var foo = $WH.ce('td'); foo.className = 'empty-cell'; $WH.ae(tr, foo); } $WH.ae(this.tbody, tr); } } else if (this.mode == Listview.MODE_CALENDAR) { var tr = $WH.ce('tr'); for(var i = 0; i < 7; ++i) { var th = $WH.ce('th'); $WH.st(th, LANG.date_days[i]); $WH.ae(tr, th); } $WH.ae(this.tbody, tr); tr = $WH.ce('tr'); for (var k = 0; k < this.dates[starti].date.getDay(); ++k) { var foo = $WH.ce('td'); foo.className = 'empty-cell'; $WH.ae(tr, foo); } for (var j = starti; j < endi; ++j) { $WH.ae(tr, this.getEvent(j)); if (++k == 7) { $WH.ae(this.tbody, tr); tr = $WH.ce('tr'); k = 0; } } if (k != 0) { for(; k < 7; ++k) { var foo = $WH.ce('td'); foo.className = 'empty-cell'; $WH.ae(tr, foo); } $WH.ae(this.tbody, tr); } } else { // DEFAULT || CHECKBOX for (var j = 0; j < nItemsToDisplay; ++j) { var i = starti + j, row = this.data[i]; if (!row) { break; } if (row.__hidden || row.__deleted) { ++nItemsToDisplay; continue; } $WH.ae(this.tbody, this.getRow(i)); } } this.mainContainer.style.display = ''; this.noData.style.display = 'none'; }, showNoData: function() { var div = this.noData; $WH.ee(div); var result = -1; if (this.onNoData) { result = (this.onNoData.bind(this, div))(); } if (result == -1) { $WH.ae(this.noData, $WH.ct(this.filtered ? LANG.lvnodata2: LANG.lvnodata)); } }, getDiv: function(i) { var row = this.data[i]; if (row.__div == null || this.minPatchVersion != row.__minPatch) { this.createDiv(row, i); } return row.__div; }, createDiv: function(row, i) { var div = $WH.ce('div'); row.__div = div; if (this.minPatchVersion) { row.__minPatch = this.minPatchVersion; } (this.template.compute.bind(this, row, div, i))(); }, getCell: function(i) { var row = this.data[i]; if (row.__td == null) { this.createCell(row, i); } return row.__td; }, createCell: function(row, i) { var td = $WH.ce('td'); row.__td = td; (this.template.compute.bind(this, row, td, i))(); }, getEvent: function(i) { var row = this.dates[i]; if (row.__td == null) { this.createEvent(row, i); } return row.__td; }, createEvent: function(row, i) { row.events = $WH.array_filter(this.data, function(holiday) { if (holiday.__hidden || holiday.__deleted) { return false; } var dates = Listview.funcBox.getEventNextDates(holiday.startDate, holiday.endDate, holiday.rec || 0, row.date); if (dates[0] && dates[1]) { dates[0].setHours(0, 0, 0, 0); dates[1].setHours(0, 0, 0, 0); return dates[0] <= row.date && dates[1] >= row.date; } return false; }); var td = $WH.ce('td'); row.__td = td; if (row.date.getFullYear() == g_serverTime.getFullYear() && row.date.getMonth() == g_serverTime.getMonth() && row.date.getDate() == g_serverTime.getDate()) { td.className = 'calendar-today'; } var div = $WH.ce('div'); div.className = 'calendar-date'; $WH.st(div, row.date.getDate()); $WH.ae(td, div); div = $WH.ce('div'); div.className = 'calendar-event'; $WH.ae(td, div); (this.template.compute.bind(this, row, div, i))(); if (this.getItemLink) { td.onclick = this.itemClick.bind(this, row); } }, getRow: function(i) { var row = this.data[i]; if (row.__tr == null) { this.createRow(row); } return row.__tr; }, setRow: function(newRow) { if (this.data[newRow.pos]) { this.data[newRow.pos] = newRow; this.data[newRow.pos].__tr = newRow.__tr; this.createRow(this.data[newRow.pos]); this.refreshRows(); } }, createRow: function(row) { var tr = $WH.ce('tr'); row.__tr = tr; if (this.mode == Listview.MODE_CHECKBOX) { var td = $WH.ce('td'); if (!row.__nochk) { td.className = 'listview-cb'; td.onclick = Listview.cbCellClick; var cb = $WH.ce('input'); $WH.ns(cb); cb.type = 'checkbox'; cb.onclick = Listview.cbClick; if (row.__chk) { cb.checked = true; } row.__cb = cb; $WH.ae(td, cb); } $WH.ae(tr, td); } for (var i = 0, len = this.visibility.length; i < len; ++i) { var reali = this.visibility[i], col = this.columns[reali], td = $WH.ce('td'), result; if (col.align != null) { td.style.textAlign = col.align; } if (col.compute) { result = (col.compute.bind(this, row, td, tr, reali))(); } else { if (row[col.value] != null) { result = row[col.value]; } else { result = -1; } } if (result != -1 && result != null) { td.insertBefore($WH.ct(result), td.firstChild); } $WH.ae(tr, td); } if (this.mode == Listview.MODE_CHECKBOX && row.__chk) { tr.className = 'checked'; } if (row.frommerge == 1) { tr.className += ' mergerow'; } if (this.getItemLink) { tr.onclick = this.itemClick.bind(this, row); } }, itemClick: function(row, e) { e = $WH.$E(e); var i = 0, el = e._target; while (el && i < 3) { if (el.nodeName == 'A') { return; } el = el.parentNode; } location.href = this.getItemLink(row); }, submitSearch: function(e) { e = $WH.$E(e); if (!this.onSearchSubmit || e.keyCode != 13) { return; } for (var i = 0, len = this.data.length; i < len; ++i) { if (this.data[i].__hidden) { continue; } (this.onSearchSubmit.bind(this, this.data[i]))(); } }, validatePage: function() { var rpp = this.nItemsPerPage, ro = this.rowOffset, len = this.nRowsVisible; if (ro < 0) { this.rowOffset = 0; } else if (this.mode == Listview.MODE_CALENDAR) { this.rowOffset = Math.min(ro, this.nDaysPerMonth.length - 1); } else { this.rowOffset = this.getRowOffset(ro + rpp > len ? len - 1 : ro); } }, getRowOffset: function(rowNo) { var rpp = this.nItemsPerPage; return (rpp > 0 && rowNo > 0 ? Math.floor(rowNo / rpp) * rpp: 0); }, resetRowVisibility: function() { for (var i = 0, len = this.data.length; i < len; ++i) { this.data[i].__hidden = false; } this.filtered = false; this.rowOffset = 0; this.nRowsVisible = this.data.length; }, getColText: function(row, col) { var text = ''; if (this.template.getVisibleText) { text = $WH.trim(this.template.getVisibleText(row) + ' '); } if (col.getVisibleText) { return text + col.getVisibleText(row) } if (col.getValue) { return text + col.getValue(row) } if (col.value) { return text + row[col.value] } if (col.compute) { return text + col.compute(row, $WH.ce('td'), $WH.ce('tr')); } return "" }, resetFilters: function() { for (var j = 0, len2 = this.visibility.length; j < len2; ++j) { var realj = this.visibility[j]; var col = this.columns[realj]; if (col.__filter) { col.__th.firstChild.firstChild.className = ''; col.__filter = null; --(this.nFilters); } } }, updateFilters: function(refresh) { $WH.Tooltip.hide(); this.resetRowVisibility(); var searchText, parts, nParts; if (this.searchable) { this.quickSearchBox.parentNode.style.display = ''; searchText = $WH.trim(this.quickSearchBox.value); if (searchText) { this.quickSearchGlass.style.display = 'none'; this.quickSearchClear.style.display = ''; searchText = searchText.toLowerCase().replace(/\s+/g, ' '); parts = searchText.split(' '); nParts = parts.length; } else { this.quickSearchGlass.style.display = ''; this.quickSearchClear.style.display = 'none'; } } else if (this.quickSearchBox) { this.quickSearchBox.parentNode.style.display = 'none'; } if (!searchText && this.nFilters == 0 && this.customFilter == null) { if (refresh) { this.updateNav(); this.refreshRows(); } return; } // Numerical var filterFuncs = { 1: function(x, y) { return x > y; }, 2: function(x, y) { return x == y; }, 3: function(x, y) { return x < y; }, 4: function(x, y) { return x >= y; }, 5: function(x, y) { return x <= y; }, 6: function(x, y, z) { return y <= x && x <= z; } }; // Range var filterFuncs2 = { 1: function(min, max, y) { return max > y; }, 2: function(min, max, y) { return min <= y && y <= max; }, 3: function(min, max, y) { return min < y; }, 4: function(min, max, y) { return max >= y; }, 5: function(min, max, y) { return min <= y; }, 6: function(min, max, y, z) { return y <= max && min <= z; } }; var nRowsVisible = 0; for (var i = 0, len = this.data.length; i < len; ++i) { var row = this.data[i], nFilterMatches = 0, nSearchMatches = 0, matches = []; row.__hidden = true; if (this.customFilter && !this.customFilter(row, i)) { continue; } for (var j = 0, len2 = this.visibility.length; j < len2; ++j) { var realj = this.visibility[j]; var col = this.columns[realj]; if (col.__filter) { var filter = col.__filter, result = false; if (col.type != null && col.type == 'range') { var minValue = col.getMinValue(row), maxValue = col.getMaxValue(row); result = (filterFuncs2[filter.type])(minValue, maxValue, filter.value, filter.value2); } else if (col.type == null || col.type == 'num' || filter.type > 0) { var value = null; if (col.getValue) { value = col.getValue(row); } else if (col.value) { value = parseFloat(row[col.value]); } if (!value) { value = 0; } result = (filterFuncs[filter.type])(value, filter.value, filter.value2); } else { var text = this.getColText(row, col); if (text) { text = text.toString().toLowerCase(); if (filter.invert) { result = text.match(filter.regex) != null; } else { var foo = 0; for (var k = 0, len3 = filter.words.length; k < len3; ++k) { if (text.indexOf(filter.words[k]) != -1) { ++foo; } else { break; } } result = (foo == filter.words.length); } } } if (filter.invert) { result = !result; } if (result) { ++nFilterMatches; } else { break; } } if (searchText) { var text = this.getColText(row, col); if (text) { text = text.toString().toLowerCase(); for (var k = 0, len3 = parts.length; k < len3; ++k) { if (!matches[k]) { if (text.indexOf(parts[k]) != -1) { matches[k] = 1; ++nSearchMatches; } } } } } } if (row.__alwaysvisible || ((this.nFilters == 0 || nFilterMatches == this.nFilters) && (!searchText || nSearchMatches == nParts))) { row.__hidden = false; ++nRowsVisible; } } this.filtered = (nRowsVisible < this.data.length); this.nRowsVisible = nRowsVisible; if (refresh) { this.updateNav(); this.refreshRows(); } }, changePage: function() { this.validatePage(); this.refreshRows(); this.updateNav(); this.updatePound(); var scroll = $WH.g_getScroll(), c = $WH.ac(this.container); if (scroll.y > c[1]) { scrollTo(scroll.x, c[1]); } }, firstPage: function() { this.rowOffset = 0; this.changePage(); return false; }, previousPage: function() { this.rowOffset -= this.nItemsPerPage; this.changePage(); return false; }, nextPage: function() { this.rowOffset += this.nItemsPerPage; this.changePage(); return false; }, lastPage: function() { this.rowOffset = 99999999; this.changePage(); return false; }, addSort: function(arr, colNo) { var i = $WH.in_array(arr, Math.abs(colNo), function(x) { return Math.abs(x); }); if (i != -1) { colNo = arr[i]; arr.splice(i, 1); } arr.splice(0, 0, colNo); }, sortBy: function(colNo) { if (colNo <= 0 || colNo > this.columns.length) { return; } if (Math.abs(this.sort[0]) == colNo) { this.sort[0] = -this.sort[0]; } else { var defaultSort = -1; if (this.columns[colNo-1].type == 'text') { defaultSort = 1; } this.addSort(this.sort, defaultSort * colNo); } this.applySort(); this.refreshRows(); this.updateSortArrow(); this.updatePound(); }, applySort: function() { if (this.sort.length == 0) { return; } Listview.sort = this.sort; Listview.columns = this.columns; if (this.indexCreated) { this.data.sort(Listview.sortIndexedRows.bind(this)); } else { this.data.sort(Listview.sortRows.bind(this)); } this.updateSortIndex(); }, setSort: function(sort, refresh, updatePound) { if (this.sort.toString() != sort.toString()) { this.sort = sort; this.applySort(); if (refresh) { this.refreshRows(); } if (updatePound) { this.updatePound(); } } }, readPound: function() { if (!this.poundable || !location.hash.length) { return false; } var _ = location.hash.substr(1); if (this.tabs) { var n = _.lastIndexOf(':'); if (n == -1) { return false; } _ = _.substr(n + 1); } var num = parseInt(_); if (!isNaN(num)) { this.rowOffset = num; this.validatePage(); if (this.poundable != 2) { var sort = []; var matches= _.match(/(\+|\-)[0-9]+/g); if (matches != null) { for (var i = matches.length - 1; i >= 0; --i) { var colNo = parseInt(matches[i]) | 0; var _ = Math.abs(colNo); if (_ <= 0 || _ > this.columns.length) { break; } this.addSort(sort, colNo); } this.setSort(sort, false, false); } } if (this.tabs) { this.tabs.setTabPound(this.tabIndex, this.getTabPound()); } } }, updateSortArrow: function() { if (!this.sort.length || !this.thead || this.mode == Listview.MODE_TILED || this.mode == Listview.MODE_CALENDAR) { return; } var i = $WH.in_array(this.visibility, Math.abs(this.sort[0]) - 1); if (i == -1) { return; } if (this.mode == Listview.MODE_CHECKBOX && i < this.thead.firstChild.childNodes.length - 1) { i += 1; } var span = this.thead.firstChild.childNodes[i].firstChild.firstChild.firstChild; if (this.lsa && this.lsa != span) { // lastSortArrow this.lsa.className = ''; } span.className = (this.sort[0] < 0 ? 'sortdesc': 'sortasc'); this.lsa = span; }, updateSortIndex: function() { var _ = this.data; for (var i = 0, len = _.length; i < len; ++i) { _[i].__si = i; // sortIndex } this.indexCreated = true; }, updateTabName: function() { if (this.tabs && this.tabIndex != null) { this.tabs.setTabName(this.tabIndex, this.getTabName()); } }, updatePound: function(useCurrentSort) { if (!this.poundable) { return; } var _ = '', id = ''; if (useCurrentSort) { if (location.hash.length && this.tabs) { var n = location.hash.lastIndexOf(':'); if (n != -1 && !isNaN(parseInt(location.hash.substr(n + 1)))) { _ = location.hash.substr(n + 1); } } } else { _ = this.getTabPound(); } if (this.customPound) { id = this.customPound; } else if (this.tabs) { id = this.id; } if (_ && this.tabs) { this.tabs.setTabPound(this.tabIndex, _); } location.replace('#' + id + (id && _ ? ':' : '') + _); }, updateNav: function() { var arr = [this.navTop, this.navBot], _ = this.nItemsPerPage, __ = this.rowOffset, ___ = this.nRowsVisible, first = 0, previous = 0, next = 0, last = 0, date = new Date(); if (___ > 0) { if (! (this.hideNav & 1)) { arr[0].style.display = ''; } if (! (this.hideNav & 2)) { arr[1].style.display = ''; } } else { arr[0].style.display = arr[1].style.display = 'none'; } if (this.mode == Listview.MODE_CALENDAR) { for (var i = 0; i < this.nDaysPerMonth.length; ++i) { if (i == __) { // Selected month if (i > 0) previous = 1; if (i > 1) first = 1; if (i < this.nDaysPerMonth.length - 1) next = 1; if (i < this.nDaysPerMonth.length - 2) last = 1; } } date.setTime(this.startOnMonth.valueOf()); date.setMonth(date.getMonth() + __); } else { if (_) { if (__ > 0) { previous = 1; if (__ >= _ + _) { first = 1; } } if (__ + _ < ___) { next = 1; if (__ + _ + _ < ___) { last = 1; } } } } for (var i = 0; i < 2; ++i) { var childs = arr[i].childNodes; childs[0].style.display = (first ? '': 'none'); childs[1].style.display = (previous ? '': 'none'); childs[3].style.display = (next ? '': 'none'); childs[4].style.display = (last ? '': 'none'); childs = childs[2].childNodes; if (this.mode == Listview.MODE_CALENDAR) { childs[0].firstChild.nodeValue = LANG.date_months[date.getMonth()] + ' ' + date.getFullYear(); } else { childs[0].firstChild.nodeValue = __ + 1; childs[2].firstChild.nodeValue = _ ? Math.min(__ + _, ___) : ___; childs[4].firstChild.nodeValue = ___; } } }, getTabName: function() { var name = this.name, n = this.data.length; for (var i = 0, len = this.data.length; i < len; ++i) { if (this.data[i].__hidden || this.data[i].__deleted) { --n; } } if (n > 0 && !this.hideCount) { name += $WH.sprintf(LANG.qty, n); } return name; }, getTabPound: function() { var buffer = ''; buffer += this.rowOffset; if (this.poundable != 2 && this.sort.length) { buffer += ('+' + this.sort.join('+')).replace(/\+\-/g, '-'); } return buffer; }, getCheckedRows: function() { var checkedRows = []; for (var i = 0, len = this.data.length; i < len; ++i) { var _ = this.data[i]; if ((_.__cb && _.__cb.checked) || (!_.__cb && _.__chk)) { checkedRows.push(_); } } return checkedRows; }, resetCheckedRows: function() { for (var i = 0, len = this.data.length; i < len; ++i) { var _ = this.data[i]; if (_.__cb) { _.__cb.checked = false; } else if (_.__chk) { _.__chk = null; } if (_.__tr) { _.__tr.className = _.__tr.className.replace('checked', ''); } } }, deleteRows: function(rows) { if (!rows || !rows.length) { return; } for (var i = 0, len = rows.length; i < len; ++i) { var row = rows[i]; if (!row.__hidden && !row.__hidden) { this.nRowsVisible -= 1; } row.__deleted = true; } this.updateTabName(); if (this.rowOffset >= this.nRowsVisible) { this.previousPage(); } else { this.refreshRows(); this.updateNav(); } }, setData: function(data) { this.data = data; this.indexCreated = false; this.resetCheckedRows(); this.resetRowVisibility(); if (this.tabs) { this.pounded = (this.tabs.poundedTab == this.tabIndex); if (this.pounded) { this.readPound(); } } else { this.readPound(); } this.applySort(); this.updateSortArrow(); if (this.customFilter != null) { this.updateFilters(); } this.updateNav(); this.refreshRows(); }, getClipDiv: function() { return this.clipDiv; }, getNoteTopDiv: function() { return this.noteTop; }, focusSearch: function() { this.quickSearchBox.focus(); }, clearSearch: function() { this.quickSearchBox.value = ''; }, getList: function() { if (!this.debug) { return; } var str = ''; for (var i = 0; i < this.data.length; i++) { if (!this.data[i].__hidden) { str += this.data[i].id + ', '; } } listviewIdList.show(str); }, createIndicator: function(v, f, c) { if (!this.noteIndicators) { this.noteIndicators = $WH.ce('div'); this.noteIndicators.className = 'listview-indicators'; $(this.noteIndicators).insertBefore($(this.noteTop)); } var t = this.tabClick; $(this.noteIndicators).append( $('') .html(v) .append(!f ? '' : $('[x]') .attr('href', (typeof f == 'function' ? 'javascript:;' : f)) .click(function () { if (t) t(); if (typeof f == 'function') f(); }) ) .css('cursor', (typeof c == 'function' ? 'pointer' : null)) .click(function () { if (t) t(); if (typeof c == 'function') c(); }) ); $(this.noteTop).css('padding-top', '7px'); }, removeIndicators: function() { if (this.noteIndicators) { $(this.noteIndicators).remove(); this.noteIndicators = null; } $(this.noteTop).css('padding-top', ''); } }; Listview.sortRows = function(a, b) { var sort = Listview.sort, cols = Listview.columns; for (var i = 0, len = sort.length; i < len; ++i) { var res, _ = cols[Math.abs(sort[i]) - 1]; if (!_) { _ = this.template; } if (_.sortFunc) { res = _.sortFunc(a, b, sort[i]); } else { res = $WH.strcmp(a[_.value], b[_.value]); } if (res != 0) { return res * sort[i]; } } return 0; }, Listview.sortIndexedRows = function(a, b) { var sort = Listview.sort, cols = Listview.columns, res; for (var idx in sort) { _ = cols[Math.abs(sort[idx]) - 1]; if(!_) { _ = this.template; } if (_.sortFunc) { res = _.sortFunc(a, b, sort[0]); } else { res = $WH.strcmp(a[_.value], b[_.value]); } if (res != 0) { return res * sort[idx]; } } return (a.__si - b.__si); }, Listview.cbSelect = function(v) { for (var i = 0, len = this.data.length; i < len; ++i) { var _ = this.data[i]; var v2 = v; if (_.__hidden) { continue; } if (!_.__nochk && _.__cb) { var cb = _.__cb, tr = cb.parentNode.parentNode; if (v2 == null) { v2 = !cb.checked; } if (cb.checked != v2) { cb.checked = v2; tr.className = (cb.checked ? tr.className + ' checked' : tr.className.replace('checked', '')); } } else if (v2 == null) { v2 = true; } _.__chk = v2; } }; Listview.cbClick = function(e) { setTimeout(Listview.cbUpdate.bind(0, 0, this, this.parentNode.parentNode), 1); $WH.sp(e); }; Listview.cbCellClick = function(e) { setTimeout(Listview.cbUpdate.bind(0, 1, this.firstChild, this.parentNode), 1); $WH.sp(e); }; Listview.cbUpdate = function(toggle, cb, tr) { if (toggle) { cb.checked = !cb.checked; } tr.className = (cb.checked ? tr.className + ' checked' : tr.className.replace('checked', '')); }; Listview.headerClick = function(col, i, e) { e = $WH.$E(e); if (this.tabClick) { this.tabClick(); } if (e._button == 3 || e.shiftKey || e.ctrlKey) { $WH.Tooltip.hide(); setTimeout(Listview.headerFilter.bind(this, col, null), 1); } else { this.sortBy(i + 1); } return false; }; Listview.headerFilter = function(col, res) { var prefilled = ''; if (col.__filter) { if (col.__filter.invert) { prefilled += '!'; } prefilled += col.__filter.text; } if (res == null) { var res = prompt($WH.sprintf(LANG.prompt_colfilter1 + (col.type == 'text' ? LANG.prompt_colfilter2: LANG.prompt_colfilter3), col.name), prefilled); } if (res != null) { var filter = {text: '', type: -1}; res = $WH.trim(res.replace(/\s+/g, ' ')); if (!res && this.onEmptyFilter) { this.onEmptyFilter(col); } else if (res) { if (res.charAt(0) == '!' || res.charAt(0) == '-') { filter.invert = 1; res = res.substr(1); } if (col.type == 'text') { filter.type = 0; filter.text = res; if (filter.invert) { filter.regex = g_createOrRegex(res); } else { filter.words = res.toLowerCase().split(' '); } } var value, value2; if (res.match(/(>|=|<|>=|<=)\s*([0-9\.]+)/)) { value = parseFloat(RegExp.$2); if (!isNaN(value)) { switch (RegExp.$1) { case '>': filter.type = 1; break; case '=': filter.type = 2; break; case '<': filter.type = 3; break; case '>=': filter.type = 4; break; case '<=': filter.type = 5; break; } filter.value = value; filter.text = RegExp.$1 + ' ' + value; } } else if (res.match(/([0-9\.]+)\s*\-\s*([0-9\.]+)/)) { value = parseFloat(RegExp.$1); value2 = parseFloat(RegExp.$2); if (!isNaN(value) && !isNaN(value2)) { if (value > value2) { var foo = value; value = value2; value2 = foo; } if (value == value2) { filter.type = 2; filter.value = value; filter.text = '= ' + value; } else { filter.type = 6; filter.value = value; filter.value2 = value2; filter.text = value + ' - ' + value2; } } } else { var parts = res.toLowerCase().split(' '); if (!col.allText && parts.length == 1 && !isNaN(value = parseFloat(parts[0]))) { filter.type = 2; filter.value = value; filter.text = '= ' + value; } else if (col.type == 'text') { filter.type = 0; filter.text = res; if (filter.invert) { filter.regex = g_createOrRegex(res); } else { filter.words = parts; } } } if (filter.type == -1) { alert(LANG.message_invalidfilter); return; } } if (!col.__filter || filter.text != col.__filter.text || filter.invert != col.__filter.invert) { var a = col.__th.firstChild.firstChild; if (res && filter.text) { if (!col.__filter) { a.className = 'q5'; ++(this.nFilters); } col.__filter = filter; } else { if (col.__filter) { a.className = ''; --(this.nFilters); } col.__filter = null; } this.updateFilters(1); } } }; Listview.headerOver = function(a, col, e) { var buffer = ''; buffer += '' + (col.tooltip ? col.tooltip: col.name) + ''; if (col.__filter) { buffer += '
' + $WH.sprintf((col.__filter.invert ? LANG.tooltip_colfilter2: LANG.tooltip_colfilter1), col.__filter.text); } buffer += '
' + LANG.tooltip_lvheader1 + ''; if (this.filtrable && (col.filtrable == null || col.filtrable)) { buffer += '
' + ($WH.Browser.opera ? LANG.tooltip_lvheader3: LANG.tooltip_lvheader2) + ''; } $WH.Tooltip.show(a, buffer, 0, 0, 'q'); }; Listview.extraCols = { id: { id: 'id', name: 'ID', width: '5%', value: 'id', compute: function(data, td) { if (data.id) { $WH.ae(td, $WH.ct(data.id)); } } }, date: { id: 'obj-date', name: LANG.added, compute: function(data, td) { if (data.date) { if (data.date <= 86400) { $WH.ae(td, $WH.ct('???')); } else { var added = new Date(data.date * 1000); var elapsed = (g_serverTime - added) / 1000; return g_formatDate(td, elapsed, added, null, true); } } }, sortFunc: function(a, b, col) { if (a.date == b.date) { return 0; } else if (a.date < b.date) { return -1; } else { return 1; } } }, cost: { id: 'cost', name: LANG.cost, getValue: function(row) { if (row.cost) { return (row.cost[2] && row.cost[2][0] ? row.cost[2][0][1] : 0) || (row.cost[1] && row.cost[1][0] ? row.cost[1][0][1] : 0) || row.cost[0]; } }, compute: function(row, td) { if (row.cost) { var money = row.cost[0]; var side = null; var items = row.cost[2]; var currency = row.cost[1]; var achievementPoints = 0; if (row.side != null) { side = row.side; } else if (row.react != null) { if (row.react[0] == 1 && row.react[1] == -1) { // Alliance only side = 1; } else if (row.react[0] == -1 && row.react[1] == 1) { // Horde only side = 2; } } Listview.funcBox.appendMoney(td, money, side, items, currency, achievementPoints); } }, sortFunc: function(a, b, col) { if (a.cost == null) { return -1; } else if (b.cost == null) { return 1; } var lena = 0, lenb = 0, lenc = 0, lend = 0; if (a.cost[2] != null) { $WH.array_walk(a.cost[2], function(x, _, __, i) { lena += Math.pow(10, i) + x[1]; }); } if (b.cost[2] != null) { $WH.array_walk(b.cost[2], function(x, _, __, i) { lenb += Math.pow(10, i) + x[1]; }); } if (a.cost[1] != null) { $WH.array_walk(a.cost[1], function(x, _, __, i) { lenc += Math.pow(10, i) + x[1]; }); } if (b.cost[1] != null) { $WH.array_walk(b.cost[1], function(x, _, __, i) { lend += Math.pow(10, i) + x[1]; }); } return $WH.strcmp(lena, lenb) || $WH.strcmp(lenc, lend) || $WH.strcmp(a.cost[0], b.cost[0]); } }, count: { id: 'count', name: LANG.count, value: 'count', compute: function(row, td) { if (!(this._totalCount > 0 || row.outof > 0)) { return; } if (row.outof) { var d = $WH.ce('div'); d.className = 'small q0'; $WH.ae(d, $WH.ct($WH.sprintf(LANG.lvdrop_outof, row.outof))); $WH.ae(td, d); } return row.count; }, getVisibleText: function(row) { var buff = row.count; if (row.outof) { buff += ' ' + row.outof; } return buff; }, sortFunc: function(a, b, col) { if (a.count == null) { return -1; } else if (b.count == null) { return 1; } return $WH.strcmp(a.count, b.count); } }, percent: { id: 'percent', name: '%', value: 'percent', compute: function(row, td) { if (row.count <= 0) { return '??'; } if (row.pctstack) { var text = ''; var data = eval('(' + row.pctstack + ')'); for (var amt in data) { var pct = (data[amt] * row.percent) / 100; if (pct >= 1.95) { pct = parseFloat(pct.toFixed(0)); } else if (pct >= 0.195) { pct = parseFloat(pct.toFixed(1)); } else { pct = parseFloat(pct.toFixed(2)); } text += $WH.sprintf(LANG.stackof_format, amt, pct) + '
'; } td.className += ' tip'; g_addTooltip(td, text); } // var value = parseFloat(row.percent.toFixed(row.percent >= 1.95 ? 0 : (row.percent >= 0.195 ? 1 : 2))); var value = parseFloat(row.percent.toFixed(row.percent >= 1.95 ? 1 : 2)); // sarjuuk: doesn't look as nice but i prefer accuracy if (row.pctstack) { var sp = $WH.ce('span'); sp.className += ' tip'; $WH.ae(sp, $WH.ct(value)); $WH.ae(td, sp); } else { return value; } }, getVisibleText: function(row) { if (row.count <= 0) { return '??'; } if (row.percent >= 1.95) { // return row.percent.toFixed(0); return row.percent.toFixed(1); } // else if (row.percent >= 0.195) { // return parseFloat(row.percent.toFixed(1)); // } else { return parseFloat(row.percent.toFixed(2)); } }, sortFunc: function(a, b, col) { if (a.count == null) { return -1; } else if (b.count == null) { return 1; } if (a.percent >= 1.95) { var acmp = a.percent.toFixed(0); } else if (a.percent >= 0.195) { acmp = parseFloat(a.percent.toFixed(1)); } else { acmp = parseFloat(a.percent.toFixed(2)); } if (b.percent >= 1.95) { var bcmp = b.percent.toFixed(0); } else if (b.percent >= 0.195) { bcmp = parseFloat(b.percent.toFixed(1)); } else { bcmp = parseFloat(b.percent.toFixed(2)); } return $WH.strcmp(acmp, bcmp); } }, stock: { id: 'stock', name: LANG.stock, width: '10%', value: 'stock', compute: function(row, td) { if (row.stock > 0) { return row.stock; } else { td.style.fontFamily = 'Verdana, sans-serif'; return String.fromCharCode(8734); } }, getVisibleText: function(row) { if (row.stock > 0) { return row.stock; } else { return String.fromCharCode(8734) + ' infinity'; } } }, currency: { id: 'currency', name: LANG.currency, getValue: function(row) { if (row.currency) { return (row.currency[0] ? row.currency[0][1] : 0); } }, compute: function(row, td) { if (row.currency) { var side = null; if (row.side != null) { side = row.side; } else if (row.react != null) { if (row.react[0] == 1 && row.react[1] == -1) { // Alliance only side = 1; } else if (row.react[0] == -1 && row.react[1] == 1) { // Horde only side = 2; } } Listview.funcBox.appendMoney(td, null, side, null, row.currency); } }, sortFunc: function(a, b, col) { if (a.currency == null) { return -1; } else if (b.currency == null) { return 1; } var lena = 0, lenb = 0; $WH.array_walk(a.currency, function(x, _, __, i) { lena += Math.pow(10, i) + x[1]; }); $WH.array_walk(b.currency, function(x, _, __, i) { lenb += Math.pow(10, i) + x[1]; }); return $WH.strcmp(lena, lenb); } }, mode: { id: 'mode', name: 'Mode', after: 'name', type: 'text', compute: function(row, td) { if (row.modes && row.modes.mode) { if ((row.modes.mode & 120) == 120 || (row.modes.mode & 3) == 3) { return LANG.pr_note_all; } return Listview.extraCols.mode.getVisibleText(row); } }, getVisibleText: function(row) { // TODO: Remove magic numbers. var modeNormal = !!(row.modes.mode & 26); var modeHeroic = !!(row.modes.mode & 97); var player10 = !!(row.modes.mode & 40); var player25 = !!(row.modes.mode & 80); var specificPlayers; if (player10 && !player25) { specificPlayers = 10; } else if (player25 && !player10) { specificPlayers = 25; } var specificMode; if (modeNormal && !modeHeroic) { specificMode = 'normal'; } else if (modeHeroic && !modeNormal) { specificMode = 'heroic'; } if (specificMode) { if (specificPlayers) { return $WH.sprintf(LANG['tab_' + specificMode + 'X'], specificPlayers); // e.g. "Heroic 25" } else { return LANG['tab_' + specificMode]; // e.g. "Heroic" } } if (specificPlayers) { return $WH.sprintf(LANG.lvzone_xman, specificPlayers); // e.g. "25-player" } return LANG.pr_note_all; }, sortFunc: function(a, b, col) { if (a.modes && b.modes) { return -$WH.strcmp(a.modes.mode, b.modes.mode); } } }, requires: { id: 'requires', name: LANG.requires, type: 'text', compute: function(item, td) { if (item.achievement && g_achievements[item.achievement]) { $WH.nw(td); td.className = 'small'; td.style.lineHeight = '18px'; var a = $WH.ce('a'); a.href = '?achievement=' + item.achievement; a.className = 'icontiny tinyspecial'; a.style.backgroundImage = 'url(' + g_staticUrl + '/images/icons/tiny/' + g_achievements[item.achievement].icon.toLowerCase() + '.gif)'; a.style.whiteSpace = 'nowrap'; $WH.st(a, g_achievements[item.achievement]['name_' + g_locale.name]); $WH.ae(td, a); } }, getVisibleText: function(item) { if (item.achievement && g_achievements[item.achievement]) { return g_achievements[item.achievement].name; } }, sortFunc: function(a, b, col) { return $WH.strcmp(this.getVisibleText(a), this.getVisibleText(b)); } }, reqskill: { id: 'reqskill', name: LANG.skill, width: '10%', value: 'reqskill', before: 'yield' }, yield: { id: 'yield', name: LANG.yields, type: 'text', align: 'left', span: 2, value: 'name', compute: function(row, td, tr) { if (row.yield && g_items[row.yield]) { var i = $WH.ce('td'); i.style.width = '1px'; i.style.padding = '0'; i.style.borderRight = 'none'; $WH.ae(i, g_items.createIcon(row.yield, 1)); $WH.ae(tr, i); td.style.borderLeft = 'none'; var wrapper = $WH.ce('div'); var a = $WH.ce('a'); a.style.fontFamily = 'Verdana, sans-serif'; a.href = '?item=' + row.yield; a.className = 'q' + g_items[row.yield].quality; $WH.ae(a, $WH.ct(g_items[row.yield]['name_' + g_locale.name])); $WH.ae(wrapper, a); $WH.ae(td, wrapper); } }, getVisibleText: function(row) { if (row.yield && g_items[row.yield]) { return g_items[row.yield]['name_' + g_locale.name]; } }, sortFunc: function(a, b, col) { if (!a.yield || !g_items[a.yield] || !b.yield || !g_items[b.yield]) { return (a.yield && g_items[a.yield] ? 1 : (b.yield && g_items[b.yield] ? -1 : 0)); } return -$WH.strcmp(g_items[a.yield].quality, g_items[b.yield].quality) || $WH.strcmp(g_items[a.yield]['name_' + g_locale.name], g_items[b.yield]['name_' + g_locale.name]); } }, condition: { /* condition.status: [ 0: missing 1: active 2: done / obtained ] LANG.completed LANG.earned LANG.progress probably also zones, skill, faction, .. */ id: 'condition', name: LANG.requires, compute: function(row, td) { if (!row.condition || !row.condition.type || !row.condition.typeId) { return ''; } var cnd = Listview.extraCols.condition.getState(row.condition); if (!cnd) { return; } td.className = 'small'; td.style.lineHeight = '18px'; var span = $WH.ce('span'); span.className = cnd.color; $WH.ae(span, cnd.state); $WH.ae(td, span); $WH.ae(td, $WH.ce('br')); var a = $WH.ce('a'); a.href = cnd.url; if (cnd.icon) { a.className = 'icontiny tinyspecial'; a.style.backgroundImage = 'url(' + g_staticUrl + '/images/icons/tiny/' + cnd.icon + '.gif)'; } if (cnd.quality) { a.className += ' q' + cnd.quality; } a.style.whiteSpace = 'nowrap'; $WH.st(a, cnd.name); $WH.ae(td, a); }, getVisibleText: function(row) { var buff = ''; if (!row.condition || !row.condition.type || !row.condition.typeId) { return buff; } var cnd = Listview.extraCols.condition.getState(row.condition); if (!cnd) { return buff; } buff += cnd.name + ' ' + cnd.state; return buff; }, getState: function(cond) { switch (g_types[cond.type]) { case 'spell': return Listview.extraCols.condition.getSpellState(cond); case 'item': return Listview.extraCols.condition.getItemState(cond); case 'achievement': return Listview.extraCols.condition.getAchievementState(cond); case 'quest': return Listview.extraCols.condition.getQuestState(cond); case 'event': return Listview.extraCols.condition.getEventState(cond); default: return {}; } }, getSpellState: function(cond) { if (!cond.typeId || !g_spells[cond.typeId]) { return; } var cnd = {}, item = g_spells[cond.typeId]; cnd.icon = item.icon.toLowerCase(); cnd.state = cond.status ? $WH.ct(LANG.pr_note_known) : $WH.ct(LANG.pr_note_missing); cnd.color = cond.status ? 'q2' : 'q10'; cnd.name = item['name_' + g_locale.name]; cnd.url = '?spell=' + cond.typeId; return cnd; }, getItemState: function(cond) { if (!cond.typeId || !g_items[cond.typeId]) { return; } var cnd = {}, item = g_items[cond.typeId]; cnd.icon = item.icon.toLowerCase(); cnd.state = cond.status ? $WH.ct(LANG.pr_note_earned) : $WH.ct(LANG.pr_note_missing); cnd.color = cond.status ? 'q2' : 'q10'; cnd.name = item['name_' + g_locale.name]; cnd.url = '?item=' + cond.typeId; cnd.quality = item.quality; return cnd; }, getAchievementState: function(cond) { if (!cond.typeId || !g_achievements[cond.typeId]) { return; } var cnd = {}, item = g_achievements[cond.typeId]; cnd.icon = item.icon.toLowerCase(); cnd.state = cond.status ? $WH.ct(LANG.pr_note_earned) : $WH.ct(LANG.pr_note_incomplete); cnd.color = cond.status ? 'q2' : 'q10'; cnd.name = item['name_' + g_locale.name]; cnd.url = '?achievement=' + cond.typeId; return cnd; }, getQuestState: function(cond) { if (!cond.typeId || !g_quests[cond.typeId]) { return; } var cnd = {}, item = g_quests[cond.typeId]; cnd.icon = ''; cnd.state = cond.status == 1 ? $WH.ct(LANG.progress) : cond.status == 2 ? $WH.ct(LANG.pr_note_complete) : $WH.ct(LANG.pr_note_incomplete); cnd.color = cond.status == 1 ? 'q1' : cond.status == 2 ? 'q2' : 'q10'; cnd.name = item['name_' + g_locale.name]; cnd.url = '?quest=' + cond.typeId; return cnd; }, getEventState: function(cond) { if (!cond.typeId || !g_holidays[cond.typeId]) { return; } var cnd = {}, item = g_holidays[cond.typeId]; cnd.icon = item.icon.toLowerCase(); cnd.state = cond.status ? $WH.ct('active') : $WH.ct('inactive'); cnd.color = cond.status ? 'q2' : 'q10'; cnd.name = item['name_' + g_locale.name]; cnd.url = '?event=' + cond.typeId; return cnd; }, sortFunc: function(a, b, col) { if (a.condition.status && b.condition.status) { return $WH.strcmp(a.condition.status, b.condition.status); } } }, }; Listview.funcBox = { createSimpleCol: function(i, n, w, v) { return { id: i, name: (LANG[n] !== undefined ? LANG[n] : n), width: w, value: v }; }, initLootTable: function(row) { var divider; if (this._totalCount != null) { divider = this._totalCount; } else { divider = row.outof; } if (divider == 0) { if (row.count != -1) { row.percent = row.count; } else { row.percent = 0; } } else { row.percent = row.count / divider * 100; } (Listview.funcBox.initModeFilter.bind(this, row))(); }, // // subtabs here // initModeFilter: function(row) { if(this._lootModes == null) this._lootModes = { 99: 0 }; if(this._distinctModes == null) this._distinctModes = { 99: 0 }; if((!row.modes || row.modes.mode == 4) && row.classs != 12 && row.commondrop) { this._lootModes[99]++; // Trash this._distinctModes[99]++; } else if(row.modes) { for(var i = -2; i <= 5; ++i) { if(this._lootModes[i] == null) this._lootModes[i] = 0; if(row.modes.mode & 1 << parseInt(i) + 2) this._lootModes[i]++; } if(this._distinctModes[row.modes.mode] == null) this._distinctModes[row.modes.mode] = 0; this._distinctModes[row.modes.mode]++; } }, addModeIndicator: function() { var nModes = 0; for(var i in this._distinctModes) { if(this._distinctModes[i]) nModes++; } if(nModes < 2) return; var pm = location.hash.match(/:mode=([^:]+)/), order = [0,-1,-2,1,3,2,4,5,99], langref = { "-2": LANG.tab_heroic, "-1": LANG.tab_normal, 0: LANG.tab_noteworthy, 1: $WH.sprintf(LANG.tab_normalX, 10), 2: $WH.sprintf(LANG.tab_normalX, 25), 3: $WH.sprintf(LANG.tab_heroicX, 10), 4: $WH.sprintf(LANG.tab_heroicX, 25), 5: LANG.tab_raidfinder, 99: '' // No indicator for trash }; var f = function(mode, dm, updatePound) { g_setSelectedLink(this, 'lootmode'); lv.customPound = lv.id + (dm != null ? ':mode=' + g_urlize(langref[dm].replace(' ', '')) : ''); lv.customFilter = function(item) { return Listview.funcBox.filterMode(item, lv._totalCount, mode) }; lv.updateFilters(1); lv.applySort(); lv.refreshRows(); if(updatePound) lv.updatePound(1); }; var lv = this, modes = [], a; a = $('' + LANG.pr_note_all + ''); a[0].f = f.bind(a[0], null, null, 1); a.click(a[0].f); var firstCallback = f.bind(a[0], null, null, 0); firstCallback(); modes.push($('').append(a).append($('' + LANG.pr_note_all + ''))); for(var j = 0, len = order.length; j < len; ++j) { var i = order[j]; if(!this._lootModes[i]) continue; a = $('' + langref[i] + ' (' + this._lootModes[i] + ')'); a[0].f = f.bind(a[0], 1 << i + 2, i, 1); a.click(a[0].f); if(i == 0) firstCallback = f.bind(a[0], 1 << i + 2, i, 0); if((i < -1 || i > 2) && i != 5) a.addClass('icon-heroic'); modes.push($('').append(a).append($(' 2 ? ' class="icon-heroic"' : '') + '>' + langref[i] + ' (' + this._lootModes[i] + ')'))); // jQuery is dumb if(pm && pm[1] == g_urlize(langref[i].replace(' ', ''))) (a[0].f)(); } var showNoteworthy = false; for(var i = 0, len = modes.length; i < len; ++i) { a = $('a', modes[i]); if(!$('span', a).html() && modes.length == 3) showNoteworthy = true; else this.createIndicator(modes[i], null, a[0].f); } if(showNoteworthy) firstCallback(); $(this.noteTop).append($('
')); }, filterMode: function(row, total, mode) { if(total != null && row.count != null) { if(row._count == null) row._count = row.count; var count = row._count; if(mode != null && row.modes[mode]) { count = row.modes[mode].count; total = row.modes[mode].outof; } row.__tr = null; row.count = count; row.outof = total; if(total) row.percent = count / total * 100; else row.percent = count; } return (mode != null ? ((!row.modes || row.modes.mode == 4) && row.classs != 12 && row.commondrop ? (mode == 32) : (row.modes && (row.modes.mode & mode))) : true); }, initSubclassFilter: function(row) { var i = row.classs || 0; if(this._itemClasses == null) this._itemClasses = {}; if(this._itemClasses[i] == null) this._itemClasses[i] = 0; this._itemClasses[i]++; }, addSubclassIndicator: function() { var it = location.hash.match(/:type=([^:]+)/), order = []; for(var i in g_item_classes) order.push({ i: i, n: g_item_classes[i] }); order.sort(function(a, b) { return $WH.strcmp(a.n, b.n) }); var f = function(itemClass, updatePound) { g_setSelectedLink(this, 'itemclass'); lv.customPound = lv.id + (itemClass != null ? ':type=' + itemClass : ''); lv.customFilter = function(item) { return itemClass == null || itemClass == item.classs }; lv.updateFilters(1); lv.applySort(); lv.refreshRows(); if(updatePound) lv.updatePound(1); } var lv = this, classes = [], a; a = $('' + LANG.pr_note_all + ''); a[0].f = f.bind(a[0], null, 1); a.click(a[0].f); var firstCallback = f.bind(a[0], null, 0); firstCallback(); classes.push($('').append(a).append($('' + LANG.pr_note_all + ''))); for(var j = 0, len = order.length; j < len; ++j) { var i = order[j].i; if(!this._itemClasses[i]) continue; a = $('' + g_item_classes[i] + ' (' + this._itemClasses[i] + ')'); a[0].f = f.bind(a[0], i, 1); a.click(a[0].f); classes.push($('').append(a).append($('' + g_item_classes[i] + ' (' + this._itemClasses[i] + ')'))); if(it && it[1] == g_urlize(i)) (a[0].f)(); } if(classes.length > 2) { for(var i = 0, len = classes.length; i < len; ++i) this.createIndicator(classes[i], null, $('a', classes[i])[0].f); $(this.noteTop).css('padding-bottom', '12px'); $(this.noteIndicators).append($('
')).insertAfter($(this.navTop)); } }, initStatisticFilter: function(row) { if(this._achievTypes == null) this._achievTypes = {}; if(this._achievTypes[row.type] == null) this._achievTypes[row.type] = 0; this._achievTypes[row.type]++; }, addStatisticIndicator: function() { var it = location.hash.match(/:type=([^:]+)/), order = []; for(var i in g_achievement_types) order.push({ i: i, n: g_achievement_types[i] }); order.sort(function(a, b) { return $WH.strcmp(a.n, b.n) }); var f = function(achievType, updatePound) { g_setSelectedLink(this, 'achievType'); lv.customPound = lv.id + (achievType != null ? ':type=' + achievType : ''); lv.customFilter = function(achievement) { return achievType == null || achievType == achievement.type }; lv.updateFilters(1); lv.applySort(); lv.refreshRows(); if(updatePound) lv.updatePound(1); }; var lv = this, types = [], a; a = $('' + LANG.pr_note_all + ''); a[0].f = f.bind(a[0], null, 1); a.click(a[0].f); var firstCallback = f.bind(a[0], null, 0); firstCallback(); types.push($('').append(a).append($('' + LANG.pr_note_all + ''))); for(var j = 0, len = order.length; j < len; ++j) { var i = order[j].i; if(!this._achievTypes[i]) continue; a = $('' + g_achievement_types[i] + ' (' + this._achievTypes[i] + ')'); a[0].f = f.bind(a[0], i, 1); a.click(a[0].f); types.push($('').append(a).append($('' + g_achievement_types[i] + ' (' + this._achievTypes[i] + ')'))); if(it && it[1] == i) (a[0].f)(); } if(types.length > 2) { for(var i = 0, len = types.length; i < len; ++i) this.createIndicator(types[i], null, $('a', types[i])[0].f); $(this.noteTop).append($('
')); } }, initQuestFilter: function(row) { if(this._questTypes == null) this._questTypes = {}; for(var i = 1; i <= 4; ++i) { if(this._questTypes[i] == null) this._questTypes[i] = 0; if(row._type && (row._type & 1 << i - 1)) this._questTypes[i]++; } }, addQuestIndicator: function() { var it = location.hash.match(/:type=([^:]+)/); var f = function(questType, updatePound) { g_setSelectedLink(this, 'questType'); lv.customPound = lv.id + (questType != null ? ':type=' + questType : ''); lv.customFilter = function(quest) { return questType == null || (quest._type & 1 << questType - 1) }; lv.updateFilters(1); lv.applySort(); lv.refreshRows(); if(updatePound) lv.updatePound(1); }; var lv = this, types = [], a; a = $('' + LANG.pr_note_all + ''); a[0].f = f.bind(a[0], null, 1); a.click(a[0].f); var firstCallback = f.bind(a[0], null, 0); firstCallback(); types.push($('').append(a).append($('' + LANG.pr_note_all + ''))); for(var i = 1; i <= 4; ++i) { if(!this._questTypes[i]) continue; a = $('' + g_quest_indicators[i] + ' (' + this._questTypes[i] + ')'); a[0].f = f.bind(a[0], i, 1); a.click(a[0].f); types.push($('').append(a).append($('' + g_quest_indicators[i] + ' (' + this._questTypes[i] + ')'))); if(it && it[1] == i) (a[0].f)(); } if(types.length > 2) { for(var i = 0, len = types.length; i < len; ++i) this.createIndicator(types[i], null, $('a', types[i])[0].f); $(this.noteTop).css('padding-bottom', '12px'); $(this.noteIndicators).append($('
')).insertAfter($(this.navTop)); } }, // \\ subtabs here \\ assocArrCmp: function(a, b, arr) { if (a == null) { return -1; } else if (b == null) { return 1; } var n = Math.max(a.length, b.length); for (var i = 0; i < n; ++i) { if (a[i] == null) { return -1; } else if (b[i] == null) { return 1; } var res = $WH.strcmp(arr[a[i]], arr[b[i]]); if (res != 0) { return res; } } return 0 }, assocBinFlags: function(f, arr) { var res = []; for (var i in arr) { if (!isNaN(i) && (f & 1 << i - 1)) { res.push(i); } } res.sort(function(a, b) { return $WH.strcmp(arr[a], arr[b]); }); return res; }, location: function(row, td) { if (row.location == null) { return -1; } for (var i = 0, len = row.location.length; i < len; ++i) { if (i > 0) { $WH.ae(td, $WH.ct(LANG.comma)); } var zoneId = row.location[i]; if (zoneId == -1) { $WH.ae(td, $WH.ct(LANG.ellipsis)); } else { var a = $WH.ce('a'); a.className = 'q1'; a.href = '?zone=' + zoneId; $WH.ae(a, $WH.ct(g_zones[zoneId])); $WH.ae(td, a); } } }, arrayText: function(arr, lookup) { if (arr == null) { return; } else if (!$WH.is_array(arr)) { return lookup[arr]; } var buff = ''; for (var i = 0, len = arr.length; i < len; ++i) { if (i > 0) { buff += ' '; } if (!lookup[arr[i]]) { continue; } buff += lookup[arr[i]]; } return buff; }, createCenteredIcons: function(arr, td, text, type) { if (arr != null) { var d = $WH.ce('div'), d2 = $WH.ce('div'); $WH.ae(document.body, d); if (text && (arr.length != 1 || type != 2)) { var bibi = $WH.ce('div'); bibi.style.position = 'relative'; bibi.style.width = '1px'; var bibi2 = $WH.ce('div'); bibi2.className = 'q0'; bibi2.style.position = 'absolute'; bibi2.style.right = '2px'; bibi2.style.lineHeight = '26px'; bibi2.style.fontSize = '11px'; bibi2.style.whiteSpace = 'nowrap'; $WH.ae(bibi2, $WH.ct(text)); $WH.ae(bibi, bibi2); $WH.ae(d, bibi); d.style.paddingLeft = bibi2.offsetWidth + 'px'; } var iconPool = g_items; if (type == 1) { iconPool = g_spells; } for (var i = 0, len = arr.length; i < len; ++i) { var icon; if (arr[i] == null) { icon = $WH.ce('div'); icon.style.width = icon.style.height = '26px'; } else { var id, num; if (typeof arr[i] == 'object') { id = arr[i][0]; num = arr[i][1]; } else { id = arr[i]; } if (id) { icon = iconPool.createIcon(id, 0, num); } else { icon = Icon.create('inventoryslot_empty', 0, null, 'javascript:;'); } } if (arr.length == 1 && type == 2) { // Tiny text display if (id && g_items[id]) { $WH.ee(d); var item = g_items[id], a = $WH.ce('a'), sp = $WH.ce('span'); sp.style.paddingTop = '4px'; a.href = '?item=' + id; a.className = 'q' + item.quality + ' icontiny tinyspecial'; a.style.backgroundImage = 'url(' + g_staticUrl + '/images/icons/tiny/' + item.icon.toLowerCase() + '.gif)'; a.style.whiteSpace = 'nowrap'; $WH.st(a, item['name_' + g_locale.name]); $WH.ae(sp, a); if (num > 1) { $WH.ae(sp, $WH.ct(' (' + num + ')')); } if (text) { var bibi = $WH.ce('span'); bibi.className = 'q0'; bibi.style.fontSize = '11px'; bibi.style.whiteSpace = 'nowrap'; $WH.ae(bibi, $WH.ct(text)); $WH.ae(d, bibi); if ($(bibi2).length > 0) { sp.style.paddingLeft = $(bibi2).width() + 'px'; } } $WH.ae(d, sp); } } else { icon.style.cssFloat = icon.style.styleFloat = 'left'; $WH.ae(d, icon); d.style.margin = '0 auto'; d.style.textAlign = 'left'; d.style.width = (26 * arr.length) + 'px'; } } d2.className = 'clear'; $WH.ae(td, d); $WH.ae(td, d2); return true; } }, createSocketedIcons: function(sockets, td, gems, match, text) { var nMatch = 0, d = $WH.ce('div'), d2 = $WH.ce('div'); for (var i = 0, len = sockets.length; i < len; ++i) { var icon, gemId = gems[i]; if (g_items && g_items[gemId]) { icon = g_items.createIcon(gemId, 0); } else if ($WH.isset('g_gems') && g_gems && g_gems[gemId]) { icon = Icon.create(g_gems[gemId].icon, 0, null, '?item=' + gemId); } else { icon = Icon.create(null, 0, null, 'javascript:;'); } icon.className += ' iconsmall-socket-' + g_file_gems[sockets[i]] + (!gems || !gemId ? '-empty': ''); icon.style.cssFloat = icon.style.styleFloat = 'left'; if (match && match[i]) { icon.insertBefore($WH.ce('var'), icon.childNodes[1]); ++nMatch; } $WH.ae(d, icon); } d.style.margin = '0 auto'; d.style.textAlign = 'left'; d.style.width = (26 * sockets.length) + 'px'; d2.className = 'clear'; $WH.ae(td, d); $WH.ae(td, d2); if (text && nMatch == sockets.length) { d = $WH.ce('div'); d.style.paddingTop = '4px'; $WH.ae(d, $WH.ct(text)); $WH.ae(td, d); } }, getItemType: function(itemClass, itemSubclass, itemSubsubclass) { if (itemSubsubclass != null && g_item_subsubclasses[itemClass] != null && g_item_subsubclasses[itemClass][itemSubclass] != null) { return { url: '?items=' + itemClass + '.' + itemSubclass + '.' + itemSubsubclass, text: g_item_subsubclasses[itemClass][itemSubclass][itemSubsubclass] }; } else if (itemSubclass != null &&g_item_subclasses[itemClass] != null) { return { url: '?items=' + itemClass + '.' + itemSubclass, text: g_item_subclasses[itemClass][itemSubclass] }; } else { return { url: '?items=' + itemClass, text: g_item_classes[itemClass] }; } }, getQuestCategory: function(category) { return g_quest_sorts[category]; }, getQuestReputation: function(faction, quest) { if (quest.reprewards) { for (var c = 0, a = quest.reprewards.length; c < a; ++c) { if (quest.reprewards[c][0] == faction) { return quest.reprewards[c][1]; } } } }, getFactionCategory: function(category, category2) { if (category) { return g_faction_categories[category]; } else { return g_faction_categories[category2]; } }, getEventNextDates: function(startDate, endDate, recurrence, fromWhen) { if (typeof startDate != 'string' || typeof endDate != 'string') { return [null, null]; } startDate = new Date(startDate.replace(/-/g, '/')); endDate = new Date(endDate.replace(/-/g, '/')); if (isNaN(startDate.getTime()) || isNaN(endDate.getTime())) { return [null, null]; } if (fromWhen == null) { fromWhen = g_serverTime; } var offset = 0; if (recurrence == -1) { // Once by month using day of the week of startDate var nextEvent = new Date(fromWhen.getFullYear(), fromWhen.getMonth(), 1, startDate.getHours(), startDate.getMinutes(), startDate.getSeconds()); // counts as next until it ends for (var i = 0; i < 2; ++i) { nextEvent.setDate(1); nextEvent.setMonth(nextEvent.getMonth() + i); // + 0 = try current month, else try next month var day = nextEvent.getDay(); var tolerance = 1; if (nextEvent.getYear() == 2009) { tolerance = 0; } if (day > tolerance) { nextEvent.setDate(nextEvent.getDate() + (7 - day)); // first sunday } var eventEnd = new Date(nextEvent); eventEnd.setDate(eventEnd.getDate() + (7 - tolerance)); // 2010, length of 6. tolerance is 1 if it isnt 2009 if (fromWhen.getTime() < eventEnd.getTime()) { break; // event hasnt ended yet, so this is still the current one } } offset = nextEvent.getTime() - startDate.getTime(); } else if (recurrence > 0) { recurrence *= 1000; // sec -> ms offset = Math.ceil((fromWhen.getTime() - endDate.getTime()) / recurrence) * recurrence; } startDate.setTime(startDate.getTime() + offset); endDate.setTime(endDate.getTime() + offset); return [startDate, endDate]; }, createTextRange: function(min, max) { min |= 0; max |= 0; if (min > 1 || max > 1) { if (min != max && max > 0) { return min + '-' + max; } else { return min + ''; } } return null; }, coReport: function(d, b, f) { if (!g_user.id || !g_report_reasons[f]) { return } var a = ""; if (f == 4 || f == 7) { a = prompt(LANG.prompt_details, "") } else { if (d == 2) { if (!confirm((f == 5 ? LANG.confirm_report3: LANG.confirm_report4))) { return } } else { if (!confirm($WH.sprintf((d == 0 ? LANG.confirm_report: LANG.confirm_report2), g_report_reasons[f]))) { return } } } if (a != null) { var e = "?report&type=" + d + "&typeid=" + b + "&reason=" + f; if (a) { e += "&reasonmore=" + $WH.urlencode(a) } new Ajax(e); var c = $WH.ce("span"); $WH.ae(c, $WH.ct(LANG.lvcomment_reported)); this.parentNode.replaceChild(c, this) } }, coReportClick: function(b, a, c) { this.menu = [ [2, g_report_reasons[2], Listview.funcBox.coReport.bind(this, a, b.id, 2)], [1, g_report_reasons[1], Listview.funcBox.coReport.bind(this, a, b.id, 1)], [3, g_report_reasons[3], Listview.funcBox.coReport.bind(this, a, b.id, 3)], [4, g_report_reasons[4], Listview.funcBox.coReport.bind(this, a, b.id, 4)] ]; if (a == 1 && b.op && typeof g_pageInfo != "undefined" && !g_pageInfo.sticky) { this.menu.splice(3, 0, [0, g_report_reasons[0], Listview.funcBox.coReport.bind(this, a, b.id, 0)]) } if (a == 1 && g_users[b.user].avatar == 2) { this.menu.push([5, g_report_reasons[5], Listview.funcBox.coReport.bind(this, 2, g_users[b.user].avatarmore, 5)]) } (Menu.showAtCursor.bind(this, c))() }, coGetColor: function(c, a, d) { switch (a) { case -1 : var b = null; if (!d) { b = c.divPost.childNodes[1].className.match(/comment-([a-z]+)/); } else { b = c.divBody[0].className.match(/comment-([a-z]+)/) } if (b != null) { return " comment-" + b[1] } break; case 3: case 4: if (c.roles & (U_GROUP_ADMIN | U_GROUP_BUREAU)) { return " comment-blue" } if (c.roles & U_GROUP_GREEN_TEXT) { return " comment-green" } else { if (c.roles & U_GROUP_VIP) { return " comment-gold" } } break } if (c.roles & (U_GROUP_ADMIN | U_GROUP_BUREAU)) { return " comment-blue" } else { if (c.rating >= 10) { return " comment-green" } else { if (c.rating < 0) { return " comment-bt" } } } return "" }, coToggleVis: function(b) { var c = g_toggleDisplay(b.divBody); this.firstChild.nodeValue = (c ? LANG.lvcomment_hide: LANG.lvcomment_show); b.__div.className = $WH.trim(b.__div.className.replace("comment-collapsed", "")) + (c ? "": " comment-collapsed"); var a = b.divHeader.firstChild.lastChild; if (b.ratable) { a.style.display = "" } else { if (b.deleted || b.purged) { a.style.fontWeight = "normal"; a.className = "q10"; a.innerHTML = (b.deleted ? LANG.lvcomment_deleted: LANG.lvcomment_purged); a.style.display = "" } } g_toggleDisplay(b.divLinks); if (b.lastEdit != null) { g_toggleDisplay(b.divLastEdit) } }, coDisplayRating: function(d, c) { if (typeof(d._ratingMode) == "undefined") { d._ratingMode = 0 } if (typeof(Listview._ratings) == "undefined") { Listview._ratings = {} } var a = c; var e = d._ratingMode; if (e == 0) { if (d.rating < 0) { a.innerHTML = d.rating } else { a.innerHTML = "+" + d.rating } } if (e == 1) { if (Listview._ratings[d.id] !== undefined) { var b = Listview._ratings[d.id]; a.innerHTML = "+" + b.up + " / -" + b.down } else { new Ajax("?comment=rating&id=" + d.id, { method: "get", onSuccess: function(i, g) { var f = JSON.parse(g.responseText); if (f.success) { Listview._ratings[i] = f; this.innerHTML = "+" + f.up + " / -" + f.down } else { this.innerHTML = "Error!" } }.bind(a, d.id) }); a.innerHTML = ''; } } }, coToggleRating: function(b, a) { if (typeof(b._ratingMode) == "undefined") { b._ratingMode = 0 } if (++b._ratingMode > 1) { b._ratingMode = 0 } Listview.funcBox.coDisplayRating(b, a) }, coRate: function(e, a) { if (a == 0) { var c = 5; if (g_user.roles & U_GROUP_ADMIN) { c = 25 } else { if (g_user.roles & U_GROUP_BUREAU) { c = 15 } } var d = prompt($WH.sprintf(LANG.prompt_customrating, c, c), 0); if (d == null) { return } else { d |= 0; if (d != 0 && Math.abs(d) <= c) { a = d } } if (a == 0) { return } } else { if (g_user.roles & U_GROUP_COMMENTS_MODERATOR) { a *= 5 } } e.rating += a; e.raters.push([g_user.id, a]); var b = e.divHeader.firstChild; $WH.Tooltip.hide(); b = b.childNodes[b.childNodes.length - 3]; var f = $WH.ge("commentrating" + e.id); Listview.funcBox.coDisplayRating(e, f); $WH.de(b.nextSibling); $WH.de(b.nextSibling); new Ajax("?comment=rate&id=" + e.id + "&rating=" + a, { method: "get", onSuccess: function(e) { if (e.responseText == "0") {} else { if (e.responseText == "1") { b.innerHTML = LANG.tooltip_banned_rating; } else { if (e.responseText == "3") { b.innerHTML = LANG.tooltip_too_many_votes; } else { b.innerHTML = LANG.genericerror; } } } } }); }, coDelete: function(a) { if (a.purged) { alert(LANG.message_cantdeletecomment) } else { if (confirm(LANG.confirm_deletecomment)) { new Ajax("?comment=delete&id=" + a.id); this.deleteRows([a]) } } }, coDetach: function(a) { if (a.replyTo == 0) { alert(LANG.message_cantdetachcomment) } else { if (confirm(LANG.confirm_detachcomment)) { new Ajax("?comment=detach&id=" + a.id); a.replyTo = 0; alert(LANG.message_commentdetached) } } }, coEdit: function(g, e, c) { if (!c) { g.divBody.style.display = "none"; g.divResponse.style.display = "none"; g.divLinks.firstChild.style.display = "none" } else { g.divBody.hide(); g.divResponse.hide() } var f = $WH.ce("div"); f.className = "comment-edit"; g.divEdit = f; if (e == -1) { if (g_users[g.user] != null) { g.roles = g_users[g.user].roles } } var a = Listview.funcBox.coEditAppend(f, g, e, c); var b = $WH.ce("div"); b.className = "comment-edit-buttons"; var d = $WH.ce("input"); d.type = "button"; d.value = LANG.compose_save; d.onclick = Listview.funcBox.coEditButton.bind(d, g, true, e, c); $WH.ae(b, d); $WH.ae(b, $WH.ct(" ")); d = $WH.ce("input"); d.type = "button"; d.value = LANG.compose_cancel; d.onclick = Listview.funcBox.coEditButton.bind(d, g, false, e, c); $WH.ae(b, d); $WH.ae(f, b); var c = f; if ($WH.Browser.ie6) { c = $WH.ce("div"); c.style.width = "99%"; $WH.ae(c, f) } $WH.ae(g.divBody.parentNode, f) a.focus() }, coEditAppend: function(m, b, l, X, x) { var f = Listview.funcBox.coGetCharLimit(l); if (l == 1 || l == 3 || l == 4) { b.user = g_user.name; b.roles = g_user.roles; b.rating = 1 } else { if (l == 2) { b.roles = g_user.roles; b.rating = 1 } } if (x) { b.roles &= ~U_GROUP_PENDING } if (l == -1 || l == 0) { var j = $WH.ce("div"); j.className = "comment-edit-modes"; $WH.ae(j, $WH.ct(LANG.compose_mode)); var p = $WH.ce("a"); p.className = "selected"; p.onclick = Listview.funcBox.coModeLink.bind(p, 1, l, b); p.href = "javascript:;"; $WH.ae(p, $WH.ct(LANG.compose_edit)); $WH.ae(j, p); $WH.ae(j, $WH.ct("|")); var w = $WH.ce("a"); w.onclick = Listview.funcBox.coModeLink.bind(w, 2, l, b); w.href = "javascript:;"; $WH.ae(w, $WH.ct(LANG.compose_preview)); $WH.ae(j, w); $WH.ae(m, j) } var a = $WH.ce("div"); a.style.display = "none"; a.className = "comment-body" + Listview.funcBox.coGetColor(b, l); $WH.ae(m, a); var h = $WH.ce("div"); h.className = "comment-edit-body"; var e = $WH.ce("div"); e.className = "toolbar"; e.style.cssFloat = "left"; var i = $WH.ce("div"); i.className = "menu-buttons"; i.style.cssFloat = "left"; var g = $WH.ce("textarea"); g.className = "comment-editbox"; g.rows = 10; g.style.clear = "left"; g.value = b.body; switch (l) { case 1: g.name = "commentbody"; break; case 2: g.name = "desc"; g.originalValue = b.body; break; case 3: g.name = "body"; break; case 4: g.name = "sig"; g.originalValue = b.body; g.rows = ($WH.Browser.firefox ? 2 : 3); g.style.height = "auto"; break } if (l != -1 && l != 0) { var d = $WH.ce("h3"), y = $WH.ce("a"), v = $WH.ce("div"), u = $WH.ce("div"); var c = Listview.funcBox.coLivePreview.bind(g, b, l, v); if (b.body) { y.className = "disclosure-off"; v.style.display = "none" } else { y.className = "disclosure-on" } $WH.ae(y, $WH.ct(LANG.compose_livepreview)); $WH.ae(d, y); y.href = "javascript:;"; y.onclick = function() { c(1); y.className = "disclosure-" + (g_toggleDisplay(v) ? "on": "off") }; $WH.ns(y); d.className = "first"; u.className = "pad"; $WH.ae(a, d); $WH.ae(a, v); $WH.ae(a, u); g_onAfterTyping(g, c, 50); $WH.aE(g, "focus", function() { c(); a.style.display = ""; if (l != 4) { g.style.height = "22em" } }) } else { if (l != 4) { $WH.aE(g, "focus", function() { g.style.height = "22em" }) } } var t = [{ id: "b", title: LANG.markup_b, pre: "[b]", post: "[/b]" }, { id: "i", title: LANG.markup_i, pre: "[i]", post: "[/i]" }, { id: "u", title: LANG.markup_u, pre: "[u]", post: "[/u]" }, { id: "s", title: LANG.markup_s, pre: "[s]", post: "[/s]" }, { id: "small", title: LANG.markup_small, pre: "[small]", post: "[/small]" }, { id: "url", title: LANG.markup_url, onclick: function() { var i = prompt(LANG.prompt_linkurl, "http://"); if (i) { g_insertTag(g, "[url=" + i + "]", "[/url]") } } }, { id: "quote", title: LANG.markup_quote, pre: "[quote]", post: "[/quote]" }, { id: "code", title: LANG.markup_code, pre: "[code]", post: "[/code]" }, { id: "ul", title: LANG.markup_ul, pre: "[ul]\n[li]", post: "[/li]\n[/ul]", rep: function(i) { return i.replace(/\n/g, "[/li]\n[li]") } }, { id: "ol", title: LANG.markup_ol, pre: "[ol]\n[li]", post: "[/li]\n[/ol]", rep: function(i) { return i.replace(/\n/g, "[/li]\n[li]") } }, { id: "li", title: LANG.markup_li, pre: "[li]", post: "[/li]" }]; if (!X) { for (var q = 0, r = t.length; q < r; ++q) { var k = t[q]; if (l == 4 && k.id == "quote") { break } if ((g_user.roles & U_GROUP_PENDING) && k.nopending) { continue } var o = $WH.ce("button"); o.setAttribute("type", "button"); o.title = k.title; if (k.onclick != null) { o.onclick = k.onclick } else { o.onclick = g_insertTag.bind(0, g, k.pre, k.post, k.rep) } var z = $WH.ce("img"); z.src = "template/images/pixel.gif"; z.className = "toolbar-" + k.id; $WH.ae(o, z); $WH.ae(e, o) } } else { for (var B = 0, C = t.length; B < C; ++B) { var q = t[B]; if ((g_user.rolls & U_GROUP_PENDING) && q.nopending) { continue } var H = "tb-" + q.id; var V = $WH.ce('button'); V.onclick = function(i, L) { L.preventDefault(); (i.onclick != null ? i.onclick: g_insertTag.bind(0, g, i.pre, i.post, i.rep))() }; V.bind(null, q); V.className = H; V.title = q.title; V[0].setAttribute("type", "button"); $WH.ae(V, $WH.ce('ins')); $WH.ae(e, V); } e.className += " formatting button sm"; } var r = function(L, i) { var M = prompt($WH.sprintf(LANG.markup_prompt, L), ""); if (M != null) { g_insertTag(g, "[" + i + "=" + (parseInt(M) || 0) + "]", "") } }; var A = [[0, LANG.markup_links, , [ [9, LANG.types[10][0] + "...", r.bind(null, LANG.types[10][1], "achievement")], [11, LANG.types[13][0] + "...", r.bind(null, LANG.types[13][1], "class")], [7, LANG.types[8][0] + "...", r.bind(null, LANG.types[8][1], "faction")], [0, LANG.types[3][0] + "...", r.bind(null, LANG.types[3][1], "item")], [1, LANG.types[4][0] + "...", r.bind(null, LANG.types[4][1], "itemset")], [2, LANG.types[1][0] + "...", r.bind(null, LANG.types[1][1], "npc")], [3, LANG.types[2][0] + "...", r.bind(null, LANG.types[2][1], "object")], [8, LANG.types[9][0] + "...", r.bind(null, LANG.types[9][1], "pet")], [4, LANG.types[5][0] + "...", r.bind(null, LANG.types[5][1], "quest")], [12, LANG.types[14][0] + "...", r.bind(null, LANG.types[14][1], "race")], [13, LANG.types[15][0] + "...", r.bind(null, LANG.types[15][1], "skill")], [5, LANG.types[6][0] + "...", r.bind(null, LANG.types[6][1], "spell")], [6, LANG.types[7][0] + "...", r.bind(null, LANG.types[7][1], "zone")]] ]]; var di = $WH.ce('div'); $WH.ae(di, e); $WH.ae(di, i); $WH.ae(h, di); $WH.ae(h, $WH.ce("div")); $WH.ae(h, g); $WH.ae(h, $WH.ce("br")); Menu.addButtons(i, A); if (l == 4) { $WH.ae(h, $WH.ct($WH.sprintf(LANG.compose_limit2, f, 3))) } else { $WH.ae(h, $WH.ct($WH.sprintf(LANG.compose_limit, f))) } var A = $WH.ce('span'); A.className = "comment-remaining"; $WH.ae(A, $WH.ct($WH.sprintf(LANG.compose_remaining, l - b.body.length))); $WH.ae(h, A); g.onkeyup = Listview.funcBox.coUpdateCharLimit.bind(0, g, A, f); g.onkeydown = Listview.funcBox.coUpdateCharLimit.bind(0, g, A, f); if ((l == -1 || l == 0) && g_user.roles & U_GROUP_MODERATOR) { var B = $WH.ce("div"); B.classname = "pad"; var W = $WH.ce("div"); $WH.ae(W, $WH.ct((g_user.roles & U_GROUP_ADMIN ? "Admin": "Moderator") + " response")); var p = $WH.ce("textarea"); p.value = b.response; p.rows = 3; p.style.height = "6em"; $WH.ae(h, B); $WH.ae(h, w); $WH.ae(h, p) } $WH.ae(m, h); $WH.ae(m, $WH.ce('div')); $WH.ae(m, a); return g }, /* coEditAppend: function(m, b, l) { var f = Listview.funcBox.coGetCharLimit(l); if (l == 1 || l == 3 || l == 4) { b.user = g_user.name; b.roles = g_user.roles; b.rating = 1 } else { if (l == 2) { b.roles = g_user.roles; b.rating = 1 } } if (l == -1 || l == 0) { var j = $WH.ce("div"); j.className = "comment-edit-modes"; $WH.ae(j, $WH.ct(LANG.compose_mode)); var p = $WH.ce("a"); p.className = "selected"; p.onclick = Listview.funcBox.coModeLink.bind(p, 1, l, b); p.href = "javascript:;"; $WH.ae(p, $WH.ct(LANG.compose_edit)); $WH.ae(j, p); $WH.ae(j, $WH.ct("|")); var w = $WH.ce("a"); w.onclick = Listview.funcBox.coModeLink.bind(w, 2, l, b); w.href = "javascript:;"; $WH.ae(w, $WH.ct(LANG.compose_preview)); $WH.ae(j, w); $WH.ae(m, j) } var a = $WH.ce("div"); a.style.display = "none"; a.className = "comment-body" + Listview.funcBox.coGetColor(b, l); $WH.ae(m, a); var h = $WH.ce("div"); h.className = "comment-edit-body"; var e = $WH.ce("div"); e.className = "toolbar"; var g = $WH.ce("textarea"); g.className = "comment-editbox"; g.rows = 10; g.value = b.body; switch (l) { case 1: g.name = "commentbody"; g.onfocus = g_revealCaptcha; break; case 2: g.name = "desc"; g.originalValue = b.body; break; case 3: g.name = "body"; g.onfocus = g_revealCaptcha; break; case 4: g.name = "sig"; g.originalValue = b.body; g.rows = ($WH.Browser(gecko ? 2 : 3); g.style.height = "auto"; break } if (l != -1 && l != 0) { var d = $WH.ce("h3"), y = $WH.ce("a"), v = $WH.ce("div"), u = $WH.ce("div"); var c = Listview.funcBox.coLivePreview.bind(g, b, l, v); if (b.body) { y.className = "disclosure-off"; v.style.display = "none" } else { y.className = "disclosure-on" } $WH.ae(y, $WH.ct(LANG.compose_livepreview)); $WH.ae(d, y); y.href = "javascript:;"; y.onclick = function() { c(1); y.className = "disclosure-" + (g_toggleDisplay(v) ? "on": "off") }; $WH.ns(y); d.className = "first"; u.className = "pad"; $WH.ae(a, d); $WH.ae(a, v); $WH.ae(a, u); g_onAfterTyping(g, c, 50); $WH.aE(g, "focus", function() { c(); a.style.display = ""; if (l != 4) { g.style.height = "22em" } }) } else { if (l != 4) { $WH.aE(g, "focus", function() { g.style.height = "22em" }) } } var t = [{ id: "b", title: LANG.markup_b, pre: "[b]", post: "[/b]" }, { id: "i", title: LANG.markup_i, pre: "[i]", post: "[/i]" }, { id: "u", title: LANG.markup_u, pre: "[u]", post: "[/u]" }, { id: "s", title: LANG.markup_s, pre: "[s]", post: "[/s]" }, { id: "small", title: LANG.markup_small, pre: "[small]", post: "[/small]" }, { id: "url", title: LANG.markup_url, onclick: function() { var i = prompt(LANG.prompt_linkurl, "http://"); if (i) { g_insertTag(g, "[url=" + i + "]", "[/url]") } } }, { id: "quote", title: LANG.markup_quote, pre: "[quote]", post: "[/quote]" }, { id: "code", title: LANG.markup_code, pre: "[code]", post: "[/code]" }, { id: "ul", title: LANG.markup_ul, pre: "[ul]\n[li]", post: "[/li]\n[/ul]", rep: function(i) { return i.replace(/\n/g, "[/li]\n[li]") } }, { id: "ol", title: LANG.markup_ol, pre: "[ol]\n[li]", post: "[/li]\n[/ol]", rep: function(i) { return i.replace(/\n/g, "[/li]\n[li]") } }, { id: "li", title: LANG.markup_li, pre: "[li]", post: "[/li]" }]; for (var q = 0, r = t.length; q < r; ++q) { var k = t[q]; if (l == 4 && k.id == "quote") { break } var o = $WH.ce("button"); var z = $WH.ce("img"); o.setAttribute("type", "button"); o.title = k.title; if (k.onclick != null) { o.onclick = k.onclick } else { o.onclick = g_insertTag.bind(0, g, k.pre, k.post, k.rep) } z.src = "template/images/pixel.gif"; z.className = "toolbar-" + k.id; $WH.ae(o, z); $WH.ae(e, o) } $WH.ae(h, e); $WH.ae(h, g); $WH.ae(h, $WH.ce("br")); if (l == 4) { $WH.ae(h, $WH.ct($WH.sprintf(LANG.compose_limit2, f, 3))) } else { $WH.ae(h, $WH.ct($WH.sprintf(LANG.compose_limit, f))) } $WH.ae(m, h); return g }, */ coLivePreview: function(f, e, a, b) { if (b != 1 && a.style.display == "none") { return } var c = this, i = Listview.funcBox.coGetCharLimit(e), g = (c.value.length > i ? c.value.substring(0, i) : c.value); if (e == 4) { var h; if ((h = g.indexOf("\n")) != -1 && (h = g.indexOf("\n", h + 1)) != -1 && (h = g.indexOf("\n", h + 1)) != -1) { g = g.substring(0, h) } } var d = Markup.toHtml(g, { mode: Markup.MODE_COMMENT, roles: f.roles }); if (d) { a.innerHTML = d } else { a.innerHTML = '...' } }, coEditButton: function(f, d, e, k) { if (d) { var a = $WH.gE(f.divEdit, "textarea"); var g = a[0]; if (!Listview.funcBox.coValidate(a, e)) { return } if (g.value != f.body || (a[1] && a[1].value != f.response)) { var c = 0; if (f.lastEdit != null) { c = f.lastEdit[1] }++c; f.lastEdit = [g_serverTime, c, g_user.name]; Listview.funcBox.coUpdateLastEdit(f); var b = Listview.funcBox.coGetCharLimit(e); var i = Markup.toHtml((g.value.length > b ? g.value.substring(0, b) : g.value), { mode: Markup.MODE_COMMENT, roles: f.roles }); var h = ((a[1] && a[1].value.length > 0) ? Markup.toHtml("[div][/div][wowheadresponse=" + g_user.name + " roles=" + g_user.roles + "]" + a[1].value + "[/wowheadresponse]", { mode: Markup.MODE_COMMENT, roles: g_user.roles }) : ""); if (!k) { f.divBody.innerHTML = i; f.divResponse.innerHTML = h } else { f.divBody.html(i); f.divResponse.html(h) } f.body = g.value; if (g_user.roles & U_GROUP_MODERATOR && e[1]) { f.response = e[1].value } var j = "body=" + $WH.urlencode(f.body); if (f.response !== undefined) { j += "&response=" + $WH.urlencode(f.response) } if (e == -1) { new Ajax("?forums=editpost&id=" + f.id, { method: "POST", params: j }) } else { new Ajax("?comment=edit&id=" + f.id, { method: "POST", params: j }) } } } if (!k) { f.divBody.style.display = ""; f.divResponse.style.display = ""; f.divLinks.firstChild.style.display = ""; } else { f.divBody.show(); f.divResponse.show() } $WH.de(f.divEdit); f.divEdit = null }, coGetCharLimit: function(a) { if (a == 2) { return 7500 } if (a == 4) { return 250 } if (g_user.roles & U_GROUP_STAFF) { return 16000000 } var b = 1; if (g_user.premium) { b = 3 } switch (a) { case 0: case 1: return 7500 * b; case -1 : case 3: return 15000 * b } }, coUpdateCharLimit: function(a, b, c) { var d = a.value; if (d.length > c) { a.value = d.substring(0, c); } else { b.innerHTML = (" " + $WH.sprintf(LANG.compose_remaining, c - d.length)) b.className.replace(/(?:^|\s)q10(?!\S)/g , ''); if (d.length == c) { b.className += " q10"; } } }, coModeLink: function(e, b, f) { var j = Listview.funcBox.coGetCharLimit(b); var c = Markup.MODE_COMMENT; $WH.array_walk($WH.gE(this.parentNode, "a"), function(k) { k.className = "" }); this.className = "selected"; var d = $WH.gE(this.parentNode.parentNode, "textarea"), k = d[0], i = k, a = i.previousSibling; if (b == 4) { c = Markup.MODE_SIGNATURE } switch (e) { case 1: i.style.display = ""; a.style.display = "none"; a.previousSibling.style.display = ""; i.focus(); break; case 2: i.style.display = "none"; var g = (k.value.length > j ? k.value.substring(0, j) : k.value); if (b == 4) { var h; if ((h = g.indexOf("\n")) != -1 && (h = g.indexOf("\n", h + 1)) != -1 && (h = g.indexOf("\n", h + 1)) != -1) { g = g.substring(0, h) } } var l = Markup.toHtml(g, { mode: c, roles: f.roles }); if (d[1] && d[1].value.length > 0) { l += Markup.toHtml("[div][/div][wowheadresponse=" + g_user.name + " roles=" + g_user.roles + "]" + f[1].value + "[/wowheadresponse]", { mode: c, roles: g_user.roles }) } a.innerHTML = l; a.style.display = ""; a.previousSibling.style.display = "none"; break } }, coReply: function(b) { document.forms.addcomment.elements.replyto.value = b.replyTo; var a = $WH.ge("replybox-generic"); $WH.gE(a, "span")[0].innerHTML = b.user; a.style.display = ""; co_addYourComment() }, coValidate: function(a, c) { c |= 0; if (c == 1 || c == -1) { if ($WH.trim(a.value).length < 1) { alert(LANG.message_forumposttooshort); return false } } else { if ($WH.trim(a.value).length < 10) { alert(LANG.message_commenttooshort); return false } } var b = Listview.funcBox.coGetCharLimit(c); if (a.value.length > b) { if (!confirm($WH.sprintf(c == 1 ? LANG.confirm_forumposttoolong: LANG.confirm_commenttoolong, b, a.value.substring(b - 30, b)))) { return false } } return true }, coCustomRatingOver: function(a) { $WH.Tooltip.showAtCursor(a, LANG.tooltip_customrating, 0, 0, "q") }, coPlusRatingOver: function(a) { $WH.Tooltip.showAtCursor(a, LANG.tooltip_uprate, 0, 0, "q2") }, coMinusRatingOver: function(a) { $WH.Tooltip.showAtCursor(a, LANG.tooltip_downrate, 0, 0, "q10") }, coSortDate: function(a) { a.nextSibling.nextSibling.className = ""; a.className = "selected"; this.mainDiv.className += " listview-aci"; this.setSort([1], true, false) $WH.sc("temp_comment_sort", 1) }, coSortHighestRatedFirst: function(a) { a.previousSibling.previousSibling.className = ""; a.className = "selected"; this.mainDiv.className = this.mainDiv.className.replace("listview-aci", ""); this.setSort([ - 3, 2], true, false) $WH.sc("temp_comment_sort", 2) }, coFilterByPatchVersion: function(a) { this.minPatchVersion = a.value; this.refreshRows() }, coUpdateLastEdit: function(f) { var b = f.divLastEdit; if (!b) { return } if (f.lastEdit != null) { var e = f.lastEdit; b.childNodes[1].firstChild.nodeValue = e[2]; b.childNodes[1].href = "?user=" + e[2]; var c = new Date(e[0]); var d = (g_serverTime - c) / 1000; if (b.childNodes[3].firstChild) { $WH.de(b.childNodes[3].firstChild) } Listview.funcBox.coFormatDate(b.childNodes[3], d, c); var a = ""; if (f.rating != null) { a += $WH.ct($WH.sprintf(LANG.lvcomment_patch, g_getPatchVersion(c))) } if (e[1] > 1) { a += LANG.dash + $WH.sprintf(LANG.lvcomment_nedits, e[1]) } b.childNodes[4].nodeValue = a; b.style.display = "" } else { b.style.display = "none" } }, coFormatDate: function(f, e, b, g, h) { var d; if (e < 2592000) { var a = $WH.sprintf(LANG.date_ago, g_formatTimeElapsed(e)); var c = new Date(); c.setTime(b.getTime() + (g_localTime - g_serverTime)); f.style.cursor = "help"; f.title = c.toLocaleString() } else { a = LANG.date_on + g_formatDateSimple(b, g) } if (h == 1) { a = a.substr(0, 1).toUpperCase() + a.substr(1) } d = $WH.ct(a); $WH.ae(f, d) }, coFormatFileSize: function(c) { var b = -1; var a = "KMGTPEZY"; while (c >= 1024 && b < 7) { c /= 1024; ++b } if (b < 0) { return c + " byte" + (c > 1 ? "s": "") } else { return c.toFixed(1) + " " + a[b] + "B" } }, dateEventOver: function(date, event, e) { var dates = Listview.funcBox.getEventNextDates(event.startDate, event.endDate, event.rec || 0, date), buff = ''; if (dates[0] && dates[1]) { var t1 = new Date(event.startDate.replace(/-/g, '/')), t2 = new Date(event.endDate.replace(/-/g, '/')), first, last; t1.setFullYear(date.getFullYear(), date.getMonth(), date.getDate()); t2.setFullYear(date.getFullYear(), date.getMonth(), date.getDate()); if (date.getFullYear() == dates[0].getFullYear() && date.getMonth() == dates[0].getMonth() && date.getDate() == dates[0].getDate()) { first = true; } if (date.getFullYear() == dates[1].getFullYear() && date.getMonth() == dates[1].getMonth() && date.getDate() == dates[1].getDate()) { last = true; } if (first && last) buff = g_formatTimeSimple(t1, LANG.lvscreenshot_from, 1) + ' ' + g_formatTimeSimple(t2, LANG.date_to, 1); else if (first) buff = g_formatTimeSimple(t1, LANG.tab_starts); else if (last) buff = g_formatTimeSimple(t2, LANG.tab_ends); else buff = LANG.allday; } $WH.Tooltip.showAtCursor(e, '' + event.name + '
' + buff, 0, 0, 'q'); }, ssCellOver: function() { this.className = 'screenshot-caption-over'; }, ssCellOut: function() { this.className = 'screenshot-caption'; }, ssCellClick: function(i, e) { e = $WH.$E(e); if (e.shiftKey || e.ctrlKey) { return; } var j = 0, el = e._target; while (el && j < 3) { if (el.nodeName == 'A') { return; } if (el.nodeName == 'IMG') { break; } el = el.parentNode; } ScreenshotViewer.show({ screenshots: this.data, pos: i }); }, ssCreateCb: function(td, row) { if (row.__nochk) { return; } var div = $WH.ce('div'); div.className = 'listview-cb'; div.onclick = Listview.cbCellClick; var cb = $WH.ce('input'); cb.type = 'checkbox'; cb.onclick = Listview.cbClick; $WH.ns(cb); if (row.__chk) { cb.checked = true; } row.__cb = cb; $WH.ae(div, cb); $WH.ae(td, div); }, viCellClick: function(i, e) { e = $WH.$E(e); if (e.shiftKey || e.ctrlKey) { return; } var j = 0, el = e._target; while (el && j < 3) { if (el.nodeName == 'A') { return; } if (el.nodeName == 'IMG') { break; } el = el.parentNode; } VideoViewer.show({ videos: this.data, pos: i }) }, moneyHonorOver: function(e) { $WH.Tooltip.showAtCursor(e, '' + LANG.tooltip_honorpoints + '', 0, 0, 'q1'); }, moneyArenaOver: function(e) { $WH.Tooltip.showAtCursor(e, '' + LANG.tooltip_arenapoints + '', 0, 0, 'q1'); }, moneyAchievementOver: function(e) { $WH.Tooltip.showAtCursor(e, '' + LANG.tooltip_achievementpoints + '', 0, 0, 'q1'); }, moneyCurrencyOver: function(currencyId, count, e) { var buff = g_gatheredcurrencies[currencyId]['name_' + g_locale.name /*g_loc.getName()*/]; // justice / valor points handling removed $WH.Tooltip.showAtCursor(e, buff, 0, 0, 'q1'); }, appendMoney: function(d, money, side, costItems, costCurrency, achievementPoints) { var _, __, ns = 0; if (side == 1 || side == 'alliance') { side = 1; } else if (side == 2 || side == 'horde') { side = 2; } else { side = 3; } if (money >= 10000) { ns = 1; _ = $WH.ce('span'); _.className = 'moneygold'; $WH.ae(_, $WH.ct($WH.number_format(Math.floor(money / 10000)))); $WH.ae(d, _); money %= 10000; } if (money >= 100) { if (ns) { $WH.ae(d, $WH.ct(' ')); } else { ns = 1; } _ = $WH.ce('span'); _.className = 'moneysilver'; $WH.ae(_, $WH.ct(Math.floor(money / 100))); $WH.ae(d, _); money %= 100; } if (money >= 1) { if (ns) { $WH.ae(d, $WH.ct(' ')); } else { ns = 1; } _ = $WH.ce('span'); _.className = 'moneycopper'; $WH.ae(_, $WH.ct(money)); $WH.ae(d, _); } if (costItems != null) { for (var i = 0; i < costItems.length; ++i) { if (ns) { $WH.ae(d, $WH.ct(' ')); } else { ns = 1; } var itemId = costItems[i][0]; var count = costItems[i][1]; var icon = g_items.getIcon(itemId); _ = $WH.ce('a'); _.href = '?item=' + itemId; _.className = 'moneyitem'; _.style.backgroundImage = 'url(' + g_staticUrl + '/images/icons/tiny/' + icon.toLowerCase() + '.gif)'; $WH.ae(_, $WH.ct(count)); $WH.ae(d, _); } } if (costCurrency != null) { for (var i = 0; i < costCurrency.length; ++i) { if (ns) { $WH.ae(d, $WH.ct(' ')); } else { ns = 1; } var currencyId = costCurrency[i][0]; var count = costCurrency[i][1]; var icon = ['inv_misc_questionmark', 'inv_misc_questionmark']; if (g_gatheredcurrencies[currencyId]) { icon = g_gatheredcurrencies[currencyId].icon; } // sarjuuk: replacement _ = $WH.ce('a'); _.href = '?currency=' + currencyId; _.onmousemove = $WH.Tooltip.cursorUpdate; _.onmouseout = $WH.Tooltip.hide; if (currencyId == 103) { // arena _.className = 'moneyarena tip'; _.onmouseover = Listview.funcBox.moneyArenaOver; $WH.ae(_, $WH.ct($WH.number_format(count))); } else if (currencyId == 104) { // honor if (side == 3 && icon[0] == icon[1]) { side = 1; } _.className = 'money' + (side == 1 ? 'alliance' : 'horde') + ' tip'; _.onmouseover = Listview.funcBox.moneyHonorOver; if (side == 3) { __ = $WH.ce('span'); __.className = 'moneyalliance'; $WH.ae(__, $WH.ct($WH.number_format(count))); $WH.ae(_, __); } else { $WH.ae(_, $WH.ct($WH.number_format(count))); } } else { // tokens _.className = 'icontinyr tip q1'; _.style.backgroundImage = 'url(' + g_staticUrl + '/images/icons/tiny/' + icon[0].toLowerCase() + '.gif)'; _.onmouseover = Listview.funcBox.moneyCurrencyOver.bind(_, currencyId, count); $WH.ae(_, $WH.ct($WH.number_format(count))); } /* sarjuuk: original if (side == 3 && icon[0] == icon[1]) { side = 1; } _ = $WH.ce('a'); _.href = '?currency=' + currencyId; _.className = 'icontinyr tip q1'; _.style.backgroundImage = 'url(' + g_staticUrl + '/images/icons/tiny/' + icon[(side == 3 ? 1 : side - 1)].toLowerCase() + '.gif)'; _.onmouseover = Listview.funcBox.moneyCurrencyOver.bind(_, currencyId, count); _.onmousemove = $WH.Tooltip.cursorUpdate; _.onmouseout = $WH.Tooltip.hide; $WH.ae(d, _); if (side == 3) { __ = $WH.ce('span'); __.className = 'icontinyr'; __.style.backgroundImage = 'url(' + g_staticUrl + '/images/icons/tiny/' + icon[0].toLowerCase() + '.gif)'; $WH.ae(_, __); _ = __; } */ $WH.ae(d, _); } } if (achievementPoints > 0) { if (ns) { $WH.ae(d, $WH.ct(' ')); } else { ns = 1; } _ = $WH.ce('span'); _.className = 'moneyachievement tip'; _.onmouseover = Listview.funcBox.moneyAchievementOver; _.onmousemove = $WH.Tooltip.cursorUpdate; _.onmouseout = $WH.Tooltip.hide; $WH.ae(_, $WH.ct($WH.number_format(achievementPoints))); $WH.ae(d, _); } }, getUpperSource: function(source, sm) { switch (source) { case 2: // Drop if (sm.bd) { return LANG.source_bossdrop; } if (sm.z) { return LANG.source_zonedrop; } break; case 4: // Quest return LANG.source_quests; case 5: // Vendor return LANG.source_vendors; } return g_sources[source]; }, getLowerSource: function(source, sm, type) { switch (source) { case 3: // PvP if (sm.p && g_sources_pvp[sm.p]) { return { text: g_sources_pvp[sm.p] }; } break; } switch (type) { case 0: // None case 1: // NPC case 2: // Object if (sm.z) { var res = { url: '?zone=' + sm.z, text: g_zones[sm.z] }; if (sm.t && source == 5) { res.pretext = LANG.lvitem_vendorin; } if (sm.dd && sm.dd != 99) { if (sm.dd < 0) { // Dungeon res.posttext = $WH.sprintf(LANG.lvitem_dd, "", (sm.dd < -1 ? LANG.lvitem_heroic : LANG.lvitem_normal)); } else { // Raid res.posttext = $WH.sprintf(LANG.lvitem_dd, (sm.dd & 1 ? LANG.lvitem_raid10 : LANG.lvitem_raid25), (sm.dd > 2 ? LANG.lvitem_heroic : LANG.lvitem_normal)); } } return res; } break; case 5: // Quest return { url: '?quests=' + sm.c2 + '.' + sm.c, text: Listview.funcBox.getQuestCategory(sm.c) }; break; case 6: // Spell if (sm.c && sm.s) { return { url: '?spells=' + sm.c + '.' + sm.s, text: g_spell_skills[sm.s] }; } else { return { url: '?spells=0', text: '??' }; } break; } }, getExpansionText: function(line) { var str = ''; if (line.expansion == 1) { str += ' bc'; } else if (line.expansion == 2) { str += ' wotlk wrath'; } return str; } }; Listview.templates = { faction: { sort: [1], nItemsPerPage: -1, searchable: 1, filtrable: 1, columns: [ { id: 'name', name: LANG.name, type: 'text', align: 'left', value: 'name', compute: function(faction, td) { var a = $WH.ce('a'); a.style.fontFamily = 'Verdana, sans-serif'; a.href = this.getItemLink(faction); $WH.ae(a, $WH.ct(faction.name)); if (faction.expansion) { var sp = $WH.ce('span'); sp.className = g_GetExpansionClassName(faction.expansion); $WH.ae(sp, a); $WH.ae(td, sp); } else { $WH.ae(td, a); } }, getVisibleText: function(faction) { var buff = faction.name + Listview.funcBox.getExpansionText(faction); return buff; } }, { id: 'side', name: LANG.side, type: 'text', compute: function(item, td) { if (item.side && item.side != 3) { var sp = $WH.ce('span'); sp.className = (item.side == 1 ? 'alliance-icon' : 'horde-icon'); g_addTooltip(sp, g_sides[item.side]); $WH.ae(td, sp); } }, getVisibleText: function(item) { if (item.side) { return g_sides[item.side]; } }, sortFunc: function(a, b, col) { return $WH.strcmp(g_sides[a.side], g_sides[b.side]); } }, { id: 'standing', name: LANG.reputation, value: 'standing', compute: function(faction, td) { td.style.padding = 0; $WH.ae(td, g_createReputationBar(faction.standing)); }, hidden: 1 }, { id: 'category', name: LANG.category, type: 'text', width: '16%', compute: function(faction, td) { if (faction.category2 != null) { td.className = 'small q1'; var a = $WH.ce('a'), href = '?factions=' + faction.category2; if (faction.category) { href += '.' + faction.category; } a.href = href; $WH.ae(a, $WH.ct(Listview.funcBox.getFactionCategory(faction.category, faction.category2))); $WH.ae(td, a); } }, getVisibleText: function(faction) { return Listview.funcBox.getFactionCategory(faction.category, faction.category2); }, sortFunc: function(a, b, col) { var _ = Listview.funcBox.getFactionCategory; return $WH.strcmp(_(a.category, a.category2), _(b.category, b.category2)); } } ], getItemLink: function(faction) { return '?faction=' + faction.id; } }, item: { sort: [-2], searchable: 1, filtrable: 1, columns: [ { id: 'name', name: LANG.name, type: 'text', align: 'left', span: 2, value: 'name', compute: function(item, td, tr) { if (item.upgraded) { tr.className = 'upgraded'; } var i = $WH.ce('td'); i.style.width = '1px'; i.style.padding = '0'; i.style.borderRight = 'none'; var num = null, qty = null; if (item.stack != null) { num = Listview.funcBox.createTextRange(item.stack[0], item.stack[1]); } if (item.avail != null) { qty = item.avail; } if (item.id) { $WH.ae(i, g_items.createIcon(item.id, (this.iconSize == null ? 1 : this.iconSize), num, qty)); } $WH.ae(tr, i); td.style.borderLeft = 'none'; var a = $WH.ce('a'); a.className = 'q' + (7 - parseInt(item.name.charAt(0))); a.style.fontFamily = 'Verdana, sans-serif'; a.href = this.getItemLink(item); if (item.rel) { Icon.getLink(i.firstChild).rel = item.rel; a.rel = item.rel; } $WH.ae(a, $WH.ct(item.name.substring(1))); var wrapper = $WH.ce('div'); $WH.ae(wrapper, a); if (item.reqclass) { var d = $WH.ce('div'); d.className = 'small2'; var classes = Listview.funcBox.assocBinFlags(item.reqclass, g_chr_classes); for (var i = 0, len = classes.length; i < len; ++i) { if (i > 0) { $WH.ae(d, $WH.ct(', ')); } var a = $WH.ce('a'); a.href = '?class=' + classes[i]; a.className = 'c' + classes[i]; $WH.st(a, g_chr_classes[classes[i]]); $WH.ae(d, a); } $WH.ae(wrapper, d); } if (typeof fi_nExtraCols == 'number' && fi_nExtraCols >= 5) { if (item.source != null && item.source.length == 1) { if (item.reqclass) { $WH.ae(d, $WH.ct(LANG.dash)); } else { var d = $WH.ce('div'); d.className = 'small2'; } var sm = (item.sourcemore ? item.sourcemore[0] : {}); var type = 0; if (sm.t) { type = sm.t; var a = $WH.ce('a'); if (sm.q != null) { a.className = 'q' + sm.q; } else { a.className = 'q1'; } a.href = '?' + g_types[sm.t] + '=' + sm.ti; if (sm.n.length <= 30) { $WH.ae(a, $WH.ct(sm.n)); } else { a.title = sm.n; $WH.ae(a, $WH.ct($WH.trim(sm.n.substr(0, 27)) + '...')); } $WH.ae(d, a); } else { $WH.ae(d, $WH.ct(Listview.funcBox.getUpperSource(item.source[0], sm))); } var ls = Listview.funcBox.getLowerSource(item.source[0], sm, type); if (ls != null) { $WH.ae(d, $WH.ct(LANG.hyphen)); if (ls.pretext) { $WH.ae(d, $WH.ct(ls.pretext)); } if (ls.url) { var a = $WH.ce('a'); a.className = 'q1'; a.href = ls.url; $WH.ae(a, $WH.ct(ls.text)); $WH.ae(d, a); } else { $WH.ae(d, $WH.ct(ls.text)); } if (ls.posttext) { $WH.ae(d, $WH.ct(ls.posttext)); } } $WH.ae(wrapper, d); } } if (item.heroic || item.reqrace) { wrapper.style.position = 'relative'; var d = $WH.ce('div'); d.className = 'small'; d.style.fontStyle = 'italic'; d.style.position = 'absolute'; d.style.right = d.style.bottom = '3px'; if (item.heroic) { var s = $WH.ce('span'); s.className = 'q2'; $WH.ae(s, $WH.ct(LANG.lvitem_heroicitem)); $WH.ae(d, s); } if (item.reqrace) { if ((item.reqrace & 1791) != 1101 && (item.reqrace & 1791) != 690) { if (item.heroic) { $WH.ae(d, $WH.ce('br')); d.style.bottom = '-6px'; } var races = Listview.funcBox.assocBinFlags(item.reqrace, g_chr_races); for (var i = 0, len = races.length; i < len; ++i) { if (i > 0) { $WH.ae(d, $WH.ct(', ')); } var a = $WH.ce('a'); a.href = '?race=' + races[i]; $WH.st(a, g_chr_races[races[i]]); $WH.ae(d, a); } d.className += ' q1'; } } $WH.ae(wrapper, d); } $WH.ae(td, wrapper); }, getVisibleText: function(item) { var buff = item.name.substring(1); if (item.heroic) { buff += ' ' + LANG.lvitem_heroicitem; } if (item.reqrace) { buff += ' ' + Listview.funcBox.arrayText(Listview.funcBox.assocBinFlags(item.reqrace, g_chr_races), g_chr_races); } if (item.reqclass) { buff += ' ' + Listview.funcBox.arrayText(Listview.funcBox.assocBinFlags(item.reqclass, g_chr_classes), g_chr_classes); } if (typeof fi_nExtraCols == 'number' && fi_nExtraCols >= 5) { if (item.source != null && item.source.length == 1) { var sm = (item.sourcemore ? item.sourcemore[0] : {}); var type = 0; if (sm.t) { type = sm.t; buff += ' ' + sm.n; } else { buff += ' ' + Listview.funcBox.getUpperSource(item.source[0], sm); } var ls = Listview.funcBox.getLowerSource(item.source[0], sm, type); if (ls != null) { if (ls.pretext) { buff += ' ' + ls.pretext; } buff += ' ' + ls.text; if (ls.posttext) { buff += ' ' + ls.posttext; } } } } return buff; } }, { id: 'level', name: LANG.level, value: 'level', type: 'range', getMinValue: function(item) { return item.minlevel ? item.minlevel: item.level; }, getMaxValue: function(item) { return item.maxlevel ? item.maxlevel: item.level; }, compute: function(item, td) { if (item.minlevel && item.maxlevel) { if (item.minlevel != item.maxlevel) { return item.minlevel + LANG.hyphen + item.maxlevel; } else { return item.minlevel; } } else { return item.level; } }, sortFunc: function(a, b, col) { if (col > 0) { return $WH.strcmp(a.minlevel, b.minlevel) || $WH.strcmp(a.maxlevel, b.maxlevel) || $WH.strcmp(a.level, b.level); } else { return $WH.strcmp(a.maxlevel, b.maxlevel) || $WH.strcmp(a.minlevel, b.minlevel) || $WH.strcmp(a.level, b.level); } } }, { id: 'reqlevel', name: LANG.req, tooltip: LANG.tooltip_reqlevel, value: 'reqlevel', compute: function(item, td) { if (item.reqlevel > 1) { return item.reqlevel; } } }, { id: 'side', name: LANG.side, type: 'text', compute: function(item, td) { if (item.side && item.side != 3) { var sp = $WH.ce('span'); sp.className = (item.side == 1 ? 'alliance-icon': 'horde-icon'); g_addTooltip(sp, g_sides[item.side]); $WH.ae(td, sp); } }, getVisibleText: function(item) { if (item.side) { return g_sides[item.side]; } }, sortFunc: function(a, b, col) { return $WH.strcmp(g_sides[a.side], g_sides[b.side]); } }, { id: 'dps', name: LANG.dps, value: 'dps', compute: function(item, td) { return (item.dps || 0).toFixed(1); }, hidden: true }, { id: 'speed', name: LANG.speed, value: 'speed', compute: function(item, td) { return (item.speed || 0).toFixed(2); }, hidden: true }, { id: 'armor', name: LANG.armor, value: 'armor', compute: function(item, td) { if (item.armor > 0) { return item.armor; } }, hidden: true }, { id: 'slot', name: LANG.slot, type: 'text', compute: function(item, td) { $WH.nw(td); return g_item_slots[item.slot]; }, getVisibleText: function(item) { return g_item_slots[item.slot]; }, sortFunc: function(a, b, col) { return $WH.strcmp(g_item_slots[a.slot], g_item_slots[b.slot]); } }, { id: 'slots', name: LANG.slots, value: 'nslots', hidden: true }, { id: 'skill', name: LANG.skill, value: 'skill', hidden: true }, { id: 'glyph', name: LANG.glyphtype, type: 'text', value: 'glyph', compute: function(item, td) { if (item.glyph) { return g_item_glyphs[item.glyph]; } }, getVisibleText: function(item) { return g_item_glyphs[item.glyph]; }, sortFunc: function(a, b, col) { return $WH.strcmp(g_item_glyphs[a.glyph], g_item_glyphs[b.glyph]); }, hidden: true }, { id: 'source', name: LANG.source, type: 'text', compute: function(item, td) { if (this.iconSize == 0) { td.className = 'small'; } if (item.source != null) { if (item.source.length == 1) { $WH.nw(td); var sm = (item.sourcemore ? item.sourcemore[0] : {}); var type = 0; if (sm.t) { type = sm.t; var a = $WH.ce('a'); if (sm.q != null) { a.className = 'q' + sm.q; } else { a.className = 'q1'; } a.href = '?' + g_types[sm.t] + '=' + sm.ti; a.style.whiteSpace = 'nowrap'; if (sm.icon) { a.className += ' icontiny tinyspecial'; a.style.backgroundImage = 'url("' + g_staticUrl + '/images/icons/tiny/' + sm.icon.toLowerCase() + '.gif")'; } $WH.ae(a, $WH.ct(sm.n)); $WH.ae(td, a); } else { $WH.ae(td, $WH.ct(Listview.funcBox.getUpperSource(item.source[0], sm))); } var ls = Listview.funcBox.getLowerSource(item.source[0], sm, type); if (this.iconSize != 0 && ls != null) { var div = $WH.ce('div'); div.className = 'small2'; if (ls.pretext) { $WH.ae(div, $WH.ct(ls.pretext)); } if (ls.url) { var a = $WH.ce('a'); a.className = 'q1'; a.href = ls.url; $WH.ae(a, $WH.ct(ls.text)); $WH.ae(div, a); } else { $WH.ae(div, $WH.ct(ls.text)); } if (ls.posttext) { $WH.ae(div, $WH.ct(ls.posttext)); } $WH.ae(td, div); } } else { var buff = ''; for (var i = 0, len = item.source.length; i < len; ++i) { if (i > 0) { buff += LANG.comma; } buff += g_sources[item.source[i]]; } return buff; } } }, getVisibleText: function(item) { if (item.source != null) { if (item.source.length == 1) { var buff = ''; var sm = (item.sourcemore ? item.sourcemore[0] : {}); var type = 0; if (sm.t) { type = sm.t; buff += ' ' + sm.n; } else { buff += ' ' + Listview.funcBox.getUpperSource(item.source[0], sm); } var ls = Listview.funcBox.getLowerSource(item.source[0], sm, type); if (ls != null) { if (ls.pretext) { buff += ' ' + ls.pretext; } buff += ' ' + ls.text; if (ls.posttext) { buff += ' ' + ls.posttext; } } return buff; } else { return Listview.funcBox.arrayText(item.source, g_sources); } } }, sortFunc: function(a, b) { var res = Listview.funcBox.assocArrCmp(a.source, b.source, g_sources); if (res != 0) { return res; } var na = (a.sourcemore && a.source.length == 1 ? a.sourcemore[0].n: null), nb = (b.sourcemore && b.source.length == 1 ? b.sourcemore[0].n: null); return $WH.strcmp(na, nb); } }, { id: 'type', name: LANG.type, type: 'text', compute: function(item, td) { if (item.classs == null) { return; } td.className = 'small q1'; $WH.nw(td); var a = $WH.ce('a'); var it = Listview.funcBox.getItemType(item.classs, item.subclass, item.subsubclass); a.href = it.url; $WH.ae(a, $WH.ct(it.text)); $WH.ae(td, a); }, getVisibleText: function(item) { return Listview.funcBox.getItemType(item.classs, item.subclass, item.subsubclass).text; }, sortFunc: function(a, b, col) { var _ = Listview.funcBox.getItemType; return $WH.strcmp(_(a.classs, a.subclass, a.subsubclass).text, _(b.classs, b.subclass, b.subsubclass).text); } } ], getItemLink: function(item) { return item.id > 0 ? '?item=' + item.id : 'javascript:;'; }, onBeforeCreate: function() { var nComparable = false; for (var i = 0, len = this.data.length; i < len; ++i) { var item = this.data[i]; if ((item.slot > 0 && item.slot != 18) || (item.classs == 3 && item.subclass != 7) || ($WH.in_array(ModelViewer.validSlots, item.slotbak) >= 0 && item.displayid > 0) || item.modelviewer) { // Equippable, and not a bag, or has a model ++nComparable; } else { item.__nochk = 1; } } if (nComparable > 0) { this.mode = Listview.MODE_CHECKBOX; this._nComparable = nComparable; } }, createCbControls: function(div, topBar) { if (!topBar && this._nComparable < 15) { return; } if (this.mode != Listview.MODE_CHECKBOX) { return; } var iCompare = $WH.ce('input'), iViewIn3d = $WH.ce('input'), iEquip = $WH.ce('input'), iDeselect = $WH.ce('input'), pinnedChr = g_user.characters ? $WH.array_filter(g_user.characters, function(row) { return row.pinned; }) : false; iCompare.type = iViewIn3d.type = iEquip.type = iDeselect.type = 'button'; iCompare.value = LANG.button_compare; iViewIn3d.value = LANG.button_viewin3d; iEquip.value = LANG.button_equip; iDeselect.value = LANG.button_deselect; iCompare.onclick = this.template.compareItems.bind(this); iViewIn3d.onclick = this.template.viewIn3d.bind(this); iDeselect.onclick = Listview.cbSelect.bind(this, false); if (this._nComparable == 0 || typeof this._nComparable == 'undefined') { iCompare.disabled = 'disabled'; iViewIn3d.disabled = 'disabled'; iEquip.disabled = 'disabled'; iDeselect.disabled = 'disabled'; pinnedChr = false; } $WH.ae(div, iCompare); $WH.ae(div, iViewIn3d); if (pinnedChr && pinnedChr.length) { iEquip.onclick = this.template.equipItems.bind(this, pinnedChr[0]); $WH.ae(div, iEquip); } $WH.ae(div, iDeselect); }, compareItems: function() { var rows = this.getCheckedRows(); if (!rows.length) { return; } var data = ''; $WH.array_walk(rows, function(x) { if (x.slot == 0 || x.slot == 18) { return; } data += x.id + ';'; }); su_addToSaved($WH.rtrim(data, ';'), rows.length); }, viewIn3d: function() { var rows = this.getCheckedRows(); if (!rows.length) { return; } var hasData = false, repeatData = false, badData = false; var data = {}; var model = null; $WH.array_walk(rows, function(x) { if ($WH.in_array(ModelViewer.validSlots, x.slotbak) >= 0 && x.displayid > 0) { var slot = ModelViewer.slotMap[x.slotbak]; if (data[slot]) { repeatData = true; } data[slot] = x.displayid; hasData = true; } else if (x.modelviewer) { model = x.modelviewer; } else { badData = true; } }); var message = null; if (model) { if (hasData || badData) { message = LANG.dialog_cantdisplay; } ModelViewer.show({ type: model.type, displayId: model.displayid, slot: model.slot, message: message }); } else { if (repeatData || badData) { message = LANG.dialog_cantdisplay; } var equipList = []; for (var i in data) { equipList.push(parseInt(i)); equipList.push(data[i]); } if (equipList.length > 0) { ModelViewer.show({ type: 4, equipList: equipList, message: message }); } else { alert(LANG.message_nothingtoviewin3d); } } }, equipItems: function(character) { var rows = this.getCheckedRows(); if (!rows.length) { return; } var data = ''; $WH.array_walk(rows, function(x) { if (x.slot == 0 || x.slot == 18) { return; } data += x.id + ':'; }); location.href = g_getProfileUrl(character) + '&items=' + $WH.rtrim(data, ':'); } }, itemset: { sort: [1], nItemsPerPage: 75, searchable: 1, filtrable: 1, columns: [ { id: 'name', name: LANG.name, type: 'text', align: 'left', value: 'name', compute: function(itemSet, td) { var a = $WH.ce('a'); a.className = 'q' + (7 - parseInt(itemSet.name.charAt(0))); a.style.fontFamily = 'Verdana, sans-serif'; a.href = this.getItemLink(itemSet); $WH.ae(a, $WH.ct(itemSet.name.substring(1))); var div = $WH.ce('div'); div.style.position = 'relative'; $WH.ae(div, a); if (itemSet.heroic) { var d = $WH.ce('div'); d.className = 'small q2'; d.style.fontStyle = 'italic'; d.style.position = 'absolute'; d.style.right = '3px'; d.style.bottom = '3px'; $WH.ae(d, $WH.ct(LANG.lvitem_heroicitem)); $WH.ae(div, d); } $WH.ae(td, div); if (itemSet.note) { var d = $WH.ce('div'); d.className = 'small'; $WH.ae(d, $WH.ct(g_itemset_notes[itemSet.note])); $WH.ae(td, d); } }, getVisibleText: function(itemSet) { var buff = itemSet.name.substring(1); if (itemSet.note) { buff += ' ' + g_itemset_notes[itemSet.note]; } return buff; } }, { id: 'level', name: LANG.level, type: 'range', getMinValue: function(itemSet) { return itemSet.minlevel; }, getMaxValue: function(itemSet) { return itemSet.maxlevel; }, compute: function(itemSet, td) { if (itemSet.minlevel > 0 && itemSet.maxlevel > 0) { if (itemSet.minlevel != itemSet.maxlevel) { return itemSet.minlevel + LANG.hyphen + itemSet.maxlevel; } else { return itemSet.minlevel; } } else { return - 1; } }, sortFunc: function(a, b, col) { if (col > 0) { return $WH.strcmp(a.minlevel, b.minlevel) || $WH.strcmp(a.maxlevel, b.maxlevel); } else { return $WH.strcmp(a.maxlevel, b.maxlevel) || $WH.strcmp(a.minlevel, b.minlevel); } } }, { id: 'pieces', name: LANG.pieces, getValue: function(itemSet) { return itemSet.pieces.length; }, compute: function(itemSet, td) { td.style.padding = '0'; Listview.funcBox.createCenteredIcons(itemSet.pieces, td); }, sortFunc: function(a, b) { var lena = (a.pieces != null ? a.pieces.length: 0); var lenb = (b.pieces != null ? b.pieces.length: 0); return $WH.strcmp(lena, lenb); } }, { id: 'type', name: LANG.type, type: 'text', compute: function(itemSet, td) { return g_itemset_types[itemSet.type]; }, sortFunc: function(a, b, col) { return $WH.strcmp(g_itemset_types[a.type], g_itemset_types[b.type]); } }, { id: 'classes', name: LANG.classes, type: 'text', width: '20%', getVisibleText: function(itemSet) { var str = ''; if (itemSet.reqclass) { var classes = Listview.funcBox.assocBinFlags(itemSet.reqclass, g_chr_classes); for (var i = 0, len = classes.length; i < len; ++i) { if (i > 0) { str += LANG.comma; } str += g_chr_classes[classes[i]]; } } return str; }, compute: function(itemSet, td) { if (itemSet.reqclass) { var classes = Listview.funcBox.assocBinFlags(itemSet.reqclass, g_chr_classes); var d = $WH.ce('div'); d.style.width = (26 * classes.length) + 'px'; d.style.margin = '0 auto'; for (var i = 0, len = classes.length; i < len; ++i) { var icon = Icon.create('class_' + g_file_classes[classes[i]], 0, null, '?class=' + classes[i]); icon.style.cssFloat = icon.style.styleFloat = 'left'; g_addTooltip(icon, g_chr_classes[classes[i]], 'c' + classes[i]); $WH.ae(d, icon); } $WH.ae(td, d); } }, sortFunc: function(a, b, col) { return Listview.funcBox.assocArrCmp(Listview.funcBox.assocBinFlags(a.reqclass, g_chr_classes), Listview.funcBox.assocBinFlags(b.reqclass, g_chr_classes), g_chr_classes); } } ], getItemLink: function(itemSet) { return '?itemset=' + itemSet.id; } }, npc: { sort: [1], nItemsPerPage: 100, searchable: 1, filtrable: 1, columns: [ { id: 'name', name: LANG.name, type: 'text', align: 'left', value: 'name', compute: function(npc, td) { if (npc.boss) { td.className = 'boss-icon-padded'; } var a = $WH.ce('a'); a.style.fontFamily = 'Verdana, sans-serif'; a.href = this.getItemLink(npc); $WH.ae(a, $WH.ct(npc.name)); $WH.ae(td, a); if (npc.tag != null) { var d = $WH.ce('div'); d.className = 'small'; $WH.ae(d, $WH.ct('<' + npc.tag + '>')); $WH.ae(td, d); } }, getVisibleText: function(npc) { var buff = npc.name; if (npc.tag) { buff += ' <' + npc.tag + '>'; } if (npc.boss) { buff += ' boss skull'; } return buff; }, sortFunc: function(a, b, col) { return $WH.strcmp(b.boss, a.boss) || $WH.strcmp(a.name, b.name); } }, { id: 'level', name: LANG.level, type: 'range', width: '10%', getMinValue: function(npc) { return npc.minlevel; }, getMaxValue: function(npc) { return npc.maxlevel; }, compute: function(npc, td) { if (npc.classification) { var d = $WH.ce('div'); d.className = 'small'; $WH.ae(d, $WH.ct(g_npc_classifications[npc.classification])); $WH.ae(td, d); } if (npc.classification == 3 || npc.maxlevel == 9999) { return '??'; } if (npc.minlevel > 0 && npc.maxlevel > 0) { if (npc.minlevel != npc.maxlevel) { return npc.minlevel + LANG.hyphen + npc.maxlevel; } else { return npc.minlevel; } } return -1; }, getVisibleText: function(npc) { var buff = ''; if (npc.classification) { buff += ' ' + g_npc_classifications[npc.classification]; } if (npc.minlevel > 0 && npc.maxlevel > 0) { buff += ' '; if(npc.maxlevel == 9999) { buff += '??'; } else if (npc.minlevel != npc.maxlevel) { buff += npc.minlevel + LANG.hyphen + npc.maxlevel; } else { buff += npc.minlevel; } } return buff; }, sortFunc: function(a, b, col) { if (col > 0) { return $WH.strcmp(a.minlevel, b.minlevel) || $WH.strcmp(a.maxlevel, b.maxlevel) || $WH.strcmp(a.classification, b.classification); } else { return $WH.strcmp(a.maxlevel, b.maxlevel) || $WH.strcmp(a.minlevel, b.minlevel) || $WH.strcmp(a.classification, b.classification); } } }, { id: 'location', name: LANG.location, type: 'text', compute: function(npc, td) { return Listview.funcBox.location(npc, td); }, getVisibleText: function(npc) { return Listview.funcBox.arrayText(npc.location, g_zones); }, sortFunc: function(a, b, col) { return Listview.funcBox.assocArrCmp(a.location, b.location, g_zones); } }, { id: 'react', name: LANG.react, type: 'text', width: '10%', value: 'react', filtrable: 0, compute: function(npc, td) { if (npc.react == null) { return -1; } var sides = [LANG.lvnpc_alliance, LANG.lvnpc_horde]; var c = 0; for (var k = 0; k < 2; ++k) { if (npc.react[k] != null) { if (c++ > 0) { $WH.ae(td, $WH.ct(' ')); } var sp = $WH.ce('span'); sp.className = (npc.react[k] < 0 ? 'q10': (npc.react[k] > 0 ? 'q2': 'q')); $WH.ae(sp, $WH.ct(sides[k])); $WH.ae(td, sp); } } } }, { id: 'skin', name: LANG.skin, type: 'text', value: 'skin', compute: function(npc, td) { if (npc.skin) { var a = $WH.ce('a'); a.className = 'q1'; a.href = '?npcs&filter=cr=35;crs=0;crv=' + npc.skin; $WH.ae(a, $WH.ct(npc.skin)); $WH.ae(td, a); } }, hidden: 1 }, { id: 'petfamily', name: LANG.petfamily, type: 'text', width: '12%', compute: function(npc, td) { td.className = 'q1'; var a = $WH.ce('a'); a.href = '?pet=' + npc.family; $WH.ae(a, $WH.ct(g_pet_families[npc.family])); $WH.ae(td, a); }, getVisibleText: function(npc) { return g_pet_families[npc.family]; }, sortFunc: function(a, b, col) { return $WH.strcmp(g_pet_families[a.family], g_pet_families[b.family]); }, hidden: 1 }, { id: 'type', name: LANG.type, type: 'text', width: '12%', compute: function(npc, td) { td.className = 'small q1'; var a = $WH.ce('a'); a.href = '?npcs=' + npc.type; $WH.ae(a, $WH.ct(g_npc_types[npc.type])); $WH.ae(td, a); }, getVisibleText: function(npc) { return g_npc_types[npc.type]; }, sortFunc: function(a, b, col) { return $WH.strcmp(g_npc_types[a.type], g_npc_types[b.type]); } } ], getItemLink: function(npc) { return '?npc=' + npc.id; } }, object: { sort: [1], nItemsPerPage: 100, searchable: 1, filtrable: 1, columns: [ { id: 'name', name: LANG.name, type: 'text', align: 'left', value: 'name', compute: function(object, td) { var a = $WH.ce('a'); a.style.fontFamily = 'Verdana, sans-serif'; a.href = this.getItemLink(object); $WH.ae(a, $WH.ct(object.name)); $WH.ae(td, a); } }, { id: 'location', name: LANG.location, type: 'text', compute: function(object, td) { return Listview.funcBox.location(object, td); }, getVisibleText: function(object) { return Listview.funcBox.arrayText(object.location, g_zones); }, sortFunc: function(a, b, col) { return Listview.funcBox.assocArrCmp(a.location, b.location, g_zones); } }, { id: 'skill', name: LANG.skill, width: '10%', value: 'skill', hidden: true }, { id: 'type', name: LANG.type, type: 'text', width: '12%', compute: function(object, td) { td.className = 'small q1'; var a = $WH.ce('a'); a.href = '?objects=' + object.type; $WH.ae(a, $WH.ct(g_object_types[object.type])); $WH.ae(td, a); }, getVisibleText: function(object) { return g_object_types[object.type]; }, sortFunc: function(a, b, col) { return $WH.strcmp(g_object_types[a.type], g_object_types[b.type]); } } ], getItemLink: function(object) { return '?object=' + object.id; } }, quest: { sort: [1,2], nItemsPerPage: 100, searchable: 1, filtrable: 1, columns: [ { id: 'name', name: LANG.name, type: 'text', align: 'left', value: 'name', compute: function(quest, td) { var wrapper = $WH.ce('div'); var a = $WH.ce('a'); a.style.fontFamily = 'Verdana, sans-serif'; a.href = this.getItemLink(quest); $WH.ae(a, $WH.ct(quest.name)); $WH.ae(wrapper, a); if (quest.reqclass) { var d = $WH.ce('div'); d.className += ' small2'; var classes = Listview.funcBox.assocBinFlags(quest.reqclass, g_chr_classes); for (var i = 0, len = classes.length; i < len; ++i) { if (i > 0) { $WH.ae(d, $WH.ct(LANG.comma)); } var a = $WH.ce('a'); a.href = '?class=' + classes[i]; a.className += 'c' + classes[i]; $WH.st(a, g_chr_classes[classes[i]]); $WH.ae(d, a); } $WH.ae(wrapper, d); } if (quest.wflags & 1 || (quest.wflags & 32) || (quest.reqrace && quest.reqrace != -1)) { wrapper.style.position = 'relative'; var d = $WH.ce('div'); d.className = 'small'; d.style.fontStyle = 'italic'; d.style.position = 'absolute'; d.style.right = '3px'; d.style.bottom = '3px'; d.style.textAlign = 'right'; if (quest.wflags & 1) { var s = $WH.ce('span'); s.style.color = 'red'; $WH.ae(s, $WH.ct(LANG.lvquest_disabled)); // $WH.ae(s, $WH.ct(LANG.lvquest_removed)); $WH.ae(d, s); } if (quest.wflags & 32) { if (quest.wflags & 1) { $WH.ae(d, $WH.ce('br')); wrapper.style.height = '33px'; } var s = $WH.ce('span'), o = LANG.lvquest_autoaccept; if (quest.wflags & 64) { s.style.color = 'red'; o += ' ' + LANG.lvquest_hostile; } $WH.ae(s, $WH.ct(o)); $WH.ae(d, s); } if (quest.reqrace && quest.reqrace != -1) { var races = Listview.funcBox.assocBinFlags(quest.reqrace, g_chr_races); if (races.length && (quest.wflags & 1 || (quest.wflags & 32))) { $WH.ae(d, $WH.ce('br')); wrapper.style.height = '33px'; } for (var i = 0, len = races.length; i < len; ++i) { if (i > 0) { $WH.ae(d, $WH.ct(LANG.comma)); } var l = $WH.ce('a'); l.href = '?race=' + races[i]; l.className += 'q1'; $WH.st(l, g_chr_races[races[i]]); $WH.ae(d, l); } } $WH.ae(wrapper, d); } $WH.ae(td, wrapper); } }, { id: 'level', name: LANG.level, value: 'level', compute: function(quest, td) { if (quest.type || quest.daily || quest.weekly) { var d = $WH.ce('div'); d.className = 'small'; $WH.nw(d); if (quest.daily) { if (quest.type) { $WH.ae(d, $WH.ct($WH.sprintf(LANG.lvquest_daily, g_quest_types[quest.type]))); } else { $WH.ae(d, $WH.ct(LANG.daily)); } } else if (quest.weekly) { if (quest.type) { $WH.ae(d, $WH.ct($WH.sprintf(LANG.lvquest_weekly, g_quest_types[quest.type]))); } else { $WH.ae(d, $WH.ct(LANG.weekly)); } } else if (quest.type) { $WH.ae(d, $WH.ct(g_quest_types[quest.type])); } $WH.ae(td, d); } return quest.level; }, getVisibleText: function(quest) { var buff = ''; if (quest.type) { buff += ' ' + g_quest_types[quest.type]; } if (quest.daily) { buff += ' ' + LANG.daily; } else if (quest.weekly) { buff += ' ' + LANG.weekly; } if (quest.level) { buff += ' ' + quest.level; } return buff; }, sortFunc: function(a, b, col) { return $WH.strcmp(a.level, b.level) || $WH.strcmp(a.type, b.type); } }, { id: 'reqlevel', name: LANG.req, tooltip: LANG.tooltip_reqlevel, value: 'reqlevel' }, { id: 'side', name: LANG.side, type: 'text', compute: function(quest, td) { if (quest.side && quest.side != 3) { var sp = $WH.ce('span'); sp.className = (quest.side == 1 ? 'alliance-icon': 'horde-icon'); g_addTooltip(sp, g_sides[quest.side]); $WH.ae(td, sp); } else if (!quest.side) { $WH.ae(td, $WH.ct('??')); } }, getVisibleText: function(quest) { if (quest.side) { return g_sides[quest.side]; } }, sortFunc: function(a, b, col) { return $WH.strcmp(g_sides[a.side], g_sides[b.side]); } }, { id: 'rewards', name: LANG.rewards, compute: function(quest, td) { var hasIcons = (quest.itemchoices != null || quest.itemrewards != null); if (hasIcons) { var choiceText, rewardText; if (quest.itemchoices && quest.itemchoices.length > 1) { choiceText = LANG.lvquest_pickone; if (quest.itemrewards && quest.itemrewards.length > 0) { rewardText = LANG.lvquest_alsoget; } } Listview.funcBox.createCenteredIcons(quest.itemchoices, td, choiceText, 2); Listview.funcBox.createCenteredIcons(quest.itemrewards, td, rewardText, 2); } if (quest.titlereward && g_titles[quest.titlereward]) { var title = g_titles[quest.titlereward]['name_' + g_locale.name]; title = title.replace('%s', '<' + LANG.name + '>'); var span = $WH.ce('a'); span.className = 'q1'; span.href = '?title=' + quest.titlereward; span.innerHTML = title; $WH.ae(td, span); $WH.ae(td, $WH.ce('br')); } }, getVisibleText: function(quest) { var buff = ''; if (quest.itemchoices && quest.itemchoices.length) { buff += ' ' + LANG.lvquest_pickone; if (quest.itemrewards && quest.itemrewards.length) { buff += ' ' + LANG.lvquest_alsoget; } } if (quest.titlereward && g_titles[quest.titlereward]) { buff += ' ' + g_titles[quest.titlereward]['name_' + g_locale.name]; } return buff; }, sortFunc: function(a, b, col) { var lenA = (a.itemchoices != null ? a.itemchoices.length : 0) + (a.itemrewards != null ? a.itemrewards.length : 0); var lenB = (b.itemchoices != null ? b.itemchoices.length : 0) + (b.itemrewards != null ? b.itemrewards.length : 0); var titleA = (a.titlereward && g_titles[a.titlereward] ? g_titles[a.titlereward]['name_' + g_locale.name] : ''); var titleB = (b.titlereward && g_titles[b.titlereward] ? g_titles[b.titlereward]['name_' + g_locale.name] : ''); return $WH.strcmp(lenA, lenB) || $WH.strcmp(titleA, titleB); } }, { id: 'experience', name: LANG.exp, value: 'xp' }, { id: 'money', name: LANG.money, compute: function(quest, td) { if (quest.money > 0 || quest.currencyrewards != null) { if (quest.money > 0) { Listview.funcBox.appendMoney(td, quest.money); if (quest.currencyrewards != null) { $WH.ae(td, $WH.ct(' + ')); } } if (quest.currencyrewards != null) { Listview.funcBox.appendMoney(td, null, quest.side, null, quest.currencyrewards); } } }, getVisibleText: function(quest) { var buff = ''; for (var i = 0; quest.currencyrewards && i < quest.currencyrewards.length; ++i) { if (g_gatheredcurrencies[quest.currencyrewards[i][0]]) { buff += ' ' + g_gatheredcurrencies[quest.currencyrewards[i][0]]['name_' + g_locale.name]; } } return buff; }, sortFunc: function(a, b, col) { var lenA = 0, lenB = 0; if (a.currencyrewards && a.currencyrewards.length) { for (i in a.currencyrewards) { var c = (a.currencyrewards)[i]; lenA += c[1]; } } if (b.currencyrewards && b.currencyrewards.length) { for (a in b.currencyrewards) { var c = (b.currencyrewards)[i]; lenB += c[1]; } } return $WH.strcmp(lenA, lenB) || $WH.strcmp(a.money, b.money); } }, { id: 'reputation', name: LANG.reputation, width: '14%', value: 'id', hidden: true }, { id: 'category', name: LANG.category, type: 'text', compute: function(quest, td) { if (quest.category != 0) { td.className = 'small q1'; var a = $WH.ce('a'); a.href = '?quests=' + quest.category2 + '.' + quest.category; $WH.ae(a, $WH.ct(Listview.funcBox.getQuestCategory(quest.category))); $WH.ae(td, a); } }, getVisibleText: function(quest) { return Listview.funcBox.getQuestCategory(quest.category); }, sortFunc: function(a, b, col) { var _ = Listview.funcBox.getQuestCategory; return $WH.strcmp(_(a.category), _(b.category)); } } ], getItemLink: function(quest) { return '?quest=' + quest.id; } }, skill: { sort: [1], searchable: 1, filtrable: 1, columns: [ { id: 'name', name: LANG.name, type: 'text', align: 'left', value: 'name', span: 2, compute: function(skill, td, tr) { var i = $WH.ce('td'); i.style.width = '1px'; i.style.padding = '0'; i.style.borderRight = 'none'; $WH.ae(i, Icon.create(skill.icon, 0, null, this.getItemLink(skill))); $WH.ae(tr, i); td.style.borderLeft = 'none'; var wrapper = $WH.ce('div'); var a = $WH.ce('a'); a.style.fontFamily = 'Verdana, sans-serif'; a.href = this.getItemLink(skill); $WH.ae(a, $WH.ct(skill.name)); if (skill.expansion) { var sp = $WH.ce('span'); sp.className = g_GetExpansionClassName(skill.expansion); $WH.ae(sp, a); $WH.ae(wrapper, sp); } else { $WH.ae(wrapper, a); } $WH.ae(td, wrapper); }, getVisibleText: function(skill) { var buff = skill.name + Listview.funcBox.getExpansionText(skill); return buff; } }, { id: 'category', name: LANG.category, type: 'text', width: '16%', compute: function(skill, td) { if (skill.category != 0) { td.className = 'small q1'; var a = $WH.ce('a'); a.href = '?skills=' + skill.category; $WH.ae(a, $WH.ct(g_skill_categories[skill.category])); $WH.ae(td, a); } }, getVisibleText: function(skill) { return g_skill_categories[skill.category]; }, sortFunc: function(a, b, col) { return $WH.strcmp(g_skill_categories[a.category], g_skill_categories[b.category]); } } ], getItemLink: function(skill) { return '?skill=' + skill.id; } }, spell: { sort: ['name', 'skill', 'level'], searchable: 1, filtrable: 1, columns: [ { id: 'name', name: LANG.name, type: 'text', align: 'left', span: 2, value: 'name', compute: function(spell, td, tr) { var i = $WH.ce('td'), _; i.style.width = '44px'; i.style.padding = '0'; i.style.borderRight = 'none'; if (spell.creates != null) { _ = g_items.createIcon(spell.creates[0], 1, Listview.funcBox.createTextRange(spell.creates[1], spell.creates[2])); } else { _ = g_spells.createIcon(spell.id, 1); } _.style.cssFloat = _.style.styleFloat = 'left'; $WH.ae(i, _); $WH.ae(tr, i); td.style.borderLeft = 'none'; var wrapper = $WH.ce('div'); var a = $WH.ce('a'); var c = spell.name.charAt(0); if (c != '@') { a.className = 'q' + (7 - parseInt(c)); } a.style.fontFamily = 'Verdana, sans-serif'; a.href = this.getItemLink(spell); $WH.ae(a, $WH.ct(spell.name.substring(1))); $WH.ae(wrapper, a); if (spell.rank) { var d = $WH.ce('div'); d.className = 'small2'; $WH.ae(d, $WH.ct(spell.rank)); $WH.ae(wrapper, d); } if (this.showRecipeClass && spell.reqclass) { var d = $WH.ce('div'); d.className = 'small2'; var classes = Listview.funcBox.assocBinFlags(spell.reqclass, g_chr_classes); for (var i = 0, len = classes.length; i < len; ++i) { if (i > 0) { $WH.ae(d, $WH.ct(', ')); } var a = $WH.ce('a'); a.href = '?class=' + classes[i]; a.className = 'c' + classes[i]; $WH.st(a, g_chr_classes[classes[i]]); $WH.ae(d, a); } $WH.ae(wrapper, d); } if (spell.reqrace) { wrapper.style.position = 'relative'; var d = $WH.ce('div'); d.className = 'small'; d.style.fontStyle = 'italic'; d.style.position = 'absolute'; d.style.right = d.style.bottom = '3px'; if ((spell.reqrace & 1791) == 1101) { // Alliance $WH.ae(d, $WH.ct(g_sides[1])); } else if ((spell.reqrace & 1791) == 690) { // Horde $WH.ae(d, $WH.ct(g_sides[2])); } else { var races = Listview.funcBox.assocBinFlags(spell.reqrace, g_chr_races); d.className += ' q1'; for (var i = 0, len = races.length; i < len; ++i) { if (i > 0) { $WH.ae(d, $WH.ct(LANG.comma)) ; } var a = $WH.ce('a'); a.href = '?race=' + races[i]; $WH.st(a, g_chr_races[races[i]]); $WH.ae(d, a); } } $WH.ae(wrapper, d); } $WH.ae(td, wrapper); }, getVisibleText: function(spell) { var buff = spell.name; if (spell.rank) { buff += ' ' + spell.rank; } if (spell.reqclass) { var classes = Listview.funcBox.assocBinFlags(spell.reqclass, g_chr_classes); for (var i = 0, len = classes.length; i < len; ++i) { if (i > 0) { buff += LANG.comma; } buff += g_chr_classes[classes[i]]; } } if (spell.reqrace) { buff += ' ' + Listview.funcBox.arrayText(Listview.funcBox.assocBinFlags(spell.reqrace, g_chr_races), g_chr_races); } return buff; } }, { id: 'tier', name: LANG.tier, width: '10%', value: 'level', compute: function(spell, td) { if (spell.level > 0) { var baseLevel = (!this._petTalents ? 10 : 20), tierPoints = (!this._petTalents ? 5 : 12); return Math.floor((spell.level - baseLevel) / tierPoints) + 1; // + 3 ? } else { return 1; } }, hidden: true }, { id: 'level', name: LANG.level, width: '10%', value: 'level', compute: function(spell, td) { if (spell.level > 0) { return spell.level; } }, hidden: true }, { id: 'trainingcost', name: LANG.cost, width: '10%', hidden: true, getValue: function(row) { if (row.trainingcost) { return row.trainingcost; } }, compute: function(row, td) { if (row.trainingcost) { Listview.funcBox.appendMoney(td, row.trainingcost); } }, sortFunc: function(a, b, col) { if (a.trainingcost == null) { return -1; } else if (b.trainingcost == null) { return 1; } if (a.trainingcost < b.trainingcost) { return -1; } else if (a.trainingcost > b.trainingcost) { return 1; } return 0; } }, { id: 'classes', name: LANG.classes, type: 'text', hidden: true, width: '20%', getVisibleText: function(spell) { var str = ''; if (spell.reqclass) { var classes = Listview.funcBox.assocBinFlags(spell.reqclass, g_chr_classes); for (var i = 0, len = classes.length; i < len; ++i) { if (i > 0) { str += LANG.comma; } str += g_chr_classes[classes[i]]; } } return str; }, compute: function(spell, td) { if (spell.reqclass) { var classes = Listview.funcBox.assocBinFlags(spell.reqclass, g_chr_classes); var d = $WH.ce('div'); d.style.width = (26 * classes.length) + 'px'; d.style.margin = '0 auto'; for (var i = 0, len = classes.length; i < len; ++i) { var icon = Icon.create('class_' + g_file_classes[classes[i]], 0, null, '?class=' + classes[i]); icon.style.cssFloat = icon.style.styleFloat = 'left'; g_addTooltip(icon, g_chr_classes[classes[i]], 'c' + classes[i]); $WH.ae(d, icon); } $WH.ae(td, d); } }, sortFunc: function(a, b, col) { return Listview.funcBox.assocArrCmp(Listview.funcBox.assocBinFlags(a.reqclass, g_chr_classes), Listview.funcBox.assocBinFlags(b.reqclass, g_chr_classes), g_chr_classes); } }, { /* NOTE: To be used only if one single class is to be displayed */ id: 'singleclass', name: LANG.classs, type: 'text', hidden: true, width: '15%', compute: function(spell, td) { if (spell.reqclass) { var classes = Listview.funcBox.assocBinFlags(spell.reqclass, g_chr_classes); var classId = classes[0]; var text = $WH.ce('a'); text.style.backgroundImage = 'url("' + g_staticUrl + '/images/icons/tiny/class_' + g_file_classes[classId] + '.gif")'; text.className = 'icontiny tinyspecial c' + classId; text.href = '?class=' + classId; $WH.ae(text, $WH.ct(g_chr_classes[classId])); $WH.ae(td, text); } }, sortFunc: function(a, b, col) { return Listview.funcBox.assocArrCmp(Listview.funcBox.assocBinFlags(a.reqclass, g_chr_classes), Listview.funcBox.assocBinFlags(b.reqclass, g_chr_classes), g_chr_classes); } }, { id: 'glyphtype', name: LANG.glyphtype, type: 'text', hidden: true, width: '10%', compute: function(spell, td) { if (spell.glyphtype) { return g_item_glyphs[spell.glyphtype]; } } }, { id: 'schools', name: LANG.school, type: 'text', width: '10%', hidden: true, compute: function(spell, td) { var text = ''; var schools = spell.schools ? spell.schools: spell.school; for (var i = 0; i < 32; ++i) { if (!(schools & (1 << i))) { continue; } if (text != '') { text += ', '; } text += g_spell_resistances[i]; } return text; }, sortFunc: function(a, b, col) { return $WH.strcmp(this.compute(a), this.compute(b)); } }, { id: 'type', name: LANG.type, type: 'text', width: '14%', hidden: true, compute: function (spell, td) { var d = $WH.ce('div'); d.className = 'small'; if ($WH.in_array([7, -2, -7, -12, -11, -13], spell.cat) != -1) { var a1 = $WH.ce('a'); a1.className = 'q0'; a1.href = '?spells=' + spell.cat; $WH.ae(a1, $WH.ct(g_spell_categories[spell.cat])); $WH.ae(d, a1); $WH.ae(d, $WH.ce('br')); if (spell.talentspec) { for (var i = 0, len = spell.talentspec.length; i< len; ++i) { if (i > 0) { $WH.ae(d, $WH.ct(LANG.comma)); } var a2 = $WH.ce('a'); a2.className = 'q1'; a2.href = '?spells=' + spell.cat + '.' + (1 + Math.log(spell.reqclass) / Math.LN2) + '.' + spell.talentspec[i]; $WH.ae(a2, $WH.ct(g_chr_specs[spell.talentspec[i]])); $WH.ae(d, a2); } } else if (g_spell_types[spell.cat]) { if (spell.cat == -11 && (spell.type == 1 || spell.type == 2)) { var a2 = $WH.ce('a'); a2.className = 'q1'; // a2.href = '?spells=' + spell.cat + '&filter=cr=22;crs=' + spell.type + ';crv=0'; a2.href = '?spells=' + spell.cat + '.' + (spell.type == 2 ? '8' : '6'); $WH.ae(a2, $WH.ct(g_spell_types[spell.cat][spell.type])); $WH.ae(d, a2); } else { $WH.ae(d, $WH.ct(g_spell_types[spell.cat][spell.type])); } } else if (spell.reqclass) { var a2 = $WH.ce('a'); a2.className = 'q1'; a2.href = '?spells=' + spell.cat + '.' + (1 + Math.log(spell.reqclass) / Math.LN2) + (g_item_glyphs[spell.glyphtype] ? '&filter=gl=' + spell.glyphtype : ''); $WH.ae(a2, $WH.ct((g_item_glyphs[spell.glyphtype] ? g_item_glyphs[spell.glyphtype] + ' ' : '') + g_chr_classes[(1 + Math.log(spell.reqclass) / Math.LN2)])); $WH.ae(d, a2); } } else if (g_spell_categories[spell.cat]) { var a1 = $WH.ce('a'); a1.className = 'q1'; a1.href = '?spells=' + spell.cat; $WH.ae(a1, $WH.ct(g_spell_categories[spell.cat])); $WH.ae(d, a1) } $WH.ae(td, d); }, getVisibleText: function (spell) { var buff = g_spell_categories[spell.cat]; if ($WH.in_array([7, -2, -12, -11, -13], spell.cat) != -1) { if (spell.talentspec) { buff += ' ' + Listview.funcBox.arrayText(spell.talentspec, g_chr_specs); } else if (g_spell_types[spell.cat]) { buff += ' ' + g_spell_types[spell.cat][spell.type]; } else { if (g_item_glyphs[spell.glyphtype]) { buff += ' ' + g_item_glyphs[spell.glyphtype]; } buff += ' ' + g_chr_classes[(1 + Math.log(spell.reqclass) / Math.LN2)]; } } return buff; }, sortFunc: function(a, b, col) { var typeA = (g_spell_types[a.cat] ? g_spell_types[a.cat][a.type] : a.type), typeB = (g_spell_types[b.cat] ? g_spell_types[b.cat][b.type] : a.type); return $WH.strcmp(a.cat, b.cat) || $WH.strcmp(typeA, typeB); } }, { id: 'reagents', name: LANG.reagents, width: '9%', hidden: true, getValue: function(spell) { return (spell.reagents ? spell.reagents.length: 0); }, compute: function(spell, td) { var hasIcons = (spell.reagents != null); if (hasIcons) { td.style.padding = '0'; var d = $WH.ce('div'); var items = spell.reagents; d.style.width = (44 * items.length) + 'px'; d.style.margin = '0 auto'; for (var i = 0, len = items.length; i < len; ++i) { var id = items[i][0]; var num = items[i][1]; var icon = g_items.createIcon(id, 1, num); icon.style.cssFloat = icon.style.styleFloat = 'left'; $WH.ae(d, icon); } $WH.ae(td, d); } }, sortFunc: function(a, b) { var lena = (a.reagents != null ? a.reagents.length: 0); var lenb = (b.reagents != null ? b.reagents.length: 0); if (lena > 0 && lena == lenb) { return $WH.strcmp(a.reagents.toString(), b.reagents.toString()); } else { return $WH.strcmp(lena, lenb); } } }, { id: 'tp', // essentially unused, but if someone wants to backport classic name: LANG.tp, tooltip: LANG.tooltip_trainingpoints, width: '7%', hidden: true, value: 'tp', compute: function (spell, col) { if (spell.tp > 0) { return spell.tp; } } }, { id: 'source', name: LANG.source, type: 'text', width: '12%', hidden: true, compute: function(spell, td) { if (spell.source != null) { var buff = ''; for (var i = 0, len = spell.source.length; i < len; ++i) { if (i > 0) { buff += LANG.comma; } buff += g_sources[spell.source[i]]; } return buff; } }, sortFunc: function(a, b, col) { return Listview.funcBox.assocArrCmp(a.source, b.source, g_sources); } }, { id: 'skill', name: LANG.skill, type: 'text', width: '16%', getValue: function(spell) { return spell.learnedat; }, compute: function(spell, td, tr, colNo) { if (spell.skill != null) { this.skillsColumn = colNo; var div = $WH.ce('div'); div.className = 'small'; if (spell.cat == -7 && spell.pettype != null) { spell.skill = []; var petTalents = { 0: 410, 1: 409, 2: 411 }; for (var i = 0, len = spell.pettype.length; i < len; ++i) { spell.skill.push(petTalents[spell.pettype[i]]); } } for (var i = 0, len = spell.skill.length; i < len; ++i) { if (i > 0) { $WH.ae(div, $WH.ct(LANG.comma)); } if (spell.skill[i] == -1) { $WH.ae(div, $WH.ct(LANG.ellipsis)); } else { if ($WH.in_array([7, -2, -3, -5, -6, -7, 11, 9], spell.cat) != -1) { var a = $WH.ce('a'); a.className = 'q1'; if ($WH.in_array([-5, -6], spell.cat) != -1) { a.href = '?spells=' + spell.cat; } else { a.href = '?spells=' + spell.cat + '.' + ((spell.reqclass && (spell.cat == 7 || spell.cat == -2)) ? (1 + Math.log(spell.reqclass) / Math.LN2) + '.' : '') + spell.skill[i]; } var get = $WH.g_getGets(); var spellCat = (get.spells ? get.spells.split('.') : [false, false]); if (spell.reqclass && (spell.cat == 7 || spell.cat == -2)) { if (i < 1 && ((1 + Math.log(spell.reqclass) / Math.LN2) != spellCat[1])) { var a2 = $WH.ce('a'); a2.className = 'q0'; a2.href = '?spells=' + spell.cat + '.' + (1 + Math.log(spell.reqclass) / Math.LN2); $WH.ae(a2, $WH.ct(g_chr_classes[(1 + Math.log(spell.reqclass) / Math.LN2)])); $WH.ae(div, a2); $WH.ae(div, $WH.ce('br')); } } $WH.ae(a, $WH.ct(spell.cat == -7 && spell.pettype != null ? g_pet_types[spell.pettype[i]] : g_spell_skills[spell.skill[i]])); $WH.ae(div, a); } else { $WH.ae(div, $WH.ct(g_spell_skills[spell.skill[i]])); } } } if (spell.learnedat > 0) { $WH.ae(div, $WH.ct(' (')); var spLearnedAt = $WH.ce('span'); if (spell.learnedat == 9999) { spLearnedAt.className = 'q0'; $WH.ae(spLearnedAt, $WH.ct('??')); } else if (spell.learnedat > 0) { $WH.ae(spLearnedAt, $WH.ct(spell.learnedat)); spLearnedAt.style.fontWeight = 'bold'; } $WH.ae(div, spLearnedAt); $WH.ae(div, $WH.ct(')')); } $WH.ae(td, div); if (spell.colors != null) { this.template.columns[colNo].type = null; var colors = spell.colors, nColors = 0; for (var i = 0; i < colors.length; ++i) { if (colors[i] > 0) { ++nColors; break; } } if (nColors > 0) { nColors = 0; div = $WH.ce('div'); div.className = 'small'; div.style.fontWeight = 'bold'; for (var i = 0; i < colors.length; ++i) { if (colors[i] > 0) { if (nColors++ > 0) { $WH.ae(div, $WH.ct(' ')); } var spColor = $WH.ce('span'); spColor.className = 'r' + (i + 1); $WH.ae(spColor, $WH.ct(colors[i])); $WH.ae(div, spColor); } } $WH.ae(td, div); } } } }, getVisibleText: function(spell) { var buff = Listview.funcBox.arrayText(spell.skill, g_spell_skills); if (spell.learnedat > 0) { buff += ' ' + (spell.learnedat == 9999 ? '??' : spell.learnedat); } return buff; }, sortFunc: function(a, b) { /* sarjuuk: behaves unpredictable if reqrace not set or 0 if (a.reqclass && b.reqclass) { var reqClass = $WH.strcmp(g_chr_classes[(1 + Math.log(a.reqclass) / Math.LN2)], g_chr_classes[(1 + Math.log(b.reqclass) / Math.LN2)]); if (reqClass) { return reqClass; } } */ var skill = [a.learnedat, b.learnedat]; for (var s = 0; s < 2; ++s) { var sp = (s == 0 ? a: b); if (skill[s] == 9999 && sp.colors != null) { var i = 0; while (sp.colors[i] == 0 && i < sp.colors.length) { i++; } if (i < sp.colors.length) { skill[s] = sp.colors[i]; } } } var foo = $WH.strcmp(skill[0], skill[1]); if (foo != 0) { return foo; } if (a.colors != null && b.colors != null) { for (var i = 0; i < 4; ++i) { foo = $WH.strcmp(a.colors[i], b.colors[i]); if (foo != 0) { return foo; } } } if (a.pettype != null & b.pettype != null) { return Listview.funcBox.assocArrCmp(a.pettype, b.pettype, g_pet_types); } return Listview.funcBox.assocArrCmp(a.skill, b.skill, g_spell_skills); } }, /* sarjuuk todo: localize he next three cols */ { id: 'stackRules', name: 'Behaviour', type: 'text', width: '20%', hidden: true, compute: function(spell, td) { if (!spell.stackRule) { return; } var buff = '', buff2 = ''; switch (spell.stackRule) { case 3: buff2 = '(strongest effect is applied)'; case 0: buff = 'coexist'; // without condition break; case 2: buff2 = '(from same caster)'; case 1: buff = 'exclusive'; // without condition break; } td.className = 'small'; td.style.lineHeight = '18px'; var span = $WH.ce('span'); span.className = !spell.stackRule || spell.stackRule == 3 ? 'q2' : 'q10'; $WH.ae(span, $WH.ct(buff)); $WH.ae(td, span); if (buff2) { var sp2 = $WH.ce('span'); sp2.style.whiteSpace = 'nowrap'; sp2.className = 'q0'; $WH.ae(td, $WH.ce('br')); $WH.st(sp2, buff2); $WH.ae(td, sp2); } }, getVisibleText: function (spell) { if (!spell.stackRule) { return; } var buff = ''; switch (spell.stackRule) { case 3: buff += '(strongest effect is applied)'; case 0: buff += ' coexist'; break; case 2: buff += '(from same caster)'; case 1: buff += ' exclusive'; break; } return buff; }, sortFunc: function(a, b, col) { return $WH.strcmp(a.stackRule, b.stackRule); } }, { id: 'linkedTrigger', name: 'Triggers', type: 'text', width: '50%', hidden: true, compute: function(spell, td) { if (!spell.linked) { return; } var trigger = spell.linked[0], buff = ''; switch (spell.linked[2]) { case 0: buff = trigger > 0 ? 'When Spell is casted' : 'When Aura is removed'; break; case 1: buff = 'When Spell hits the target(s)'; break; case 2: buff = 'When Aura is applied and removed'; break; } td.className = 'small'; td.style.lineHeight = '18px'; var a = $WH.ce('a'); a.style.whiteSpace = 'nowrap'; a.href = '?spell=' + Math.abs(trigger); if (g_pageInfo.typeId == Math.abs(trigger)) { // ponts to self a.className = 'q1'; $WH.st(a, 'This'); } else { var item = g_spells[Math.abs(trigger)]; a.className = 'icontiny tinyspecial'; a.style.backgroundImage = 'url(' + g_staticUrl + '/images/icons/tiny/' + item['icon'] + '.gif)'; $WH.st(a, item['name_' + g_locale.name]); } $WH.ae(td, a); var span = $WH.ce('span'); span.className = 'q0'; $WH.st(span, buff); $WH.ae(td, $WH.ce('br')); $WH.ae(td, span); }, getVisibleText: function (spell) { if (!spell.linked) { return; } var trigger = spell.linked[0], buff = ''; if (g_pageInfo.typeId == Math.abs(trigger)) { buff += 'This'; } else { buff += g_spells[Math.abs(trigger)]['name_' + g_locale.name]; } switch (spell.linked[2]) { case 0: buff += trigger > 0 ? ' When Spell is casted' : ' When Aura is removed'; break; case 1: buff += ' When Spell hits the target(s)'; break; case 2: buff += ' When Aura is applied and removed'; break; } return buff; }, sortFunc: function(a, b, col) { var trA = a.linked[0], trB = b.linked[0]; if (trA > 0 && trB < 0) { return -1; } else if (trA < 0 && trB > 0) { return 1; } if (g_pageInfo.typeId == Math.abs(trA)) { return 1; } else if (g_pageInfo.typeId == Math.abs(trB)) { return -1; } else if (trA != trB) { return $WH.strcmp(g_spells[Math.abs(trA)]['name_' + g_locale.name], g_spells[Math.abs(trB)]['name_' + g_locale.name]); } return 0; } }, { id: 'linkedEffect', name: 'Effects', type: 'text', width: '50%', hidden: true, compute: function(spell, td) { if (!spell.linked) { return; } var effect = spell.linked[1], buff = ''; switch (spell.linked[2]) { case 0: case 1: buff = effect > 0 ? 'Spell is triggered' : 'Spells Auras are removed'; break; case 2: buff = effect > 0 ? 'Spells Auras are applied or removed' : 'Immunity against Spell is applied or cleared '; break; } td.className = 'small'; td.style.lineHeight = '18px'; var a = $WH.ce('a'); a.style.whiteSpace = 'nowrap'; a.href = '?spell=' + Math.abs(effect); if (g_pageInfo.typeId == Math.abs(effect)) { // ponts to self a.className = 'q1'; $WH.st(a, 'This'); } else { var item = g_spells[Math.abs(effect)]; a.className = 'icontiny tinyspecial'; a.style.backgroundImage = 'url(' + g_staticUrl + '/images/icons/tiny/' + item['icon'] + '.gif)'; $WH.st(a, item['name_' + g_locale.name]); } $WH.ae(td, a); var span = $WH.ce('span'); span.className = 'q0'; $WH.st(span, buff); $WH.ae(td, $WH.ce('br')); $WH.ae(td, span); }, getVisibleText: function (spell) { if (!spell.linked) { return; } var effect = spell.linked[1], buff = ''; if (g_pageInfo.typeId == Math.abs(effect)) { buff += 'This'; } else { buff += g_spells[Math.abs(effect)]['name_' + g_locale.name]; } switch (spell.linked[2]) { case 0: case 1: buff += effect > 0 ? ' Spell is triggered' : ' Spells Auras are removed'; break; case 2: buff += effect > 0 ? ' Spells Auras are applied or removed' : ' Immunity against Spell is applied or cleared '; break; } return buff; }, sortFunc: function(a, b, col) { var effA = a.linked[1], effB = b.linked[1]; if (effA > 0 && effB < 0) { return -1; } else if (effA < 0 && effB > 0) { return 1; } if (g_pageInfo.typeId == Math.abs(effA)) { return 1; } else if (g_pageInfo.typeId == Math.abs(effB)) { return -1; } else if (effA != effB) { return $WH.strcmp(g_spells[Math.abs(effA)]['name_' + g_locale.name], g_spells[Math.abs(effB)]['name_' + g_locale.name]); } return 0; } } ], getItemLink: function(spell) { return '?spell=' + spell.id; } }, zone: { sort: [1], nItemsPerPage: -1, searchable: 1, filtrable: 1, columns: [ { id: 'name', name: LANG.name, type: 'text', align: 'left', value: 'name', compute: function(zone, td) { var a = $WH.ce('a'); a.style.fontFamily = 'Verdana, sans-serif'; a.href = this.getItemLink(zone); $WH.ae(a, $WH.ct(zone.name)); if (zone.expansion) { var sp = $WH.ce('span'); sp.className = g_GetExpansionClassName(zone.expansion); $WH.ae(sp, a); $WH.ae(td, sp); } else { $WH.ae(td, a); } }, getVisibleText: function(zone) { var buff = zone.name + Listview.funcBox.getExpansionText(zone); if (zone.instance == 5 || zone.instance == 8) { buff += ' heroic'; } return buff; } }, { id: 'level', name: LANG.level, type: 'range', width: '10%', getMinValue: function(zone) { return zone.minlevel; }, getMaxValue: function(zone) { return zone.maxlevel; }, compute: function(zone, td) { if (zone.minlevel > 0 && zone.maxlevel > 0) { if (zone.minlevel != zone.maxlevel) { return zone.minlevel + LANG.hyphen + zone.maxlevel; } else { return zone.minlevel; } } }, sortFunc: function(a, b, col) { if (col > 0) { return $WH.strcmp(a.minlevel, b.minlevel) || $WH.strcmp(a.maxlevel, b.maxlevel); } else { return $WH.strcmp(a.maxlevel, b.maxlevel) || $WH.strcmp(a.minlevel, b.minlevel); } } }, { id: 'players', name: LANG.players, type: 'text', hidden: true, compute: function(zone, td) { if (zone.instance > 0) { var sp = $WH.ce('span'); if (zone.nplayers == -2) { zone.nplayers = '10/25'; } var buff = ''; if (zone.nplayers) { if (zone.instance == 4) { buff += $WH.sprintf(LANG.lvzone_xvx, zone.nplayers, zone.nplayers); } else { buff += $WH.sprintf(LANG.lvzone_xman, zone.nplayers); } } $WH.ae(sp, $WH.ct(buff)); $WH.ae(td, sp); } }, getVisibleText: function(zone) { if (zone.instance > 0) { if (zone.nplayers == -2) { zone.nplayers = '10/25'; } var buff = ''; if (zone.nplayers && ((zone.instance != 2 && zone.instance != 5) || zone.nplayers > 5)) { if (zone.instance == 4) { buff += $WH.sprintf(LANG.lvzone_xvx, zone.nplayers, zone.nplayers); } else { buff += $WH.sprintf(LANG.lvzone_xman, zone.nplayers); } } return buff; } }, sortFunc: function(a, b, col) { return $WH.strcmp(a.nplayers, b.nplayers); } }, { id: 'territory', name: LANG.territory, type: 'text', width: '13%', compute: function(zone, td) { var sp = $WH.ce('span'); switch (zone.territory) { case 0: sp.className = 'alliance-icon'; break; case 1: sp.className = 'horde-icon'; break; case 4: sp.className = 'ffapvp-icon'; break; } $WH.ae(sp, $WH.ct(g_zone_territories[zone.territory])); $WH.ae(td, sp); }, getVisibleText: function(zone) { return g_zone_territories[zone.territory]; }, sortFunc: function(a, b, col) { return $WH.strcmp(g_zone_territories[a.territory], g_zone_territories[b.territory]); } }, { id: 'instancetype', name: LANG.instancetype, type: 'text', compute: function(zone, td) { if (zone.instance > 0) { var sp = $WH.ce('span'); if ((zone.instance >= 1 && zone.instance <= 5) || zone.instance == 7 || zone.instance == 8) { sp.className = 'instance-icon' + zone.instance; } var buff = g_zone_instancetypes[zone.instance]; if (zone.heroicLevel) { var skull = $WH.ce('span'); skull.className = 'heroic-icon'; g_addTooltip(skull, LANG.tooltip_heroicmodeavailable + LANG.qty.replace('$1', zone.heroicLevel)); $WH.ae(td, skull); } $WH.ae(sp, $WH.ct(buff)); $WH.ae(td, sp); } }, getVisibleText: function(zone) { if (zone.instance > 0) { var buff = g_zone_instancetypes[zone.instance]; if (zone.nplayers && ((zone.instance != 2 && zone.instance != 5) || zone.nplayers > 5)) { if (zone.instance == 4) { buff += ' ' + $WH.sprintf(LANG.lvzone_xvx, zone.nplayers, zone.nplayers); } else { buff += ' ' + $WH.sprintf(LANG.lvzone_xman, zone.nplayers); } } if (zone.instance == 5 || zone.instance == 8) { buff += ' heroic'; } return buff; } }, sortFunc: function(a, b, col) { return $WH.strcmp(g_zone_instancetypes[a.instance], g_zone_instancetypes[b.instance]) || $WH.strcmp(a.instance, b.instance) || $WH.strcmp(a.nplayers, b.nplayers); } }, { id: 'category', name: LANG.category, type: 'text', width: '15%', compute: function(zone, td) { td.className = 'small q1'; var a = $WH.ce('a'); a.href = '?zones=' + zone.category; $WH.ae(a, $WH.ct(g_zone_categories[zone.category])); $WH.ae(td, a); }, getVisibleText: function(zone) { return g_zone_categories[zone.category]; }, sortFunc: function(a, b, col) { return $WH.strcmp(g_zone_categories[a.category], g_zone_categories[b.category]); } } ], getItemLink: function(zone) { return '?zone=' + zone.id; } }, holiday: { sort: [2, 1], nItemsPerPage: -1, searchable: 1, filtrable: 1, columns: [ { id: 'name', name: LANG.name, type: 'text', align: 'left', value: 'name', span: 2, compute: function(holiday, td, tr) { var i = $WH.ce('td'); i.style.width = '1px'; i.style.padding = '0'; i.style.borderRight = 'none'; $WH.ae(i, g_holidays.createIcon(holiday.id, 0)); $WH.ae(tr, i); td.style.borderLeft = 'none'; var a = $WH.ce('a'); a.style.fontFamily = 'Verdana, sans-serif'; a.href = this.getItemLink(holiday); $WH.ae(a, $WH.ct(holiday.name)); $WH.ae(td, a); }, getVisibleText: function(holiday) { return holiday.name; } }, { id: 'date', name: LANG.date, type: 'text', width: '16%', allText: true, compute: function(holiday, td, tr) { if (holiday.startDate && holiday.endDate) { var dates = Listview.funcBox.getEventNextDates(holiday.startDate, holiday.endDate, holiday.rec || 0); if (dates[0] && dates[1]) { var start = g_formatDateSimple(dates[0]), end = g_formatDateSimple(dates[1]), sp = $WH.ce('span'); if (start != end) { $WH.st(sp, start + LANG.hyphen + end); } else { $WH.st(sp, start); } $WH.ae(td, sp); if (dates[0] <= g_serverTime && dates[1] >= g_serverTime) { tr.className = 'checked'; sp.className = 'q2 tip'; g_addTooltip(sp, LANG.tooltip_activeholiday, 'q'); } } } }, getVisibleText: function(holiday) { if (holiday.startDate && holiday.endDate) { var dates = Listview.funcBox.getEventNextDates(holiday.startDate, holiday.endDate, holiday.rec || 0); if (dates[0] && dates[1]) { var start = g_formatDateSimple(dates[0]), end = g_formatDateSimple(dates[1]); if (start != end) { return start + LANG.hyphen + end; } else { return start; } } } return''; }, sortFunc: function(a, b, col) { if (a.startDate && b.startDate) { var datesA = Listview.funcBox.getEventNextDates(a.startDate, a.endDate, a.rec || 0); var datesB = Listview.funcBox.getEventNextDates(b.startDate, b.endDate, b.rec || 0); if (datesA[0] && datesB[0]) { return datesA[0] - datesB[0]; } } else if (a.startDate) { return -1; } else if (b.startDate) { return 1; } return 0; } }, { id: 'category', name: LANG.category, type: 'text', width: '16%', compute: function(holiday, td) { td.className = 'small q1'; var a = $WH.ce('a'), href = '?events=' + holiday.category; a.href = href; $WH.ae(a, $WH.ct(g_holiday_categories[holiday.category])); $WH.ae(td, a); }, getVisibleText: function(holiday) { return g_holiday_categories[holiday.category]; }, sortFunc: function(a, b, col) { return $WH.strcmp(g_holiday_categories[a.category], g_holiday_categories[b.category]); } } ], getItemLink: function(holiday) { return '?event=' + holiday.id; } }, holidaycal: { sort: [1], mode: 4, // Calendar startOnMonth: new Date(g_serverTime.getFullYear(), 0, 1), nMonthsToDisplay: 12, rowOffset: g_serverTime.getMonth(), poundable: 2, // Yes but w/o sort columns: [], compute: function(holiday, div, i) { if (!holiday.events || !holiday.events.length) { return; } for (var i = 0; i < holiday.events.length; ++i) { var icon = g_holidays.createIcon(holiday.events[i].id, 1); icon.onmouseover = Listview.funcBox.dateEventOver.bind(icon, holiday.date, holiday.events[i]); icon.onmousemove = $WH.Tooltip.cursorUpdate; icon.onmouseout = $WH.Tooltip.hide; icon.style.cssFloat = icon.style.styleFloat = 'left'; $WH.ae(div, icon); } }, sortFunc: function(a, b) { if (a.startDate && b.startDate) { var datesA = Listview.funcBox.getEventNextDates(a.startDate, a.endDate, a.rec || 0); var datesB = Listview.funcBox.getEventNextDates(b.startDate, b.endDate, b.rec || 0); for (var i = 0; i < 2; ++i) { var dA = datesA[i], dB = datesB[i]; if (dA.getFullYear() == dB.getFullYear() && dA.getMonth() == dB.getMonth() && dA.getDate() == dB.getDate()) { return dA - dB; } } } return $WH.strcmp(a.name, b.name); } }, comment: { // todo: reformat sort: [1], mode: 2, nItemsPerPage: 40, poundable: 2, columns: [{ value: "number" }, { value: "id" }, { value: "rating" }], compute: function(J, ac, ab) { var ag, I = new Date(J.date), Y = (g_serverTime - I) / 1000, h = (g_user.roles & U_GROUP_COMMENTS_MODERATOR) != 0, ad = J.rating < 0 || J.purged || J.deleted || (J.__minPatch && g_getPatchVersion.T[J.__minPatch] > I), U = h || (J.user.toLowerCase() == g_user.name.toLowerCase() && !g_user.commentban), L = U && J.deleted == 0, d = U && J.replyTo != J.id, af = true, W = J.purged == 0 && J.deleted == 0 && g_user.id && J.user.toLowerCase() != g_user.name.toLowerCase() && $WH.in_array(J.raters, g_user.id, function(i) { return i[0] }) == -1 && !g_user.ratingban, p = J.rating >= 0 && (g_user.id == 0 || W || g_user.ratingban), G = g_users[J.user]; J.ratable = W; var aa = ac; var N = $WH.ce("div"); var z = $WH.ce("div"); var t = $WH.ce("em"); J.divHeader = N; J.divBody = z; J.divLinks = t; aa.className = "comment-wrapper"; if (J.indent) { aa.className += " comment-indent" } if (ad) { aa.className += " comment-collapsed" } ac = $WH.ce("div"); ac.className = "comment comment" + (ab % 2); $WH.ae(aa, ac); N.className = "comment-header"; $WH.ae(ac, N); var n = $WH.ce("em"); n.className = "comment-rating"; if (ad) { var D = $WH.ce("a"); D.href = "javascript:;"; D.onclick = Listview.funcBox.coToggleVis.bind(D, J); $WH.ae(D, $WH.ct(LANG.lvcomment_show)); $WH.ae(n, D); $WH.ae(n, $WH.ct(" " + String.fromCharCode(160) + " ")) } var A = $WH.ce("b"); var v = $WH.ce("a"); v.href = "javascript:;"; $WH.ae(v, $WH.ct(LANG.lvcomment_rating)); var E = $WH.ce("span"); E.id = "commentrating" + J.id; Listview.funcBox.coDisplayRating(J, E); v.onclick = Listview.funcBox.coToggleRating.bind(this, J, E); $WH.ae(v, E); $WH.ae(A, v); $WH.ae(n, A); $WH.ae(n, $WH.ct(" ")); var S = $WH.ce("span"); var q = $WH.ce("a"), af = $WH.ce("a"); if (W) { q.href = af.href = "javascript:;"; q.onclick = Listview.funcBox.coRate.bind(q, J, 1); af.onclick = Listview.funcBox.coRate.bind(af, J, -1); if (h) { var R = $WH.ce("a"); R.href = "javascript:;"; R.onclick = Listview.funcBox.coRate.bind(R, J, 0); R.onmouseover = Listview.funcBox.coCustomRatingOver; R.onmousemove = $WH.Tooltip.cursorUpdate; R.onmouseout = $WH.Tooltip.hide; $WH.ae(R, $WH.ct("[~]")) $WH.ae(S, R); $WH.ae(S, $WH.ct(" ")) } } else { if (g_user.ratingban) { q.href = af.href = "javascript:;" } else { q.href = af.href = "?account=signin" } } $WH.ae(q, $WH.ct("[+]")) if (!g_user.ratingban) { q.onmouseover = Listview.funcBox.coPlusRatingOver; af.onmouseover = Listview.funcBox.coMinusRatingOver; q.onmousemove = af.onmousemove = $WH.Tooltip.cursorUpdate; q.onmouseout = af.onmouseout = $WH.Tooltip.hide } else { g_addTooltip(q, LANG.tooltip_banned_rating, "q"); g_addTooltip(af, LANG.tooltip_banned_rating, "q") } $WH.ae(af, $WH.ct("[-]")) $WH.ae(S, af); $WH.ae(S, $WH.ct(" ")); $WH.ae(S, q); $WH.ae(n, S); if (!p) { S.style.display = "none" } $WH.ae(N, n); t.className = "comment-links"; var c = false; if (U) { var b = $WH.ce("span"); var Q = $WH.ce("a"); $WH.ae(Q, $WH.ct(LANG.lvcomment_edit)); Q.onclick = Listview.funcBox.coEdit.bind(this, J, 0, false); $WH.ns(Q); Q.href = "javascript:;"; $WH.ae(b, Q); c = true; $WH.ae(t, b) } if (L) { var u = $WH.ce("span"); var F = $WH.ce("a"); $WH.ae(F, $WH.ct(LANG.lvcomment_delete)); F.onclick = Listview.funcBox.coDelete.bind(this, J); $WH.ns(F); F.href = "javascript:;"; if (c) { var e = $WH.ce("span"); e.style.color = "white"; $WH.ae(e, $WH.ct("|")); $WH.ae(t, e) } $WH.ae(u, F); $WH.ae(t, u) c = true; } if (d) { var P = $WH.ce("span"); var k = $WH.ce("a"); $WH.ae(k, $WH.ct(LANG.lvcomment_detach)); k.onclick = Listview.funcBox.coDetach.bind(this, J); $WH.ns(k); k.href = "javascript:;"; if (c) { var e = $WH.ce("span"); e.style.color = "white"; $WH.ae(e, $WH.ct("|")); $WH.ae(t, e) } $WH.ae(P, k); $WH.ae(t, P) c = true; } if (af) { var K = $WH.ce("span"); var m = $WH.ce("a"); $WH.ae(m, $WH.ct(LANG.lvcomment_report)); m.onclick = ContactTool.show.bind(ContactTool, { mode: 1, comment: J }); m.className = "report-icon"; m.href = "javascript:;"; g_addTooltip(m, LANG.report_tooltip, "q2"); if (c) { var e = $WH.ce("span"); e.style.color = "white"; $WH.ae(e, $WH.ct("|")); $WH.ae(t, e) } $WH.ae(K, m); $WH.ae(t, K) c = true; } if (!g_user.commentban) { var l = $WH.ce("span"); var o = $WH.ce("a"); $WH.ae(o, $WH.ct(LANG.lvcomment_reply)); if (g_user.id > 0) { o.onclick = Listview.funcBox.coReply.bind(this, J); o.href = "javascript:;" } else { o.href = "?account=signin" } if (c) { var e = $WH.ce("span"); e.style.color = "white"; $WH.ae(e, $WH.ct("|")); $WH.ae(t, e) } $WH.ae(l, o); $WH.ae(t, l) c = true; } if (ad) { z.style.display = "none"; t.style.display = "none" } $WH.ae(N, t); var C = $WH.ce("var"); $WH.ae(C, $WH.ct(LANG.lvcomment_by)); aUser = $WH.ce("a"); aUser.href = "?user=" + J.user; $WH.ae(aUser, $WH.ct(J.user)); $WH.ae(C, aUser); $WH.ae(C, $WH.ct(" ")); var a = $WH.ce("a"); a.className = "q0"; a.id = "comments:id=" + J.id; a.href = "#" + a.id; g_formatDate(a, Y, I); $WH.ae(C, a); $WH.ae(C, $WH.ct($WH.sprintf(LANG.lvcomment_patch, g_getPatchVersion(I)))); if (G != null && G.avatar) { var j = Icon.createUser(G.avatar, G.avatarmore, 0, null, ((G.roles & U_GROUP_PREMIUM) ? (G.border ? 2 : 1) : 0)); j.style.marginRight = "3px"; j.style.cssFloat = j.style.styleFloat = "left"; $WH.ae(N, j); C.style.lineHeight = "26px" } $WH.ae(N, C); z.className = "text comment-body" + Listview.funcBox.coGetColor(J); if (J.indent) { z.className += " comment-body-indent" } B = (this.id == "english-comments" ? "www": ""); z.innerHTML = Markup.toHtml(J.body, { mode: Markup.MODE_COMMENT, roles: J.roles, locale: B }); $WH.ae(ac, z); var H = $WH.ce("div"); H.className = "text comment-body"; if (J.indent) { H.className += " comment-body-indent" } if (J.response) { H.innerHTML = Markup.toHtml("[div][/div][wowheadresponse=" + J.responseuser + " roles=" + J.responseroles + "]" + J.response + "[/wowheadresponse]", { allow: Markup.CLASS_STAFF, roles: J.responseroles, uid: "resp-" + J.id }) } $WH.ae(ac, H); J.divResponse = H; if ((J.roles & U_GROUP_COMMENTS_MODERATOR) == 0 || g_user.roles & U_GROUP_COMMENTS_MODERATOR) { var X = $WH.ce("div"); J.divLastEdit = X; X.className = "comment-lastedit"; $WH.ae(X, $WH.ct(LANG.lvcomment_lastedit)); var w = $WH.ce("a"); $WH.ae(w, $WH.ct(" ")); $WH.ae(X, w); $WH.ae(X, $WH.ct(" ")); var O = $WH.ce("span"); $WH.ae(X, O); $WH.ae(X, $WH.ct(" ")); Listview.funcBox.coUpdateLastEdit(J); if (ad) { X.style.display = "none" } $WH.ae(ac, X) } }, /* no idea what the new one does exactly.. so saved this old compute compute: function(v, K) { var O, u = new Date(v.date), I = (g_serverTime - u) / 1000, d = (g_user.roles & 26) != 0, L = v.rating < 0 || v.purged || v.deleted || (v.__minPatch && g_getPatchVersion.T[v.__minPatch] > u), F = d || v.user.toLowerCase() == g_user.name.toLowerCase(), y = F && v.deleted == 0, c = F && v.replyTo != v.id, M = ((v.roles & 26) == 0), G = v.purged == 0 && v.deleted == 0 && g_user.id && v.user.toLowerCase() != g_user.name.toLowerCase() && $WH.in_array(v.raters, g_user.id, function(P) { return P[0] }) == -1, i = v.rating >= 0 && (g_user.id == 0 || G); v.ratable = G; K.className = "comment"; if (v.indent) { K.className += " comment-indent" } var z = $WH.ce("div"); var m = $WH.ce("div"); var k = $WH.ce("div"); v.divHeader = z; v.divBody = m; v.divLinks = k; z.className = (L ? "comment-header-bt": "comment-header"); var g = $WH.ce("div"); g.className = "comment-rating"; if (L) { var q = $WH.ce("a"); q.href = "javascript:;"; q.onclick = Listview.funcBox.coToggleVis.bind(q, v); $WH.ae(q, $WH.ct(LANG.lvcomment_show)); $WH.ae(g, q); $WH.ae(g, $WH.ct(" " + String.fromCharCode(160) + " ")) } var o = $WH.ce("b"); $WH.ae(o, $WH.ct(LANG.lvcomment_rating)); var r = $WH.ce("span"); $WH.ae(r, $WH.ct((v.rating > 0 ? "+": "") + v.rating)); $WH.ae(o, r); $WH.ae(g, o); $WH.ae(g, $WH.ct(" ")); var E = $WH.ce("span"); var j = $WH.ce("a"), N = $WH.ce("a"); if (G) { j.href = N.href = "javascript:;"; j.onclick = Listview.funcBox.coRate.bind(j, v, 1); N.onclick = Listview.funcBox.coRate.bind(N, v, -1); if (d) { var D = $WH.ce("a"); D.href = "javascript:;"; D.onclick = Listview.funcBox.coRate.bind(D, v, 0); D.onmouseover = Listview.funcBox.coCustomRatingOver; D.onmousemove = $WH.Tooltip.cursorUpdate; D.onmouseout = $WH.Tooltip.hide; $WH.ae(D, $WH.ct("[~]")); $WH.ae(E, D); $WH.ae(E, $WH.ct(" ")) } } else { j.href = N.href = "?account=signin" } $WH.ae(j, $WH.ct("[+]")); j.onmouseover = Listview.funcBox.coPlusRatingOver; N.onmouseover = Listview.funcBox.coMinusRatingOver; j.onmousemove = N.onmousemove = $WH.Tooltip.cursorUpdate; j.onmouseout = N.onmouseout = $WH.Tooltip.hide; $WH.ae(N, $WH.ct("[-]")); $WH.ae(E, N); $WH.ae(E, $WH.ct(" ")); $WH.ae(E, j); $WH.ae(g, E); if (!i) { E.style.display = "none" } $WH.ae(z, g); $WH.ae(z, $WH.ct(LANG.lvcomment_by)); var J = $WH.ce("a"); J.href = "?user=" + v.user; $WH.ae(J, $WH.ct(v.user)); $WH.ae(z, J); $WH.ae(z, $WH.ct(" ")); var a = $WH.ce("a"); a.className = "q0"; a.id = "comments:id=" + v.id; a.href = "#" + a.id; Listview.funcBox.coFormatDate(a, I, u); a.style.cursor = "pointer"; $WH.ae(z, a); $WH.ae(z, $WH.ct($WH.sprintf(LANG.lvcomment_patch, g_getPatchVersion(u)))); $WH.ae(K, z); m.className = "comment-body" + Listview.funcBox.coGetColor(v); if (v.indent) { m.className += " comment-body-indent" } m.innerHTML = Markup.toHtml(v.body, { mode: Markup.MODE_COMMENT, roles: v.roles }); $WH.ae(K, m); if ((v.roles & 26) == 0 || g_user.roles & 26) { var H = $WH.ce("div"); v.divLastEdit = H; H.className = "comment-lastedit"; $WH.ae(H, $WH.ct(LANG.lvcomment_lastedit)); var p = $WH.ce("a"); $WH.ae(p, $WH.ct(" ")); $WH.ae(H, p); $WH.ae(H, $WH.ct(" ")); var C = $WH.ce("span"); $WH.ae(H, C); $WH.ae(H, $WH.ct(" ")); Listview.funcBox.coUpdateLastEdit(v); if (L) { H.style.display = "none" } $WH.ae(K, H) } k.className = "comment-links"; if (F) { var b = $WH.ce("span"); var B = $WH.ce("a"); $WH.ae(B, $WH.ct(LANG.lvcomment_edit)); B.onclick = Listview.funcBox.coEdit.bind(this, v, 0); $WH.ns(B); B.href = "javascript:;"; $WH.ae(b, B); $WH.ae(b, $WH.ct("|")); $WH.ae(k, b) } if (y) { var l = $WH.ce("span"); var t = $WH.ce("a"); $WH.ae(t, $WH.ct(LANG.lvcomment_delete)); t.onclick = Listview.funcBox.coDelete.bind(this, v); $WH.ns(t); t.href = "javascript:;"; $WH.ae(l, t); $WH.ae(l, $WH.ct("|")); $WH.ae(k, l) } if (c) { var A = $WH.ce("span"); var e = $WH.ce("a"); $WH.ae(e, $WH.ct(LANG.lvcomment_detach)); e.onclick = Listview.funcBox.coDetach.bind(this, v); $WH.ns(e); e.href = "javascript:;"; $WH.ae(A, e); $WH.ae(A, $WH.ct("|")); $WH.ae(k, A) } if (M) { var w = $WH.ce("span"); var f = $WH.ce("a"); $WH.ae(f, $WH.ct(LANG.lvcomment_report)); if (g_user.id > 0) { f.onclick = Listview.funcBox.coReportClick.bind(f, v, 0); f.href = "javascript:;" } else { f.href = "?account=signin" } $WH.ae(w, f); $WH.ae(w, $WH.ct("|")); $WH.ae(k, w) } var h = $WH.ce("a"); $WH.ae(h, $WH.ct(LANG.lvcomment_reply)); if (g_user.id > 0) { h.onclick = Listview.funcBox.coReply.bind(this, v); h.href = "javascript:;" } else { h.href = "?account=signin" } $WH.ae(k, h); if (L) { m.style.display = "none"; k.style.display = "none" } $WH.ae(K, k) }, */ createNote: function(b) { var g = $WH.ce("small"); if (!g_user.commentban) { var l = $WH.ce("a"); if (g_user.id > 0) { l.href = "javascript:;"; l.onclick = co_addYourComment } else { l.href = "?account=signin" } $WH.ae(l, $WH.ct(LANG.lvcomment_add)); $WH.ae(g, l); var e = $WH.ce("span"); e.style.padding = "0 5px"; e.style.color = "white"; $WH.ae(e, $WH.ct("|")); $WH.ae(g, e); } $WH.ae(g, $WH.ct(LANG.lvcomment_sort)); var m = $WH.ce("a"); m.href = "javascript:;"; $WH.ae(m, $WH.ct(LANG.lvcomment_sortdate)); m.onclick = Listview.funcBox.coSortDate.bind(this, m); $WH.ae(g, m); $WH.ae(g, $WH.ct(LANG.comma)); var o = $WH.ce("a"); o.href = "javascript:;"; $WH.ae(o, $WH.ct(LANG.lvcomment_sortrating)); o.onclick = Listview.funcBox.coSortHighestRatedFirst.bind(this, o); $WH.ae(g, o); var h = $WH.gc("temp_comment_sort") || 1; if (h == "2") { o.onclick() } else { m.onclick() } var e = $WH.ce("span"); e.style.padding = "0 5px"; e.style.color = "white"; $WH.ae(e, $WH.ct("|")); $WH.ae(g, e); var q = $WH.ce("select"); var f = $WH.ce("option"); f.value = 0; f.selected = "selected"; $WH.ae(q, f); var k = {}; for (var i = 0; i < this.data.length; ++i) { var h = new Date(this.data[i].date).getTime(); k[g_getPatchVersionIndex(h)] = true } var j = []; for (var c in k) { j.push(c) } j.sort(function(p, d) { return d - p }); for (var c = 0; c < j.length; ++c) { var f = $WH.ce("option"); f.value = j[c]; $WH.ae(f, $WH.ct(g_getPatchVersion.V[j[c]])); $WH.ae(q, f) } q.onchange = Listview.funcBox.coFilterByPatchVersion.bind(this, q); $WH.ae(g, $WH.ct(LANG.lvcomment_patchfilter)); $WH.ae(g, q); $WH.ae(b, g); }, onNoData: function(c) { var a = "" + LANG.lvnodata_co1 + '
'; if (g_user.id > 0) { var b = LANG.lvnodata_co2; b = b.replace("", ''); a += b } else { var b = LANG.lvnodata_co3; b = b.replace("", ''); b = b.replace("", ''); a += b } c.style.padding = "1.5em 0"; c.innerHTML = a }, onBeforeCreate: function() { if (location.hash && location.hash.match(/:id=([0-9]+)/) != null) { var a = $WH.in_array(this.data, parseInt(RegExp.$1), function(b) { return b.id }); this.rowOffset = this.getRowOffset(a); return this.data[a] } }, onAfterCreate: function(a) { if (a != null) { var b = a.__div; this.tabs.__st = b; b.firstChild.style.border = "1px solid #505050" } } }, commentpreview: { sort: [4], nItemsPerPage: 75, columns: [ { id: 'subject', name: LANG.subject, align: 'left', value: 'subject', compute: function(comment, td) { var a = $WH.ce('a'); a.style.fontFamily = 'Verdana, sans-serif'; a.href = this.getItemLink(comment); $WH.ae(a, $WH.ct(comment.subject)); $WH.ae(td, a); if (LANG.types[comment.type]) { var d = $WH.ce('div'); d.className = 'small'; $WH.ae(d, $WH.ct(LANG.types[comment.type][0])); $WH.ae(td, d); } } }, { id: 'preview', name: LANG.preview, align: 'left', width: '50%', value: 'preview', compute: function(comment, td, tr) { var d = $WH.ce('div'); d.className = 'crop'; if (comment.rating >= 10) { d.className += ' comment-green'; } $WH.ae(d, $WH.ct( Markup.removeTags(comment.preview, {mode: Markup.MODE_ARTICLE}) )); $WH.ae(td, d); if (comment.rating || comment.deleted) { d = $WH.ce('div'); d.className = 'small3'; if (comment.rating) { $WH.ae(d, $WH.ct(LANG.lvcomment_rating + (comment.rating > 0 ? '+': '') + comment.rating)); } var s = $WH.ce('span'), foo = ''; s.className = 'q10'; if (comment.deleted) { foo = LANG.lvcomment_deleted; } $WH.ae(s, $WH.ct(foo)); $WH.ae(d, s); tr.__status = s; $WH.ae(td, d); } } }, { id: 'author', name: LANG.author, value: 'user', compute: function(comment, td) { td.className = 'q1'; var a = $WH.ce('a'); a.href = '?user=' + comment.user; $WH.ae(a, $WH.ct(comment.user)); $WH.ae(td, a); } }, { id: 'posted', name: LANG.posted, width: '16%', value: 'elapsed', compute: function(comment, td) { var postedOn = new Date(comment.date), elapsed = (g_serverTime - postedOn) / 1000; var s = $WH.ce('span'); g_formatDate(s, elapsed, postedOn, 0, 1); $WH.ae(td, s); } } ], getItemLink: function(comment) { return '?' + g_types[comment.type] + '=' + comment.typeId + (comment.id != null ? '#comments:id=' + comment.id: '') } }, screenshot: { sort: [], mode: 3, // Grid mode nItemsPerPage: 40, nItemsPerRow: 4, poundable: 2, // Yes but w/o sort columns: [], compute: function(screenshot, td, i) { var _, postedOn = new Date(screenshot.date), elapsed = (g_serverTime - postedOn) / 1000; td.className = 'screenshot-cell'; td.vAlign = 'bottom'; var a = $WH.ce('a'); a.href = '#screenshots:id=' + screenshot.id; a.onclick = $WH.rf2; var img = $WH.ce('img'), scale = Math.min(150 / screenshot.width, 150 / screenshot.height); img.src = g_staticUrl + '/uploads/screenshots/thumb/' + screenshot.id + '.jpg'; //img.width = Math.round(scale * screenshot.width); //img.height = Math.round(scale * screenshot.height); $WH.ae(a, img); $WH.ae(td, a); var d = $WH.ce('div'); d.className = 'screenshot-cell-user'; var hasUser = (screenshot.user != null && screenshot.user.length); if (hasUser) { a = $WH.ce('a'); a.href = '?user=' + screenshot.user; $WH.ae(a, $WH.ct(screenshot.user)); $WH.ae(d, $WH.ct(LANG.lvscreenshot_from)); $WH.ae(d, a); $WH.ae(d, $WH.ct(' ')); } var s = $WH.ce('span'); if (hasUser) { g_formatDate(s, elapsed, postedOn); } else { g_formatDate(s, elapsed, postedOn, 0, 1); } $WH.ae(d, s); $WH.ae(d, $WH.ct(' ' + LANG.dash + ' ')); var a = $WH.ce('a'); a.href = 'javascript:;'; a.onclick = ContactTool.show.bind(ContactTool, { mode: 3, screenshot: screenshot }); a.className = 'report-icon'; g_addTooltip(a, LANG.report_tooltip, 'q2'); $WH.ae(a, $WH.ct(LANG.report)); $WH.ae(d, a); $WH.ae(td, d); d = $WH.ce('div'); d.style.position = 'relative'; d.style.height = '1em'; var hasCaption = (screenshot.caption != null && screenshot.caption.length); var hasSubject = (screenshot.subject != null && screenshot.subject.length); if (hasCaption || hasSubject) { var d2 = $WH.ce('div'); d2.className = 'screenshot-caption'; if (hasSubject) { var foo1 = $WH.ce('small'); $WH.ae(foo1, $WH.ct(LANG.types[screenshot.type][0] + LANG.colon)); var foo2 = $WH.ce('a'); $WH.ae(foo2, $WH.ct(screenshot.subject)); foo2.href = '?' + g_types[screenshot.type] + '=' + screenshot.typeId; $WH.ae(foo1, foo2); $WH.ae(d2, foo1); if (hasCaption && screenshot.caption.length) { $WH.ae(foo1, $WH.ct(' (...)')); } $WH.ae(foo1, $WH.ce('br')); } if (hasCaption) { $WH.aE(td, 'mouseover', Listview.funcBox.ssCellOver.bind(d2)); $WH.aE(td, 'mouseout', Listview.funcBox.ssCellOut.bind(d2)); var foo = $WH.ce('span'); foo.innerHTML = Markup.toHtml(screenshot.caption, { mode: Markup.MODE_SIGNATURE }); $WH.ae(d2, foo); } $WH.ae(d, d2); } $WH.aE(td, 'click', Listview.funcBox.ssCellClick.bind(this, i)); $WH.ae(td, d); }, createNote: function(div) { if (typeof g_pageInfo == 'object' && g_pageInfo.type > 0) { var sm = $WH.ce('small'); var a = $WH.ce('a'); if (g_user.id > 0) { a.href = 'javascript:;'; a.onclick = ss_submitAScreenshot; } else { a.href = '?account=signin'; } $WH.ae(a, $WH.ct(LANG.lvscreenshot_submit)); $WH.ae(sm, a); $WH.ae(div, sm); } }, onNoData: function(div) { if (typeof g_pageInfo == 'object' && g_pageInfo.type > 0) { var s = '' + LANG.lvnodata_ss1 + '
'; if (g_user.id > 0) { var foo = LANG.lvnodata_ss2; foo = foo.replace('
', ''); s += foo; } else { var foo = LANG.lvnodata_ss3; foo = foo.replace('', ''); foo = foo.replace('', ''); s += foo; } div.style.padding = '1.5em 0'; div.innerHTML = s; } else { return -1; } }, onBeforeCreate: function() { if (location.hash && location.hash.match(/:id=([0-9]+)/) != null) { var rowNo = $WH.in_array(this.data, parseInt(RegExp.$1), function(x) { return x.id; }); this.rowOffset = this.getRowOffset(rowNo); return rowNo; } }, onAfterCreate: function(rowNo) { if (rowNo != null) { setTimeout((function() { ScreenshotViewer.show({ screenshots: this.data, pos: rowNo }) }).bind(this), 1); } } }, video: { sort: [], mode: 3, // Grid mode nItemsPerPage: 40, nItemsPerRow: 4, poundable: 2, // Yes but w/o sort columns: [], compute: function(video, td, i) { var _, postedOn = new Date(video.date), elapsed = (g_serverTime - postedOn) / 1000; td.className = 'screenshot-cell'; td.vAlign = 'bottom'; var a = $WH.ce('a'); a.href = '#videos:id=' + video.id; a.onclick = $WH.rf2; var img = $WH.ce('img'); img.src = $WH.sprintf(vi_thumbnails[video.videoType], video.videoId); $WH.ae(a, img); $WH.ae(td, a); var d = $WH.ce('div'); d.className = 'screenshot-cell-user'; var hasUser = (video.user != null && video.user.length); if (hasUser) { a = $WH.ce('a'); a.href = '?user=' + video.user; $WH.ae(a, $WH.ct(video.user)); $WH.ae(d, $WH.ct(LANG.lvvideo_from)); $WH.ae(d, a); $WH.ae(d, $WH.ct(' ')); } var s = $WH.ce('span'); if (hasUser) { g_formatDate(s, elapsed, postedOn); } else { g_formatDate(s, elapsed, postedOn, 0, 1); } $WH.ae(d, s); $WH.ae(d, $WH.ct(' ' + LANG.dash + ' ')); var a = $WH.ce('a'); a.href = 'javascript:;'; a.onclick = ContactTool.show.bind(ContactTool, {mode: 5, video: video}); a.className = 'icon-report'; g_addTooltip(a, LANG.report_tooltip, 'q2'); $WH.ae(a, $WH.ct(LANG.report)); $WH.ae(d, a); $WH.ae(td, d); d = $WH.ce('div'); d.style.position = 'relative'; d.style.height = '1em'; var hasCaption = (video.caption != null && video.caption.length); var hasSubject = (video.subject != null && video.subject.length); if (hasCaption || hasSubject) { var d2 = $WH.ce('div'); d2.className = 'screenshot-caption'; if (hasSubject) { var foo1 = $WH.ce('small'); $WH.ae(foo1, $WH.ct(LANG.types[video.type][0] + LANG.colon)); var foo2 = $WH.ce('a'); $WH.ae(foo2, $WH.ct(video.subject)); foo2.href = '?' + g_types[video.type] + '=' + video.typeId; $WH.ae(foo1, foo2); $WH.ae(d2, foo1); if (hasCaption && video.caption.length) { $WH.ae(foo1, $WH.ct(' (...)')); } $WH.ae(foo1, $WH.ce('br')); } if (hasCaption) { $WH.aE(td, 'mouseover', Listview.funcBox.ssCellOver.bind(d2)); $WH.aE(td, 'mouseout', Listview.funcBox.ssCellOut.bind(d2)); var foo = $WH.ce('span'); foo.innerHTML = Markup.toHtml(video.caption, { mode: Markup.MODE_SIGNATURE }); $WH.ae(d2, foo); } $WH.ae(d, d2); } $WH.aE(td, 'click', Listview.funcBox.viCellClick.bind(this, i)); $WH.ae(td, d); }, createNote: function(div) { if (g_user && g_user.roles & (U_GROUP_ADMIN | U_GROUP_BUREAU | U_GROUP_VIDEO)) { if (typeof g_pageInfo == 'object' && g_pageInfo.type > 0) { var sm = $WH.ce('small'); var a = $WH.ce('a'); if (g_user.id > 0) { a.href = 'javascript:;'; a.onclick = vi_submitAVideo; } else { a.href = '?account=signin'; } $WH.ae(a, $WH.ct(LANG.lvvideo_suggest)); $WH.ae(sm, a); $WH.ae(div, sm); } } }, onNoData: function(div) { if (typeof g_pageInfo == 'object' && g_pageInfo.type > 0) { var s = '' + LANG.lvnodata_vi1 + '
'; if (g_user.id > 0) { var foo = LANG.lvnodata_vi2; foo = foo.replace('
', ''); s += foo; } else { var foo = LANG.lvnodata_vi3; foo = foo.replace('', ''); foo = foo.replace('', ''); s += foo; } div.style.padding = '1.5em 0'; div.innerHTML = s; } else { return -1; } }, onBeforeCreate: function() { if (location.hash && location.hash.match(/:id=([0-9]+)/) != null) { var rowNo = $WH.in_array(this.data, parseInt(RegExp.$1), function(x) { return x.id; }); this.rowOffset = this.getRowOffset(rowNo); return rowNo; } }, onAfterCreate: function(rowNo) { if (rowNo != null) { setTimeout((function() { VideoViewer.show({ videos: this.data, pos: rowNo }) }).bind(this), 1); } } }, pet: { sort: [1], nItemsPerPage: -1, searchable: 1, filtrable: 1, columns: [ { id: 'name', name: LANG.name, type: 'text', align: 'left', value: 'name', span: 2, compute: function(pet, td, tr) { var i = $WH.ce('td'); i.style.width = '1px'; i.style.padding = '0'; i.style.borderRight = 'none'; $WH.ae(i, Icon.create(pet.icon, 0)); $WH.ae(tr, i); td.style.borderLeft = 'none'; var wrapper = $WH.ce('div'); var a = $WH.ce('a'); a.style.fontFamily = 'Verdana, sans-serif'; a.href = this.getItemLink(pet); $WH.ae(a, $WH.ct(pet.name)); if (pet.expansion) { var sp = $WH.ce('span'); sp.className = g_GetExpansionClassName(pet.expansion); $WH.ae(sp, a); $WH.ae(wrapper, sp); } else { $WH.ae(wrapper, a); } if (pet.exotic) { wrapper.style.position = 'relative'; var d = $WH.ce('div'); d.className = 'small q1'; d.style.fontStyle = 'italic'; d.style.position = 'absolute'; d.style.right = '3px'; d.style.bottom = '0px'; var a = $WH.ce('a'); a.href = '?spell=53270'; $WH.ae(a, $WH.ct(LANG.lvpet_exotic)); $WH.ae(d, a); $WH.ae(wrapper, d); } $WH.ae(td, wrapper); }, getVisibleText: function(pet) { var buff = pet.name + Listview.funcBox.getExpansionText(pet); if (pet.exotic) { buff += ' ' + LANG.lvpet_exotic; } return buff; } }, { id: 'level', name: LANG.level, type: 'range', getMinValue: function(pet) { return pet.minlevel; }, getMaxValue: function(pet) { return pet.maxlevel; }, compute: function(pet, td) { if (pet.minlevel > 0 && pet.maxlevel > 0) { if (pet.minlevel != pet.maxlevel) { return pet.minlevel + LANG.hyphen + pet.maxlevel; } else { return pet.minlevel; } } else { return -1; } }, sortFunc: function(a, b, col) { if (col > 0) { return $WH.strcmp(a.minlevel, b.minlevel) || $WH.strcmp(a.maxlevel, b.maxlevel); } else { return $WH.strcmp(a.maxlevel, b.maxlevel) || $WH.strcmp(a.minlevel, b.minlevel); } } }, { id: 'damage', // essentially unused, but if someone wants to backport classic name: LANG.damage, value: 'damage', hidden: 1, compute: function (pet, col) { $WH.ae(col, this.template.getStatPct(pet.damage)) } }, { id: 'armor', // essentially unused, but if someone wants to backport classic name: LANG.armor, value: 'armor', hidden: 1, compute: function (pet, col) { $WH.ae(col, this.template.getStatPct(pet.armor)) } }, { id: 'health', // essentially unused, but if someone wants to backport classic name: LANG.health, value: 'health', hidden: 1, compute: function (pet, col) { $WH.ae(col, this.template.getStatPct(pet.health)) } }, { id: 'abilities', name: LANG.abilities, type: 'text', getValue: function(pet) { if (!pet.spells) { return ''; } if (pet.spells.length > 0) { var spells = ''; for (var i = 0, len = pet.spells.length; i < len; ++i) { if (pet.spells[i]) { spells += g_spells[pet.spells[i]]['name_' + g_locale.name]; } } return spells; } }, compute: function(pet, td) { if (!pet.spells) { return ''; } if (pet.spells.length > 0) { td.style.padding = '0'; Listview.funcBox.createCenteredIcons(pet.spells, td, '', 1); } }, sortFunc: function(a, b) { if (!a.spells || !b.spells) { return 0; } return $WH.strcmp(a.spellCount, b.spellCount) || $WH.strcmp(a.spells, b.spells); }, hidden: true }, { id: 'diet', name: LANG.diet, type: 'text', compute: function(pet, td) { if (td) { td.className = 'small'; } var i = 0, foods = ''; for (var food in g_pet_foods) { if (pet.diet & food) { if (i++ > 0) { foods += LANG.comma; } foods += g_pet_foods[food]; } } return foods; }, sortFunc: function(a, b) { return $WH.strcmp(b.foodCount, a.foodCount) || Listview.funcBox.assocArrCmp(a.diet, b.diet, g_pet_foods); } }, { id: 'type', name: LANG.type, type: 'text', compute: function(pet, td) { if (pet.type != null) { td.className = 'small q1'; var a = $WH.ce('a'); a.href = '?pets=' + pet.type; $WH.ae(a, $WH.ct(g_pet_types[pet.type])); $WH.ae(td, a); } }, getVisibleText: function(pet) { if (pet.type != null) { return g_pet_types[pet.type]; } }, sortFunc: function(a, b, col) { return $WH.strcmp(g_pet_types[a.type], g_pet_types[b.type]); } } ], getItemLink: function(pet) { return '?pet=' + pet.id; }, getStatPct: function(modifier) { var _ = $WH.ce('span'); if (!isNaN(modifier) && modifier > 0) { _.className = 'q2'; $WH.ae(_, $WH.ct('+' + modifier + '%')); } else if (!isNaN(modifier) && modifier < 0) { _.className = 'q10'; $WH.ae(_, $WH.ct(modifier + '%')); } return _; } }, achievement: { sort: [1, 2], nItemsPerPage: 100, searchable: 1, filtrable: 1, columns: [ { id: 'name', name: LANG.name, type: 'text', align: 'left', value: 'name', span: 2, compute: function(achievement, td, tr) { var rel = null; if (achievement.who && achievement.completed) { rel = 'who=' + achievement.who + '&when=' + achievement.completed.getTime(); } var i = $WH.ce('td'); i.style.width = '1px'; i.style.padding = '0'; i.style.borderRight = 'none'; $WH.ae(i, g_achievements.createIcon(achievement.id, 1)); Icon.getLink(i.firstChild).href = this.getItemLink(achievement); Icon.getLink(i.firstChild).rel = rel; $WH.ae(tr, i); td.style.borderLeft = 'none'; var a = $WH.ce('a'); a.style.fontFamily = 'Verdana, sans-serif'; a.href = this.getItemLink(achievement); a.rel = rel; $WH.ae(a, $WH.ct(achievement.name)); $WH.ae(td, a); if (achievement.description != null) { var d = $WH.ce('div'); d.className = 'small'; $WH.ae(d, $WH.ct(achievement.description)); $WH.ae(td, d); } }, getVisibleText: function(achievement) { var buff = achievement.name; if (achievement.description) { buff += ' ' + achievement.description; } return buff; } }, { id: 'location', name: LANG.location, type: 'text', width: '15%', hidden: 1, compute: function (achievement, td) { if (achievement.zone) { var a = $WH.ce('a'); a.className = 'q1'; a.href = '?zones=' + achievement.zone; $WH.ae(a, $WH.ct(g_zones[achievement.zone])); $WH.ae(td, a); } }, getVisibleText: function (achievement) { return Listview.funcBox.arrayText(achievement.zone, g_zones); }, sortFunc: function (a, b, col) { return Listview.funcBox.assocArrCmp(a.zone, b.zone, g_zones); } }, { id: 'side', name: LANG.side, type: 'text', compute: function(achievement, td) { if (achievement.side && achievement.side != 3) { var sp = $WH.ce('span'); sp.className = (achievement.side == 1 ? 'alliance-icon': 'horde-icon'); g_addTooltip(sp, g_sides[achievement.side]); $WH.ae(td, sp); } }, getVisibleText: function(achievement) { if (achievement.side) { return g_sides[achievement.side]; } }, sortFunc: function(a, b, col) { return $WH.strcmp(g_sides[a.side], g_sides[b.side]); } }, { id: 'points', name: LANG.points, type: 'number', width: '10%', value: 'points', compute: function(achievement, td) { if (achievement.points) { Listview.funcBox.appendMoney(td, 0, null, 0, 0, achievement.points); } } }, { id: 'rewards', name: LANG.rewards, type: 'text', width: '20%', compute: function(achievement, td) { if (achievement.rewards) { var itemrewards = []; var spellrewards = []; // not used in 3.3.5 var titlerewards = []; for (var i = 0; i < achievement.rewards.length; i++) { if (achievement.rewards[i][0] == 11) { titlerewards.push(achievement.rewards[i][1]); } else if (achievement.rewards[i][0] == 3) { itemrewards.push(achievement.rewards[i][1]); } else if (achievement.rewards[i][0] == 6) { spellrewards.push(achievement.rewards[i][1]); } } if (itemrewards.length > 0) { for (var i = 0; i < itemrewards.length; i++) { if (!g_items[itemrewards[i]]) { return; } var item = g_items[itemrewards[i]]; var a = $WH.ce('a'); a.href = '?item=' + itemrewards[i]; a.className = 'q' + item.quality + ' icontiny tinyspecial'; a.style.backgroundImage = 'url(' + g_staticUrl + '/images/icons/tiny/' + item.icon.toLowerCase() + '.gif)'; $WH.ae(a, $WH.ct(item['name_' + g_locale.name])); var span = $WH.ce('span'); $WH.ae(span, a); $WH.ae(td, span); $WH.ae(td, $WH.ce('br')); } } if (spellrewards.length > 0) { for (var i = 0; i < spellrewards.length; i++) { if (!g_spells[spellrewards[i]]) { return; } var item = g_spells[spellrewards[i]]; var a = $WH.ce('a'); a.href = '?spell=' + spellrewards[i]; a.className = 'q8 icontiny tinyspecial'; a.style.backgroundImage = 'url(' + g_staticUrl + '/images/icons/tiny/' + item.icon.toLowerCase() + '.gif)'; $WH.ae(a, $WH.ct(item['name_' + g_locale.name])); var span = $WH.ce('span'); $WH.ae(span, a); $WH.ae(td, span); $WH.ae(td, $WH.ce('br')); } } if (titlerewards.length > 0) { for (var i = 0; i < titlerewards.length; i++) { if (!g_titles[titlerewards[i]]) { return; } var title = g_titles[titlerewards[i]]['name_' + g_locale.name]; title = title.replace('%s', '<' + LANG.name + '>'); var span = $WH.ce('a'); span.className = 'q1'; span.href = '?title=' + titlerewards[i]; span.innerHTML = title; $WH.ae(td, span); $WH.ae(td, $WH.ce('br')); } } } else if (achievement.reward) { var span = $WH.ce('span'); span.className = 'q1'; $WH.ae(span, $WH.ct(achievement.reward)); $WH.ae(td, span); } }, getVisibleText: function(achievement) { var buff = ''; if (achievement.rewards) { for (var i = 0; i < achievement.rewards.length; i++) { if (achievement.rewards[i][0] == 11) { buff += ' ' + g_titles[achievement.rewards[i][1]]['name_' + g_locale.name].replace('%s', '<' + LANG.name + '>'); } else if (achievement.rewards[i][0] == 3) { buff += ' ' + g_items[achievement.rewards[i][1]]['name_' + g_locale.name]; } else if (achievement.rewards[i][0] == 6) { buff += ' ' + g_spells[achievement.rewards[i][1]]['name_' + g_locale.name]; } } } else if (achievement.reward) { buff += ' ' + achievement.reward; } return buff; }, sortFunc: function(a, b, col) { var text1 = this.getVisibleText(a); var text2 = this.getVisibleText(b); if (text1 != '' && text2 == '') { return -1; } if (text2 != '' && text1 == '') { return 1; } return $WH.strcmp(text1, text2); } }, { id: 'category', name: LANG.category, type: 'text', width: '15%', compute: function(achievement, td) { statistic = achievement.type ? achievement.type + '.' : ''; td.className = 'small'; path = '?achievements=' + statistic; if (achievement.category != -1 && achievement.parentcat != -1) { var a2 = $WH.ce('a'); a2.className = 'q0'; a2.href = '?achievements=' + statistic + achievement.parentcat; $WH.ae(a2, $WH.ct(g_achievement_categories[achievement.parentcat])); $WH.ae(td, a2); $WH.ae(td, $WH.ce('br')); path = a2.href + '.'; } var a = $WH.ce('a'); a.className = 'q1'; a.href = path + achievement.category; $WH.ae(a, $WH.ct(g_achievement_categories[achievement.category])); $WH.ae(td, a); }, getVisibleText: function(achievement) { return g_achievement_categories[achievement.category]; }, sortFunc: function(a, b, col) { return $WH.strcmp(g_achievement_categories[a.category], g_achievement_categories[b.category]); }, hidden: true } ], getItemLink: function(achievement) { return '?achievement=' + achievement.id; } }, title: { sort: [1], nItemsPerPage: -1, searchable: 1, filtrable: 1, columns: [ { id: 'name', name: LANG.name, type: 'text', align: 'left', value: 'name', compute: function(title, td, tr) { var sp = $WH.ce('a'), n = $WH.ce('span'), t = $WH.ct($WH.str_replace(title.name, '%s', '')); td.style.fontFamily = 'Verdana, sans-serif'; // $WH.nw(td) sp.href = this.getItemLink(title); if (title.who) { $WH.ae(n, $WH.ct(title.who)); } else { $WH.ae(n, $WH.ct('<' + LANG.name + '>')); n.className = 'q0'; } if (title.name.indexOf('%s') > 0) { // Prefix title $WH.ae(sp, t); $WH.ae(sp, n); } else if (title.name.indexOf('%s') == 0) { // Suffix title $WH.ae(sp, n); $WH.ae(sp, t); } if (title.expansion) { var i = $WH.ce('span'); i.className = (title.expansion == 1 ? 'bc-icon': 'wotlk-icon'); $WH.ae(i, sp); $WH.ae(td, i); } else { $WH.ae(td, sp); } }, sortFunc: function(a, b, col) { var aName = $WH.trim(a.name.replace('%s', '').replace(/^[\s,]*(,|the |of the |of )/i, '')); bName = $WH.trim(b.name.replace('%s', '').replace(/^[\s,]*(,|the |of the |of )/i, '')); return $WH.strcmp(aName, bName); }, getVisibleText: function(title) { var buff = title.name + Listview.funcBox.getExpansionText(title); return buff; } }, { id: 'gender', name: LANG.gender, type: 'text', value: 'gender', compute: function(title, td) { if (title.gender && title.gender != 3) { var gender = g_file_genders[title.gender - 1]; var sp = $WH.ce('span'); sp.className = gender + '-icon'; g_addTooltip(sp, LANG[gender]); $WH.ae(td, sp); } }, getVisibleText: function(title) { if (title.gender && title.gender != 3) { return LANG[g_file_genders[title.gender - 1]]; } }, sortFunc: function(a, b, col) { return $WH.strcmp(a.gender, b.gender); } }, { id: 'side', name: LANG.side, type: 'text', compute: function(title, td) { if (title.side && title.side != 3) { var sp = $WH.ce('span'); sp.className = (title.side == 1 ? 'alliance-icon': 'horde-icon'); g_addTooltip(sp, g_sides[title.side]); $WH.ae(td, sp); } }, getVisibleText: function(title) { if (title.side) { return g_sides[title.side]; } }, sortFunc: function(a, b, col) { return $WH.strcmp(g_sides[a.side], g_sides[b.side]); } }, { id: 'source', name: LANG.source, type: 'text', compute: function(title, td) { if (title.source) { $WH.nw(td); td.className = 'small'; td.style.lineHeight = '18px'; var n = 0; for (var s in title.source) { title.source[s].sort(function(a, b) { return b.s - a.s; }); for (var i = 0, len = title.source[s].length; i < len; ++i) { var sm = title.source[s][i]; var type = 0; if (title.faction && typeof sm != 'string' && sm.s !== undefined && sm.s != -1 && sm.s != 2 - title.faction) { continue; } if (n++ > 0) { $WH.ae(td, $WH.ce('br')); } if (typeof sm == 'string') { $WH.ae(td, $WH.ct(sm)); } else if (sm.t) { type = sm.t; var a = $WH.ce('a'); // o.style.fontFamily = 'Verdana, sans-serif'; a.href = '?' + g_types[sm.t] + '=' + sm.ti; a.className = 'q1'; if (sm.s == 1) { a.className += ' alliance-icon' } if (sm.s == 0) { a.className += ' horde-icon' } if (sm.t == 5) { // Quests a.className += ' icontiny tinyspecial'; a.style.backgroundImage = 'url(' + g_staticUrl + '/images/icons/quest_start.gif)'; } $WH.ae(a, $WH.ct(sm.n)); $WH.ae(td, a); } } } } }, getVisibleText: function(title) { var buff = ''; if (title.source) { for (var s in title.source) { for (var i = 0, len = title.source[s].length; i < len; ++i) { var sm = title.source[s][i]; if (typeof sm == 'string') { buff += ' ' + sm; } else if (sm.t){ buff += ' ' + sm.n; } } } } return buff; }, sortFunc: function(a, b, col) { return $WH.strcmp(this.getVisibleText(a), this.getVisibleText(b)); } }, { id: 'category', name: LANG.category, type: 'text', width: '15%', compute: function(title, td) { $WH.nw(td); td.className = 'small q1'; var a = $WH.ce('a'); a.href = '?titles=' + title.category; $WH.ae(a, $WH.ct(g_title_categories[title.category])); $WH.ae(td, a); }, getVisibleText: function(title) { return g_title_categories[title.category]; }, sortFunc: function(a, b, col) { return $WH.strcmp(g_title_categories[a.category], g_title_categories[b.category]); }, hidden: true } ], getItemLink: function(title) { return '?title=' + title.id; } }, profile: { sort: [], nItemsPerPage: 50, searchable: 1, filtrable: 1, columns: [ { id: 'name', name: LANG.name, value: 'name', type: 'text', align: 'left', span: 2, compute: function(profile, td, tr) { if (profile.level) { var i = $WH.ce('td'); i.style.width = '1px'; i.style.padding = '0'; i.style.borderRight = 'none'; $WH.ae(i, Icon.create($WH.g_getProfileIcon(profile.race, profile.classs, profile.gender, profile.level, profile.icon ? profile.icon : profile.id, 'medium'), 1, null, this.getItemLink(profile))); $WH.ae(tr, i); td.style.borderLeft = 'none'; } else { td.colSpan = 2; } var wrapper = $WH.ce('div'); wrapper.style.position = 'relative'; var a = $WH.ce('a'); a.style.fontFamily = 'Verdana, sans-serif'; a.href = this.getItemLink(profile); if (profile.pinned) { a.className = 'star-icon-right'; } $WH.ae(a, $WH.ct(profile.name)); $WH.ae(wrapper, a); var d = $WH.ce('div'); d.className = 'small'; d.style.marginRight = '20px'; if (profile.guild && typeof(profile.guild) != 'number') { var a = $WH.ce('a'); a.className = 'q1'; a.href = '?guild=' + profile.region + '.' + profile.realm + '.' + g_urlize(profile.guild); $WH.ae(a, $WH.ct(profile.guild)); $WH.ae(d, $WH.ct('<')); $WH.ae(d, a); $WH.ae(d, $WH.ct('>')); } else if (profile.description) { $WH.ae(d, $WH.ct(profile.description)); } var s = $WH.ce('span'), foo = ''; s.className = 'q10'; if (profile.deleted) { foo = LANG.lvcomment_deleted; } $WH.ae(s, $WH.ct(foo)); $WH.ae(d, s); $WH.ae(wrapper, d); var d = $WH.ce('div'); d.className = 'small'; d.style.fontStyle = 'italic'; d.style.position = 'absolute'; d.style.right = '3px'; d.style.bottom = '0px'; tr.__status = d; // todo: wtf is that for..? if (profile.published === 0) { $WH.ae(d, $WH.ct(LANG.privateprofile)); } $WH.ae(wrapper, d); $WH.ae(td, wrapper); }, getVisibleText: function(profile) { var buff = profile.name; if (profile.guild && typeof(profile.guild) != 'number') { buff += ' ' + profile.guild; } return buff; } }, { id: 'faction', name: LANG.faction, type: 'text', compute: function(profile, td) { if (!profile.size && profile.members === undefined && !profile.level) { return; } var d = $WH.ce('div'), d2 = $WH.ce('div'), icon; icon = Icon.create('faction_' + g_file_factions[parseInt(profile.faction) + 1], 0); icon.style.cssFloat = icon.style.syleFloat = 'left'; g_addTooltip(icon, g_sides[parseInt(profile.faction) + 1]); d.style.margin = '0 auto'; d.style.textAlign = 'left'; d.style.width = '26px'; d2.className = 'clear'; $WH.ae(d, icon); $WH.ae(td, d); $WH.ae(td, d2); }, getVisibleText: function(profile) { return g_sides[profile.faction + 1]; }, sortFunc: function(a, b, col) { return $WH.strcmp(this.getVisibleText(a), this.getVisibleText(b)); } }, { id: 'members', name: LANG.members, value: 'members', hidden: 1 }, { id: 'size', name: 'Size', value: 'size', hidden: 1 }, { id: 'rank', name: 'Rank', value: 'rank', hidden: 1 }, { id: 'race', name: LANG.race, type: 'text', compute: function(profile, td) { if (profile.race) { var d = $WH.ce('div'), d2 = $WH.ce('div'), icon; icon = Icon.create('race_' + g_file_races[profile.race] + '_' + g_file_genders[profile.gender], 0, null, '?race=' + profile.race); icon.style.cssFloat = icon.style.syleFloat = 'left'; g_addTooltip(icon, g_chr_races[profile.race]); d.style.margin = '0 auto'; d.style.textAlign = 'left'; d.style.width = '26px'; d2.className = 'clear'; $WH.ae(d, icon); $WH.ae(td, d); $WH.ae(td, d2); } }, getVisibleText: function(profile) { return g_file_genders[profile.gender] + ' ' + g_chr_races[profile.race]; }, sortFunc: function(a, b, col) { return $WH.strcmp(g_chr_races[a.race], g_chr_races[b.race]); }, hidden: 1 }, { id: 'classs', name: LANG.classs, type: 'text', compute: function(profile, td) { if (profile.classs) { var d = $WH.ce('div'), d2 = $WH.ce('div'), icon; icon = Icon.create('class_' + g_file_classes[profile.classs], 0, null, '?class=' + profile.classs); icon.style.cssFloat = icon.style.syleFloat = 'left'; g_addTooltip(icon, g_chr_classes[profile.classs], 'c' + profile.classs); d.style.margin = '0 auto'; d.style.textAlign = 'left'; d.style.width = '26px'; d2.className = 'clear'; $WH.ae(d, icon); $WH.ae(td, d); $WH.ae(td, d2); } else { return -1; } }, getVisibleText: function(profile) { if (profile.classs) { return g_chr_classes[profile.classs]; } }, sortFunc: function(a, b, col) { return $WH.strcmp(this.getVisibleText(a), this.getVisibleText(b)); }, hidden: 1 }, { id: 'level', name: LANG.level, value: 'level', hidden: 1 }, { id: 'talents', name: LANG.talents, type: 'text', compute: function(profile, td) { if (!profile.level) { return; } var spent = [profile.talenttree1, profile.talenttree2, profile.talenttree3]; var specData = pr_getSpecFromTalents(profile.classs, spent); var a = $WH.ce('a'); a.className = 'icontiny tinyspecial tip q1'; a.style.backgroundImage = 'url(' + g_staticUrl + '/images/icons/tiny/' + specData.icon.toLowerCase() + '.gif)'; a.rel = 'np'; a.href = this.getItemLink(profile) + '#talents'; g_addTooltip(a, specData.name); $WH.ae(a, $WH.ct(profile.talenttree1 + ' / ' + profile.talenttree2 + ' / ' + profile.talenttree3)); $WH.ae(td, a); }, getVisibleText: function(profile) { if (profile.talenttree1 || profile.talenttree2 || profile.talenttree3) { if (profile.talentspec > 0) { return g_chr_specs[profile.classs][profile.talentspec - 1]; } else { return g_chr_specs[0]; } } else { return g_chr_specs['-1']; } }, sortFunc: function(a, b, col) { return $WH.strcmp(this.getVisibleText(a), this.getVisibleText(b)); }, hidden: 1 }, { id: 'achievementpoints', name: LANG.points, value: 'achievementpoints', tooltip: LANG.tooltip_achievementpoints, compute: function(profile, td) { if (profile.achievementpoints) { Listview.funcBox.appendMoney(td, 0, null, 0, 0, profile.achievementpoints); } }, hidden: 1 }, { id: 'wins', name: LANG.wins, value: 'wins', hidden: 1 }, { id: 'losses', name: LANG.losses, compute: function(profile, td) { return profile.games - profile.wins; }, hidden: 1 }, { id: 'guildrank', name: LANG.guildrank, value: 'guildrank', compute: function(profile, td) { if (profile.guildrank > 0) { return $WH.sprintf(LANG.rankno, profile.guildrank); } else if (profile.guildrank == 0) { var b = $WH.ce('b'); $WH.ae(b, $WH.ct(LANG.guildleader)); $WH.ae(td, b); } }, getVisibleText: function(profile) { if (profile.guildrank > 0) { return $WH.sprintf(LANG.rankno, profile.guildrank); } else if (profile.guildrank == 0) { return LANG.guildleader; } }, sortFunc: function(a, b, col) { return $WH.strcmp((a.guildrank >= 0 ? a.guildrank : 11), (b.guildrank >= 0 ? b.guildrank : 11)); }, hidden: 1 }, { id: 'rating', name: LANG.rating, value: 'rating', compute: function(profile, td) { if (profile.roster) { return profile.arenateam[profile.roster].rating; } return profile.rating; }, sortFunc: function(a, b, col) { if (a.roster && b.roster) { return $WH.strcmp(a.arenateam[a.roster].rating, b.arenateam[b.roster].rating); } return $WH.strcmp(a.rating, b.rating); }, hidden: 1 }, { id: 'location', name: LANG.location, type: 'text', compute: function(profile, td) { var a; if (profile.region) { if (profile.realm) { a = $WH.ce('a'); a.className = 'q1'; a.href = '?profiles=' + profile.region + '.' + profile.realm; $WH.ae(a, $WH.ct(profile.realmname)); $WH.ae(td, a); $WH.ae(td, $WH.ce('br')); } var s = $WH.ce('small'); a = $WH.ce('a'); a.className = 'q1'; a.href = '?profiles=' + profile.region; $WH.ae(a, $WH.ct(profile.region.toUpperCase())); $WH.ae(s, a); if (profile.subregion) { $WH.ae(s, $WH.ct(LANG.hyphen)); a = $WH.ce('a'); a.className = 'q1'; a.href = '?profiles=' + profile.region + '.' + profile.subregion; $WH.ae(a, $WH.ct(profile.subregionname)); $WH.ae(s, a); } $WH.ae(td, s); } }, getVisibleText: function(profile) { var buff = ''; if (profile.region) { buff += ' ' + profile.region; } if (profile.subregion) { buff += ' ' + profile.subregion; } if (profile.realm) { buff += ' ' + profile.realm; } return $WH.trim(buff); }, sortFunc: function(a, b, col) { if (a.region != b.region) { return $WH.strcmp(a.region, b.region); } if (a.subregion != b.subregion) { return $WH.strcmp(a.subregion, b.subregion); } return $WH.strcmp(a.realm, b.realm); } }, { id: 'guild', name: LANG.guild, value: 'guild', type: 'text', compute: function(profile, td) { if (!profile.region || !profile.realm || !profile.guild || typeof(profile.guild) == 'number') { return; } var a = $WH.ce('a'); a.className = 'q1'; a.href = '?guild=' + profile.region + '.' + profile.realm + '.' + g_urlize(profile.guild); $WH.ae(a, $WH.ct(profile.guild)); $WH.ae(td, a); } } ], getItemLink: function(profile) { if (profile.size !== undefined) { return '?arena-team=' + profile.region + '.' + profile.realm + '.' + g_urlize(profile.name); } else if (profile.members !== undefined) { return '?guild=' + profile.region + '.' + profile.realm + '.' + g_urlize(profile.name); } else { return g_getProfileUrl(profile); } } }, model: { sort: [], mode: 3, // Grid mode nItemsPerPage: 40, nItemsPerRow: 4, poundable: 2, // Yes but w/o sort columns: [], compute: function(model, td, i) { td.className = 'screenshot-cell'; td.vAlign = 'bottom'; var a = $WH.ce('a'); a.href = 'javascript:;'; // a.className = 'pet-zoom'; // sarjuuk: keep as reference only a.onclick = this.template.modelShow.bind(this.template, model.npcId, model.displayId, false); var img = $WH.ce('img'); img.src = g_staticUrl + '/modelviewer/thumbs/npc/' + model.displayId + '.png'; $WH.ae(a, img); $WH.ae(td, a); var d = $WH.ce('div'); d.className = 'screenshot-cell-user'; a = $WH.ce('a'); a.href = '?npcs=1&filter=' + (model.family ? 'fa=' + model.family + ';' : '') + 'minle=1;cr=35;crs=0;crv=' + model.skin; $WH.ae(a, $WH.ct(model.skin)); $WH.ae(d, a); $WH.ae(d, $WH.ct(' (' + model.count + ')')); $WH.ae(td, d); d = $WH.ce('div'); d.style.position = 'relative'; d.style.height = '1em'; var d2 = $WH.ce('div'); d2.className = 'screenshot-caption'; var s = $WH.ce('small'); $WH.ae(s, $WH.ct(LANG.level + ': ')); $WH.ae(s, $WH.ct((model.minLevel == 9999 ? '??' : model.minLevel) + (model.minLevel == model.maxLevel ? '' : LANG.hyphen + (model.maxLevel == 9999 ? '??' : model.maxLevel)))); $WH.ae(s, $WH.ce('br')); $WH.ae(d2, s); $WH.ae(d, d2); $WH.ae(td, d); $WH.aE(td, 'click', this.template.modelShow.bind(this.template, model.npcId, model.displayId, true)); }, modelShow: function(npcId, displayId, sp, e) { if (sp) { e = $WH.$E(e); if (e.shiftKey || e.ctrlKey) { return; } var j = 0, el = e._target; while (el && j < 3) { if (el.nodeName == 'A') { return; } if (el.nodeName == 'IMG') { break; } el = el.parentNode; } } ModelViewer.show({type: 1, typeId: npcId, displayId: displayId, noPound: 1}); } }, genericmodel: { sort: [], mode: 3, // Grid mode nItemsPerPage: 40, nItemsPerRow: 4, poundable: 2, // Yes but w/o sort columns: [ { value: "name", sortFunc: function (a, b) { return Listview.templates.genericmodel.sortFunc(a, b); } } ], compute: function (model, td, i) { td.className = 'screenshot-cell'; td.vAlign = 'bottom'; var displayId, type, linkType, slot, typeId; if ('modelviewer' in model) { displayId = model.modelviewer.displayid; typeId = model.modelviewer.typeid; type = model.modelviewer.type; slot = model.slot; } else if ('npcmodel' in model) { displayId = model.npcmodel; typeId = model.id; type = 1; } else if ('displayid' in model) { displayId = model.displayid; typeId = model.id; type = 3; slot = model.slotbak || model.slot; } switch (type) { case 1: linkType = 'npc'; break; case 3: linkType = 'item'; break; default: linkType = 'item'; break; } if (displayId) { var a = $WH.ce('a'); a.href = 'javascript:;'; a.rel = this.genericlinktype + '=' + model.id; a.onclick = this.template.modelShow.bind(this.template, type, typeId, displayId, slot, false); var img = $WH.ce('img'); img.src = g_staticUrl + '/modelviewer/thumbs/' + linkType + '/' + displayId + '.png'; $WH.ae(a, img); $WH.ae(td, a); } d = $WH.ce('div'); d.style.position = 'relative'; d.style.height = '1em'; var d2 = $WH.ce('div'); d2.className = 'screenshot-caption'; var a = $WH.ce('a'); a.className = 'q' + ((this.genericlinktype == 'item') ? g_items[model.id].quality : ''); a.style.fontFamily = 'Verdana,sans-serif'; a.href = g_staticUrl + '/' + this.genericlinktype + '=' + model.id; $WH.ae(a, $WH.ct(model.name.substr(1))); $WH.ae(d2, a); $WH.ae(d, d2); $WH.ae(td, d); if (displayId) { $WH.aE(td, 'click', this.template.modelShow.bind(this.template, type, typeId, displayId, slot, true)); } }, modelShow: function (type, typeId, displayId, slot, sp, e) { if (sp) { e = $WH.$E(e); if (e.shiftKey || e.ctrlKey) { return; } var j = 0, el = e._target; while (el && j < 3) { if (el.nodeName == 'A') { return; } if (el.nodeName == 'IMG') { break; } el = el.parentNode; } } var opt = { type: type, typeId: typeId, displayId: displayId, noPound: 1 }; if (typeof slot != "undefined") { opt.slot = slot; } ModelViewer.show(opt); }, sortFunc: function (a, b, col) { return ($WH.strcmp(a.displayid, b.displayid) || $WH.strcmp(a.name, b.name) || -$WH.strcmp(a.level, b.level)); } }, currency: { sort: [1], searchable: 1, filtrable: 1, columns: [ { id: 'name', name: LANG.name, type: 'text', align: 'left', span: 2, value: 'name', compute: function(currency, td, tr) { var i = $WH.ce('td'); i.style.width = '1px'; i.style.padding = '0'; i.style.borderRight = 'none'; $WH.ae(i, Icon.create(currency.icon, 0, null, this.getItemLink(currency))); $WH.ae(tr, i); td.style.borderLeft = 'none'; var wrapper = $WH.ce('div'); var a = $WH.ce('a'); a.style.fontFamily = 'Verdana, sans-serif'; a.href = this.getItemLink(currency); $WH.ae(a, $WH.ct(currency.name)); $WH.ae(wrapper, a); $WH.ae(td, wrapper); } }, { id: 'category', name: LANG.category, type: 'text', width: '15%', compute: function(currency, td) { td.className = 'small'; var a = $WH.ce('a'); a.className = 'q1'; a.href = '?currencies=' + currency.category; $WH.ae(a, $WH.ct(g_currency_categories[currency.category])); $WH.ae(td, a); }, getVisibleText: function(currency) { return g_currency_categories[currency.category]; }, sortFunc: function(a, b, col) { return $WH.strcmp(g_currency_categories[a.category], g_currency_categories[b.category]); } } ], getItemLink: function(currency) { return '?currency=' + currency.id; } }, classs: { sort: [1], searchable: 1, filtrable: 1, columns: [ { id: 'name', name: LANG.name, type: 'text', align: 'left', span: 2, value: 'name', compute: function(classs, td, tr) { var i = $WH.ce('td'); i.style.width = '1px'; i.style.padding = '0'; i.style.borderRight = 'none'; $WH.ae(i, Icon.create('class_' + g_file_classes[classs.id], 0, null, this.getItemLink(classs))); $WH.ae(tr, i); td.style.borderLeft = 'none'; // force minimum width to fix overlap display bug td.style.width = '225px'; var wrapper = $WH.ce('div'); var a = $WH.ce('a'); a.className = 'c' + classs.id; a.style.fontFamily = 'Verdana, sans-serif'; a.href = this.getItemLink(classs); $WH.ae(a, $WH.ct(classs.name)); if (classs.expansion) { var sp = $WH.ce('span'); sp.className = g_GetExpansionClassName(classs.expansion); $WH.ae(sp, a); $WH.ae(wrapper, sp); } else { $WH.ae(wrapper, a); } if (classs.hero) { wrapper.style.position = 'relative'; var d = $WH.ce('div'); d.className = 'small'; d.style.fontStyle = 'italic'; d.style.position = 'absolute'; d.style.right = '3px'; d.style.bottom = '0px'; $WH.ae(d, $WH.ct(LANG.lvclass_hero)); $WH.ae(wrapper, d); } $WH.ae(td, wrapper); } }, { id: 'races', name: LANG.races, type: 'text', compute: function(classs, td) { if (classs.races) { var races = Listview.funcBox.assocBinFlags(classs.races, g_chr_races); td.className = 'q1'; for (var i = 0, len = races.length; i < len; ++i) { if (i > 0) { $WH.ae(td, $WH.ct(LANG.comma)); } var a = $WH.ce('a'); a.href = '?race=' + races[i]; $WH.ae(a, $WH.ct(g_chr_races[races[i]])); $WH.ae(td, a); } } }, getVisibleText: function(classs) { if (classs.races) { return Listview.funcBox.arrayText(Listview.funcBox.assocBinFlags(classs.races, g_chr_races), g_chr_races); } }, sortFunc: function(a, b, col) { return Listview.funcBox.assocArrCmp(Listview.funcBox.assocBinFlags(a.races, g_chr_races), Listview.funcBox.assocBinFlags(b.races, g_chr_races), g_chr_races); } } ], getItemLink: function(classs) { return '?class=' + classs.id; } }, race: { sort: [1], searchable: 1, filtrable: 1, columns: [ { id: 'name', name: LANG.name, type: 'text', align: 'left', span: 2, value: 'name', compute: function(race, td, tr) { var d = $WH.ce('div'), icon; d.style.margin = '0 auto'; d.style.textAlign = 'left'; d.style.width = '52px'; icon = Icon.create('race_' + g_file_races[race.id] + '_' + g_file_genders[0], 0, null, this.getItemLink(race)); icon.style.cssFloat = icon.style.styleFloat = 'left'; $WH.ae(d, icon); icon = Icon.create('race_' + g_file_races[race.id] + '_' + g_file_genders[1], 0, null, this.getItemLink(race)); icon.style.cssFloat = icon.style.styleFloat = 'left'; $WH.ae(d, icon); var i = $WH.ce('td'); i.style.width = '1px'; i.style.padding = '0'; i.style.borderRight = 'none'; $WH.ae(i, d); $WH.ae(tr, i); td.style.borderLeft = 'none'; var wrapper = $WH.ce('div'); var a = $WH.ce('a'); a.style.fontFamily = 'Verdana, sans-serif'; a.href = this.getItemLink(race); $WH.ae(a, $WH.ct(race.name)); if (race.expansion) { var sp = $WH.ce('span'); sp.className = g_GetExpansionClassName(race.expansion); $WH.ae(sp, a); $WH.ae(wrapper, sp); } else { $WH.ae(wrapper, a); } $WH.ae(td, wrapper); } }, { id: 'side', name: LANG.side, type: 'text', compute: function(race, td) { if (race.side && race.side != 3) { var sp = $WH.ce('span'); sp.className = (race.side == 1 ? 'alliance-icon' : 'horde-icon'); g_addTooltip(sp, g_sides[race.side]); $WH.ae(td, sp); } }, getVisibleText: function(race) { if (race.side) { return g_sides[race.side]; } }, sortFunc: function(a, b, col) { return $WH.strcmp(g_sides[a.side], g_sides[b.side]); } }, { id: 'classes', name: LANG.classes, type: 'text', compute: function(race, td) { if (race.classes) { var classes = Listview.funcBox.assocBinFlags(race.classes, g_chr_classes); var d = $WH.ce('div'); d.style.width = (26 * classes.length) + 'px'; d.style.margin = '0 auto'; for (var i = 0, len = classes.length; i < len; ++i) { var icon = Icon.create('class_' + g_file_classes[classes[i]], 0, null, '?class=' + classes[i]); g_addTooltip(icon, g_chr_classes[classes[i]], 'c' + classes[i]); icon.style.cssFloat = icon.style.styleFloat = 'left'; $WH.ae(d, icon); } $WH.ae(td, d); } }, getVisibleText: function(race) { if (race.classes) { return Listview.funcBox.arrayText(Listview.funcBox.assocBinFlags(race.classes, g_chr_classes), g_chr_classes); } }, sortFunc: function(a, b, col) { return Listview.funcBox.assocArrCmp(Listview.funcBox.assocBinFlags(a.classes, g_chr_classes), Listview.funcBox.assocBinFlags(b.classes, g_chr_classes), g_chr_classes); } } ], getItemLink: function(race) { return '?race=' + race.id; } } }; /* Menu class */ var MENU_IDX_ID = 0; // ID: A number or string; null makes the menu item a separator var MENU_IDX_NAME = 1; // Name: A string var MENU_IDX_URL = 2; // URL: A string for the URL, or a function to call when the menu item is clicked var MENU_IDX_SUB = 3; // Submenu: Child menu var MENU_IDX_OPT = 4; // Options: JSON array with additional options var Menu = new function() { var self = this; /***********/ /* PUBLIC */ /**********/ self.add = function(node, menu, opt) // Add a menu to a DOM element { if(!opt) opt = $.noop; var $node = $(node); $node.data('menu', menu); if(opt.showAtCursor) { $node.click(rootNodeClick); } else { $node .mouseover(rootNodeOver) .mouseout(rootNodeOut); } }; self.remove = function(node) // Remove menu from DOM element { $(node) .data('menu', null) .unbind('click', rootNodeClick) .unbind('mouseover', rootNodeOver) .unbind('mouseout', rootNodeOut); }; self.show = function(menu, node) { var $node = $(node); show(menu, $node); } self.showAtCursor = function(menu, event) // {event} must have been normalized by jQuery { showAtXY(menu, event.pageX, event.pageY); } self.showAtXY = function(menu, x, y) { showAtXY(menu, x, y); } self.hide = function() { rootNodeOut(); } self.addButtons = function(dest, menu) // Create a set of menu buttons (as seen on the homepage or in the top bar) { var $dest = $(dest); if(!$dest.length) return; var $buttons = $(''); $.each(menu, function(idx, menuItem) { if(isSeparator(menuItem)) return; var $a = $('') var $span = $('', { text: menuItem[MENU_IDX_NAME] }).appendTo($a); self.linkifyItem(menuItem, $a); if(hasSubmenu(menuItem)) { $span.addClass('hassubmenu'); self.add($a, menuItem[MENU_IDX_SUB]); } $buttons.append($a); }); $dest.append($buttons); }; self.linkifyItem = function(menuItem, $a) // Also used by PageTemplate when generating the top tabs { var opt = self.getItemOpt(menuItem); if(!menuItem[MENU_IDX_URL]) // Unlinked { $a.attr('href', 'javascript:;'); $a.addClass('unlinked'); return; } if(typeof menuItem[MENU_IDX_URL] == 'function') // Function { $a.attr('href', 'javascript:;'); $a.click(hide); $a.click(menuItem[MENU_IDX_URL]); } else // URL { var url = self.getItemUrl(menuItem); $a.attr('href', url); if(opt.newWindow || g_isExternalUrl(url)) $a.attr('target', '_blank'); if(opt.rel) $a.attr('rel', opt.rel); } if(typeof menuItem[MENU_IDX_OPT] == 'object' && menuItem[MENU_IDX_OPT].className) $a.addClass(menuItem[MENU_IDX_OPT].className); }; self.updateItem = function(menuItem) // Also used by PageTemplate when the breadcrumb changes { var $a = menuItem.$a; if(!$a) return; var opt = self.getItemOpt(menuItem); $a.removeClass('checked tinyicon icon'); $a.css('background-image', ''); if(menuItem.checked) { $a.addClass('checked'); } else if(opt.tinyIcon) { $a.addClass('tinyicon'); $a.css('background-image', 'url(' + (opt.tinyIcon.indexOf('/') != -1 ? opt.tinyIcon : g_staticUrl + '/images/icons/tiny/' + opt.tinyIcon.toLowerCase() + '.gif') + ')'); } else if(opt.icon) { $a.addClass('icon'); $a.css('background-image', 'url(' + opt.icon + ')'); } else if(opt.socketColor && g_file_gems[opt.socketColor]) { $a.addClass('socket-' + g_file_gems[opt.socketColor]); } var className = (opt['class'] || opt.className); if(className) $a.addClass(className); }; // MENU UTILITY FUNCTIONS self.hasMenu = function(node) { var $node = $(node); return $node.data('menu') != null; } self.modifyUrl = function(menuItem, params, opt) { var json = { params: params, opt: opt }; traverseMenuItem(menuItem, function(x) { x.modifyUrl = json; }); // uncomment with breadcrumbs PageTemplate.updateBreadcrumb(); }; self.fixUrls = function(menu, url, opt) { opt = opt || {}; opt.hash = (opt.hash ? '#' + opt.hash : ''); fixUrls(menu, url, opt, 0); }; self.sort = function(menu) // Sort a specific menu { if(hasSeparators(menu)) sortSeparatedMenu(menu); else sortMenu(menu); }; self.sortSubmenus = function(menu, paths) // Sort the submenus of {menu} specified by {paths} { $.each(paths, function(idx, path) { var submenu = self.findItem(menu, path); if(submenu && submenu[MENU_IDX_SUB]) self.sort(submenu[MENU_IDX_SUB]); }); }; self.implode = function(menu, opt) // Return a new menu where items preceded by a heading are merged into a single item w/ a submenu { if(!opt) opt = $.noop; var result = []; var groupedMenu; if(opt.createHeadinglessGroup) { groupedMenu = []; result.push([0, '', null, groupedMenu]); } $.each(menu, function(idx, menuItem) { if(isSeparator(menuItem)) { groupedMenu = []; result.push([0, menuItem[MENU_IDX_NAME], null, groupedMenu]); } else { if(groupedMenu) groupedMenu.push(menuItem); else result.push(menuItem); } }); return result; }; self.findItem = function(menu, path) // Return the menu item specified by {path} in {menu} { return self.getFullPath(menu, path).pop(); }; self.getFullPath = function(menu, path) // Return an array with all the menu items specified by {path} in {menu} { var result = []; for(var i = 0; i < path.length; ++i) { var pos = findItemPosById(menu, path[i]); if(pos != -1) { var menuItem = menu[pos]; menuItem.parentMenu = menu; menu = menuItem[MENU_IDX_SUB]; result.push(menuItem); } } return result; }; self.getItemUrl = function(menuItem) { var url = menuItem[MENU_IDX_URL]; if(!url) return null; var opt = self.getItemOpt(menuItem); if(menuItem.modifyUrl) url = g_modifyUrl(url, menuItem.modifyUrl.params, menuItem.modifyUrl.opt); return url; }; self.getItemOpt = function(menuItem) { if(!menuItem[MENU_IDX_OPT]) menuItem[MENU_IDX_OPT] = {}; return menuItem[MENU_IDX_OPT]; }; self.removeItemById = function(menu, id) { var pos = findItemPosById(menu, id); if(pos != -1) menu.splice(pos, 1); }; /***********/ /* PRIVATE */ /***********/ var DELAY_BEFORESHOW = 25; var DELAY_BEFOREHIDE = 333; var MAX_COLUMNS = 4; // Should match the styles used in Menu.css var SIZE_SHADOW_WIDTH = 6; var SIZE_SHADOW_HEIGHT = 6; var SIZE_BORDER_HEIGHT = 3; var SIZE_MENUITEM_HEIGHT = 26; var inited = false; var timer; var $rootNode; var visibleMenus = {}; var openLinks = {}; var divCache = {}; var menuItemsCache = {}; var nextUniqueId = 0; function init() { if(inited) return; inited = true; // Run a test to get the height of a menu item (in case it's different in some browser/OS combos) var $div = $('').css({left: '-1000px', top: '-1000px'}).appendTo(document.body); var height = $div.children('a').outerHeight(); $div.remove(); if(height > 15) // Safety SIZE_MENUITEM_HEIGHT = height; } function show(menu, $node) { if($rootNode) $rootNode.removeClass('open'); $rootNode = $node; $rootNode.addClass('open'); displayFirstMenu(menu); } function hide() { if($rootNode) { $rootNode.removeClass('open'); $rootNode = null; } hideMenus(0); } function showAtXY(menu, x, y) { clearTimeout(timer); displayFirstMenu(menu, x, y); } function displayFirstMenu(menu, x, y) { closeLinks(0); displayMenu(menu, 0, x, y); hideMenus(1); } function displayMenu(menu, depth, x, y) { init(); beforeShowMenu(menu); var $div = createDiv(depth); var $menuItems = createMenuItems(menu); var $menu = createMenu($menuItems, depth); $div.append($menu); var animated = !isMenuVisible(depth); visibleMenus[depth] = $div; var pos = getMenuPosition($div, depth, x, y); $div.css({ left: pos.x + 'px', top: pos.y + 'px' }); // Hide ads that intersect with the menu // var menuRect = $WH.g_createRect(pos.x, pos.y, $div.width(), $div.height()); // Ads.intersect(menuRect, true); revealDiv($div, animated); } function createDiv(depth) { if(divCache[depth]) { var $div = divCache[depth]; $div.children().detach(); // Similar to $div.empty(), except custom data is preserved. return $div; } var $div = $('') .mouseover(menuDivOver) .mouseleave(menuDivOut) .delegate('a', 'mouseenter', { depth: depth }, menuItemOver) .delegate('a', 'click', menuItemClick); if($WH.isset('g_thottbot') && g_thottbot) $div.hide(); $div.appendTo(document.body); divCache[depth] = $div; return $div; } function createMenuItems(menu) { var uid = getUniqueId(menu); if(menuItemsCache[uid]) return menuItemsCache[uid]; var nextSeparator; // Used to make sure a separator is always followed by a visible item var menuItems = []; $.each(menu, function(idx, menuItem) { if(!isItemVisible(menuItem)) return; $a = createMenuItem(menuItem); if(isSeparator(menuItem)) { nextSeparator = $a; return; } if(nextSeparator) { menuItems.push(nextSeparator); nextSeparator = null; } menuItems.push($a); }); var $menuItems = $(menuItems); menuItemsCache[menu] = $menuItems; return $menuItems; } function createMenuItem(menuItem) { beforeCreateMenuItem(menuItem); var $a = $(''); menuItem.$a = $a; $a.data('menuItem', menuItem); self.linkifyItem(menuItem, $a); self.updateItem(menuItem); // Separator if(isSeparator(menuItem)) { $a.addClass('separator'); $a.text(menuItem[MENU_IDX_NAME]); return $a; } var $span = $(''); $span.text(menuItem[MENU_IDX_NAME]); $span.appendTo($a); // Submenu if(hasSubmenu(menuItem)) $span.addClass('hassubmenu'); return $a; } function createMenu($menuItems, depth) { var $a = $rootNode; var $w = $(window); var nItems = $menuItems.length; var availableHeight = $w.height() - (SIZE_BORDER_HEIGHT * 2) - SIZE_SHADOW_HEIGHT; var nItemsThatCanFit = Math.floor(Math.max(0, availableHeight) / SIZE_MENUITEM_HEIGHT); // 1 column if(nItemsThatCanFit >= nItems) { var $outerDiv = $(''); var $innerDiv = $(''); $menuItems.appendTo($innerDiv); $outerDiv.append($innerDiv); return $outerDiv; } // Multiple columns var nColumns = Math.min(MAX_COLUMNS, Math.ceil(nItems / nItemsThatCanFit)); var nItemsPerColumn = Math.ceil(nItems / nColumns); var nItemsAdded = 0; var nItemsRemaining = nItems; var $holder = $('
'); while(nItemsRemaining > 0) { var $outerDiv = $(''); var $innerDiv = $(''); var nItemsToAdd = Math.min(nItemsRemaining, nItemsPerColumn); var start = nItemsAdded; var end = start + nItemsToAdd; $menuItems.slice(start, end).appendTo($innerDiv); $outerDiv.append($innerDiv); $holder.append($outerDiv); nItemsAdded += nItemsToAdd; nItemsRemaining -= nItemsToAdd; } return $holder; } function getMenuPosition($div, depth, x, y) { if(depth == 0) return getFirstMenuPosition($div, depth, x, y); return getSubmenuPosition($div, depth); } function getFirstMenuPosition($div, depth, x, y) { var viewport = g_getViewport(); var menuWidth = $div.width(); var menuHeight = $div.height(); var menuWidthShadow = menuWidth + SIZE_SHADOW_WIDTH; var menuHeightShadow = menuHeight + SIZE_SHADOW_HEIGHT; var showingAtCursor = (x != null && y != null); if(showingAtCursor) { if(y + menuHeightShadow > viewport.b) // Make sure menu doesn't overflow vertically y = Math.max(viewport.t, viewport.b - menuHeightShadow); // Place along the bottom edge if it does } else { var $a = $rootNode; var offset = $a.offset(); // Place underneath the root node by default x = offset.left y = offset.top + $a.outerHeight(); // Show menu upwards if it's going to be outside the viewport otherwise (only if there's room) if(y + menuHeightShadow > viewport.b && offset.top >= menuHeightShadow) y = offset.top - menuHeightShadow; } if(x + menuWidthShadow > viewport.r) // Make sure menu doesn't overflow horizontally x = Math.max(viewport.l, viewport.r - menuWidthShadow); // Place along the right edge if it does return {x: x, y: y}; } function getSubmenuPosition($div, depth) { var viewport = g_getViewport(); var menuWidth = $div.width(); var menuHeight = $div.height(); var menuWidthShadow = menuWidth + SIZE_SHADOW_WIDTH; var menuHeightShadow = menuHeight + SIZE_SHADOW_HEIGHT; var $a = openLinks[depth - 1]; var offset = $a.offset(); var openToTheLeft = false; // Show to the right of the menu item x = offset.left + $a.outerWidth() - 5; y = offset.top - 2; if(x + menuWidthShadow > viewport.r) // Make sure menu doesn't overflow horizontally openToTheLeft = true; if(openToTheLeft) x = Math.max(viewport.l, offset.left - menuWidth); if(y + menuHeightShadow > viewport.b) // Make sure menu doesn't overflow vertically y = Math.max(viewport.t, viewport.b - menuHeightShadow); // Place along the bottom edge if it does return {x: x, y: y}; } function revealDiv($div, animated) { if(animated) { $div.css({ opacity: '0' }) .show() .animate({ opacity: '1' }, 'fast', null, doneRevealing); } else $div.show(); } function doneRevealing(a) { $(this).css('opacity', ''); // Remove opacity once animation is over to prevent a bug in IE8 } function hideMenus(depth) { while(visibleMenus[depth]) { visibleMenus[depth].stop().hide(); visibleMenus[depth] = null; ++depth; } } function closeLinks(depth) { while(openLinks[depth]) { openLinks[depth].removeClass('open'); openLinks[depth] = null; ++depth; } } function isMenuVisible(depth) { return visibleMenus[depth || 0] != null; } // MENU UTILITY FUNCTIONS function getItemId(menuItem) { return menuItem[MENU_IDX_ID]; } function isSeparator(menuItem) { return menuItem[MENU_IDX_ID] == null; // Separators don't have an ID } function hasSeparators(menu) { return $WH.in_array(menu, true, isSeparator) != -1; } function hasSubmenu(menuItem) { return menuItem[MENU_IDX_SUB] != null; } function findItemPosById(menu, id) { return $WH.in_array(menu, id, getItemId); } function hasPermissions(menuItem) { var opt = self.getItemOpt(menuItem); if(opt.requiredAccess && !User.hasPermissions(opt.requiredAccess)) return false; return true; } function isItemVisible(menuItem) { if(!hasPermissions(menuItem)) return false; if(hasSubmenu(menuItem)) { if(!hasVisibleItems(menuItem[MENU_IDX_SUB])) return false; } return true; } function hasVisibleItems(menu) { return $WH.in_array(menu, true, isSubitemVisible) != -1; } function isSubitemVisible(menuItem) { return !isSeparator(menuItem) && hasPermissions(menuItem); } function getUniqueId(menu) { if(menu.uniqueId == null) menu.uniqueId = nextUniqueId++; return menu.uniqueId; } function traverseMenu(menu, func) { $.each(menu, function(idx, menuItem) { traverseMenuItem(menuItem, func); }); } function traverseMenuItem(menuItem, func) { func(menuItem); if(hasSubmenu(menuItem)) traverseMenu(menuItem[MENU_IDX_SUB], func); } function fixUrls(menu, url, opt, depth) { $.each(menu, function(idx, menuItem) { if(menuItem === undefined) return; if(isSeparator(menuItem)) return; if(menuItem[MENU_IDX_URL] == null) // Don't override if already set menuItem[MENU_IDX_URL] = url + menuItem[MENU_IDX_ID] + opt.hash; if(hasSubmenu(menuItem)) { var accumulate = true; if(opt.useSimpleIds) accumulate = false; else if(opt.useSimpleIdsAfter != null && depth >= opt.useSimpleIdsAfter) accumulate = false; var nextUrl = url; if(accumulate) nextUrl += menuItem[MENU_IDX_ID] + '.'; fixUrls(menuItem[MENU_IDX_SUB], nextUrl, opt, depth + 1); } }); } function sortMenu(menu) { menu.sort(function(a, b) { return $WH.strcmp(a[MENU_IDX_NAME], b[MENU_IDX_NAME]); }); } function sortSeparatedMenu(menu) { // Sort each group separately so headings stay where they are. var implodedMenu = self.implode(menu, { createHeadinglessGroup: true }); $.each(implodedMenu, function(idx, submenu) { sortMenu(submenu[MENU_IDX_SUB]); }); explodeInto(menu, implodedMenu); }; function explodeInto(menu, implodedMenu) // Reverse of implode { menu.splice(0, menu.length); // Clear menu $.each(implodedMenu, function(idx, menuItem) { if(menuItem[MENU_IDX_NAME]) menu.push([, menuItem[MENU_IDX_NAME]]); // Heading $.each(menuItem[MENU_IDX_SUB], function(idx, menuItem) { menu.push(menuItem); }); }); } // EVENTS function beforeCreateMenuItem(menuItem) { var opt = self.getItemOpt(menuItem); if(opt.checkedUrl && location.href.match(opt.checkedUrl)) menuItem.checked = true; } function beforeShowMenu(menu) { if(menu.onBeforeShow) menu.onBeforeShow(menu); $.each(menu, function(idx, menuItem) { var opt = self.getItemOpt(menuItem); if(opt.onBeforeShow) opt.onBeforeShow(menuItem); }); } function rootNodeOver(event) { clearTimeout(timer); var $node = $(this); if(!isMenuVisible()) { // Use a small delay the 1st time to prevent undesired appearances timer = setTimeout(show.bind(null, $node.data('menu'), $node), DELAY_BEFORESHOW); return; } show($node.data('menu'), $node); } function rootNodeOut(event) { clearTimeout(timer); if(isMenuVisible()) timer = setTimeout(hide, DELAY_BEFOREHIDE); } function rootNodeClick(event) { clearTimeout(timer); self.showAtCursor($(this).data('menu'), event); } function menuDivOver(event) { clearTimeout(timer); } function menuDivOut(event) { clearTimeout(timer); timer = setTimeout(hide, DELAY_BEFOREHIDE); } function menuItemOver(event) { clearTimeout(timer); var $a = $(this); var depth = event.data.depth; closeLinks(depth); var menuItem = $a.data('menuItem'); var deepestDepth = depth; if(menuItem && hasSubmenu(menuItem)) { $a.addClass('open'); openLinks[depth] = $a; displayMenu(menuItem[MENU_IDX_SUB], depth + 1); ++deepestDepth; } hideMenus(deepestDepth + 1); } function menuItemClick(event) { var $a = $(this); var menuItem = $a.data('menuItem'); if(!menuItem) return; var opt = self.getItemOpt(menuItem); if(opt.onClick) opt.onClick(); } }; Menu.fixUrls(mn_achievements, '?achievements='); Menu.fixUrls(mn_classes, '?class='); Menu.fixUrls(mn_currencies, '?currencies='); Menu.fixUrls(mn_factions, '?factions='); Menu.fixUrls(mn_items, '?items='); Menu.fixUrls(mn_itemSets, '?itemsets&filter=cl=', { hash: '0-2+1' }); Menu.fixUrls(mn_npcs, '?npcs='); Menu.fixUrls(mn_objects, '?objects='); Menu.fixUrls(mn_petCalc, '?petcalc='); Menu.fixUrls(mn_pets, '?pets='); Menu.fixUrls(mn_quests, '?quests='); Menu.fixUrls(mn_races, '?race='); Menu.fixUrls(mn_spells, '?spells='); Menu.fixUrls(mn_titles, '?titles='); Menu.fixUrls(mn_zones, '?zones='); $(document).ready(function() // Locale is only known later { // if(Locale.getId() == LOCALE_ENUS) // return; Menu.sort(mn_classes); Menu.sort(mn_database); Menu.sortSubmenus(mn_items, [ [4, 1], // Armor > Cloth [4, 2], // Armor > Leather [4, 3], // Armor > Mail [4, 4], // Armor > Plate [1], // Containers [0], // Consumables [16], // Glyphs [7], // Trade Goods [6], // Projectiles [9] // Recipes ]); Menu.sort(mn_itemSets); Menu.sort(mn_npcs); Menu.sort(mn_objects); Menu.sort(mn_talentCalc); Menu.sort(mn_petCalc); Menu.sort(mn_pets); Menu.sort(mn_races); Menu.sort(mn_skills); Menu.sortSubmenus(mn_spells, [ [7], // Abilities [-2], // Talents [-3], // Pet Abilities [11], // Professions [9] // Secondary Skills ]); }); var g_dev = false; var g_locale = { id: 0, name: "enus" }; var g_localTime = new Date(); var g_user = { id: 0, name: "", roles: 0 }; var g_locales = { 0: 'enus', 2: 'frfr', 3: 'dede', 6: 'eses', 8: 'ruru' }; /* Global Profiler-related functions */ function g_cleanCharacterName(name) { return (name.match && name.match(/^[A-Z]/) ? name.charAt(0).toLowerCase() + name.substr(1) : name); } function g_getProfileUrl(profile) { if (profile.region) { // Armory character return '?profile=' + profile.region + '.' + profile.realm + '.' + g_cleanCharacterName(profile.name); } else { // Custom profile return '?profile=' + profile.id; } } function g_getProfileRealmUrl(profile) { return '?profiles=' + profile.region + '.' + profile.realm; } var Icon = { sizes: ['small', 'medium', 'large'], sizes2: [18, 36, 56], premiumOffsets: [[-56, -36], [-56, 0], [0, 0]], create: function(name, size, UNUSED, url, num, qty, noBorder) { var icon = $WH.ce('div'), image = $WH.ce('ins'), tile = $WH.ce('del'); if (size == null) { size = 1; } icon.className = 'icon' + Icon.sizes[size]; $WH.ae(icon, image); if (!noBorder) { $WH.ae(icon, tile); } Icon.setTexture(icon, size, name); if (url) { var a = $WH.ce('a'); a.href = url; if (url.indexOf('wowhead.com') == -1 && url.substr(0, 5) == 'http:') { a.target = "_blank"; } $WH.ae(icon, a); } else if (name) { var _ = icon.firstChild.style; var avatarIcon = (_.backgroundImage.indexOf('/avatars/') != -1); if (!avatarIcon) { icon.onclick = Icon.onClick; var a = $WH.ce('a'); a.href = "javascript:;"; $WH.ae(icon, a); } } Icon.setNumQty(icon, num, qty); return icon; }, createUser: function(avatar, avatarMore, size, url, isPremium, noBorder) { if (avatar == 2) { avatarMore = g_staticUrl + '/uploads/avatars/' + avatarMore + '.jpg'; } var icon = Icon.create(avatarMore, size, null, url, null, null, noBorder); if (isPremium) { icon.className += ' ' + icon.className + (isPremium == 2 ? '-gold' : '-premium'); } if (avatar == 2) { Icon.moveTexture(icon, size, Icon.premiumOffsets[size][0], Icon.premiumOffsets[size][1], true); } return icon; }, setTexture: function(icon, size, name) { if (!name) { return; } var _ = icon.firstChild.style; if (name.indexOf('/') != -1 || name.indexOf('?') != -1) { _.backgroundImage = 'url(' + name + ')'; } else { _.backgroundImage = 'url(' + g_staticUrl + '/images/icons/' + Icon.sizes[size] + '/' + escape(name.toLowerCase()) + '.jpg)'; } Icon.moveTexture(icon, size, 0, 0); }, moveTexture: function(icon, size, x, y, exact) { var _ = icon.firstChild.style; if (x || y) { if (exact) { _.backgroundPosition = x + 'px ' + y + 'px'; } else { _.backgroundPosition = (-x * Icon.sizes2[size]) + 'px ' + ( -y * Icon.sizes2[size]) + 'px'; } } else if (_.backgroundPosition) { _.backgroundPosition = ''; } }, setNumQty: function(icon, num, qty) { var _ = $WH.gE(icon, 'span'); for (var i = 0, len = _.length; i < len; ++i) { if (_[i]) { $WH.de(_[i]); } } if (num != null && ((num > 1 && num < 2147483647) || num.length)) { _ = g_createGlow(num, 'q1'); _.style.right = '0'; _.style.bottom = '0'; _.style.position = 'absolute'; $WH.ae(icon, _); } if (qty != null && qty > 0) { _ = g_createGlow('(' + qty + ')', 'q'); _.style.left = '0'; _.style.top = '0'; _.style.position = 'absolute'; $WH.ae(icon, _); } }, getLink: function(icon) { return $WH.gE(icon, 'a')[0]; }, showIconName: function(x) { if (x.firstChild) { var _ = x.firstChild.style; if (_.backgroundImage.length && (_.backgroundImage.indexOf(g_staticUrl) >= 4 || g_staticUrl == '')) { var start = _.backgroundImage.lastIndexOf('/'), end = _.backgroundImage.indexOf('.jpg'); if (start != -1 && end != -1) { Icon.displayIcon(_.backgroundImage.substring(start + 1, end)); } } } }, onClick: function() { Icon.showIconName(this); }, displayIcon: function(icon) { if (!Dialog.templates.icondisplay) { var w = 364; switch (g_locale.id) { case 6: w = 380; break; case 8: w = 384; break; } Dialog.templates.icondisplay = { title: LANG.icon, width: w, buttons: [['arrow', LANG.original], ['cancel', LANG.close]], fields: [ { id: 'icon', label: LANG.dialog_imagename, required: 1, type: 'text', labelAlign: 'left', compute: function(field, value, form, td) { var wrapper = $WH.ce('div'); td.style.width = '300px'; wrapper.style.position = 'relative'; wrapper.style.cssFloat = 'left'; wrapper.style.paddingRight = '6px'; field.style.width = '200px'; var divIcon = this.iconDiv = $WH.ce('div'); divIcon.style.position = 'absolute'; divIcon.style.top = '-12px'; divIcon.style.right = '-70px'; divIcon.update = function() { setTimeout(function() { field.focus(); field.select(); }, 10); $WH.ee(divIcon); $WH.ae(divIcon, Icon.create(field.value, 2)); }; $WH.ae(divIcon, Icon.create(value, 2)); $WH.ae(wrapper, divIcon); $WH.ae(wrapper, field); $WH.ae(td, wrapper); } }, { id: 'location', label: " ", required: 1, type: 'caption', compute: function(field, value, form, th, tr) { $WH.ee(th); th.style.padding = '3px 3px 0 3px'; th.style.lineHeight = '17px'; th.style.whiteSpace = 'normal'; var wrapper = $WH.ce('div'); wrapper.style.position = 'relative'; wrapper.style.width = '250px'; var span = $WH.ce('span'); var text = LANG.dialog_seeallusingicon; text = text.replace('$1', '' + LANG.types[3][3] + ''); text = text.replace('$2', '' + LANG.types[6][3] + ''); text = text.replace('$3', '' + LANG.types[10][3] + ''); span.innerHTML = text; $WH.ae(wrapper, span); $WH.ae(th, wrapper); } } ], onInit: function(form) { this.updateIcon = this.template.updateIcon.bind(this, form); }, onShow: function(form) { this.updateIcon(); if (location.hash && location.hash.indexOf('#icon') == -1) { this.oldHash = location.hash; } else { this.oldHash = ''; } var hash = '#icon'; // Add icon name on all pages but item, spell and achievement pages (where the name is already available). var nameDisabled = ($WH.isset('g_pageInfo') && g_pageInfo.type && $WH.in_array([3, 6, 10], g_pageInfo.type) == -1); if (!nameDisabled) { hash += ':' + this.data.icon; } location.hash = hash; }, onHide: function(form) { if (this.oldHash) { location.hash = this.oldHash; } else { location.hash = '#.'; } }, updateIcon: function(form) { this.iconDiv.update(); }, onSubmit: function(unused, data, button, form) { if (button == 'arrow') { var win = window.open(g_staticUrl + '/images/icons/large/' + data.icon.toLowerCase() + '.jpg', '_blank'); win.focus(); return false; } return true; } }; } if (!Icon.icDialog) { Icon.icDialog = new Dialog(); } Icon.icDialog.show('icondisplay', {data: {icon: icon}}); }, checkPound: function() { if (location.hash && location.hash.indexOf('#icon') == 0) { var parts = location.hash.split(':'); var icon = false; if (parts.length == 2) { icon = parts[1]; } else if (parts.length == 1 && $WH.isset('g_pageInfo')) { switch (g_pageInfo.type) { case 3: // Item icon = g_items[g_pageInfo.typeId].icon.toLowerCase(); break; case 6: // Spell icon = g_spells[g_pageInfo.typeId].icon.toLowerCase(); break; case 10: // Achievement icon = g_achievements[g_pageInfo.typeId].icon.toLowerCase(); break; } } if (icon) { Icon.displayIcon(icon); } } } }; DomContentLoaded.addEvent(Icon.checkPound); function Rectangle(left, top, width, height) { this.l = left; this.t = top; this.r = left + width; this.b = top + height; } function g_getViewport() { var win = $(window); return new Rectangle(win.scrollLeft(), win.scrollTop(), win.width(), win.height()); } Rectangle.prototype = { intersectWith: function(rect) { var result = !( this.l >= rect.r || rect.l >= this.r || this.t >= rect.b || rect.t >= this.b ); return result; }, contains: function(rect) { var result = ( this.l <= rect.l && this.t <= rect.t && this.r >= rect.r && this.b >= rect.b ); return result; }, containedIn: function(rect) { return rect.contains(this); } }; var RedButton = { create: function(text, enabled, func) { var a = $WH.ce('a'), em = $WH.ce('em'), b = $WH.ce('b'), i = $WH.ce('i'), span = $WH.ce('span'); a.href = 'javascript:;'; a.className = 'button-red'; $WH.ae(b, i); $WH.ae(em, b); $WH.ae(em, span); $WH.ae(a, em); RedButton.setText(a, text); RedButton.enable(a, enabled); RedButton.setFunc(a, func); return a; }, setText: function(button, text) { $WH.st(button.firstChild.childNodes[0].firstChild, text); // em, b, i $WH.st(button.firstChild.childNodes[1], text); // em, span }, enable: function(button, enabled) { if (enabled || enabled == null) { button.className = button.className.replace('button-red-disabled', ''); } else if (button.className.indexOf('button-red-disabled') == -1) { button.className += ' button-red-disabled'; } }, setFunc: function(button, func) { button.onclick = (func ? func: null); } }; var LiveSearch = new function() { var currentTextbox, lastSearch = {}, lastDiv, timer, prepared, container, cancelNext, hasData, summary, selection, LIVESEARCH_DELAY = 500; function setText(textbox, txt) { textbox.value = txt; textbox.selectionStart = textbox.selectionEnd = txt.length; } function colorDiv(div, fromOver) { if (lastDiv) { lastDiv.className = lastDiv.className.replace("live-search-selected", ""); } lastDiv = div; lastDiv.className += " live-search-selected"; selection = div.i; if (!fromOver) { show(); setTimeout(setText.bind(0, currentTextbox, g_getTextContent(div.firstChild.firstChild.childNodes[1])), 1); cancelNext = 1; } } function aOver() { colorDiv(this.parentNode.parentNode, 1); } function isVisible() { if (!container) { return false; } return container.style.display != "none"; } function adjust(fromResize) { if (fromResize == 1 && !isVisible()) { return; } if (currentTextbox == null) { return; } var c = $WH.ac(currentTextbox); container.style.left = (c[0] - 2) + "px"; container.style.top = (c[1] + currentTextbox.offsetHeight + 1) + "px"; container.style.width = currentTextbox.offsetWidth + "px"; } function prepare() { if (prepared) { return; } prepared = 1; container = $WH.ce("div"); container.className = "live-search"; container.style.display = "none"; $WH.ae($WH.ge("layers"), container); $WH.aE(window, "resize", adjust.bind(0, 1)); $WH.aE(document, "click", hide); } function show() { if (container && !isVisible()) { adjust(); container.style.display = ""; } } function hide() { if (container) { container.style.display = "none"; } } function highlight(match) { return "" + match + ""; } function display(textbox, search, suggz, dataz) { prepare(); show(); lastA = null; hasData = 1; selection = null; while (container.firstChild) { $WH.de(container.firstChild); } if (!$WH.Browser.ie6) { $WH.ae(container, $WH.ce("em")); $WH.ae(container, $WH.ce("var")); $WH.ae(container, $WH.ce("strong")); } search = search.replace(/[^a-z0-9\-]/i, " "); search = $WH.trim(search.replace(/\s+/g, " ")); var regex = g_createOrRegex(search); for (var i = 0, len = suggz.length; i < len; ++i) { var pos = suggz[i].lastIndexOf("("); if (pos != -1) { suggz[i] = suggz[i].substr(0, pos - 1); } var type = dataz[i][0], typeId = dataz[i][1], param1 = dataz[i][2], param2 = dataz[i][3], a = $WH.ce("a"), sp = $WH.ce("i"), sp2 = $WH.ce("span"), div = $WH.ce("div"), div2 = $WH.ce("div"); div.i = i; a.onmouseover = aOver; a.href = "?" + g_types[type] + "=" + typeId; if (textbox._append) { a.rel += textbox._append; } if (type == 1 && param1 != null) { div.className += ' live-search-icon-boss'; } if (type == 3 && param2 != null) { a.className += " q" + param2; } else if (type == 4 && param1 != null) { a.className += " q" + param1; } else if (type == 13) { a.className += ' c' + typeId; } if ((type == 3 || type == 6 || type == 9 || type == 10 || type == 13 || type == 14 || type == 15 || type == 17) && param1) { div.className += " live-search-icon"; div.style.backgroundImage = "url(" + g_staticUrl + "/images/icons/small/" + param1.toLowerCase() + ".jpg)"; } else if ((type == 5 || type == 11) && param1 >= 1 && param1 <= 2) { div.className += " live-search-icon-quest-" + (param1 == 1 ? "alliance" : "horde"); } $WH.ae(sp, $WH.ct(LANG.types[type][0])); $WH.ae(a, sp); var buffer = suggz[i]; buffer = buffer.replace(regex, highlight); if (type == 11) { buffer = buffer.replace('%s', '<'+ LANG.name + '>'); } sp2.innerHTML = buffer; $WH.ae(a, sp2); if (type == 6 && param2) { $WH.ae(a, $WH.ct(" (" + param2 + ")")); } $WH.ae(div2, a); $WH.ae(div, div2); $WH.ae(container, div); } } function receive(xhr, opt) { var text = xhr.responseText; if (text.charAt(0) != "[" || text.charAt(text.length - 1) != "]") { return; } var a = eval(text); var search = a[0]; if (search == opt.search) { if (a.length == 8) { display(opt.textbox, search, a[1], a[7]); } else { hide(); } } } function fetch(textbox, search) { var url = "?search=" + $WH.urlencode(search); if (textbox._type) { url += "&json&type=" + textbox._type; } else { url += "&opensearch"; } new Ajax(url, { onSuccess: receive, textbox: textbox, search: search }) } function preFetch(textbox, search) { if (cancelNext) { cancelNext = 0; return; } hasData = 0; if (timer > 0) { clearTimeout(timer); timer = 0; } timer = setTimeout(fetch.bind(0, textbox, search), LIVESEARCH_DELAY); } function cycle(dir) { if (!isVisible()) { if (hasData) { show(); } return; } var firstNode = (container.childNodes[0].nodeName == "EM" ? container.childNodes[3] : container.firstChild); var bakDiv = dir ? firstNode : container.lastChild; if (lastDiv == null) { colorDiv(bakDiv); } else { var div = dir ? lastDiv.nextSibling: lastDiv.previousSibling; if (div) { if (div.nodeName == "STRONG") { div = container.lastChild; } colorDiv(div); } else { colorDiv(bakDiv); } } } function onKeyUp(e) { e = $WH.$E(e); var textbox = e._target; switch (e.keyCode) { case 48: case 96: case 107: case 109: if ($WH.Browser.firefox && e.ctrlKey) { adjust(textbox); break; } break; } var search = $WH.trim(textbox.value.replace(/\s+/g, " ")); if (search == lastSearch[textbox.id]) { return; } lastSearch[textbox.id] = search; if (search.length) { preFetch(textbox, search); } else { hide(); } } function onKeyDown(e) { e = $WH.$E(e); var textbox = e._target; switch (e.keyCode) { case 27: hide(); break; case 38: cycle(0); break; case 40: cycle(1); break } } function onFocus(e) { e = $WH.$E(e); var textbox = e._target; if (textbox != document) { currentTextbox = textbox; } } this.attach = function(textbox) { if (textbox.getAttribute("autocomplete") == "off") { return; } textbox.setAttribute("autocomplete", "off"); $WH.aE(textbox, "focus", onFocus); $WH.aE(textbox, "keyup", onKeyUp); $WH.aE(textbox, "keydown", onKeyDown); }; this.reset = function(textbox) { lastSearch[textbox.id] = null; textbox.value = ""; hasData = 0; hide(); }; this.hide = function() { hide(); } }; var Lightbox = new function() { var overlay, outer, inner, divs = {}, funcs = {}, prepared, lastId; function hookEvents() { $WH.aE(overlay, 'click', hide); $WH.aE(document, 'keydown', onKeyDown); $WH.aE(window, 'resize', onResize); } function unhookEvents() { $WH.dE(overlay, 'click', hide); $WH.dE(document, 'keydown', onKeyDown); $WH.dE(window, 'resize', onResize); } function prepare() { if (prepared) { return; } prepared = 1; var dest = document.body; overlay = $WH.ce('div'); overlay.className = 'lightbox-overlay'; outer = $WH.ce('div'); outer.className = 'lightbox-outer'; inner = $WH.ce('div'); inner.className = 'lightbox-inner'; overlay.style.display = outer.style.display = 'none'; $WH.ae(dest, overlay); $WH.ae(outer, inner); $WH.ae(dest, outer); } function onKeyDown(e) { e = $WH.$E(e); switch (e.keyCode) { case 27: // Escape hide(); break; } } function onResize(fake) { if (fake != 1234) { if (funcs.onResize) { funcs.onResize(); } } overlay.style.height = document.body.offsetHeight + 'px'; } function hide() { if (!prepared) { return; } unhookEvents(); if (funcs.onHide) { funcs.onHide(); } overlay.style.display = outer.style.display = 'none'; g_enableScroll(true); } function reveal() { overlay.style.display = outer.style.display = divs[lastId].style.display = ''; Lightbox.setSize(inner.offsetWidth, inner.offsetHeight, 1); } this.setSize = function(w, h, auto) { if (!$WH.Browser.ie) { inner.style.visibility = 'hidden'; } if (!auto) { inner.style.width = w + 'px'; if (h) { inner.style.height = h + 'px'; } } inner.style.left = -parseInt(w / 2) + 'px'; if (h) { inner.style.top = -parseInt(h / 2) + 'px'; } inner.style.visibility = 'visible'; }; this.show = function(id, _funcs, opt) { funcs = _funcs || {}; prepare(); hookEvents(); if (lastId != id && divs[lastId] != null) { divs[lastId].style.display = 'none'; } lastId = id; var first = 0, d; if (divs[id] == null) { first = 1; d = $WH.ce('div'); $WH.ae(inner, d); divs[id] = d; } else { d = divs[id]; } if (funcs.onShow) { funcs.onShow(d, first, opt); } onResize(1234); reveal(); g_enableScroll(false); }; this.reveal = function() { reveal(); }; this.hide = function() { hide(); }; this.isVisible = function() { return (overlay && overlay.style.display != 'none'); } }; var ModelViewer = new function() { this.validSlots = [1,3,4,5,6,7,8,9,10,13,14,15,16,17,19,20,21,22,23,25,26]; this.slotMap = {1: 1, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 13: 21, 14: 22, 15: 22, 16: 16, 17: 21, 19: 19, 20: 5, 21: 21, 22: 22, 23: 22, 25: 21, 26: 21}; var model, modelType, equipList = [], optBak, _w, _o, _z, modelDiv, raceSel1, raceSel2, sexSel, oldHash, mode, readExtraPound, races = [ {id: 10, name: g_chr_races[10], model: 'bloodelf' }, {id: 11, name: g_chr_races[11], model: 'draenei' }, {id: 3, name: g_chr_races[3], model: 'dwarf' }, {id: 7, name: g_chr_races[7], model: 'gnome' }, {id: 1, name: g_chr_races[1], model: 'human' }, {id: 4, name: g_chr_races[4], model: 'nightelf' }, {id: 2, name: g_chr_races[2], model: 'orc' }, {id: 6, name: g_chr_races[6], model: 'tauren' }, {id: 8, name: g_chr_races[8], model: 'troll' }, {id: 5, name: g_chr_races[5], model: 'scourge' } ], sexes = [ {id: 0, name: LANG.male, model: 'male' }, {id: 1, name: LANG.female, model: 'female' } ]; function clear() { _w.style.display = 'none'; _o.style.display = 'none'; _z.style.display = 'none'; } function getRaceSex() { var race, sex; if (raceSel1.style.display == '') { race = (raceSel1.selectedIndex >= 0 ? raceSel1.options[raceSel1.selectedIndex].value : ''); } else { race = (raceSel2.selectedIndex >= 0 ? raceSel2.options[raceSel2.selectedIndex].value : ''); } sex = (sexSel.selectedIndex >= 0 ? sexSel.options[sexSel.selectedIndex].value : 0); return { r: race, s: sex }; } function isRaceSexValid(race, sex) { return (!isNaN(race) && race > 0 && $WH.in_array(races, race, function(x) { return x.id; }) != -1 && !isNaN(sex) && sex >= 0 && sex <= 1); } function render() { if (mode == 2 && !f()) { mode = 0; } if (mode == 2) { var G = ''; if (modelType == 16 && equipList.length) { G += ''; } G += ''; _z.innerHTML = G; _z.style.display = ''; } else { if (mode == 1) { var G = ''; if (modelType == 16 && equipList.length) { G += ''; } G += ''; _o.innerHTML = G; _o.style.display = ''; } else { var flashVars = { model: model, modelType: modelType, contentPath: 'http://static.wowhead.com/modelviewer/' // contentPath: g_staticUrl + '/modelviewer/' }; var params = { quality: 'high', allowscriptaccess: 'always', allowfullscreen: true, menu: false, bgcolor: '#181818', wmode: 'direct' }; var attributes = { }; if (modelType == 16 && equipList.length) { flashVars.equipList = equipList.join(','); } // swfobject.embedSWF(g_staticUrl + '/modelviewer/ZAMviewerfp11.swf', 'modelviewer-generic', '600', '400', "11.0.0", g_staticUrl + '/modelviewer/expressInstall.swf', flashVars, params, attributes); swfobject.embedSWF('http://static.wowhead.com/modelviewer/ZAMviewerfp11.swf', 'modelviewer-generic', '600', '400', '10.0.0', 'http://static.wowhead.com/modelviewer/expressInstall.swf', flashVars, params, attributes); _w.style.display = ''; } } var foo = getRaceSex(), race = foo.r, sex = foo.s; if (!optBak.noPound) { var url = '#modelviewer'; var foo = $WH.ge('view3D-button'); if (!foo) { switch (optBak.type) { case 1: // npc url += ':1:' + optBak.displayId + ':' + (optBak.humanoid | 0); break; case 2: // object url += ':2:' + optBak.displayId; break; case 3: // item url += ':3:' + optBak.displayId + ':' + (optBak.slot | 0); break; case 4: // item set url += ':4:' + equipList.join(';'); break; } } if (race && sex) { url += ':' + race + '+' + sex; } else { url += ':'; } if (optBak.extraPound != null) { url += ':' + optBak.extraPound; } location.replace($WH.rtrim(url, ':')); } } function onSelChange() { var foo = getRaceSex(), race = foo.r, sex = foo.s; if (!race) { if (sexSel.style.display == 'none') { return; } sexSel.style.display = 'none'; model = equipList[1]; switch (optBak.slot) { case 1: modelType = 2; // Helm break; case 3: modelType = 4; // Shoulder break; default: modelType = 1; // Item } } else { if (sexSel.style.display == 'none') { sexSel.style.display = ''; } var foo = function(x) { return x.id; }; var raceIndex = $WH.in_array(races, race, foo); var sexIndex = $WH.in_array(sexes, sex, foo); if (raceIndex != -1 && sexIndex != -1) { model = races[raceIndex].model + sexes[sexIndex].model; modelType = 16; } } clear(); render(); } function j(newMode) { if (newMode == mode) { return; } g_setSelectedLink(this, 'modelviewer-mode'); clear(); if (mode == null) { mode = newMode; setTimeout(render, 50); } else { mode = newMode; $WH.sc('modelviewer_mode', 7, newMode, '/', location.hostname); // $WH.sc('modelviewer_mode', 7, newMode, '/', '.wowhead.com'); render(); } } function initRaceSex(allowNoRace, opt) { var race = -1, sex = -1, sel, offset; if (opt.race != null && opt.sex != null) { race = opt.race; sex = opt.sex; modelDiv.style.display = 'none'; allowNoRace = 0; } else { modelDiv.style.display = ''; } if (race == -1 && sex == -1) { if (location.hash) { var matches = location.hash.match(/modelviewer:.*?([0-9]+)\+([0-9]+)/); if (matches != null) { if (isRaceSexValid(matches[1], matches[2])) { race = matches[1]; sex = matches[2]; sexSel.style.display = ''; } } } } if (allowNoRace) { sel = raceSel1; offset = 1; raceSel1.style.display = ''; raceSel1.selectedIndex = -1; raceSel2.style.display = 'none'; if (sex == -1) { sexSel.style.display = 'none'; } } else { if (race == -1 && sex == -1) { var cooRace = (g_user && g_user.settings ? g_user.settings.modelrace: 1), cooSex = (g_user && g_user.settings ? g_user.settings.modelgender - 1 : 0); if (isRaceSexValid(cooRace, cooSex)) { race = cooRace; sex = cooSex; } else { // Default race = 1; // Human sex = 0; // Male } } sel = raceSel2; offset = 0; raceSel1.style.display = 'none'; raceSel2.style.display = ''; sexSel.style.display = ''; } if (sex != -1) { sexSel.selectedIndex = sex; } if (race != -1 && sex != -1) { var foo = function(x) { return x.id; }; var raceIndex = $WH.in_array(races, race, foo); var sexIndex = $WH.in_array(sexes, sex, foo); if (raceIndex != -1 && sexIndex != -1) { model = races[raceIndex].model + sexes[sexIndex].model; modelType = 16; raceIndex += offset; sel.selectedIndex = raceIndex; sexSel.selectedIndex = sexIndex; } } } function f() { var E = navigator.mimeTypes['application/x-zam-wowmodel']; if (E) { var D = E.enabledPlugin; if (D) { return true } } return false } function onHide() { if (!optBak.noPound) { if (!optBak.fromTag && oldHash && oldHash.indexOf('modelviewer') == -1) { location.replace(oldHash); } else { location.replace('#.'); } } if (optBak.onHide) { optBak.onHide(); } } function onShow(dest, first, opt) { var G, E; if (!opt.displayAd || g_user.premium) { Lightbox.setSize(620, 452); } else { Lightbox.setSize(749, 546); } if (first) { dest.className = 'modelviewer'; var screen = $WH.ce('div'); _w = $WH.ce('div'); _o = $WH.ce('div'); _z = $WH.ce('div'); var flashDiv = $WH.ce('div'); flashDiv.id = 'modelviewer-generic'; $WH.ae(_w, flashDiv); screen.className = 'modelviewer-screen'; _w.style.display = _o.style.display = _z.style.display = 'none'; $WH.ae(screen, _w); $WH.ae(screen, _o); $WH.ae(screen, _z); var screenbg = $WH.ce('div'); screenbg.style.backgroundColor = '#181818'; screenbg.style.margin = '0'; $WH.ae(screenbg, screen); $WH.ae(dest, screenbg); G = $WH.ce('a'), E = $WH.ce('a'); G.className = 'modelviewer-help'; G.href = '?help=modelviewer'; G.target = '_blank'; $WH.ae(G, $WH.ce('span')); E.className = 'modelviewer-close'; E.href = 'javascript:;'; E.onclick = Lightbox.hide; $WH.ae(E, $WH.ce('span')); $WH.ae(dest, E); $WH.ae(dest, G); var N = $WH.ce('div'), F = $WH.ce('span'), G = $WH.ce('a'), E = $WH.ce('a'); N.className = 'modelviewer-quality'; G.href = E.href = 'javascript:;'; $WH.ae(G, $WH.ct('Flash')); $WH.ae(E, $WH.ct('Java')); G.onclick = j.bind(G, 0); E.onclick = j.bind(E, 1); $WH.ae(F, G); $WH.ae(F, $WH.ct(' ' + String.fromCharCode(160))); $WH.ae(F, E); if (f()) { var D = $WH.ce('a'); D.href = 'javascript:;'; $WH.ae(D, $WH.ct('Plugin')); D.onclick = j.bind(D, 2); $WH.ae(F, $WH.ct(' ' + String.fromCharCode(160))); $WH.ae(F, D) } $WH.ae(N, $WH.ce('div')); $WH.ae(N, F); $WH.ae(dest, N); modelDiv = $WH.ce('div'); modelDiv.className = 'modelviewer-model'; var foo = function(a, b) { return $WH.strcmp(a.name, b.name); }; races.sort(foo); sexes.sort(foo); raceSel1 = $WH.ce('select'); raceSel2 = $WH.ce('select'); sexSel = $WH.ce('select'); raceSel1.onchange = raceSel2.onchange = sexSel.onchange = onSelChange; $WH.ae(raceSel1, $WH.ce('option')); for (var i = 0, len = races.length; i < len; ++i) { var o = $WH.ce('option'); o.value = races[i].id; $WH.ae(o, $WH.ct(races[i].name)); $WH.ae(raceSel1, o); } for (var i = 0, len = races.length; i < len; ++i) { var o = $WH.ce('option'); o.value = races[i].id; $WH.ae(o, $WH.ct(races[i].name)); $WH.ae(raceSel2, o); } for (var i = 0, len = sexes.length; i < len; ++i) { var o = $WH.ce('option'); o.value = sexes[i].id; $WH.ae(o, $WH.ct(sexes[i].name)); $WH.ae(sexSel, o); } sexSel.style.display = 'none'; $WH.ae(modelDiv, $WH.ce('div')); $WH.ae(modelDiv, raceSel1); $WH.ae(modelDiv, raceSel2); $WH.ae(modelDiv, sexSel); $WH.ae(dest, modelDiv); d = $WH.ce('div'); d.className = 'clear'; $WH.ae(dest, d); } switch (opt.type) { case 1: // NPC modelDiv.style.display = 'none'; if (opt.humanoid) { modelType = 32; // Humanoid NPC } else { modelType = 8; // NPC } model = opt.displayId; break; case 2: // Object modelDiv.style.display = 'none'; modelType = 64; // Object model = opt.displayId; break; case 3: // Item equipList = [opt.slot, opt.displayId]; if ($WH.in_array([4, 5, 6, 7, 8, 9, 10, 16, 19, 20], opt.slot) != -1) { initRaceSex(0, opt) } else { switch (opt.slot) { case 1: modelType = 2; // Helm break; case 3: modelType = 4; // Shoulder break; default: modelType = 1; // Item } model = opt.displayId; initRaceSex(1, opt); } break; case 4: // Item Set equipList = opt.equipList; initRaceSex(0, opt) } if (first) { if ($WH.gc('modelviewer_mode') == '2' && f()) { D.onclick() } else { if ($WH.gc('modelviewer_mode') == '1') { E.onclick() } else { G.onclick() } } } else { clear(); setTimeout(render, 1); } oldHash = location.hash; } this.checkPound = function() { if (location.hash && location.hash.indexOf('#modelviewer') == 0) { var parts = location.hash.split(':'); if (parts.length >= 3) { parts.shift(); // - #modelviewer var type = parseInt(parts.shift()); var opt = { type: type }; switch (type) { case 1: // npc opt.displayId = parseInt(parts.shift()); var humanoid = parseInt(parts.shift()); if (humanoid == 1) { opt.humanoid = 1; } break; case 2: // object opt.displayId = parseInt(parts.shift()); break; case 3: // item opt.displayId = parseInt(parts.shift()); opt.slot = parseInt(parts.shift()); break; case 4: // item set var list = parts.shift(); opt.equipList = list.split(';'); break; } if (opt.displayId || opt.equipList) { ModelViewer.show(opt); } if (readExtraPound != null) { if (parts.length > 0 && parts[parts.length - 1]) { readExtraPound(parts[parts.length - 1]); } } } else if (readExtraPound != null && parts.length == 2 && parts[1]) { readExtraPound(parts[1]); } else { var foo = $WH.ge('view3D-button'); if (foo) { foo.onclick(); } } } }; this.addExtraPound = function(func) { readExtraPound = func; }; this.show = function(opt) { optBak = opt; Lightbox.show('modelviewer', { onShow: onShow, onHide: onHide }, opt); }; DomContentLoaded.addEvent(this.checkPound) }; var g_screenshots = {}; var ScreenshotViewer = new function() { var screenshots, pos, imgWidth, imgHeight, scale, desiredScale, oldHash, mode = 0, collectionId, container, screen, imgDiv, aPrev, aNext, aCover, aOriginal, divFrom, divCaption, loadingImage, lightboxComponents; function computeDimensions(captionExtraHeight) { var screenshot = screenshots[pos]; var availHeight = Math.max(50, Math.min(618, $WH.g_getWindowSize().h - 72 - captionExtraHeight)); if (mode != 1 || screenshot.id || screenshot.resize) { desiredScale = Math.min(772 / screenshot.width, 618 / screenshot.height); scale = Math.min(772 / screenshot.width, availHeight / screenshot.height); } else { desiredScale = scale = 1; } if (desiredScale > 1) { desiredScale = 1; } if (scale > 1) { scale = 1; } imgWidth = Math.round(scale * screenshot.width); imgHeight = Math.round(scale * screenshot.height); var lbWidth = Math.max(480, imgWidth); Lightbox.setSize(lbWidth + 20, imgHeight + 52 + captionExtraHeight); if ($WH.Browser.ie6) { screen.style.width = lbWidth + 'px'; if (screenshots.length > 1) { aPrev.style.height = aNext.style.height = imgHeight + 'px' } else { aCover.style.height = imgHeight + 'px' } } if (captionExtraHeight) { imgDiv.firstChild.width = imgWidth; imgDiv.firstChild.height = imgHeight; } } function getPound(pos) { var screenshot = screenshots[pos], buff = '#screenshots:'; if (mode == 0) { buff += 'id=' + screenshot.id; } else { buff += collectionId + ':' + (pos + 1); } return buff; } function render(resizing) { if (resizing && (scale == desiredScale) && $WH.g_getWindowSize().h > container.offsetHeight) { return; } container.style.visibility = 'hidden'; var screenshot = screenshots[pos], resized = (screenshot.width > 772 || screenshot.height > 618); computeDimensions(0); var url = (screenshot.url ? screenshot.url: g_staticUrl + '/uploads/screenshots/' + (resized ? 'resized/': 'normal/') + screenshot.id + '.jpg'); var html = ' 1); if (hasFrom1) { var postedOn = new Date(screenshot.date), elapsed = (g_serverTime - postedOn) / 1000; var a = divFrom.firstChild.childNodes[1]; a.href = '?user=' + screenshot.user; a.innerHTML = screenshot.user; var s = divFrom.firstChild.childNodes[3]; $WH.ee(s); Listview.funcBox.coFormatDate(s, elapsed, postedOn); divFrom.firstChild.style.display = ''; } else { divFrom.firstChild.style.display = 'none'; } var s = divFrom.childNodes[1]; $WH.ee(s); if (screenshot.user) { if (hasFrom1) { $WH.ae(s, $WH.ct(' ' + LANG.dash + ' ')); } var a = $WH.ce('a'); a.href = 'javascript:;'; a.onclick = ContactTool.show.bind(ContactTool, { mode: 3, screenshot: screenshot }); a.className = 'report-icon' g_addTooltip(a, LANG.report_tooltip, 'q2'); $WH.ae(a, $WH.ct(LANG.report)); $WH.ae(s, a); } s = divFrom.childNodes[2]; if (hasFrom2) { var buff = ''; if (screenshot.user) { buff = LANG.dash; } buff += (pos + 1) + LANG.lvpage_of + screenshots.length; s.innerHTML = buff; s.style.display = ''; } else { s.style.display = 'none'; } divFrom.style.display = (hasFrom1 || hasFrom2 ? '': 'none'); var hasCaption = (screenshot.caption != null && screenshot.caption.length); var hasSubject = (screenshot.subject != null && screenshot.subject.length && screenshot.type && screenshot.typeId); if (hasCaption || hasSubject) { var html = ''; if (hasSubject) { html += LANG.types[screenshot.type][0] + LANG.colon; html += ''; html += screenshot.subject; html += ''; } if (hasCaption) { if (hasSubject) { html += LANG.dash; } html += (screenshot.noMarkup ? screenshot.caption : Markup.toHtml(screenshot.caption, { mode: Markup.MODE_SIGNATURE })); } divCaption.innerHTML = html; divCaption.style.display = ''; } else { divCaption.style.display = 'none'; } if (screenshots.length > 1) { aPrev.href = getPound(peekPos(-1)); aNext.href = getPound(peekPos(1)); aPrev.style.display = aNext.style.display = ''; aCover.style.display = 'none'; } else { aPrev.style.display = aNext.style.display = 'none'; aCover.style.display = ''; } location.replace(getPound(pos)); } Lightbox.reveal(); if (divCaption.offsetHeight > 18) { computeDimensions(divCaption.offsetHeight - 18); } container.style.visibility = 'visible'; } function peekPos(change) { var foo = pos; foo += change; if (foo < 0) { foo = screenshots.length - 1; } else if (foo >= screenshots.length) { foo = 0; } return foo; } function prevScreenshot() { pos = peekPos(-1); onRender(); return false; } function nextScreenshot() { pos = peekPos(1); onRender(); return false; } function onKeyUp(e) { e = $WH.$E(e); switch (e.keyCode) { case 37: // Left prevScreenshot(); break; case 39: // Right nextScreenshot(); break; } } function onResize() { render(1); } function onHide() { cancelImageLoading(); if (screenshots.length > 1) { $WH.dE(document, 'keyup', onKeyUp); } if (oldHash && mode == 0) { if (oldHash.indexOf(':id=') != -1) { oldHash = '#screenshots'; } location.replace(oldHash); } else { location.replace('#.'); } } function onShow(dest, first, opt) { if (typeof opt.screenshots == 'string') { screenshots = g_screenshots[opt.screenshots]; mode = 1; collectionId = opt.screenshots; } else { screenshots = opt.screenshots; mode = 0; collectionId = null; } container = dest; pos = 0; if (opt.pos && opt.pos >= 0 && opt.pos < screenshots.length) { pos = opt.pos; } if (first) { dest.className = 'screenshotviewer'; screen = $WH.ce('div'); screen.className = 'screenshotviewer-screen'; aPrev = $WH.ce('a'); aNext = $WH.ce('a'); aPrev.className = 'screenshotviewer-prev'; aNext.className = 'screenshotviewer-next'; aPrev.href = 'javascript:;'; aNext.href = 'javascript:;'; var foo = $WH.ce('span'); $WH.ae(foo, $WH.ce('b')); // var b = $WH.ce('b'); // $WH.ae(b, $WH.ct(LANG.previous)); // $WH.ae(foo, b); $WH.ae(aPrev, foo); var foo = $WH.ce('span'); $WH.ae(foo, $WH.ce('b')); // var b = $WH.ce('b'); // $WH.ae(b, $WH.ct(LANG.next)); // $WH.ae(foo, b); $WH.ae(aNext, foo); aPrev.onclick = prevScreenshot; aNext.onclick = nextScreenshot; aCover = $WH.ce('a'); aCover.className = 'screenshotviewer-cover'; aCover.href = 'javascript:;'; aCover.onclick = Lightbox.hide; var foo = $WH.ce('span'); $WH.ae(foo, $WH.ce('b')); // var b = $WH.ce('b'); // $WH.ae(b, $WH.ct(LANG.close)); // $WH.ae(foo, b); $WH.ae(aCover, foo); if ($WH.Browser.ie6) { $WH.ns(aPrev); $WH.ns(aNext); aPrev.onmouseover = aNext.onmouseover = aCover.onmouseover = function() { this.firstChild.style.display = 'block'; }; aPrev.onmouseout = aNext.onmouseout = aCover.onmouseout = function() { this.firstChild.style.display = ''; }; } $WH.ae(screen, aPrev); $WH.ae(screen, aNext); $WH.ae(screen, aCover); imgDiv = $WH.ce('div'); $WH.ae(screen, imgDiv); $WH.ae(dest, screen); var aClose = $WH.ce('a'); aClose.className = 'screenshotviewer-close'; // aClose.className = 'dialog-x'; aClose.href = 'javascript:;'; aClose.onclick = Lightbox.hide; $WH.ae(aClose, $WH.ce('span')); // $WH.ae(aClose, $WH.ct(LANG.close)); $WH.ae(dest, aClose); aOriginal = $WH.ce('a'); aOriginal.className = 'screenshotviewer-original'; // aOriginal.className = 'dialog-arrow'; aOriginal.href = 'javascript:;'; aOriginal.target = '_blank'; $WH.ae(aOriginal, $WH.ce('span')); // $WH.ae(aOriginal, $WH.ct(LANG.original)); $WH.ae(dest, aOriginal); divFrom = $WH.ce('div'); divFrom.className = 'screenshotviewer-from'; var sp = $WH.ce('span'); $WH.ae(sp, $WH.ct(LANG.lvscreenshot_from)); $WH.ae(sp, $WH.ce('a')); $WH.ae(sp, $WH.ct(' ')); $WH.ae(sp, $WH.ce('span')); $WH.ae(divFrom, sp); $WH.ae(divFrom, $WH.ce('span')); $WH.ae(divFrom, $WH.ce('span')); $WH.ae(dest, divFrom); divCaption = $WH.ce('div'); divCaption.className = 'screenshotviewer-caption'; $WH.ae(dest, divCaption); var d = $WH.ce('div'); d.className = 'clear'; $WH.ae(dest, d); } oldHash = location.hash; if (screenshots.length > 1) { $WH.aE(document, 'keyup', onKeyUp); } onRender(); } function onRender() { var screenshot = screenshots[pos]; if (!screenshot.width || !screenshot.height) { if (loadingImage) { loadingImage.onload = null; loadingImage.onerror = null; } else { container.className = ''; lightboxComponents = []; while (container.firstChild) { lightboxComponents.push(container.firstChild); $WH.de(container.firstChild); } } var lightboxTimer = setTimeout(function() { screenshot.width = 126; screenshot.height = 22; computeDimensions(0); screenshot.width = null; screenshot.height = null; var div = $WH.ce('div'); div.style.margin = '0 auto'; div.style.width = '126px'; var img = $WH.ce('img'); img.src = g_staticUrl + '/template/images/progress-anim.gif'; img.width = 126; img.height = 22; $WH.ae(div, img); $WH.ae(container, div); Lightbox.reveal(); container.style.visiblity = 'visible'; }, 150); loadingImage = new Ima$WH.ge(); loadingImage.onload = (function(screen, timer) { clearTimeout(timer); screen.width = this.width; screen.height = this.height; loadingImage = null; restoreLightbox(); render(); }).bind(loadingImage, screenshot, lightboxTimer); loadingImage.onerror = (function(timer) { clearTimeout(timer); loadingImage = null; Lightbox.hide(); restoreLightbox(); }).bind(loadingImage, lightboxTimer); loadingImage.src = (screenshot.url ? screenshot.url : g_staticUrl + '/uploads/screenshots/normal/' + screenshot.id + '.jpg'); } else { render(); } } function cancelImageLoading() { if (!loadingImage) { return; } loadingImage.onload = null; loadingImage.onerror = null; loadingImage = null; restoreLightbox(); } function restoreLightbox() { if (!lightboxComponents) { return; } $WH.ee(container); container.className = 'screenshotviewer'; for (var i = 0; i < lightboxComponents.length; ++i) $WH.ae(container, lightboxComponents[i]); lightboxComponents = null; } this.checkPound = function() { if (location.hash && location.hash.indexOf('#screenshots') == 0) { if (!g_listviews['screenshots']) { // Standalone screenshot viewer var parts = location.hash.split(':'); if (parts.length == 3) { var collection = g_screenshots[parts[1]], p = parseInt(parts[2]); if (collection && p >= 1 && p <= collection.length) { ScreenshotViewer.show({ screenshots: parts[1], pos: p - 1 }); } } } } } this.show = function(opt) { Lightbox.show('screenshotviewer', { onShow: onShow, onHide: onHide, onResize: onResize }, opt); } DomContentLoaded.addEvent(this.checkPound) }; var Dialog = function() { var _self = this, _template, _onSubmit = null, _templateName, _funcs = {}, _data, _inited = false, _form = $WH.ce('form'), _elements = {}; _form.onsubmit = function() { _processForm(); return false }; this.show = function(template, opt) { if (template) { _templateName = template; _template = Dialog.templates[_templateName]; _self.template = _template; } else { return; } if (_template.onInit && !_inited) { (_template.onInit.bind(_self, _form, opt))(); } if (opt.onBeforeShow) { _funcs.onBeforeShow = opt.onBeforeShow.bind(_self, _form); } if (_template.onBeforeShow) { _template.onBeforeShow = _template.onBeforeShow.bind(_self, _form); } if (opt.onShow) { _funcs.onShow = opt.onShow.bind(_self, _form); } if (_template.onShow) { _template.onShow = _template.onShow.bind(_self, _form); } if (opt.onHide) { _funcs.onHide = opt.onHide.bind(_self, _form); } if (_template.onHide) { _template.onHide = _template.onHide.bind(_self, _form); } if (opt.onSubmit) { _funcs.onSubmit = opt.onSubmit; } if (_template.onSubmit) _onSubmit = _template.onSubmit.bind(_self, _form); if (opt.data) { _inited = false; _data = {}; $WH.cO(_data, opt.data); } _self.data = _data; Lightbox.show('dialog-' + _templateName, { onShow: _onShow, onHide: _onHide }); }; this.getValue = function(id) { return _getValue(id); }; this.setValue = function(id, value) { _setValue(id, value); }; this.getSelectedValue = function(id) { return _getSelectedValue(id); }; this.getCheckedValue = function(id) { return _getCheckedValue(id); }; function _onShow(dest, first) { if (first || !_inited) { _initForm(dest); } if (_template.onBeforeShow) { _template.onBeforeShow(); } if (_funcs.onBeforeShow) { _funcs.onBeforeShow(); } Lightbox.setSize(_template.width, _template.height); dest.className = 'dialog'; _updateForm(); if (_template.onShow) { _template.onShow(); } if (_funcs.onShow) { _funcs.onShow(); } } function _initForm(dest) { $WH.ee(dest); $WH.ee(_form); var container = $WH.ce('div'); container.className = 'text'; $WH.ae(dest, container); $WH.ae(container, _form); if (_template.title) { var h = $WH.ce('h1'); $WH.ae(h, $WH.ct(_template.title)); $WH.ae(_form, h); } var t = $WH.ce('table'), tb = $WH.ce('tbody'), mergeCell = false; $WH.ae(t, tb); $WH.ae(_form, t); for (var i = 0, len = _template.fields.length; i < len; ++i) { var field = _template.fields[i], element; if (!mergeCell) { tr = $WH.ce('tr'); th = $WH.ce('th'); td = $WH.ce('td'); } field.__tr = tr; if (_data[field.id] == null) { _data[field.id] = (field.value ? field.value: ''); } var options; if (field.options) { options = []; if (field.optorder) { $WH.cO(options, field.optorder); } else { for (var j in field.options) { options.push(j); } } if (field.sort) { options.sort(function(a, b) { return field.sort * $WH.strcmp(field.options[a], field.options[b]); }); } } switch (field.type) { case 'caption': th.colSpan = 2; th.style.textAlign = 'left'; th.style.padding = 0; if (field.compute) { (field.compute.bind(_self, null, _data[field.id], _form, th, tr))(); } else if (field.label) { $WH.ae(th, $WH.ct(field.label)); } $WH.ae(tr, th); $WH.ae(tb, tr); continue; break; case 'textarea': var f = element = $WH.ce('textarea'); f.name = field.id; if (field.disabled) { f.disabled = true; } f.rows = field.size[0]; f.cols = field.size[1]; td.colSpan = 2; if (field.label) { th.colSpan = 2; th.style.textAlign = 'left'; th.style.padding = 0; td.style.padding = 0; $WH.ae(th, $WH.ct(field.label)); $WH.ae(tr, th); $WH.ae(tb, tr); tr = $WH.ce('tr'); } $WH.ae(td, f); break; case 'select': var f = element = $WH.ce('select'); f.name = field.id; if (field.size) { f.size = field.size; } if (field.disabled) { f.disabled = true; } if (field.multiple) { f.multiple = true; } for (var j = 0, len2 = options.length; j < len2; ++j) { var o = $WH.ce('option'); o.value = options[j]; $WH.ae(o, $WH.ct(field.options[options[j]])); $WH.ae(f, o) } $WH.ae(td, f); break; case 'dynamic': td.colSpan = 2; td.style.textAlign = 'left'; td.style.padding = 0; if (field.compute) (field.compute.bind(_self, null, _data[field.id], _form, td, tr))(); $WH.ae(tr, td); $WH.ae(tb, tr); element = td; break; case 'checkbox': case 'radio': var k = 0; element = []; for (var j = 0, len2 = options.length; j < len2; ++j) { var s = $WH.ce('span'), f, l, uniqueId = 'sdfler46' + field.id + '-' + options[j]; if (j > 0 && !field.noInputBr) { $WH.ae(td, $WH.ce('br')); } if ($WH.Browser.ie6 && field.type == 'radio') { l = $WH.ce("