function $(C) {
    if (arguments.length > 1) {
        var D = [];
        for (var B = 0, A = arguments.length; B < A; ++B) {
            D.push($(arguments[B]))
        }
        return D
    }
    if (typeof C == "string") {
        C = ge(C)
    }
    return C
}

function $E(A) {
    if (!A) {
        A = event
    }
    A._button = A.which ? A.which : A.button;
    A._target = A.target ? A.target : A.srcElement;
    return A
}

function $A(B) {
    var D = [];
    for (var C = 0, A = B.length; C < A; ++C) {
        D.push(B[C])
    }
    return D
}
Function.prototype.bind = function () {
    var A = this,
        C = $A(arguments),
        B = C.shift();
    return function () {
        return A.apply(B, C.concat($A(arguments)))
    }
};

function strcmp(B, A) {
    if (B == A) {
        return 0
    }
    if (B == null) {
        return -1
    }
    if (A == null) {
        return 1
    }
    return B < A ? -1 : 1
}

function trim(A) {
    return A.replace(/(^\s*|\s*$)/g, "")
}

function rtrim(B, C) {
    var A = B.length;
    while (--A > 0 && B.charAt(A) == C) {}
    B = B.substring(0, A + 1);
    if (B == C) {
        B = ""
    }
    return B
}

function sprintf(C) {
    for (var B = 1, A = arguments.length; B < A; ++B) {
        C = C.replace("$" + B, arguments[B])
    }
    return C
}

function str_replace(C, B, A) {
    while (C.indexOf(B) != -1) {
        C = C.replace(B, A)
    }
    return C
}

function urlencode(A) {
    A = encodeURIComponent(A);
    A = str_replace(A, "+", "%2B");
    return A
}

function number_format(A) {
    A = "" + parseInt(A);
    if (A.length <= 3) {
        return A
    }
    return number_format(A.substr(0, A.length - 3)) + "," + A.substr(A.length - 3)
}

function in_array(B, E, F, D) {
    if (B == null) {
        return -1
    }
    if (F) {
        return in_arrayf(B, E, F, D)
    }
    for (var C = D || 0, A = B.length; C < A; ++C) {
        if (B[C] == E) {
            return C
        }
    }
    return -1
}

function in_arrayf(B, E, F, D) {
    for (var C = D || 0, A = B.length; C < A; ++C) {
        if (F(B[C]) == E) {
            return C
        }
    }
    return -1
}

function array_walk(C, F, B) {
    var E;
    for (var D = 0, A = C.length; D < A; ++D) {
        E = F(C[D], B, C, D);
        if (E != null) {
            C[D] = E
        }
    }
}

function array_apply(C, F, B) {
    var E;
    for (var D = 0, A = C.length; D < A; ++D) {
        F(C[D], B, C, D)
    }
}

function ge(A) {
    return document.getElementById(A)
}

function gE(A, B) {
    return A.getElementsByTagName(B)
}

function ce(C, B) {
    var A = document.createElement(C);
    if (B) {
        cOr(A, B)
    }
    return A
}

function de(A) {
    A.parentNode.removeChild(A)
}

function ae(A, B) {
    return A.appendChild(B)
}

function ct(A) {
    return document.createTextNode(A)
}

function rf() {
    return false
}

function rf2(A) {
    A = $E(A);
    if (A.ctrlKey || A.shiftKey || A.altKey || A.metaKey) {
        return
    }
    return false
}

function tb() {
    this.blur()
}

function ac(C) {
    var B = 0,
        A = 0;
    while (C) {
        B += C.offsetLeft;
        A += C.offsetTop;
        C = C.offsetParent
    }
    return [B, A]
}

function aE(B, C, A) {
    if (Browser.ie) {
        B.attachEvent("on" + C, A)
    } else {
        B.addEventListener(C, A, false)
    }
}

function dE(B, C, A) {
    if (Browser.ie) {
        B.detachEvent("on" + C, A)
    } else {
        B.removeEventListener(C, A, false)
    }
}

function sp(A) {
    if (!A) {
        A = event
    }
    if (Browser.ie) {
        A.cancelBubble = true
    } else {
        A.stopPropagation()
    }
}

function sc(F, G, B, D, E) {
    var C = new Date();
    var A = F + "=" + escape(B) + "; ";
    C.setDate(C.getDate() + G);
    A += "expires=" + C.toUTCString() + "; ";
    if (D) {
        A += "path=" + D + "; "
    }
    if (E) {
        A += "domain=" + E + "; "
    }
    document.cookie = A
}

function dc(A) {
    sc(A, -1)
}

function gc(D) {
    var A, E;
    if (!D) {
        var B = [];
        E = document.cookie.split("; ");
        for (var C = 0; C < E.length; ++C) {
            A = E[C].split("=");
            B[A[0]] = unescape(A[1])
        }
        return B
    } else {
        A = document.cookie.indexOf(D + "=");
        if (A != -1) {
            if (A == 0 || document.cookie.substring(A - 2, A) == "; ") {
                A += D.length + 1;
                E = document.cookie.indexOf("; ", A);
                if (E == -1) {
                    E = document.cookie.length
                }
                return unescape(document.cookie.substring(A, E))
            }
        }
    }
    return null
}

function ns(A) {
    A.onmousedown = A.onselectstart = A.ondragstart = rf;
    if (Browser.ie) {
        A.onfocus = tb
    }
}

function cO(C, A) {
    for (var B in A) {
        C[B] = A[B]
    }
}

function cOr(C, A) {
    for (var B in A) {
        if (typeof A[B] == "object") {
            if (!C[B]) {
                C[B] = {}
            }
            cOr(C[B], A[B])
        } else {
            C[B] = A[B]
        }
    }
}
var Browser = {
    ie: !! (window.attachEvent && !window.opera),
    opera: !! window.opera,
    safari: navigator.userAgent.indexOf("Safari") != -1,
    gecko: navigator.userAgent.indexOf("Gecko") != -1 && navigator.userAgent.indexOf("KHTML") == -1
};
Browser.ie7 = Browser.ie && navigator.userAgent.indexOf("MSIE 7.0") != -1;
Browser.ie6 = Browser.ie && navigator.userAgent.indexOf("MSIE 6.0") != -1 && !Browser.ie7;
navigator.userAgent.match(/Gecko\/([0-9]+)/);
Browser.geckoVersion = parseInt(RegExp.$1) | 0;
var OS = {
    windows: navigator.appVersion.indexOf("Windows") != -1,
    mac: navigator.appVersion.indexOf("Macintosh") != -1,
    linux: navigator.appVersion.indexOf("Linux") != -1
};

function g_getWindowSize() {
    var B = 0,
        A = 0;
    if (typeof window.innerWidth == "number") {
        B = window.innerWidth;
        A = window.innerHeight
    } else {
        if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
            B = document.documentElement.clientWidth;
            A = document.documentElement.clientHeight
        } else {
            if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
                B = document.body.clientWidth;
                A = document.body.clientHeight
            }
        }
    }
    return {
        w: B,
        h: A
    }
}

function g_getScroll() {
    var A = 0,
        B = 0;
    if (typeof (window.pageYOffset) == "number") {
        A = window.pageXOffset;
        B = window.pageYOffset
    } else {
        if (document.body && (document.body.scrollLeft || document.body.scrollTop)) {
            A = document.body.scrollLeft;
            B = document.body.scrollTop
        } else {
            if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
                A = document.documentElement.scrollLeft;
                B = document.documentElement.scrollTop
            }
        }
    }
    return {
        x: A,
        y: B
    }
}

function g_getCursorPos(C) {
    var B, D;
    if (window.innerHeight) {
        B = C.pageX;
        D = C.pageY
    } else {
        var A = g_getScroll();
        B = C.clientX + A.x;
        D = C.clientY + A.y
    }
    return {
        x: B,
        y: D
    }
}

function g_scrollTo(C, B) {
    var M, K = g_getWindowSize(),
        L = g_getScroll(),
        I = K.w,
        E = K.h,
        G = L.x,
        D = L.y;
    C = $(C);
    if (B == null) {
        B = []
    } else {
        if (typeof B == "number") {
            B = [B]
        }
    }
    M = B.length;
    if (M == 0) {
        B[0] = B[1] = B[2] = B[3] = 0
    } else {
        if (M == 1) {
            B[1] = B[2] = B[3] = B[0]
        } else {
            if (M == 2) {
                B[2] = B[0];
                B[3] = B[1]
            } else {
                if (M == 3) {
                    B[3] = B[1]
                }
            }
        }
    }
    M = ac(C);
    var A = M[0] - B[3];
    var H = M[1] - B[0];
    var J = M[0] + C.offsetWidth + B[1];
    var F = M[1] + C.offsetHeight + B[2];
    if (J - A > I || A < G) {
        G = A
    } else {
        if (J - I > G) {
            G = J - I
        }
    }
    if (F - H > E || H < D) {
        D = H
    } else {
        if (F - E > D) {
            D = F - E
        }
    }
    scrollTo(G, D)
}

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_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 (Browser.ie) {
                    A += "\r"
                } else {
                    A += "\n"
                }
            }
        }
        A += g_getTextContent(C.childNodes[B])
    }
    return A
}

function g_setSelectedLink(C, B) {
    if (!g_setSelectedLink.groups) {
        g_setSelectedLink.groups = {}
    }
    var A = g_setSelectedLink.groups;
    if (A[B]) {
        A[B].className = ""
    }
    C.className = "selected";
    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_initHeader(B) {
    var H = ce("dl");
    g_expandSite()
    for (var G = 0, J = mn_path.length; G < J; ++G) {
        var E = ce("dt");
        var L = ce("a");
        var I = ce("ins");
        var F = ce("big");
        var D = ce("span");
        if (mn_path[G][0] != B) {
            L.menu = mn_path[G][3];
            L.onmouseover = Menu.show;
            L.onmouseout = Menu.hide
        }
        if (mn_path[G][2]) {
            L.href = mn_path[G][2]
        } else {
            L.href = "javascript:;";
            ns(L);
            L.style.cursor = "default"
        }
        if (B != null && mn_path[G][0] == B) {
            L.className = "selected"
        }
        ae(F, ct(mn_path[G][1].charAt(0)));
        ae(I, F);
        ae(I, ct(mn_path[G][1].substr(1)));
        ae(L, I);
        ae(L, D);
        ae(E, L);
        ae(H, E)
    }
    ae(ge("toptabs-right-generic"), H);
    var A = ge("menu-buttons-generic");
    if (B != null && B >= 0 && B < mn_path.length) {
        switch (B) {
        case 0:
            Menu.addButtons(A, Menu.explode(mn_database));
            break;
        case 1:
            Menu.addButtons(A, mn_tools);
            break;
        case 2:
            Menu.addButtons(A, Menu.explode(mn_more));
            break;
        }
    } else {
        ae(A, ct(String.fromCharCode(160)))
    }
    g_initLanguageChanger();
    var M = ge("live-search-generic");
    var K = M.previousSibling;
    var C = M.parentNode;
    ns(K);
    K.onclick = function () {
        this.parentNode.onsubmit()
    };
    if (M.value == "") {
        M.className = "search-database"
    }
    M.onmousemove = function () {
        if (trim(this.value) != "") {
            M.className = ""
        }
    };
    M.onfocus = function () {
        M.className = ""
    };
    M.onblur = function () {
        if (trim(this.value) == "") {
            M.className = "search-database"
        }
    };
    C.onsubmit = function () {
        var N = this.elements[0].value;
        if (trim(N) == "") {
            return false
        }
        this.submit()
    }
}

function g_initLanguageChanger() {
    var A = ge("language-changer");
    if (!A) {
        return
    }
    A.menu = [[0, "English", (g_locale.id != 0 ? "?locale=0" : null)] /*,  [NOTE] deactivated [0, "Русский", (g_locale.id != 8 ? "?locale=8" : null)]*/ ];
    A.menu.rightAligned = 1;
    if (g_locale.id != 25) {
        A.menu[{
            0: 0,
            8: 1
        }[g_locale.id]].checked = 1
    }
    A.onmouseover = Menu.show;
    A.onmouseout = Menu.hide
}

function g_initPath(K, D) {
    var G = mn_path,
        H = null,
        C = null,
        L = 0,
        I = ge("main-precontents"),
        A = ce("div");
    A.className = "path";
    if (D != null) {
        var J = ce("div");
        J.className = "path-right";
        var M = ce("a");
        M.href = "javascript:;";
        M.id = "fi_toggle";
        ns(M);
        M.onclick = fi_Toggle;
        if (D) {
            M.className = "disclosure-on";
            ae(M, ct(LANG.fihide))
        } else {
            M.className = "disclosure-off";
            ae(M, ct(LANG.fishow))
        }
        ae(J, M);
        ae(I, J)
    }
    for (var F = 0; F < K.length; ++F) {
        var M, B, N = 0;
        for (var E = 0; E < G.length; ++E) {
            if (G[E][0] == K[F]) {
                N = 1;
                G = G[E];
                G.checked = 1;
                break
            }
        }
        if (!N) {
            L = 1;
            break
        }
        M = ce("a");
        B = ce("span");
        if (G[2]) {
            M.href = G[2]
        } else {
            M.href = "javascript:;";
            ns(M);
            M.style.textDecoration = "none";
            M.style.color = "white";
            M.style.cursor = "default"
        }
        if (F < K.length - 1 && G[3]) {
            B.className = "menuarrow"
        }
        ae(M, ct(G[4] == null ? G[1] : G[4]));
        if (F == 0) {
            M.menu = mn_path
        } else {
            M.menu = H[3]
        }
        M.onmouseover = Menu.show;
        M.onmouseout = Menu.hide;
        ae(B, M);
        ae(A, B);
        C = B;
        H = G;
        G = G[3];
        if (!G) {
            L = 1;
            break
        }
    }
    if (L && C) {
        C.className = ""
    }
    var J = ce("div");
    J.className = "clear";
    ae(A, J);
    ae(I, A);
    g_initPath.lastIt = H
}

function g_formatTimeElapsed(D) {
    function G(L, K, J) {
        if (J && LANG.timeunitsab[K] == "") {
            J = 0
        }
        if (J) {
            return L + " " + LANG.timeunitsab[K]
        } else {
            return L + " " + (L == 1 ? LANG.timeunitssg[K] : LANG.timeunitspl[K])
        }
    }
    var E = [31557600, 2629800, 604800, 86400, 3600, 60, 1];
    var H = [1, 3, 3, -1, 5, -1, -1];
    D = Math.max(D, 1);
    for (var C = 3, F = E.length; C < F; ++C) {
        if (D >= E[C]) {
            var B = C;
            var I = Math.floor(D / E[B]);
            if (H[B] != -1) {
                var A = H[B];
                D %= E[B];
                v2 = Math.floor(D / E[A]);
                if (v2 > 0) {
                    return G(I, B, 1) + " " + G(v2, A, 1)
                }
            }
            return G(I, B, 0)
        }
    }
    return "(n/a)"
}

function g_formatDateSimple(E, A) {
    function C(J) {
        return (J < 10 ? "0" + J : J)
    }
    var H = "",
        G = E.getDate(),
        D = E.getMonth() + 1,
        F = E.getFullYear();
    H += sprintf(LANG.date_simple, C(G), C(D), F);
    if (A == 1) {
        var I = E.getHours() + 1,
            B = E.getMinutes() + 1;
        H += LANG.date_at + C(I) + ":" + C(B)
    }
    return H
}

function g_createGlow(A, G) {
    var D = ce("span");
    for (var C = -1; C <= 1; ++C) {
        for (var B = -1; B <= 1; ++B) {
            var F = ce("div");
            F.style.position = "absolute";
            F.style.whiteSpace = "nowrap";
            F.style.left = C + "px";
            F.style.top = B + "px";
            if (C == 0 && B == 0) {
                F.style.zIndex = 4
            } else {
                F.style.color = "black";
                F.style.zIndex = 2
            }
            ae(F, ct(A));
            ae(D, F)
        }
    }
    D.style.position = "relative";
    D.className = "glow" + (G != null ? " " + G : "");
    var E = ce("span");
    E.style.visibility = "hidden";
    ae(E, ct(A));
    ae(D, E);
    return D
}

function g_appendReputation(G, F, D, E) {
    G = $(G);
    var B = ce("a");
    B.href = "javascript:;";
    B.className = "reputation";
    var H = ce("div");
    H.className = "reputation-text";
    var A = ce("del");
    ae(A, ct(g_reputation_standings[F]));
    ae(H, A);
    var C = ce("ins");
    ae(C, ct(E));
    ae(H, C);
    ae(B, H);
    H = ce("div");
    H.className = "reputation-bar" + F;
    if (D <= 0 || D > 100) {
        H.style.visibility = "hidden"
    }
    H.style.width = D + "%";
    ae(H, ct(String.fromCharCode(160)));
    ae(B, H);
    ae(G, B)
}

function g_convertRatingToPercent(E, A, D) {
    var C = {
        12: 1.5,
        13: 12,
        14: 15,
        15: 5,
        16: 10,
        17: 10,
        18: 8,
        19: 14,
        20: 14,
        21: 14,
        22: 0,
        23: 0,
        24: 0,
        25: 0,
        26: 0,
        27: 0,
        28: 10,
        29: 10,
        30: 10,
        31: 10,
        32: 14,
        33: 0,
        34: 0,
        35: 25,
        36: 10,
        37: 2.5
    };
    if (E < 10) {
        E = 10
    } else {
        if (E > 70) {
            E = 70
        }
    }
    if (D < 0) {
        D = 0
    }
    var B;
    if (C[A] == null) {
        B = 0
    } else {
        f = C[A];
        if (E >= 1 && E <= 59) {
            B = D / f / ((1 / 52) * E - (8 / 52))
        } else {
            if (E >= 60 && E <= 70) {
                B = D / f * ((-3 / 82) * E + (131 / 41))
            } else {
                B = 0
            }
        }
    }
    return B
}

function g_setRatingLevel(F, E, A, C) {
    var D = prompt(LANG.prompt_ratinglevel, E);
    if (D != null) {
        D |= 0;
        if (D != E && D >= 1 && D <= 70) {
            E = D;
            var B = g_convertRatingToPercent(E, A, C);
            B = (Math.round(B * 100) / 100);
            if (A != 12 && A != 37) {
                B += "%"
            }
            F.innerHTML = sprintf(LANG.tooltip_combatrating, B, E);
            F.onclick = g_setRatingLevel.bind(0, F, E, A, C)
        }
    }
}

function g_getMoneyHtml(C) {
    var B = 0,
        A = "";
    if (C >= 10000) {
        B = 1;
        A += '<span class="moneygold">' + Math.floor(C / 10000) + "</span>";
        C %= 10000
    }
    if (C >= 100) {
        if (B) {
            A += " "
        } else {
            B = 1
        }
        A += '<span class="moneysilver">' + Math.floor(C / 100) + "</span>";
        C %= 100
    }
    if (C >= 1) {
        if (B) {
            A += " "
        } else {
            B = 1
        }
        A += '<span class="moneycopper">' + C + "</span>"
    }
    return A
}

function g_getPatchVersion(E) {
    var D = g_getPatchVersion;
    var B = 0,
        C = D.T.length - 2,
        A;
    while (C > B) {
        A = Math.floor((C + B) / 2);
        if (E >= D.T[A] && E < D.T[A + 1]) {
            return D.V[A]
        }
        if (E >= D.T[A]) {
            B = A + 1
        } else {
            C = A - 1
        }
    }
    A = Math.ceil((C + B) / 2);
    return D.V[A]
}
g_getPatchVersion.V = ["1.12.0", "1.12.1", "1.12.2"];
g_getPatchVersion.T = [1153540800000, 1159243200000, 1160712000000];

function g_expandSite() {
    de(ge("sidebar"));
    de(ge("header-ad"));
    ge("wrapper").className = "noads";
    var A = ge("contribute-ad");
    if (A) {
        de(A)
    }
}

function g_insertTag(E, H, A, J) {
    var C = $(E);
    C.focus();
    if (C.selectionStart != null) {
        var K = C.selectionStart,
            G = C.selectionEnd,
            I = C.scrollLeft,
            D = C.scrollTop;
        var B = C.value.substring(K, G);
        if (typeof J == "function") {
            B = J(B)
        }
        C.value = C.value.substr(0, K) + H + B + A + C.value.substr(G);
        C.selectionStart = C.selectionEnd = G + H.length;
        C.scrollLeft = I;
        C.scrollTop = D
    } else {
        if (document.selection && document.selection.createRange) {
            var F = document.selection.createRange();
            if (F.parentElement() != C) {
                return
            }
            var B = F.text;
            if (typeof J == "function") {
                B = J(B)
            }
            F.text = H + B + A
        }
    }
    if (C.onkeyup) {
        C.onkeyup()
    }
}

function g_getLocaleFromDomain(B) {
    var A = g_getLocaleFromDomain.L;
    return (A[B] ? A[B] : 0)
}
g_getLocaleFromDomain.L = {
    fr: 2,
    de: 3,
    es: 6,
    wotlk: 25
};

function g_getIdFromTypeName(A) {
    var B = g_getIdFromTypeName.L;
    return (B[A] ? B[A] : -1)
}
g_getIdFromTypeName.L = {
    npc: 1,
    object: 2,
    item: 3,
    itemset: 4,
    quest: 5,
    spell: 6,
    zone: 7,
    faction: 8
};

function g_getIngameLink(A, C, B) {
    prompt(LANG.prompt_ingamelink, '/script DEFAULT_CHAT_FRAME:AddMessage("' + sprintf(LANG.message_ingamelink, "\\124c" + A + "\\124H" + C + "\\124h[" + B + ']\\124h\\124r");'))
}

function g_isEmailValid(A) {
    return A.match(/^[A-Z0-9._-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i) != null
}

function g_userDescription() {
    var C = ge("description");
    var D = (typeof g_pageInfo == "object" && g_user.name == g_pageInfo.username);
    var B = (C.childNodes.length == 0);
    if (B) {
        if (D) {
            ae(C, ct(LANG.user_nodescription2))
        } else {
            ae(C, ct(LANG.user_nodescription))
        }
    }
    if (D) {
        var A = ce("button"),
            E = ce("div");
        E.className = "pad";
        A.onclick = function () {
            location.href = "?account#public-description"
        };
        if (B) {
            ae(A, ct(LANG.user_composeone))
        } else {
            ae(A, ct(LANG.user_editdescription))
        }
        ae(C, E);
        ae(C, A)
    }
}

function co_addYourComment() {
    tabsContribute.focus(0);
    var A = gE(document.forms.addcomment, "textarea")[0];
    A.focus()
}

function co_cancelReply() {
    ge("replybox-generic").style.display = "none";
    document.forms.addcomment.elements.replyto.value = ""
}

function co_validateForm(B) {
    var A = gE(B, "textarea")[0];
    if (Listview.funcBox.coValidate(A)) {
        if (g_user.permissions & 1) {
            return true
        }
    }
    return false
}

function ss_submitAScreenshot() {
    tabsContribute.focus(1)
}

function ss_validateForm(A) {
    if (!A.elements.screenshotfile.value.length) {
        alert(LANG.message_noscreenshot);
        return false
    }
    return true
}

function ss_appendSticky() {
    var J = ge("infobox-sticky");
    var F = g_pageInfo.type;
    var A = g_pageInfo.typeId;
}

function Ajax(B, C) {
    if (!B) {
        return
    }
    var A;
    try {
        A = new XMLHttpRequest()
    } catch (D) {
        try {
            A = new ActiveXObject("Msxml2.XMLHTTP")
        } catch (D) {
            try {
                A = new ActiveXObject("Microsoft.XMLHTTP")
            } catch (D) {
                if (window.createRequest) {
                    A = window.createRequest()
                } else {
                    alert(LANG.message_ajaxnotsupported);
                    return
                }
            }
        }
    }
    this.request = A;
    cO(this, C);
    this.method = this.method || (this.params && "POST") || "GET";
    A.open(this.method, B, this.async == null ? true : this.async);
    A.onreadystatechange = Ajax.onReadyStateChange.bind(this);
    if (this.method.toUpperCase() == "POST") {
        A.setRequestHeader("Content-Type", (this.contentType || "application/x-www-form-urlencoded") + "; charset=" + (this.encoding || "UTF-8"))
    }
    A.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)
        }
    }
};

