Large

Wowhead - Armory Import

By Emoroan Last update Apr 24, 2010 — Installed 369 times.

There are 9 previous versions of this script.

// ==UserScript==
// @name           Wowhead - Armory Import
// @namespace      http://userscripts.org/users/88914
// @description    Highlights items in Wowhead item lists based on multicharacter armory imports
// @include        http://*.wowarmory.com/character-sheet.xml*
// @include        http://*.wowhead.com/*
// ==/UserScript==

var colors = ["#52415F", "#3B434F", "#47454F"];

/// <summary>
/// Inject the JQuery Library into the current page so it can be used.
/// Once it is loaded run the callback so the rest of the script is run
/// </summary>
/// <param name="callback">function to call after JQuery has been loaded</param>
JQuery = function(callback) {
    // Check if jQuery's loaded
    var wait = function() {        
        if (typeof unsafeWindow.jQuery == 'undefined') { window.setTimeout(function() { wait(); }, 100); }
        else {
            jquery = unsafeWindow.jQuery; 
            callback();
        }
    };

    if (typeof unsafeWindow.jQuery == 'undefined') {
        var script = document.createElement('script');
        script.src = 'http://code.jquery.com/jquery-latest.js';
        script.type = 'text/javascript';
        document.getElementsByTagName('head')[0].appendChild(script);
    }
    wait();
}

Color = {
    /// <summary>
    /// Take a Hex color and multiply it by a number
    /// </summary>
    Shade: function(a, b) {
        var v = Color.RGB(a);
        for (var i = 0; i < 3; i++) {
            v[i] = Math.round(v[i] * b)
            if (v[i] > 255) v[i] = 255
            if (v[i] < 0) v[i] = 0
        }
        return Color.Hex(v);
    },

    /// <summary>
    /// Convert Hex to RGB
    /// </summary>
    RGB: function(a) {
        var o = a.toLowerCase();
        if (o.charAt(0) == '#')
            o = o.substring(1);

        return [parseInt(o.slice(0, 2), 16), parseInt(o.slice(2, 4), 16), parseInt(o.slice(4), 16)]
    },

    /// <summary>
    /// Convert RGB to Hex
    /// </summary>
    Hex: function(a) { return "#" + Color._hex(a[0]) + Color._hex(a[1]) + Color._hex(a[2]) },
    _hex: function(a) { return ('0' + a.toString(16)).slice(-2) }
}



Network = {
    Request: function(url, callback) {
        GM_xmlhttpRequest({
            method: 'GET',
            url: url,
            onload: function(response) {
                var contents = '';
                if (response.status == 200) {
                    contents = response.responseText;
                    GM_setValue(url, contents);
                } else {
                    contents = GM_getValue(url);
                }
                callback(contents);
            }
        });
    }
};

Settings = {
    ToggleCharacter: function(url) {
        window.setTimeout(
            function() {
                var characters = GM_getValue("characters", "");
                url = ',' + url;
                if (characters.indexOf(url) >= 0) {
                    characters = characters.replace(url, "");
                    alert('Removed from Wowhead Character Import');
                } else {
                    characters = characters + url;
                    alert('Added to Wowhead Character Import');
                }
                GM_setValue("characters", characters);
            }
        , 0);
    }
}

/// <summary>
/// Function Library for the Wowhead
/// </summary>
Wowhead = {
    Init: function(armory) {
        if (!/wowhead.com$/.test(window.location.host))
            return;

        var characterLoaded = function(character) {
            Wowhead.OnUpdate(function() {
                var items = [];
                for (var i = 0; i < character.items.length; i++) {
                    items[items.length] = { id: character.items[i], color: character.color, title: character.name };
                }

                jquery.each(items, function(i, item) {
                    Wowhead.ItemList.HighlightItem(item);
                });
            });
        };

        armory.LoadCharacters(characterLoaded);
    },

    /// <summary> 
    /// Raise an alert when a link is clicked
    /// </summary>
    OnUpdate: function(callback) {
        jquery("a").click(function() { callback(); });
        callback();
    },


    ItemList: {
        /// <summary> 
        /// Highlight the table row of any item passed in
        /// </summary>
        HighlightItem: function(item) {
            var itemLink = jquery("a[href='/item=" + item.id + "']");
            var row = itemLink.parents('tr');

            if (row.parents().hasClass('grid') || row.parents().hasClass('icontab')) {
                itemLink.parents('th').css("background", item.color);
                itemLink.parents('td').css("background", item.color);
            } else if (!row.parents().hasClass('tooltip')) {
                row.css("background", item.color);
            }

            //Add player names as tooltips for the rows
            if (!row.attr("title") || row.attr("title").indexOf(item.title) == -1)
                row.attr("title", row.attr("title") + " " + item.title);

            var icon = itemLink.parents("div.iconsmall")
            icon.css("border", "solid 1px " + Color.Shade(item.color, 1.5));

            var iconcontainer = icon.parent();
            iconcontainer.width(iconcontainer.width() + 2);
        }
    }
};


/// <summary>
/// Function Library for the WoWArmory
/// </summary>
WoWArmory = {
    Init: function() {
        var href = window.location;
        if (!/wowarmory.com$/.test(href.host) || !/character-sheet.xml$/.test(href.pathname))
            return;

        var bookmark = jquery('<a href="#"></a>');
        bookmark.click(function() { Settings.ToggleCharacter(window.location); return false; });
        bookmark.html('<span>+</span>');
        jquery('.subTabs').append(bookmark);
    },

    /// <summary> 
    /// Load all defined characters
    /// <s/ummary>
    LoadCharacters: function(characterLoaded) {
        var characters = GM_getValue("characters", "").split(",");
        for (var character = 0; character < characters.length; character++) {
            if(characters[character]) {
                WoWArmory.Character(characters[character], characterLoaded);
            }
        }
    },
    
    LoadedCharacters: 0,

    Character: function(characterUrl, callback) {
        var createCharacter = function(xml) {            
            var ret = [];
            jquery(xml).find('item').each(function() { ret.push(jquery(this).attr('id')); });

            var t = {
                color: colors[WoWArmory.LoadedCharacters++],
                //class: jquery(xml).find('character').attr('class'),
                name: jquery(xml).find('character').attr('name'),
                items: ret
            };

            return t;
        }

        Network.Request(characterUrl, function(response) { callback(createCharacter(response)); });
    }

};


/// <summary> 
/// This is the actual script that does the work
/// </summary>
Script = function(armory, website) {
    var _items = [];
    var _armory = armory;
    var _website = website;
    self = this;

    this.Init = function() {
        _armory.Init();
        _website.Init(armory);        
    }

    JQuery(self.Init);
} (WoWArmory, Wowhead);