function g_ajaxIshRequest(A) {
    var B = document.getElementsByTagName("head")[0];
    ae(B, ce("script", {
        type: "text/javascript",
        src: A
    }))
}
var Menu = {
    iframes: [],
    divs: [],
    selection: [],
    show: function () {
        try {
            clearTimeout(Menu.timer);
            if (Menu.currentLink) {
                Menu._show(this)
            } else {
                this.className = "open";
                Menu.timer = setTimeout(Menu._show.bind(0, this), 100)
            }
        } catch (A) {}
    },
    _show: function (B) {
        if (Menu.currentLink != B) {
            var A = ac(B);
            Menu._hide();
            Menu.selection = [-1];
            Menu.currentLink = B;
            Menu.showDepth(0, B.menu, A[0], A[1] + B.offsetHeight + 1, B.offsetHeight + 8, B.offsetWidth, A[1]);
            B.className = "open"
        } else {
            Menu.truncate(0);
            Menu.clean(0)
        }
    },
    showAtCursor: function (A) {
        A = $E(A);
        clearTimeout(Menu.timer);
        Menu._hide();
        Menu.selection = [-1];
        Menu.currentLink = null;
        var B = g_getCursorPos(A);
        Menu.showDepth(0, this.menu, B.x, B.y, 0, 0, 0)
    },
    hide: function () {
        try {
            clearTimeout(Menu.timer);
            if (Menu.currentLink) {
                Menu.timer = setTimeout(Menu._hide, 333)
            } else {
                this.className = ""
            }
        } catch (A) {}
    },
    _hide: function () {
        for (var B = 0, A = Menu.selection.length; B < A; ++B) {
            Menu.divs[B].style.display = "none";
            Menu.divs[B].style.visibility = "hidden";
            if (Browser.ie6) {
                Menu.iframes[B].style.display = "none"
            }
        }
        Menu.selection = [];
        if (Menu.currentLink) {
            Menu.currentLink.className = ""
        }
        Menu.currentLink = null
    },
    sepOver: function () {
        var B = this.d;
        var A = B.i;
        Menu.truncate(A);
        Menu.clean(A);
        Menu.selection[A] = -1
    },
    elemOver: function () {
        var E = this.d;
        var D = E.i;
        var C = this.i;
        var A = this.k;
        var B = this.firstChild.className == "menusub";
        Menu.truncate(D + B);
        if (B && C != Menu.selection[D]) {
            var F = ac(this);
            Menu.selection[D + 1] = -1;
            Menu.showDepth(D + 1, E.menuArray[C][3], F[0], F[1] - 2, this.offsetHeight, this.offsetWidth - 3, 0)
        }
        Menu.clean(D);
        Menu.selection[D] = A;
        if (this.className.length) {
            this.className += " open"
        } else {
            this.className = "open"
        }
    },
    getIframe: function (A) {
        var B;
        if (Menu.iframes[A] == null) {
            B = ce("iframe");
            B.src = "javascript:0;";
            B.frameBorder = 0;
            ae(ge("layers"), B);
            Menu.iframes[A] = B
        } else {
            B = Menu.iframes[A]
        }
        return B
    },
    getDiv: function (B, A) {
        var C;
        if (Menu.divs[B] == null) {
            C = ce("div");
            C.className = "menu";
            ae(ge("layers"), C);
            Menu.divs[B] = C
        } else {
            C = Menu.divs[B]
        }
        C.i = B;
        C.menuArray = A;
        return C
    },
    showDepth: function (Z, V, M, L, g, N, D) {
        var r, n = Menu.getDiv(Z, V);
        while (n.firstChild) {
            de(n.firstChild)
        }
        var l = ce("table"),
            A = ce("tbody"),
            E = ce("tr"),
            I = ce("td"),
            Q = ce("div"),
            G = ce("div");
        var S = 999;
        var P = g_getWindowSize(),
            C = g_getScroll(),
            J = P.w,
            T = P.h,
            B = C.x,
            o = C.y;
        if (g > 0) {
            if ((25 + 1) * V.length > T - 25 - D) {
                for (var X = 2; X < 4; ++X) {
                    if (g / X * V.length + 30 < T - D) {
                        break
                    }
                }
                S = Math.floor(V.length / X)
            }
        }
        var H = 0;
        var U = 0;
        for (var X = 0, e = V.length; X < e; ++X) {
            if (V[X][0] == null) {
                var Y = ce("span");
                Y.className = "separator";
                ns(Y);
                ae(Y, ct(V[X][1]));
                Y.d = n;
                Y.onmouseover = Menu.sepOver;
                ae(G, Y)
            } else {
                var q = ce("a");
                q.d = n;
                q.k = U++;
                q.i = X;
                if (V[X][2]) {
                    if (Menu.currentLink && Menu.currentLink.menuappend) {
                        if (V[X][2].indexOf(Menu.currentLink.menuappend) == -1) {
                            q.href = V[X][2] + Menu.currentLink.menuappend
                        } else {
                            q.href = V[X][2]
                        }
                    } else {
                        if (typeof V[X][2] == "function") {
                            q.href = "javascript:;";
                            q.onclick = V[X][2];
                            ns(q)
                        } else {
                            q.href = V[X][2]
                        }
                    }
                } else {
                    q.href = "javascript:;";
                    q.style.cursor = "default";
                    ns(q)
                }
                q.onmouseover = Menu.elemOver;
                var O = ce("span"),
                    F = ce("span");
                if (V[X][3] != null) {
                    O.className = "menusub"
                }
                if (V[X][5] != null) {
                    F.className = "icontiny";
                    F.style.backgroundImage = "url(images/icons/tiny/" + V[X][5] + ".gif)";
                    if (V[X].checked) {
                        var K = ce("span");
                        K.className = "menucheck";
                        ae(K, ct(V[X][1]));
                        ae(F, K);
                    } else {
                        ae(F, ct(V[X][1]));
                    }
                } else {
                    if (V[X].checked) {
                        F.className = "menucheck"
                    }
                    ae(F, ct(V[X][1]));
                }
                ae(O, F);
                ae(q, O);
                ae(G, q)
            }
            if (H++ == S) {
                Q.onmouseover = Menu.divOver;
                Q.onmouseout = Menu.divOut;
                ae(Q, G);
                if (!Browser.ie6) {
                    var R = ce("p");
                    ae(R, ce("em"));
                    ae(R, ce("var"));
                    ae(R, ce("strong"));
                    ae(R, Q);
                    ae(I, R)
                } else {
                    ae(I, Q)
                }
                ae(E, I);
                I = ce("td");
                R = ce("p");
                Q = ce("div");
                G = ce("div");
                H = 0
            }
        }
        Q.onmouseover = Menu.divOver;
        Q.onmouseout = Menu.divOut;
        ae(Q, G);
        if (!Browser.ie6) {
            if (S != 999) {
                var R = ce("p");
                ae(R, ce("em"));
                ae(R, ce("var"));
                ae(R, ce("strong"));
                ae(R, Q);
                ae(I, R)
            } else {
                ae(n, ce("em"));
                ae(n, ce("var"));
                ae(n, ce("strong"));
                ae(I, Q)
            }
        } else {
            ae(I, Q)
        }
        ae(E, I);
        ae(A, E);
        ae(l, A);
        ae(n, l);
        n.style.left = n.style.top = "-2323px";
        n.style.display = "";
        var K = l.offsetWidth,
            W = l.offsetHeight;
        if (V.rightAligned) {
            M = M + N - K
        } else {
            if (M + N + K + 15 > J) {
                M = Math.max(0, M - K - 3)
            } else {
                if (Z > 0) {
                    M += N
                }
            }
        }
        if (L + W > T + o) {
            L = Math.max(o + 5, T + o - W - 10)
        }
        n.style.left = M + "px";
        n.style.top = L + "px";
        if (Browser.ie6) {
            r = Menu.getIframe(Z);
            r.style.left = M + "px";
            r.style.top = L + "px";
            r.style.width = K + "px";
            r.style.height = W + "px";
            r.style.display = "";
            r.style.visibility = "visible"
        }
        n.style.visibility = "visible";
        if (Browser.opera) {
            n.style.display = "none";
            n.style.display = ""
        }
    },
    divOver: function () {
        clearTimeout(Menu.timer)
    },
    divOut: function () {
        clearTimeout(Menu.timer);
        Menu.timer = setTimeout(Menu._hide, 333)
    },
    truncate: function (A) {
        var B;
        while (Menu.selection.length - 1 > A) {
            B = Menu.selection.length - 1;
            Menu.divs[B].style.display = "none";
            Menu.divs[B].style.visibility = "hidden";
            if (Browser.ie6) {
                Menu.iframes[B].style.display = "none"
            }
            Menu.selection.pop()
        }
    },
    clean: function (A) {
        for (var B = A; B < Menu.selection.length; ++B) {
            if (Menu.selection[B] != -1) {
                d = gE(Menu.divs[B], "a")[Menu.selection[B]];
                if (d.className.indexOf("sub") != -1) {
                    d.className = "sub"
                } else {
                    d.className = ""
                }
                Menu.selection[B] = -1
            }
        }
    },
    append: function (A, B) {
        A[2] += B;
        if (A[3] != null) {
            Menu._append(A[3], B)
        }
    },
    _append: function (A, C) {
        var D, E = 0;
        for (var B = 0; B < A.length; ++B) {
            if (A[B][2].indexOf("sl=") != -1) {
                C = C.replace(/sl=([0-9]:?)+/, "");
                E = 1
            } else {
                if (A[B][2].indexOf("cl=") != -1) {
                    C = C.replace(/cl=[0-9]+/, "");
                    E = 1
                }
            }
            if (E) {
                C = C.replace("&filter=", ";");
                C = rtrim(C, ";");
                C = C.replace(";;", ";")
            }
            A[B][2] += C;
            if (A[B][3]) {
                Menu._append(A[B][3], C)
            }
        }
    },
    fixUrls: function (E, B, D) {
        for (var C = 0, A = E.length; C < A; ++C) {
            if (E[C][2] == null) {
                E[C][2] = B + E[C][0]
            }
            if (E[C][3]) {
                if (D) {
                    Menu.fixUrls(E[C][3], B, D)
                } else {
                    Menu.fixUrls(E[C][3], B + E[C][0] + ".", D)
                }
            }
        }
    },
    addButtons: function (F, E) {
        for (var C = 0, A = E.length; C < A; ++C) {
            if (E[C][0] == null) {
                continue
            }
            var B = ce("a"),
                D = ce("span");
            if (E[C][2]) {
                B.href = E[C][2]
            } else {
                B.href = "javascript:;";
                B.style.cursor = "default";
                B.style.textDecoration = "none";
                ns(B)
            }
            if (E[C][3] != null) {
                D.className = "menuarrowd";
                B.menu = E[C][3];
                B.onmouseover = Menu.show;
                B.onmouseout = Menu.hide
            }
            ae(D, ct(E[C][1]));
            ae(B, D);
            ae(F, B)
        }
    },
    explode: function (F) {
        var B = [],
            E = null,
            D;
        for (var C = 0, A = F.length; C < A; ++C) {
            if (F[C][0] != null) {
                if (E != null) {
                    D.push(F[C])
                } else {
                    B.push(F[C])
                }
            }
            if (E != null && (F[C][0] == null || C == A - 1)) {
                B.push([0, E[1], , D])
            }
            if (F[C][0] == null) {
                E = F[C];
                D = []
            }
        }
        return B
    }
};

function Tabs(A) {
    cO(this, A);
    if (this.parent) {
        this.parent = $(this.parent)
    } else {
        return
    }
    this.oldMode = (Browser.geckoVersion > 20000000 && Browser.geckoVersion <= 20060414);
    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 (A, D) {
        var C, B = this.tabs.length;
        C = {
            caption: A,
            index: B,
            owner: this
        };
        cO(C, D);
        this.tabs.push(C);
        return B
    },
    focus: function (A) {
        if (A < 0) {
            A = this.tabs.length + A
        }
        this.forceScroll = 1;
        gE(this.uls[this.oldMode ? 0 : 2], "a")[A].onclick({}, true);
        this.forceScroll = null
    },
    show: function (C, E) {
        var B;
        if (isNaN(C) || C < 0) {
            C = 0
        } else {
            if (C >= this.tabs.length) {
                C = this.tabs.length - 1
            }
        }
        if (E == null && C == this.selectedTab) {
            return
        }
        if (this.selectedTab != -1) {
            B = this.tabs[this.selectedTab];
            if (this.onHide && !this.onHide(B)) {
                return
            }
            if (B.onHide && !B.onHide()) {
                return
            }
        }++this.nShows;
        var A = this.oldMode ? 0 : 3;
        for (var D = 0; D <= A; ++D) {
            B = gE(this.uls[D], "a");
            if (this.selectedTab != -1) {
                B[this.selectedTab].className = ""
            }
            B[C].className = "selected"
        }
        B = this.tabs[C];
        if (B.onLoad) {
            B.onLoad();
            B.onLoad = null
        }
        this.onShow(this.tabs[C], this.tabs[this.selectedTab]);
        if (B.onShow) {
            B.onShow(this.tabs[this.selectedTab])
        }
        this.selectedTab = C
    },
    flush: function (J) {
        if (this.oldMode) {
            var H, M, C, K;
            H = ce("ul");
            H.className = "old-tabs";
            for (var G = 0; G < this.tabs.length; ++G) {
                var D = this.tabs[G];
                M = ce("li");
                C = ce("div");
                K = ce("a");
                if (this.poundable) {
                    K.href = "#" + D.id
                } else {
                    K.href = "javascript:;"
                }
                ns(K);
                K.onclick = Tabs.onClick.bind(D, K);
                ae(K, ct(D.caption));
                ae(M, C);
                ae(M, K);
                ae(H, M)
            }
            this.uls[0] = H;
            ae(this.parent, H)
        } else {
            var L, E, K, I, A;
            var B = ce("div");
            B.className = "tabs-container";
            I = ce("div");
            I.style.visibility = "hidden";
            this.uls[0] = ce("ul");
            this.uls[0].className = "tabs";
            ae(I, this.uls[0]);
            ae(B, I);
            I = ce("div");
            I.className = "tabs-levels";
            for (var G = 1; G <= 3; ++G) {
                A = ce("div");
                A.className = "tabs-level";
                this.uls[G] = ce("ul");
                this.uls[G].className = "tabs";
                this.uls[G].style.top = (-30 * (3 - G)) + "px";
                ae(A, this.uls[G]);
                ae(I, A)
            }
            ae(B, I);
            for (var G = 0; G < this.tabs.length; ++G) {
                var D = this.tabs[G];
                for (var F = 0; F <= 3; ++F) {
                    E = ce("li");
                    K = ce("a");
                    b = ce("b");
                    if (this.poundable) {
                        K.href = "#" + D.id
                    } else {
                        K.href = "javascript:;"
                    }
                    if (F > 0) {
                        ns(K);
                        K.onclick = Tabs.onClick.bind(D, K)
                    }
                    if (!Browser.ie6) {
                        I = ce("div");
                        ae(I, ct(D.caption));
                        ae(K, I)
                    }
                    ae(b, ct(D.caption));
                    ae(K, b);
                    ae(E, K);
                    ae(this.uls[F], E)
                }
            }
            ae(this.parent, B)
        }
        if (this.onLoad) {
            L = this.onLoad();
            if (L != null) {
                this.poundedTab = J = L
            }
        }
        this.show(J)
    },
    setTabName: function (C, B) {
        var A = this.oldMode ? 0 : 3;
        for (var D = 0; D <= A; ++D) {
            _ = gE(this.uls[D], "a");
            g_setTextNodes(_[C], B)
        }
    },
    setTabPound: function (C, A) {
        if (!this.poundable) {
            return
        }
        var B = this.oldMode ? 0 : 3;
        for (var D = 0; D <= B; ++D) {
            _ = gE(this.uls[D], "a");
            _[C].href = "#" + this.tabs[C].id + ":" + A
        }
    }
};
Tabs.onClick = function (A, E, D) {
    if (D == null && this.index == this.owner.selectedTab) {
        return
    }
    var C = rf2(E);
    if (C == null) {
        return
    }
    this.owner.show(this.index, D);
    if (this.owner.poundable) {
        var B = A.href.indexOf("#");
        B != -1 && location.replace(A.href.substr(B))
    }
    return C
};
Tabs.onLoad = function () {
    if (!this.poundable || !location.hash.length) {
        return
    }
    var A = location.hash.substr(1).split(":")[0];
    if (A) {
        return in_array(this.tabs, A, function (B) {
            return B.id
        })
    }
};
Tabs.onShow = function (E, D) {
    var B;
    if (D) {
        ge("tab-" + D.id).style.display = "none"
    }
    B = ge("tab-" + E.id);
    B.style.display = "";
    if ((this.nShows == 1 && this.poundedTab != null && this.poundedTab >= 0) || this.forceScroll) {
        var C, A;
        if (this.__st) {
            C = this.__st;
            A = 15
        } else {
            C = B;
            A = this.parent.offsetHeight + 15
        }
        if (Browser.ie) {
            setTimeout(g_scrollTo.bind(this, C, A), 1)
        } else {
            g_scrollTo(C, A)
        }
    }
};
var Icon = {
    sizes: ["small", "medium", "large"],
    create: function (A, J, I, D, B, H) {
        var G;
        var E = ce("div"),
            C = ce("div");
        E.className = "icon" + Icon.sizes[J];
        if (A != null) {
            E.style.backgroundImage = "url(images/icons/" + Icon.sizes[J] + "/" + A.toLowerCase() + ".png)"
        }
        C.className = "tile";
        if (I || D) {
            var F = ce("a");
            if (I && I.length) {
                F.tooltip = I;
                F.onmouseover = Icon.over;
                F.onmouseout = Icon.out
            }
            if (D) {
                F.href = D
            } else {
                F.href = "javascript:;";
                ns(F)
            }
            ae(C, F)
        } else {
            if (J == 2) {
                E.ondblclick = function () {
                    prompt("", A)
                }
            }
        }
        if (B != null && (B > 1 || B.length)) {
            G = g_createGlow(B, "q1");
            G.style.right = "0";
            G.style.bottom = "0";
            G.style.position = "absolute";
            ae(C, G)
        }
        if (H != null && H > 0) {
            G = g_createGlow("(" + H + ")", "q");
            G.style.left = "0";
            G.style.top = "0";
            G.style.position = "absolute";
            ae(C, G)
        }
        ae(E, C);
        return E
    },
    over: function () {
        if (this.tooltip != null) {
            Tooltip.show(this, this.tooltip, 0, 0)
        }
    },
    out: function () {
        Tooltip.hide()
    }
};
var Tooltip = {
    clip: "main-contents",
    create: function (G) {
        var E = ce("div"),
            J = ce("table"),
            C = ce("tbody"),
            D = ce("tr"),
            B = ce("tr"),
            A = ce("td"),
            I = ce("th"),
            H = ce("th"),
            F = ce("th");
        E.className = "tooltip";
        I.style.backgroundPosition = "top right";
        H.style.backgroundPosition = "bottom left";
        F.style.backgroundPosition = "bottom right";
        if (G) {
            A.innerHTML = G
        }
        ae(D, A);
        ae(D, I);
        ae(C, D);
        ae(B, H);
        ae(B, F);
        ae(C, B);
        ae(J, C);
        Tooltip.icon = ce("p");
        Tooltip.icon.style.visibility = "hidden";
        ae(Tooltip.icon, ce("div"));
        ae(E, Tooltip.icon);
        ae(E, J);
        return E
    },
    fix: function (D, B, E) {
        var C = gE(D, "table")[0],
            G = gE(C, "td")[0],
            F = G.childNodes;
        if (F.length >= 2 && F[0].nodeName == "TABLE" && F[1].nodeName == "TABLE") {
            var A;
            if (F[1].offsetWidth > 300) {
                A = Math.max(300, F[0].offsetWidth) + 20
            } else {
                A = Math.max(F[0].offsetWidth, F[1].offsetWidth) + 20
            }
            if (A > 20) {
                D.style.width = A + "px";
                F[0].style.width = F[1].style.width = "100%";
                if (!B && D.offsetHeight > document.body.clientHeight) {
                    C.className = "shrink"
                }
            }
        }
        if (E) {
            D.style.visibility = "visible"
        }
    },
    fixSafe: function (C, B, A) {
        if (Browser.ie) {
            setTimeout(Tooltip.fix.bind(this, C, B, A), 1)
        } else {
            Tooltip.fix(C, B, A)
        }
    },
    append: function (B, A) {
        var B = $(B);
        var C = Tooltip.create(A);
        ae(B, C);
        Tooltip.fixSafe(C, 1, 1)
    },
    prepare: function () {
        if (!Tooltip.tooltip) {
            var B = Tooltip.create();
            B.style.position = "absolute";
            B.style.left = B.style.top = "-2323px";
            var A = ge("layers");
            ae(A, B);
            Tooltip.tooltip = B;
            Tooltip.tooltipTable = gE(B, "table")[0];
            Tooltip.tooltipTd = gE(B, "td")[0];
            if (Browser.ie6) {
                B = ce("iframe");
                B.src = "javascript:1;";
                B.frameBorder = 0;
                ae(A, B);
                Tooltip.iframe = B
            }
        }
    },
    move: function (O, M, P, K, B, A, U, H, N, T) {
        if (!Tooltip.tooltipTable) {
            return
        }
        var W, G = O,
            R = M,
            J = O,
            I = M,
            F = 0,
            E = 0,
            Q = g_getWindowSize(),
            D = g_getScroll(),
            L = Q.w,
            S = Q.h,
            C = D.x,
            V = D.y;
        if (U == null) {
            U = Tooltip.clip
        }
        if (H == null) {
            H = Tooltip.tooltip;
            N = Tooltip.tooltipTable.offsetWidth;
            T = Tooltip.tooltipTable.offsetHeight
        }
        H.style.width = N + "px";
        if (U) {
            W = ge(U);
            if (W) {
                c = ac(W);
                F = c[0];
                E = c[1];
                if (W.offsetWidth + F <= C + L) {
                    L = W.offsetWidth + F - C
                }
                if (W.offsetHeight + E <= V + S) {
                    S = W.offsetHeight + E - V
                }
            }
        }
        if (G + P + N > L) {
            G = Math.max(G - N, F) - B
        } else {
            G += P + B
        }
        if (G < F) {
            G = F
        } else {
            if (G + N > C + L) {
                G = C + L - N
            }
        }
        if (R - T > Math.max(V, E)) {
            R -= T + A
        } else {
            R += K + A
        }
        if (R < E) {
            R = E
        } else {
            if (R + T > V + S) {
                R = Math.max(V, V + S - T)
            }
        }
        if (Tooltip.iconVisible) {
            if (J >= G - 48 && J <= G && I >= R - 4 && I <= R + 48) {
                R -= 48 - (I - R)
            }
        }
        H.style.left = G + "px";
        H.style.top = R + "px";
        H.style.visibility = "visible";
        if (Browser.ie6 && Tooltip.iframe) {
            W = Tooltip.iframe;
            W.style.left = G + "px";
            W.style.top = R + "px";
            W.style.width = N + "px";
            W.style.height = T + "px";
            W.style.display = "";
            W.style.visibility = "visible"
        }
    },
    show: function (G, E, A, F, C) {
        if (Tooltip.disabled) {
            return
        }
        var B;
        Tooltip.prepare();
        if (C) {
            E = '<span class="' + C + '">' + E + "</span>"
        }
        B = Tooltip.tooltip;
        B.style.width = "550px";
        B.style.left = "-2323px";
        B.style.top = "-2323px";
        Tooltip.tooltipTd.innerHTML = E;
        B.style.display = "";
        var D = ac(G);
        Tooltip.fix(B, 0, 0);
        Tooltip.move(D[0], D[1], G.offsetWidth, G.offsetHeight, A, F)
    },
    showAtCursor: function (B, E, A, G, D) {
        if (Tooltip.disabled) {
            return
        }
        if (!A || A < 10) {
            A = 10
        }
        if (!G || G < 10) {
            G = 10
        }
        B = $E(B);
        Tooltip.prepare();
        if (D) {
            E = '<span class="' + D + '">' + E + "</span>"
        }
        var C;
        C = Tooltip.tooltip;
        C.style.width = "550px";
        C.style.left = "-2323px";
        C.style.top = "-2323px";
        Tooltip.tooltipTd.innerHTML = E;
        C.style.display = "";
        var F = g_getCursorPos(B);
        Tooltip.fix(C, 0, 0);
        Tooltip.move(F.x, F.y, 0, 0, A, G)
    },
    showAtXY: function (E, A, F, D, C) {
        if (Tooltip.disabled) {
            return
        }
        Tooltip.prepare();
        var B;
        B = Tooltip.tooltip;
        B.style.width = "550px";
        B.style.left = "-2323px";
        B.style.top = "-2323px";
        Tooltip.tooltipTd.innerHTML = E;
        B.style.display = "";
        Tooltip.fix(B, 0, 0);
        Tooltip.move(A, F, 0, 0, D, C, null, null, null, null)
    },
    cursorUpdate: function (B, A, D) {
        if (Tooltip.disabled || !Tooltip.tooltip) {
            return
        }
        B = $E(B);
        if (!A || A < 10) {
            A = 10
        }
        if (!D || D < 10) {
            D = 10
        }
        var C = g_getCursorPos(B);
        Tooltip.move(C.x, C.y, 0, 0, A, D)
    },
    hide: function () {
        if (Tooltip.tooltip) {
            Tooltip.tooltip.style.display = "none";
            Tooltip.tooltip.visibility = "hidden";
            Tooltip.tooltipTable.className = "";
            if (Browser.ie6) {
                Tooltip.iframe.style.display = "none"
            }
            Tooltip.setIcon(null)
        }
    },
    setIcon: function (A) {
        Tooltip.prepare();
        if (A) {
            Tooltip.icon.style.backgroundImage = "url(images/icons/medium/" + A.toLowerCase() + ".png)";
            Tooltip.icon.style.visibility = "visible"
        } else {
            Tooltip.icon.style.backgroundImage = "none";
            Tooltip.icon.style.visibility = "hidden"
        }
        Tooltip.iconVisible = A ? 1 : 0
    }
};
var g_listviews = {};

function Listview(A) {
    cO(this, A);
    if (this.id) {
        var K = (this.tabs ? "tab-" : "lv-") + this.id;
        if (this.parent) {
            var H = ce("div");
            H.id = K;
            ae($(this.parent), H);
            this.container = H
        } else {
            this.container = ge(K)
        }
    } else {
        return
    }
    if (this.template) {
        this.template = Listview.templates[this.template]
    } else {
        return
    }
    g_listviews[this.id] = this;
    if (this.poundable == null) {
        if (this.template.poundable != null) {
            this.poundable = this.template.poundable
        } else {
            this.poundable = 1
        }
    }
    if (this.hideBands == null) {
        this.hideBands = this.template.hideBands
    }
    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.onBeforeCreate == null && this.template.onBeforeCreate != null) {
        this.onBeforeCreate = this.template.onBeforeCreate
    }
    if (this.onAfterCreate == null && this.template.onAfterCreate != null) {
        this.onAfterCreate = this.template.onAfterCreate
    }
    if (this.createNote == null && this.template.createNote != null) {
        this.createNote = this.template.createNote
    }
    this.rowOffset = 0;
    if (this.mode == null) {
        this.mode = this.template.mode
    }
    this.mode |= 0;
    if (this.nItemsPerPage == null) {
        var N = this.template.nItemsPerPage;
        this.nItemsPerPage = (N != null ? N : 50)
    }
    this.nItemsPerPage |= 0;
    if (this.nItemsPerPage <= 0) {
        this.nItemsPerPage = 0
    }
    if (this.mode == 3) {
        if (this.nItemsPerRow == null) {
            var M = this.template.nItemsPerRow;
            this.nItemsPerRow = (M != null ? M : 4)
        }
        this.nItemsPerRow |= 0;
        if (this.nItemsPerRow <= 1) {
            this.nItemsPerRow = 1
        }
    } else {
        this.nItemsPerRow = 1
    }
    this.columns = this.template.columns.slice(0);
    if (this.extraCols != null) {
        for (var D = 0, G = this.extraCols.length; D < G; ++D) {
            var I = null;
            var C = this.extraCols[D];
            if (C.after != null) {
                var F = in_array(this.columns, C.after, function (O) {
                    return O.id
                });
                if (F != -1) {
                    I = F + 1
                }
            }
            if (I == null) {
                I = this.columns.length
            }
            this.columns.splice(I, 0, C)
        }
    }
    this.visibility = [];
    var L = [],
        J = [];
    if (this.visibleCols != null) {
        array_walk(this.visibleCols, function (O) {
            L[O] = 1
        })
    }
    if (this.hiddenCols != null) {
        array_walk(this.hiddenCols, function (O) {
            J[O] = 1
        })
    }
    for (var D = 0, G = this.columns.length; D < G; ++D) {
        var C = this.columns[D];
        if (L[C.id] != null || (!C.hidden && J[C.id] == null)) {
            this.visibility.push(D)
        }
    }
    if (this.sort == null && this.template.sort) {
        this.sort = this.template.sort.slice(0)
    } else {
        if (this.sort != null) {
            var B = this.sort;
            this.sort = [];
            for (var D = 0, G = B.length; D < G; ++D) {
                var C = parseInt(B[D]);
                if (isNaN(C)) {
                    var E = 0;
                    if (B[D].charAt(0) == "-") {
                        E = 1;
                        B[D] = B[D].substring(1)
                    }
                    var F = in_array(this.columns, B[D], function (O) {
                        return O.id
                    });
                    if (F != -1) {
                        if (E) {
                            this.sort.push(-(F + 1))
                        } else {
                            this.sort.push(F + 1)
                        }
                    }
                } else {
                    this.sort.push(C)
                }
            }
        }
    }
    if (this.tabs) {
        this.tabIndex = this.tabs.add(this.getTabName(), {
            id: this.id,
            onLoad: this.initialize.bind(this)
        })
    } else {
        this.initialize()
    }
}
Listview.prototype = {
    initialize: function () {
        if (!this.data.length) {
            this.showNoData();
            return
        }
        if (this.computeDataFunc != null) {
            for (var E = 0, C = this.data.length; E < C; ++E) {
                this.computeDataFunc(this.data[E])
            }
        }
        if (this.tabs) {
            this.pounded = (this.tabs.poundedTab == this.tabIndex);
            if (this.pounded) {
                this.readPound()
            }
        } else {
            this.readPound()
        }
        this.updateSortIndex();
        var B;
        if (this.onBeforeCreate != null) {
            B = this.onBeforeCreate()
        }
        if (this.mode == 2) {
            this.mainDiv = ce("div");
            this.mainDiv.className = "listview-mode2";
            this.refreshRows();
            this.createBands(this.mainDiv)
        } else {
            this.table = ce("table");
            this.thead = ce("thead");
            this.tbody = ce("tbody");
            if (this.mode == 3) {
                this.tbody.className = "listview-mode3";
                var A = ce("colgroup");
                var F = (100 / this.nItemsPerRow) + "%";
                for (var E = 0; E < this.nItemsPerRow; ++E) {
                    var D = ce("col");
                    D.style.width = F;
                    ae(A, D)
                }
                ae(this.table, A)
            } else {
                this.tbody.className = "listview-std";
                this.createHeader();
                this.updateSortArrow()
            }
            ae(this.table, this.thead);
            ae(this.table, this.tbody);
            this.refreshRows();
            this.createBands(this.table);
            if (this.mode == 1 && Browser.ie) {
                setTimeout(Listview.cbIeFix.bind(this), 1)
            }
        }

        //	Сортируем при загрузке, дабы снизить нагрузку с сервера
        this.applySort();
        this.refreshRows();

        if (this.onAfterCreate != null) {
            this.onAfterCreate(B)
        }
    },
    createHeader: function () {
        var H = ce("tr");
        if (this.mode == 1) {
            var C = ce("th");
            var B = ce("div");
            var J = ce("a");
            C.style.width = "33px";
            if (this.poundable == 2) {
                J.style.cursor = "default";
                J.style.backgroundColor = "#585858"
            }
            J.href = "javascript:;";
            J.className = "listview-cb";
            ns(J);
            ae(J, ct(String.fromCharCode(160)));
            ae(B, J);
            ae(C, B);
            ae(H, C)
        }
        for (var E = 0, G = this.visibility.length; E < G; ++E) {
            var I = this.visibility[E];
            var D = this.columns[I];
            var C = ce("th");
            var B = ce("div");
            var J = ce("a");
            var A = ce("span");
            var F = ce("span");
            if (this.poundable == 2) {
                J.style.cursor = "default";
                J.style.backgroundColor = "#585858"
            }
            J.href = "javascript:;";
            J.onclick = this.sortBy.bind(this, I + 1);
            ns(J);
            if (D.tooltip != null) {
                J.onmouseover = Listview.headerOver.bind(J, D.tooltip);
                J.onmousemove = Tooltip.cursorUpdate;
                J.onmouseout = Tooltip.hide
            }
            if (D.width != null) {
                C.style.width = D.width
            }
            if (D.align != null) {
                C.style.textAlign = D.align
            }
            if (D.span != null) {
                C.colSpan = D.span
            }
            ae(F, ct(D.name));
            ae(A, F);
            ae(J, A);
            ae(B, J);
            ae(C, B);
            ae(H, C)
        }
        ae(this.thead, H)
    },
    createBands: function (E) {
        var C = ce("div"),
            D = ce("div");
        C.className = "listview-band-top";
        D.className = "listview-band-bottom";
        this.navTop = this.createNav();
        this.navBot = this.createNav();
        var A = ce("div"),
            B = ce("div");
        A.className = B.className = "listview-note";
        if (this.note) {
            A.innerHTML = this.note
        } else {
            if (this.createNote) {
                this.createNote(A, B)
            }
        }
        if (!A.firstChild && this.mode != 1) {
            ae(A, ct(String.fromCharCode(160)))
        }
        if (this.mode != 1) {
            ae(B, ct(String.fromCharCode(160)))
        }
        ae(C, this.navTop);
        ae(D, this.navBot);
        ae(C, A);
        ae(D, B);
        if (this.mode == 1) {
            ae(C, this.createCbBar());
            ae(D, this.createCbBar())
        }
        this.bandTop = C;
        this.bandBot = D;
        this.updateNav();
        if (this.hideBands != null) {
            C.style.display = D.style.display = "none"
        }
        ae(this.container, this.bandTop);
        ae(this.container, E);
        ae(this.container, this.bandBot)
    },
    createNav: function () {
        var B = ce("div");
        B.className = "listview-nav";
        var D = ce("a"),
            C = ce("a"),
            A = ce("a"),
            I = ce("a");
        D.href = C.href = A.href = I.href = "javascript:;";
        ae(D, ct(String.fromCharCode(171) + LANG.lvpage_first));
        ae(C, ct(String.fromCharCode(8249) + LANG.lvpage_previous));
        ae(A, ct(LANG.lvpage_next + String.fromCharCode(8250)));
        ae(I, ct(LANG.lvpage_last + String.fromCharCode(187)));
        ns(D);
        ns(C);
        ns(A);
        ns(I);
        D.onclick = this.firstPage.bind(this);
        C.onclick = this.previousPage.bind(this);
        A.onclick = this.nextPage.bind(this);
        I.onclick = this.lastPage.bind(this);
        var H = ce("span");
        var G = ce("b"),
            F = ce("b"),
            E = ce("b");
        ae(G, ct("a"));
        ae(F, ct("a"));
        ae(E, ct("a"));
        ae(H, G);
        ae(H, ct(LANG.hyphen));
        ae(H, F);
        ae(H, ct(LANG.lvpage_of));
        ae(H, E);
        ae(B, D);
        ae(B, C);
        ae(B, H);
        ae(B, A);
        ae(B, I);
        return B
    },
    createCbBar: function () {
        var F = ce("div");
        var C = ce("div");
        var B = ce("a"),
            A = ce("a"),
            E = ce("a");
        B.href = A.href = E.href = "javascript:;";
        ae(B, ct("All"));
        ae(A, ct("None"));
        ae(E, ct("Inverse"));
        B.onclick = Listview.cbSelect.bind(this, true);
        A.onclick = Listview.cbSelect.bind(this, false);
        E.onclick = Listview.cbSelect.bind(this, null);
        ns(B);
        ns(A);
        ns(E);
        ae(C, ct("Select: "));
        ae(C, B);
        ae(C, ct(LANG.comma));
        ae(C, A);
        ae(C, ct(LANG.comma));
        ae(C, E);
        if (this.createCbControls) {
            var D = ce("div");
            this.createCbControls(D, C);
            D.style.paddingBottom = "6px";
            ae(F, D)
        }
        ae(F, C);
        return F
    },
    refreshRows: function () {
        var B = this.data.length;
        var D = (this.mode == 2 ? this.mainDiv : this.tbody);
        while (D.firstChild) {
            D.removeChild(D.firstChild)
        }
        if (B > 0) {
            var G, A, F;
            if (this.nItemsPerPage > 0) {
                G = this.rowOffset;
                A = Math.min(B, this.rowOffset + this.nItemsPerPage)
            } else {
                G = 0;
                A = B
            }
            if (this.mode == 2) {
                for (var E = G; E < A; ++E) {
                    ae(this.mainDiv, this.getDiv(E))
                }
            } else {
                if (this.mode == 3) {
                    var C = 0,
                        H = ce("tr");
                    for (var E = G; E < A; ++E) {
                        ae(H, this.getCell(E));
                        if (++C == this.nItemsPerRow) {
                            ae(this.tbody, H);
                            if (E + 1 < A) {
                                H = ce("tr")
                            }
                            C = 0
                        }
                    }
                    if (C != 0) {
                        for (; C < 4; ++C) {
                            D = ce("td");
                            D.className = "empty-cell";
                            ae(H, D)
                        }
                        ae(this.tbody, H)
                    }
                } else {
                    for (var E = G; E < A; ++E) {
                        ae(this.tbody, this.getRow(E))
                    }
                }
            }
        } else {
            this.bandTop.style.display = this.bandBot.style.display = "none";
            if (this.mode == 2) {
                this.mainDiv.style.display = "none"
            } else {
                this.table.style.display = "none"
            }
            this.showNoData()
        }
    },
    showNoData: function () {
        var B = ce("div");
        B.className = "listview-nodata";
        var A = -1;
        if (this.template.onNoData) {
            A = (this.template.onNoData.bind(this, B))()
        }
        if (A == -1) {
            ae(B, ct(LANG.lvnodata))
        }
        ae(this.container, B)
    },
    getDiv: function (B) {
        var A = this.data[B];
        if (A.__div == null) {
            this.createDiv(A, B)
        }
        return A.__div
    },
    createDiv: function (A, B) {
        var C = ce("div");
        A.__div = C;
        (this.template.compute.bind(this, A, C, B))()
    },
    getCell: function (B) {
        var A = this.data[B];
        if (A.__div == null) {
            this.createCell(A, B)
        }
        return A.__td
    },
    createCell: function (A, B) {
        var C = ce("td");
        A.__td = C;
        (this.template.compute.bind(this, A, C, B))();
        if (this.template.getItemLink) {
            C.onclick = this.itemClick.bind(this, A)
        }
        if (Browser.ie6) {
            C.onmouseover = Listview.itemOver;
            C.onmouseout = Listview.itemOut
        }
    },
    getRow: function (A) {
        var B = this.data[A];
        if (B.__tr == null) {
            this.createRow(B)
        }
        return B.__tr
    },
    createRow: function (I) {
        var F = ce("tr");
        I.__tr = F;
        if (this.mode == 1) {
            var B = ce("td");
            B.className = "listview-cb";
            B.onclick = Listview.cbCellClick;
            var C = ce("input");
            ns(C);
            C.type = "checkbox";
            C.onclick = Listview.cbClick;
            if (I.__chk) {
                C.checked = true;
                if (Browser.ie) {
                    C.defaultChecked = true
                }
            }
            I.__cb = C;
            ae(B, C);
            ae(F, B)
        }
        for (var D = 0, E = this.visibility.length; D < E; ++D) {
            var G = this.visibility[D];
            var A = this.columns[G];
            var B = ce("td");
            if (A.align != null) {
                B.style.textAlign = A.align
            }
            var H = null;
            if (A.compute) {
                H = (A.compute.bind(this, I, B, F, G))()
            } else {
                if (I[A.value] != null) {
                    ae(B, ct(I[A.value]))
                } else {
                    H = -1
                }
            }
            if (H != -1 && H != null) {
                B.insertBefore(ct(H), B.firstChild)
            }
            ae(F, B)
        }
        if (this.mode == 1 && I.__chk) {
            F.className = "checked"
        }
        if (this.template.getItemLink) {
            F.onclick = this.itemClick.bind(this, I)
        }
        if (Browser.ie6) {
            F.onmouseover = Listview.itemOver;
            F.onmouseout = Listview.itemOut
        }
    },
    itemClick: function (A, D) {
        D = $E(D);
        var B = 0,
            C = D._target;
        while (C && B < 3) {
            if (C.nodeName == "A") {
                return
            }
            C = C.parentNode
        }
        location.href = this.template.getItemLink(A)
    },
    validatePage: function () {
        var C = this.nItemsPerPage,
            B = this.rowOffset,
            A = this.data.length;
        if (B < 0) {
            this.rowOffset = 0
        } else {
            this.rowOffset = this.getRowOffset(B + C > A ? A - 1 : B)
        }
    },
    getRowOffset: function (B) {
        var A = this.nItemsPerPage;
        return (A > 0 && B > 0 ? Math.floor(B / A) * A : 0)
    },
    changePage: function () {
        this.validatePage();
        this.refreshRows();
        this.updateNav();
        this.updatePound();
        var A = g_getScroll(),
            B = ac(this.container);
        if (A.y > B[1]) {
            scrollTo(A.x, B[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 (A, C) {
        var B = in_array(A, C, function (D) {
            return Math.abs(D)
        });
        if (B != -1) {
            C = A[B];
            A.splice(B, 1)
        }
        A.splice(0, 0, C)
    },
    sortBy: function (A) {
        if (this.poundable == 2 || A <= 0 || A > this.columns.length) {
            return
        }
        if (Math.abs(this.sort[0]) == A) {
            this.sort[0] = -this.sort[0]
        } else {
            this.addSort(this.sort, A)
        }
        this.applySort();
        if (this.template.onSort) {
            (this.template.onSort.bind(this))()
        }
        this.refreshRows();
        if (this.mode != 2) {
            this.updateSortArrow()
        }
        this.updatePound()
    },
    applySort: function () {
        Listview.sort = this.sort;
        Listview.columns = this.columns;
        if (this.indexCreated) {
            this.data.sort(Listview.sortIndexedRows)
        } else {
            this.data.sort(Listview.sortRows)
        }
        this.updateSortIndex()
    },
    setSort: function (B, A, C) {
        if (this.sort.toString() != B.toString()) {
            this.sort = B;
            this.applySort();
            if (A) {
                this.refreshRows()
            }
            if (C) {
                this.updatePound()
            }
        }
    },
    readPound: function () {
        if (!this.poundable || !location.hash.length) {
            return
        }
        var B = location.hash.substr(1);
        if (this.tabs) {
            var G = B.indexOf(":");
            if (G == -1) {
                return
            }
            B = B.substr(G + 1)
        }
        var A = parseInt(B);
        if (!isNaN(A)) {
            this.rowOffset = A;
            this.validatePage();
            if (this.poundable != 2) {
                var D = [];
                var F = B.match(/(\+|\-)[0-9]+/g);
                if (F != null) {
                    for (var C = F.length - 1; C >= 0; --C) {
                        var E = parseInt(F[C]) | 0;
                        var B = Math.abs(E);
                        if (B <= 0 || B > this.columns.length) {
                            break
                        }
                        this.addSort(D, E)
                    }
                    this.setSort(D, false, false)
                }
            }
            if (this.tabs) {
                this.tabs.setTabPound(this.tabIndex, this.getTabPound())
            }
        }
    },
    updateSortArrow: function () {
        if (!this.sort.length) {
            return
        }
        var A = in_array(this.visibility, Math.abs(this.sort[0]) - 1);
        if (A == -1) {
            return
        }
        if (this.mode == 1) {
            ++A
        }
        var B = this.thead.firstChild.childNodes[A].firstChild.firstChild.firstChild;
        if (this.lsa && this.lsa != B) {
            this.lsa.className = ""
        }
        B.className = (this.sort[0] < 0 ? "sortdesc" : "sortasc");
        this.lsa = B
    },
    updateSortIndex: function () {
        var B = this.data;
        for (var C = 0, A = B.length; C < A; ++C) {
            B[C].__si = C
        }
        this.indexCreated = true
    },
    updateTabName: function () {
        if (this.tabIndex != null) {
            this.tabs.setTabName(this.tabIndex, this.getTabName())
        }
    },
    updatePound: function () {
        if (!this.poundable) {
            return
        }
        var A = this.getTabPound();
        if (this.tabs) {
            this.tabs.setTabPound(this.tabIndex, A);
            location.replace("#" + this.id + ":" + A)
        } else {
            location.replace("#" + A)
        }
    },
    updateNav: function () {
        var J = this.nItemsPerPage,
            H = this.rowOffset,
            D = this.data.length;
        var B = 0,
            F = 0,
            C = 0,
            I = 0;
        if (J) {
            if (H > 0) {
                F = 1;
                if (H >= J + J) {
                    B = 1
                }
            }
            if (H + J < D) {
                C = 1;
                if (H + J + J < D) {
                    I = 1
                }
            }
        }
        var E = [this.navTop, this.navBot];
        for (var A = 0; A < 2; ++A) {
            var G = E[A].childNodes;
            G[0].style.display = (B ? "" : "none");
            G[1].style.display = (F ? "" : "none");
            G[3].style.display = (C ? "" : "none");
            G[4].style.display = (I ? "" : "none");
            G = G[2].childNodes;
            G[0].firstChild.nodeValue = H + 1;
            G[2].firstChild.nodeValue = J ? Math.min(H + J, D) : D;
            G[4].firstChild.nodeValue = D
        }
    },
    getTabName: function () {
        var A = this.name;
        var B = this.data.length;
        if (B > 0) {
            A += sprintf(LANG.qty, B)
        }
        return A
    },
    getTabPound: function () {
        var A = "";
        A += this.rowOffset;
        if (this.poundable != 2 && this.sort.length) {
            A += ("+" + this.sort.join("+")).replace(/\+\-/g, "-")
        }
        return A
    },
    getCheckedRows: function () {
        var D = [];
        for (var C = 0, A = this.data.length; C < A; ++C) {
            var B = this.data[C];
            if ((B.__cb && B.__cb.checked) || (!B.__cb && B.__chk)) {
                D.push(B)
            }
        }
        return D
    },
    deleteRows: function (M) {
        if (!M.length) {
            return
        }
        var C = 0;
        var H = 0;
        for (var E = M.length - 1; E >= 0; --E) {
            var L = M[E];
            var G = -1;
            if (L.__tr && L.__tr.rowIndex > 0) {
                G = this.rowOffset + L.__tr.rowIndex - 1
            } else {
                G = in_array(this.data, L);
                H = 1
            }
            if (G == -1) {
                continue
            }++C;
            var K = this.nItemsPerPage;
            var F = this.rowOffset;
            var J = F + (K > 0 ? K : this.data.length) - 1;
            if (G >= F && G <= J) {
                if (this.mode == 2) {
                    de(L.__div)
                } else {
                    de(L.__tr)
                }
            }
            this.data.splice(G, 1)
        }
        if (C == 0) {
            return
        }
        this.updateTabName();
        if (this.rowOffset >= this.data.length) {
            this.previousPage()
        } else {
            if (this.data.length == 0 || H) {
                this.refreshRows()
            }
            this.updateNav();
            var K = this.nItemsPerPage;
            var A = (this.mode == 2 ? this.mainDiv : this.tbody);
            var B = (this.mode == 2 ? this.getDiv : this.getRow);
            var I = A.childNodes.length;
            if (K > 0 && this.rowOffset + I < this.data.length) {
                for (var E = this.rowOffset + I, D = E + K - I; E < D; ++E) {
                    ae(A, B(E))
                }
            }
        }
    }
};
Listview.sortRows = function (C, B) {
    var G = Listview.sort,
        H = Listview.columns;
    for (var F = 0, A = G.length; F < A; ++F) {
        var E, D = H[Math.abs(G[F]) - 1];
        if (D.sortFunc) {
            E = D.sortFunc(C, B, G[F])
        } else {
            E = strcmp(C[D.value], B[D.value])
        }
        if (E != 0) {
            return E * G[F]
        }
    }
    return 0
}, Listview.sortIndexedRows = function (B, A) {
    var E = Listview.sort,
        F = Listview.columns;
    var D, C = F[Math.abs(E[0]) - 1];
    if (C.sortFunc) {
        D = C.sortFunc(B, A, E[0])
    } else {
        D = strcmp(B[C.value], A[C.value])
    }
    if (D != 0) {
        return D * E[0]
    }
    return B.__si - A.__si
}, Listview.cbSelect = function (B) {
    for (var D = 0, A = this.data.length; D < A; ++D) {
        var C = this.data[D];
        var F = B;
        if (C.__tr) {
            var E = C.__tr.firstChild.firstChild;
            if (F == null) {
                F = !E.checked
            }
            if (E.checked != F) {
                E.checked = F;
                C.__tr.className = (E.checked ? "checked" : "");
                if (Browser.ie) {
                    E.defaultChecked = F;
                    if (Browser.ie6) {
                        (Listview.itemOut.bind(C.__tr))()
                    }
                }
            }
        } else {
            if (F == null) {
                F = true
            }
        }
        C.__chk = F
    }
};
Listview.cbClick = function (A) {
    setTimeout(Listview.cbUpdate.bind(0, 0, this, this.parentNode.parentNode), 1);
    sp(A)
};
Listview.cbCellClick = function (A) {
    setTimeout(Listview.cbUpdate.bind(0, 1, this.firstChild, this.parentNode), 1);
    sp(A)
};
Listview.cbIeFix = function () {
    var D = gE(this.tbody, "tr");
    for (var C = 0, A = D.length; C < A; ++C) {
        var B = D[C].firstChild.firstChild;
        B.checked = B.defaultChecked = false
    }
};
Listview.cbUpdate = function (B, A, C) {
    if (B) {
        A.checked = !A.checked
    }
    C.className = (A.checked ? "checked" : "");
    if (Browser.ie) {
        A.defaultChecked = A.checked;
        if (Browser.ie6) {
            (Listview.itemOver.bind(C))()
        }
    }
};
Listview.itemOver = function () {
    this.style.backgroundColor = (this.className == "checked" ? "#2C2C2C" : "#202020")
};
Listview.itemOut = function () {
    this.style.backgroundColor = (this.className == "checked" ? "#242424" : "transparent")
};
Listview.headerOver = function (B, A) {
    Tooltip.showAtCursor(A, B, 0, 0, "q")
};
Listview.extraCols = {
    cost: {
        id: "cost",
        name: LANG.cost,
        compute: function (A, B) {
            Listview.funcBox.appendMoney(B, A.cost[0], null, A.cost[1], A.cost[2], A.cost[3])
        },
        sortFunc: function (B, A, C) {
            var E = 0,
                D = 0;
            if (B.cost[3] != null) {
                array_walk(B.cost[3], function (F, G, G, H) {
                    E += Math.pow(10, H) + F[1]
                })
            }
            if (A.cost[3] != null) {
                array_walk(A.cost[3], function (F, G, G, H) {
                    D += Math.pow(10, H) + F[1]
                })
            }
            return strcmp(E, D) || strcmp(B.cost[2], A.cost[2]) || strcmp(B.cost[1], A.cost[1]) || strcmp(B.cost[0], A.cost[0])
        }
    },
    count: {
        id: "count",
        name: LANG.count,
        width: "11%",
        value: "count",
        compute: function (B, C) {
            if (B.outof) {
                var A = ce("div");
                A.className = "small q0";
                ae(A, ct(sprintf(LANG.lvdrop_outof, B.outof)));
                ae(C, A)
            }
            return B.count
        }
    },
    percent: {
        id: "percent",
        name: "%",
        width: "10%",
        value: "percent",
        compute: function (A, B) {
            if (A.percent >= 1.95) {
                return A.percent.toFixed(0)
            } else if (A.percent < 0) {
                return ((-1 * A.percent) + ' (' + LANG.types[5][0] + ')')
            } else {
                return parseFloat(A.percent.toFixed(4))
            }
        }
    },
    stock: {
        id: "stock",
        name: LANG.stock,
        width: "10%",
        value: "stock",
        compute: function (A, B) {
            if (A.stock > 0) {
                return A.stock
            } else {
                B.style.fontFamily = "Verdana, sans-serif";
                return String.fromCharCode(8734)
            }
        }
    }
};
Listview.funcBox = {
    createSimpleCol: function (C, D, A, B) {
        return {
            id: C,
            name: LANG[D],
            width: A,
            value: B
        }
    },
    initLootTable: function (A) {
        if (this._totalCount != null) {
            A.percent = A.count / this._totalCount
        } else {
            A.percent = A.count / A.outof
        }
        A.percent *= 100
    },
    beforeUserComments: function () {
        if ((g_user.roles & 26) != 0) {
            this.mode = 1;
            this.createCbControls = function (B) {
                var A = ce("input");
                A.type = "button";
                A.value = "Delete";
                A.onclick = (function () {
                    var E = this.getCheckedRows();
                    if (!E.length) {
                        alert("No comments selected.")
                    } else {
                        if (confirm("Are you sure that you want to delete " + (E.length == 1 ? "this comment" : "these " + E.length + " comments") + "?")) {
                            var C = "";
                            var D = 0;
                            array_walk(E, function (F) {
                                if (F.purged == 0 && F.deleted == 0) {
                                    F.deleted = 1;
                                    if (F.__tr != null) {
                                        F.__tr.childNodes[2].lastChild.lastChild.firstChild.nodeValue = " (Deleted)"
                                    }
                                    C += F.id + ","
                                } else {
                                    if (F.purged == 1) {
                                        ++D
                                    }
                                }
                            });
                            C = rtrim(C, ",");
                            if (C != "") {
                                new Ajax("?comment=delete&id=" + C + "&username=" + g_pageInfo.username)
                            }(Listview.cbSelect.bind(this, false))();
                            if (D > 0) {
                                alert("Purged comments cannot be deleted.\n\nA purged comment is a comment that has been\nautomatically removed from the site due to a negative rating.")
                            }
                        }
                    }
                }).bind(this);
                ae(B, A);
                if (g_user.roles & 26) {
                    var A = ce("input");
                    A.type = "button";
                    A.value = "Undelete";
                    A.onclick = (function () {
                        var D = this.getCheckedRows();
                        if (!D.length) {
                            alert("No comments selected.")
                        } else {
                            var C = "";
                            array_walk(D, function (E) {
                                if (E.deleted == 1) {
                                    E.deleted = 0;
                                    if (E.__tr != null) {
                                        E.__tr.childNodes[2].lastChild.lastChild.firstChild.nodeValue = ""
                                    }
                                    C += E.id + ","
                                }
                            });
                            C = rtrim(C, ",");
                            if (C != "") {
                                new Ajax("?comment=undelete&id=" + C + "&username=" + g_pageInfo.username)
                            }(Listview.cbSelect.bind(this, false))()
                        }
                    }).bind(this);
                    ae(B, A)
                }
            }
        }
    },
    assocArrCmp: function (C, B, A) {
        if (C == null) {
            return -1
        } else {
            if (B == null) {
                return 1
            }
        }
        var F = Math.max(C.length, B.length);
        for (var E = 0; E < F; ++E) {
            if (C[E] == null) {
                return -1
            } else {
                if (B[E] == null) {
                    return 1
                }
            }
            var D = strcmp(A[C[E]], A[B[E]]);
            if (D != 0) {
                return D
            }
        }
        return 0
    },
    location: function (E, F) {
        if (E.location == null) {
            return -1
        }
        for (var D = 0, B = E.location.length; D < B; ++D) {
            if (D > 0) {
                ae(F, ct(LANG.comma))
            }
            var A = E.location[D];
            if (A == -1) {
                ae(F, ct(LANG.ellipsis))
            } else {
                var C = ce("a");
                C.className = "q1";
                C.href = "?zone=" + A;
                ae(C, ct(g_zones[A]));
                ae(F, C)
            }
        }
    },
    createCenteredIcons: function (I, C, L) {
        if (I != null) {
            var H = ce("div"),
                A = ce("div");
            if (L) {
                var G = ce("div");
                G.style.position = "relative";
                G.style.width = "1px";
                var J = ce("div");
                J.className = "q0";
                J.style.position = "absolute";
                J.style.right = "2px";
                J.style.lineHeight = "26px";
                J.style.fontSize = "11px";
                J.style.whiteSpace = "nowrap";
                ae(J, ct(L));
                ae(G, J);
                ae(H, G)
            }
            for (var D = 0, F = I.length; D < F; ++D) {
                var B, E;
                if (typeof I[D] == "object") {
                    B = I[D][0];
                    E = I[D][1]
                } else {
                    B = I[D]
                }
                var K = g_items.createIcon(B, 0, E);
                K.style.cssFloat = K.style.styleFloat = "left";
                ae(H, K)
            }
            H.style.margin = "0 auto";
            H.style.textAlign = "left";
            H.style.width = (26 * I.length) + "px";
            A.className = "clear";
            ae(C, H);
            ae(C, A);
            return true
        }
    },
    getItemType: function (C, B, A) {
        if (A != null && g_item_subsubclasses[C] != null && g_item_subsubclasses[C][B] != null) {
            return g_item_subsubclasses[C][B][A]
        }
        if (g_item_subclasses[C] != null) {
            return g_item_subclasses[C][B]
        } else {
            return g_item_classes[C]
        }
    },
    getQuestCategory: function (A) {
        if (A > 0) {
            return g_zones[A]
        } else {
            return g_quest_sorts[-A]
        }
    },
    createTextRange: function (B, A) {
        B |= 0;
        A |= 0;
        if (B > 1 || A > 1) {
            if (B != A && A > 0) {
                return B + "-" + A
            } else {
                return B + ""
            }
        }
        return null
    },
    coGetColor: function (C, A) {
        if (C.user && g_customColors[C.user]) {
            return " comment-" + g_customColors[C.user]
        }
        switch (A) {
        case -1:
            var B = C.divPost.childNodes[1].className.match(/comment-([a-z]+)/);
            if (B != null) {
                return " comment-" + B[1]
            }
            break;
        case 3:
        case 4:
            if (C.roles & 24) {
                return " comment-green"
            }
            break
        }
        if (C.roles & 2) {
            return " comment-blue"
        } else {
            if (C.rating >= 10) {
                return " comment-green"
            } else {
                if (C.rating < 0) {
                    return " comment-bt"
                }
            }
        }
        return ""
    },
    coToggleVis: function (A) {
        this.firstChild.nodeValue = (g_toggleDisplay(A.divBody) ? LANG.lvcomment_hide : LANG.lvcomment_show);
        if (A.ratable) {
            A.divHeader.firstChild.lastChild.style.display = ""
        }
        g_toggleDisplay(A.divLinks);
        if (A.lastEdit != null) {
            g_toggleDisplay(A.divLastEdit)
        }
    },
    coRate: function (D, B) {
        if (B == 0) {
            var A = 5;
            if (g_user.roles & 2) {
                A = 25
            } else {
                if (g_user.roles & 16) {
                    A = 15
                }
            }
            var C = prompt(sprintf(LANG.prompt_customrating, A, A), 0);
            if (C == null) {
                return
            } else {
                C |= 0;
                if (C != 0 && Math.abs(C) <= A) {
                    B = C
                }
            }
            if (B == 0) {
                return
            }
        } else {
            if (g_user.roles & 26) {
                B *= 5
            }
        }
        new Ajax("?comment=rate&id=" + D.id + "&rating=" + B);
        D.rating += B;
        _ = D.divHeader.firstChild;
        _ = _.childNodes[_.childNodes.length - 3];
        _.lastChild.firstChild.nodeValue = (D.rating > 0 ? "+" : "") + D.rating;
        Tooltip.hide();
        de(_.nextSibling);
        de(_.nextSibling)
    },
    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) {
        G.divBody.style.display = "none";
        G.divLinks.firstChild.style.display = "none";
        var F = 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 C = Listview.funcBox.coEditAppend(F, G, E);
        var B = ce("div");
        B.className = "comment-edit-buttons";
        var D = ce("input");
        D.type = "button";
        D.value = LANG.compose_save;
        D.onclick = Listview.funcBox.coEditButton.bind(D, G, true, E);
        ae(B, D);
        ae(B, ct(" "));
        D = ce("input");
        D.type = "button";
        D.value = LANG.compose_cancel;
        D.onclick = Listview.funcBox.coEditButton.bind(D, G, false, E);
        ae(B, D);
        ae(F, B);
        var A = F;
        if (Browser.ie6) {
            A = ce("div");
            A.style.width = "99%";
            ae(A, F)
        }
        if (E == -1) {
            G.divPost.insertBefore(A, G.divBody.nextSibling)
        } else {
            G.__div.insertBefore(A, G.divBody.nextSibling)
        }
        C.focus()
    },
    coEditAppend: function (L, C, K) {
        var F = Listview.funcBox.coGetCharLimit(K);
        if (K == 1 || K == 3 || K == 4) {
            C.user = g_user.name;
            C.roles = g_user.roles;
            C.rating = 1
        } else {
            if (K >= 1) {
                C.roles = 0;
                C.rating = 1
            }
        }
        if (K == -1 || K == 0) {
            var J = ce("div");
            J.className = "comment-edit-modes";
            ae(J, ct(LANG.compose_mode));
            var P = ce("a");
            P.className = "selected";
            P.onclick = Listview.funcBox.coModeLink.bind(P, 1, K);
            P.href = "javascript:;";
            ae(P, ct(LANG.compose_edit));
            ae(J, P);
            ae(J, ct("|"));
            var N = ce("a");
            N.onclick = Listview.funcBox.coModeLink.bind(N, 2, K);
            N.href = "javascript:;";
            ae(N, ct(LANG.compose_preview));
            ae(J, N);
            ae(L, J)
        }
        var A = ce("div");
        A.style.display = "none";
        A.className = "comment-body" + Listview.funcBox.coGetColor(C, K);
        ae(L, A);
        var H = ce("div");
        H.className = "comment-edit-body";
        var G = ce("div");
        G.className = "toolbar";
        var I = ce("textarea");
        I.className = "comment-editbox";
        I.rows = 10;
        I.value = C.body;
        switch (K) {
        case 1:
            I.name = "commentbody";
            break;
        case 2:
            I.name = "desc";
            I.originalValue = C.body;
            break;
        case 3:
            I.name = "body";
            break;
        case 4:
            I.name = "sig";
            I.originalValue = C.body;
            I.rows = (Browser.gecko ? 2 : 3);
            I.style.height = "auto";
            break
        }
        if (K != -1 && K != 0) {
            var E = ce("h3"),
                W = ce("a"),
                O = ce("div"),
                V = ce("div");
            var D = Listview.funcBox.coLivePreview.bind(I, C, K, O);
            if (C.body) {
                W.className = "disclosure-off";
                O.style.display = "none"
            } else {
                W.className = "disclosure-on"
            }
            ae(W, ct(LANG.compose_livepreview));
            ae(E, W);
            W.href = "javascript:;";
            W.onclick = function () {
                D(1);
                W.className = "disclosure-" + (g_toggleDisplay(O) ? "on" : "off")
            };
            ns(W);
            E.className = "first";
            V.className = "pad";
            ae(A, E);
            ae(A, O);
            ae(A, V);
            var U;
            var T = function () {
                    if (U) {
                        clearTimeout(U);
                        U = null
                    }
                    U = setTimeout(D, 50)
                };
            I.onchange = T;
            I.onkeyup = T;
            aE(I, "focus", function () {
                D();
                A.style.display = "";
                if (K != 4) {
                    I.style.height = "22em"
                }
            })
        } else {
            if (K != 4) {
                aE(I, "focus", function () {
                    I.style.height = "22em"
                })
            }
        }
        var S = [{
            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 Y = prompt(LANG.prompt_linkurl, "http://");
                if (Y) {
                    g_insertTag(I, "[url=" + Y + "]", "[/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 (Y) {
                return Y.replace(/\n/g, "[/li]\n[li]")
            }
        },
                    {
            id: "ol",
            title: LANG.markup_ol,
            pre: "[ol]\n[li]",
            post: "[/li]\n[/ol]",
            rep: function (Y) {
                return Y.replace(/\n/g, "[/li]\n[li]")
            }
        },
                    {
            id: "li",
            title: LANG.markup_li,
            pre: "[li]",
            post: "[/li]"
        }];
        for (var Q = 0, R = S.length; Q < R; ++Q) {
            var B = S[Q];
            if (K == 4 && B.id == "quote") {
                break
            }
            var M = ce("button");
            var X = ce("img");
            M.setAttribute("type", "button");
            M.title = B.title;
            if (B.onclick != null) {
                M.onclick = B.onclick
            } else {
                M.onclick = g_insertTag.bind(0, I, B.pre, B.post, B.rep)
            }
            X.src = "templates/wowhead/images/pixel.gif";
            X.className = "toolbar-" + B.id;
            ae(M, X);
            ae(G, M)
        }
        ae(H, G);
        ae(H, I);
        ae(H, ce("br"));
        if (K == 4) {
            ae(H, ct(sprintf(LANG.compose_limit2, F)))
        } else {
            ae(H, ct(sprintf(LANG.compose_limit, F)))
        }
        ae(L, H);
        return I
    },
    coLivePreview: function (E, F, A, B) {
        if (B != 1 && A.style.display == "none") {
            return
        }
        var C = this,
            I = Listview.funcBox.coGetCharLimit(F),
            G = (C.value.length > I ? C.value.substring(0, I) : C.value);
        if (F == 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
        });
        if (D) {
            A.innerHTML = D
        } else {
            A.innerHTML = '<span class="q6">...</span>'
        }
    },
    coEditButton: function (E, D, B) {
        if (D) {
            var A = gE(E.divEdit, "textarea")[0];
            if (!Listview.funcBox.coValidate(A, B)) {
                return
            }
            if (A.value != E.body) {
                var C = 0;
                if (E.lastEdit != null) {
                    C = E.lastEdit[1]
                }++C;
                E.lastEdit = [g_serverTime, C, g_user.name];
                Listview.funcBox.coUpdateLastEdit(E);
                E.divBody.innerHTML = Markup.toHtml((A.value.length > 7500 ? A.value.substring(0, 7500) : A.value), {
                    mode: Markup.MODE_COMMENT
                });
                E.body = A.value;
                if (B == -1) {
                    new Ajax("?forums=editpost&id=" + E.id, {
                        method: "POST",
                        params: "body=" + urlencode(E.body)
                    })
                } else {
                    new Ajax("?comment=edit&id=" + E.id, {
                        method: "POST",
                        params: "body=" + urlencode(E.body)
                    })
                }
            }
        }
        E.divBody.style.display = "";
        E.divLinks.firstChild.style.display = "";
        de(E.divEdit);
        E.divEdit = null
    },
    coGetCharLimit: function (A) {
        if (A == 4) {
            return 250
        } else {
            return 7500
        }
    },
    coModeLink: function (D, A) {
        var I = Listview.funcBox.coGetCharLimit(D);
        var B = Markup.MODE_COMMENT;
        array_walk(gE(this.parentNode, "a"), function (J) {
            J.className = ""
        });
        this.className = "selected";
        var C = gE(this.parentNode.parentNode, "textarea")[0],
            H = C.parentNode,
            E = H.previousSibling;
        if (A == 4) {
            B = Markup.MODE_SIGNATURE
        }
        switch (D) {
        case 1:
            H.style.display = "";
            E.style.display = "none";
            H.firstChild.focus();
            break;
        case 2:
            H.style.display = "none";
            var F = (C.value.length > I ? C.value.substring(0, I) : C.value);
            if (A == 4) {
                var G;
                if ((G = F.indexOf("\n")) != -1 && (G = F.indexOf("\n", G + 1)) != -1 && (G = F.indexOf("\n", G + 1)) != -1) {
                    F = F.substring(0, G)
                }
            }
            E.innerHTML = Markup.toHtml(F, {
                mode: B
            });
            E.style.display = "";
            break
        }
    },
    coReply: function (B) {
        document.forms.addcomment.elements.replyto.value = B.replyTo;
        var A = ge("replybox-generic");
        gE(A, "span")[0].innerHTML = B.user;
        A.style.display = "";
        co_addYourComment()
    },
    coValidate: function (A, B) {
        B |= 0;
        if (B == 1 || B == -1) {
            if (trim(A.value).length < 1) {
                alert(LANG.message_forumposttooshort);
                return false
            }
        } else {
            if (trim(A.value).length < 10) {
                alert(LANG.message_commenttooshort);
                return false
            }
        }
        if (A.value.length > 7500) {
            if (!confirm(sprintf((B == 1 ? LANG.confirm_forumposttoolong : LANG.confirm_commenttoolong), A.value.substring(7470, 7500)))) {
                return false
            }
        }
        return true
    },
    coCustomRatingOver: function (A) {
        Tooltip.showAtCursor(A, LANG.tooltip_customrating, 0, 0, "q")
    },
    coPlusRatingOver: function (A) {
        Tooltip.showAtCursor(A, LANG.tooltip_uprate, 0, 0, "q2")
    },
    coMinusRatingOver: function (A) {
        Tooltip.showAtCursor(A, LANG.tooltip_downrate, 0, 0, "q7")
    },
    coSortDate: function (A) {
        A.nextSibling.nextSibling.className = "";
        A.className = "selected";
        this.mainDiv.className = "listview-aci";
        this.setSort([1], true, false)
    },
    coSortHighestRatedFirst: function (A) {
        A.previousSibling.previousSibling.className = "";
        A.className = "selected";
        this.mainDiv.className = "";
        this.setSort([-3, 2], true, false)
    },
    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 D = new Date(E[0]);
            var A = (g_serverTime - D) / 1000;
            if (B.childNodes[3].firstChild) {
                de(B.childNodes[3].firstChild)
            }
            Listview.funcBox.coFormatDate(B.childNodes[3], A, D);
            var C = "";
            if (F.rating != null) {
                C += LANG.lvcomment_patch1 + g_getPatchVersion(D) + LANG.lvcomment_patch2
            }
            if (E[1] > 1) {
                C += LANG.dash + sprintf(LANG.lvcomment_nedits, E[1])
            }
            B.childNodes[4].nodeValue = C;
            B.style.display = ""
        } else {
            B.style.display = "none"
        }
    },
    coFormatDate: function (E, A, D, F, G) {
        var C;
        if (A < 2592000) {
            txt = sprintf(LANG.date_ago, g_formatTimeElapsed(A));
            var B = D;
            B.setTime(B.getTime() + (g_localTime - g_serverTime));
            E.style.cursor = "help";
            E.title = B.toLocaleString()
        } else {
            txt = LANG.date_on + g_formatDateSimple(D, F);
            E.style.cursor = E.title = ""
        }
        if (G == 1) {
            txt = txt.substr(0, 1).toUpperCase() + txt.substr(1)
        }
        C = ct(txt);
        ae(E, C)
    },
    ssCellOver: function () {
        this.className = "screenshot-caption-over"
    },
    ssCellOut: function () {
        this.className = "screenshot-caption"
    },
    ssCellClick: function (B, D) {
        D = $E(D);
        if (D.shiftKey || D.ctrlKey) {
            return
        }
        var A = 0,
            C = D._target;
        while (C && A < 3) {
            if (C.nodeName == "A") {
                return
            }
            if (C.nodeName == "IMG") {
                break
            }
            C = C.parentNode
        }
        ScreenshotViewer.show({
            screenshots: this.data,
            pos: B
        })
    },
    moneyHonorOver: function (A) {
        Tooltip.showAtCursor(A, "<b>" + LANG.tooltip_honorpoints + "</b>", 0, 0, "q")
    },
    moneyArenaOver: function (A) {
        Tooltip.showAtCursor(A, "<b>" + LANG.tooltip_arenapoints + "</b>", 0, 0, "q")
    },
    appendMoney: function (E, A, F, J, K, B) {
        var I, H = 0;
        if (A >= 10000) {
            H = 1;
            I = ce("span");
            I.className = "moneygold";
            ae(I, ct(Math.floor(A / 10000)));
            ae(E, I);
            A %= 10000
        }
        if (A >= 100) {
            if (H) {
                ae(E, ct(" "))
            } else {
                H = 1
            }
            I = ce("span");
            I.className = "moneysilver";
            ae(I, ct(Math.floor(A / 100)));
            ae(E, I);
            A %= 100
        }
        if (A >= 1 || F != null) {
            if (H) {
                ae(E, ct(" "))
            } else {
                H = 1
            }
            I = ce("span");
            I.className = "moneycopper";
            ae(I, ct(A));
            ae(E, I)
        }
        if (J != null && J != 0) {
            if (H) {
                ae(E, ct(" "))
            } else {
                H = 1
            }
            I = ce("span");
            I.className = "money" + (J < 0 ? "horde" : "alliance") + " tip";
            I.onmouseover = Listview.funcBox.moneyHonorOver;
            I.onmousemove = Tooltip.cursorUpdate;
            I.onmouseout = Tooltip.hide;
            ae(I, ct(number_format(Math.abs(J))));
            ae(E, I)
        }
        if (K >= 1) {
            if (H) {
                ae(E, ct(" "))
            } else {
                H = 1
            }
            I = ce("span");
            I.className = "moneyarena tip";
            I.onmouseover = Listview.funcBox.moneyArenaOver;
            I.onmousemove = Tooltip.cursorUpdate;
            I.onmouseout = Tooltip.hide;
            ae(I, ct(number_format(K)));
            ae(E, I)
        }
        if (B != null) {
            for (var C = 0; C < B.length; ++C) {
                if (H) {
                    ae(E, ct(" "))
                } else {
                    H = 1
                }
                var G = B[C][0];
                var D = B[C][1];
                I = ce("a");
                I.href = "?item=" + G;
                I.className = "moneyitem";
                I.style.backgroundImage = "url(images/icons/small/" + g_items.getIcon(G).toLowerCase() + ".png)";
                ae(I, ct(D));
                ae(E, I)
            }
        }
    }
};
Listview.templates = {
    faction: {
        sort: [1],
        nItemsPerPage: -1,
        columns: [{
            id: "name",
            name: LANG.name,
            align: "left",
            value: "name",
            compute: function (C, D) {
                var A = ce("a");
                A.style.fontFamily = "Verdana, sans-serif";
                A.href = this.template.getItemLink(C);
                ae(A, ct(C.name));
                if (C.expansion == 1) {
                    var B = ce("span");
                    B.className = "bc-icon";
                    ae(B, A);
                    ae(D, B)
                } else {
                    ae(D, A)
                }
            }
        },
                    {
            id: "group",
            name: LANG.group,
            value: "group",
            compute: function (A, B) {
                if (A.group != null) {
                    return A.group
                }
            }
        },
                    {
            id: "side",
            name: LANG.side,
            width: "10%",
            compute: function (B, C) {
                if (B.side) {
                    var A = ce("span");
                    A.className = (B.side == 1 ? "alliance-icon" : "horde-icon");
                    ae(A, ct(g_sides[B.side]));
                    ae(C, A)
                }
            },
            sortFunc: function (B, A, C) {
                return strcmp(g_sides[B.side], g_sides[A.side])
            }
        }],
        getItemLink: function (A) {
            return "?faction=" + A.id
        }
    },
    item: {
        sort: [1],
        columns: [{
            id: "name",
            name: LANG.name,
            align: "left",
            span: 2,
            value: "name",
            compute: function (D, G, E) {
                var C = ce("td");
                C.style.width = "1px";
                C.style.padding = "0";
                C.style.borderRight = "none";
                var B = null,
                    F = null;
                if (D.stack != null) {
                    B = Listview.funcBox.createTextRange(D.stack[0], D.stack[1])
                }
                if (D.avail != null) {
                    F = D.avail
                }
                ae(C, g_items.createIcon(D.id, 1, B, F));
                ae(E, C);
                G.style.borderLeft = "none";
                var A = ce("a");
                A.className = "q" + (6 - parseInt(D.name.charAt(0)));
                A.style.fontFamily = "Verdana, sans-serif";
                A.href = this.template.getItemLink(D);
                ae(A, ct(D.name.substring(1)));
                ae(G, A)
            }
        },
                    {
            id: "level",
            name: LANG.level,
            width: "7%",
            value: "level",
            sortFunc: function (B, A, C) {
                return strcmp(B.level, A.level) || strcmp(B.reqlevel, A.reqlevel)
            }
        },
                    {
            id: "reqlevel",
            name: LANG.req,
            tooltip: LANG.tooltip_reqlevel,
            width: "7%",
            value: "reqlevel",
            compute: function (A, B) {
                if (A.reqlevel > 1) {
                    return A.reqlevel
                }
            },
            sortFunc: function (B, A, C) {
                return strcmp(B.reqlevel, A.reqlevel) || strcmp(B.level, A.level)
            }
        },
                    {
            id: "dps",
            name: LANG.dps,
            width: "10%",
            value: "dps",
            compute: function (A, B) {
                return (A.dps || 0).toFixed(1)
            },
            hidden: true
        },
                    {
            id: "speed",
            name: LANG.speed,
            width: "10%",
            value: "speed",
            compute: function (A, B) {
                return (A.speed || 0).toFixed(2)
            },
            hidden: true
        },
                    {
            id: "armor",
            name: LANG.armor,
            width: "10%",
            value: "armor",
            compute: function (A, B) {
                if (A.armor > 0) {
                    return A.armor
                }
            },
            hidden: true
        },
                    {
            id: "slot",
            name: LANG.slot,
            width: "10%",
            compute: function (A, B) {
                return g_item_slots[A.slot]
            },
            sortFunc: function (B, A, C) {
                return strcmp(g_item_slots[B.slot], g_item_slots[A.slot])
            },
            hidden: true
        },
                    {
            id: "slots",
            name: LANG.slots,
            width: "10%",
            value: "nslots",
            hidden: true
        },
                    {
            id: "skill",
            name: LANG.skill,
            width: "10%",
            value: "skill",
            hidden: true
        },
                    {
            id: "source",
            name: LANG.source,
            width: "12%",
            compute: function (C, D) {
                if (C.source != null) {
                    for (var B = 0, A = C.source.length; B < A; ++B) {
                        if (B > 0) {
                            ae(D, ct(LANG.comma))
                        }
                        ae(D, ct(g_sources[C.source[B]]))
                    }
                }
            },
            sortFunc: function (B, A, C) {
                return Listview.funcBox.assocArrCmp(B.source, A.source, g_sources)
            }
        },
                    {
            id: "type",
            name: LANG.type,
            width: "14%",
            compute: function (C, D) {
                D.className = "small q1";
                var A = ce("a");
                var B = "?items=" + C.classs;
                if (g_item_subclasses[C.classs] != null) {
                    B += "." + C.subclass
                }
                if (C.subsubclass != null && g_item_subsubclasses[C.classs][C.subclass] != null) {
                    B += "." + C.subsubclass
                }
                A.href = B;
                ae(A, ct(Listview.funcBox.getItemType(C.classs, C.subclass, C.subsubclass)));
                ae(D, A)
            },
            sortFunc: function (B, A, D) {
                var C = Listview.funcBox.getItemType;
                return strcmp(C(B.classs, B.subclass, B.subsubclass), C(A.classs, A.subclass, A.subsubclass))
            }
        }],
        getItemLink: function (A) {
            return "?item=" + A.id
        }
    },
    itemset: {
        sort: [1],
        nItemsPerPage: 75,
        columns: [{
            id: "name",
            name: LANG.name,
            align: "left",
            value: "name",
            compute: function (B, D) {
                var A = ce("a");
                A.className = "q" + (6 - parseInt(B.name.charAt(0)));
                A.style.fontFamily = "Verdana, sans-serif";
                A.href = this.template.getItemLink(B);
                ae(A, ct(B.name.substring(1)));
                ae(D, A);
                if (B.note) {
                    var C = ce("div");
                    C.className = "small";
                    ae(C, ct(g_itemset_notes[B.note]));
                    ae(D, C)
                }
            }
        },
                    {
            id: "level",
            name: LANG.level,
            compute: function (A, B) {
                if (A.minlevel > 0 && A.maxlevel > 0) {
                    if (A.minlevel != A.maxlevel) {
                        return A.minlevel + LANG.hyphen + A.maxlevel
                    } else {
                        return A.minlevel
                    }
                } else {
                    return -1
                }
            },
            sortFunc: function (B, A, C) {
                if (C > 0) {
                    return strcmp(B.minlevel, A.minlevel) || strcmp(B.maxlevel, A.maxlevel)
                } else {
                    return strcmp(B.maxlevel, A.maxlevel) || strcmp(B.minlevel, A.minlevel)
                }
            }
        },
                    {
            id: "pieces",
            name: LANG.pieces,
            compute: function (A, B) {
                B.style.padding = "0";
                Listview.funcBox.createCenteredIcons(A.pieces, B)
            },
            sortFunc: function (B, A) {
                var D = (B.pieces != null ? B.pieces.length : 0);
                var C = (A.pieces != null ? A.pieces.length : 0);
                return strcmp(D, C)
            }
        },
                    {
            id: "type",
            name: LANG.type,
            compute: function (A, B) {
                return g_itemset_types[A.type]
            },
            sortFunc: function (B, A, C) {
                return strcmp(g_itemset_types[B.type], g_itemset_types[A.type])
            }
        },
                    {
            id: "classes",
            name: LANG.classes,
            compute: function (C, D) {
                if (C.classes != null) {
                    for (var B = 0, A = C.classes.length; B < A; ++B) {
                        if (B > 0) {
                            ae(D, ct(LANG.comma))
                        }
                        ae(D, ct(g_chr_classes[C.classes[B]]))
                    }
                }
            },
            sortFunc: function (B, A, C) {
                return Listview.funcBox.assocArrCmp(B.classes, A.classes, g_chr_classes)
            }
        }],
        getItemLink: function (A) {
            return "?itemset=" + A.id
        }
    },
    npc: {
        sort: [1],
        nItemsPerPage: 100,
        columns: [{
            id: "name",
            name: LANG.name,
            align: "left",
            value: "name",
            compute: function (B, D) {
                var A = ce("a");
                A.style.fontFamily = "Verdana, sans-serif";
                A.href = this.template.getItemLink(B);
                ae(A, ct(B.name));
                ae(D, A);
                if (B.tag != null) {
                    var C = ce("div");
                    C.className = "small";
                    ae(C, ct("<" + B.tag + ">"));
                    ae(D, C)
                }
            }
        },
                    {
            id: "level",
            name: LANG.level,
            width: "10%",
            compute: function (A, C) {
                if (A.classification) {
                    var B = ce("div");
                    B.className = "small";
                    ae(B, ct(g_npc_classifications[A.classification]));
                    ae(C, B)
                }
                if (A.classification == 3) {
                    return "??"
                }
                if (A.minlevel > 0 && A.maxlevel > 0) {
                    if (A.minlevel != A.maxlevel) {
                        return A.minlevel + LANG.hyphen + A.maxlevel
                    } else {
                        return A.minlevel
                    }
                }
                return -1
            },
            sortFunc: function (B, A, C) {
                if (C > 0) {
                    return strcmp(B.minlevel, A.minlevel) || strcmp(B.maxlevel, A.maxlevel) || strcmp(B.classification, A.classification)
                } else {
                    return strcmp(B.maxlevel, A.maxlevel) || strcmp(B.minlevel, A.minlevel) || strcmp(B.classification, A.classification)
                }
            }
        },
                    {
            id: "location",
            name: LANG.location,
            compute: function (A, B) {
                return Listview.funcBox.location(A, B)
            },
            sortFunc: function (B, A, C) {
                return Listview.funcBox.assocArrCmp(B.location, A.location, g_zones)
            }
        },
                    {
            id: "react",
            name: LANG.react,
            width: "10%",
            value: "react",
            compute: function (B, G) {
                if (B.react == null) {
                    return -1
                }
                var D = [LANG.lvnpc_alliance, LANG.lvnpc_horde];
                var C = "";
                var F = 0;
                for (var A = 0; A < 2; ++A) {
                    if (B.react[A] != null) {
                        if (F++ > 0) {
                            ae(G, ct(" "))
                        }
                        var E = ce("span");
                        E.className = (B.react[A] < 0 ? "q7" : (B.react[A] > 0 ? "q2" : "q"));
                        ae(E, ct(D[A]));
                        ae(G, E)
                    }
                }
            }
        },
                    {
            id: "petfamily",
            name: LANG.petfamily,
            width: "12%",
            compute: function (B, C) {
                C.className = "q1";
                var A = ce("a");
                A.href = "?spells=-3." + B.family;
                ae(A, ct(g_spell_skills[B.family]));
                ae(C, A)
            },
            sortFunc: function (B, A, C) {
                return strcmp(g_spell_skills[B.family], g_spell_skills[A.family])
            },
            hidden: 1
        },
                    {
            id: "type",
            name: LANG.type,
            width: "12%",
            compute: function (B, C) {
                C.className = "small q1";
                var A = ce("a");
                A.href = "?npcs=" + B.type;
                ae(A, ct(g_npc_types[B.type]));
                ae(C, A)
            },
            sortFunc: function (B, A, C) {
                return strcmp(g_npc_types[B.type], g_npc_types[A.type])
            }
        }],
        getItemLink: function (A) {
            return "?npc=" + A.id
        }
    },
    object: {
        sort: [1],
        nItemsPerPage: 100,
        columns: [{
            id: "name",
            name: LANG.name,
            align: "left",
            value: "name",
            compute: function (B, C) {
                var A = ce("a");
                A.style.fontFamily = "Verdana, sans-serif";
                A.href = this.template.getItemLink(B);
                ae(A, ct(B.name));
                ae(C, A)
            }
        },
                    {
            id: "location",
            name: LANG.location,
            compute: function (A, B) {
                return Listview.funcBox.location(A, B)
            },
            sortFunc: function (B, A, C) {
                return Listview.funcBox.assocArrCmp(B.location, A.location, g_zones)
            }
        },
                    {
            id: "skill",
            name: LANG.skill,
            width: "10%",
            value: "skill",
            hidden: true
        },
                    {
            id: "type",
            name: LANG.type,
            width: "12%",
            compute: function (B, C) {
                C.className = "small q1";
                var A = ce("a");
                A.href = "?objects=" + B.type;
                ae(A, ct(g_object_types[B.type]));
                ae(C, A)
            },
            sortFunc: function (B, A, C) {
                return strcmp(g_object_types[B.type], g_object_types[A.type])
            }
        }],
        getItemLink: function (A) {
            return "?object=" + A.id
        }
    },
    quest: {
        sort: [1, 2],
        nItemsPerPage: 100,
        columns: [{
            id: "name",
            name: LANG.name,
            align: "left",
            value: "name",
            compute: function (B, C) {
                var A = ce("a");
                A.style.fontFamily = "Verdana, sans-serif";
                A.href = this.template.getItemLink(B);
                ae(A, ct(B.name));
                ae(C, A)
            }
        },
                    {
            id: "level",
            name: LANG.level,
            width: "7%",
            compute: function (A, C) {
                if (A.type || A.daily) {
                    var B = ce("div");
                    B.className = "small";
                    B.style.whiteSpace = "nowrap";
                    if (A.type && A.daily) {
                        ae(B, ct(sprintf(LANG.lvquest_daily, g_quest_types[A.type])))
                    } else {
                        if (A.daily) {
                            ae(B, ct(LANG.daily))
                        } else {
                            if (A.type) {
                                ae(B, ct(g_quest_types[A.type]))
                            }
                        }
                    }
                    ae(C, B)
                }
                return A.level
            },
            sortFunc: function (B, A, C) {
                return strcmp(B.level, A.level) || strcmp(B.type, A.type) || strcmp(B.reqlevel, A.reqlevel)
            }
        },
                    {
            id: "reqlevel",
            name: LANG.req,
            tooltip: LANG.tooltip_reqlevel,
            width: "7%",
            value: "reqlevel",
            sortFunc: function (B, A, C) {
                return strcmp(B.reqlevel, A.reqlevel) || strcmp(B.level, A.level)
            }
        },
                    {
            id: "side",
            name: LANG.side,
            width: "10%",
            compute: function (A, C) {
                if (A.side) {
                    var B = ce("span");
                    if (A.side == 1) {
                        B.className = "alliance-icon"
                    } else {
                        if (A.side == 2) {
                            B.className = "horde-icon"
                        }
                    }
                    ae(B, ct(g_sides[A.side]));
                    ae(C, B)
                } else {
                    return -1
                }
            },
            sortFunc: function (B, A, C) {
                return strcmp(g_sides[B.side], g_sides[A.side])
            }
        },
                    {
            id: "rewards",
            name: LANG.rewards,
            width: "25%",
            compute: function (B, F) {
                var A = (B.itemchoices != null || B.itemrewards != null);
                if (A) {
                    F.style.padding = "0";
                    var E, D;
                    if (B.itemchoices && B.itemchoices.length > 1) {
                        E = LANG.lvquest_pickone;
                        if (B.itemrewards && B.itemrewards.length > 0) {
                            D = LANG.lvquest_alsoget
                        }
                    }
                    Listview.funcBox.createCenteredIcons(B.itemchoices, F, E);
                    Listview.funcBox.createCenteredIcons(B.itemrewards, F, D)
                }
                if (B.xp > 0 || B.money > 0) {
                    var C = ce("div");
                    if (A) {
                        C.style.padding = "4px"
                    }
                    if (B.xp > 0) {
                        ae(C, ct(sprintf(LANG.lvquest_xp, B.xp) + (B.money > 0 ? " + " : "")))
                    }
                    if (B.money > 0) {
                        Listview.funcBox.appendMoney(C, B.money)
                    }
                    ae(F, C)
                }
            },
            sortFunc: function (B, A, C) {
                var E = (B.itemchoices != null ? B.itemchoices.length : 0) + (B.itemrewards != null ? B.itemrewards.length : 0);
                var D = (A.itemchoices != null ? A.itemchoices.length : 0) + (A.itemrewards != null ? A.itemrewards.length : 0);
                return strcmp(E, D) || strcmp((B.xp | 0) + (B.money | 0), (A.xp | 0) + (A.money | 0))
            }
        },
                    {
            id: "reputation",
            name: LANG.reputation,
            width: "14%",
            value: "id",
            hidden: true
        },
                    {
            id: "category",
            name: LANG.category,
            width: "16%",
            compute: function (B, C) {
                if (B.category != 0) {
                    C.className = "small q1";
                    var A = ce("a");
                    A.href = "?quests=" + B.category2 + "." + B.category;
                    ae(A, ct(Listview.funcBox.getQuestCategory(B.category)));
                    ae(C, A)
                }
            },
            sortFunc: function (B, A, D) {
                var C = Listview.funcBox.getQuestCategory;
                return strcmp(C(B.category), C(A.category))
            }
        }],
        getItemLink: function (A) {
            return "?quest=" + A.id
        }
    },
    spell: {
        sort: [1, 2],
        columns: [{
            id: "name",
            name: LANG.name,
            align: "left",
            span: 2,
            value: "name",
            compute: function (F, C, J) {
                var E = ce("td"),
                    M;
                E.style.width = "44px";
                E.style.padding = "0";
                E.style.borderRight = "none";
                if (F.creates != null) {
                    M = g_items.createIcon(F.creates[0], 1, Listview.funcBox.createTextRange(F.creates[1], F.creates[2]))
                } else {
                    M = g_spells.createIcon(F.id, 1)
                }
                M.style.cssFloat = M.style.styleFloat = "left";
                ae(E, M);
                ae(J, E);
                C.style.borderLeft = "none";
                var A = ce("div");
                var L = ce("a");
                var I = F.name.charAt(0);
                if (I != "@") {
                    L.className = "q" + (6 - parseInt(I))
                }
                L.style.fontFamily = "Verdana, sans-serif";
                L.href = this.template.getItemLink(F);
                ae(L, ct(F.name.substring(1)));
                ae(A, L);
                var B = F.talent != null && this._noTalents == null;
                if (F.rank != null || B) {
                    var H = ce("div");
                    H.className = "small2";
                    var D = "";
                    if (F.rank != null) {
                        D += F.rank;
                        if (B) {
                            D += " "
                        }
                    }
                    if (B) {
                        D += "(Talent)"
                    }
                    ae(H, ct(D));
                    ae(A, H)
                }
                if (F.races != null) {
                    A.style.position = "relative";
                    var H = ce("div");
                    H.className = "small";
                    H.style.fontStyle = "italic";
                    H.style.position = "absolute";
                    H.style.right = H.style.bottom = "3px";
                    var K = F.races.toString();
                    if (K == "1,3,4,7,11") {
                        ae(H, ct(g_sides[1]))
                    } else {
                        if (K == "2,5,6,8,10") {
                            ae(H, ct(g_sides[2]))
                        } else {
                            for (var E = 0, G = F.races.length; E < G; ++E) {
                                if (E > 0) {
                                    ae(H, ct(LANG.comma))
                                }
                                ae(H, ct(g_chr_races[F.races[E]]))
                            }
                        }
                    }
                    ae(A, H)
                }
                ae(C, A)
            }
        },
                    {
            id: "level",
            name: LANG.level,
            width: "10%",
            value: "level",
            compute: function (A, B) {
                if (A.level > 0) {
                    return A.level
                }
            },
            hidden: true
        },
                    {
            id: "school",
            name: LANG.school,
            width: "10%",
            hidden: true,
            compute: function (A, B) {
                return g_spell_resistances[A.school]
            },
            sortFunc: function (B, A, C) {
                return strcmp(g_spell_resistances[B.school], g_spell_resistances[A.school])
            }
        },
                    {
            id: "reagents",
            name: LANG.reagents,
            align: "left",
            width: "15%",
            compute: function (F, C) {
                var A = (F.reagents != null);
                if (A) {
                    C.style.padding = "0";
                    var H = ce("div");
                    var I = F.reagents;
                    H.style.width = (44 * I.length) + "px";
                    for (var D = 0, G = I.length; D < G; ++D) {
                        var B = I[D][0];
                        var E = I[D][1];
                        var J = g_items.createIcon(B, 1, E);
                        J.style.cssFloat = J.style.styleFloat = "left";
                        ae(H, J)
                    }
                    ae(C, H)
                }
            },
            sortFunc: function (B, A) {
                var D = (B.reagents != null ? B.reagents.length : 0);
                var C = (A.reagents != null ? A.reagents.length : 0);
                if (D > 0 && D == C) {
                    return strcmp(B.reagents.toString(), A.reagents.toString())
                } else {
                    return strcmp(D, C)
                }
            }
        },
                    {
            id: "tp",
            name: LANG.tp,
            tooltip: LANG.tooltip_trainingpoints,
            width: "7%",
            hidden: true,
            value: "tp",
            compute: function (A, B) {
                if (A.tp > 0) {
                    return A.tp
                }
            }
        },
                    {
            id: "source",
            name: LANG.source,
            width: "12%",
            hidden: true,
            compute: function (B, D) {
                if (B.source != null) {
                    for (var C = 0, A = B.source.length; C < A; ++C) {
                        if (C > 0) {
                            ae(D, ct(LANG.comma))
                        }
                        ae(D, ct(g_sources[B.source[C]]))
                    }
                }
            },
            sortFunc: function (B, A, C) {
                return Listview.funcBox.assocArrCmp(B.source, A.source, g_sources)
            }
        },
                    {
            id: "skill",
            name: LANG.skill,
            width: "16%",
            compute: function (E, C) {
                if (E.skill != null) {
                    var B = ce("div");
                    B.className = "small";
                    for (var D = 0, G = E.skill.length; D < G; ++D) {
                        if (D > 0) {
                            ae(B, ct(LANG.comma))
                        }
                        if (E.skill[D] == -1) {
                            ae(B, ct(LANG.ellipsis))
                        } else {
                            if (in_array([7, -2, -3, 11, 9], E.cat) != -1) {
                                var H = ce("a");
                                H.className = "q1";
                                H.href = "?spells=" + E.cat + "." + (E.chrclass ? E.chrclass + "." : "") + E.skill[D];
                                ae(H, ct(g_spell_skills[E.skill[D]]));
                                ae(B, H)
                            } else {
                                ae(B, ct(g_spell_skills[E.skill[D]]))
                            }
                        }
                    }
                    if (E.learnedat > 0) {
                        ae(B, ct(" ("));
                        var F = ce("span");
                        if (E.learnedat == 9999) {
                            F.className = "q0";
                            ae(F, ct("??"))
                        } else {
                            if (E.learnedat > 0) {
                                ae(F, ct(E.learnedat));
                                F.style.fontWeight = "bold"
                            }
                        }
                        ae(B, F);
                        ae(B, ct(")"))
                    }
                    ae(C, B);
                    if (E.colors != null) {
                        var A = E.colors,
                            I = 0;
                        for (var D = 0; D < A.length; ++D) {
                            if (A[D] > 0) {
                                ++I;
                                break
                            }
                        }
                        if (I > 0) {
                            I = 0;
                            B = ce("div");
                            B.className = "small";
                            B.style.fontWeight = "bold";
                            for (var D = 0; D < A.length; ++D) {
                                if (A[D] > 0) {
                                    if (I++ > 0) {
                                        ae(B, ct(" "))
                                    }
                                    var J = ce("span");
                                    J.className = "r" + (D + 1);
                                    ae(J, ct(A[D]));
                                    ae(B, J)
                                }
                            }
                            ae(C, B)
                        }
                    }
                }
            },
            sortFunc: function (B, A) {
                var D = strcmp(B.learnedat, A.learnedat);
                if (D != 0) {
                    return D
                }
                if (B.colors != null && A.colors != null) {
                    for (var C = 0; C < 4; ++C) {
                        D = strcmp(B.colors[C], A.colors[C]);
                        if (D != 0) {
                            return D
                        }
                    }
                }
                return Listview.funcBox.assocArrCmp(B.skill, A.skill, g_spell_skills)
            }
        }],
        getItemLink: function (A) {
            return "?spell=" + A.id
        }
    },
    zone: {
        sort: [1],
        nItemsPerPage: -1,
        columns: [{
            id: "name",
            name: LANG.name,
            align: "left",
            value: "name",
            compute: function (B, D) {
                var A = ce("a");
                A.style.fontFamily = "Verdana, sans-serif";
                A.href = this.template.getItemLink(B);
                ae(A, ct(B.name));
                if (B.expansion == 1) {
                    var C = ce("span");
                    C.className = "bc-icon";
                    ae(C, A);
                    ae(D, C)
                } else {
                    ae(D, A)
                }
            }
        },
                    {
            id: "level",
            name: LANG.level,
            width: "10%",
            compute: function (A, B) {
                if (A.minlevel > 0 && A.maxlevel > 0) {
                    if (A.minlevel != A.maxlevel) {
                        return A.minlevel + LANG.hyphen + A.maxlevel
                    } else {
                        return A.minlevel
                    }
                }
            },
            sortFunc: function (B, A, C) {
                if (C > 0) {
                    return strcmp(B.minlevel, A.minlevel) || strcmp(B.maxlevel, A.maxlevel)
                } else {
                    return strcmp(B.maxlevel, A.maxlevel) || strcmp(B.minlevel, A.minlevel)
                }
            }
        },
                    {
            id: "territory",
            name: LANG.territory,
            width: "13%",
            compute: function (A, C) {
                var B = ce("span");
                switch (A.territory) {
                case 0:
                    B.className = "alliance-icon";
                    break;
                case 1:
                    B.className = "horde-icon";
                    break;
                case 4:
                    B.className = "ffapvp-icon";
                    break
                }
                ae(B, ct(g_zone_territories[A.territory]));
                ae(C, B)
            },
            sortFunc: function (B, A, C) {
                return strcmp(g_zone_territories[B.territory], g_zone_territories[A.territory])
            }
        },
                    {
            id: "instancetype",
            name: LANG.instancetype,
            compute: function (A, D) {
                if (A.instance > 0) {
                    var B = ce("span");
                    if (A.instance >= 1 && A.instance <= 5) {
                        B.className = "instance-icon" + A.instance
                    }
                    var C = g_zone_instancetypes[A.instance];
                    if (A.nplayers > 0 && ((A.instance != 2 && A.instance != 5) || A.nplayers > 5)) {
                        C += " (";
                        if (A.instance == 4) {
                            C += sprintf(LANG.lvzone_xvx, A.nplayers, A.nplayers)
                        } else {
                            C += sprintf(LANG.lvzone_xman, A.nplayers)
                        }
                        C += ")"
                    }
                    ae(B, ct(C));
                    ae(D, B)
                }
            },
            sortFunc: function (B, A, C) {
                return strcmp(g_zone_instancetypes[B.instance], g_zone_instancetypes[A.instance]) || strcmp(B.instance, A.instance) || strcmp(B.nplayers, A.nplayers)
            }
        },
                    {
            id: "category",
            name: LANG.category,
            width: "15%",
            compute: function (B, C) {
                C.className = "small q1";
                var A = ce("a");
                A.href = "?zones=" + B.category;
                ae(A, ct(g_zone_categories[B.category]));
                ae(C, A)
            },
            sortFunc: function (B, A, C) {
                return strcmp(g_zone_categories[B.category], g_zone_categories[A.category])
            }
        }],
        getItemLink: function (A) {
            return "?zone=" + A.id
        }
    },
    comment: {
        sort: [1],
        mode: 2,
        nItemsPerPage: 40,
        poundable: 2,
        columns: [{
            value: "number"
        },
                    {
            value: "id"
        },
                    {
            value: "rating"
        }],
        compute: function (A, R) {
            var l, h = new Date(A.date),
                F = (g_serverTime - h) / 1000,
                j = (g_user.roles & 26) != 0,
                I = A.rating < 0 || A.purged || A.deleted,
                X = j || A.user.toLowerCase() == g_user.name.toLowerCase(),
                K = X && A.deleted == 0,
                G = X && A.replyTo != A.id,
                g = A.purged == 0 && A.deleted == 0 && g_user.id && A.user.toLowerCase() != g_user.name.toLowerCase() && in_array(A.raters, g_user.id, function (n) {
                    return n[0]
                }) == -1,
                m = A.rating >= 0 && (g_user.id == 0 || g);
            A.ratable = g;
            R.className = "comment";
            if (A.indent) {
                R.className += " comment-indent"
            }
            var V = ce("div");
            var N = ce("div");
            var Q = ce("div");
            A.divHeader = V;
            A.divBody = N;
            A.divLinks = Q;
            V.className = (I ? "comment-header-bt" : "comment-header");
            var L = ce("div");
            L.className = "comment-rating";
            if (I) {
                var J = ce("a");
                J.href = "javascript:;";
                J.onclick = Listview.funcBox.coToggleVis.bind(J, A);
                ae(J, ct(LANG.lvcomment_show));
                ae(L, J);
                ae(L, ct(" " + String.fromCharCode(160) + " "))
            }
            var C = ce("b");
            ae(C, ct(LANG.lvcomment_rating));
            var U = ce("span");
            ae(U, ct((A.rating > 0 ? "+" : "") + A.rating));
            ae(C, U);
            ae(L, C);
            ae(L, ct(" "));
            var O = ce("span");
            var i = ce("a"),
                H = ce("a");
            if (g) {
                i.href = H.href = "javascript:;";
                i.onclick = Listview.funcBox.coRate.bind(i, A, 1);
                H.onclick = Listview.funcBox.coRate.bind(H, A, -1);
                if (j) {
                    var W = ce("a");
                    W.href = "javascript:;";
                    W.onclick = Listview.funcBox.coRate.bind(W, A, 0);
                    W.onmouseover = Listview.funcBox.coCustomRatingOver;
                    W.onmousemove = Tooltip.cursorUpdate;
                    W.onmouseout = Tooltip.hide;
                    ae(W, ct("[~]"));
                    ae(O, W);
                    ae(O, ct(" "))
                }
            } else {
                i.href = H.href = "?account=signin"
            }
            ae(i, ct("[+]"));
            i.onmouseover = Listview.funcBox.coPlusRatingOver;
            H.onmouseover = Listview.funcBox.coMinusRatingOver;
            i.onmousemove = H.onmousemove = Tooltip.cursorUpdate;
            i.onmouseout = H.onmouseout = Tooltip.hide;
            ae(H, ct("[-]"));
            ae(O, H);
            ae(O, ct(" "));
            ae(O, i);
            ae(L, O);
            if (!m) {
                O.style.display = "none"
            }
            ae(V, L);
            ae(V, ct(LANG.lvcomment_by));
            var B = ce("a");
            B.href = "?user=" + A.user;
            ae(B, ct(A.user));
            ae(V, B);
            ae(V, ct(" "));
            var M = ce("a");
            M.className = "q0";
            M.href = "#comments:id=" + A.id;
            Listview.funcBox.coFormatDate(M, F, h);
            M.style.cursor = "pointer";
            ae(V, M);
            ae(V, ct(LANG.lvcomment_patch1 + g_getPatchVersion(h) + LANG.lvcomment_patch2));
            ae(R, V);
            N.className = "comment-body" + Listview.funcBox.coGetColor(A);
            if (A.indent) {
                N.className += " comment-body-indent"
            }
            N.innerHTML = Markup.toHtml(A.body, {
                mode: Markup.MODE_COMMENT
            });
            ae(R, N);
            if ((A.roles & 26) == 0 || g_user.roles & 26) {
                var e = ce("div");
                A.divLastEdit = e;
                e.className = "comment-lastedit";
                ae(e, ct(LANG.lvcomment_lastedit));
                var Z = ce("a");
                ae(Z, ct(" "));
                ae(e, Z);
                ae(e, ct(" "));
                var a = ce("span");
                ae(e, a);
                ae(e, ct(" "));
                Listview.funcBox.coUpdateLastEdit(A);
                if (I) {
                    e.style.display = "none"
                }
                ae(R, e)
            }
            Q.className = "comment-links";
            if (X) {
                var E = ce("span");
                var Y = ce("a");
                ae(Y, ct(LANG.lvcomment_edit));
                Y.onclick = Listview.funcBox.coEdit.bind(this, A, 0);
                ns(Y);
                Y.href = "javascript:;";
                ae(E, Y);
                ae(E, ct("|"));
                ae(Q, E)
            }
            if (K) {
                var k = ce("span");
                var P = ce("a");
                ae(P, ct(LANG.lvcomment_delete));
                P.onclick = Listview.funcBox.coDelete.bind(this, A);
                ns(P);
                P.href = "javascript:;";
                ae(k, P);
                ae(k, ct("|"));
                ae(Q, k)
            }
            if (G) {
                var D = ce("span");
                var T = ce("a");
                ae(T, ct(LANG.lvcomment_detach));
                T.onclick = Listview.funcBox.coDetach.bind(this, A);
                ns(T);
                T.href = "javascript:;";
                ae(D, T);
                ae(D, ct("|"));
                ae(Q, D)
            }
            var S = ce("a");
            ae(S, ct(LANG.lvcomment_reply));
            if (g_user.id > 0) {
                S.onclick = Listview.funcBox.coReply.bind(this, A);
                S.href = "javascript:;"
            } else {
                S.href = "?account=signin"
            }
            ae(Q, S);
            if (I) {
                N.style.display = "none";
                Q.style.display = "none"
            }
            ae(R, Q)
        },
        createNote: function (F) {
            var E = ce("small");
            var A = ce("a");
            if (g_user.id > 0) {
                A.href = "javascript:;";
                A.onclick = co_addYourComment
            } else {
                A.href = "?account=signin"
            }
            ae(A, ct(LANG.lvcomment_add));
            ae(E, A);
            var D = ce("span");
            D.style.padding = "0 5px";
            D.style.color = "white";
            ae(D, ct("|"));
            ae(E, D);
            ae(E, ct(LANG.lvcomment_sort));
            var C = ce("a");
            C.href = "javascript:;";
            ae(C, ct(LANG.lvcomment_sortdate));
            C.onclick = Listview.funcBox.coSortDate.bind(this, C);
            ae(E, C);
            ae(E, ct(LANG.comma));
            var B = ce("a");
            B.href = "javascript:;";
            ae(B, ct(LANG.lvcomment_sortrating));
            B.onclick = Listview.funcBox.coSortHighestRatedFirst.bind(this, B);
            ae(E, B);
            C.onclick();
            ae(F, E)
        },
        onNoData: function (C) {
            if (typeof g_pageInfo == "object" && g_pageInfo.type > 0) {
                var A = "<b>" + LANG.lvnodata_co1 + "</b><br /><br />";
                if (g_user.id > 0) {
                    var B = LANG.lvnodata_co2;
                    B = B.replace("<a>", '<a href="javascript:;" onclick="co_addYourComment()" onmousedown="return false">');
                    A += B
                } else {
                    var B = LANG.lvnodata_co3;
                    B = B.replace("<a>", '<a href="?account=signin">');
                    B = B.replace("<a>", '<a href="?account=signup">');
                    A += B
                }
                C.style.padding = "1.5em 0";
                C.innerHTML = A
            }
        },
        onBeforeCreate: function () {
            if (location.hash.match(/:id=([0-9]+)/) != null) {
                var A = 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: [3],
        nItemsPerPage: 75,
        columns: [{
            id: "subject",
            name: LANG.subject,
            align: "left",
            value: "subject",
            compute: function (D, C) {
                var A = ce("a");
                A.style.fontFamily = "Verdana, sans-serif";
                A.href = this.template.getItemLink(D);
                ae(A, ct(D.subject));
                ae(C, A);
                var B = ce("div");
                B.className = "small";
                ae(B, ct(LANG.types[D.type][0]));
                ae(C, B)
            }
        },
                    {
            id: "preview",
            name: LANG.preview,
            align: "left",
            width: "50%",
            value: "preview",
            compute: function (H, G) {
                var E = ce("div");
                E.className = "crop";
                if (H.rating >= 10) {
                    E.className += " comment-green"
                }
                ae(E, ct(Markup.removeTags(H.preview, {
                    mode: (H.rating != null ? Markup.MODE_COMMENT : Markup.MODE_ARTICLE)
                })));
                ae(G, E);
                var A = H.rating != null;
                var D = H.user != null;
                if (A || D) {
                    E = ce("div");
                    E.className = "small3";
                    if (D) {
                        ae(E, ct(LANG.lvcomment_by));
                        var B = ce("a");
                        B.href = "?user=" + H.user;
                        ae(B, ct(H.user));
                        ae(E, B);
                        if (A) {
                            ae(E, ct(LANG.hyphen))
                        }
                    }
                    if (A) {
                        ae(E, ct(LANG.lvcomment_rating + (H.rating > 0 ? "+" : "") + H.rating));
                        var C = ce("span"),
                            F = "";
                        C.className = "q7";
                        if (H.deleted) {
                            F = " (Deleted)"
                        } else {
                            if (H.purged) {
                                F = " (Purged)"
                            }
                        }
                        ae(C, ct(F));
                        ae(E, C)
                    }
                    ae(G, E)
                }
            }
        },
                    {
            id: "posted",
            name: LANG.posted,
            width: "16%",
            value: "elapsed",
            compute: function (E, D) {
                var B = new Date(E.date),
                    A = (g_serverTime - B) / 1000;
                var C = ce("span");
                Listview.funcBox.coFormatDate(C, A, B, 0, 1);
                ae(D, C)
            }
        }],
        getItemLink: function (A) {
            return "?" + g_types[A.type] + "=" + A.typeId + (A.id != null ? "#comments:id=" + A.id : "")
        }
    },
    screenshot: {
        sort: [],
        mode: 3,
        nItemsPerPage: 40,
        nItemsPerRow: 4,
        poundable: 2,
        columns: [],
        compute: function (J, C, E) {
            var N, G = new Date(J.date),
                O = (g_serverTime - G) / 1000;
            C.className = "screenshot-cell";
            C.vAlign = "bottom";
            var M = ce("a");
            M.href = "#screenshots:id=" + J.id;
            M.onclick = rf2;
            var F = ce("img"),
                B = Math.min(150 / J.width, 150 / J.height);
            F.src = "http://upload.wowhead.com/images/screenshots/thumb/" + J.id + ".jpg";
            F.width = parseInt(B * J.width);
            F.height = parseInt(B * J.height);
            ae(M, F);
            ae(C, M);
            var I = ce("div");
            I.className = "screenshot-cell-user";
            var P = (J.user != null && J.user.length);
            if (P) {
                M = ce("a");
                M.href = "?user=" + J.user;
                ae(M, ct(J.user));
                ae(I, ct(LANG.lvscreenshot_from));
                ae(I, M);
                ae(I, ct(" "))
            }
            var Q = ce("span");
            if (P) {
                Listview.funcBox.coFormatDate(Q, O, G)
            } else {
                Listview.funcBox.coFormatDate(Q, O, G, 0, 1)
            }
            ae(I, Q);
            ae(C, I);
            I = ce("div");
            I.style.position = "relative";
            I.style.height = "1em";
            if (g_locale.id != 0 && g_locale.id != 25 && J.caption) {
                J.caption = ""
            }
            var H = (J.caption != null && J.caption.length);
            var D = (J.subject != null && J.subject.length);
            if (H || D) {
                var A = ce("div");
                A.className = "screenshot-caption";
                if (D) {
                    var L = ce("small");
                    ae(L, ct(LANG.types[J.type][0] + LANG.colon));
                    var K = ce("a");
                    ae(K, ct(J.subject));
                    K.href = "?" + g_types[J.type] + "=" + J.typeId;
                    ae(L, K);
                    ae(A, L);
                    if (H && J.caption.length) {
                        ae(L, ct(" (...)"))
                    }
                    ae(L, ce("br"))
                }
                if (H) {
                    aE(C, "mouseover", Listview.funcBox.ssCellOver.bind(A));
                    aE(C, "mouseout", Listview.funcBox.ssCellOut.bind(A));
                    ae(A, ct('"' + J.caption + '"'))
                }
                ae(I, A)
            }
            aE(C, "click", Listview.funcBox.ssCellClick.bind(this, E));
            ae(C, I)
        },
        createNote: function (C) {
            if (typeof g_pageInfo == "object" && g_pageInfo.type > 0) {
                var B = ce("small");
                var A = ce("a");
                if (g_user.id > 0) {
                    A.href = "javascript:;";
                    A.onclick = ss_submitAScreenshot
                } else {
                    A.href = "?account=signin"
                }
                ae(A, ct(LANG.lvscreenshot_submit));
                ae(B, A);
                ae(C, B)
            }
        },
        onNoData: function (C) {
            if (typeof g_pageInfo == "object" && g_pageInfo.type > 0) {
                var A = "<b>" + LANG.lvnodata_ss1 + "</b><br /><br />";
                if (g_user.id > 0) {
                    var B = LANG.lvnodata_ss2;
                    B = B.replace("<a>", '<a href="javascript:;" onclick="ss_submitAScreenshot()" onmousedown="return false">');
                    A += B
                } else {
                    var B = LANG.lvnodata_ss3;
                    B = B.replace("<a>", '<a href="?account=signin">');
                    B = B.replace("<a>", '<a href="?account=signup">');
                    A += B
                }
                C.style.padding = "1.5em 0";
                C.innerHTML = A
            } else {
                return -1
            }
        },
        onBeforeCreate: function () {
            if (location.hash.match(/:id=([0-9]+)/) != null) {
                var A = in_array(this.data, parseInt(RegExp.$1), function (B) {
                    return B.id
                });
                this.rowOffset = this.getRowOffset(A);
                return A
            }
        },
        onAfterCreate: function (A) {
            if (A != null) {
                setTimeout((function () {
                    ScreenshotViewer.show({
                        screenshots: this.data,
                        pos: A
                    })
                }).bind(this), 1)
            }
        }
    }
};
Menu.fixUrls(mn_items, "?items=");
Menu.fixUrls(mn_itemSets, "?itemsets&filter=cl=");
Menu.fixUrls(mn_npcs, "?npcs=");
Menu.fixUrls(mn_objects, "?objects=");
Menu.fixUrls(mn_quests, "?quests=");
Menu.fixUrls(mn_spells, "?spells=");
Menu.fixUrls(mn_zones, "?zones=");
Menu.fixUrls(mn_talentCalc, "?talent=");
var g_locale = {
    id: 0,
    name: "enus"
};
var g_localTime = new Date();
var g_user = {
    id: 0,
    name: "",
    roles: 0
};
var g_items = [];
var g_quests = [];
var g_spells = [];
var g_users = [];
var g_types = {
    1: "npc",
    2: "object",
    3: "item",
    4: "itemset",
    5: "quest",
    6: "spell",
    7: "zone",
    8: "faction"
};
var g_locales = {
    0: "enus",
    2: "frfr",
    3: "dede",
    6: "eses",
    25: "wotlk"
};
var g_customColors = {
    Miyari: "pink"
};
g_items.getIcon = function (A) {
    if (g_items[A] != null) {
        return g_items[A].icon
    } else {
        return "temp"
    }
};
g_items.createIcon = function (D, B, A, C) {
    return Icon.create(g_items.getIcon(D), B, null, "?item=" + D, A, C)
};
g_spells.getIcon = function (A) {
    if (g_spells[A] != null) {
        return g_spells[A].icon
    } else {
        return "temp"
    }
};
g_spells.createIcon = function (D, B, A, C) {
    return Icon.create(g_spells.getIcon(D), B, null, "?spell=" + D, A, C)
};
var $WowheadPower = new

    function () {
        var V, a, L, // language
        T, F, J, H, R = 0,
            i = 0,
            K = 1,
            E = 2,
            M = 3,
            N = 4,
            G = 3,
            O = 5,
            g = 6,
            j = 15,
            W = 15,
            S = {
                3: [g_items, "item"],
                5: [g_quests, "quest"],
                6: [g_spells, "spell"]
            };

        function Z() {
            aE(document, "mouseover", U)
        }

        function A(k) {
            var l = g_getCursorPos(k);
            J = l.x;
            H = l.y
        }

        function e(u, q) {
            if (u.nodeName != "A") {
                return -2323
            }
            if (!u.href.length) {
                return
            }
            var o, n, l, k;
            n = 2;
            l = 3;
            //		if (u.href.indexOf("http://") == 0) {
            //			o = 1;
            //			k = u.href.match(/http:\/\/(www|dev|fr|es|de|wotlk)?\.?wowhead\.com\/\?(item|quest|spell)=([0-9]+)/)
            //		} else {
            k = u.href.match(/()\?(item|quest|spell)=([0-9]+)/)
            //		}
            if (k == null && u.rel) {
                o = 0;
                n = 1;
                l = 2;
                k = u.rel.match(/(item|quest|spell).?([0-9]+)/)
            }
            if (k) {
                //			var s,
                //			p = "www";
                //			if (o && k[o]) {
                //				p = k[o]
                //			} else {
                //				var r = location.hostname.match(/(www|dev|fr|es|de|wotlk)\.?wowhead\.com/);
                //				if (r != null) {
                //					p = r[1]
                //				}
                //			}
                //			s = g_getLocaleFromDomain(p);
                //			T = p;
                s = 0;
                F = u;
                if (u.href.indexOf("#") != -1 && document.location.href.indexOf(k[n] + "=" + k[l]) != -1) {
                    return
                }
                R = (u.parentNode.className == "tile" ? 1 : 0);
                if (!u.onmouseout) {
                    if (R == 0) {
                        u.onmousemove = Q
                    }
                    u.onmouseout = P
                }
                A(q);
                Y(g_getIdFromTypeName(k[n]), k[l], s)
            }
        }

        function U(m) {
            m = $E(m);
            var l = m._target;
            var k = 0;
            while (l != null && k < 3 && e(l, m) == -2323) {
                l = l.parentNode;
                ++k
            }
        }

        function Q(k) {
            k = $E(k);
            A(k);
            Tooltip.move(J, H, 0, 0, j, W)
        }

        function P() {
            V = null;
            F = null;
            Tooltip.hide()
        }

        function X(k) {
            return "tooltip"
        }

        function h(m, n, l) {
            var k = S[m][0];
            if (k[n] == null) {
                k[n] = {}
            }
            if (k[n].status == null) {
                k[n].status = {}
            }
            if (k[n].status[l] == null) {
                k[n].status[l] = i
            }
        }

        function Y(m, n, l) {
            // m - type ('item', etc)
            // n - id
            // l - language
            V = m;
            a = n;
            L = l;
            h(m, n, l);
            var k = S[m][0];
            if (k[n].status[l] == N || k[n].status[l] == M) {
                C(k[n][X(l)], k[n].icon)
            } else {
                if (k[n].status[l] == K) {
                    C(LANG.tooltip_loading)
                } else {
                    D(m, n, l)
                }
            }
        }

        function D(n, o, l, m) {
            var k = S[n][0];
            if (k[o].status[l] != i && k[o].status[l] != E) {
                return
            }
            k[o].status[l] = K;
            if (!m) {
                k[o].timer = setTimeout(function () {
                    B.apply(this, [n, o, l])
                }, 333)
            }
            g_ajaxIshRequest("ajax.php?" + S[n][1] + "=" + o)
        }

        function C(k, l) {
            if (F._fixTooltip) {
                k = F._fixTooltip(k, V, a, F)
            }
            //		if (!k) {
            //			k = LANG["tooltip_" + g_types[V] + "notfound"];
            //			l = "Temp"
            //		}
            if (R == 1) {
                Tooltip.setIcon(null);
                Tooltip.show(F, k, 0, 0)
            } else {
                Tooltip.setIcon(l);
                Tooltip.showAtXY(k, J, H, j, W)
            }
        }

        function B(m, n, l) {
            if (V == m && a == n && L == l) {
                C(LANG.tooltip_loading);
                var k = S[m][0];
                k[n].timer = setTimeout(function () {
                    I.apply(this, [m, n, l])
                }, 3850)
            }
        }

        function I(m, n, l) {
            var k = S[m][0];
            k[n].status[l] = E;
            if (V == m && a == n && L == l) {
                C(LANG.tooltip_noresponse)
            }
        }
        this.register = function (n, o, l, m) {
            var k = S[n][0];
            clearTimeout(k[o].timer);
            cO(k[o], m);
            if (k[o][X(l)]) {
                k[o].status[l] = N
            } else {
                k[o].status[l] = M
            }
            if (V == n && o == a && L == l) {
                C(k[o][X(l)], k[o].icon)
            }
        };
        this.registerItem = function (m, k, l) {
            this.register(G, m, k, l)
        };
        this.registerQuest = function (m, k, l) {
            this.register(O, m, k, l)
        };
        this.registerSpell = function (m, k, l) {
            this.register(g, m, k, l)
        };
        this.request = function (l, m, k) {
            h(l, m, k);
            D(l, m, k, 1)
        };
        this.requestItem = function (k) {
            this.request(G, g_locale.id, k)
        };
        this.requestSpell = function (k) {
            this.request(g, g_locale.id, k)
        };
        this.getStatus = function (m, n, l) {
            var k = S[m][0];
            if (k[n] != null) {
                return k[n].status[l]
            } else {
                return i
            }
        };
        this.getItemStatus = function (l, k) {
            this.getStatus(G, l, k)
        };
        this.requestSpell = function (l, k) {
            this.getStatus(g, l, k)
        };
        Z()
    };

LiveSearch = new

function () {
    var currentTextbox, lastSearch = {},
        lastDiv, timer, prepared, container, cancelNext, hasData;

    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";
        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 = 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 = ce("div");
        container.className = "live-search";
        container.style.display = "none";
        ae(ge("layers"), container);
        aE(window, "resize", adjust.bind(0, 1));
        aE(document, "click", hide)
    }

    function show() {
        if (container && !isVisible()) {
            adjust();
            container.style.display = ""
        }
    }

    function hide() {
        if (container) {
            container.style.display = "none"
        }
    }

    function boldify(match) {
        return "<b>" + match + "</b>"
    }

    function display(textbox, search, suggz, dataz) {
        prepare();
        show();
        lastA = null;
        hasData = 1;
        while (container.firstChild) {
            de(container.firstChild)
        }
        if (!Browser.ie6) {
            ae(container, ce("em"));
            ae(container, ce("var"));
            ae(container, ce("strong"))
        }
        search = search.replace(/[^a-z0-9'\-]/, " ");
        search = trim(search.replace(/\s+/g, " "));
        var parts = search.split(" "),
            strRegex = "";
        for (var j = 0, len = parts.length; j < len; ++j) {
            if (j > 0) {
                strRegex += "|"
            }
            strRegex += parts[j]
        }
        var regex = new RegExp("(" + strRegex + ")", "gi");
        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 = ce("a"),
                sp = ce("i"),
                sp2 = ce("span"),
                div = ce("div"),
                div2 = ce("div");
            a.onmouseover = aOver;
            a.href = "?" + g_types[type] + "=" + typeId;
            if (type == 3 && param2) {
                a.className += " q" + param2
            }
            if ((type == 3 || type == 6) && param1) {
                div.className += " live-search-icon";
                div.style.backgroundImage = "url(images/icons/small/" + param1.toLowerCase() + ".png)"
            } else {
                if (type == 5 && param1 >= 1 && param1 <= 2) {
                    div.className += " live-search-icon-quest-" + (param1 == 1 ? "alliance" : "horde")
                }
            }
            ae(sp, ct(LANG.types[type][0]));
            ae(a, sp);
            var buffer = suggz[i];
            buffer = buffer.replace(regex, boldify);
            sp2.innerHTML = buffer;
            ae(a, sp2);
            if (type == 6 && param2) {
                ae(a, ct(" (" + param2 + ")"))
            }
            ae(div2, a);
            ae(div, div2);
            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) {
        new Ajax("opensearch.php?search=" + urlencode(search), {
            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), 200)
    }

    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 = $E(e);
        var textbox = e._target;
        if (Browser.gecko && e.ctrlKey) {
            switch (e.keyCode) {
            case 48:
            case 96:
            case 107:
            case 109:
                adjust(textbox);
                break
            }
        }
        var search = 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 = $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 = $E(e);
        var textbox = e._target;
        if (textbox != document) {
            currentTextbox = textbox
        }
    }
    this.attach = function (textbox) {
        textbox.setAttribute("autocomplete", "off");
        aE(textbox, "focus", onFocus);
        aE(textbox, "keyup", onKeyUp);
        aE(textbox, Browser.opera ? "keypress" : "keydown", onKeyDown)
    }
};

Lightbox = new

function () {
    var F, N, Q, J = {},
        C = {},
        P, D, E;

    function O() {
        aE(F, "click", G);
        aE(N, "mousewheel", B);
        aE(document, Browser.opera ? "keypress" : "keydown", H);
        aE(window, "resize", A);
        if (Browser.ie6) {
            aE(window, "scroll", M)
        }
    }

    function K() {
        dE(F, "click", G);
        dE(N, "mousewheel", B);
        dE(document, Browser.opera ? "keypress" : "keydown", H);
        dE(window, "resize", A);
        if (Browser.ie6) {
            dE(window, "scroll", M)
        }
    }

    function I() {
        if (P) {
            return
        }
        P = 1;
        var R = ge("layers");
        F = ce("div");
        F.className = "lightbox-overlay";
        N = ce("div");
        N.className = "lightbox-outer";
        Q = ce("div");
        Q.className = "lightbox-inner";
        F.style.display = N.style.display = "none";
        ae(R, F);
        ae(N, Q);
        ae(R, N)
    }

    function B(R) {
        R = $E(R);
        R.returnValue = false
    }

    function H(R) {
        R = $E(R);
        switch (R.keyCode) {
        case 27:
            G();
            break
        }
    }

    function A(R) {
        if (R != 1234) {
            if (C.onResize) {
                C.onResize()
            }
        }
        F.style.height = document.body.offsetHeight + "px";
        if (Browser.ie6) {
            M()
        }
    }

    function M() {
        var S = g_getScroll().y,
            R = g_getWindowSize().h;
        N.style.top = (S + R / 2) + "px"
    }

    function G() {
        K();
        if (C.onHide) {
            C.onHide()
        }
        E = 0;
        F.style.display = N.style.display = "none";
        array_apply(gE(document, "iframe"), function (R) {
            R.style.display = ""
        })
    }

    function L() {
        F.style.display = N.style.display = J[D].style.display = ""
    }
    this.setSize = function (R, S) {
        Q.style.visibility = "hidden";
        Q.style.width = R + "px";
        Q.style.height = S + "px";
        Q.style.left = -parseInt(R / 2) + "px";
        Q.style.top = -parseInt(S / 2) + "px";
        Q.style.visibility = "visible"
    };
    this.show = function (V, S, R) {
        E = 1;
        C = S || {};
        array_apply(gE(document, "iframe"), function (W) {
            W.style.display = "none"
        });
        I();
        O();
        if (D != V && J[D] != null) {
            J[D].style.display = "none"
        }
        D = V;
        var U = 0,
            T;
        if (J[V] == null) {
            U = 1;
            T = ce("div");
            ae(Q, T);
            J[V] = T
        } else {
            T = J[V]
        }
        if (C.onShow) {
            C.onShow(T, U, R)
        }
        A(1234);
        L()
    };
    this.reveal = function () {
        L()
    };
    this.hide = function () {
        G()
    };
    this.isVisible = function () {
        return E
    }
};
